diff --git a/.github/workflows/auto-comment.yml b/.github/workflows/auto-comment.yml new file mode 100644 index 00000000..e9a037d0 --- /dev/null +++ b/.github/workflows/auto-comment.yml @@ -0,0 +1,50 @@ +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you 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. +# + +name: Auto Comment + +on: + issues: + types: [opened] # 触发条件:当问题被创建时 + pull_request: + types: [opened] # 触发条件:当拉取请求被创建时 + +permissions: + issues: write # 允许写入问题 + pull-requests: write # 允许写入拉取请求 + +jobs: + comment: + runs-on: ubuntu-latest + steps: + - name: Comment on issue + uses: actions/github-script@v4 + with: + script: | + const issueOpened = "Thank you for raising an issue. We will try and get back to you as soon as possible. Please make sure you have given us as much context as possible."; + const pullRequestOpened = "Thank you for raising your pull request. Please make sure you have followed our contributing guidelines. We will review it as soon as possible."; + + if (context.payload.action === 'opened') { + const issueComment = context.payload.issue ? issueOpened : pullRequestOpened; + await github.issues.createComment({ + ...context.repo, + issue_number: context.payload.issue ? context.payload.issue.number : context.payload.pull_request.number, + body: issueComment + }); + } diff --git a/.github/workflows/go.yml b/.github/workflows/go.yml new file mode 100644 index 00000000..6fc18053 --- /dev/null +++ b/.github/workflows/go.yml @@ -0,0 +1,110 @@ +name: Go + +on: + push: + branches: [ "master" ] + pull_request: + branches: [ "master" ] + +jobs: + code_check: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + + - name: Set up Go + uses: actions/setup-go@v4 + with: + go-version: '1.16' + + - name: Run code check + run: | + # 执行所有检查 + for check in EOF spelling; do + ./hack/verify-$check.sh + done + + parser_build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + + - name: Set up Go + uses: actions/setup-go@v4 + with: + go-version: '1.16' + + - name: Build parser + run: | + cd parser && make + + unit_tests: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + + - name: Set up Go + uses: actions/setup-go@v4 + with: + go-version: '1.16' + + - name: Set timezone + run: | + sudo ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime + ls -l /etc/localtime + + - name: Run unit tests + run: | + make test + echo "sql parser test" + cd parser && make test + + build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + + - name: Set up Go + uses: actions/setup-go@v4 + with: + go-version: '1.16' + + - name: Build the project + run: | + make build + + e2e_test_mysql5: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v3 + + - name: Pull Docker image + run: | + docker pull fieelina/gaea-test-amd64:v2.4 # 确认这个镜像是可用的 + + - name: Run Mysql5 E2E tests + run: | + docker run --rm \ + -v $(pwd):/workspace \ + -w /workspace \ + fieelina/gaea-test-amd64:v2.4 \ + make e2e-test + + e2e_test_mysql8: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v3 + + - name: Pull Docker image + run: | + docker pull fieelina/gaea-test-amd64-mysql8:v2.4 # 确认这个镜像是可用的 + + - name: Run Mysql8 E2E tests + run: | + docker run --rm \ + -v $(pwd):/workspace \ + -w /workspace \ + fieelina/gaea-test-amd64-mysql8:v2.4 \ + make e2e-test-mysql8 diff --git a/.github/workflows/linelint.yml b/.github/workflows/linelint.yml new file mode 100644 index 00000000..4fa5bf6b --- /dev/null +++ b/.github/workflows/linelint.yml @@ -0,0 +1,36 @@ +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you 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. +# + +name: Linelint + +on: + push: + pull_request: + +jobs: + linelint: + runs-on: ubuntu-latest + name: Check if all files end in newline + + steps: + - name: Checkout code + uses: actions/checkout@v3 + + - name: Run Linelint + uses: fernandrone/linelint@0.0.4 diff --git a/.gitignore b/.gitignore index 5fcab651..9f34d595 100644 --- a/.gitignore +++ b/.gitignore @@ -4,4 +4,12 @@ bin logs .coverage.* .vscode -.idea \ No newline at end of file +.idea +tests/e2e/cmd/logs +tests/e2e/cmd/gaea +tests/e2e/cmd/gaea-cc +.DS_Store +.integrate_coverage.func +.integrate_coverage.html +.integrate_coverage.out +.coverage.* diff --git a/.gitlab/merge_request_templates/mr.md b/.gitlab/merge_request_templates/mr.md new file mode 100644 index 00000000..d6bf66f7 --- /dev/null +++ b/.gitlab/merge_request_templates/mr.md @@ -0,0 +1,32 @@ +### What problem does this PR solve? + +Issue Number: None + +Problem Summary: + +### What is changed and how it works? + +### Check List + +- [ ] Unit test +- [ ] Integration test +- [ ] Manual test (add detailed scripts or steps below) +- [ ] No code + +Side effects + +- [ ] Breaking backward compatibility +- [ ] Config file changes + +Documentation + +- [ ] Affects user behaviors +- [ ] Contains syntax changes +- [ ] Contains variable changes +- [ ] Changes MySQL compatibility + +### Release note + +```release-note +None +``` diff --git a/.linelint.yml b/.linelint.yml new file mode 100644 index 00000000..fd3c7a9a --- /dev/null +++ b/.linelint.yml @@ -0,0 +1,20 @@ +# 'true' will fix files +autofix: false + +# list of paths to ignore, uses gitignore syntaxes (executes before any rule) +ignore: + - tests/e2e/shard/case/join/mycat/long/unsupport.sql + - tests/e2e/shard/case/join/mycat/mod/unsupport.sql + - tests/e2e/shard/case/join/mycat/murmur/unsupport.sql + - tests/e2e/shard/case/join/mycat/string/unsupport.sql +rules: + # checks if file ends in a newline character + end-of-file: + # set to true to enable this rule + enable: true + + # set to true to disable autofix (if enabled globally) + disable-autofix: false + + # if true also checks if file ends in a single newline character + single-new-line: true diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 00000000..cd3439bc --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,132 @@ +# Gaea Changelog + +## Gaea 2.2 Release Notes + +### 新功能 + +- 【SQL 支持】分片情况下支持跨分片 batch insert +- 【SQL 支持】支持 Multi Statement 多语句 +- 【SQL 支持】 支持 char 函数 +- 【SQL 支持】支持分片情况下 group_concat 函数 +- 【SQL 支持】支持分片情况下`!mycat:sql` hint 将 SQL 打到指定分片 +- 【SQL 支持】 分片情况下支持插入时忽略全局自增 ID 列或设置 null 情况下自动生成全局自增 ID +- 【SQL 支持】非分片情况下 Explain 返回 MySQL 的 Explain 信息 +- 【功能】支持优先访问本地从库 +- 【配置】支持日志配置热加载 +- 【配置】支持分片环境下限制全局自增 ID 上限 +- 【监控】新增 P99/P95 响应时间 Metric 信息 + +### 优化提升 + +- 【SQL 行为】分片情况下全局表随机查询分片 +- 【SQL 行为】优化分片情况下默认返回一致的结果集顺序 +- 【测试】优化 e2e 测试使用独立的 Docker 环境,避免环境导致 CI 失败 +- 【测试】e2e 测试增加分片环境下的基础 SQL 测试 +- JDBC 高版本支持:支持 JDBC 8.0.31 以上版本 +- 优化获取后端 MySQL 连接超时时间,减少从库宕机时业务响应时间 Gaea集群下MySQL从库宕机流量切换测试 + +### Bug 修复 + +- 修复探活引起的负载均衡问题 +- 修复分片情况下 sum 函数聚合 decimal 字段结果不准确问题 +- 修复 namespace 关闭时探活未关闭的问题 +- 修复非分片情况下返回 info 信息 +- 修复全局表执行 order by/ group by 返回多一列的问题 + +## Gaea 2.1 Release Notes + +### 新功能 +- 新增 SQL 支持:分片情况下支持在 `group by ... order by max(col)` 语句 ORDER BY 使用聚合函数 +- 新增 SQL 支持:子查询中的多括号支持 +- 新增 SQL 支持:`create table t (... on update current_timestamp(NUMBER))` +- 新增 SQL 行为支持:`select @@read_only` 及 `show variables like "%read_only%"` 发送至主库,避免应用框架通过从库获取数据库只读状态导致业务报错 + +### Bug 修复 +- 修复 2.0 版本部分 union 语句无法执行的问题 +- 回退 2.0 版本 Gaea 启动时初始化后端数据库连接,避免影响多租户下的集群启动时间 + +### 优化提升 +- 新增 API 用于获取当前 Gaea 版本,便于后续自动化升级降级操作 +- 新增了大量只读 SQL 测试 Case,提高后续版本稳定性,测试 Case 会在后续版本继续完善 + +## Gaea 2.0-GA Release Notes + +### 新功能 + +- 支持限制 Gaea 的 CPU 核数,便于将 Gaea 作为单租户使用 + +### Bug修复 + +- 修复不兼容 SQL:支持 `password` 函数 +- 修复不兼容 SQL:支持 `group by ... with rollup` 语句 +- 修复不兼容 SQL:支持分片情况下 `order by null` 语句 +- 修复 LVS 探活引起的 Broken Pipe 问题 +- 修复后端从库探活偶尔失败的问题 + +### 优化提升 + +- 优化了 general_log 配置项,直接修改 namespace 配置即可在所有 Gaea 节点生效 +- 增加监控项,监控 Gaea CPU 使用情况 +- 修复本地 Mac 环境下无法生成 parser 文件的问题 + +### 其他说明 + +- 进行了 Gaea 与 Miproxy 的做了基本的性能对比,两者各有较小优劣,整体对比差距不大。详见:https://xiaomi.f.mioffice.cn/wiki/wikk4HMGGB0A56lU1NyCj5likQb + + +## Gaea 2.0-Beta Release Notes + +### 新功能 + +- 支持配置日志保留天数,默认保留 3 天 +- 支持将 `select ... for update` or `select ... in share mode` 语句优先发给主库 + +### Bug修复 + +- 修复了 Alpha 版本测试发现的旧版兼容性问题,如配置后端实例为空字符串(默认为空数组) + +### 优化提升 + +- 优化了日志展示,去除了冗余字段及冗余日志 +- 新增二进制文件自动更新,用户可以自行拉取新版本。具体使用见用户文档 +- 新增监控项,用于 Gaea 中间件存活状态及后端实例存活告警 + +### 其他说明 + +- 本次新增了部署、迁移、用户等文档,便于后续使用。详见:https://xiaomi.f.mioffice.cn/wiki/wikk4RF3oZ2XMT5hOJm8ISb7Jqh + + +## Gaea 2.0-Alpha Release Notes + +### 新功能 + +- 兼容 MiProxy 强制读主库语句:`select /*master*/ from ...` +- 支持配置连接后端 MySQL 时自定义 [Capability Flags](https://dev.mysql.com/doc/dev/mysql-server/latest/group__group__cs__capabilities__flags.html) +- 后端实例探活:支持主从库探活并自动剔除,降低单实例宕机对业务的影响 +- 后端从库状态探测:支持从库复制状态及延迟探测并自动剔除,降低主从数据不一致对业务的影响 +- 支持限制前端连接数配置 +- 支持配置后端连接初始化时执行特定 SQL + +### Bug修复 + +- 修复 show 语句会默认发到主库的问题 +- 修复 gaea-cc 修改配置失败会阻塞的问题 +- 修复 gaea-cc 修改配置失败未回滚 etcd 配置的问题 + +### 优化提升 + +- 连接池优化:初始化时创建初始连接 +- 日志:支持输出 SQL 日志和慢日志 +- 日志:支持 SQL 日志输出到单独的文件 +- 配置:增加配置检查及配置错误提示 + +### 测试 + +- 新增代码静态检测,统一代码风格并减少低级错误 +- 新增集成测试框架,支持测试各种 SQL 在 Gaea 及实际 MySQL 结果对比 +- 新增 e2e 测试框架,支持端对端验证 Gaea 从启动到停止过程中的所有行为 +- 新增 CI,包含代码静态检查、单元测试、集成测试、e2e测试 + +### 其他说明 + +- 本版本基于公司开源的 Gaea(https://github.com/XiaoMi/Gaea) 最新的 [commit](https://github.com/XiaoMi/Gaea/commit/9e16060c4afcabe8ca910313e2abde4113e9af79) 开发。 diff --git a/Makefile b/Makefile index 85c73283..be5be0e2 100755 --- a/Makefile +++ b/Makefile @@ -1,4 +1,8 @@ ROOT:=$(shell dirname $(realpath $(lastword $(MAKEFILE_LIST)))) +GOOS ?= linux +GOARCH ?= $(shell go env GOARCH) +GOENV := CGO_ENABLED=0 GOOS=$(GOOS) GOARCH=$(GOARCH) +GO := $(GOENV) go GAEA_OUT:=$(ROOT)/bin/gaea GAEA_CC_OUT:=$(ROOT)/bin/gaea-cc PKG:=$(shell go list -m) @@ -9,10 +13,10 @@ all: build test build: parser gaea gaea-cc gaea: - go build -o $(GAEA_OUT) $(shell bash gen_ldflags.sh $(GAEA_OUT) $(PKG)/core $(PKG)/cmd/gaea) + $(GO) build -o $(GAEA_OUT) $(shell bash gen_ldflags.sh $(GAEA_OUT) $(PKG)/core $(PKG)/cmd/gaea) gaea-cc: - go build -o $(GAEA_CC_OUT) $(shell bash gen_ldflags.sh $(GAEA_CC_OUT) $(PKG)/core $(PKG)/cmd/gaea-cc) + $(GO) build -o $(GAEA_CC_OUT) $(shell bash gen_ldflags.sh $(GAEA_CC_OUT) $(PKG)/core $(PKG)/cmd/gaea-cc) parser: cd parser && make && cd .. @@ -21,11 +25,33 @@ clean: @rm -rf bin @rm -f .coverage.out .coverage.html +ALL_CHECKS = EOF spelling +check: $(addprefix check-,$(ALL_CHECKS)) + +check-%: + ./hack/verify-$*.sh + test: - go test -coverprofile=.coverage.out ./... + go test -gcflags="all=-l -N" -coverprofile=.coverage.out `go list ./...` -short go tool cover -func=.coverage.out -o .coverage.func tail -1 .coverage.func go tool cover -html=.coverage.out -o .coverage.html +e2e-test: gaea gaea-cc + cp bin/gaea bin/gaea-cc tests/e2e/cmd/ + ./hack/e2e-mysql5.sh + ./hack/ginkgo-run-mysql5.sh + +e2e-test-mysql8: gaea gaea-cc + cp bin/gaea bin/gaea-cc tests/e2e/cmd/ + ./hack/e2e-mysql8.sh + ./hack/ginkgo-run-mysql8.sh + +integrate_test: + go test -timeout 30m -coverprofile=.integrate_coverage.out ./... -run ^TestIntegration$ + go tool cover -func=.integrate_coverage.out -o .integrate_coverage.func + tail -1 .integrate_coverage.func + go tool cover -html=.integrate_coverage.out -o .integrate_coverage.html + build_with_coverage: go test -c cmd/gaea/main.go cmd/gaea/main_test.go -coverpkg ./... -covermode=count -o bin/gaea diff --git a/README.md b/README.md index aad4fbff..d6325216 100644 --- a/README.md +++ b/README.md @@ -60,6 +60,10 @@ Gaea是小米中国区电商研发部研发的基于mysql协议的数据库中 - [gaea proxy后端连接池的设计与实现](docs/connection-pool.md) - [prepare的设计与实现](docs/prepare.md) +## 性能测试 + +- [gaea 2.3.7 ](docs/performance-test-report.md) + ## Roadmap - [x] 支持配置加密存储,开关 @@ -88,10 +92,11 @@ Gaea是小米中国区电商研发部研发的基于mysql协议的数据库中 - stats(google vitess,打点统计) - util(混合) + ## 社区 ### gitter [![Gitter](https://badges.gitter.im/xiaomi-b2c/Gaea.svg)](https://gitter.im/xiaomi-b2c/Gaea?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge) -### 钉钉 -![钉钉](docs/assets/gaea_dingtalk.png) +### 飞书 +![飞书](docs/assets/feishu_talk.jpeg) diff --git a/backend/balancer_test.go b/backend/balancer_test.go index 311ac04c..e3d7b54e 100644 --- a/backend/balancer_test.go +++ b/backend/balancer_test.go @@ -1,3 +1,17 @@ +// Copyright 2024 The Gaea Authors. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + package backend import ( diff --git a/backend/connection_pool.go b/backend/connection_pool.go index 61a52db5..7f773913 100644 --- a/backend/connection_pool.go +++ b/backend/connection_pool.go @@ -17,6 +17,8 @@ package backend import ( "context" "errors" + "fmt" + "strings" "sync" "time" @@ -25,8 +27,9 @@ import ( ) const ( - getConnTimeout = 2 * time.Second - PING_PEROID = 5 * time.Second + ExecTimeOut = 2 * time.Second + GetConnTimeout = 2 * time.Second + pingPeriod = 4 * time.Second ) var ( @@ -40,24 +43,42 @@ var ( type connectionPoolImpl struct { mu sync.RWMutex connections *util.ResourcePool + checkConn *pooledConnectImpl - addr string - user string - password string - db string + addr string + datacenter string + user string + password string + db string charset string collationID mysql.CollationID - capacity int // capacity of pool - maxCapacity int // max capacity of pool - idleTimeout time.Duration + capacity int // capacity of pool + maxCapacity int // max capacity of pool + idleTimeout time.Duration + clientCapability uint32 + initConnect string + lastChecked int64 } // NewConnectionPool create connection pool -func NewConnectionPool(addr, user, password, db string, capacity, maxCapacity int, idleTimeout time.Duration, charset string, collationID mysql.CollationID) ConnectionPool { - cp := &connectionPoolImpl{addr: addr, user: user, password: password, db: db, capacity: capacity, maxCapacity: maxCapacity, idleTimeout: idleTimeout, charset: charset, collationID: collationID} - return cp +func NewConnectionPool(addr, user, password, db string, capacity, maxCapacity int, idleTimeout time.Duration, charset string, collationID mysql.CollationID, clientCapability uint32, initConnect string, dc string) ConnectionPool { + return &connectionPoolImpl{ + addr: addr, + datacenter: dc, + user: user, + password: password, + db: db, + capacity: capacity, + maxCapacity: maxCapacity, + idleTimeout: idleTimeout, + charset: charset, + collationID: collationID, + clientCapability: clientCapability, + initConnect: strings.Trim(strings.TrimSpace(initConnect), ";"), + lastChecked: time.Now().Unix(), + } } func (cp *connectionPoolImpl) pool() (p *util.ResourcePool) { @@ -68,7 +89,7 @@ func (cp *connectionPoolImpl) pool() (p *util.ResourcePool) { } // Open open connection pool without error, should be called before use the pool -func (cp *connectionPoolImpl) Open() { +func (cp *connectionPoolImpl) Open() error { if cp.capacity == 0 { cp.capacity = DefaultCapacity } @@ -78,16 +99,25 @@ func (cp *connectionPoolImpl) Open() { } cp.mu.Lock() defer cp.mu.Unlock() - cp.connections = util.NewResourcePool(cp.connect, cp.capacity, cp.maxCapacity, cp.idleTimeout) - return + var err error = nil + cp.connections, err = util.NewResourcePool(cp.connect, cp.capacity, cp.maxCapacity, cp.idleTimeout) + return err } // connect is used by the resource pool to create new resource.It's factory method func (cp *connectionPoolImpl) connect() (util.Resource, error) { - c, err := NewDirectConnection(cp.addr, cp.user, cp.password, cp.db, cp.charset, cp.collationID) + c, err := NewDirectConnection(cp.addr, cp.user, cp.password, cp.db, cp.charset, cp.collationID, cp.clientCapability) if err != nil { return nil, err } + if cp.initConnect != "" { + for _, sql := range strings.Split(cp.initConnect, ";") { + _, err := c.Execute(sql, 0) + if err != nil { + return nil, err + } + } + } return &pooledConnectImpl{directConnection: c, pool: cp}, nil } @@ -96,6 +126,11 @@ func (cp *connectionPoolImpl) Addr() string { return cp.addr } +// Datacenter return datacenter of connection pool +func (cp *connectionPoolImpl) Datacenter() string { + return cp.datacenter +} + // Close close connection pool func (cp *connectionPoolImpl) Close() { p := cp.pool() @@ -104,6 +139,11 @@ func (cp *connectionPoolImpl) Close() { } p.Close() cp.mu.Lock() + // close check conn + if cp.checkConn != nil { + cp.checkConn.Close() + cp.checkConn = nil + } cp.connections = nil cp.mu.Unlock() return @@ -121,7 +161,7 @@ func (cp *connectionPoolImpl) Get(ctx context.Context) (pc PooledConnect, err er return nil, ErrConnectionPoolClosed } - getCtx, cancel := context.WithTimeout(ctx, getConnTimeout) + getCtx, cancel := context.WithTimeout(ctx, GetConnTimeout) defer cancel() r, err := p.Get(getCtx) if err != nil { @@ -129,16 +169,55 @@ func (cp *connectionPoolImpl) Get(ctx context.Context) (pc PooledConnect, err er } pc = r.(*pooledConnectImpl) - + //do ping when over the ping time. if error happen, create new one - if !pc.GetReturnTime().IsZero() && time.Until(pc.GetReturnTime().Add(PING_PEROID)) < 0 { - if err = pc.Ping(); err != nil { + if !pc.GetReturnTime().IsZero() && time.Until(pc.GetReturnTime().Add(pingPeriod)) < 0 { + if err = pc.PingWithTimeout(GetConnTimeout); err != nil { err = pc.Reconnect() } } + return pc, err } +// GetCheck return a check backend db connection, which independent with connection pool +func (cp *connectionPoolImpl) GetCheck(ctx context.Context) (PooledConnect, error) { + if cp.checkConn != nil && !cp.checkConn.IsClosed() { + return cp.checkConn, nil + } + + getCtx, cancel := context.WithTimeout(ctx, GetConnTimeout) + defer cancel() + + getConnChan := make(chan error) + go func() { + // connect timeout will be in 2s + checkConn, err := cp.connect() + if err != nil { + return + } + cp.checkConn = checkConn.(*pooledConnectImpl) + + if cp.checkConn.IsClosed() { + if err := cp.checkConn.Reconnect(); err != nil { + return + } + } + getConnChan <- err + }() + + select { + case <-getCtx.Done(): + return nil, fmt.Errorf("get conn timeout") + case err1 := <-getConnChan: + if err1 != nil { + return nil, err1 + } + return cp.checkConn, nil + } + +} + // Put recycle a connection into the pool func (cp *connectionPoolImpl) Put(pc PooledConnect) { p := cp.pool() @@ -268,4 +347,24 @@ func (cp *connectionPoolImpl) IdleClosed() int64 { return 0 } return p.IdleClosed() -} \ No newline at end of file +} + +// SetLastChecked set last checked time +func (cp *connectionPoolImpl) SetLastChecked() { + cp.mu.Lock() + defer cp.mu.Unlock() + if cp == nil { + return + } + cp.lastChecked = time.Now().Unix() +} + +// GetLastChecked get last checked time +func (cp *connectionPoolImpl) GetLastChecked() int64 { + cp.mu.RLock() + defer cp.mu.RUnlock() + if cp == nil { + return 0 + } + return cp.lastChecked +} diff --git a/backend/direct_connection.go b/backend/direct_connection.go index 12e3b995..d2c03c16 100644 --- a/backend/direct_connection.go +++ b/backend/direct_connection.go @@ -16,11 +16,19 @@ package backend import ( "bytes" + "crypto/rand" + "crypto/rsa" + "crypto/sha1" + "crypto/x509" "encoding/binary" + "encoding/pem" "errors" "fmt" "net" "strings" + "time" + + "github.com/XiaoMi/Gaea/util" sqlerr "github.com/XiaoMi/Gaea/core/errors" "github.com/XiaoMi/Gaea/log" @@ -28,14 +36,18 @@ import ( "github.com/XiaoMi/Gaea/util/sync2" ) +var ErrExecuteTimeout = errors.New("execute timeout") + // DirectConnection means connection to backend mysql type DirectConnection struct { conn *mysql.Conn - addr string - user string - password string - db string + addr string + user string + password string + db string + version string + versionCompare *util.VersionCompareStatus capability uint32 @@ -50,23 +62,27 @@ type DirectConnection struct { defaultCollation mysql.CollationID defaultCharset string - pkgErr error - closed sync2.AtomicBool + pkgErr error + closed sync2.AtomicBool + capabilityConnectToMySQL uint32 + moreRowExists bool } // NewDirectConnection return direct and authorised connection to mysql with real net connection -func NewDirectConnection(addr string, user string, password string, db string, charset string, collationID mysql.CollationID) (*DirectConnection, error) { +func NewDirectConnection(addr string, user string, password string, db string, charset string, collationID mysql.CollationID, clientCapability uint32) (*DirectConnection, error) { dc := &DirectConnection{ - addr: addr, - user: user, - password: password, - db: db, - charset: charset, - collation: collationID, - defaultCharset: charset, - defaultCollation: collationID, - closed: sync2.NewAtomicBool(false), - sessionVariables: mysql.NewSessionVariables(), + addr: addr, + user: user, + password: password, + db: db, + charset: charset, + collation: collationID, + defaultCharset: charset, + defaultCollation: collationID, + closed: sync2.NewAtomicBool(false), + sessionVariables: mysql.NewSessionVariables(), + capabilityConnectToMySQL: clientCapability, + moreRowExists: false, } err := dc.connect() return dc, err @@ -83,7 +99,10 @@ func (dc *DirectConnection) connect() error { typ = "unix" } - netConn, err := net.Dial(typ, dc.addr) + dialer := net.Dialer{ + Timeout: GetConnTimeout, + } + netConn, err := dialer.Dial(typ, dc.addr) if err != nil { return err } @@ -106,20 +125,20 @@ func (dc *DirectConnection) connect() error { // step2: write handshake response if err := dc.writeHandshakeResponse41(); err != nil { dc.conn.Close() - return err } - response, err := dc.readPacket() + var cipher []byte + var newPlugin string + cipher, newPlugin, err = dc.readAuth() if err != nil { dc.conn.Close() return err } - switch response[0] { - case mysql.OKHeader: - default: - return errors.New("dc connection handshake failed with mysql") + if err := dc.authResponse(cipher, newPlugin); err != nil { + dc.conn.Close() + return err } // we must always use autocommit @@ -165,14 +184,18 @@ func (dc *DirectConnection) writePacket(data []byte) error { err := dc.conn.WritePacket(data) if err != nil && strings.Contains(err.Error(), "broken pipe") { // retry 3 times, close dc's conn、reset dc's stats and reconnect + var connError error for i := 0; i < 3; i++ { dc.Close() - e := dc.connect() - if e == nil { // no need to write data again + connError = dc.connect() + if connError == nil { // no need to write data again break } } - + if dc.conn == nil { + log.Warn("dc address %v, DirectConnection writePacket conn is nil, err = %v, reConnet err = %v", + dc.addr, connError, err) + } } return err } @@ -182,13 +205,19 @@ func (dc *DirectConnection) writeEphemeralPacket() error { err := dc.conn.WriteEphemeralPacket() if err != nil && strings.Contains(err.Error(), "broken pipe") { // retry 3 times, close dc's conn、reset dc's stats and reconnect + // todo 先不下线这个重试,确认线上问题是不是这里产生的再下掉重试逻辑。下面的重试目前也没有生效,dc close后状态未恢复。 + var connError error for i := 0; i < 3; i++ { dc.Close() - e := dc.connect() - if e == nil { // no need to write data again and ephemeral buffer is recycled + connError = dc.connect() + if connError == nil { // no need to write data again and ephemeral buffer is recycled break } } + if dc.conn == nil { + log.Warn("dc address %v, DirectConnection writePacket conn is nil, err = %v, reConnet err = %v", + dc.addr, connError, err) + } } return err } @@ -207,9 +236,14 @@ func (dc *DirectConnection) readInitialHandshake() error { return fmt.Errorf("invalid protocol version %d, must >= 10", data[0]) } - //skip mysql version //mysql version end with 0x00 - pos := 1 + bytes.IndexByte(data[1:], 0x00) + 1 + version, pos, ok := mysql.ReadNullString(data, 1) + if !ok { + return fmt.Errorf("readInitialHandshake error: can't read version") + } + + dc.version = version + dc.versionCompare = util.NewVersionCompareStatus(version) // get connection id dc.conn.ConnectionID = binary.LittleEndian.Uint32(data[pos : pos+4]) @@ -252,12 +286,170 @@ func (dc *DirectConnection) readInitialHandshake() error { return nil } +func (dc *DirectConnection) readAuth() ([]byte, string, error) { + data, err := dc.readPacket() + if err != nil { + return nil, "", err + } + switch data[0] { + case mysql.OKHeader, mysql.ErrHeader: + return nil, "", nil + case mysql.AuthMoreDataHeader: + return data[1:], "", nil + case mysql.EOFHeader: + // AuthSwitch: https://dev.mysql.com/doc/internals/en/authentication-method-mismatch.html + if len(data) == 1 { + return nil, mysql.MysqlNativePassword, nil + } + pluginEndIndex := bytes.IndexByte(data, 0x00) + if pluginEndIndex < 0 { + return nil, "", sqlerr.ErrInvalidPacket + } + plugin := string(data[1:pluginEndIndex]) + cipher := data[pluginEndIndex+1:] + return cipher, plugin, nil + default: + return nil, "", sqlerr.ErrInvalidPacket + } +} + +func (dc *DirectConnection) authResponse(cipher []byte, newPlugin string) error { + if newPlugin == "" { + return nil + } + + // handle auth plugin switch, if requested + var adjustCipher, scrPasswd []byte + if len(cipher) >= 20 { + // old_password's len(cipher) == 0 + adjustCipher = cipher[:20] + } else { + adjustCipher = cipher + } + + switch newPlugin { + case mysql.CachingSHA2Password: + scrPasswd = mysql.CalcCachingSha2Password(adjustCipher, dc.password) + case mysql.Sha256Password: + // request public key from server + scrPasswd = []byte{1} + case mysql.MysqlNativePassword: + if strings.HasPrefix(dc.password, "**") && len(dc.password) == 42 { + scrPasswd = mysql.CalcPasswordSHA1(adjustCipher, []byte(dc.password)[2:]) + } else { + scrPasswd = mysql.CalcPassword(adjustCipher, []byte(dc.password)) + } + default: + return fmt.Errorf("not support plugin: %s", newPlugin) + } + if err := dc.writeAuthSwitchPacket(scrPasswd); err != nil { + return fmt.Errorf("writeAuthSwitchPacket error: %s", err) + } + + // Read Result Packet + authData, plugin, err := dc.readAuth() + if err != nil { + return err + } + if plugin != "" { + return fmt.Errorf("not allow to change the auth plugin more than once") + } + + switch newPlugin { + // https://insidemysql.com/preparing-your-community-connector-for-mysql-8-part-2-sha256/ + case mysql.CachingSHA2Password: + switch len(authData) { + case 0: + return nil // auth successful + case 1: + switch authData[0] { + case mysql.CachingSha2PasswordFastAuthSuccess: + _, _, err := dc.readAuth() + if err != nil { + return err + } + case mysql.CachingSha2PasswordPerformFullAuthentication: + // request public key + data := make([]byte, 1) + data[0] = byte(mysql.CachingSha2PasswordRequestPublicKey) + err = dc.writePacket(data) + if err != nil { + return err + } + authData, _, err := dc.readAuth() + if err != nil { + return err + } + + if err = dc.writePublicKeyAuthPacketSha256(authData, adjustCipher); err != nil { + return err + } + + _, _, err = dc.readAuth() + if err != nil { + return err + } + } + } + case mysql.Sha256Password: + switch len(authData) { + case 0: + return nil // auth successful + default: + if err = dc.writePublicKeyAuthPacketSha256(authData, adjustCipher); err != nil { + return err + } + _, _, err := dc.readAuth() + if err != nil { + return err + } + } + } + return nil +} + +// http://dev.mysql.com/doc/internals/en/connection-phase-packets.html#packet-Protocol::AuthSwitchResponse +func (dc *DirectConnection) writeAuthSwitchPacket(scrPasswd []byte) error { + data := make([]byte, len(scrPasswd)) + copy(data, scrPasswd) + return dc.writePacket(data) +} + +// Caching sha2 authentication. Public key request and send encrypted password +func (dc *DirectConnection) writePublicKeyAuthPacketSha256(authData []byte, scramble []byte) error { + block, _ := pem.Decode(authData) + pub, err := x509.ParsePKIXPublicKey(block.Bytes) + if err != nil { + return err + } + + plain := make([]byte, len(dc.password)+1) + copy(plain, dc.password) + for i := range plain { + j := i % len(scramble) + plain[i] ^= scramble[j] + } + sha1 := sha1.New() + enc, _ := rsa.EncryptOAEP(sha1, rand.Reader, pub.(*rsa.PublicKey), plain, nil) + data := make([]byte, len(enc)) + copy(data, enc) + return dc.writePacket(data) +} + // writeHandshakeResponse41 writes the handshake response. func (dc *DirectConnection) writeHandshakeResponse41() error { // Adjust client capability flags based on server support - capability := mysql.ClientProtocol41 | mysql.ClientSecureConnection | - mysql.ClientLongPassword | mysql.ClientTransactions | mysql.ClientLongFlag + + var capability uint32 + if dc.capabilityConnectToMySQL == 0 { + capability = mysql.ClientProtocol41 | mysql.ClientSecureConnection | + mysql.ClientLongPassword | mysql.ClientTransactions | mysql.ClientLongFlag + } else { + capability = dc.capabilityConnectToMySQL + } + capability &= dc.capability + capability |= mysql.ClientPluginAuth //we only support secure connection auth := mysql.CalcPassword(dc.salt, []byte(dc.password)) @@ -360,6 +552,9 @@ func (dc *DirectConnection) writeComFieldList(table string, wildcard string) err // Ping implements mysql ping command. func (dc *DirectConnection) Ping() error { + if dc.conn == nil { + return fmt.Errorf("get mysql conn of DirectConnection error.dc addr:%s", dc.GetAddr()) + } dc.conn.SetSequence(0) if err := dc.writePacket([]byte{mysql.ComPing}); err != nil { return err @@ -377,6 +572,21 @@ func (dc *DirectConnection) Ping() error { return fmt.Errorf("unexpected packet type: %d", data[0]) } +func (dc *DirectConnection) PingWithTimeout(timeout time.Duration) error { + pingChan := make(chan error) + go func() { + err := dc.Ping() + pingChan <- err + }() + + select { + case <-time.After(timeout): + return errors.New("ping timeout") + case err1 := <-pingChan: + return err1 + } +} + // UseDB send ComInitDB to backend mysql func (dc *DirectConnection) UseDB(dbName string) error { dc.conn.SetSequence(0) @@ -391,7 +601,7 @@ func (dc *DirectConnection) UseDB(dbName string) error { if r, err := dc.readPacket(); err != nil { return err } else if !mysql.IsOKPacket(r) { - return errors.New("dc connection use db failed") + return fmt.Errorf("dc connection use db(%s) failed", dbName) } dc.db = dbName @@ -413,6 +623,27 @@ func (dc *DirectConnection) Execute(sql string, maxRows int) (*mysql.Result, err return dc.exec(sql, maxRows) } +func (dc *DirectConnection) ExecuteWithTimeout(sql string, maxRows int, timeout time.Duration) (*mysql.Result, error) { + errChan := make(chan error, 1) + var res *mysql.Result + + go func() { + var err error + res, err = dc.exec(sql, maxRows) + errChan <- err + }() + + select { + case <-time.After(timeout): + return nil, ErrExecuteTimeout + case err := <-errChan: + if err != nil { + return nil, err + } + return res, nil + } +} + // Begin send ComQuery with 'begin' to backend mysql to start transaction func (dc *DirectConnection) Begin() error { _, err := dc.exec("begin", 0) @@ -453,7 +684,7 @@ func (dc *DirectConnection) SetAutoCommit(v uint8) error { func (dc *DirectConnection) SetCharset(charset string, collation mysql.CollationID) ( /*changed*/ bool, error) { charset = strings.Trim(charset, "\"'`") - if collation == 0 || collation > 247 { + if collation == 0 || (collation > 247 && (dc.versionCompare == nil || dc.versionCompare.LessThanMySQLVersion80)) { collation = mysql.CollationNames[mysql.Charsets[charset]] } @@ -494,6 +725,11 @@ func (dc *DirectConnection) ResetConnection() error { } } + if dc.conn == nil { + log.Warn("reset connect failed conn is nil, addr: %s, user: %s, db: %s, status: %d", dc.addr, dc.user, dc.db, dc.status) + return fmt.Errorf("dc.conn is nil") + } + return nil } @@ -502,6 +738,25 @@ func (dc *DirectConnection) SetSessionVariables(frontend *mysql.SessionVariables return dc.sessionVariables.SetEqualsWith(frontend) } +// SyncSessionVariables synchronizes the session variables from the provided frontend session +// state to this direct connection's database session. It first sets the session variables based +// on the frontend's specifications and then commits these changes to the database session with +// an appropriate SQL SET statement. +// This method ensures that the connection's state is consistent with the frontend's requirements, +func (dc *DirectConnection) SyncSessionVariables(frontend *mysql.SessionVariables) error { + variablesChanged, err := dc.SetSessionVariables(frontend) + if err != nil { + return err + } + if !variablesChanged { + return nil + } + if err = dc.WriteSetStatement(); err != nil { + return err + } + return nil +} + // WriteSetStatement execute sql func (dc *DirectConnection) WriteSetStatement() error { var setVariableSQL bytes.Buffer @@ -512,6 +767,10 @@ func (dc *DirectConnection) WriteSetStatement() error { appendSetCharset(&setVariableSQL, dc.charset, collation) for _, v := range dc.sessionVariables.GetAll() { + if v.Name() == mysql.TxReadOnly && dc.versionCompare != nil && !dc.versionCompare.LessThanMySQLVersion803 { + appendSetVariable(&setVariableSQL, mysql.TransactionReadOnly, v.Get()) + continue + } appendSetVariable(&setVariableSQL, v.Name(), v.Get()) } @@ -569,13 +828,7 @@ func (dc *DirectConnection) exec(query string, maxRows int) (*mysql.Result, erro // read resultset from mysql func (dc *DirectConnection) readResultSet(data []byte, binary bool, maxRows int) (*mysql.Result, error) { - result := &mysql.Result{ - Status: 0, - InsertID: 0, - AffectedRows: 0, - - Resultset: &mysql.Resultset{}, - } + result := mysql.ResultPool.Get() // column count pos := 0 @@ -644,7 +897,8 @@ func (dc *DirectConnection) readResultColumns(result *mysql.Result) (err error) // readResultRows read result rows func (dc *DirectConnection) readResultRows(result *mysql.Result, isBinary bool, maxRows int) (err error) { var data []byte - + var bufLength int + dc.moreRowExists = false for { data, err = dc.readPacket() if err != nil { @@ -661,6 +915,8 @@ func (dc *DirectConnection) readResultRows(result *mysql.Result, isBinary bool, } break + } else { + bufLength += len(data) } if data[0] == mysql.ErrHeader { @@ -674,6 +930,13 @@ func (dc *DirectConnection) readResultRows(result *mysql.Result, isBinary bool, } return fmt.Errorf("%v %d", sqlerr.ErrRowsLimitExceeded, maxRows) } + + if bufLength > mysql.MaxPayloadLen { + dc.moreRowExists = true + break + } else { + dc.moreRowExists = false + } } result.Values = make([][]interface{}, len(result.RowDatas)) @@ -715,7 +978,7 @@ func (dc *DirectConnection) isEOFPacket(data []byte) bool { func (dc *DirectConnection) handleOKPacket(data []byte) (*mysql.Result, error) { var pos = 1 - r := new(mysql.Result) + r := mysql.ResultPool.GetWithoutResultSet() r.AffectedRows, pos, _, _ = mysql.ReadLenEncInt(data, pos) r.InsertID, pos, _, _ = mysql.ReadLenEncInt(data, pos) @@ -726,8 +989,8 @@ func (dc *DirectConnection) handleOKPacket(data []byte) (*mysql.Result, error) { pos += 2 // TODO strict_mode, check warnings as error - // Warnings := binary.LittleEndian.Uint16(data[pos:]) - // pos += 2 + r.Warnings = binary.LittleEndian.Uint16(data[pos:]) + pos += 2 } else if dc.capability&mysql.ClientTransactions > 0 { r.Status = binary.LittleEndian.Uint16(data[pos:]) dc.status = r.Status @@ -735,6 +998,7 @@ func (dc *DirectConnection) handleOKPacket(data []byte) (*mysql.Result, error) { } //info + r.Info = string(data[pos:]) return r, nil } @@ -811,7 +1075,7 @@ func appendSetVariable(buf *bytes.Buffer, key string, value interface{}) { buf.WriteString(" = ") switch v := value.(type) { case string: - if strings.ToLower(v) == mysql.KeywordDefault { + if strings.ToLower(v) == mysql.KeywordDefault || key == mysql.SQLModeStr { buf.WriteString(v) } else { buf.WriteString("'") diff --git a/backend/direct_connection_en.md b/backend/direct_connection_en.md index ed2cbe7c..9823364a 100644 --- a/backend/direct_connection_en.md +++ b/backend/direct_connection_en.md @@ -12,17 +12,17 @@ There are some details about the initial handshake packet in [the official docum The actual packet demonstrates how this handshake works, and please see details below. -| packet | exmaple | -| ------------------------------- | ------------------------------------------------------------ | -| int<1> protocol version | Protocol Version 10 | -| string server version | MariaDB version is

[]uint8{
53, 46, 53, 46, 53,
45, 49, 48, 46, 53,
46, 49, 50, 45, 77,
97, 114, 105, 97, 68,
66, 45, 108, 111, 103
}

Converting the array to ASCII, the result is "5.5.5-10.5.12-MariaDB-log". | -| int<4> connection id | Connection ID is []uint8{16, 0, 0, 0}.

After reversing the array, it becomes []uint8{0, 0, 0, 16} that equals to []uint32{16}. | -| string<8> scramble 1st part | The first part of the scramble:

MariaDB utilizes the scramble for secure password authentication.

The scramble is 20 bytes of data; the first part occupies 8 bytes, []uint8{81, 64, 43, 85, 76, 90, 97, 91}. | -| string<1> reserved byte | It occupies 1 byte, []uint8{0}. | -| int<2> server capabilities | The first part of the capability occupies 2 bytes, []uint8{254, 247}. | +| packet | example | +| ------------------------------- |----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| int<1> protocol version | Protocol Version 10 | +| string server version | MariaDB version is

[]uint8{
53, 46, 53, 46, 53,
45, 49, 48, 46, 53,
46, 49, 50, 45, 77,
97, 114, 105, 97, 68,
66, 45, 108, 111, 103
}

Converting the array to ASCII, the result is "5.5.5-10.5.12-MariaDB-log". | +| int<4> connection id | Connection ID is []uint8{16, 0, 0, 0}.

After reversing the array, it becomes []uint8{0, 0, 0, 16} that equals to []uint32{16}. | +| string<8> scramble 1st part | The first part of the scramble:

MariaDB utilizes the scramble for secure password authentication.

The scramble is 20 bytes of data; the first part occupies 8 bytes, []uint8{81, 64, 43, 85, 76, 90, 97, 91}. | +| string<1> reserved byte | It occupies 1 byte, []uint8{0}. | +| int<2> server capabilities | The first part of the capability occupies 2 bytes, []uint8{254, 247}. | | int<1> server default collation | The charset of MariaDB in the current exameple is 33.

After checking
[document](https://mariadb.com/kb/en/supported-character-sets-and-collations/)
or
using a command "SHOW CHARACTER SET LIKE 'utf8'",
finding out that number 33 means "utf8_general_ci". | -| int<2> status flags | The status of MariaDB in the current exameple is []uint8{2, 0}.

Reversing from the status flags to []uint8{0, 2} and then converting them to binary, []uint{0b000000000, 0b00000010}.

After referring to "Gaea/mysql/constants.go", the result means "Autocommit." | -| int<2> server capabilities | The second part of the capability occupies 2 bytes, []uint8{255, 129}. | +| int<2> status flags | The status of MariaDB in the current exameple is []uint8{2, 0}.

Reversing from the status flags to []uint8{0, 2} and then converting them to binary, []uint{0b000000000, 0b00000010}.

After referring to "Gaea/mysql/constants.go", the result means "Autocommit." | +| int<2> server capabilities | The second part of the capability occupies 2 bytes, []uint8{255, 129}. | Calculate the whole capability @@ -210,11 +210,11 @@ Gaea's capability & dc.capability = []uint32{41477} & []uint32{2181036030} = []u image-20220319002738908 -| packet | exmaple | -| --------------------------------- | ------------------------------------------------------------ | -| int<4> client capabilities | Gaea reverses from the mutual capability []uint32{41476} to []uint8{4, 162, 0, 0} when sending the packet to MariaDB.
image-20220319113026919 | -| int<4> max packet size | It occupies 4 bytes, []uint8{0, 0, 0, 0}. | -| int<1> client character collation | After checking [document](https://mariadb.com/kb/en/supported-character-sets-and-collations/) , finding out that number 46 means "utf8mb4_bin". | +| packet | example | +| --------------------------------- |----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| int<4> client capabilities | Gaea reverses from the mutual capability []uint32{41476} to []uint8{4, 162, 0, 0} when sending the packet to MariaDB.
image-20220319113026919 | +| int<4> max packet size | It occupies 4 bytes, []uint8{0, 0, 0, 0}. | +| int<1> client character collation | After checking [document](https://mariadb.com/kb/en/supported-character-sets-and-collations/) , finding out that number 46 means "utf8mb4_bin". | | string<19> reserved | It occupies 19 bytes, []uint8{
0, 0, 0, 0, 0,
0, 0, 0, 0, 0,
0, 0, 0, 0, 0,
0, 0, 0, 0,
} | The next table follows on from the previous one. diff --git a/backend/direct_connection_test.go b/backend/direct_connection_test.go index 014a63e0..d0a2417d 100644 --- a/backend/direct_connection_test.go +++ b/backend/direct_connection_test.go @@ -4,7 +4,7 @@ // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // -// http://www.apache.org/licenses/LICENSE-2.0 +// http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, diff --git a/backend/interface.go b/backend/interface.go index 4d2e8f4a..03832556 100644 --- a/backend/interface.go +++ b/backend/interface.go @@ -1,3 +1,17 @@ +// Copyright 2024 The Gaea Authors. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + package backend import ( @@ -14,25 +28,34 @@ type PooledConnect interface { IsClosed() bool UseDB(db string) error Execute(sql string, maxRows int) (*mysql.Result, error) + ExecuteWithTimeout(sql string, maxRows int, timeout time.Duration) (*mysql.Result, error) SetAutoCommit(v uint8) error Begin() error Commit() error Rollback() error Ping() error + PingWithTimeout(timeout time.Duration) error SetCharset(charset string, collation mysql.CollationID) (bool, error) FieldList(table string, wildcard string) ([]*mysql.Field, error) GetAddr() string SetSessionVariables(frontend *mysql.SessionVariables) (bool, error) + SyncSessionVariables(frontend *mysql.SessionVariables) error WriteSetStatement() error GetConnectionID() int64 GetReturnTime() time.Time + MoreRowsExist() bool + MoreResultsExist() bool + FetchMoreRows(result *mysql.Result, maxRows int) error + ReadMoreResult(maxRows int) (*mysql.Result, error) } type ConnectionPool interface { - Open() + Open() error Addr() string + Datacenter() string Close() Get(ctx context.Context) (PooledConnect, error) + GetCheck(ctx context.Context) (PooledConnect, error) Put(pc PooledConnect) SetCapacity(capacity int) (err error) @@ -47,4 +70,6 @@ type ConnectionPool interface { WaitTime() time.Duration IdleTimeout() time.Duration IdleClosed() int64 + SetLastChecked() + GetLastChecked() int64 } diff --git a/backend/mock_connection_pool.go b/backend/mock_connection_pool.go new file mode 100644 index 00000000..63f5c64b --- /dev/null +++ b/backend/mock_connection_pool.go @@ -0,0 +1,323 @@ +// Code generated by MockGen. DO NOT EDIT. +// Source: github.com/XiaoMi/Gaea/backend (interfaces: ConnectionPool) + +// Package backend is a generated GoMock package. +package backend + +import ( + context "context" + gomock "github.com/golang/mock/gomock" + reflect "reflect" + time "time" +) + +// MockConnectionPool is a mock of ConnectionPool interface +type MockConnectionPool struct { + ctrl *gomock.Controller + recorder *MockConnectionPoolMockRecorder +} + +// MockConnectionPoolMockRecorder is the mock recorder for MockConnectionPool +type MockConnectionPoolMockRecorder struct { + mock *MockConnectionPool +} + +// NewMockConnectionPool creates a new mock instance +func NewMockConnectionPool(ctrl *gomock.Controller) *MockConnectionPool { + mock := &MockConnectionPool{ctrl: ctrl} + mock.recorder = &MockConnectionPoolMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use +func (m *MockConnectionPool) EXPECT() *MockConnectionPoolMockRecorder { + return m.recorder +} + +// Active mocks base method +func (m *MockConnectionPool) Active() int64 { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Active") + ret0, _ := ret[0].(int64) + return ret0 +} + +// Active indicates an expected call of Active +func (mr *MockConnectionPoolMockRecorder) Active() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Active", reflect.TypeOf((*MockConnectionPool)(nil).Active)) +} + +// Addr mocks base method +func (m *MockConnectionPool) Addr() string { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Addr") + ret0, _ := ret[0].(string) + return ret0 +} + +// Addr indicates an expected call of Addr +func (mr *MockConnectionPoolMockRecorder) Addr() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Addr", reflect.TypeOf((*MockConnectionPool)(nil).Addr)) +} + +// Available mocks base method +func (m *MockConnectionPool) Available() int64 { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Available") + ret0, _ := ret[0].(int64) + return ret0 +} + +// Available indicates an expected call of Available +func (mr *MockConnectionPoolMockRecorder) Available() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Available", reflect.TypeOf((*MockConnectionPool)(nil).Available)) +} + +// Capacity mocks base method +func (m *MockConnectionPool) Capacity() int64 { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Capacity") + ret0, _ := ret[0].(int64) + return ret0 +} + +// Capacity indicates an expected call of Capacity +func (mr *MockConnectionPoolMockRecorder) Capacity() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Capacity", reflect.TypeOf((*MockConnectionPool)(nil).Capacity)) +} + +// Close mocks base method +func (m *MockConnectionPool) Close() { + m.ctrl.T.Helper() + m.ctrl.Call(m, "Close") +} + +// Close indicates an expected call of Close +func (mr *MockConnectionPoolMockRecorder) Close() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Close", reflect.TypeOf((*MockConnectionPool)(nil).Close)) +} + +// Datacenter mocks base method +func (m *MockConnectionPool) Datacenter() string { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Datacenter") + ret0, _ := ret[0].(string) + return ret0 +} + +// Datacenter indicates an expected call of Datacenter +func (mr *MockConnectionPoolMockRecorder) Datacenter() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Datacenter", reflect.TypeOf((*MockConnectionPool)(nil).Datacenter)) +} + +// Get mocks base method +func (m *MockConnectionPool) Get(arg0 context.Context) (PooledConnect, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Get", arg0) + ret0, _ := ret[0].(PooledConnect) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Get indicates an expected call of Get +func (mr *MockConnectionPoolMockRecorder) Get(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Get", reflect.TypeOf((*MockConnectionPool)(nil).Get), arg0) +} + +// GetCheck mocks base method +func (m *MockConnectionPool) GetCheck(arg0 context.Context) (PooledConnect, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetCheck", arg0) + ret0, _ := ret[0].(PooledConnect) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetCheck indicates an expected call of GetCheck +func (mr *MockConnectionPoolMockRecorder) GetCheck(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetCheck", reflect.TypeOf((*MockConnectionPool)(nil).GetCheck), arg0) +} + +// GetLastChecked mocks base method +func (m *MockConnectionPool) GetLastChecked() int64 { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetLastChecked") + ret0, _ := ret[0].(int64) + return ret0 +} + +// GetLastChecked indicates an expected call of GetLastChecked +func (mr *MockConnectionPoolMockRecorder) GetLastChecked() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetLastChecked", reflect.TypeOf((*MockConnectionPool)(nil).GetLastChecked)) +} + +// IdleClosed mocks base method +func (m *MockConnectionPool) IdleClosed() int64 { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "IdleClosed") + ret0, _ := ret[0].(int64) + return ret0 +} + +// IdleClosed indicates an expected call of IdleClosed +func (mr *MockConnectionPoolMockRecorder) IdleClosed() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "IdleClosed", reflect.TypeOf((*MockConnectionPool)(nil).IdleClosed)) +} + +// IdleTimeout mocks base method +func (m *MockConnectionPool) IdleTimeout() time.Duration { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "IdleTimeout") + ret0, _ := ret[0].(time.Duration) + return ret0 +} + +// IdleTimeout indicates an expected call of IdleTimeout +func (mr *MockConnectionPoolMockRecorder) IdleTimeout() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "IdleTimeout", reflect.TypeOf((*MockConnectionPool)(nil).IdleTimeout)) +} + +// InUse mocks base method +func (m *MockConnectionPool) InUse() int64 { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "InUse") + ret0, _ := ret[0].(int64) + return ret0 +} + +// InUse indicates an expected call of InUse +func (mr *MockConnectionPoolMockRecorder) InUse() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "InUse", reflect.TypeOf((*MockConnectionPool)(nil).InUse)) +} + +// MaxCap mocks base method +func (m *MockConnectionPool) MaxCap() int64 { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "MaxCap") + ret0, _ := ret[0].(int64) + return ret0 +} + +// MaxCap indicates an expected call of MaxCap +func (mr *MockConnectionPoolMockRecorder) MaxCap() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "MaxCap", reflect.TypeOf((*MockConnectionPool)(nil).MaxCap)) +} + +// Open mocks base method +func (m *MockConnectionPool) Open() error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Open") + ret0, _ := ret[0].(error) + return ret0 +} + +// Open indicates an expected call of Open +func (mr *MockConnectionPoolMockRecorder) Open() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Open", reflect.TypeOf((*MockConnectionPool)(nil).Open)) +} + +// Put mocks base method +func (m *MockConnectionPool) Put(arg0 PooledConnect) { + m.ctrl.T.Helper() + m.ctrl.Call(m, "Put", arg0) +} + +// Put indicates an expected call of Put +func (mr *MockConnectionPoolMockRecorder) Put(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Put", reflect.TypeOf((*MockConnectionPool)(nil).Put), arg0) +} + +// SetCapacity mocks base method +func (m *MockConnectionPool) SetCapacity(arg0 int) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetCapacity", arg0) + ret0, _ := ret[0].(error) + return ret0 +} + +// SetCapacity indicates an expected call of SetCapacity +func (mr *MockConnectionPoolMockRecorder) SetCapacity(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetCapacity", reflect.TypeOf((*MockConnectionPool)(nil).SetCapacity), arg0) +} + +// SetIdleTimeout mocks base method +func (m *MockConnectionPool) SetIdleTimeout(arg0 time.Duration) { + m.ctrl.T.Helper() + m.ctrl.Call(m, "SetIdleTimeout", arg0) +} + +// SetIdleTimeout indicates an expected call of SetIdleTimeout +func (mr *MockConnectionPoolMockRecorder) SetIdleTimeout(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetIdleTimeout", reflect.TypeOf((*MockConnectionPool)(nil).SetIdleTimeout), arg0) +} + +// SetLastChecked mocks base method +func (m *MockConnectionPool) SetLastChecked() { + m.ctrl.T.Helper() + m.ctrl.Call(m, "SetLastChecked") +} + +// SetLastChecked indicates an expected call of SetLastChecked +func (mr *MockConnectionPoolMockRecorder) SetLastChecked() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetLastChecked", reflect.TypeOf((*MockConnectionPool)(nil).SetLastChecked)) +} + +// StatsJSON mocks base method +func (m *MockConnectionPool) StatsJSON() string { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "StatsJSON") + ret0, _ := ret[0].(string) + return ret0 +} + +// StatsJSON indicates an expected call of StatsJSON +func (mr *MockConnectionPoolMockRecorder) StatsJSON() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StatsJSON", reflect.TypeOf((*MockConnectionPool)(nil).StatsJSON)) +} + +// WaitCount mocks base method +func (m *MockConnectionPool) WaitCount() int64 { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "WaitCount") + ret0, _ := ret[0].(int64) + return ret0 +} + +// WaitCount indicates an expected call of WaitCount +func (mr *MockConnectionPoolMockRecorder) WaitCount() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "WaitCount", reflect.TypeOf((*MockConnectionPool)(nil).WaitCount)) +} + +// WaitTime mocks base method +func (m *MockConnectionPool) WaitTime() time.Duration { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "WaitTime") + ret0, _ := ret[0].(time.Duration) + return ret0 +} + +// WaitTime indicates an expected call of WaitTime +func (mr *MockConnectionPoolMockRecorder) WaitTime() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "WaitTime", reflect.TypeOf((*MockConnectionPool)(nil).WaitTime)) +} diff --git a/backend/mock_polled_connect.go b/backend/mock_polled_connect.go new file mode 100644 index 00000000..cf785bf3 --- /dev/null +++ b/backend/mock_polled_connect.go @@ -0,0 +1,381 @@ +// Code generated by MockGen. DO NOT EDIT. +// Source: github.com/XiaoMi/Gaea/backend (interfaces: PooledConnect) + +// Package backend is a generated GoMock package. +package backend + +import ( + mysql "github.com/XiaoMi/Gaea/mysql" + gomock "github.com/golang/mock/gomock" + reflect "reflect" + time "time" +) + +// MockPooledConnect is a mock of PooledConnect interface +type MockPooledConnect struct { + ctrl *gomock.Controller + recorder *MockPooledConnectMockRecorder +} + +// MockPooledConnectMockRecorder is the mock recorder for MockPooledConnect +type MockPooledConnectMockRecorder struct { + mock *MockPooledConnect +} + +// NewMockPooledConnect creates a new mock instance +func NewMockPooledConnect(ctrl *gomock.Controller) *MockPooledConnect { + mock := &MockPooledConnect{ctrl: ctrl} + mock.recorder = &MockPooledConnectMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use +func (m *MockPooledConnect) EXPECT() *MockPooledConnectMockRecorder { + return m.recorder +} + +// Begin mocks base method +func (m *MockPooledConnect) Begin() error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Begin") + ret0, _ := ret[0].(error) + return ret0 +} + +// Begin indicates an expected call of Begin +func (mr *MockPooledConnectMockRecorder) Begin() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Begin", reflect.TypeOf((*MockPooledConnect)(nil).Begin)) +} + +// Close mocks base method +func (m *MockPooledConnect) Close() { + m.ctrl.T.Helper() + m.ctrl.Call(m, "Close") +} + +// Close indicates an expected call of Close +func (mr *MockPooledConnectMockRecorder) Close() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Close", reflect.TypeOf((*MockPooledConnect)(nil).Close)) +} + +// Commit mocks base method +func (m *MockPooledConnect) Commit() error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Commit") + ret0, _ := ret[0].(error) + return ret0 +} + +// Commit indicates an expected call of Commit +func (mr *MockPooledConnectMockRecorder) Commit() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Commit", reflect.TypeOf((*MockPooledConnect)(nil).Commit)) +} + +// Execute mocks base method +func (m *MockPooledConnect) Execute(arg0 string, arg1 int) (*mysql.Result, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Execute", arg0, arg1) + ret0, _ := ret[0].(*mysql.Result) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Execute indicates an expected call of Execute +func (mr *MockPooledConnectMockRecorder) Execute(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Execute", reflect.TypeOf((*MockPooledConnect)(nil).Execute), arg0, arg1) +} + +// ExecuteWithTimeout mocks base method +func (m *MockPooledConnect) ExecuteWithTimeout(arg0 string, arg1 int, arg2 time.Duration) (*mysql.Result, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ExecuteWithTimeout", arg0, arg1, arg2) + ret0, _ := ret[0].(*mysql.Result) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ExecuteWithTimeout indicates an expected call of ExecuteWithTimeout +func (mr *MockPooledConnectMockRecorder) ExecuteWithTimeout(arg0, arg1, arg2 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ExecuteWithTimeout", reflect.TypeOf((*MockPooledConnect)(nil).ExecuteWithTimeout), arg0, arg1, arg2) +} + +// FetchMoreRows mocks base method +func (m *MockPooledConnect) FetchMoreRows(arg0 *mysql.Result, arg1 int) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "FetchMoreRows", arg0, arg1) + ret0, _ := ret[0].(error) + return ret0 +} + +// FetchMoreRows indicates an expected call of FetchMoreRows +func (mr *MockPooledConnectMockRecorder) FetchMoreRows(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "FetchMoreRows", reflect.TypeOf((*MockPooledConnect)(nil).FetchMoreRows), arg0, arg1) +} + +// FieldList mocks base method +func (m *MockPooledConnect) FieldList(arg0, arg1 string) ([]*mysql.Field, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "FieldList", arg0, arg1) + ret0, _ := ret[0].([]*mysql.Field) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// FieldList indicates an expected call of FieldList +func (mr *MockPooledConnectMockRecorder) FieldList(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "FieldList", reflect.TypeOf((*MockPooledConnect)(nil).FieldList), arg0, arg1) +} + +// GetAddr mocks base method +func (m *MockPooledConnect) GetAddr() string { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetAddr") + ret0, _ := ret[0].(string) + return ret0 +} + +// GetAddr indicates an expected call of GetAddr +func (mr *MockPooledConnectMockRecorder) GetAddr() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetAddr", reflect.TypeOf((*MockPooledConnect)(nil).GetAddr)) +} + +// GetConnectionID mocks base method +func (m *MockPooledConnect) GetConnectionID() int64 { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetConnectionID") + ret0, _ := ret[0].(int64) + return ret0 +} + +// GetConnectionID indicates an expected call of GetConnectionID +func (mr *MockPooledConnectMockRecorder) GetConnectionID() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetConnectionID", reflect.TypeOf((*MockPooledConnect)(nil).GetConnectionID)) +} + +// GetReturnTime mocks base method +func (m *MockPooledConnect) GetReturnTime() time.Time { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetReturnTime") + ret0, _ := ret[0].(time.Time) + return ret0 +} + +// GetReturnTime indicates an expected call of GetReturnTime +func (mr *MockPooledConnectMockRecorder) GetReturnTime() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetReturnTime", reflect.TypeOf((*MockPooledConnect)(nil).GetReturnTime)) +} + +// IsClosed mocks base method +func (m *MockPooledConnect) IsClosed() bool { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "IsClosed") + ret0, _ := ret[0].(bool) + return ret0 +} + +// IsClosed indicates an expected call of IsClosed +func (mr *MockPooledConnectMockRecorder) IsClosed() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "IsClosed", reflect.TypeOf((*MockPooledConnect)(nil).IsClosed)) +} + +// MoreResultsExist mocks base method +func (m *MockPooledConnect) MoreResultsExist() bool { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "MoreResultsExist") + ret0, _ := ret[0].(bool) + return ret0 +} + +// MoreResultsExist indicates an expected call of MoreResultsExist +func (mr *MockPooledConnectMockRecorder) MoreResultsExist() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "MoreResultsExist", reflect.TypeOf((*MockPooledConnect)(nil).MoreResultsExist)) +} + +// MoreRowsExist mocks base method +func (m *MockPooledConnect) MoreRowsExist() bool { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "MoreRowsExist") + ret0, _ := ret[0].(bool) + return ret0 +} + +// MoreRowsExist indicates an expected call of MoreRowsExist +func (mr *MockPooledConnectMockRecorder) MoreRowsExist() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "MoreRowsExist", reflect.TypeOf((*MockPooledConnect)(nil).MoreRowsExist)) +} + +// Ping mocks base method +func (m *MockPooledConnect) Ping() error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Ping") + ret0, _ := ret[0].(error) + return ret0 +} + +// Ping indicates an expected call of Ping +func (mr *MockPooledConnectMockRecorder) Ping() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Ping", reflect.TypeOf((*MockPooledConnect)(nil).Ping)) +} + +// PingWithTimeout mocks base method +func (m *MockPooledConnect) PingWithTimeout(arg0 time.Duration) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "PingWithTimeout", arg0) + ret0, _ := ret[0].(error) + return ret0 +} + +// PingWithTimeout indicates an expected call of PingWithTimeout +func (mr *MockPooledConnectMockRecorder) PingWithTimeout(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PingWithTimeout", reflect.TypeOf((*MockPooledConnect)(nil).PingWithTimeout), arg0) +} + +// ReadMoreResult mocks base method +func (m *MockPooledConnect) ReadMoreResult(arg0 int) (*mysql.Result, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ReadMoreResult", arg0) + ret0, _ := ret[0].(*mysql.Result) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ReadMoreResult indicates an expected call of ReadMoreResult +func (mr *MockPooledConnectMockRecorder) ReadMoreResult(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ReadMoreResult", reflect.TypeOf((*MockPooledConnect)(nil).ReadMoreResult), arg0) +} + +// Reconnect mocks base method +func (m *MockPooledConnect) Reconnect() error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Reconnect") + ret0, _ := ret[0].(error) + return ret0 +} + +// Reconnect indicates an expected call of Reconnect +func (mr *MockPooledConnectMockRecorder) Reconnect() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Reconnect", reflect.TypeOf((*MockPooledConnect)(nil).Reconnect)) +} + +// Recycle mocks base method +func (m *MockPooledConnect) Recycle() { + m.ctrl.T.Helper() + m.ctrl.Call(m, "Recycle") +} + +// Recycle indicates an expected call of Recycle +func (mr *MockPooledConnectMockRecorder) Recycle() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Recycle", reflect.TypeOf((*MockPooledConnect)(nil).Recycle)) +} + +// Rollback mocks base method +func (m *MockPooledConnect) Rollback() error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Rollback") + ret0, _ := ret[0].(error) + return ret0 +} + +// Rollback indicates an expected call of Rollback +func (mr *MockPooledConnectMockRecorder) Rollback() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Rollback", reflect.TypeOf((*MockPooledConnect)(nil).Rollback)) +} + +// SetAutoCommit mocks base method +func (m *MockPooledConnect) SetAutoCommit(arg0 byte) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetAutoCommit", arg0) + ret0, _ := ret[0].(error) + return ret0 +} + +// SetAutoCommit indicates an expected call of SetAutoCommit +func (mr *MockPooledConnectMockRecorder) SetAutoCommit(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetAutoCommit", reflect.TypeOf((*MockPooledConnect)(nil).SetAutoCommit), arg0) +} + +// SetCharset mocks base method +func (m *MockPooledConnect) SetCharset(arg0 string, arg1 mysql.CollationID) (bool, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetCharset", arg0, arg1) + ret0, _ := ret[0].(bool) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// SetCharset indicates an expected call of SetCharset +func (mr *MockPooledConnectMockRecorder) SetCharset(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetCharset", reflect.TypeOf((*MockPooledConnect)(nil).SetCharset), arg0, arg1) +} + +// SetSessionVariables mocks base method +func (m *MockPooledConnect) SetSessionVariables(arg0 *mysql.SessionVariables) (bool, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetSessionVariables", arg0) + ret0, _ := ret[0].(bool) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// SyncSessionVariables mocks base method +func (m *MockPooledConnect) SyncSessionVariables(arg0 *mysql.SessionVariables) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SyncSessionVariables", arg0) + ret0, _ := ret[0].(error) + return ret0 +} + +// SetSessionVariables indicates an expected call of SetSessionVariables +func (mr *MockPooledConnectMockRecorder) SetSessionVariables(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetSessionVariables", reflect.TypeOf((*MockPooledConnect)(nil).SetSessionVariables), arg0) +} + +// UseDB mocks base method +func (m *MockPooledConnect) UseDB(arg0 string) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "UseDB", arg0) + ret0, _ := ret[0].(error) + return ret0 +} + +// UseDB indicates an expected call of UseDB +func (mr *MockPooledConnectMockRecorder) UseDB(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UseDB", reflect.TypeOf((*MockPooledConnect)(nil).UseDB), arg0) +} + +// WriteSetStatement mocks base method +func (m *MockPooledConnect) WriteSetStatement() error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "WriteSetStatement") + ret0, _ := ret[0].(error) + return ret0 +} + +// WriteSetStatement indicates an expected call of WriteSetStatement +func (mr *MockPooledConnectMockRecorder) WriteSetStatement() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "WriteSetStatement", reflect.TypeOf((*MockPooledConnect)(nil).WriteSetStatement)) +} diff --git a/backend/mocks/ConnectionPool.go b/backend/mocks/ConnectionPool.go deleted file mode 100644 index 1d0baddb..00000000 --- a/backend/mocks/ConnectionPool.go +++ /dev/null @@ -1,229 +0,0 @@ -// Code generated by mockery v1.0.0. DO NOT EDIT. - -package mocks - -import ( - context "context" - - backend "github.com/XiaoMi/Gaea/backend" - - mock "github.com/stretchr/testify/mock" - - time "time" -) - -// ConnectionPool is an autogenerated mock type for the ConnectionPool type -type ConnectionPool struct { - mock.Mock -} - -// Active provides a mock function with given fields: -func (_m *ConnectionPool) Active() int64 { - ret := _m.Called() - - var r0 int64 - if rf, ok := ret.Get(0).(func() int64); ok { - r0 = rf() - } else { - r0 = ret.Get(0).(int64) - } - - return r0 -} - -// Addr provides a mock function with given fields: -func (_m *ConnectionPool) Addr() string { - ret := _m.Called() - - var r0 string - if rf, ok := ret.Get(0).(func() string); ok { - r0 = rf() - } else { - r0 = ret.Get(0).(string) - } - - return r0 -} - -// Available provides a mock function with given fields: -func (_m *ConnectionPool) Available() int64 { - ret := _m.Called() - - var r0 int64 - if rf, ok := ret.Get(0).(func() int64); ok { - r0 = rf() - } else { - r0 = ret.Get(0).(int64) - } - - return r0 -} - -// Capacity provides a mock function with given fields: -func (_m *ConnectionPool) Capacity() int64 { - ret := _m.Called() - - var r0 int64 - if rf, ok := ret.Get(0).(func() int64); ok { - r0 = rf() - } else { - r0 = ret.Get(0).(int64) - } - - return r0 -} - -// Close provides a mock function with given fields: -func (_m *ConnectionPool) Close() { - _m.Called() -} - -// Get provides a mock function with given fields: ctx -func (_m *ConnectionPool) Get(ctx context.Context) (backend.PooledConnect, error) { - ret := _m.Called(ctx) - - var r0 backend.PooledConnect - if rf, ok := ret.Get(0).(func(context.Context) backend.PooledConnect); ok { - r0 = rf(ctx) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(backend.PooledConnect) - } - } - - var r1 error - if rf, ok := ret.Get(1).(func(context.Context) error); ok { - r1 = rf(ctx) - } else { - r1 = ret.Error(1) - } - - return r0, r1 -} - -// IdleClosed provides a mock function with given fields: -func (_m *ConnectionPool) IdleClosed() int64 { - ret := _m.Called() - - var r0 int64 - if rf, ok := ret.Get(0).(func() int64); ok { - r0 = rf() - } else { - r0 = ret.Get(0).(int64) - } - - return r0 -} - -// IdleTimeout provides a mock function with given fields: -func (_m *ConnectionPool) IdleTimeout() time.Duration { - ret := _m.Called() - - var r0 time.Duration - if rf, ok := ret.Get(0).(func() time.Duration); ok { - r0 = rf() - } else { - r0 = ret.Get(0).(time.Duration) - } - - return r0 -} - -// InUse provides a mock function with given fields: -func (_m *ConnectionPool) InUse() int64 { - ret := _m.Called() - - var r0 int64 - if rf, ok := ret.Get(0).(func() int64); ok { - r0 = rf() - } else { - r0 = ret.Get(0).(int64) - } - - return r0 -} - -// MaxCap provides a mock function with given fields: -func (_m *ConnectionPool) MaxCap() int64 { - ret := _m.Called() - - var r0 int64 - if rf, ok := ret.Get(0).(func() int64); ok { - r0 = rf() - } else { - r0 = ret.Get(0).(int64) - } - - return r0 -} - -// Open provides a mock function with given fields: -func (_m *ConnectionPool) Open() { - _m.Called() -} - -// Put provides a mock function with given fields: pc -func (_m *ConnectionPool) Put(pc backend.PooledConnect) { - _m.Called(pc) -} - -// SetCapacity provides a mock function with given fields: capacity -func (_m *ConnectionPool) SetCapacity(capacity int) error { - ret := _m.Called(capacity) - - var r0 error - if rf, ok := ret.Get(0).(func(int) error); ok { - r0 = rf(capacity) - } else { - r0 = ret.Error(0) - } - - return r0 -} - -// SetIdleTimeout provides a mock function with given fields: idleTimeout -func (_m *ConnectionPool) SetIdleTimeout(idleTimeout time.Duration) { - _m.Called(idleTimeout) -} - -// StatsJSON provides a mock function with given fields: -func (_m *ConnectionPool) StatsJSON() string { - ret := _m.Called() - - var r0 string - if rf, ok := ret.Get(0).(func() string); ok { - r0 = rf() - } else { - r0 = ret.Get(0).(string) - } - - return r0 -} - -// WaitCount provides a mock function with given fields: -func (_m *ConnectionPool) WaitCount() int64 { - ret := _m.Called() - - var r0 int64 - if rf, ok := ret.Get(0).(func() int64); ok { - r0 = rf() - } else { - r0 = ret.Get(0).(int64) - } - - return r0 -} - -// WaitTime provides a mock function with given fields: -func (_m *ConnectionPool) WaitTime() time.Duration { - ret := _m.Called() - - var r0 time.Duration - if rf, ok := ret.Get(0).(func() time.Duration); ok { - r0 = rf() - } else { - r0 = ret.Get(0).(time.Duration) - } - - return r0 -} diff --git a/backend/mocks/PooledConnect.go b/backend/mocks/PooledConnect.go deleted file mode 100644 index dd4980f4..00000000 --- a/backend/mocks/PooledConnect.go +++ /dev/null @@ -1,270 +0,0 @@ -// Code generated by mockery v1.0.0. DO NOT EDIT. - -package mocks - -import ( - "time" - - mysql "github.com/XiaoMi/Gaea/mysql" - mock "github.com/stretchr/testify/mock" -) - -// PooledConnect is an autogenerated mock type for the PooledConnect type -type PooledConnect struct { - mock.Mock -} - -// Begin provides a mock function with given fields: -func (_m *PooledConnect) Begin() error { - ret := _m.Called() - - var r0 error - if rf, ok := ret.Get(0).(func() error); ok { - r0 = rf() - } else { - r0 = ret.Error(0) - } - - return r0 -} - -// Close provides a mock function with given fields: -func (_m *PooledConnect) Close() { - _m.Called() -} - -// Commit provides a mock function with given fields: -func (_m *PooledConnect) Commit() error { - ret := _m.Called() - - var r0 error - if rf, ok := ret.Get(0).(func() error); ok { - r0 = rf() - } else { - r0 = ret.Error(0) - } - - return r0 -} - -// Execute provides a mock function with given fields: sql, maxRows -func (_m *PooledConnect) Execute(sql string, maxRows int) (*mysql.Result, error) { - ret := _m.Called(sql, maxRows) - - var r0 *mysql.Result - if rf, ok := ret.Get(0).(func(string, int) *mysql.Result); ok { - r0 = rf(sql, maxRows) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*mysql.Result) - } - } - - var r1 error - if rf, ok := ret.Get(1).(func(string, int) error); ok { - r1 = rf(sql, maxRows) - } else { - r1 = ret.Error(1) - } - - return r0, r1 -} - -// FieldList provides a mock function with given fields: table, wildcard -func (_m *PooledConnect) FieldList(table string, wildcard string) ([]*mysql.Field, error) { - ret := _m.Called(table, wildcard) - - var r0 []*mysql.Field - if rf, ok := ret.Get(0).(func(string, string) []*mysql.Field); ok { - r0 = rf(table, wildcard) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).([]*mysql.Field) - } - } - - var r1 error - if rf, ok := ret.Get(1).(func(string, string) error); ok { - r1 = rf(table, wildcard) - } else { - r1 = ret.Error(1) - } - - return r0, r1 -} - -// GetAddr provides a mock function with given fields: -func (_m *PooledConnect) GetAddr() string { - ret := _m.Called() - - var r0 string - if rf, ok := ret.Get(0).(func() string); ok { - r0 = rf() - } else { - r0 = ret.Get(0).(string) - } - - return r0 -} - -// GetConnectionID provides a mock function with given fields: -func (_m *PooledConnect) GetConnectionID() int64 { - ret := _m.Called() - - var r0 int64 - if rf, ok := ret.Get(0).(func() int64); ok { - r0 = rf() - } else { - r0 = ret.Get(0).(int64) - } - - return r0 -} - -// IsClosed provides a mock function with given fields: -func (_m *PooledConnect) IsClosed() bool { - ret := _m.Called() - - var r0 bool - if rf, ok := ret.Get(0).(func() bool); ok { - r0 = rf() - } else { - r0 = ret.Get(0).(bool) - } - - return r0 -} - -// Reconnect provides a mock function with given fields: -func (_m *PooledConnect) Reconnect() error { - ret := _m.Called() - - var r0 error - if rf, ok := ret.Get(0).(func() error); ok { - r0 = rf() - } else { - r0 = ret.Error(0) - } - - return r0 -} - -// Recycle provides a mock function with given fields: -func (_m *PooledConnect) Recycle() { - _m.Called() -} - -// Rollback provides a mock function with given fields: -func (_m *PooledConnect) Rollback() error { - ret := _m.Called() - - var r0 error - if rf, ok := ret.Get(0).(func() error); ok { - r0 = rf() - } else { - r0 = ret.Error(0) - } - - return r0 -} - -// SetAutoCommit provides a mock function with given fields: v -func (_m *PooledConnect) SetAutoCommit(v uint8) error { - ret := _m.Called(v) - - var r0 error - if rf, ok := ret.Get(0).(func(uint8) error); ok { - r0 = rf(v) - } else { - r0 = ret.Error(0) - } - - return r0 -} - -// SetCharset provides a mock function with given fields: charset, collation -func (_m *PooledConnect) SetCharset(charset string, collation mysql.CollationID) (bool, error) { - ret := _m.Called(charset, collation) - - var r0 bool - if rf, ok := ret.Get(0).(func(string, mysql.CollationID) bool); ok { - r0 = rf(charset, collation) - } else { - r0 = ret.Get(0).(bool) - } - - var r1 error - if rf, ok := ret.Get(1).(func(string, mysql.CollationID) error); ok { - r1 = rf(charset, collation) - } else { - r1 = ret.Error(1) - } - - return r0, r1 -} - -// SetSessionVariables provides a mock function with given fields: frontend -func (_m *PooledConnect) SetSessionVariables(frontend *mysql.SessionVariables) (bool, error) { - ret := _m.Called(frontend) - - var r0 bool - if rf, ok := ret.Get(0).(func(*mysql.SessionVariables) bool); ok { - r0 = rf(frontend) - } else { - r0 = ret.Get(0).(bool) - } - - var r1 error - if rf, ok := ret.Get(1).(func(*mysql.SessionVariables) error); ok { - r1 = rf(frontend) - } else { - r1 = ret.Error(1) - } - - return r0, r1 -} - -// UseDB provides a mock function with given fields: db -func (_m *PooledConnect) UseDB(db string) error { - ret := _m.Called(db) - - var r0 error - if rf, ok := ret.Get(0).(func(string) error); ok { - r0 = rf(db) - } else { - r0 = ret.Error(0) - } - - return r0 -} - -// WriteSetStatement provides a mock function with given fields: -func (_m *PooledConnect) WriteSetStatement() error { - ret := _m.Called() - - var r0 error - if rf, ok := ret.Get(0).(func() error); ok { - r0 = rf() - } else { - r0 = ret.Error(0) - } - - return r0 -} - -func (_m *PooledConnect) Ping() error { - ret := _m.Called() - - var r0 error - if rf, ok := ret.Get(0).(func() error); ok { - r0 = rf() - } else { - r0 = ret.Error(0) - } - - return r0 -} - -func (_m *PooledConnect) GetReturnTime() time.Time { - return time.Now() -} diff --git a/backend/pooled_connection.go b/backend/pooled_connection.go index 2dcbe676..69584981 100644 --- a/backend/pooled_connection.go +++ b/backend/pooled_connection.go @@ -15,8 +15,11 @@ package backend import ( + "fmt" "time" + "github.com/XiaoMi/Gaea/log" + "github.com/XiaoMi/Gaea/mysql" ) @@ -25,6 +28,8 @@ type pooledConnectImpl struct { directConnection *DirectConnection pool *connectionPoolImpl returnTime time.Time + moreRowsExist bool + moreResultsExist bool } // Recycle return PooledConnect to the pool @@ -46,7 +51,7 @@ func (pc *pooledConnectImpl) Recycle() { // If we get "MySQL server has gone away (errno 2006)", then call Reconnect func (pc *pooledConnectImpl) Reconnect() error { pc.directConnection.Close() - newConn, err := NewDirectConnection(pc.pool.addr, pc.pool.user, pc.pool.password, pc.pool.db, pc.pool.charset, pc.pool.collationID) + newConn, err := NewDirectConnection(pc.pool.addr, pc.pool.user, pc.pool.password, pc.pool.db, pc.pool.charset, pc.pool.collationID, pc.pool.clientCapability) if err != nil { return err } @@ -73,11 +78,62 @@ func (pc *pooledConnectImpl) UseDB(db string) error { } func (pc *pooledConnectImpl) Ping() error { + if pc.directConnection == nil { + return fmt.Errorf("directConnection is nil, pc addr:%s", pc.GetAddr()) + } return pc.directConnection.Ping() } + +func (pc *pooledConnectImpl) PingWithTimeout(timeout time.Duration) error { + return pc.directConnection.PingWithTimeout(timeout) +} + // Execute wrapper of direct connection, execute sql func (pc *pooledConnectImpl) Execute(sql string, maxRows int) (*mysql.Result, error) { - return pc.directConnection.Execute(sql, maxRows) + rs, err := pc.directConnection.Execute(sql, maxRows) + pc.moreRowsExist = pc.directConnection.moreRowExists + if err != nil { + return nil, err + } + if rs != nil { + if rs.Status&mysql.ServerMoreResultsExists > 0 { + pc.moreResultsExist = true + } else { + pc.moreResultsExist = false + } + } + return rs, err +} + +func (pc *pooledConnectImpl) FetchMoreRows(result *mysql.Result, maxRows int) error { + err := pc.directConnection.readResultRows(result, false, maxRows) + pc.moreRowsExist = pc.directConnection.moreRowExists + return err +} + +func (pc *pooledConnectImpl) ReadMoreResult(maxRows int) (*mysql.Result, error) { + // set default to false + pc.moreResultsExist = false + rs, err := pc.directConnection.readResult(false, maxRows) + if err != nil { + return nil, err + } + if rs != nil && rs.Status&mysql.ServerMoreResultsExists > 0 { + pc.moreResultsExist = true + } + return rs, err +} + +func (pc *pooledConnectImpl) ExecuteWithTimeout(sql string, maxRows int, timeout time.Duration) (*mysql.Result, error) { + return pc.directConnection.ExecuteWithTimeout(sql, maxRows, timeout) +} + +func (pc *pooledConnectImpl) MoreRowsExist() bool { + return pc.moreRowsExist +} + +func (pc *pooledConnectImpl) MoreResultsExist() bool { + return pc.moreResultsExist } // SetAutoCommit wrapper of direct connection, set autocommit @@ -120,15 +176,26 @@ func (pc *pooledConnectImpl) SetSessionVariables(frontend *mysql.SessionVariable return pc.directConnection.SetSessionVariables(frontend) } +// SyncSessionVariables synchronizes the session variables from the given frontend session state +// It is typically used to ensure that the database connection reflects the current state +// expected by the application, such as character sets, transaction settings, and other session-specific +// settings. +func (pc *pooledConnectImpl) SyncSessionVariables(frontend *mysql.SessionVariables) error { + return pc.directConnection.SyncSessionVariables(frontend) +} + // WriteSetStatement exec sql func (pc *pooledConnectImpl) WriteSetStatement() error { return pc.directConnection.WriteSetStatement() } func (pc *pooledConnectImpl) GetConnectionID() int64 { + if pc.directConnection.conn == nil { + log.Warn("GetConnectionID failed conn is nil, conn closed = %v, pc address = %v", pc.directConnection.IsClosed(), &(pc.directConnection)) + } return int64(pc.directConnection.conn.ConnectionID) } func (pc *pooledConnectImpl) GetReturnTime() time.Time { return pc.returnTime -} \ No newline at end of file +} diff --git a/backend/slice.go b/backend/slice.go index 62db739f..e80265c0 100644 --- a/backend/slice.go +++ b/backend/slice.go @@ -30,9 +30,11 @@ package backend import ( "context" + "fmt" "strconv" "strings" "sync" + "time" "github.com/XiaoMi/Gaea/core/errors" "github.com/XiaoMi/Gaea/log" @@ -41,28 +43,65 @@ import ( "github.com/XiaoMi/Gaea/util" ) +type StatusCode uint32 + const ( - weightSplit = "@" + weightSplit = "@" + datacenterSplit = "#" // DefaultSlice means default slice for namespace - DefaultSlice = "slice-0" + DefaultSlice = "slice-0" + PingPeriod int64 = 4 + + StatusUp StatusCode = 1 + StatusDown StatusCode = 0 + LocalSlaveReadClosed = 0 + LocalSlaveReadPreferred = 1 + LocalSlaveReadForce = 2 ) +func (s *StatusCode) String() string { + r := "StatusUp" + if *s == StatusDown { + r = "StatusDown" + } + + return fmt.Sprintf(r) +} + +type DBInfo struct { + ConnPool []ConnectionPool + Balancer *balancer + StatusMap *sync.Map + Datacenter []string +} + +func (dbi *DBInfo) GetStatus(index int) (StatusCode, error) { + if index > len(dbi.ConnPool) { + return StatusDown, fmt.Errorf("index:%d out of range", index) + } + if value, ok := dbi.StatusMap.Load(index); ok { + return value.(StatusCode), nil + } + return StatusDown, fmt.Errorf("can't get status of index:%d", index) +} + +func (dbi *DBInfo) SetStatus(index int, status StatusCode) { + dbi.StatusMap.Store(index, status) +} + // Slice means one slice of the mysql cluster type Slice struct { Cfg models.Slice sync.RWMutex - Master ConnectionPool - - Slave []ConnectionPool - slaveBalancer *balancer - - StatisticSlave []ConnectionPool - statisticSlaveBalancer *balancer - - charset string - collationID mysql.CollationID + Master *DBInfo + Slave *DBInfo + StatisticSlave *DBInfo + ProxyDatacenter string + charset string + collationID mysql.CollationID + HealthCheckSql string } // GetSliceName return name of slice @@ -71,15 +110,15 @@ func (s *Slice) GetSliceName() string { } // GetConn get backend connection from different node based on fromSlave and userType -func (s *Slice) GetConn(fromSlave bool, userType int) (pc PooledConnect, err error) { +func (s *Slice) GetConn(fromSlave bool, userType int, localSlaveReadPriority int) (pc PooledConnect, err error) { if fromSlave { if userType == models.StatisticUser { - pc, err = s.GetStatisticSlaveConn() + pc, err = s.GetSlaveConn(s.StatisticSlave, localSlaveReadPriority) if err != nil { return nil, err } } else { - pc, err = s.GetSlaveConn() + pc, err = s.GetSlaveConn(s.Slave, localSlaveReadPriority) if err != nil { log.Warn("get connection from slave failed, try to get from master, error: %s", err.Error()) pc, err = s.GetMasterConn() @@ -90,51 +129,242 @@ func (s *Slice) GetConn(fromSlave bool, userType int) (pc PooledConnect, err err } if err != nil { log.Warn("get connection from backend failed, error: %s", err.Error()) - return } return } func (s *Slice) GetDirectConn(addr string) (*DirectConnection, error) { - return NewDirectConnection(addr, s.Cfg.UserName, s.Cfg.Password, "", s.charset, s.collationID) + return NewDirectConnection(addr, s.Cfg.UserName, s.Cfg.Password, "", s.charset, s.collationID, s.Cfg.Capability) } // GetMasterConn return a connection in master pool func (s *Slice) GetMasterConn() (PooledConnect, error) { + if v, _ := s.Master.StatusMap.Load(0); v != StatusUp { + return nil, fmt.Errorf("master:%s is Down", s.Cfg.Master) + } + ctx := context.TODO() - return s.Master.Get(ctx) + return s.Master.ConnPool[0].Get(ctx) } -// GetSlaveConn return a connection in slave pool -func (s *Slice) GetSlaveConn() (PooledConnect, error) { - if len(s.Slave) == 0 { - return nil, errors.ErrNoDatabase +// GetMasterStatus return master status +func (s *Slice) GetMasterStatus() (StatusCode, error) { + return s.Master.GetStatus(0) +} + +// SetMasterStatus set master status +func (s *Slice) SetMasterStatus(code StatusCode) { + s.Master.SetStatus(0, code) +} + +// CheckStatus check slice instance status +func (s *Slice) CheckStatus(ctx context.Context, name string, downAfterNoAlive int, secondsBehindMaster int) { + go s.checkBackendMasterStatus(ctx, name, downAfterNoAlive) + go s.checkBackendSlaveStatus(ctx, s.Slave, name, downAfterNoAlive, secondsBehindMaster) + go s.checkBackendSlaveStatus(ctx, s.StatisticSlave, name, downAfterNoAlive, secondsBehindMaster) +} + +func (s *Slice) checkBackendMasterStatus(ctx context.Context, name string, downAfterNoAlive int) { + defer func() { + if err := recover(); err != nil { + log.Fatal("[ns:%s, %s] check master status panic:%s", name, s.Cfg.Name, err) + } + }() + for { + select { + case <-ctx.Done(): + log.Warn("[ns:%s, %s] check master status canceled", name, s.Cfg.Name) + return + case <-time.After(time.Duration(PingPeriod) * time.Second): + if len(s.Master.ConnPool) == 0 { + log.Warn("[ns:%s, %s] master is empty", name, s.Cfg.Name) + continue + } + cp := s.Master.ConnPool[0] + log.Debug("[ns:%s, %s:%s] start check master", name, s.Cfg.Name, cp.Addr()) + _, err := checkInstanceStatus(name, cp, s.HealthCheckSql) + + if time.Now().Unix()-cp.GetLastChecked() >= int64(downAfterNoAlive) { + s.SetMasterStatus(StatusDown) + log.Warn("[ns:%s, %s:%s] check master StatusDown for %ds. err: %s", name, s.Cfg.Name, cp.Addr(), time.Now().Unix()-cp.GetLastChecked(), err) + continue + } + + oldStatus, err := s.GetMasterStatus() + if err != nil { + log.Warn("[ns:%s, %s:%s] get master master status error:%s", name, s.Cfg.Name, cp.Addr(), err) + continue + } + + s.SetMasterStatus(StatusUp) + if oldStatus == StatusDown { + log.Warn("[ns:%s, %s:%s] check master StatusUp", name, s.Cfg.Name, cp.Addr()) + } + } } +} - s.Lock() - index, err := s.slaveBalancer.next() - s.Unlock() +func (s *Slice) checkBackendSlaveStatus(ctx context.Context, db *DBInfo, name string, downAfterNoAlive int, secondBehindMaster int) { + defer func() { + if err := recover(); err != nil { + log.Fatal("[ns:%s, %s] check slave status panic:%s", name, s.Cfg.Name, err) + } + }() + + for { + select { + case <-ctx.Done(): + log.Warn("[ns:%s, %s] check slave status canceled", name, s.Cfg.Name) + return + case <-time.After(time.Duration(PingPeriod) * time.Second): + for idx, cp := range db.ConnPool { + log.Debug("[ns:%s, %s:%s] start check slave", name, s.Cfg.Name, cp.Addr()) + + oldStatus, err := db.GetStatus(idx) + if err != nil { + log.Warn("[ns:%s, %s:%s] get slave status error:%s", name, s.Cfg.Name, cp.Addr(), err) + continue + } + pc, err := checkInstanceStatus(name, cp, s.HealthCheckSql) + // check slave status + if time.Now().Unix()-cp.GetLastChecked() >= int64(downAfterNoAlive) { + db.SetStatus(idx, StatusDown) + log.Warn("[ns:%s, %s:%s] check slave StatusDown for %ds. err:%s", name, s.Cfg.Name, cp.Addr(), time.Now().Unix()-cp.GetLastChecked(), err) + continue + } + + // check master status, if master is down, we should not check slave sync status,cause slave io thread is close + if masterStatus, err := s.GetMasterStatus(); err != nil { + log.Warn("[ns:%s, %s:%s] get master status error:%s", name, s.Cfg.Name, cp.Addr(), err) + continue + } else if masterStatus == StatusDown { + // set slave status to up to avoid slave down when master is down on startup + db.SetStatus(idx, StatusUp) + if oldStatus == StatusDown { + log.Warn("[ns:%s, %s:%s] check slave StatusUp", name, s.Cfg.Name, cp.Addr()) + } + continue + } + + if pc == nil { + log.Warn("[ns:%s, %s:%s] skip check slave sync, get nil conn", name, s.Cfg.Name, cp.Addr()) + continue + } + + if alive, err := checkSlaveSyncStatus(pc, secondBehindMaster); !alive { + db.SetStatus(idx, StatusDown) + log.Warn("[ns:%s, %s:%s] check slave StatusDown. sync err:%s", name, s.Cfg.Name, cp.Addr(), err) + continue + } + + db.SetStatus(idx, StatusUp) + if oldStatus == StatusDown { + log.Warn("[ns:%s, %s:%s] check slave StatusUp", name, s.Cfg.Name, cp.Addr()) + } + } + } + } +} + +func checkInstanceStatus(name string, cp ConnectionPool, healthCheckSql string) (PooledConnect, error) { + defer func() { + if err := recover(); err != nil { + log.Fatal("[ns:%s, %s] check instance status panic:%s", name, cp.Addr(), err) + } + }() + + pc, err := cp.GetCheck(context.Background()) if err != nil { - return nil, err + if pc != nil { + pc.Close() + } + return nil, fmt.Errorf("get check conn err:%s", err) } - ctx := context.TODO() - return s.Slave[index].Get(ctx) + + if pc == nil { + return nil, fmt.Errorf("get nil check conn, ins:%s", cp.Addr()) + } + + if len(healthCheckSql) > 0 { + _, err := pc.ExecuteWithTimeout(healthCheckSql, 0, ExecTimeOut) + if err == nil { + cp.SetLastChecked() + return pc, nil + } + log.Warn("[ns:%s instance:%s] exec health check sql:%s sqlError:%v", name, cp.Addr(), healthCheckSql, err) + if mysql.IsServerShutdownErr(err) || mysql.IsTableSpaceMissingErr(err) || mysql.IsTableSpaceDiscardeErr(err) || err == ErrExecuteTimeout { + pc.Close() + return nil, fmt.Errorf("exec health check query error:%s", err) + } + } + if err = pc.PingWithTimeout(GetConnTimeout); err != nil { + pc.Close() + return nil, fmt.Errorf("ping conn error:%s", err) + } + + cp.SetLastChecked() + return pc, nil } -// GetStatisticSlaveConn return a connection in statistic slave pool -func (s *Slice) GetStatisticSlaveConn() (PooledConnect, error) { - if len(s.StatisticSlave) == 0 { - return nil, errors.ErrNoDatabase +func allSlaveIsOffline(SlaveStatusMap *sync.Map) bool { + var result = true + SlaveStatusMap.Range(func(k, v interface{}) bool { + if v == StatusUp { + result = false + return false + } + return true + }) + + return result +} + +// GetSlaveConn get connection from salve +func (s *Slice) GetSlaveConn(slavesInfo *DBInfo, localSlaveReadPriority int) (PooledConnect, error) { + if len(slavesInfo.ConnPool) == 0 || allSlaveIsOffline(slavesInfo.StatusMap) { + return nil, errors.ErrNoSlaveDB } + var index int + partialFoundIndex, foundIndex := -1, -1 + // find the idx of the ConnPool that isn't mark as down + for size := len(slavesInfo.ConnPool); size > 0; size-- { + s.Lock() + var err error + index, err = slavesInfo.Balancer.next() + s.Unlock() + if err != nil { + return nil, err + } - s.Lock() - index, err := s.statisticSlaveBalancer.next() - s.Unlock() - if err != nil { - return nil, err + if status, err := slavesInfo.GetStatus(index); err != nil { + log.Debug("get slave status addr:%s,err:%s", slavesInfo.ConnPool[index].Addr(), err) + continue + } else if status == StatusDown { + log.Debug("get slave status err or down,addr:%s", slavesInfo.ConnPool[index].Addr()) + continue + } + + // partial found slave cause slave status StatusUP + partialFoundIndex = index + + // check localSlaveReadPriority and update foundIndex + if localSlaveReadPriority == LocalSlaveReadClosed { + foundIndex = partialFoundIndex + break + } + // check datacenter + if slavesInfo.ConnPool[index].Datacenter() == s.ProxyDatacenter { + foundIndex = index + break + } } - ctx := context.TODO() - return s.StatisticSlave[index].Get(ctx) + if foundIndex >= 0 { + return slavesInfo.ConnPool[foundIndex].Get(context.TODO()) + } + if partialFoundIndex >= 0 && localSlaveReadPriority != LocalSlaveReadForce { + return slavesInfo.ConnPool[partialFoundIndex].Get(context.TODO()) + } + return nil, fmt.Errorf("get backend conn error,no local datacenter slaves") } // Close close the pool in slice @@ -142,16 +372,18 @@ func (s *Slice) Close() error { s.Lock() defer s.Unlock() // close master - s.Master.Close() + for i := range s.Master.ConnPool { + s.Master.ConnPool[i].Close() + } // close slaves - for i := range s.Slave { - s.Slave[i].Close() + for i := range s.Slave.ConnPool { + s.Slave.ConnPool[i].Close() } // close statistic slaves - for i := range s.StatisticSlave { - s.StatisticSlave[i].Close() + for i := range s.StatisticSlave.ConnPool { + s.StatisticSlave.ConnPool[i].Close() } return nil @@ -166,32 +398,56 @@ func (s *Slice) ParseMaster(masterStr string) error { if err != nil { return err } - s.Master = NewConnectionPool(masterStr, s.Cfg.UserName, s.Cfg.Password, "", s.Cfg.Capacity, s.Cfg.MaxCapacity, idleTimeout, s.charset, s.collationID) - s.Master.Open() + dc, err := util.GetInstanceDatacenter(masterStr) + if err != nil { + log.Warn("get master(%s) datacenter err:%s,will use default proxy datacenter.", masterStr, err) + dc = s.ProxyDatacenter + } + connectionPool := NewConnectionPool(masterStr, s.Cfg.UserName, s.Cfg.Password, "", s.Cfg.Capacity, s.Cfg.MaxCapacity, idleTimeout, s.charset, s.collationID, s.Cfg.Capability, s.Cfg.InitConnect, dc) + if err := connectionPool.Open(); err != nil { + return err + } + + status := &sync.Map{} + status.Store(0, StatusUp) + + s.Master = &DBInfo{[]ConnectionPool{connectionPool}, nil, status, []string{dc}} return nil } // ParseSlave create connection pool of slaves // (127.0.0.1:3306@2,192.168.0.12:3306@3) -func (s *Slice) ParseSlave(slaves []string) error { +func (s *Slice) ParseSlave(slaves []string) (*DBInfo, error) { if len(slaves) == 0 { - return nil + return &DBInfo{}, nil } var err error var weight int count := len(slaves) - s.Slave = make([]ConnectionPool, 0, count) + connPool := make([]ConnectionPool, 0, count) slaveWeights := make([]int, 0, count) + datacenter := make([]string, 0, count) //parse addr and weight for i := 0; i < count; i++ { + if slaves[i] == "" { + continue + } + // slave[i] 格式: c3-mysql-test00.bj:3306@10#bj + dc := "" + addrAndWeightDatacenter := strings.Split(slaves[i], datacenterSplit) + if len(addrAndWeightDatacenter) == 2 { + dc = addrAndWeightDatacenter[1] + slaves[i] = addrAndWeightDatacenter[0] + } + addrAndWeight := strings.Split(slaves[i], weightSplit) if len(addrAndWeight) == 2 { weight, err = strconv.Atoi(addrAndWeight[1]) if err != nil { - return err + return nil, err } } else { weight = 1 @@ -199,52 +455,35 @@ func (s *Slice) ParseSlave(slaves []string) error { slaveWeights = append(slaveWeights, weight) idleTimeout, err := util.Int2TimeDuration(s.Cfg.IdleTimeout) if err != nil { - return err + return nil, err } - cp := NewConnectionPool(addrAndWeight[0], s.Cfg.UserName, s.Cfg.Password, "", s.Cfg.Capacity, s.Cfg.MaxCapacity, idleTimeout, s.charset, s.collationID) - cp.Open() - s.Slave = append(s.Slave, cp) - } - s.slaveBalancer = newBalancer(slaveWeights, len(s.Slave)) - return nil -} - -// ParseStatisticSlave create connection pool of statistic slaves -// slaveStr(127.0.0.1:3306@2,192.168.0.12:3306@3) -func (s *Slice) ParseStatisticSlave(statisticSlaves []string) error { - if len(statisticSlaves) == 0 { - return nil - } - - var err error - var weight int - - count := len(statisticSlaves) - s.StatisticSlave = make([]ConnectionPool, 0, count) - statisticSlaveWeights := make([]int, 0, count) - - //parse addr and weight - for i := 0; i < count; i++ { - addrAndWeight := strings.Split(statisticSlaves[i], weightSplit) - if len(addrAndWeight) == 2 { - weight, err = strconv.Atoi(addrAndWeight[1]) + // if dc not config, get hostname prefix and suffix + if dc == "" { + dc, err = util.GetInstanceDatacenter(addrAndWeight[0]) if err != nil { - return err + log.Warn("get master(%s) datacenter err:%s,will use default proxy datacenter.", addrAndWeight[0], err) + dc = s.ProxyDatacenter } - } else { - weight = 1 } - statisticSlaveWeights = append(statisticSlaveWeights, weight) - idleTimeout, err := util.Int2TimeDuration(s.Cfg.IdleTimeout) - if err != nil { - return err + datacenter = append(datacenter, dc) + + cp := NewConnectionPool(addrAndWeight[0], s.Cfg.UserName, s.Cfg.Password, "", s.Cfg.Capacity, s.Cfg.MaxCapacity, idleTimeout, s.charset, s.collationID, s.Cfg.Capability, s.Cfg.InitConnect, dc) + if err = cp.Open(); err != nil { + return nil, err } - cp := NewConnectionPool(addrAndWeight[0], s.Cfg.UserName, s.Cfg.Password, "", s.Cfg.Capacity, s.Cfg.MaxCapacity, idleTimeout, s.charset, s.collationID) - cp.Open() - s.StatisticSlave = append(s.StatisticSlave, cp) + connPool = append(connPool, cp) } - s.statisticSlaveBalancer = newBalancer(statisticSlaveWeights, len(s.StatisticSlave)) - return nil + + if len(slaveWeights) == 0 { + return &DBInfo{}, nil + } + slaveBalancer := newBalancer(slaveWeights, len(connPool)) + StatusMap := &sync.Map{} + for idx := range connPool { + StatusMap.Store(idx, StatusUp) + } + + return &DBInfo{connPool, slaveBalancer, StatusMap, datacenter}, nil } // SetCharsetInfo set charset @@ -252,3 +491,138 @@ func (s *Slice) SetCharsetInfo(charset string, collationID mysql.CollationID) { s.charset = charset s.collationID = collationID } + +type SlaveStatus struct { + SecondsBehindMaster uint64 + SlaveIORunning string + SlaveSQLRunning string + MasterLogFile string + ReadMasterLogPos uint64 + RelayMasterLogFile string + ExecMasterLogPos uint64 +} + +// checkSlaveSyncStatus check slave sync status, if slave is not sync, return false +func checkSlaveSyncStatus(pc PooledConnect, secondsBehindMaster int) (bool, error) { + defer func() { + if err := recover(); err != nil { + log.Fatal("check slave sync status panic:%s", err) + } + }() + + // if secondsBehindMaster is 0, we won't check slave sync status + if secondsBehindMaster == 0 { + return true, nil + } + + skipCheck, slaveStatus, err := GetSlaveStatus(pc) + if err != nil { + return false, fmt.Errorf("get slave status error:%s", err) + } + // if suspectedMaster is true, we think this is a master + if skipCheck { + return true, nil + } + + if slaveStatus.SecondsBehindMaster > uint64(secondsBehindMaster) { + return false, fmt.Errorf("SecondsBehindMaster(%d) larger than %d", slaveStatus.SecondsBehindMaster, secondsBehindMaster) + } + + if slaveStatus.SlaveIORunning != "Yes" { + return false, fmt.Errorf("io thread not running") + } + if slaveStatus.SlaveSQLRunning != "Yes" { + return false, fmt.Errorf("sql thread not running") + } + + return true, nil +} + +// GetSlaveStatus get slave status, will check bellow cases: +// 1. if we have no privileges to get slave status, will return skipCheck true. +// 2. if slave status result is nil,maybe it's master but configured as slave, will return skipCheck true. +// 3. return slave status result with skipCheck false. +func GetSlaveStatus(conn PooledConnect) (bool, SlaveStatus, error) { + var slaveStatus SlaveStatus + res, err := conn.Execute("show slave status;", 0) + + // if exec error is syntax error or no privilege, will return skipCheck true. + if err != nil { + if mysql.IsSQLNoPrivilegeErr(err) { + log.Warn("addr:%s, get slave status error,maybe configured error.err:%s.", conn.GetAddr(), err) + return true, slaveStatus, nil + } + return false, slaveStatus, fmt.Errorf("execute show slave status error:%s", err) + } + + // if we have no privileges to get slave status, will return skipCheck true. + if res.RowNumber() == 0 { + log.Debug("addr:%s, slave status is empty,maybe is master\n", conn.GetAddr()) + return true, slaveStatus, nil + } + + for _, f := range res.Fields { + fieldName := string(f.Name) + var col interface{} + col, err = res.GetValueByName(0, fieldName) + if err != nil { + _ = log.Warn("get field name Get '%s' failed in SlaveStatus, err: %v", fieldName, err) + break + } + + switch strings.ToLower(fieldName) { + case "seconds_behind_master": + switch col.(type) { + case uint64: + slaveStatus.SecondsBehindMaster = col.(uint64) + default: + slaveStatus.SecondsBehindMaster = 0 + } + case "slave_io_running": + switch col.(type) { + case string: + slaveStatus.SlaveIORunning = col.(string) + default: + slaveStatus.SlaveIORunning = "No" + } + case "slave_sql_running": + switch col.(type) { + case string: + slaveStatus.SlaveSQLRunning = col.(string) + default: + slaveStatus.SlaveSQLRunning = "No" + } + case "master_log_file": + switch col.(type) { + case string: + slaveStatus.MasterLogFile = col.(string) + default: + slaveStatus.MasterLogFile = "" + } + case "read_master_log_pos": + switch col.(type) { + case uint64: + slaveStatus.ReadMasterLogPos = col.(uint64) + default: + slaveStatus.ReadMasterLogPos = 0 + } + case "relay_master_log_file": + switch col.(type) { + case string: + slaveStatus.RelayMasterLogFile = col.(string) + default: + slaveStatus.RelayMasterLogFile = "" + } + case "exec_master_log_pos": + switch col.(type) { + case uint64: + slaveStatus.ExecMasterLogPos = col.(uint64) + default: + slaveStatus.ExecMasterLogPos = 0 + } + default: + continue + } + } + return false, slaveStatus, err +} diff --git a/backend/slice_test.go b/backend/slice_test.go new file mode 100644 index 00000000..cbffb8cf --- /dev/null +++ b/backend/slice_test.go @@ -0,0 +1,312 @@ +// Copyright 2024 The Gaea Authors. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package backend + +import ( + "context" + "fmt" + "sync" + "testing" + + "github.com/XiaoMi/Gaea/mysql" + "github.com/XiaoMi/Gaea/util" + "github.com/golang/mock/gomock" + "github.com/stretchr/testify/assert" +) + +func TestParseSlave(t *testing.T) { + testCases := []struct { + name string + slaveAdders []string + slaveStatus []StatusCode + expectAddrs []string + expectDatacenters []string + }{ + { + name: "test simple", + slaveAdders: []string{"c3-mysql-test00.bj:3306", "c3-mysql-test01.bj:3308", "c4-mysql-test02.bj:3310"}, + expectAddrs: []string{"c3-mysql-test00.bj:3306", "c3-mysql-test01.bj:3308", "c4-mysql-test02.bj:3310"}, + expectDatacenters: []string{"c3", "c3", "c4"}, + }, + { + name: "test simple 2", + slaveAdders: []string{"c3-mysql-test00:3306", "c3-mysql-t:3308", "c4-my:3310"}, + expectAddrs: []string{"c3-mysql-test00:3306", "c3-mysql-t:3308", "c4-my:3310"}, + expectDatacenters: []string{"c3", "c3", "c4"}, + }, + { + name: "test with weight", + slaveAdders: []string{"c3-mysql-test00.bj:3306@10", "c3-mysql-test01.bj:3308@5", "c4-mysql-test02.bj:3310"}, + expectAddrs: []string{"c3-mysql-test00.bj:3306", "c3-mysql-test01.bj:3308", "c4-mysql-test02.bj:3310"}, + expectDatacenters: []string{"c3", "c3", "c4"}, + }, + { + name: "test with weight and datacenter", + slaveAdders: []string{"c3-mysql-test00.bj:3306@10#bj", "c3-mysql-test01.bj:3308@5#sgp", "c4-mysql-test02.bj:3310@3#c4"}, + expectAddrs: []string{"c3-mysql-test00.bj:3306", "c3-mysql-test01.bj:3308", "c4-mysql-test02.bj:3310"}, + expectDatacenters: []string{"bj", "sgp", "c4"}, + }, + { + name: "test with datacenter", + slaveAdders: []string{"c3-mysql-test00.bj:3306#bj", "c3-mysql-test01.bj:3308#sgp", "c4-mysql-test02.bj:3310#c4"}, + expectAddrs: []string{"c3-mysql-test00.bj:3306", "c3-mysql-test01.bj:3308", "c4-mysql-test02.bj:3310"}, + expectDatacenters: []string{"bj", "sgp", "c4"}, + }, + } + + mockCtl := gomock.NewController(t) + defer mockCtl.Finish() + for _, tt := range testCases { + t.Run(tt.name, func(t *testing.T) { + s := new(Slice) + dbInfo, _ := s.ParseSlave(tt.slaveAdders) + for i, _ := range tt.expectAddrs { + assert.Equal(t, tt.expectAddrs[i], dbInfo.ConnPool[i].Addr()) + assert.Equal(t, tt.expectDatacenters[i], dbInfo.Datacenter[i]) + } + }) + } +} + +func TestGetSlaveConn(t *testing.T) { + testCases := []struct { + name string + localSlaveReadPriority int + proxyDc string + slaveAdders []string + slaveStatus []StatusCode + getCounts int + expectAddrs []string + }{ + { + name: "test LocalSlaveReadClosed all up", + proxyDc: "c3", + localSlaveReadPriority: LocalSlaveReadClosed, + getCounts: 8, + slaveAdders: []string{"c3-mysql-test00.bj:3306", "c3-mysql-test01.bj:3308", "c4-mysql-test02.bj:3310"}, + slaveStatus: []StatusCode{StatusUp, StatusUp, StatusUp}, + expectAddrs: []string{"c3-mysql-test00.bj:3306", "c3-mysql-test01.bj:3308", "c4-mysql-test02.bj:3310", + "c3-mysql-test00.bj:3306", "c3-mysql-test01.bj:3308", "c4-mysql-test02.bj:3310", + "c3-mysql-test00.bj:3306", "c3-mysql-test01.bj:3308"}, + }, + { + name: "test LocalSlaveReadClosed no local slave", + proxyDc: "c5", + localSlaveReadPriority: LocalSlaveReadClosed, + getCounts: 8, + slaveAdders: []string{"c3-mysql-test00.bj:3306", "c3-mysql-test01.bj:3308", "c4-mysql-test02.bj:3310"}, + slaveStatus: []StatusCode{StatusUp, StatusUp, StatusUp}, + expectAddrs: []string{"c3-mysql-test00.bj:3306", "c3-mysql-test01.bj:3308", "c4-mysql-test02.bj:3310", + "c3-mysql-test00.bj:3306", "c3-mysql-test01.bj:3308", "c4-mysql-test02.bj:3310", + "c3-mysql-test00.bj:3306", "c3-mysql-test01.bj:3308"}, + }, + { + name: "test LocalSlaveReadPreferred all up", + proxyDc: "c3", + localSlaveReadPriority: LocalSlaveReadPreferred, + getCounts: 4, + slaveAdders: []string{"c3-mysql-test00.bj:3306", "c3-mysql-test01.bj:3308", "c4-mysql-test02.bj:3310"}, + slaveStatus: []StatusCode{StatusUp, StatusUp, StatusUp}, + expectAddrs: []string{"c3-mysql-test00.bj:3306", "c3-mysql-test01.bj:3308", "c3-mysql-test00.bj:3306", "c3-mysql-test01.bj:3308"}, + }, + { + name: "test LocalSlaveReadPreferred local one down", + proxyDc: "c3", + localSlaveReadPriority: LocalSlaveReadPreferred, + getCounts: 4, + slaveAdders: []string{"c3-mysql-test00.bj:3306", "c3-mysql-test01.bj:3308", "c4-mysql-test02.bj:3310"}, + slaveStatus: []StatusCode{StatusDown, StatusUp, StatusUp}, + expectAddrs: []string{"c3-mysql-test01.bj:3308", "c3-mysql-test01.bj:3308", "c3-mysql-test01.bj:3308", "c3-mysql-test01.bj:3308"}, + }, + { + name: "test LocalSlaveReadPreferred local all down", + proxyDc: "c3", + localSlaveReadPriority: LocalSlaveReadPreferred, + getCounts: 4, + slaveAdders: []string{"c3-mysql-test00.bj:3306", "c3-mysql-test01.bj:3308", "c4-mysql-test02.bj:3310"}, + slaveStatus: []StatusCode{StatusDown, StatusDown, StatusUp}, + expectAddrs: []string{"c4-mysql-test02.bj:3310", "c4-mysql-test02.bj:3310", "c4-mysql-test02.bj:3310", "c4-mysql-test02.bj:3310"}, + }, + { + name: "test LocalSlaveReadPreferred local all down 2 use last another slave", + proxyDc: "c4-bj", + localSlaveReadPriority: LocalSlaveReadPreferred, + getCounts: 4, + slaveAdders: []string{"c3-mysql-test00.bj:3306", "c3-mysql-test01.bj:3308", "c4-mysql-test02.bj:3310"}, + slaveStatus: []StatusCode{StatusUp, StatusUp, StatusDown}, + expectAddrs: []string{"c3-mysql-test01.bj:3308", "c3-mysql-test01.bj:3308", "c3-mysql-test01.bj:3308", "c3-mysql-test01.bj:3308"}, + }, + { + name: "test LocalSlaveReadPreferred no local slave use last another slave", + proxyDc: "c5", + localSlaveReadPriority: LocalSlaveReadPreferred, + getCounts: 4, + slaveAdders: []string{"c3-mysql-test00.bj:3306", "c3-mysql-test01.bj:3308", "c4-mysql-test02.bj:3310"}, + slaveStatus: []StatusCode{StatusUp, StatusUp, StatusUp}, + expectAddrs: []string{"c4-mysql-test02.bj:3310", "c4-mysql-test02.bj:3310", "c4-mysql-test02.bj:3310", "c4-mysql-test02.bj:3310"}, + }, + { + name: "test LocalSlaveReadForce all up", + proxyDc: "c3", + localSlaveReadPriority: LocalSlaveReadForce, + getCounts: 4, + slaveAdders: []string{"c3-mysql-test00.bj:3306", "c3-mysql-test01.bj:3308", "c4-mysql-test02.bj:3310"}, + slaveStatus: []StatusCode{StatusUp, StatusUp, StatusUp}, + expectAddrs: []string{"c3-mysql-test00.bj:3306", "c3-mysql-test01.bj:3308", "c3-mysql-test00.bj:3306", "c3-mysql-test01.bj:3308"}, + }, + { + name: "test LocalSlaveReadForce local all down", + proxyDc: "c4", + localSlaveReadPriority: LocalSlaveReadForce, + getCounts: 4, + slaveAdders: []string{"c3-mysql-test00.bj:3306", "c3-mysql-test01.bj:3308", "c4-mysql-test02.bj:3310"}, + slaveStatus: []StatusCode{StatusUp, StatusUp, StatusDown}, + expectAddrs: []string{}, + }, + { + name: "test LocalSlaveReadForce all down", + proxyDc: "c4", + localSlaveReadPriority: LocalSlaveReadForce, + getCounts: 4, + slaveAdders: []string{"c3-mysql-test00.bj:3306", "c3-mysql-test01.bj:3308", "c4-mysql-test02.bj:3310"}, + slaveStatus: []StatusCode{StatusDown, StatusDown, StatusDown}, + expectAddrs: []string{}, + }, + { + name: "test LocalSlaveReadForce no local slave", + proxyDc: "c5", + getCounts: 10, + localSlaveReadPriority: LocalSlaveReadForce, + slaveAdders: []string{"c3-mysql-test00.bj:3306", "c3-mysql-test01.bj:3308", "c4-mysql-test02.bj:3310"}, + slaveStatus: []StatusCode{StatusUp, StatusUp, StatusUp}, + expectAddrs: []string{}, + }, + } + mockCtl := gomock.NewController(t) + defer mockCtl.Finish() + for _, tt := range testCases { + t.Run(tt.name, func(t *testing.T) { + dbInfo := generateDBInfo(mockCtl, tt.slaveAdders, tt.slaveStatus) + s := &Slice{Slave: dbInfo} + s.ProxyDatacenter = tt.proxyDc + for j := 0; j < tt.getCounts; j++ { + cp, err := s.GetSlaveConn(dbInfo, tt.localSlaveReadPriority) + + if len(tt.expectAddrs) == 0 { + assert.NotNil(t, err) + continue + } + assert.Nil(t, err) + assert.Equal(t, tt.expectAddrs[j], cp.GetAddr(), fmt.Sprintf(tt.name)) + } + }) + } +} + +func generateDBInfo(mockCtl *gomock.Controller, slaveHosts []string, slaveStatus []StatusCode) *DBInfo { + connPool := make([]ConnectionPool, 0, len(slaveHosts)) + slaveWeights := make([]int, 0, len(slaveHosts)) + datacenter := make([]string, 0, len(slaveHosts)) + StatusMap := &sync.Map{} + for i, host := range slaveHosts { + dc, _ := util.GetInstanceDatacenter(host) + pc := NewMockPooledConnect(mockCtl) + pc.EXPECT().GetAddr().Return(host).AnyTimes() + + mcp := NewMockConnectionPool(mockCtl) + mcp.EXPECT().Datacenter().Return(dc).AnyTimes() + mcp.EXPECT().Get(context.TODO()).Return(pc, nil).AnyTimes() + mcp.EXPECT().Addr().Return(host).AnyTimes() + + connPool = append(connPool, mcp) + datacenter = append(datacenter, dc) + slaveWeights = append(slaveWeights, 1) + StatusMap.Store(i, slaveStatus[i]) + } + slaveBalancer := newBalancer(slaveWeights, len(connPool)) + + return &DBInfo{connPool, slaveBalancer, StatusMap, datacenter} +} + +func TestCheckSlaveSyncStatus(t *testing.T) { + testCases := []struct { + name string + c SlaveStatus + secondsBehindMaster int + statusAlive bool + }{ + { + "test SecondsBehindMaster more than ns config", + SlaveStatus{SecondsBehindMaster: 1000, SlaveIORunning: "Yes", SlaveSQLRunning: "Yes"}, + 20, + false, + }, + { + "test SecondsBehindMaster less than ns config", + SlaveStatus{SecondsBehindMaster: 1000, SlaveIORunning: "Yes", SlaveSQLRunning: "Yes"}, + 2000, + true, + }, + { + "test SlaveIORunning not running", + SlaveStatus{SecondsBehindMaster: 1000, SlaveIORunning: "Connecting", SlaveSQLRunning: "Yes"}, + 2000, + false, + }, + { + "test SlaveSQLRunning not running", + SlaveStatus{SecondsBehindMaster: 1000, SlaveIORunning: "Yes", SlaveSQLRunning: "Connecting"}, + 2000, + false, + }, + } + mockCtl := gomock.NewController(t) + defer mockCtl.Finish() + for _, ca := range testCases { + t.Run(ca.name, func(t *testing.T) { + slice0SlaveConn := NewMockPooledConnect(mockCtl) + slice0SlaveConn.EXPECT().GetAddr().Return("127.0.0.1:13307").AnyTimes() + slice0SlaveConn.EXPECT().Execute("show slave status;", 0).Return(&mysql.Result{ + Status: 2, + Resultset: &mysql.Resultset{ + Fields: []*mysql.Field{ + {Name: []byte("Seconds_Behind_Master")}, + {Name: []byte("Slave_IO_Running")}, + {Name: []byte("Slave_SQL_Running")}, + {Name: []byte("Master_Log_File")}, + {Name: []byte("Read_Master_Log_Pos")}, + {Name: []byte("Relay_Master_Log_File")}, + {Name: []byte("Exec_Master_Log_Pos")}, + }, + FieldNames: map[string]int{ + "Seconds_Behind_Master": 0, + "Slave_IO_Running": 1, + "Slave_SQL_Running": 2, + "Master_Log_File": 3, + "Read_Master_Log_Pos": 4, + "Relay_Master_Log_File": 5, + "Exec_Master_Log_Pos": 6, + }, + Values: [][]interface{}{ + {ca.c.SecondsBehindMaster, ca.c.SlaveIORunning, ca.c.SlaveSQLRunning, ca.c.MasterLogFile, ca.c.ReadMasterLogPos, ca.c.RelayMasterLogFile, ca.c.ExecMasterLogPos}, + }, + }, + }, nil) + + isBehind, _ := checkSlaveSyncStatus(slice0SlaveConn, ca.secondsBehindMaster) + assert.Equal(t, isBehind, ca.statusAlive) + }) + } +} diff --git a/cc/server.go b/cc/server.go index 96729747..fdcede95 100644 --- a/cc/server.go +++ b/cc/server.go @@ -204,6 +204,7 @@ func (s *Server) modifyNamespace(c *gin.Context) { err = c.BindJSON(&namespace) if err != nil { log.Warn("modifyNamespace failed, err: %v", err) + h.RetMessage = err.Error() c.JSON(http.StatusBadRequest, h) return } @@ -212,7 +213,7 @@ func (s *Server) modifyNamespace(c *gin.Context) { if err != nil { log.Warn("modifyNamespace failed, err: %v", err) h.RetMessage = err.Error() - c.JSON(http.StatusOK, h) + c.JSON(http.StatusBadRequest, h) return } diff --git a/cc/service/service.go b/cc/service/service.go index 2e63925b..c65ae0c1 100644 --- a/cc/service/service.go +++ b/cc/service/service.go @@ -21,6 +21,7 @@ import ( "github.com/XiaoMi/Gaea/cc/proxy" "github.com/XiaoMi/Gaea/log" "github.com/XiaoMi/Gaea/models" + etcdclient "github.com/XiaoMi/Gaea/models/etcd" ) const ( @@ -80,6 +81,15 @@ func ModifyNamespace(namespace *models.Namespace, cfg *models.CCConfig, cluster storeConn := models.NewStore(client) defer storeConn.Close() + if err = checkForDuplicateUsernameAndPassword(cfg.EncryptKey, storeConn, *namespace); err != nil { + return fmt.Errorf("duplicate username and password in another namespace: %v", err) + } + + existNamespace, err := storeConn.LoadNamespace(cfg.EncryptKey, namespace.Name) + if err != nil && !etcdclient.IsErrNoNode(err) { + return err + } + if err := storeConn.UpdateNamespace(namespace); err != nil { log.Warn("update namespace failed, %s", string(namespace.Encode())) return err @@ -93,40 +103,63 @@ func ModifyNamespace(namespace *models.Namespace, cfg *models.CCConfig, cluster } wg := sync.WaitGroup{} + prepareErrs := make(chan error, len(proxies)) + commitErrs := make(chan error, len(proxies)) // prepare phase for _, v := range proxies { wg.Add(1) go func(v *models.ProxyMonitorMetric) { + defer wg.Done() + var err error for i := 0; i < PREPARE_RETRY_TIMES; i++ { if err = proxy.PrepareConfig(v.IP+":"+v.AdminPort, namespace.Name, cfg); err == nil { break } log.Warn("namespace %s, proxy prepare retry %d", namespace.Name, i) } - if err != nil { - return - } - wg.Done() + prepareErrs <- err }(v) } wg.Wait() + close(prepareErrs) + + // check prepare res and rollback + for err := range prepareErrs { + if err != nil { + if err2 := rollbackNamespace(existNamespace, namespace, cfg, storeConn); err2 != nil { + return fmt.Errorf("prepareConfig error:%s, rollback error:%s", err, err2) + } + return fmt.Errorf("prepareConfig error:%s, rollback success", err) + } + } // commit phase for _, v := range proxies { wg.Add(1) go func(v *models.ProxyMonitorMetric) { + defer wg.Done() + var err error for i := 0; i < COMMIT_RETRY_TIMES; i++ { - if err := proxy.CommitConfig(v.IP+":"+v.AdminPort, namespace.Name, cfg); err == nil { + if err = proxy.CommitConfig(v.IP+":"+v.AdminPort, namespace.Name, cfg); err == nil { break } log.Warn("namespace %s, proxy prepare retry %d", namespace.Name, i) } - if err != nil { - return - } - wg.Done() + commitErrs <- err }(v) } + wg.Wait() + close(commitErrs) + + // check commit res and rollback + for err := range commitErrs { + if err != nil { + if err2 := rollbackNamespace(existNamespace, namespace, cfg, storeConn); err2 != nil { + return fmt.Errorf("commitConfig error:%s, rollback error:%s", err, err2) + } + return fmt.Errorf("commitConfig error:%s, rollback success", err) + } + } return nil } @@ -159,6 +192,33 @@ func DelNamespace(name string, cfg *models.CCConfig, cluster string) error { return nil } +func rollbackNamespace(existNamespace *models.Namespace, newNamespace *models.Namespace, cfg *models.CCConfig, storeConn *models.Store) (err error) { + if existNamespace == nil { + if err := storeConn.DelNamespace(newNamespace.Name); err != nil { + log.Notice("rollback delete new namespace: %s failed, err: %s", newNamespace.Name, err) + return fmt.Errorf("rollback delete new namespace: %s failed, err: %s", newNamespace.Name, err) + } + log.Warn("rollback delete new namespace: %s success", newNamespace.Name) + return nil + } + + if err = existNamespace.Verify(); err != nil { + return fmt.Errorf("verify existNamespace error: %v", err) + } + + // create/modify will save encrypted data default + if err = existNamespace.Encrypt(cfg.EncryptKey); err != nil { + return fmt.Errorf("encrypt existNamespace error: %v", err) + } + + if err = storeConn.UpdateNamespace(existNamespace); err != nil { + _ = log.Notice("rollback existNamespace failed, %s.err:%s", existNamespace.Name, err) + return fmt.Errorf("rollback existNamespace error:%s", err) + } + _ = log.Warn("rollback existNamespace success, %s.", existNamespace.Name) + return nil +} + // SQLFingerprint return sql fingerprints of all proxy func SQLFingerprint(name string, cfg *models.CCConfig, cluster string) (slowSQLs, errSQLs map[string]string, err error) { slowSQLs = make(map[string]string, 16) @@ -245,3 +305,37 @@ func ProxyConfigFingerprint(cfg *models.CCConfig, cluster string) (r map[string] } return } + +// checkForDuplicateUsernameAndPassword checks if the given newNamespace has any user +// whose username and password combination already exists in any of the namespaces +// stored in the provided storeConn. This function is used to prevent duplicate usernames +// and passwords across different namespaces. +// The function iterates over all namespaces retrieved from the store. If a namespace's data +// is not already encrypted, it encrypts it using the provided encryptKey. It then adds each +// username and password combination from all namespaces to a map to check for duplicates. +func checkForDuplicateUsernameAndPassword(encryptKey string, storeConn *models.Store, newNamespace models.Namespace) error { + allNamespaces, err := storeConn.ListNamespaces() + if err != nil { + return fmt.Errorf("list Namespaces Error:%v", err) + } + existingUsers := make(map[string]string) + for _, ns := range allNamespaces { + if !ns.IsEncrypt { + if err := ns.Encrypt(encryptKey); err != nil { + return fmt.Errorf("encrypt Namespace Error:%v", err) + } + } + for _, user := range ns.Users { + key := user.UserName + "|" + user.Password + existingUsers[key] = ns.Name + } + } + + for _, user := range newNamespace.Users { + key := user.UserName + "|" + user.Password + if nsName, exists := existingUsers[key]; exists && nsName != newNamespace.Name { + return fmt.Errorf("a user with the same username and password already exists in namespace '%s'", nsName) + } + } + return nil +} diff --git a/cmd/gaea-cc/main.go b/cmd/gaea-cc/main.go index 1965f369..9e19ac42 100644 --- a/cmd/gaea-cc/main.go +++ b/cmd/gaea-cc/main.go @@ -19,6 +19,7 @@ import ( "fmt" "os" "os/signal" + "strconv" "sync" "syscall" @@ -40,6 +41,15 @@ func initXLog(ccConfig *models.CCConfig) error { cfg["level"] = ccConfig.LogLevel cfg["service"] = "gaea-cc" cfg["skip"] = "5" + cfg["log_keep_days"] = strconv.Itoa(log.DefaultLogKeepDays) + if ccConfig.LogKeepDays != 0 { + cfg["log_keep_days"] = strconv.Itoa(ccConfig.LogKeepDays) + } + + cfg["log_keep_counts"] = strconv.Itoa(log.DefaultLogKeepCounts) + if ccConfig.LogKeepCounts != 0 { + cfg["log_keep_counts"] = strconv.Itoa(ccConfig.LogKeepCounts) + } logger, err := xlog.CreateLogManager(ccConfig.LogOutput, cfg) if err != nil { diff --git a/cmd/gaea/main.go b/cmd/gaea/main.go index cfbaae8e..d3b06368 100644 --- a/cmd/gaea/main.go +++ b/cmd/gaea/main.go @@ -19,18 +19,23 @@ import ( "fmt" "os" "os/signal" + "runtime" "sync" "syscall" "github.com/XiaoMi/Gaea/core" "github.com/XiaoMi/Gaea/log" - "github.com/XiaoMi/Gaea/log/xlog" "github.com/XiaoMi/Gaea/models" "github.com/XiaoMi/Gaea/proxy/server" ) var configFile = flag.String("config", "etc/gaea.ini", "gaea config file") var info = flag.Bool("info", false, "show info of gaea") +var numCPU = flag.Int("num-cpu", 0, "how many operating systems threads attempt to execute simultaneously") + +const ( + defaultCPUNum = 4 //best practise +) func main() { flag.Parse() @@ -48,7 +53,22 @@ func main() { return } - if err = initXLog(cfg.LogOutput, cfg.LogPath, cfg.LogFileName, cfg.LogLevel, cfg.Service); err != nil { + var cpuNums int + if *numCPU > 0 && *numCPU <= runtime.NumCPU() { + // best practice -num-cpu=4 + fmt.Printf("max use cpu : %d(from command-line)", *numCPU) + cpuNums = *numCPU + } else if cfg.NumCPU > 0 && *numCPU <= runtime.NumCPU() { + fmt.Printf("max use cpu : %d(from cfg)", cfg.NumCPU) + cpuNums = cfg.NumCPU + } else { + fmt.Printf("max use cpu : %d(default)", defaultCPUNum) + cpuNums = defaultCPUNum + } + runtime.GOMAXPROCS(cpuNums) + cfg.NumCPU = cpuNums + + if err = models.InitXLog(cfg.LogOutput, cfg.LogPath, cfg.LogFileName, cfg.LogLevel, cfg.Service, cfg.LogKeepDays, cfg.LogKeepCounts); err != nil { fmt.Printf("init xlog error: %v\n", err.Error()) return } @@ -58,6 +78,7 @@ func main() { mgr, err := server.LoadAndCreateManager(cfg) if err != nil { log.Fatal("init manager failed, error: %v", err) + fmt.Printf("init manager failed, error: %v\n", err) return } @@ -83,33 +104,21 @@ func main() { for { sig := <-sc if sig == syscall.SIGINT || sig == syscall.SIGTERM || sig == syscall.SIGQUIT { - log.Notice("Got signal %d, quit", sig) + log.Notice("got signal %d, quit", sig) svr.Close() break } else if sig == syscall.SIGPIPE { - log.Notice("Ignore broken pipe signal") + log.Notice("ignore broken pipe signal") } else if sig == syscall.SIGUSR1 { - log.Notice("Got update config signal") + log.Notice("reload proxy config,out old config:%#v", cfg) + if err := svr.ReloadProxyConfig(); err != nil { + log.Notice("reload proxy confi error:%s", err) + } else { + log.Notice("reload proxy config success") + } } } }() svr.Run() wg.Wait() } - -func initXLog(output, path, filename, level, service string) error { - cfg := make(map[string]string) - cfg["path"] = path - cfg["filename"] = filename - cfg["level"] = level - cfg["service"] = service - cfg["skip"] = "5" // 设置xlog打印方法堆栈需要跳过的层数, 5目前为调用log.Debug()等方法的方法名, 比xlog默认值多一层. - - logger, err := xlog.CreateLogManager(output, cfg) - if err != nil { - return err - } - - log.SetGlobalLogger(logger) - return nil -} diff --git a/cmd/gaea/main_test.go b/cmd/gaea/main_test.go deleted file mode 100644 index 41366ad4..00000000 --- a/cmd/gaea/main_test.go +++ /dev/null @@ -1,22 +0,0 @@ -// Copyright 2019 The Gaea Authors. All Rights Reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -package main - -import ( - "testing" -) - -func Test_Main(t *testing.T) { - main() -} diff --git a/core/errors/errors.go b/core/errors/errors.go index 0cf93794..a0b64bd0 100644 --- a/core/errors/errors.go +++ b/core/errors/errors.go @@ -28,7 +28,7 @@ var ( // ErrNoMasterDB no master database ErrNoMasterDB = errors.New("no master database") // ErrNoSlaveDB no slve database - ErrNoSlaveDB = errors.New("no slave database") + ErrNoSlaveDB = errors.New("no slave databases or all slave databases are offline") // ErrNoDatabase no database ErrNoDatabase = errors.New("no database") @@ -99,4 +99,5 @@ var ( ErrTimeLimitExceeded = errors.New("sql execute time exceeded") ErrRowsLimitExceeded = errors.New("sql result set size exceeded") + ErrInvalidPacket = errors.New("invalid packet format") ) diff --git a/docs/assets/1-4-1-read-only-CPU.jpg b/docs/assets/1-4-1-read-only-CPU.jpg new file mode 100644 index 00000000..2a1425ef Binary files /dev/null and b/docs/assets/1-4-1-read-only-CPU.jpg differ diff --git a/docs/assets/1-4-1-read-only-P99.jpg b/docs/assets/1-4-1-read-only-P99.jpg new file mode 100644 index 00000000..e79c2e41 Binary files /dev/null and b/docs/assets/1-4-1-read-only-P99.jpg differ diff --git a/docs/assets/1-4-1-read-only-QPS.jpg b/docs/assets/1-4-1-read-only-QPS.jpg new file mode 100644 index 00000000..59f67558 Binary files /dev/null and b/docs/assets/1-4-1-read-only-QPS.jpg differ diff --git a/docs/assets/1-4-1-read-only-TPS.jpg b/docs/assets/1-4-1-read-only-TPS.jpg new file mode 100644 index 00000000..4825c0a6 Binary files /dev/null and b/docs/assets/1-4-1-read-only-TPS.jpg differ diff --git a/docs/assets/1-4-2-read-write-CPU.jpg b/docs/assets/1-4-2-read-write-CPU.jpg new file mode 100644 index 00000000..5f323802 Binary files /dev/null and b/docs/assets/1-4-2-read-write-CPU.jpg differ diff --git a/docs/assets/1-4-2-read-write-P99.jpg b/docs/assets/1-4-2-read-write-P99.jpg new file mode 100644 index 00000000..c9640ec2 Binary files /dev/null and b/docs/assets/1-4-2-read-write-P99.jpg differ diff --git a/docs/assets/1-4-2-read-write-QPS.jpg b/docs/assets/1-4-2-read-write-QPS.jpg new file mode 100644 index 00000000..8f61b6da Binary files /dev/null and b/docs/assets/1-4-2-read-write-QPS.jpg differ diff --git a/docs/assets/1-4-2-read-write-TPS.jpg b/docs/assets/1-4-2-read-write-TPS.jpg new file mode 100644 index 00000000..ff25ac90 Binary files /dev/null and b/docs/assets/1-4-2-read-write-TPS.jpg differ diff --git a/docs/assets/1-4-3-write-only-CPU.jpg b/docs/assets/1-4-3-write-only-CPU.jpg new file mode 100644 index 00000000..39e2f00c Binary files /dev/null and b/docs/assets/1-4-3-write-only-CPU.jpg differ diff --git a/docs/assets/1-4-3-write-only-P99.jpg b/docs/assets/1-4-3-write-only-P99.jpg new file mode 100644 index 00000000..5ee37c80 Binary files /dev/null and b/docs/assets/1-4-3-write-only-P99.jpg differ diff --git a/docs/assets/1-4-3-write-only-QPS.jpg b/docs/assets/1-4-3-write-only-QPS.jpg new file mode 100644 index 00000000..e8b42ba9 Binary files /dev/null and b/docs/assets/1-4-3-write-only-QPS.jpg differ diff --git a/docs/assets/1-4-3-write-only-TPS.jpg b/docs/assets/1-4-3-write-only-TPS.jpg new file mode 100644 index 00000000..7d295d65 Binary files /dev/null and b/docs/assets/1-4-3-write-only-TPS.jpg differ diff --git a/docs/assets/1-4-4-point-select-CPU.jpg b/docs/assets/1-4-4-point-select-CPU.jpg new file mode 100644 index 00000000..c171418d Binary files /dev/null and b/docs/assets/1-4-4-point-select-CPU.jpg differ diff --git a/docs/assets/1-4-4-point-select-P99.jpg b/docs/assets/1-4-4-point-select-P99.jpg new file mode 100644 index 00000000..6576e71b Binary files /dev/null and b/docs/assets/1-4-4-point-select-P99.jpg differ diff --git a/docs/assets/1-4-4-point-select-QPS.jpg b/docs/assets/1-4-4-point-select-QPS.jpg new file mode 100644 index 00000000..e0bdf8ff Binary files /dev/null and b/docs/assets/1-4-4-point-select-QPS.jpg differ diff --git a/docs/assets/1-4-4-point-select-TPS.jpg b/docs/assets/1-4-4-point-select-TPS.jpg new file mode 100644 index 00000000..4a523e3e Binary files /dev/null and b/docs/assets/1-4-4-point-select-TPS.jpg differ diff --git a/docs/assets/2-4-1-read-only-CPU.jpg b/docs/assets/2-4-1-read-only-CPU.jpg new file mode 100644 index 00000000..029c05f2 Binary files /dev/null and b/docs/assets/2-4-1-read-only-CPU.jpg differ diff --git a/docs/assets/2-4-1-read-only-P99.jpg b/docs/assets/2-4-1-read-only-P99.jpg new file mode 100644 index 00000000..4ac8fe68 Binary files /dev/null and b/docs/assets/2-4-1-read-only-P99.jpg differ diff --git a/docs/assets/2-4-1-read-only-QPS.jpg b/docs/assets/2-4-1-read-only-QPS.jpg new file mode 100644 index 00000000..f331db94 Binary files /dev/null and b/docs/assets/2-4-1-read-only-QPS.jpg differ diff --git a/docs/assets/2-4-1-read-only-TPS.jpg b/docs/assets/2-4-1-read-only-TPS.jpg new file mode 100644 index 00000000..e99969cc Binary files /dev/null and b/docs/assets/2-4-1-read-only-TPS.jpg differ diff --git a/docs/assets/2-4-2-read-write-CPU.jpg b/docs/assets/2-4-2-read-write-CPU.jpg new file mode 100644 index 00000000..eea89be2 Binary files /dev/null and b/docs/assets/2-4-2-read-write-CPU.jpg differ diff --git a/docs/assets/2-4-2-read-write-P99.jpg b/docs/assets/2-4-2-read-write-P99.jpg new file mode 100644 index 00000000..e59a18a5 Binary files /dev/null and b/docs/assets/2-4-2-read-write-P99.jpg differ diff --git a/docs/assets/2-4-2-read-write-QPS.jpg b/docs/assets/2-4-2-read-write-QPS.jpg new file mode 100644 index 00000000..afdfea8f Binary files /dev/null and b/docs/assets/2-4-2-read-write-QPS.jpg differ diff --git a/docs/assets/2-4-2-read-write-TPS.jpg b/docs/assets/2-4-2-read-write-TPS.jpg new file mode 100644 index 00000000..8dd2fcc2 Binary files /dev/null and b/docs/assets/2-4-2-read-write-TPS.jpg differ diff --git a/docs/assets/2-4-3-write-only-CPU.jpg b/docs/assets/2-4-3-write-only-CPU.jpg new file mode 100644 index 00000000..1fa57d9a Binary files /dev/null and b/docs/assets/2-4-3-write-only-CPU.jpg differ diff --git a/docs/assets/2-4-3-write-only-P99.jpg b/docs/assets/2-4-3-write-only-P99.jpg new file mode 100644 index 00000000..b656ef20 Binary files /dev/null and b/docs/assets/2-4-3-write-only-P99.jpg differ diff --git a/docs/assets/2-4-3-write-only-QPS.jpg b/docs/assets/2-4-3-write-only-QPS.jpg new file mode 100644 index 00000000..71dda680 Binary files /dev/null and b/docs/assets/2-4-3-write-only-QPS.jpg differ diff --git a/docs/assets/2-4-3-write-only-TPS.jpg b/docs/assets/2-4-3-write-only-TPS.jpg new file mode 100644 index 00000000..d0217cfc Binary files /dev/null and b/docs/assets/2-4-3-write-only-TPS.jpg differ diff --git a/docs/assets/2-4-4-point-select-CPU.jpg b/docs/assets/2-4-4-point-select-CPU.jpg new file mode 100644 index 00000000..922cc226 Binary files /dev/null and b/docs/assets/2-4-4-point-select-CPU.jpg differ diff --git a/docs/assets/2-4-4-point-select-P99.jpg b/docs/assets/2-4-4-point-select-P99.jpg new file mode 100644 index 00000000..f3f90235 Binary files /dev/null and b/docs/assets/2-4-4-point-select-P99.jpg differ diff --git a/docs/assets/2-4-4-point-select-QPS.jpg b/docs/assets/2-4-4-point-select-QPS.jpg new file mode 100644 index 00000000..d8ec09fe Binary files /dev/null and b/docs/assets/2-4-4-point-select-QPS.jpg differ diff --git a/docs/assets/2-4-4-point-select-TPS.jpg b/docs/assets/2-4-4-point-select-TPS.jpg new file mode 100644 index 00000000..c9093473 Binary files /dev/null and b/docs/assets/2-4-4-point-select-TPS.jpg differ diff --git a/docs/assets/feishu_talk.jpeg b/docs/assets/feishu_talk.jpeg new file mode 100644 index 00000000..12f604af Binary files /dev/null and b/docs/assets/feishu_talk.jpeg differ diff --git a/docs/assets/master-slave.jpg b/docs/assets/master-slave.jpg new file mode 100644 index 00000000..d0029943 Binary files /dev/null and b/docs/assets/master-slave.jpg differ diff --git a/docs/assets/master-slaves.jpg b/docs/assets/master-slaves.jpg new file mode 100644 index 00000000..324e61ea Binary files /dev/null and b/docs/assets/master-slaves.jpg differ diff --git a/docs/assets/singlemaster.jpg b/docs/assets/singlemaster.jpg new file mode 100644 index 00000000..0b63d4da Binary files /dev/null and b/docs/assets/singlemaster.jpg differ diff --git a/docs/config-reloading.md b/docs/config-reloading.md index 9852db77..3604135c 100644 --- a/docs/config-reloading.md +++ b/docs/config-reloading.md @@ -95,4 +95,4 @@ gaea的配置变更没有针对每个配置项分别进行接口封装,而是 ## 集群配置一致性校验 -通过两阶段提交配置后,当前所有gaea-proxy的生效配置是相同的。为了方便验证: 1.配置是否发生变化 2.是否所有gaea-proxy的最新配置已经生效,gaea-proxy提供了获取当前配置签名的接口。通过该接口,DBA可以直接通过管理平台查看到各个gaea-proxy前后及当前配置的md5签名,保证配置变更的执行效果符合预期。 \ No newline at end of file +通过两阶段提交配置后,当前所有gaea-proxy的生效配置是相同的。为了方便验证: 1.配置是否发生变化 2.是否所有gaea-proxy的最新配置已经生效,gaea-proxy提供了获取当前配置签名的接口。通过该接口,DBA可以直接通过管理平台查看到各个gaea-proxy前后及当前配置的md5签名,保证配置变更的执行效果符合预期。 diff --git a/docs/configuration.md b/docs/configuration.md index 5e53f34c..1fa5fd3e 100644 --- a/docs/configuration.md +++ b/docs/configuration.md @@ -30,6 +30,10 @@ log_path=./logs log_level=Notice log_filename=gaea log_output=file +; 日志保留天数,默认为3天(所有日志) +log_keep_days=3 +; 日志保留数量,默认为 72 个(所有归档的日志)),与 log_keep_days 取最小值 +log_keep_counts=72 ;管理地址 admin_addr=0.0.0.0:13307 @@ -58,47 +62,69 @@ encrypt_key=1234abcd5678efg* ;server_version 服务器版本号配置 server_version=5.6.20-gaea +;num_cpu gaea服务占用的CPU核数,默认4核 +num_cpu=4 + +;net_buffer_size 一次读取和写入数据的大小,默认 128 +net_buffer_size=128 + ;auth plugin mysql_native_password or caching_sha2_password or '' ;自定义认证插件,支持 5.x 和 8.x 版本认证,认证插件为 caching_sha2_password 时,不支持低版本客户端认证 ;auth_plugin=mysql_native_password + ``` ## namespace配置说明 namespace的配置格式为json,包含分表、非分表、实例等配置信息,都可在运行时改变。namespace的配置可以直接通过web平台进行操作,使用方不需要关心json里的内容,如果有兴趣参与到gaea的开发中,可以关注下字段含义,具体解释如下,格式为字段名称、类型、内容含义。 -| 字段名称 | 字段类型 | 字段含义 | -| --------------- | ---------- | ----------------------------------------------- | -| name | string | namespace名称 | -| online | bool | 是否在线,逻辑上下线使用 | -| read_only | bool | 是否只读,namespace级别 | -| allowed_dbs | map | 数据库集合 | -| default_phy_dbs | map | 默认数据库名, 与allowed_dbs一一对应 | -| slow_sql_time | string | 慢sql时间,单位ms | -| black_sql | string数组 | 黑名单sql | -| allowed_ip | string数组 | 白名单IP | -| slices | map数组 | 一主多从的物理实例,slice里map的具体字段可参照slice配置 | -| shard_rules | map数组 | 分库、分表、特殊表的配置内容,具体字段可参照shard配置 | -| users | map数组 | 应用端连接gaea所需要的用户配置,具体字段可参照users配置 | -| global_sequences| map | 生成全局唯一序列号的配置, 具体字段可参考全局序列号配置 | -| default_slice | string | show语句默认的执行分片 | -| open_general_log | bool | 是否开启审计日志, [如何开启](https://github.com/XiaoMi/Gaea/issues/109)| | -| max_sql_execute_time | int | 应用端查询最大执行时间, 超时后会被自动kill, 为0默认不开启此功能 | -| max_sql_result_size | int | gaea从后端mysql接收结果集的最大值, 限制单分片查询行数, 默认值10000, -1表示不开启| +| 字段名称 | 字段类型 | 字段含义 | +| ------------------------- | ---------- |------------------------------------------------------------------------------------------------------------------------------------------------------| +| name | string | namespace名称 | +| online | bool | 是否在线,逻辑上下线使用 | +| read_only | bool | 是否只读,namespace级别 | +| allowed_dbs | map | 数据库集合 | +| default_phy_dbs | map | 默认数据库名, 与allowed_dbs一一对应 | +| slow_sql_time | string | 慢sql时间,单位ms | +| black_sql | string数组 | 黑名单sql | +| allowed_ip | string数组 | 白名单IP | +| slices | map数组 | 一主多从的物理实例,slice里map的具体字段可参照slice配置 | +| shard_rules | map数组 | 分库、分表、特殊表的配置内容,具体字段可参照shard配置 | +| users | map数组 | 应用端连接gaea所需要的用户配置,具体字段可参照users配置 | +| global_sequences | map | 生成全局唯一序列号的配置, 具体字段可参考全局序列号配置 | +| default_slice | string | show语句默认的执行分片 | +| open_general_log | bool | (已废弃) 是否开启审计日志, [如何开启](https://github.com/XiaoMi/Gaea/issues/109) | +| max_sql_execute_time | int | 应用端查询最大执行时间, 超时后会被自动kill, 为0默认不开启此功能 | +| max_sql_result_size | int | gaea从后端mysql接收结果集的最大值, 限制单分片查询行数, 默认值10000, -1表示不开启 | +| down_after_no_alive | int | 探测MySQL服务offline超过该时间后标记mysql为下线 | +| seconds_behind_master | uint64 | MySQL slave延迟超过该值将slave标记为down, 默认值为0,即无限大 | +| check_select_lock | bool | 是否检查 `select ... for update` or `select ... in share mode` 语句,当设置为true时,会优先将语句发给主库(需要配置的权限支持)。 默认值为true, 则默认发到主库。 | +| local_slave_read_priority | int | 优先访问本机房从库配置,设置为 0 时,关闭该功能;设置为 1 时,优先访问本机房从库,当无本机房从库或本机房从库均宕机时,会跨机房访问从库;当设置为 2 时,会强制访问本机房从库,当本机房无从库时,会访问主库。默认值为 0,当无法获取实例的 datacenter 时,会默认与 Prox 相同 | +| support_multi_query | bool | 是否支持多语句,默认为 false,即不支持 | +| local_slave_read_priority | int | 优先访问本机房从库配置,设置为 0 时,关闭该功能;设置为 1 时,优先访问本机房从库,当无本机房从库或本机房从库均宕机时,会跨机房访问从库;当设置为 2 时,会强制访问本机房从库,当本机房无从库时,会访问主库。默认值为 0,当无法获取实例的 datacenter 时,会默认与 Proxy 相同 | +| support_multi_query | bool | 是否支持多语句,默认为 false,即不支持 | +| set_for_keep_session | bool | 是否开启业务连接会话保持功能,开启后 Gaea 客户端连接与后端 MySQL 连接一对一绑定。默认为 false,即不开启 | +| client_qps_limit | uint32 | 客户端 qps 限制,默认为 0,即不开启 | +| support_limit_transaction | bool | 客户端限流是否限制事务,默认为 false,即不限制 | +| allowed_session_variables | map | 动态配置数据库会话变量,通过配置该参数,从而实现业务侧对数据库会话变量的动态配置。 注意:该参数仅支持在 gaea 2.4.0 及以上版本使用。 | + ### slice配置 -| 字段名称 | 字段类型 | 字段含义 | -| ---------------- | ---------- | ---------------------------------------------- | -| name | string | 分片名称,自动、有序生成 | -| user_name | string | 连接后端mysql所需要的用户名称 | -| password | string | 连接后端mysql所需要的用户密码 | -| master | string | 主实例地址 | -| slaves | string数组 | 从实例地址列表 | -| statistic_slaves | string数组 | 统计型从实例地址列表 | -| capacity | int | gaea_proxy与每个实例的连接池大小 | -| max_capacity | int | gaea_proxy与每个实例的连接池最大大小 | -| idle_timeout | int | gaea_proxy与后端mysql空闲连接存活时间,单位:秒 | +| 字段名称 | 字段类型 | 字段含义 | +|------------------------|----------|--------------------------------------------------------------------------------------------------------------------------------------------| +| name | string | 分片名称,自动、有序生成 | +| user_name | string | 连接后端mysql所需要的用户名称 | +| password | string | 连接后端mysql所需要的用户密码 | +| master | string | 主实例地址 | +| slaves | string数组 | 从实例地址列表 | +| statistic_slaves | string数组 | 统计型从实例地址列表 | +| capacity | int | gaea_proxy与每个实例的连接池大小 | +| max_capacity | int | gaea_proxy与每个实例的连接池最大大小 | +| idle_timeout | int | gaea_proxy与后端mysql空闲连接存活时间,单位:秒 | +| capability | int | 自定义gaea_proxy与MySQL连接时capability, 注意: 除非你十分清楚这个值的意义,否则不要设置此值。 如果此值未设或者设置为0,gaea将使用默认值41477; 如果要支持multi query, 可将此值设置成500357, 更具体请参看MySQL文档 | +| max_client_connections | int | 该namespace最大的前端连接数,超过该值则拒绝连接。 0(默认值)或者小于0代表无限制 | +| init_connect | string | 自定义gaea_proxy与MySQL连接时初始执行的SQL,默认为空,执行的SQL以`;`分割,如设置sql_mode、session变量等。 注意: 除非你确认业务上确实有此依赖,且无法在业务侧调整,否则请不要设置此值。 | ### shard配置 @@ -106,36 +132,38 @@ namespace的配置格式为json,包含分表、非分表、实例等配置信 如需要了解每种规则详细库表对照示例,可以查看[分片规则示例说明](shard-example.md) -| 字段名称 | 字段类型 | 字段含义 | -| --------- | -------- | --------------------- | -| db | string | 分片表所在DB | -| table | string | 分片表名 | -| type | string | 分片类型 | -| key | string | 分片列名 | -| locations | list | 每个slice上分布的分片个数 | -| slices | list | slice列表 | -| databases | list | mycat分片规则后端实际DB名 | +| 字段名称 | 字段类型 | 字段含义 | +|-----------|--------|------------------| +| db | string | 分片表所在DB | +| table | string | 分片表名 | +| type | string | 分片类型 | +| key | string | 分片列名 | +| locations | list | 每个slice上分布的分片个数 | +| slices | list | slice列表 | +| databases | list | mycat分片规则后端实际DB名 | ### users配置 -| 字段名称 | 字段类型 | 字段含义 | -| -------------- | -------- | -------------------------------------- | -| user_name | string | 用户名 | -| password | string | 用户密码 | -| namespace | string | 对应的命名空间 | -| rw_flag | int | 读写标识, 只读=1, 读写=2 | -| rw_split | int | 是否读写分离, 非读写分离=0, 读写分离=1 | -| other_property | int | 目前用来标识是否走统计从实例, 普通用户=0, 统计用户=1 | +| 字段名称 | 字段类型 | 字段含义 | +|----------------|--------|--------------------------------| +| user_name | string | 用户名 | +| password | string | 用户密码 | +| namespace | string | 对应的命名空间 | +| rw_flag | int | 读写标识, 只读=1, 读写=2 | +| rw_split | int | 是否读写分离, 非读写分离=0, 读写分离=1 | +| other_property | int | 目前用来标识是否走统计从实例, 普通用户=0, 统计用户=1 | ### 全局序列号配置 -| 字段名称 | 字段类型 | 字段含义 | -| -------------- | -------- | -----------------------------------------------| -| db | string | 使用全局序列号的表所在的db的逻辑db名 | -| table | string | 使用全局序列号的表的逻辑表名 | -| type | string | 目前只支持mycat方式 | -| pk_name | string | 使用全局序列号的列名,单表只允许一个列使用全局序列号 | -| slice_name | string | mycat_sequence表所在分片 | +| 字段名称 | 字段类型 | 字段含义 | +|------------|--------|-----------------------------------------------------| +| db | string | 使用全局序列号的表所在的db的逻辑db名 | +| table | string | 使用全局序列号的表的逻辑表名 | +| type | string | 目前只支持mycat方式 | +| pk_name | string | 使用全局序列号的列名,单表只允许一个列使用全局序列号 | +| slice_name | string | mycat_sequence表所在分片,必须配置,不能留空 | +| max_limit | int64 | 在 namespace 层面限制当前表全局自增 ID 最大值,超过该值写入会失败,默认为 0 则无限制 | + ## 配置示例 @@ -152,12 +180,12 @@ namespace的配置格式为json,包含分表、非分表、实例等配置信 "default_phy_dbs": { "db_ks": "db_ks", "db_mycat": "db_mycat_0" - }, + }, "slow_sql_time": "1000", "black_sql": [ "" ], - "allowed_ip": null, + "allowed_ip": null, "slices": [ { "name": "slice-0", @@ -394,11 +422,19 @@ namespace的配置格式为json,包含分表、非分表、实例等配置信 "rw_flag": 2, "rw_split": 1 } - ], + ], "default_slice": "slice-0", "open_general_log": false, "max_sql_execute_time": 5000, - "max_sql_result_size": 10 + "max_sql_result_size": 10, + "down_after_no_alive": 32, + "seconds_behind_master": 0, + "check_select_lock": true, + "allowed_session_variables": { + "transaction_isolation": "string", + "max_execution_time": "int", + "unique_checks": "bool" + } } ``` diff --git a/docs/faq.md b/docs/faq.md index 32cce907..d6a37e47 100644 --- a/docs/faq.md +++ b/docs/faq.md @@ -1 +1,38 @@ -# FAQ \ No newline at end of file +# FAQ + +## 权限说明 + +部分语句默认的请求到后端从库或主库的情况: +- 普通 Select: + - 读写分离用户(RWFlag=2,RWSplit=1):从库 + - 只写用户(RWFlag=2,RWSplit=0):主库 + - 只读用户(RWFlag=1,RWSplit=1):从库 +- Select 带 Master Hint: + - 读写分离用户(RWFlag=2,RWSplit=1):主库 + - 只写用户(RWFlag=2,RWSplit=0):主库 + - 只读用户(RWFlag=1,RWSplit=1):从库(V2.0 以下版本会请求到主库,MiProxy 会打到从库) +- Select... For Update(lock in share mode):(同上) + - 读写分离用户(RWFlag=2,RWSplit=1):主库 + - 只写用户(RWFlag=2,RWSplit=0):主库 + - 只读用户(RWFlag=1,RWSplit=1):从库 +- Update/Insert/Delete: + - 读写分离用户(RWFlag=2,RWSplit=1):主库 + - 只写用户(RWFlag=2,RWSplit=0):主库 + - 只读用户(RWFlag=1,RWSplit=1):报错 +- 开启事务 + - 读写分离用户(RWFlag=2,RWSplit=1):主库(与旧版相同) + - 只写用户(RWFlag=2,RWSplit=0):主库(与旧版相同) + - 只读用户(RWFlag=1,RWSplit=1):主库(与旧版相同) + +- 当从库宕机时:会重新从主库获取连接,并请求到主库(无论权限如何) +- 当 Select 处于显式开启的事务中,也都会请求到主库(包括只读用户,此处与 MiProxy 不一致,MiProxy 只读用户开启事务也会请求到从库) + +## 配置热加载 +目前 Gaea namespace 配置支持热加载,Gaea 本身的配置文件只支持日志的热加载,执行热加载的方式为 +```bash +# 使用 signal 重新加载 +kill -SIGUSER1 ${gaea_pid} +# 使用 API 热加载 +curl -X PUT 'http://127.0.0.1:13307/api/proxy/proxyconfig/reload' \ +-H 'Authorization: Basic YWRtaW46YWRtaW4=' +``` diff --git a/docs/grafana.md b/docs/grafana.md index a835f3ec..98b2aeb8 100644 --- a/docs/grafana.md +++ b/docs/grafana.md @@ -88,4 +88,11 @@ groups: ``` ## +## 新增监控项 +### Gaea 2.0 + +- gaea_proxy_uptime_counts:counter 类型,记录 gaea_proxy 的启动时间,单位为秒 +- gaea_proxy_backend_instance_down_counts:gauge 类型,记录后端主从库的实例宕机状态,1 为不存活,0 为存活 +- gaea_proxy_cpu_busy: gauge 类型, 记录 gaea_proxy 的 CPU 负载占设置的 CPU 核数百分比(实际使用时需要除以 100 转化为小数) + diff --git a/docs/multi-tenant.md b/docs/multi-tenant.md index e6201cb8..3af8c82c 100644 --- a/docs/multi-tenant.md +++ b/docs/multi-tenant.md @@ -31,4 +31,4 @@ type UserManager struct { ## 结语 -gaea的多租户确实为部署、运维带来了不少方便,后续也会考虑支持kubernetes的部署、调度多租户等,但是当下的多租户结构不会发生太大变化。 \ No newline at end of file +gaea的多租户确实为部署、运维带来了不少方便,后续也会考虑支持kubernetes的部署、调度多租户等,但是当下的多租户结构不会发生太大变化。 diff --git a/docs/performance-test-report.md b/docs/performance-test-report.md new file mode 100644 index 00000000..dff62ac4 --- /dev/null +++ b/docs/performance-test-report.md @@ -0,0 +1,341 @@ +# 1.单主库环境准备 + +## 1.1 机器部署 + +中间件部署节点: + +- Gaea 环境 v2.3.7 【40c/128G】 +- Gaea 环境 v1.2.5 【40c/128G】 +- MySQL 部署节点【32c/128G】 + +注意: + +- Gaea v2.3.7和 Gaea v1.2.5 测试时`open_general_log=true`以及`cpu_num=40`。 + +## 1.2 网络拓扑 + +![单主网络拓扑](assets/singlemaster.jpg) + +## 1.3 准备数据 + +请替换 ``, ``, `` 为数据库实际信息。 + +```Bash +sysbench oltp_common --threads=10 --events=0 --mysql-db= --mysql-host= --mysql-port= --mysql-user= --mysql-password= --tables=10 --table_size=1000000 prepare +``` + +## 1.4 测试结果 + +### 只读测试(**oltp_read_only**) + +```Bash +sysbench oltp_read_only --threads=xx --time=30 --events=0 --mysql-db= --mysql-host= --mysql-port= --mysql-user= --mysql-password= --tables=10 --table_size=1000000 --percentile=99 run +``` + +| 中间件 cpu=4 | 线程数 | qps | tps | avg(ms) | max(ms) | p99(ms) | max cpu usage(%) | +| ------------------ | ------ | --------- | ------- | ------- | ------- | ------- | ---------------- | +| mysql | 4 | 12211.27 | 763.20 | 5.24 | 12.35 | 5.88 | / | +| gaea-2.3.7(单主) | 4 | 7733.67 | 483.35 | 8.27 | 16.20 | 9.91 | 122% | +| gaea-1.2.5(单主) | 4 | 5460.09 | 341.26 | 11.72 | 58.26 | 13.22 | 138% | +| mysql | 8 | 23983.90 | 1498.99 | 5.33 | 15.28 | 6.09 | / | +| gaea-2.3.7(单主) | 8 | 14864.06 | 929.00 | 8.61 | 19.95 | 10.46 | 251% | +| gaea-1.2.5(单主) | 8 | 10537.67 | 658.60 | 12.14 | 22.03 | 13.95 | 285% | +| mysql | 16 | 48595.72 | 3037.23 | 5.26 | 15.39 | 6.21 | / | +| gaea-2.3.7(单主) | 16 | 28086.30 | 1755.39 | 9.11 | 18.15 | 11.24 | 536% | +| gaea-1.2.5(单主) | 16 | 19542.92 | 1221.43 | 13.09 | 76.52 | 14.73 | 621% | +| mysql | 32 | 100138.71 | 6258.67 | 5.11 | 21.73 | 7.56 | / | +| gaea-2.3.7(单主) | 32 | 51487.51 | 3217.97 | 9.94 | 37.14 | 12.52 | 1076% | +| gaea-1.2.5(单主) | 32 | 33402.19 | 2087.64 | 15.32 | 55.57 | 17.95 | 1245% | +| mysql | 64 | 122629.69 | 7664.36 | 8.34 | 42.24 | 15.27 | / | +| gaea-2.3.7(单主) | 64 | 73477.71 | 4592.36 | 13.93 | 65.90 | 19.65 | 1820% | +| gaea-1.2.5(单主) | 64 | 48004.17 | 3000.26 | 21.32 | 60.58 | 27.66 | 1983% | +| mysql | 128 | 135103.29 | 8443.96 | 15.14 | 63.73 | 32.53 | / | +| gaea-2.3.7(单主) | 128 | 91545.52 | 5721.59 | 22.36 | 85.40 | 33.72 | 2123% | +| gaea-1.2.5(单主) | 128 | 52870.14 | 3304.38 | 38.71 | 118.93 | 56.84 | 2286% | + + +![QPS](assets/1-4-1-read-only-QPS.jpg) + +![TPS](assets/1-4-1-read-only-TPS.jpg) + +![P99](assets/1-4-1-read-only-P99.jpg) + +![CPU](assets/1-4-1-read-only-CPU.jpg) + + +### 读写测试(oltp_read_write) + +```Bash +sysbench oltp_read_write --threads=xx --time=30 --mysql-db= --mysql-host= --mysql-port= --mysql-user= --mysql-password= --tables=10 --table-size=1000000 --percentile=99 run +``` + +| 中间件 | 线程数 | qps | tps | avg(ms) | max(ms) | p99(ms) | max cpu usage(%) | +| ------------------ | ------ | --------- | ------- | ------- | ------- | ------- | ---------------- | +| mysql | 4 | 12751.80 | 637.59 | 6.27 | 15.58 | 8.13 | / | +| gaea-2.3.7(单主) | 4 | 8087.28 | 404.36 | 9.89 | 19.40 | 11.65 | 125% | +| gaea-1.2.5(单主) | 4 | 5715.44 | 285.77 | 13.99 | 21.06 | 15.83 | 133% | +| mysql | 8 | 25150.51 | 1257.53 | 6.36 | 15.93 | 7.70 | / | +| gaea-2.3.7(单主) | 8 | 15432.33 | 771.62 | 10.36 | 20.36 | 12.52 | 245% | +| gaea-1.2.5(单主) | 8 | 11124.17 | 556.21 | 14.38 | 23.38 | 16.41 | 266% | +| mysql | 16 | 50818.63 | 2540.93 | 6.29 | 16.71 | 8.43 | / | +| gaea-2.3.7(单主) | 16 | 29369.67 | 1468.48 | 10.89 | 22.20 | 13.70 | 497% | +| gaea-1.2.5(单主) | 16 | 20283.24 | 1014.16 | 15.77 | 29.24 | 19.29 | 592% | +| mysql | 32 | 93985.74 | 4699.29 | 6.81 | 24.00 | 12.30 | / | +| gaea-2.3.7(单主) | 32 | 52966.13 | 2648.31 | 12.08 | 64.26 | 17.01 | 973% | +| gaea-1.2.5(单主) | 32 | 34758.88 | 1737.94 | 18.40 | 58.98 | 23.95 | 1191% | +| mysql | 64 | 95239.52 | 4761.98 | 13.43 | 3512.26 | 22.69 | / | +| gaea-2.3.7(单主) | 64 | 74007.05 | 3700.35 | 17.29 | 72.90 | 26.20 | 1643% | +| gaea-1.2.5(单主) | 64 | 48485.42 | 2424.27 | 26.39 | 105.08 | 34.95 | 1857% | +| mysql | 128 | 105833.23 | 5291.66 | 24.15 | 1115.60 | 37.56 | / | +| gaea-2.3.7(单主) | 128 | 87276.42 | 4363.82 | 29.31 | 125.43 | 44.17 | 1991% | +| gaea-1.2.5(单主) | 128 | 53510.65 | 2675.53 | 47.81 | 169.71 | 68.05 | 2050% | + + +![QPS](assets/1-4-2-read-write-QPS.jpg) + +![TPS](assets/1-4-2-read-write-TPS.jpg) + +![P99](assets/1-4-2-read-write-P99.jpg) + +![CPU](assets/1-4-2-read-write-CPU.jpg) + + +### 只写测试(oltp_write_only) + +```Bash +sysbench oltp_write_only --threads=xx --time=30 --mysql-db= --mysql-host= --mysql-port= --mysql-user= --mysql-password= --tables=10 --table-size=1000000 --percentile=99 run +``` + +| 中间件 | 线程数 | qps | tps | avg(ms) | max(ms) | p99(ms) | max cpu usage(%) | +| ------------------ | ------ | --------- | -------- | ------- | ------- | ------- | ---------------- | +| mysql | 4 | 22331.83 | 3721.97 | 1.07 | 14.34 | 1.37 | / | +| gaea-2.3.7(单主) | 4 | 12740.16 | 2123.36 | 1.88 | 25.39 | 2.43 | 84.3% | +| gaea-1.2.5(单主) | 4 | 8428.90 | 1404.82 | 2.84 | 44.54 | 3.75 | 106% | +| mysql | 8 | 42700.96 | 7116.83 | 1.12 | 16.01 | 1.52 | / | +| gaea-2.3.7(单主) | 8 | 24179.67 | 4029.94 | 1.98 | 45.16 | 2.91 | 170% | +| gaea-1.2.5(单主) | 8 | 16420.31 | 2736.72 | 2.92 | 12.88 | 4.10 | 208% | +| mysql | 16 | 68909.64 | 11484.94 | 1.39 | 154.05 | 2.71 | / | +| gaea-2.3.7(单主) | 16 | 44904.56 | 7484.09 | 2.14 | 44.43 | 3.43 | 356% | +| gaea-1.2.5(单主) | 16 | 30446.85 | 5074.48 | 3.15 | 53.01 | 4.74 | 442% | +| mysql | 32 | 94586.28 | 15764.38 | 2.03 | 271.67 | 7.43 | / | +| gaea-2.3.7(单主) | 32 | 73961.63 | 12326.94 | 2.59 | 96.80 | 4.41 | 719% | +| gaea-1.2.5(单主) | 32 | 52332.21 | 8722.04 | 3.67 | 42.87 | 5.88 | 844% | +| mysql | 64 | 101542.13 | 16923.69 | 3.78 | 281.98 | 11.45 | / | +| gaea-2.3.7(单主) | 64 | 91077.98 | 15179.65 | 4.21 | 125.56 | 7.43 | 1155% | +| gaea-1.2.5(单主) | 64 | 67720.21 | 11286.69 | 5.66 | 135.34 | 9.91 | 1226% | +| mysql | 128 | 97611.74 | 16268.62 | 7.86 | 257.91 | 16.71 | / | +| gaea-2.3.7(单主) | 128 | 91410.19 | 15235.00 | 8.40 | 149.96 | 16.41 | 1178% | +| gaea-1.2.5(单主) | 128 | 68650.74 | 11441.78 | 11.18 | 200.66 | 22.69 | 1242% | + + +![QPS](assets/1-4-3-write-only-QPS.jpg) + +![TPS](assets/1-4-3-write-only-TPS.jpg) + +![P99](assets/1-4-3-write-only-P99.jpg) + +![CPU](assets/1-4-3-write-only-CPU.jpg) + + +### 点查测试(oltp_point_select) + +```Bash +sysbench oltp_point_select --threads=xx --time=30 --mysql-db= --mysql-host= --mysql-port= --mysql-user= --mysql-password= --tables=10 --table-size=1000000 --percentile=99 run +``` + +| 中间件 | 线程数 | qps | tps | avg(ms) | max(ms) | p99(ms) | max cpu usage(%) | +| ------------------ | ------ | --------- | --------- | ------- | ------- | ------- | ---------------- | +| mysql | 4 | 35190.27 | 35190.27 | 0.11 | 3.95 | 0.15 | / | +| gaea-2.3.7(单主) | 4 | 12870.86 | 12870.86 | 0.31 | 62.19 | 0.34 | 113% | +| gaea-1.2.5(单主) | 4 | 8922.12 | 8922.12 | 0.45 | 29.35 | 0.64 | 140% | +| mysql | 8 | 70198.4 | 70198.4 | 0.11 | 4.55 | 0.15 | / | +| gaea-2.3.7(单主) | 8 | 27894.76 | 27894.76 | 0.29 | 11.78 | 0.45 | 227% | +| gaea-1.2.5(单主) | 8 | 17302.88 | 17302.88 | 0.46 | 13.56 | 0.89 | 286% | +| mysql | 16 | 131678.46 | 131678.46 | 0.12 | 11.09 | 0.16 | / | +| gaea-2.3.7(单主) | 16 | 53322.41 | 53322.41 | 0.30 | 9.78 | 0.80 | 498% | +| gaea-1.2.5(单主) | 16 | 31819.61 | 31819.61 | 0.50 | 5.89 | 1.30 | 631% | +| mysql | 32 | 228231.33 | 228231.33 | 0.14 | 12.39 | 0.21 | / | +| gaea-2.3.7(单主) | 32 | 95535.38 | 95535.38 | 0.33 | 11.93 | 1.15 | 1108% | +| gaea-1.2.5(单主) | 32 | 52741.48 | 52741.48 | 0.61 | 14.64 | 1.82 | 1186% | +| mysql | 64 | 352413.31 | 352413.31 | 0.18 | 22.08 | 0.46 | / | +| gaea-2.3.7(单主) | 64 | 153702.43 | 153702.43 | 0.42 | 17.51 | 1.58 | 1481% | +| gaea-1.2.5(单主) | 64 | 62898.85 | 62898.85 | 1.02 | 62.95 | 3.25 | 2206% | +| mysql | 128 | 438025.91 | 438025.91 | 0.29 | 23.41 | 2.11 | / | +| gaea-2.3.7(单主) | 128 | 210410.89 | 210410.89 | 0.61 | 31.40 | 2.76 | 1513% | +| gaea-1.2.5(单主) | 128 | 65272.06 | 65272.06 | 1.96 | 43.34 | 8.58 | 2735% | + +![QPS](assets/1-4-4-point-select-QPS.jpg) + +![TPS](assets/1-4-4-point-select-TPS.jpg) + +![P99](assets/1-4-4-point-select-P99.jpg) + +![CPU](assets/1-4-4-point-select-CPU.jpg) + +# 2.主从环境准备 + +## 2.1 机器部署 + +- Gaea 环境 v2.3.7 【40c/128G】 +- Gaea 环境 v1.2.5 【40c/128G】 +- MySQL 部署节点【32c/128G】 + +注意: + +- Gaea v2.3.7和 Gaea v1.2.5 测试时`open_general_log=true`以及`cpu_num=40`。 + +## 2.2 网络拓扑 + +![单主网络拓扑](assets/master-slave.jpg) + +## 2.3 准备数据 + +请替换 ``, ``, `` 为数据库实际信息。 + +```Bash +sysbench oltp_common --threads=10 --events=0 --mysql-db= --mysql-host= --mysql-port= --mysql-user= --mysql-password= --tables=10 --table_size=1000000 prepare +``` + +## 2.4 测试结果 + +### 只读测试(**oltp_read_only**) + +```Bash +sysbench oltp_read_only --threads=xx --time=30 --events=0 --mysql-db= --mysql-host= --mysql-port= --mysql-user= --mysql-password= --tables=10 --table_size=1000000 --percentile=99 run +``` + +| 中间件 cpu=4 | 线程数 | qps | tps | avg(ms) | max(ms) | p99(ms) | max cpu usage(%) | +| ------------------ | ------ | --------- | ------- | ------- | ------- | ------- | ---------------- | +| mysql | 4 | 12211.27 | 763.20 | 5.24 | 12.35 | 5.88 | / | +| gaea-2.3.7(主从) | 4 | 7784.58 | 486.54 | 8.22 | 34.48 | 9.91 | 124% | +| gaea-1.2.5(主从) | 4 | 5497.74 | 343.61 | 11.64 | 21.18 | 13.22 | 133% | +| mysql | 8 | 23983.90 | 1498.99 | 5.33 | 15.28 | 6.09 | / | +| gaea-2.3.7(主从) | 8 | 14862.67 | 928.92 | 8.61 | 19.38 | 10.46 | 242% | +| gaea-1.2.5(主从) | 8 | 10709.69 | 669.36 | 11.95 | 33.16 | 13.70 | 266% | +| mysql | 16 | 48595.72 | 3037.23 | 5.26 | 15.39 | 6.21 | / | +| gaea-2.3.7(主从) | 16 | 28560.96 | 1785.06 | 8.96 | 51.24 | 11.24 | 510% | +| gaea-1.2.5(主从) | 16 | 20495.60 | 1280.98 | 12.49 | 52.30 | 14.46 | 573% | +| mysql | 32 | 100138.71 | 6258.67 | 5.11 | 21.73 | 7.56 | / | +| gaea-2.3.7(主从) | 32 | 52776.13 | 3298.51 | 9.70 | 24.83 | 12.30 | 1084% | +| gaea-1.2.5(主从) | 32 | 36886.45 | 2305.40 | 13.87 | 54.01 | 15.83 | 1175% | +| mysql | 64 | 122629.69 | 7664.36 | 8.34 | 42.24 | 15.27 | / | +| gaea-2.3.7(主从) | 64 | 75436.79 | 4714.80 | 13.57 | 73.65 | 19.29 | 1760% | +| gaea-1.2.5(主从) | 64 | 54068.68 | 3379.29 | 18.93 | 61.95 | 24.38 | 1975% | +| mysql | 128 | 135103.29 | 8443.96 | 15.14 | 63.73 | 32.53 | / | +| gaea-2.3.7(主从) | 128 | 94922.81 | 5932.68 | 21.56 | 54.90 | 33.72 | 2106% | +| gaea-1.2.5(主从) | 128 | 57980.45 | 3623.78 | 35.30 | 94.13 | 52.89 | 2362% | + +![QPS](assets/2-4-1-read-only-QPS.jpg) + +![TPS](assets/2-4-1-read-only-TPS.jpg) + +![P99](assets/2-4-1-read-only-P99.jpg) + +![CPU](assets/2-4-1-read-only-CPU.jpg) + +### 读写测试(oltp_read_write) + +```Bash +sysbench oltp_read_write --threads=xx --time=30 --mysql-db= --mysql-host= --mysql-port= --mysql-user= --mysql-password= --tables=10 --table-size=1000000 --percentile=99 run +``` + +| 中间件 | 线程数 | qps | tps | avg(ms) | max(ms) | p99(ms) | max cpu usage(%) | +| ------------------ | ------ | --------- | ------- | ------- | ------- | ------- | ---------------- | +| mysql | 4 | 12751.80 | 637.59 | 6.27 | 15.58 | 8.13 | / | +| gaea-2.3.7(主从) | 4 | 8212.51 | 410.63 | 9.74 | 19.08 | 11.45 | 114% | +| gaea-1.2.5(主从) | 4 | 5736.10 | 286.80 | 13.94 | 71.98 | 15.55 | 124% | +| mysql | 8 | 25150.51 | 1257.53 | 6.36 | 15.93 | 7.70 | / | +| gaea-2.3.7(主从) | 8 | 15653.90 | 782.70 | 10.22 | 23.06 | 12.30 | 240% | +| gaea-1.2.5(主从) | 8 | 11187.33 | 559.37 | 14.30 | 53.77 | 16.41 | 251% | +| mysql | 16 | 50818.63 | 2540.93 | 6.29 | 16.71 | 8.43 | / | +| gaea-2.3.7(主从) | 16 | 29825.26 | 1491.26 | 10.72 | 48.90 | 13.70 | 486% | +| gaea-1.2.5(主从) | 16 | 21274.28 | 1063.71 | 15.04 | 53.76 | 18.28 | 551% | +| mysql | 32 | 93985.74 | 4699.29 | 6.81 | 24.00 | 12.30 | / | +| gaea-2.3.7(主从) | 32 | 54207.34 | 2710.37 | 11.80 | 35.74 | 17.32 | 954% | +| gaea-1.2.5(主从) | 32 | 37916.59 | 1895.83 | 16.87 | 64.07 | 23.52 | 1097% | +| mysql | 64 | 95239.52 | 4761.98 | 13.43 | 3512.26 | 22.69 | / | +| gaea-2.3.7(主从) | 64 | 75173.75 | 3758.69 | 17.02 | 81.03 | 26.20 | 1633% | +| gaea-1.2.5(主从) | 64 | 54838.00 | 2741.90 | 23.33 | 66.39 | 32.53 | 1843% | +| mysql | 128 | 105833.23 | 5291.66 | 24.15 | 1115.60 | 37.56 | / | +| gaea-2.3.7(主从) | 128 | 88833.18 | 4441.63 | 28.80 | 171.47 | 44.17 | 1943% | +| gaea-1.2.5(主从) | 128 | 58197.8 | 2909.89 | 43.96 | 84.36 | 63.32 | 2023% | + + +![QPS](assets/2-4-2-read-write-QPS.jpg) + +![TPS](assets/2-4-2-read-write-TPS.jpg) + +![P99](assets/2-4-2-read-write-P99.jpg) + +![CPU](assets/2-4-2-read-write-CPU.jpg) + +### 只写测试(oltp_write_only) + +```Bash +sysbench oltp_read_write --threads=xx --time=30 --mysql-db= --mysql-host= --mysql-port= --mysql-user= --mysql-password= --tables=10 --table-size=1000000 --percentile=99 run +``` + +| 中间件 | 线程数 | qps | tps | avg(ms) | max(ms) | p99(ms) | max cpu usage(%) | +| ------------------ | ------ | --------- | -------- | ------- | ------- | ------- | ---------------- | +| mysql | 4 | 22331.83 | 3721.97 | 1.07 | 14.34 | 1.37 | / | +| gaea-2.3.7(主从) | 4 | 12867.21 | 2144.54 | 1.86 | 10.96 | 2.39 | 85.3% | +| gaea-1.2.5(主从) | 4 | 8464.34 | 1410.72 | 2.83 | 56.03 | 3.55 | 101% | +| mysql | 8 | 42700.96 | 7116.83 | 1.12 | 16.01 | 1.52 | / | +| gaea-2.3.7(主从) | 8 | 24156.07 | 4026.01 | 1.99 | 12.23 | 2.86 | 172% | +| gaea-1.2.5(主从) | 8 | 16394.17 | 2732.36 | 2.93 | 42.65 | 4.10 | 200% | +| mysql | 16 | 68909.64 | 11484.94 | 1.39 | 154.05 | 2.71 | / | +| gaea-2.3.7(主从) | 16 | 44251.25 | 7375.21 | 2.17 | 103.42 | 3.43 | 335% | +| gaea-1.2.5(主从) | 16 | 31221.77 | 5203.63 | 3.07 | 42.69 | 4.65 | 412% | +| mysql | 32 | 94586.28 | 15764.38 | 2.03 | 271.67 | 7.43 | / | +| gaea-2.3.7(主从) | 32 | 73412.09 | 12235.32 | 2.61 | 148.23 | 4.33 | 696% | +| gaea-1.2.5(主从) | 32 | 54830.50 | 9138.42 | 3.50 | 52.42 | 5.77 | 820% | +| mysql | 64 | 101542.13 | 16923.69 | 3.78 | 281.98 | 11.45 | / | +| gaea-2.3.7(主从) | 64 | 93059.08 | 15509.85 | 4.12 | 122.29 | 7.56 | 1173% | +| gaea-1.2.5(主从) | 64 | 71905.85 | 11984.29 | 5.33 | 202.55 | 9.56 | 1183% | +| mysql | 128 | 97611.74 | 16268.62 | 7.86 | 257.91 | 16.71 | / | +| gaea-2.3.7(主从) | 128 | 91703.20 | 15283.85 | 8.37 | 116.97 | 16.41 | 1177% | +| gaea-1.2.5(主从) | 128 | 72172.38 | 12028.73 | 10.63 | 317.04 | 21.50 | 1193% | + + +![QPS](assets/2-4-3-write-only-QPS.jpg) + +![TPS](assets/2-4-3-write-only-TPS.jpg) + +![P99](assets/2-4-3-write-only-P99.jpg) + +![CPU](assets/2-4-3-write-only-CPU.jpg) + +### 点查测试(oltp_point_select) + +```Bash +sysbench oltp_read_only --threads=xx --time=30 --events=0 --mysql-db= --mysql-host= --mysql-port= --mysql-user= --mysql-password= --tables=10 --table_size=1000000 --percentile=99 run +``` + +| 中间件 | 线程数 | qps | tps | avg(ms) | max(ms) | p99(ms) | max cpu usage(%) | +| ------------------ | ------ | --------- | --------- | ------- | ------- | ------- | ---------------- | +| mysql | 4 | 35190.27 | 35190.27 | 0.11 | 3.95 | 0.15 | / | +| gaea-2.3.7(主从) | 4 | 13971.36 | 13971.36 | 0.29 | 10.93 | 0.36 | 108% | +| gaea-1.2.5(主从) | 4 | 9141.40 | 9141.40 | 0.44 | 23.93 | 0.59 | 123% | +| mysql | 8 | 70198.4 | 70198.4 | 0.11 | 4.55 | 0.15 | / | +| gaea-2.3.7(主从) | 8 | 27121.79 | 27121.79 | 0.29 | 21.24 | 0.43 | 232% | +| gaea-1.2.5(主从) | 8 | 17641.69 | 17641.69 | 0.45 | 4.23 | 0.72 | 261% | +| mysql | 16 | 131678.46 | 131678.46 | 0.12 | 11.09 | 0.16 | / | +| gaea-2.3.7(主从) | 16 | 52938.15 | 52938.15 | 0.30 | 9.91 | 0.70 | 492% | +| gaea-1.2.5(主从) | 16 | 33859.82 | 33859.82 | 0.47 | 20.19 | 1.08 | 543% | +| mysql | 32 | 228231.33 | 228231.33 | 0.14 | 12.39 | 0.21 | / | +| gaea-2.3.7(主从) | 32 | 96820.29 | 96820.29 | 0.33 | 46.84 | 1.21 | 1107% | +| gaea-1.2.5(主从) | 32 | 61850.09 | 61850.09 | 0.52 | 13.33 | 1.52 | 1146% | +| mysql | 64 | 352413.31 | 352413.31 | 0.18 | 22.08 | 0.46 | / | +| gaea-2.3.7(主从) | 64 | 160535.00 | 160535.00 | 0.40 | 40.16 | 1.50 | 1362% | +| gaea-1.2.5(主从) | 64 | 70758.98 | 70758.98 | 0.90 | 63.48 | 3.07 | 2162% | +| mysql | 128 | 438025.91 | 438025.91 | 0.29 | 23.41 | 2.11 | / | +| gaea-2.3.7(主从) | 128 | 222424.15 | 222424.15 | 0.57 | 20.36 | 2.66 | 1380% | +| gaea-1.2.5(主从) | 128 | 70015.00 | 70015.00 | 1.83 | 28.43 | 8.28 | 2744% | + +![QPS](assets/2-4-4-point-select-QPS.jpg) + +![TPS](assets/2-4-4-point-select-TPS.jpg) + +![P99](assets/2-4-4-point-select-P99.jpg) + +![CPU](assets/2-4-4-point-select-CPU.jpg) diff --git a/docs/prepare.md b/docs/prepare.md index 54a7806a..411703bc 100644 --- a/docs/prepare.md +++ b/docs/prepare.md @@ -38,4 +38,4 @@ gaea对于prepare的处理初衷还是考虑协议的兼容和简化处理逻辑 ## 参考资料 -[mysql prepare statements 官方文档](https://dev.mysql.com/doc/internals/en/prepared-statements.html) \ No newline at end of file +[mysql prepare statements 官方文档](https://dev.mysql.com/doc/internals/en/prepared-statements.html) diff --git a/docs/sequence-id.md b/docs/sequence-id.md index b7d0d326..8b854384 100644 --- a/docs/sequence-id.md +++ b/docs/sequence-id.md @@ -98,4 +98,3 @@ RETURN mycat_seq_currval(seq_name); END $ DELIMITER ; ``` - diff --git a/docs/template/gaea_namespace.json b/docs/template/gaea_namespace.json index c7ad12bb..d1c2c4d6 100644 --- a/docs/template/gaea_namespace.json +++ b/docs/template/gaea_namespace.json @@ -900,4 +900,4 @@ "title": "gaea-template", "uid": "000000481", "version": 12 -} \ No newline at end of file +} diff --git a/docs/template/gaea_proxy.json b/docs/template/gaea_proxy.json index e0523e29..eb3be899 100644 --- a/docs/template/gaea_proxy.json +++ b/docs/template/gaea_proxy.json @@ -1221,4 +1221,4 @@ "title": "gaea_proxy", "uid": "dW2pRnYmze", "version": 29 -} \ No newline at end of file +} diff --git a/etc/file/namespace/test_namespace_1.json b/etc/file/namespace/test_namespace_1.json index 27512e4e..8b514c0f 100644 --- a/etc/file/namespace/test_namespace_1.json +++ b/etc/file/namespace/test_namespace_1.json @@ -20,7 +20,8 @@ "statistic_slaves": null, "capacity": 12, "max_capacity": 24, - "idle_timeout": 60 + "idle_timeout": 60, + "init_connect": "" } ], "shard_rules": null, diff --git a/etc/file/namespace/test_namespace_2.json b/etc/file/namespace/test_namespace_2.json index 722a82f2..52afff2e 100644 --- a/etc/file/namespace/test_namespace_2.json +++ b/etc/file/namespace/test_namespace_2.json @@ -20,7 +20,8 @@ "statistic_slaves": null, "capacity": 12, "max_capacity": 24, - "idle_timeout": 60 + "idle_timeout": 60, + "init_connect": "" } ], "shard_rules": null, diff --git a/etc/file/namespace/test_namespace_shard.json b/etc/file/namespace/test_namespace_shard.json index 77b2f3f0..25d366d4 100644 --- a/etc/file/namespace/test_namespace_shard.json +++ b/etc/file/namespace/test_namespace_shard.json @@ -25,7 +25,8 @@ "statistic_slaves": [], "capacity": 12, "max_capacity": 24, - "idle_timeout": 60 + "idle_timeout": 60, + "init_connect": "" }, { "name": "slice-1", diff --git a/etc/gaea.ini b/etc/gaea.ini index a5052b6a..92646035 100644 --- a/etc/gaea.ini +++ b/etc/gaea.ini @@ -1,8 +1,10 @@ ; config type, etcd/file/etcdv3, you can test gaea with file type, you shoud use etcd/etcdv3 in production ; 请指定设定方式为 file 或 etcd 或 etcdv3 -config_type=etcd +;config_type=file +config_type=etcdv3 ;file config path, 具体配置放到file_config_path的namespace目录下,该下级目录为固定目录 -file_config_path=./etc/file +;file_config_path=./etc/file +;file_config_path=/etc/ ;coordinator addr coordinator_addr=http://127.0.0.1:2379 @@ -22,12 +24,16 @@ log_path=./logs log_level=Notice log_filename=gaea log_output=file +; 日志保留天数 +log_keep_days=3 +; 日志保留数量 +log_keep_counts=3 ;admin addr admin_addr=0.0.0.0:13307 ; basic auth -admin_user=admin -admin_password=admin +admin_user=test +admin_password=test ;proxy addr proto_type=tcp4 @@ -50,4 +56,4 @@ encrypt_key=1234abcd5678efg* server_version=5.6.20-gaea ;auth plugin mysql_native_password or caching_sha2_password or '' -auth_plugin=mysql_native_password \ No newline at end of file +auth_plugin=mysql_native_password diff --git a/etc/gaea_cc.ini b/etc/gaea_cc.ini index ca92c4ac..4123ce79 100644 --- a/etc/gaea_cc.ini +++ b/etc/gaea_cc.ini @@ -12,8 +12,9 @@ log_level=Notice log_path =./logs log_filename=gaea_cc log_output=file +log_keep_days=3 -;coordinator 目前支持 etcd 和 etcdv3,coodinator config +;coordinator 目前支持 etcd 和 etcdv3,coodinator config, 根据 etcd 的 API VERSION 版本进行配置 coordinator_type=etcd coordinator_addr=http://127.0.0.1:2379 username=root diff --git a/gen_version.sh b/gen_version.sh index 06d873e7..d5073d72 100755 --- a/gen_version.sh +++ b/gen_version.sh @@ -19,15 +19,13 @@ fi BRANCH=$(git rev-parse --abbrev-ref HEAD) GIT_DIRTY=$(git diff --no-ext-diff 2> /dev/null | wc -l) -# XXX This needs to be updated to accomodate tags added after building, rather than prior to builds -RELEASE_TAG=$(git describe --match '[0-9]*\.[0-9]*\.[0-9]*' --exact-match --tags 2> /dev/null || echo "") +# XXX This needs to be updated to accommodate tags added after building, rather than prior to builds +RELEASE_TAG=$(git describe) # security wanted VERSION='unknown' VERSION="${BUILD_GIT_REVISION}" if [[ -n "${RELEASE_TAG}" ]]; then VERSION="${RELEASE_TAG}" -elif [[ -n ${MY_VERSION} ]]; then - VERSION="${MY_VERSION}" fi # used by core/version @@ -38,4 +36,4 @@ echo buildHost "$(hostname -f)" echo buildStatus "${tree_status}" echo buildTime "$(date +%Y-%m-%d--%T)" echo buildBranch "${BRANCH}" -echo buildGitDirty "${GIT_DIRTY}" \ No newline at end of file +echo buildGitDirty "${GIT_DIRTY}" diff --git a/go.mod b/go.mod index 5aba52f5..e7630b06 100644 --- a/go.mod +++ b/go.mod @@ -1,8 +1,10 @@ module github.com/XiaoMi/Gaea -go 1.12 +go 1.16 require ( + github.com/StackExchange/wmi v1.2.1 // indirect + github.com/bytedance/mockey v1.2.10 github.com/coreos/bbolt v1.3.2 // indirect github.com/coreos/etcd v3.3.13+incompatible github.com/coreos/go-semver v0.2.0 // indirect @@ -12,44 +14,42 @@ require ( github.com/dgrijalva/jwt-go v3.2.0+incompatible // indirect github.com/emirpasic/gods v1.12.0 github.com/gin-contrib/gzip v0.0.1 - github.com/gin-gonic/gin v1.7.2 + github.com/gin-gonic/gin v1.7.7 github.com/go-ini/ini v1.42.0 github.com/go-playground/validator/v10 v10.8.0 // indirect - github.com/gogo/protobuf v1.2.1 // indirect - github.com/golang-jwt/jwt v3.2.1+incompatible // indirect - github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903 // indirect - github.com/golang/mock v1.1.1 - github.com/golang/protobuf v1.5.2 // indirect + github.com/go-sql-driver/mysql v1.6.0 + github.com/gogo/protobuf v1.3.2 // indirect + github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect + github.com/golang/mock v1.4.4 github.com/google/btree v1.0.0 // indirect github.com/gorilla/websocket v1.4.2 // indirect github.com/grpc-ecosystem/go-grpc-middleware v1.0.0 // indirect github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 // indirect github.com/grpc-ecosystem/grpc-gateway v1.9.0 // indirect + github.com/hashicorp/go-version v1.6.0 github.com/jonboulle/clockwork v0.1.0 // indirect - github.com/json-iterator/go v1.1.11 // indirect + github.com/lestrrat-go/file-rotatelogs v2.4.0+incompatible + github.com/lestrrat-go/strftime v1.0.6 // indirect github.com/mattn/go-isatty v0.0.13 // indirect + github.com/onsi/ginkgo/v2 v2.3.1 + github.com/onsi/gomega v1.22.1 github.com/pingcap/check v0.0.0-20190102082844-67f458068fc8 github.com/pingcap/errors v0.11.1 github.com/pingcap/tipb v0.0.0-20190226124958-833c2ffd2fe7 - github.com/pkg/errors v0.8.1 // indirect - github.com/prometheus/client_golang v0.9.2 + github.com/prometheus/client_golang v1.11.1 github.com/remyoudompheng/bigfft v0.0.0-20190321074620-2f0d2b0e0001 // indirect - github.com/sirupsen/logrus v1.4.2 // indirect - github.com/smartystreets/goconvey v0.0.0-20190222223459-a17d461953aa // indirect + github.com/shirou/gopsutil v2.20.9+incompatible + github.com/shopspring/decimal v1.3.1 github.com/soheilhy/cmux v0.1.4 // indirect - github.com/stretchr/testify v1.6.1 + github.com/stretchr/testify v1.8.1 github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8 // indirect - github.com/ugorji/go v1.2.6 // indirect github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2 // indirect - go.etcd.io/bbolt v1.3.2 // indirect - go.uber.org/atomic v1.4.0 // indirect + go.uber.org/atomic v1.4.0 go.uber.org/multierr v1.1.0 // indirect - go.uber.org/zap v1.10.0 // indirect + go.uber.org/zap v1.10.0 golang.org/x/time v0.0.0-20181108054448-85acf8d2951c // indirect google.golang.org/grpc v1.21.0 // indirect - google.golang.org/protobuf v1.27.1 // indirect gopkg.in/ini.v1 v1.42.0 - gopkg.in/yaml.v2 v2.4.0 // indirect ) replace github.com/dgrijalva/jwt-go => github.com/golang-jwt/jwt v3.2.2-0.20210713063142-860640e8862d+incompatible diff --git a/go.sum b/go.sum index 705b9b94..77dffd56 100644 --- a/go.sum +++ b/go.sum @@ -1,7 +1,24 @@ cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973 h1:xJ4a3vCFaGF/jqvzLMYoU8P317H5OQ+Via4RmuPwCS0= +github.com/StackExchange/wmi v1.2.1 h1:VIkavFPXSjcnS+O8yTq7NI32k0R5Aj+v39y29VYDOSA= +github.com/StackExchange/wmi v1.2.1/go.mod h1:rcmrprowKIVzvc+NUiLncP2uuArMWLCbu9SBzvHz7e8= +github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= +github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= +github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= +github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= +github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= +github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= +github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= +github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= +github.com/cespare/xxhash/v2 v2.1.1 h1:6MnRN8NT7+YBpUIWxHtefFZOKTAPgGjpQSxqLNn0+qY= +github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/bytedance/mockey v1.2.10 h1:4JlMpkm7HMXmTUtItid+iCu2tm61wvq+ca1X2u7ymzE= +github.com/bytedance/mockey v1.2.10/go.mod h1:bNrUnI1u7+pAc0TYDgPATM+wF2yzHxmNH+iDXg4AOCU= +github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= +github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= +github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/coreos/bbolt v1.3.2 h1:wZwiHHUieZCquLkDL0B8UhzreNWsPHooDAG3q34zk0s= github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= @@ -20,6 +37,8 @@ github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/emirpasic/gods v1.12.0 h1:QAUIPSaCu4G+POclxeqb3F+WPpdKqFGlw36+yOzGlrg= github.com/emirpasic/gods v1.12.0/go.mod h1:YfzfFFoVP/catgzJb4IKIqXjX78Ha8FMSDh3ymbK86o= +github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= +github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/gin-contrib/gzip v0.0.1 h1:ezvKOL6jH+jlzdHNE4h9h8q8uMpDQjyl0NN0Jd7jozc= @@ -28,10 +47,18 @@ github.com/gin-contrib/sse v0.0.0-20170109093832-22d885f9ecc7/go.mod h1:VJ0WA2NB github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE= github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= github.com/gin-gonic/gin v1.3.0/go.mod h1:7cKuhb5qV2ggCFctp2fJQ+ErvciLZrIeoOSOm6mUr7Y= -github.com/gin-gonic/gin v1.7.2 h1:Tg03T9yM2xa8j6I3Z3oqLaQRSmKvxPd6g/2HJ6zICFA= -github.com/gin-gonic/gin v1.7.2/go.mod h1:jD2toBW3GZUr5UMcdrwQA10I7RuaFOl/SGeDjXkfUtY= +github.com/gin-gonic/gin v1.7.7 h1:3DoBmSbJbZAWqXJC3SLjAPfutPJJRN1U5pALB7EeTTs= +github.com/gin-gonic/gin v1.7.7/go.mod h1:axIBovoeJpVj8S3BwE0uPMTeReE4+AfFtqpqaZ1qq1U= github.com/go-ini/ini v1.42.0 h1:TWr1wGj35+UiWHlBA8er89seFXxzwFn11spilrrj+38= github.com/go-ini/ini v1.42.0/go.mod h1:ByCAeIL28uOIIG0E3PJtZPDL8WnHpFKFOtgjp+3Ies8= +github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= +github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= +github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= +github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= +github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= +github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= +github.com/go-ole/go-ole v1.2.5 h1:t4MGB5xEDZvXI+0rMjjsfBsD7yAgp/s9ZDkL1JndXwY= +github.com/go-ole/go-ole v1.2.5/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= github.com/go-playground/assert/v2 v2.0.1 h1:MsBgLAaY856+nPRTKrp3/OZK38U/wa0CcBYNjji3q3A= github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= github.com/go-playground/locales v0.13.0 h1:HyWk6mgj5qFqCT5fjGBuRArbVDfE4hi8+e8ceBS/t7Q= @@ -41,29 +68,48 @@ github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+ github.com/go-playground/validator/v10 v10.4.1/go.mod h1:nlOn6nFhuKACm19sB/8EGNn9GlaMV7XkbRSipzJ0Ii4= github.com/go-playground/validator/v10 v10.8.0 h1:1kAa0fCrnpv+QYdkdcRzrRM7AyYs5o8+jZdJCz9xj6k= github.com/go-playground/validator/v10 v10.8.0/go.mod h1:9JhgTzTaE31GZDpH/HSvHiRJrJ3iKAgqqH0Bl/Ocjdk= -github.com/gogo/protobuf v1.2.1 h1:/s5zKNz0uPFCZ5hddgPdo2TK2TVrUNMn0OOX8/aZMTE= -github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= -github.com/golang-jwt/jwt v3.2.1+incompatible h1:73Z+4BJcrTC+KczS6WvTPvRGOp1WmfEP4Q1lOd9Z/+c= -github.com/golang-jwt/jwt v3.2.1+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I= +github.com/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/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= +github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= +github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= github.com/golang-jwt/jwt v3.2.2-0.20210713063142-860640e8862d+incompatible h1:nuO3PTkzwC2tD/CaiLJ0ngRHnuCzp0EV3jNdzkgJz4w= github.com/golang-jwt/jwt v3.2.2-0.20210713063142-860640e8862d+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b h1:VKtxabqXZkF25pY9ekfRL6a582T4P37/31XEstQ5p58= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903 h1:LbsanbbD6LieFkXbj9YNNBupiGHJgFeLpO0j0Fza1h8= -github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/mock v1.1.1 h1:G5FRp8JnTd7RQH5kemVNlMeyXQAztQ3mOWV95KxsXH8= +github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= +github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/mock v1.4.4 h1:l75CXGRSwbaYNpl/Z2X1XIIAMSCquvXgpVZDhwEIJsc= +github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= +github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= +github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= +github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= +github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= +github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= +github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw= github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/google/btree v1.0.0 h1:0udJVsspx3VBr5FwtLhQQtuAsVc79tTq0ocGIPAU6qo= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= -github.com/google/go-cmp v0.5.5 h1:Khx7svrCpmxxtHBq5j2mp/xVjsi8hQMfNLvJFAlrGgU= +github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.8 h1:e6P7q2lk1O+qJJb4BtCQXlK8vWEO8V1ZeuEdJNOqZyg= +github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gorilla/websocket v1.4.2 h1:+/TMaTYc4QFitKJxsQ7Yye35DkWvkdLcvGKqM+x0Ufc= @@ -74,18 +120,29 @@ github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 h1:Ovs26xHkKqVztRpIrF/92Bcuy github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= github.com/grpc-ecosystem/grpc-gateway v1.9.0 h1:bM6ZAFZmc/wPFaRDi0d5L7hGEZEx/2u+Tmr2evNHDiI= github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= +github.com/hashicorp/go-version v1.6.0 h1:feTTfFNnjP967rlCxM/I9g701jU+RN74YKx2mOkIeek= +github.com/hashicorp/go-version v1.6.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= +github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= +github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/jonboulle/clockwork v0.1.0 h1:VKV+ZcuP6l3yW9doeqz6ziZGgcynBVQO+obU0+0hcPo= github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= +github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= github.com/json-iterator/go v1.1.5/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= +github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.11 h1:uVUAXhF2To8cbw/3xN3pxj6kk7TYKs98NIrTqPlMWAQ= github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/jtolds/gls v4.2.1+incompatible h1:fSuqC+Gmlu6l/ZYAoZzx2pyucC8Xza35fpRVWLVmUEE= -github.com/jtolds/gls v4.2.1+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= -github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= +github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo= +github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= +github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= +github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= +github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/konsorten/go-windows-terminal-sequences v1.0.1 h1:mweAR1A6xJ3oS2pRaGiHgQ4OO8tzTaLawm8vnODuwDk= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/konsorten/go-windows-terminal-sequences v1.0.3 h1:CE8S1cTafDpPvMhIxNJKvHsGVBgn1xWYf1NbHQhywc8= +github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= @@ -94,6 +151,12 @@ github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII= github.com/leodido/go-urn v1.2.1 h1:BqpAaACuzVSgi/VLzGZIobT2z4v53pjosyNd9Yv6n/w= github.com/leodido/go-urn v1.2.1/go.mod h1:zt4jvISO2HfUBqxjfIshjdMTYS56ZS/qv49ictyFfxY= +github.com/lestrrat-go/envload v0.0.0-20180220234015-a3eb8ddeffcc h1:RKf14vYWi2ttpEmkA4aQ3j4u9dStX2t4M8UM6qqNsG8= +github.com/lestrrat-go/envload v0.0.0-20180220234015-a3eb8ddeffcc/go.mod h1:kopuH9ugFRkIXf3YoqHKyrJ9YfUFsckUU9S7B+XP+is= +github.com/lestrrat-go/file-rotatelogs v2.4.0+incompatible h1:Y6sqxHMyB1D2YSzWkLibYKgg+SwmyFU9dF2hn6MdTj4= +github.com/lestrrat-go/file-rotatelogs v2.4.0+incompatible/go.mod h1:ZQnN8lSECaebrkQytbHj4xNgtg8CR7RYXnPok8e0EHA= +github.com/lestrrat-go/strftime v1.0.6 h1:CFGsDEt1pOpFNU+TJB0nhz9jl+K0hZSLE205AhTIGQQ= +github.com/lestrrat-go/strftime v1.0.6/go.mod h1:f7jQKgV5nnJpYgdEasS+/y7EsTb8ykN2z68n3TtcTaw= github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= github.com/mattn/go-isatty v0.0.13 h1:qdl+GuBjcsKKDco5BsxPJlId98mSWNKqYA+Co0SC1yA= @@ -106,128 +169,254 @@ github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJ github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v1.0.1 h1:9f412s+6RmYXLWZSEzVVgPGK7C2PphHj5RJrvfx9AWI= github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= +github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= +github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= +github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= +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.16.4 h1:29JGrr5oVBm5ulCWet69zQkzWipVXIol6ygQUe/EzNc= +github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0= +github.com/onsi/ginkgo/v2 v2.1.3/go.mod h1:vw5CSIxN1JObi/U8gcbwft7ZxR2dgaR70JSE3/PpL4c= +github.com/onsi/ginkgo/v2 v2.1.4/go.mod h1:um6tUpWM/cxCK3/FK8BXqEiUMUwRgSM4JXG47RKZmLU= +github.com/onsi/ginkgo/v2 v2.1.6/go.mod h1:MEH45j8TBi6u9BMogfbp0stKC5cdGjumZj5Y7AG4VIk= +github.com/onsi/ginkgo/v2 v2.3.0/go.mod h1:Eew0uilEqZmIEZr8JrvYlvOM7Rr6xzTmMV8AyFNU9d0= +github.com/onsi/ginkgo/v2 v2.3.1 h1:8SbseP7qM32WcvE6VaN6vfXxv698izmsJ1UQX9ve7T8= +github.com/onsi/ginkgo/v2 v2.3.1/go.mod h1:Sv4yQXwG5VmF7tm3Q5Z+RWUpPo24LF1mpnz2crUb8Ys= +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.19.0/go.mod h1:LY+I3pBVzYsTBU1AnDwOSxaYi9WoWiqgwooUqq9yPro= +github.com/onsi/gomega v1.20.1/go.mod h1:DtrZpjmvpn2mPm4YWQa0/ALMDj9v4YxLgojwPeREyVo= +github.com/onsi/gomega v1.21.1/go.mod h1:iYAIXgPSaDHak0LCMA+AWBpIKBr8WZicMxnE8luStNc= +github.com/onsi/gomega v1.22.0/go.mod h1:iYAIXgPSaDHak0LCMA+AWBpIKBr8WZicMxnE8luStNc= +github.com/onsi/gomega v1.22.1 h1:pY8O4lBfsHKZHM/6nrxkhVPUznOlIu3quZcKP/M20KI= +github.com/onsi/gomega v1.22.1/go.mod h1:x6n7VNe4hw0vkyYUM4mjIXx3JbLiPaBPNgB7PRQ1tuM= github.com/pingcap/check v0.0.0-20190102082844-67f458068fc8 h1:USx2/E1bX46VG32FIw034Au6seQ2fY9NEILmNh/UlQg= github.com/pingcap/check v0.0.0-20190102082844-67f458068fc8/go.mod h1:B1+S9LNcuMyLH/4HMTViQOJevkGiik3wW2AN9zb2fNQ= github.com/pingcap/errors v0.11.1 h1:BXFZ6MdDd2U1uJUa2sRAWTmm+nieEzuyYM0R4aUTcC8= github.com/pingcap/errors v0.11.1/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTwv5KuLY8= github.com/pingcap/tipb v0.0.0-20190226124958-833c2ffd2fe7 h1:oDy9VkYU3YQmN+39neB6nsEGdWW4cGPIQO/3wmRon9s= github.com/pingcap/tipb v0.0.0-20190226124958-833c2ffd2fe7/go.mod h1:RtkHW8WbcNxj8lsbzjaILci01CtYnYbIkQhjyZWrWVI= -github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I= +github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/prometheus/client_golang v0.9.2 h1:awm861/B8OKDd2I/6o1dy3ra4BamzKhYOiGItCeZ740= -github.com/prometheus/client_golang v0.9.2/go.mod h1:OsXs2jCmiKlQ1lTBmv21f2mNfw4xf/QclQDMrYNZzcM= -github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910 h1:idejC8f05m9MGOsuEi1ATq9shN03HrxNkD/luQvxCv8= +github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= +github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= +github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= +github.com/prometheus/client_golang v1.11.1 h1:+4eQaD7vAZ6DsfsxB15hbE0odUjGI5ARs9yskGu1v4s= +github.com/prometheus/client_golang v1.11.1/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= -github.com/prometheus/common v0.0.0-20181126121408-4724e9255275 h1:PnBWHBf+6L0jOqq0gIVUe6Yk0/QMZ640k6NvkxcBf+8= -github.com/prometheus/common v0.0.0-20181126121408-4724e9255275/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= -github.com/prometheus/procfs v0.0.0-20181204211112-1dc9a6cbc91a h1:9a8MnZMP0X2nLJdBg+pBmGgkJlSaKC2KaQmTCk1XDtE= -github.com/prometheus/procfs v0.0.0-20181204211112-1dc9a6cbc91a/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= +github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.2.0 h1:uq5h0d+GuxiXLJLNABMgp2qUWDPiLvgCzz2dUR+/W/M= +github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= +github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= +github.com/prometheus/common v0.26.0 h1:iMAkS2TDoNWnKM+Kopnx/8tnEStIfpYA0ur0xQzzhMQ= +github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= +github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= +github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= +github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= +github.com/prometheus/procfs v0.6.0 h1:mxy4L2jP6qMonqmq+aTtOx1ifVWUgG/TAmntgbh3xv4= +github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= github.com/remyoudompheng/bigfft v0.0.0-20190321074620-2f0d2b0e0001 h1:YDeskXpkNDhPdWN3REluVa46HQOVuVkjkd2sWnrABNQ= github.com/remyoudompheng/bigfft v0.0.0-20190321074620-2f0d2b0e0001/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= -github.com/sirupsen/logrus v1.4.2 h1:SPIRibHv4MatM3XXNO2BJeFLZwZ2LvZgfQ5+UNI2im4= +github.com/shirou/gopsutil v2.20.9+incompatible h1:msXs2frUV+O/JLva9EDLpuJ84PrFsdCTCQex8PUdtkQ= +github.com/shirou/gopsutil v2.20.9+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= +github.com/shopspring/decimal v1.3.1 h1:2Usl1nmF/WZucqkFZhnfFYxxxu8LG21F6nPQBE5gKV8= +github.com/shopspring/decimal v1.3.1/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= +github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= +github.com/sirupsen/logrus v1.6.0 h1:UBcNElsrwanuuMsnGSlYmtmgbb23qDR5dG+6X6Oo89I= +github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= -github.com/smartystreets/goconvey v0.0.0-20190222223459-a17d461953aa h1:E+gaaifzi2xF65PbDmuKI3PhLWY6G5opMLniFq8vmXA= -github.com/smartystreets/goconvey v0.0.0-20190222223459-a17d461953aa/go.mod h1:2RVY1rIf+2J2o/IM9+vPq9RzmHDSseB7FoXiSNIUsoU= +github.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s= +github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= github.com/soheilhy/cmux v0.1.4 h1:0HKaf1o97UwFjHH9o5XsHUOF+tqmdA7KEzXLpiyaw0E= github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.1.1 h1:2vfRuCMp5sSVIDSqO8oNnWJq7mPa6KVP3iPIwFBuy8A= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= -github.com/stretchr/testify v1.6.1 h1:hDPOHmpOpP40lSULcqw7IrRb/u7w6RpDC9399XyoNd0= +github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk= +github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8 h1:ndzgwNDnKIqyCvHTXaCqh9KlOWKvBry6nuXMJmonVsE= github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= +github.com/ugorji/go v1.1.7 h1:/68gy2h+1mWMrwZFeD1kQialdSzAb432dtpeJ42ovdo= github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= -github.com/ugorji/go v1.2.6 h1:tGiWC9HENWE2tqYycIqFTNorMmFRVhNwCpDOpWqnk8E= -github.com/ugorji/go v1.2.6/go.mod h1:anCg0y61KIhDlPZmnH+so+RQbysYVyDko0IMgJv0Nn0= github.com/ugorji/go/codec v0.0.0-20181022190402-e5e69e061d4f/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= +github.com/ugorji/go/codec v1.1.7 h1:2SvQaVZ1ouYrrKKwoSk2pzd4A9evlKJb9oTL+OaLUSs= github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= -github.com/ugorji/go/codec v1.2.6 h1:7kbGefxLoDBuYXOms4yD7223OpNMMPNPZxXk5TvFcyQ= -github.com/ugorji/go/codec v1.2.6/go.mod h1:V6TCNZ4PHqoHGFZuSG1W8nrCzzdgA2DozYxWFFpvxTw= github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2 h1:eY9dn8+vbi4tKz5Qo6v2eYzo7kUS51QINcR5jNpbZS8= github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= -go.etcd.io/bbolt v1.3.2 h1:Z/90sZLPOeCy2PwprqkFa25PdkusRzaj9P8zm/KNyvk= -go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= +github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= go.uber.org/atomic v1.4.0 h1:cxzIVoETapQEqDhQu3QfnvXAV4AlzcvUCxkVUFw3+EU= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/multierr v1.1.0 h1:HoEmRHQPVSqub6w2z2d2EOVs2fjyFRGyofhKuyDq0QI= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= go.uber.org/zap v1.10.0 h1:ORx85nbTijNz8ljznvCMR1ZBIPKFn3jQrag10X2AsuM= go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= +golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/arch v0.0.0-20201008161808-52c3e6f60cff h1:XmKBi9R6duxOB3lfc72wyrwiOY7X2Jl1wuI+RFOyMDE= +golang.org/x/arch v0.0.0-20201008161808-52c3e6f60cff/go.mod h1:flIaEI6LNU6xOCD5PaJvn9wGP0agmIOqjrtsKGRguv4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97 h1:/UOmuWzQfxxo9UtlXMwuQU8CMgg1eZXqTRwkSQJWKOI= golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +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/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3/go.mod h1:3p9vT2HGsQu2K1YbXdKPJLVgG5VJdoTa1poYQBtP1AY= +golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= +golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20210226172049-e18ecbb05110 h1:qWPm9rbaAMKs8Bq/9LRpbMqxWRVUAQwMI9fVrssnTfw= +golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= +golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220722155237-a158d28d115b h1:PxfKdU9lEEDYjdIzOtC4qFWgkU2rGHdKlKowJSMN9h0= +golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= 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/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181228144115-9a3f9b0469bb/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c h1:F1jZWGFhYfh0Ci55sIpILtKKK8p3i2/krTr0H1rg74I= golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220319134239-a9b59b0215f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220422013727-9388b58f7150/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f h1:v4INt8xihDGvnrfjMDVXGxw9wrfxYyCjk0KbXjhR55s= +golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.6 h1:aRYxNxv6iGQlyVaZmk6ZgYEDa+Jg18DxebPSrd6bg1M= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk= +golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c h1:fqgJT0MGcGpPgpWU7VRdRjuArfcOvC4AoJmILihzhDg= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4= +golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.1.10/go.mod h1:Uh6Zz+xoGYZom868N8YTex3t7RhtHDBrE8Gzo9bV56E= +golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= 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/genproto v0.0.0-20180817151627-c66870c02cf8 h1:Nw54tB0rB7hY/N0NQvRW8DG4Yk3Q6T9cu9RcFQDu1tc= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.21.0 h1:G+97AoqBnmZIT91cLG/EkCoK9NSelj64P8bOHHNmGn0= google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= +google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= +google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= +google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= +google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= +google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= +google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.27.1 h1:SnqbnDw1V7RiZcXPx5MEeqPv2s79L9i7BJUlG/+RurQ= -google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +google.golang.org/protobuf v1.28.0 h1:w43yiav+6bVFTBQFZX0r7ipe9JQ1QsbMgHwbBziscLw= +google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo= +gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= gopkg.in/go-playground/assert.v1 v1.2.1/go.mod h1:9RXL0bg/zibRAgZUYszZSwO/z8Y/a8bDuhia5mkpMnE= gopkg.in/go-playground/validator.v8 v8.18.2/go.mod h1:RX2a/7Ha8BgOhfk7j780h4/u/RRjR0eouCJSH80/M2Y= gopkg.in/ini.v1 v1.42.0 h1:7N3gPTt50s8GuLortA00n8AqRTk75qOP98+mTPpgzRk= gopkg.in/ini.v1 v1.42.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= +gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= -gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= diff --git a/hack/e2e-mysql5.sh b/hack/e2e-mysql5.sh new file mode 100755 index 00000000..e35cceee --- /dev/null +++ b/hack/e2e-mysql5.sh @@ -0,0 +1,121 @@ +#!/bin/bash + +set -euo pipefail + +# prepare env +if [ $(ls $HOME/go/bin/|grep ginkgo|wc -l) -eq 0 ];then + go install github.com/onsi/ginkgo/v2/ginkgo@v2.3.1 +fi + +# prepare etcd env +# shellcheck disable=SC2069 + +function check_pid() { + value=$1 + pid_num=$(ps aux|grep "$value"|grep -v 'grep'|wc -l) + echo $pid_num +} + +function check_mysql_dir() { + value=$1 + pid_num=$(ps aux|grep etcd|grep -v 'grep'|wc -l) + dir_num=$(ls /data/mysql/|grep "$value"|wc -l) + echo $dir_num +} + +if [ $(check_pid "etcd") -eq 0 ];then + etcd --data-dir bin/etcd 2>&1 &>>bin/etcd.log & +fi + +# Start 2 Mysql Cluster +# Cluster-1: 3319(master), 3329(slave), 3339(slave) +# Prepare Cluster-1 for master +if [ $(check_mysql_dir "3319") -eq 0 ];then + cp ./tests/docker/mysql5/my3319.cnf /data/etc/my3319.cnf + mysqld --defaults-file=/data/etc/my3319.cnf --user=work --initialize-insecure + mysqld --defaults-file=/data/etc/my3319.cnf --user=work & + sleep 3 + mysql -h127.0.0.1 -P3319 -uroot -S/data/tmp/mysql3319.sock <&1 &>>bin/etcd.log & +fi + +# Start 2 Mysql Cluster +# Cluster-1: 3319(master), 3329(slave), 3339(slave) +# Prepare Cluster-1 for master +if [ $(check_mysql_dir "3319") -eq 0 ];then + cp ./tests/docker/mysql8/my3319.cnf /data/etc/my3319.cnf + mysqld --defaults-file=/data/etc/my3319.cnf --user=work --initialize-insecure + mysqld --defaults-file=/data/etc/my3319.cnf --user=work & + sleep 3 + mysql -h127.0.0.1 -P3319 -uroot -S/data/tmp/mysql3319.sock <> $f + fi +done diff --git a/hack/update_e2e.sh b/hack/update_e2e.sh new file mode 100755 index 00000000..70187df3 --- /dev/null +++ b/hack/update_e2e.sh @@ -0,0 +1,18 @@ +#!/bin/bash + +set -o errexit +set -o nounset +set -o pipefail + +MASTER_USER=$1 +MASTER_PASSWORD=$2 +ROOTDIR="$(cd "$(dirname "${BASH_SOURCE[0]}")"/.. && pwd)" + +cd $ROOTDIR +echo $ROOTDIR + +cp ./bin/gaea ./tests/e2e/cmd/ +sed -i "s#^master_user.*#master_user: $MASTER_USER#" ./tests/e2e/config/config.yaml +sed -i "s#^master_password.*#master_user: $MASTER_PASSWORD#" ./tests/e2e/config/config.yaml +sed -i "s#^slave_user.*#slave_user: $MASTER_USER#" ./tests/e2e/config/config.yaml +sed -i "s#^slave_password.*#slave_user: $MASTER_PASSWORD#" ./tests/e2e/config/config.yaml diff --git a/hack/verify-EOF.sh b/hack/verify-EOF.sh new file mode 100755 index 00000000..70321367 --- /dev/null +++ b/hack/verify-EOF.sh @@ -0,0 +1,41 @@ +#!/bin/bash + +set -o errexit +set -o nounset +set -o pipefail + +ROOTDIR="$(cd "$(dirname "${BASH_SOURCE[0]}")"/.. && pwd)" + +cd $ROOTDIR + +FILELIST=($(find . -type f -not \( -path './bin/*' \ + -o -path './etc/*' \ + -o -path './.git/*' \ + -o -path '*.png' \ + -o -path './.idea/*' \ + -o -path './.DS_Store' \ + -o -path './*/.DS_Store' \ + -o -path './docs/*' \ + -o -path './logs/*' \ + -o -path './parser/goyacc' \ + -o -path './tests/e2e/cmd/*' \ + \))) + +NUM=0 +declare FAILED_FILE + +for f in ${FILELIST[@]}; do + c=$(tail -c 1 "$f" | wc -l) + if [ "$c" -eq 0 ]; then + FAILED_FILE+=($f) + NUM=$((NUM + 1)) + fi +done + +if [ $NUM -ne 0 ]; then + echo "error: following files do not end with newline, please run hack/update-EOF.sh to fix them" + printf '%s\n' "${FAILED_FILE[@]}" + exit 1 +else + echo "all files pass checking." +fi diff --git a/hack/verify-spelling.sh b/hack/verify-spelling.sh new file mode 100755 index 00000000..2ec772c5 --- /dev/null +++ b/hack/verify-spelling.sh @@ -0,0 +1,29 @@ +#!/bin/bash + +set -o errexit +set -o nounset +set -o pipefail + +ROOT=$(unset CDPATH && cd $(dirname "${BASH_SOURCE[0]}")/.. && pwd) +cd $ROOT +OUTPUT_BIN=$ROOT/bin/output/ +mkdir -p $OUTPUT_BIN + +# ensure_misspell +echo "Installing misspell..." +GOBIN=$OUTPUT_BIN go install github.com/client9/misspell/cmd/misspell@v0.3.4 + + +ignore_words=( + "importas" + "etc" +) + +ret=0 +git ls-files | xargs ${OUTPUT_BIN}/misspell -i ${ignore_words[@]} -error -o stderr || ret=$? +if [ $ret -eq 0 ]; then + echo "Spellings all good!" +else + echo "Found some typos, please fix them!" + exit 1 +fi diff --git a/log/logger.go b/log/logger.go index ee94448e..9862aabf 100644 --- a/log/logger.go +++ b/log/logger.go @@ -16,10 +16,14 @@ package log import ( "fmt" - "github.com/XiaoMi/Gaea/log/xlog" ) +const ( + DefaultLogKeepDays = 3 + DefaultLogKeepCounts = 72 +) + var logger Logger // Logger is the log interface diff --git a/log/logger_test.go b/log/logger_test.go new file mode 100644 index 00000000..218a564a --- /dev/null +++ b/log/logger_test.go @@ -0,0 +1,218 @@ +package log + +import ( + "bytes" + "fmt" + "strings" + "testing" + + "github.com/stretchr/testify/assert" +) + +// MockLogger is a mock implementation of the Logger interface for testing purposes. +type MockLogger struct { + output *bytes.Buffer +} + +func NewMockLogger() *MockLogger { + return &MockLogger{output: new(bytes.Buffer)} +} + +func (ml *MockLogger) SetLevel(name, level string) error { + return nil +} + +func (ml *MockLogger) Debug(format string, a ...interface{}) (err error) { + _, err = fmt.Fprintf(ml.output, format+"\n", a...) + return +} + +func (ml *MockLogger) Trace(format string, a ...interface{}) (err error) { + _, err = fmt.Fprintf(ml.output, format+"\n", a...) + return +} + +func (ml *MockLogger) Notice(format string, a ...interface{}) (err error) { + _, err = fmt.Fprintf(ml.output, format+"\n", a...) + return +} + +func (ml *MockLogger) Warn(format string, a ...interface{}) (err error) { + _, err = fmt.Fprintf(ml.output, format+"\n", a...) + return +} + +func (ml *MockLogger) Fatal(format string, a ...interface{}) (err error) { + _, err = fmt.Fprintf(ml.output, format+"\n", a...) + return +} + +func (ml *MockLogger) Debugx(logID, format string, a ...interface{}) (err error) { + _, err = fmt.Fprintf(ml.output, "[%s] "+format+"\n", append([]interface{}{logID}, a...)...) + return +} + +func (ml *MockLogger) Tracex(logID, format string, a ...interface{}) (err error) { + _, err = fmt.Fprintf(ml.output, "[%s] "+format+"\n", append([]interface{}{logID}, a...)...) + return +} + +func (ml *MockLogger) Noticex(logID, format string, a ...interface{}) (err error) { + _, err = fmt.Fprintf(ml.output, "[%s] "+format+"\n", append([]interface{}{logID}, a...)...) + return +} + +func (ml *MockLogger) Warnx(logID, format string, a ...interface{}) (err error) { + _, err = fmt.Fprintf(ml.output, "[%s] "+format+"\n", append([]interface{}{logID}, a...)...) + return +} + +func (ml *MockLogger) Fatalx(logID, format string, a ...interface{}) (err error) { + _, err = fmt.Fprintf(ml.output, "[%s] "+format+"\n", append([]interface{}{logID}, a...)...) + return +} + +func (ml *MockLogger) Close() { + // No-op for now +} + +func TestSetGlobalLogger(t *testing.T) { + assert := assert.New(t) + + // Create a mock logger + mockLogger := NewMockLogger() + + // Set the global logger + SetGlobalLogger(mockLogger) + + // Check that the global logger is set correctly + assert.Equal(mockLogger, logger) + + // Reset the global logger + SetGlobalLogger(nil) + + // Check that the global logger is reset + assert.Nil(logger) +} + +func TestLoggingFunctions(t *testing.T) { + assert := assert.New(t) + + // Create a mock logger + mockLogger := NewMockLogger() + SetGlobalLogger(mockLogger) + + // Define test cases for each logging function + testCases := []struct { + name string + logFunc func(string, ...interface{}) error + expectedOut string + }{ + { + name: "Debug", + logFunc: Debug, + expectedOut: "message", + }, + { + name: "Trace", + logFunc: Trace, + expectedOut: "message", + }, + { + name: "Notice", + logFunc: Notice, + expectedOut: "message", + }, + { + name: "Warn", + logFunc: Warn, + expectedOut: "message", + }, + { + name: "Fatal", + logFunc: Fatal, + expectedOut: "message", + }, + } + + // Run test cases + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + err := tc.logFunc("message") + assert.NoError(err) + assert.Equal(tc.expectedOut, strings.TrimSpace(mockLogger.output.String())) + mockLogger.output.Reset() // Reset buffer for next test case + }) + } +} + +func TestLoggingWithFormat(t *testing.T) { + assert := assert.New(t) + + // Create a mock logger + mockLogger := NewMockLogger() + SetGlobalLogger(mockLogger) + + // Define test cases for each logging function with format + testCases := []struct { + name string + logFunc func(string, ...interface{}) error + args []interface{} + expectedOut string + }{ + { + name: "Debug with format", + logFunc: func(f string, a ...interface{}) error { return Debug(f, a...) }, + args: []interface{}{"formatted %s", "arg"}, + expectedOut: "formatted arg", + }, + { + name: "Trace with format", + logFunc: func(f string, a ...interface{}) error { return Trace(f, a...) }, + args: []interface{}{"formatted %s", "arg"}, + expectedOut: "formatted arg", + }, + { + name: "Notice with format", + logFunc: func(f string, a ...interface{}) error { return Notice(f, a...) }, + args: []interface{}{"formatted %s", "arg"}, + expectedOut: "formatted arg", + }, + { + name: "Warn with format", + logFunc: func(f string, a ...interface{}) error { return Warn(f, a...) }, + args: []interface{}{"formatted %s", "arg"}, + expectedOut: "formatted arg", + }, + { + name: "Fatal with format", + logFunc: func(f string, a ...interface{}) error { return Fatal(f, a...) }, + args: []interface{}{"formatted %s", "arg"}, + expectedOut: "formatted arg", + }, + } + + // Run test cases + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + err := tc.logFunc(tc.args[0].(string), tc.args[1]) + assert.NoError(err) + assert.Equal(tc.expectedOut, strings.TrimSpace(mockLogger.output.String())) + mockLogger.output.Reset() // Reset buffer for next test case + }) + } +} + +func TestClose(t *testing.T) { + assert := assert.New(t) + + // Create a mock logger + mockLogger := NewMockLogger() + SetGlobalLogger(mockLogger) + + // Call Close method + Close() + + // Ensure the logger is closed + assert.True(true) // We can't check exactly what happens inside Close(), so we just ensure it doesn't panic +} diff --git a/log/xlog/console.go b/log/xlog/console.go index 0bdd48f4..f17282bc 100644 --- a/log/xlog/console.go +++ b/log/xlog/console.go @@ -221,7 +221,7 @@ func (p *XConsoleLog) debugx(logID, format string, a ...interface{}) error { } // Close implements XLogger -//关闭日志库。注意:如果没有调用Close()关闭日志库的话,将会造成文件句柄泄露 +// 关闭日志库。注意:如果没有调用Close()关闭日志库的话,将会造成文件句柄泄露 func (p *XConsoleLog) Close() { } diff --git a/log/xlog/console_test.go b/log/xlog/console_test.go new file mode 100644 index 00000000..ccb22798 --- /dev/null +++ b/log/xlog/console_test.go @@ -0,0 +1,231 @@ +package xlog + +import ( + "bytes" + "fmt" + "io/ioutil" + "os" + "strings" + "testing" +) + +func TestNewXConsoleLog(t *testing.T) { + logger := NewXConsoleLog() + if logger == nil { + t.Error("Expected logger to be non-nil") + } +} + +func TestInit(t *testing.T) { + config := map[string]string{ + "level": "info", + } + logger := &XConsoleLog{} + err := logger.Init(config) + if err != nil { + t.Errorf("Unexpected error: %v", err) + } + if logger.level != NoticeLevel { + t.Errorf("Expected level to be %d, but got %d", NoticeLevel, logger.level) + } +} + +func TestSetLevel(t *testing.T) { + logger := &XConsoleLog{} + logger.SetLevel("fatal") + if logger.level != FatalLevel { + t.Errorf("Expected level to be %d, but got %d", FatalLevel, logger.level) + } +} + +func TestSetSkip(t *testing.T) { + logger := &XConsoleLog{} + logger.SetSkip(2) + if logger.skip != 2 { + t.Errorf("Expected skip to be 2, but got %d", logger.skip) + } +} + +func TestConoleReOpen(t *testing.T) { + logger := &XConsoleLog{} + err := logger.ReOpen() + if err != nil { + t.Errorf("Unexpected error: %v", err) + } +} + +func TestConsoleWarn(t *testing.T) { + var buf bytes.Buffer + old := os.Stdout + oldErr := os.Stderr + r, w, _ := os.Pipe() + os.Stdout = w + os.Stderr = w + defer func() { + os.Stdout = old + os.Stderr = oldErr + }() + outC := make(chan string) + go func() { + data, _ := ioutil.ReadAll(r) + outC <- string(data) + }() + + logger := &XConsoleLog{} + logger.Warn("test warning message") + os.Stdout.Close() + buf.WriteString(<-outC) + expected := "test warning message" + if !strings.Contains(strings.TrimSpace(buf.String()), strings.TrimSpace(expected)) { + t.Errorf("Expected output '%s', but got '%s'", expected, buf.String()) + } +} + +func TestConsoleFatal(t *testing.T) { + var buf bytes.Buffer + old := os.Stdout + oldErr := os.Stderr + r, w, _ := os.Pipe() + os.Stdout = w + os.Stderr = w + defer func() { + os.Stdout = old + os.Stderr = oldErr + }() + outC := make(chan string) + go func() { + data, _ := ioutil.ReadAll(r) + outC <- string(data) + }() + + logger := &XConsoleLog{} + logger.Fatal("test fatal message") + os.Stdout.Close() + buf.WriteString(<-outC) + expected := "test fatal message" + if !strings.Contains(strings.TrimSpace(buf.String()), strings.TrimSpace(expected)) { + t.Errorf("Expected output '%s', but got '%s'", expected, buf.String()) + } +} + +func TestConsoleNotice(t *testing.T) { + var buf bytes.Buffer + old := os.Stdout + oldErr := os.Stderr + r, w, _ := os.Pipe() + os.Stdout = w + os.Stderr = w + defer func() { + os.Stdout = old + os.Stderr = oldErr + }() + outC := make(chan string) + go func() { + data, _ := ioutil.ReadAll(r) + outC <- string(data) + }() + + logger := &XConsoleLog{} + logger.Notice("test notice message") + os.Stdout.Close() + buf.WriteString(<-outC) + expected := "test notice message" + if !strings.Contains(strings.TrimSpace(buf.String()), strings.TrimSpace(expected)) { + t.Errorf("Expected output '%s', but got '%s'", expected, buf.String()) + } +} + +func TestConsoleTrace(t *testing.T) { + var buf bytes.Buffer + old := os.Stdout + oldErr := os.Stderr + r, w, _ := os.Pipe() + os.Stdout = w + os.Stderr = w + defer func() { + os.Stdout = old + os.Stderr = oldErr + }() + outC := make(chan string) + go func() { + data, _ := ioutil.ReadAll(r) + outC <- string(data) + }() + + logger := &XConsoleLog{} + logger.Trace("test trace message") + os.Stdout.Close() + buf.WriteString(<-outC) + expected := "test trace message" + if !strings.Contains(strings.TrimSpace(buf.String()), strings.TrimSpace(expected)) { + t.Errorf("Expected output '%s', but got '%s'", expected, buf.String()) + } +} + +func TestConsoleDebug(t *testing.T) { + var buf bytes.Buffer + old := os.Stdout + oldErr := os.Stderr + r, w, _ := os.Pipe() + os.Stdout = w + os.Stderr = w + defer func() { + os.Stdout = old + os.Stderr = oldErr + }() + outC := make(chan string) + go func() { + data, _ := ioutil.ReadAll(r) + outC <- string(data) + }() + + logger := &XConsoleLog{} + logger.Debug("test debug message") + os.Stdout.Close() + buf.WriteString(<-outC) + expected := "test debug message" + if !strings.Contains(strings.TrimSpace(buf.String()), strings.TrimSpace(expected)) { + t.Errorf("Expected output '%s', but got '%s'", expected, buf.String()) + } +} + +func TestGetHost(t *testing.T) { + logger := &XConsoleLog{} + logger.hostname = "localhost" + if logger.GetHost() != "localhost" { + t.Errorf("Expected host to be 'localhost', but got '%s'", logger.GetHost()) + } +} + +func TestNoticeWrite(t *testing.T) { + var buf bytes.Buffer + old := os.Stdout + oldErr := os.Stderr + r, w, _ := os.Pipe() + os.Stdout = w + os.Stderr = w + defer func() { + os.Stdout = old + os.Stderr = oldErr + }() + outC := make(chan string) + go func() { + data, _ := ioutil.ReadAll(r) + outC <- string(data) + }() + + logger := &XConsoleLog{} + logger.write(NoticeLevel, new(string), "") + expected := "" + if !strings.Contains(strings.TrimSpace(buf.String()), strings.TrimSpace(expected)) { + t.Errorf("Expected output '%s', but got '%s'", expected, buf.String()) + } +} + +func TestMain(m *testing.M) { + // Initialize any necessary resources here if needed + fmt.Println("Running tests...") + result := m.Run() + // Clean up any resources after all tests have run + os.Exit(result) +} diff --git a/log/xlog/file.go b/log/xlog/file.go index 8afc8b3e..bcc3fca6 100644 --- a/log/xlog/file.go +++ b/log/xlog/file.go @@ -15,9 +15,11 @@ package xlog import ( + "context" "fmt" "os" "path/filepath" + "regexp" "strconv" "sync" "time" @@ -37,18 +39,20 @@ type XFileLog struct { service string split sync.Once mu sync.Mutex + Cancel context.CancelFunc } // constants of XFileLog const ( XFileLogDefaultLogID = "900000001" SpliterDelay = 5 - CleanDays = -3 + DefaultLogKeepDays = 3 + DefaultLogKeepCounts = 72 ) // NewXFileLog is the constructor of XFileLog -//生成一个日志实例,service用来标识业务的服务名。 -//比如:logger := xlog.NewXFileLog("gaea") +// 生成一个日志实例,service用来标识业务的服务名。 +// 比如:logger := xlog.NewXFileLog("gaea") func NewXFileLog() XLogger { return &XFileLog{ skip: XLogDefSkipNum, @@ -57,7 +61,6 @@ func NewXFileLog() XLogger { // Init implements XLogger func (p *XFileLog) Init(config map[string]string) (err error) { - path, ok := config["path"] if !ok { err = fmt.Errorf("init XFileLog failed, not found path") @@ -82,7 +85,7 @@ func (p *XFileLog) Init(config map[string]string) (err error) { } runtime, ok := config["runtime"] - if !ok || runtime == "true" || runtime == "TRUE" { + if (!ok || runtime == "true" || runtime == "TRUE") && LevelFromStr(config["level"]) == DebugLevel { p.runtime = true } else { p.runtime = false @@ -110,8 +113,20 @@ func (p *XFileLog) Init(config map[string]string) (err error) { hostname, _ := os.Hostname() p.hostname = hostname + + logKeepDays := DefaultLogKeepDays + if days, err := strconv.Atoi(config["log_keep_days"]); err == nil && days != 0 { + logKeepDays = days + } + + logKeepCounts := DefaultLogKeepCounts + if counts, err := strconv.Atoi(config["log_keep_counts"]); err == nil && counts != 0 { + logKeepCounts = counts + } + var ctx context.Context + ctx, p.Cancel = context.WithCancel(context.Background()) body := func() { - go p.spliter() + go p.spliter(ctx, logKeepDays, logKeepCounts) } doSplit, ok := config["dosplit"] if !ok { @@ -124,17 +139,22 @@ func (p *XFileLog) Init(config map[string]string) (err error) { } // split the log file -func (p *XFileLog) spliter() { +func (p *XFileLog) spliter(ctx context.Context, keepDays int, logKeepCounts int) { preHour := time.Now().Hour() splitTime := time.Now().Format("2006010215") defer p.Close() for { - time.Sleep(time.Second * SpliterDelay) - if time.Now().Hour() != preHour { - p.clean() - p.rename(splitTime) - preHour = time.Now().Hour() - splitTime = time.Now().Format("2006010215") + select { + case <-ctx.Done(): + return + case <-time.After(time.Second * SpliterDelay): + p.clean(keepDays, logKeepCounts) + if time.Now().Hour() != preHour { + p.clean(keepDays, logKeepCounts) + p.rename(splitTime) + preHour = time.Now().Hour() + splitTime = time.Now().Format("2006010215") + } } } } @@ -170,19 +190,32 @@ func delayClose(fp *os.File) { fp.Close() } -func (p *XFileLog) clean() (err error) { - deadline := time.Now().AddDate(0, 0, CleanDays) +func (p *XFileLog) clean(keepDays int, logKeepCounts int) (err error) { + deadline := time.Now().AddDate(0, 0, -1*keepDays) + fileTypeMap := make(map[string]int) var files []string files, err = filepath.Glob(fmt.Sprintf("%s/%s.log*", p.path, p.filename)) if err != nil { return } var fileInfo os.FileInfo - for _, file := range files { - if filepath.Base(file) == fmt.Sprintf("%s.log", p.filename) { + for i := len(files) - 1; i >= 0; i-- { + file := files[i] + if canSkipClean(filepath.Base(file), p.filename) { continue } - if filepath.Base(file) == fmt.Sprintf("%s.log.wf", p.filename) { + + reg := regexp.MustCompile("[0-9]+") + fileType := reg.ReplaceAllString(file, "") + fileTypeMap[fileType]++ + if fileTypeMap[fileType] > logKeepCounts { + _ = os.Remove(file) + fileTypeMap[fileType]-- + } + } + + for _, file := range files { + if canSkipClean(filepath.Base(file), p.filename) { continue } if fileInfo, err = os.Stat(file); err == nil { @@ -196,37 +229,29 @@ func (p *XFileLog) clean() (err error) { return } -func (p *XFileLog) rename(shuffix string) (err error) { +func (p *XFileLog) rename(suffix string) { p.mu.Lock() defer p.mu.Unlock() defer p.ReOpen() if p.file == nil { return } - var fileInfo os.FileInfo normalLog := p.path + "/" + p.filename + ".log" warnLog := normalLog + ".wf" - newLog := fmt.Sprintf("%s/%s.log-%s.log", p.path, p.filename, shuffix) - newWarnLog := fmt.Sprintf("%s/%s.log.wf-%s.log.wf", p.path, p.filename, shuffix) - if fileInfo, err = os.Stat(normalLog); err == nil && fileInfo.Size() == 0 { - return - } - if _, err = os.Stat(newLog); err == nil { - return - } - if err = os.Rename(normalLog, newLog); err != nil { - return - } - if fileInfo, err = os.Stat(warnLog); err == nil && fileInfo.Size() == 0 { - return - } - if _, err = os.Stat(newWarnLog); err == nil { - return + newLog := fmt.Sprintf("%s/%s.log-%s.log", p.path, p.filename, suffix) + newWarnLog := fmt.Sprintf("%s/%s.log.wf-%s.log.wf", p.path, p.filename, suffix) + _ = removeFile(normalLog, newLog) + _ = removeFile(warnLog, newWarnLog) +} + +func removeFile(oldFile string, newFile string) (err error) { + if fileInfo, err := os.Stat(oldFile); err == nil && fileInfo.Size() == 0 { + return nil } - if err = os.Rename(warnLog, newWarnLog); err != nil { - return + if _, err = os.Stat(newFile); err == nil { + return nil } - return + return os.Rename(oldFile, newFile) } // ReOpen implements XLogger @@ -388,6 +413,8 @@ func (p *XFileLog) Close() { p.errFile.Close() p.errFile = nil } + + p.Cancel() } // GetHost getter of hostname @@ -397,9 +424,9 @@ func (p *XFileLog) GetHost() string { func (p *XFileLog) write(level int, msg *string, logID string) error { levelText := levelTextArray[level] - time := time.Now().Format("2006-01-02 15:04:05") + time := time.Now().Format("2006-01-02 15:04:05.000") - logText := formatLog(msg, time, p.service, p.hostname, levelText, logID) + logText := formatLog(msg, time, levelText, logID) file := p.file if level >= WarnLevel { file = p.errFile @@ -416,3 +443,20 @@ func isDir(path string) (bool, error) { } return stat.IsDir(), nil } + +// canSkipClean check if filename can be skipped by log clean +func canSkipClean(file string, filePrefix string) bool { + skipList := []string{ + filePrefix + ".log", + filePrefix + "_sql.log", + filePrefix + ".log.wf", + filePrefix + "_sql.log.wf", + } + + for _, s := range skipList { + if file == s { + return true + } + } + return false +} diff --git a/log/xlog/logger_test.go b/log/xlog/logger_test.go new file mode 100644 index 00000000..3f6f38e1 --- /dev/null +++ b/log/xlog/logger_test.go @@ -0,0 +1,204 @@ +package xlog + +import ( + "fmt" + "os" + "sync" + "testing" +) + +const TEST_FILE = "/Users/yangming/project/gaea.xiaomi/log/xlog/test.log" + +func BenchmarkXLoggerWriter(b *testing.B) { + f, _ := os.OpenFile(TEST_FILE, os.O_RDWR|os.O_CREATE, 0666) + l := &XFileLog{} + l.file = f + g := sync.WaitGroup{} + for n := 0; n < b.N; n++ { + g.Add(1) + go func() { + defer g.Done() + l.Notice("ns=test_namespace_1, root@127.0.0.1:61855->10.38.164.125:3308/, mysql_connect_id=1637760|select sleep(3)") + }() + } + g.Wait() +} + +// MockLogger 是 XLogger 的一个模拟实现 +type MockLogger struct { + lock sync.RWMutex +} + +func newMockLogger() XLogger { + return &MockLogger{ + lock: sync.RWMutex{}, + } +} + +func (m *MockLogger) Init(config map[string]string) error { return nil } +func (m *MockLogger) ReOpen() error { return nil } +func (m *MockLogger) SetLevel(level string) {} +func (m *MockLogger) Warn(format string, a ...interface{}) error { + fmt.Println("Warn:", fmt.Sprintf(format, a...)) + return nil +} +func (m *MockLogger) Fatal(format string, a ...interface{}) error { + fmt.Println("Fatal:", fmt.Sprintf(format, a...)) + return nil +} +func (m *MockLogger) Notice(format string, a ...interface{}) error { + fmt.Println("Notice:", fmt.Sprintf(format, a...)) + return nil +} +func (m *MockLogger) Trace(format string, a ...interface{}) error { + fmt.Println("Trace:", fmt.Sprintf(format, a...)) + return nil +} +func (m *MockLogger) Debug(format string, a ...interface{}) error { + fmt.Println("Debug:", fmt.Sprintf(format, a...)) + return nil +} +func (m *MockLogger) Warnx(logID, format string, a ...interface{}) error { + fmt.Println("Warnx:", fmt.Sprintf(format, a...)) + return nil +} +func (m *MockLogger) Fatalx(logID, format string, a ...interface{}) error { + fmt.Println("Fatalx:", fmt.Sprintf(format, a...)) + return nil +} +func (m *MockLogger) Noticex(logID, format string, a ...interface{}) error { + fmt.Println("Noticex:", fmt.Sprintf(format, a...)) + return nil +} +func (m *MockLogger) Tracex(logID, format string, a ...interface{}) error { + fmt.Println("Tracex:", fmt.Sprintf(format, a...)) + return nil +} +func (m *MockLogger) Debugx(logID, format string, a ...interface{}) error { + fmt.Println("Debugx:", fmt.Sprintf(format, a...)) + return nil +} +func (m *MockLogger) Close() {} +func (m *MockLogger) SetSkip(int) {} + +func newMockConfig() map[string]string { + return map[string]string{ + "level": "notice", + } +} + +func TestCreateLogManager(t *testing.T) { + mgr, err := CreateLogManager("console", newMockConfig()) + if err != nil { + t.Fatalf("Failed to create log manager: %v", err) + } + if mgr == nil { + t.Error("Expected non-nil LogManager") + } +} + +func TestRegisterLogger(t *testing.T) { + mgr, _ := CreateLogManager("console", newMockConfig()) + err := mgr.RegisterLogger("testLogger", newMockLogger()) + if err != nil { + t.Fatalf("Failed to register logger: %v", err) + } +} + +func TestEnableLogger(t *testing.T) { + mgr, _ := CreateLogManager("console", newMockConfig()) + mgr.RegisterLogger("testLogger", newMockLogger()) + err := mgr.EnableLogger("testLogger", true) + if err != nil { + t.Fatalf("Failed to enable logger: %v", err) + } +} + +func TestGetLogger(t *testing.T) { + mgr, _ := CreateLogManager("console", newMockConfig()) + mgr.RegisterLogger("testLogger", newMockLogger()) + logger, err := mgr.GetLogger("testLogger") + if err != nil { + t.Fatalf("Failed to get logger: %v", err) + } + if logger == nil { + t.Error("Expected non-nil Logger") + } +} + +func TestReOpen(t *testing.T) { + mgr, _ := CreateLogManager("console", newMockConfig()) + mgr.RegisterLogger("testLogger", newMockLogger()) + err := mgr.EnableLogger("testLogger", true) + if err != nil { + t.Fatalf("Failed to enable logger: %v", err) + } + err = mgr.ReOpen() + if err != nil && err.Error() != "" { + t.Fatalf("Failed to re-open logger: %v", err) + } +} + +func TestSetLevelAll(t *testing.T) { + mgr, _ := CreateLogManager("console", newMockConfig()) + mgr.RegisterLogger("testLogger", newMockLogger()) + mgr.EnableLogger("testLogger", true) + mgr.SetLevelAll("Debug") +} + +func TestWarn(t *testing.T) { + mgr, _ := CreateLogManager("console", newMockConfig()) + mgr.RegisterLogger("testLogger", newMockLogger()) + mgr.EnableLogger("testLogger", true) + err := mgr.Warn("Test warn message") + if err != nil { + t.Fatalf("Failed to call Warn: %v", err) + } +} + +func TestFatal(t *testing.T) { + mgr, _ := CreateLogManager("console", newMockConfig()) + mgr.RegisterLogger("testLogger", newMockLogger()) + mgr.EnableLogger("testLogger", true) + err := mgr.Fatal("Test fatal message") + if err != nil { + t.Fatalf("Failed to call Fatal: %v", err) + } +} + +func TestNotice(t *testing.T) { + mgr, _ := CreateLogManager("console", newMockConfig()) + mgr.RegisterLogger("testLogger", newMockLogger()) + mgr.EnableLogger("testLogger", true) + err := mgr.Notice("Test notice message") + if err != nil { + t.Fatalf("Failed to call Notice: %v", err) + } +} + +func TestTrace(t *testing.T) { + mgr, _ := CreateLogManager("console", newMockConfig()) + mgr.RegisterLogger("testLogger", newMockLogger()) + mgr.EnableLogger("testLogger", true) + err := mgr.Trace("Test trace message") + if err != nil { + t.Fatalf("Failed to call Trace: %v", err) + } +} + +func TestDebug(t *testing.T) { + mgr, _ := CreateLogManager("console", newMockConfig()) + mgr.RegisterLogger("testLogger", newMockLogger()) + mgr.EnableLogger("testLogger", true) + err := mgr.Debug("Test debug message") + if err != nil { + t.Fatalf("Failed to call Debug: %v", err) + } +} + +func TestClose(t *testing.T) { + mgr, _ := CreateLogManager("console", newMockConfig()) + mgr.RegisterLogger("testLogger", newMockLogger()) + mgr.EnableLogger("testLogger", true) + mgr.Close() +} diff --git a/log/xlog/util.go b/log/xlog/util.go index 9b82b972..0911ebe7 100644 --- a/log/xlog/util.go +++ b/log/xlog/util.go @@ -18,6 +18,7 @@ import ( "bytes" "errors" "fmt" + "regexp" "runtime" "strconv" "strings" @@ -109,8 +110,13 @@ func formatLineInfo(runtime bool, functionName, filename, logText string, lineno var buffer bytes.Buffer if runtime { buffer.WriteString("[") + if strings.HasPrefix(functionName, "github") { + functionName = strings.TrimLeft(functionName, "github.com/XiaoMi/") + } + reg, _ := regexp.Compile("\\..*$") + functionName = reg.ReplaceAllString(functionName, "") buffer.WriteString(functionName) - buffer.WriteString(":") + buffer.WriteString("/") buffer.WriteString(filename) buffer.WriteString(":") diff --git a/log/xlog/util_test.go b/log/xlog/util_test.go new file mode 100644 index 00000000..de3c303d --- /dev/null +++ b/log/xlog/util_test.go @@ -0,0 +1,84 @@ +package xlog + +import ( + "strings" + "testing" +) + +func TestLevelFromStr(t *testing.T) { + tests := []struct { + input string + expected int + }{ + {"debug", DebugLevel}, + {"trace", TraceLevel}, + {"notice", NoticeLevel}, + {"warn", WarnLevel}, + {"fatal", FatalLevel}, + {"none", NoneLevel}, + {"unknown", NoticeLevel}, // unknown level should default to NOTICE + } + + for _, test := range tests { + result := LevelFromStr(test.input) + if result != test.expected { + t.Errorf("LevelFromStr(%q) = %d; want %d", test.input, result, test.expected) + } + } +} + +func TestGetRuntimeInfo(t *testing.T) { + _, _, lineno := getRuntimeInfo(XLogDefSkipNum) + if lineno < 0 { + t.Errorf("getRuntimeInfo returned invalid line number: %d", lineno) + } +} + +func TestFormatLog(t *testing.T) { + body := "Test log message" + fields := []string{"field1", "field2"} + logMessage := formatLog(&body, fields[0], fields[1]) + expected := "[field1] [field2] Test log message\n" + if logMessage != expected { + t.Errorf("formatLog returned %q; want %q", logMessage, expected) + } +} + +func TestFormatValue(t *testing.T) { + testCases := []struct { + format string + args []interface{} + expected string + }{ + {"Hello, %s!", []interface{}{"World"}, "Hello, World!"}, + {"Number: %d", []interface{}{42}, "Number: 42"}, + {"No args", nil, "No args"}, + } + + for _, tc := range testCases { + result := formatValue(tc.format, tc.args...) + if result != tc.expected { + t.Errorf("formatValue(%q, %v) = %q; want %q", tc.format, tc.args, result, tc.expected) + } + } +} + +func TestFormatLineInfo(t *testing.T) { + functionName := "main.main" + filename := "main.go" + logText := "This is a test log" + lineno := 42 + formatted := formatLineInfo(true, functionName, filename, logText, lineno) + expected := "[main/main.go:42] This is a test log" + if formatted != expected { + t.Errorf("formatLineInfo returned %q; want %q", formatted, expected) + } +} + +func TestNewError(t *testing.T) { + err := newError("An error occurred") + expectedMsg := "An error occurred" + if !strings.Contains(err.Error(), expectedMsg) { + t.Errorf("newError returned %q; want %q", err.Error(), expectedMsg) + } +} diff --git a/log/zap/encoder.go b/log/zap/encoder.go new file mode 100644 index 00000000..3bb829db --- /dev/null +++ b/log/zap/encoder.go @@ -0,0 +1,97 @@ +// Copyright 2024 The Gaea Authors. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package zap + +import ( + "time" + + "go.uber.org/zap/buffer" + "go.uber.org/zap/zapcore" +) + +var zapBufferPool = buffer.NewPool() + +type ZapEncoder struct { +} + +func (e *ZapEncoder) EncodeEntry(entry zapcore.Entry, fields []zapcore.Field) (*buffer.Buffer, error) { + // 将文本写入到输出流中 + buf := zapBufferPool.Get() + buf.AppendString("[" + entry.Time.Format("2006-01-02 15:04:05.000") + "] ") + buf.AppendString("[" + entry.Level.CapitalString() + "] ") + buf.AppendString(entry.Message + "\n") + return buf, nil +} + +func (e *ZapEncoder) Clone() zapcore.Encoder { + return e +} + +func (e *ZapEncoder) AddArray(key string, arr zapcore.ArrayMarshaler) error { + return nil +} + +func (e *ZapEncoder) AddObject(key string, obj zapcore.ObjectMarshaler) error { + return nil +} + +func (e *ZapEncoder) AddBinary(key string, val []byte) { +} + +func (e *ZapEncoder) AddByteString(key string, val []byte) { +} + +func (e *ZapEncoder) AddBool(key string, val bool) { +} + +func (e *ZapEncoder) AddComplex128(key string, val complex128) { +} + +func (e *ZapEncoder) AddDuration(key string, val time.Duration) { +} + +func (e *ZapEncoder) AddFloat64(key string, val float64) { +} + +func (e *ZapEncoder) AddInt64(key string, val int64) { +} + +func (e *ZapEncoder) AddReflected(key string, obj interface{}) error { + return nil +} + +func (e *ZapEncoder) OpenNamespace(key string) { +} + +func (e *ZapEncoder) AddString(key, val string) { +} + +func (e *ZapEncoder) AddTime(key string, val time.Time) { +} + +func (e *ZapEncoder) AddUint64(key string, val uint64) { +} + +func (e *ZapEncoder) AddComplex64(k string, v complex64) { e.AddComplex128(k, complex128(v)) } +func (e *ZapEncoder) AddFloat32(k string, v float32) { e.AddFloat64(k, float64(v)) } +func (e *ZapEncoder) AddInt(k string, v int) { e.AddInt64(k, int64(v)) } +func (e *ZapEncoder) AddInt32(k string, v int32) { e.AddInt64(k, int64(v)) } +func (e *ZapEncoder) AddInt16(k string, v int16) { e.AddInt64(k, int64(v)) } +func (e *ZapEncoder) AddInt8(k string, v int8) { e.AddInt64(k, int64(v)) } +func (e *ZapEncoder) AddUint(k string, v uint) { e.AddUint64(k, uint64(v)) } +func (e *ZapEncoder) AddUint32(k string, v uint32) { e.AddUint64(k, uint64(v)) } +func (e *ZapEncoder) AddUint16(k string, v uint16) { e.AddUint64(k, uint64(v)) } +func (e *ZapEncoder) AddUint8(k string, v uint8) { e.AddUint64(k, uint64(v)) } +func (e *ZapEncoder) AddUintptr(k string, v uintptr) { e.AddUint64(k, uint64(v)) } diff --git a/log/zap/encoder_test.go b/log/zap/encoder_test.go new file mode 100644 index 00000000..708e5bda --- /dev/null +++ b/log/zap/encoder_test.go @@ -0,0 +1,62 @@ +package zap + +import ( + "fmt" + "strings" + "testing" + "time" + + "go.uber.org/zap/buffer" + "go.uber.org/zap/zapcore" +) + +func TestZapEncoder_EncodeEntry(t *testing.T) { + zapBufferPool = buffer.NewPool() + e := &ZapEncoder{} + + // 创建一个模拟的时间和日志条目 + now := time.Now() + entry := zapcore.Entry{ + Time: now, + Level: zapcore.InfoLevel, + Message: "test message", + } + + // 调用 EncodeEntry 方法并获取结果缓冲区 + buf, err := e.EncodeEntry(entry, nil) + if err != nil { + t.Fatalf("Unexpected error: %v", err) + } + + // 检查缓冲区的内容是否符合预期 + expectedOutput := fmt.Sprintf("[%s] [%s] %s\n", now.Format("2006-01-02 15:04:05.000"), strings.ToUpper("info"), "test message") + if buf.String() != expectedOutput { + t.Errorf("Expected output:\n%s\ngot:\n%s", expectedOutput, buf.String()) + } +} + +func TestZapEncoder_Clone(t *testing.T) { + e := &ZapEncoder{} + clone := e.Clone() + if clone == nil || clone != e { + t.Error("Clone method did not return a same instance") + } +} + +func BenchmarkZapEncoder_EncodeEntry(b *testing.B) { + zapBufferPool = buffer.NewPool() + e := &ZapEncoder{} + + // 创建一个模拟的时间和日志条目 + now := time.Now() + entry := zapcore.Entry{ + Time: now, + Level: zapcore.InfoLevel, + Message: "benchmark test message", + } + + b.ResetTimer() + for i := 0; i < b.N; i++ { + _, _ = e.EncodeEntry(entry, nil) + } +} diff --git a/log/zap/logger.go b/log/zap/logger.go new file mode 100644 index 00000000..92059d73 --- /dev/null +++ b/log/zap/logger.go @@ -0,0 +1,249 @@ +// Copyright 2024 The Gaea Authors. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package zap + +import ( + "fmt" + "io" + "path" + "strconv" + "strings" + "time" + + rotatelogs "github.com/lestrrat-go/file-rotatelogs" + "go.uber.org/zap" + "go.uber.org/zap/zapcore" +) + +const ( + ZapLogDefaultlogID = "900000001" +) + +type ZapLoggerManager struct { + logger *zap.Logger + writers []io.WriteCloser +} + +// CreateLogManager create log manager from configs. +func CreateLogManager(config map[string]string) (*ZapLoggerManager, error) { + logDir, ok := config["path"] + if !ok { + return nil, fmt.Errorf("init XFileLog failed, not found path") + } + filename, ok := config["filename"] + if !ok { + return nil, fmt.Errorf("init XFileLog failed, not found filename") + } + + level, ok := config["level"] + if !ok { + return nil, fmt.Errorf("init XFileLog failed, not found level") + } + logKeepDays := 0 + if value, ok := config["log_keep_days"]; ok { + logKeepDays, _ = strconv.Atoi(value) + } + logKeepCounts := 0 + if value, ok := config["log_keep_counts"]; ok { + logKeepCounts, _ = strconv.Atoi(value) + } + + encoder := &ZapEncoder{} + + // 实现两个判断日志等级的interface (其实 zapcore.*Level 自身就是 interface) + infoLevel := zap.LevelEnablerFunc(func(lvl zapcore.Level) bool { + return lvl < zapcore.WarnLevel && lvl >= getZapLevelFromStr(level) + }) + + warnLevel := zap.LevelEnablerFunc(func(lvl zapcore.Level) bool { + return lvl >= zapcore.WarnLevel && lvl >= getZapLevelFromStr(level) + }) + logFile := path.Join(logDir, filename+".log") + + // 获取 info、warn日志文件的 io.WriteCloser 抽象 getWriter() 在下方实现 + infoWriter := NewAsyncWriter(getInfoWriter(logFile, logKeepDays, logKeepCounts)) + warnWriter := NewAsyncWriter(getWarnWriter(logFile, logKeepDays, logKeepCounts)) + + // 最后创建具体的Logger + core := zapcore.NewTee( + zapcore.NewCore(encoder, infoWriter, infoLevel), + zapcore.NewCore(encoder, warnWriter, warnLevel), + ) + l := zap.New(core) + return &ZapLoggerManager{ + logger: l, + writers: []io.WriteCloser{infoWriter, warnWriter}, + }, nil +} + +func getLogWriter(baseName string, filename string, logKeepDays, logKeepCounts int) io.WriteCloser { + // rotatelogs 不允许全部设置 > 0 + if logKeepDays > 0 && logKeepCounts > 0 { + if logKeepDays*24 > logKeepCounts { + logKeepDays = 0 + } else { + logKeepCounts = 0 + } + } + hook, err := rotatelogs.New( + filename, + rotatelogs.WithLinkName(baseName), + rotatelogs.WithMaxAge(time.Hour*24*time.Duration(logKeepDays)), + rotatelogs.WithRotationCount(uint(logKeepCounts)), + rotatelogs.WithRotationTime(time.Hour), + ) + if err != nil { + panic(err) + } + return hook +} + +func getInfoWriter(filename string, logKeepDays, logKeepCounts int) io.WriteCloser { + return getLogWriter(filename, filename+"-%Y%m%d%H.log", logKeepDays, logKeepCounts) +} + +func getWarnWriter(filename string, logKeepDays, logKeepCounts int) io.WriteCloser { + return getLogWriter(filename+".wf", filename+".wf-%Y%m%d%H.log.wf", logKeepDays, logKeepCounts) +} + +// LevelFromStr get log level from level string +func getZapLevelFromStr(level string) zapcore.Level { + resultLevel := zap.DebugLevel + levelLower := strings.ToLower(level) + switch levelLower { + case "debug": + resultLevel = zap.DebugLevel + case "trace": + resultLevel = zap.DebugLevel + case "notice": + resultLevel = zap.InfoLevel + case "warn": + resultLevel = zap.WarnLevel + case "fatal": + resultLevel = zap.FatalLevel + case "none": + resultLevel = 99 + default: + resultLevel = zap.InfoLevel + } + return resultLevel +} + +// SetLevel implements XLogger +func (l *ZapLoggerManager) SetLevel(name, level string) (err error) { + return nil +} + +// Warn implements XLogger +func (l *ZapLoggerManager) Notice(format string, a ...interface{}) (err error) { + if l.logger == nil { + return + } + l.Noticex(ZapLogDefaultlogID, format, a...) + return +} + +// Warn implements XLogger +func (l *ZapLoggerManager) Warn(format string, a ...interface{}) (err error) { + if l.logger == nil { + return + } + l.Warnx(ZapLogDefaultlogID, format, a...) + return +} + +// Fatal implements XLogger +func (l *ZapLoggerManager) Fatal(format string, a ...interface{}) (err error) { + if l.logger == nil { + return + } + l.Fatalx(ZapLogDefaultlogID, format, a...) + return +} + +// Trace implements XLogger +func (l *ZapLoggerManager) Trace(format string, a ...interface{}) (err error) { + if l.logger == nil { + return + } + l.Tracex(ZapLogDefaultlogID, format, a...) + return +} + +// Debug implements XLogger +func (l *ZapLoggerManager) Debug(format string, a ...interface{}) (err error) { + if l.logger == nil { + return + } + l.Debugx(ZapLogDefaultlogID, format, a...) + return +} + +// Warnx implements XLogger +func (l *ZapLoggerManager) Warnx(logID, format string, a ...interface{}) (err error) { + if l.logger == nil { + return + } + l.logger.Warn("[" + logID + "] " + fmt.Sprintf(format, a...)) + return +} + +// Fatalx implements XLogger, 不使用 Fatal,会导致进程退出 +func (l *ZapLoggerManager) Fatalx(logID, format string, a ...interface{}) (err error) { + if l.logger == nil { + return + } + l.logger.Error("[" + logID + "] " + fmt.Sprintf(format, a...)) + return +} + +// Noticex implements XLogger +func (l *ZapLoggerManager) Noticex(logID, format string, a ...interface{}) (err error) { + if l.logger == nil { + return + } + l.logger.Info("[" + logID + "] " + fmt.Sprintf(format, a...)) + return +} + +// Tracex implements XLogger +func (l *ZapLoggerManager) Tracex(logID, format string, a ...interface{}) (err error) { + if l.logger == nil { + return + } + l.logger.Debug("[" + logID + "] " + fmt.Sprintf(format, a...)) + return +} + +// Debugx implements XLogger +func (l *ZapLoggerManager) Debugx(logID, format string, a ...interface{}) (err error) { + if l.logger == nil { + return + } + l.logger.Debug("[" + logID + "] " + fmt.Sprintf(format, a...)) + return +} + +// Close implements XLogger +func (l *ZapLoggerManager) Close() { + if l.logger == nil { + return + } + l.logger.Sync() + for _, writer := range l.writers { + writer.Close() + } + l.logger = nil +} diff --git a/log/zap/logger_test.go b/log/zap/logger_test.go new file mode 100644 index 00000000..e710726b --- /dev/null +++ b/log/zap/logger_test.go @@ -0,0 +1,127 @@ +// Copyright 2024 The Gaea Authors. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package zap + +import ( + "github.com/stretchr/testify/assert" + "io" + "os" + "sync" + "testing" + + "go.uber.org/zap" + "go.uber.org/zap/zapcore" +) + +func BenchmarkSyncLoggerWriter(b *testing.B) { + f, _ := os.OpenFile("/dev/null", os.O_RDWR|os.O_CREATE, 0666) + encoder := &ZapEncoder{} + core := zapcore.NewTee( + zapcore.NewCore(encoder, zapcore.AddSync(f), zap.LevelEnablerFunc(func(lvl zapcore.Level) bool { + return true + })), + ) + l := zap.New(core) + g := sync.WaitGroup{} + for n := 0; n < b.N; n++ { + g.Add(1) + go func() { + defer g.Done() + l.Info("ns=test_namespace_1, root@127.0.0.1:61855->10.38.164.125:3308/, mysql_connect_id=1637760|select sleep(3)") + }() + } + g.Wait() + l.Sync() +} + +func BenchmarkAsyncLoggerWriter(b *testing.B) { + f, _ := os.OpenFile("/dev/null", os.O_RDWR|os.O_CREATE, 0666) + encoder := &ZapEncoder{} + core := zapcore.NewTee( + zapcore.NewCore(encoder, NewAsyncWriter(f), zap.LevelEnablerFunc(func(lvl zapcore.Level) bool { + return true + })), + ) + l := zap.New(core) + g := sync.WaitGroup{} + for n := 0; n < b.N; n++ { + g.Add(1) + go func() { + defer g.Done() + l.Info("ns=test_namespace_1, root@127.0.0.1:61855->10.38.164.125:3308/, mysql_connect_id=1637760|select sleep(3)") + }() + } + g.Wait() + l.Sync() +} + +func TestCreateLogManager(t *testing.T) { + config := map[string]string{ + "path": "/tmp", + "filename": "test", + "level": "debug", + "log_keep_days": "7", + "log_keep_counts": "30", + } + + loggerManager, err := CreateLogManager(config) + assert.NoError(t, err) + assert.NotNil(t, loggerManager) + assert.NotNil(t, loggerManager.logger) + assert.Len(t, loggerManager.writers, 2) +} + +func TestGetZapLevelFromStr(t *testing.T) { + assert.Equal(t, zap.DebugLevel, getZapLevelFromStr("debug")) + assert.Equal(t, zap.DebugLevel, getZapLevelFromStr("TRACE")) + assert.Equal(t, zap.InfoLevel, getZapLevelFromStr("notice")) + assert.Equal(t, zap.WarnLevel, getZapLevelFromStr("warn")) + assert.Equal(t, zap.FatalLevel, getZapLevelFromStr("fatal")) + assert.Equal(t, zapcore.Level(99), getZapLevelFromStr("none")) + assert.Equal(t, zap.InfoLevel, getZapLevelFromStr("unknown")) +} + +func TestSetLevel(t *testing.T) { + loggerManager := &ZapLoggerManager{} + err := loggerManager.SetLevel("test", "debug") + assert.NoError(t, err) +} + +func TestLoggerClose(t *testing.T) { + loggerManager := &ZapLoggerManager{ + logger: zap.NewExample(), + writers: []io.WriteCloser{ + &mockWriter{}, + &mockWriter{}, + }, + } + loggerManager.Close() + assert.Nil(t, loggerManager.logger) + for _, writer := range loggerManager.writers { + assert.Implements(t, (*io.WriteCloser)(nil), writer) + } +} + +type mockWriter struct{} + +func (mw *mockWriter) Write(_ []byte) (n int, err error) { return } +func (mw *mockWriter) Close() error { return nil } + +func TestMain(m *testing.M) { + // 初始化一些全局资源,例如临时目录等 + code := m.Run() + // 清理资源 + os.Exit(code) +} diff --git a/log/zap/syncer.go b/log/zap/syncer.go new file mode 100644 index 00000000..fd858952 --- /dev/null +++ b/log/zap/syncer.go @@ -0,0 +1,76 @@ +// Copyright 2024 The Gaea Authors. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package zap + +import ( + "bufio" + "context" + "io" + "sync" + "time" +) + +const writerBuffSize = 1024 * 1024 + +type LogAsyncWriter struct { + sync.Mutex + writer io.WriteCloser + buf *bufio.Writer + timer *time.Ticker + quit context.CancelFunc + ctx context.Context +} + +func NewAsyncWriter(w io.WriteCloser) *LogAsyncWriter { + buf := bufio.NewWriterSize(w, writerBuffSize) + syncer := &LogAsyncWriter{ + writer: w, + buf: buf, + } + go syncer.intervalFlush() + return syncer +} + +func (l *LogAsyncWriter) Write(data []byte) (int, error) { + l.Lock() + defer l.Unlock() + return l.buf.Write(data) +} + +func (l *LogAsyncWriter) Sync() error { + l.Lock() + defer l.Unlock() + return l.buf.Flush() +} + +func (l *LogAsyncWriter) intervalFlush() { + l.ctx, l.quit = context.WithCancel(context.Background()) + l.timer = time.NewTicker(time.Millisecond * 100) + for { + select { + case <-l.timer.C: + l.Sync() + case <-l.ctx.Done(): + return + } + } +} + +func (l *LogAsyncWriter) Close() error { + defer l.writer.Close() + l.timer.Stop() + l.quit() + return l.Sync() +} diff --git a/log/zap/syncer_test.go b/log/zap/syncer_test.go new file mode 100644 index 00000000..4a811a15 --- /dev/null +++ b/log/zap/syncer_test.go @@ -0,0 +1,112 @@ +package zap + +import ( + "bytes" + "context" + "strings" + "sync" + "testing" + "time" +) + +type mockBuffer struct { + bytes.Buffer +} + +func (mockBuffer) Close() error { + return nil +} + +func TestNewAsyncWriter(t *testing.T) { + var buf mockBuffer + w := NewAsyncWriter(&buf) + if w == nil { + t.Error("Expected non-nil AsyncWriter") + } +} + +func TestWriteAndSync(t *testing.T) { + var buf mockBuffer + w := NewAsyncWriter(&buf) + data := []byte("Hello, World!") + n, err := w.Write(data) + if n != len(data) || err != nil { + t.Errorf("Write failed: %d, %v", n, err) + } + err = w.Sync() + if err != nil { + t.Errorf("Sync failed: %v", err) + } +} + +func TestIntervalFlush(t *testing.T) { + var buf mockBuffer + w := NewAsyncWriter(&buf) + data := []byte("Hello, World!") + // Write some data to trigger flush + _, _ = w.Write(data) + // Wait for the interval flush to occur + time.Sleep(200 * time.Millisecond) + // Check if data has been flushed + if !bytes.Contains(buf.Bytes(), data) { + t.Error("Data was not flushed within expected interval") + } +} + +func TestWriterClose(t *testing.T) { + var buf mockBuffer + w := NewAsyncWriter(&buf) + w.timer = time.NewTicker(time.Millisecond * 100) + w.ctx, w.quit = context.WithCancel(context.Background()) + data := []byte("Hello, World!") + _, _ = w.Write(data) + err := w.Close() + if err != nil { + t.Errorf("Close failed: %v", err) + } + // Ensure no data is lost + if !bytes.Contains(buf.Bytes(), data) { + t.Error("Data was lost during close") + } +} + +type mockWriteCloser struct { + mu sync.Mutex + written []byte +} + +func (mwc *mockWriteCloser) Write(p []byte) (n int, err error) { + mwc.mu.Lock() + defer mwc.mu.Unlock() + mwc.written = append(mwc.written, p...) + return len(p), nil +} + +func (mwc *mockWriteCloser) Close() error { + return nil +} + +func TestIntegration(t *testing.T) { + mwc := &mockWriteCloser{} + w := NewAsyncWriter(mwc) + w.timer = time.NewTicker(time.Millisecond * 100) + w.ctx, w.quit = context.WithCancel(context.Background()) + data := []byte("Hello, World!") + // Simulate concurrent writes + var wg sync.WaitGroup + wg.Add(10) + for i := 0; i < 10; i++ { + go func() { + defer wg.Done() + _, _ = w.Write(data) + }() + } + wg.Wait() + // Close the writer to ensure all data is flushed + _ = w.Close() + // Check if all data has been written + expected := strings.Repeat(string(data), 10) + if !bytes.Equal(mwc.written, []byte(expected)) { + t.Errorf("Written data does not match expected: got %s, want %s", string(mwc.written), expected) + } +} diff --git a/models/cc.go b/models/cc.go index f6463b27..227e10c8 100644 --- a/models/cc.go +++ b/models/cc.go @@ -36,10 +36,12 @@ type CCConfig struct { DefaultCluster string `ini:"default_cluster"` - LogPath string `ini:"log_path"` - LogLevel string `ini:"log_level"` - LogFileName string `ini:"log_filename"` - LogOutput string `ini:"log_output"` + LogPath string `ini:"log_path"` + LogLevel string `ini:"log_level"` + LogFileName string `ini:"log_filename"` + LogOutput string `ini:"log_output"` + LogKeepDays int `ini:"log_keep_days"` + LogKeepCounts int `ini:"log_keep_counts"` EncryptKey string `ini:"encrypt_key"` } diff --git a/models/encode_test.go b/models/encode_test.go index 7b540cac..07312dcf 100644 --- a/models/encode_test.go +++ b/models/encode_test.go @@ -4,7 +4,7 @@ // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // -// http://www.apache.org/licenses/LICENSE-2.0 +// http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, diff --git a/models/etcd/etcd.go b/models/etcd/etcd.go index d1837123..2e23384e 100644 --- a/models/etcd/etcd.go +++ b/models/etcd/etcd.go @@ -93,7 +93,7 @@ func (c *EtcdClient) contextWithTimeout() (context.Context, context.CancelFunc) return context.WithTimeout(context.Background(), c.timeout) } -func isErrNoNode(err error) bool { +func IsErrNoNode(err error) bool { if err != nil { if e, ok := err.(client.Error); ok { return e.Code == client.ErrorCodeKeyNotFound @@ -205,7 +205,7 @@ func (c *EtcdClient) Delete(path string) error { defer canceller() log.Debug("etcd delete node %s", path) _, err := c.kapi.Delete(cntx, path, nil) - if err != nil && !isErrNoNode(err) { + if err != nil && !IsErrNoNode(err) { log.Debug("etcd delete node %s failed: %s", path, err) return err } @@ -224,7 +224,7 @@ func (c *EtcdClient) Read(path string) ([]byte, error) { defer canceller() log.Debug("etcd read node %s", path) r, err := c.kapi.Get(cntx, path, nil) - if err != nil && !isErrNoNode(err) { + if err != nil && !IsErrNoNode(err) { return nil, err } else if r == nil || r.Node.Dir { return nil, nil @@ -244,7 +244,7 @@ func (c *EtcdClient) List(path string) ([]string, error) { defer canceller() log.Debug("etcd list node %s", path) r, err := c.kapi.Get(cntx, path, nil) - if err != nil && !isErrNoNode(err) { + if err != nil && !IsErrNoNode(err) { return nil, err } else if r == nil || !r.Node.Dir { return nil, nil @@ -257,20 +257,63 @@ func (c *EtcdClient) List(path string) ([]string, error) { } } +// ListWithValues retrieves all key-value pairs under the specified path in ETCD. +// This function uses recursion to fetch all nested nodes under the given path. +func (c *EtcdClient) ListWithValues(path string) (map[string]string, error) { + // Check if the ETCD client has been closed and return an error if so. + if c.closed { + return nil, ErrClosedEtcdClient + } + // Create a context with a timeout to avoid hanging the GET request indefinitely. + cntx, canceller := c.contextWithTimeout() + defer canceller() + log.Debug("etcd list node %s", path) + + // Set the recursive option to fetch all sub-nodes under the specified path. + opts := &client.GetOptions{Recursive: true} + r, err := c.kapi.Get(cntx, path, opts) + // Handle errors other than the 'no node found' error. + if err != nil && !IsErrNoNode(err) { + return nil, err + } else if r == nil || !r.Node.Dir { + // If no node is found at the path, or the node is not a directory, return nil. + return nil, nil + } else { + files := make(map[string]string) + // Recursively collect all nodes into the map. + collectNodes(r.Node, files) + return files, nil + } +} + +// collectNodes recursively collects data from ETCD nodes into a map. +// This helper function traverses all nodes under a given parent node and stores their keys and values in the provided map. +func collectNodes(node *client.Node, files map[string]string) { + if node.Dir { + for _, n := range node.Nodes { + // If the node is a directory, recursively call collectNodes for each sub-node. + collectNodes(n, files) + } + } else { + // If the node is not a directory, store its key and value in the map. + files[node.Key] = node.Value + } +} + // Watch watch path func (c *EtcdClient) Watch(path string, ch chan string) error { - c.Lock() // 在这里上锁 + c.Lock() // 在这里上锁 // defer c.Unlock() // 移除此行,避免死结发生 if c.closed { c.Unlock() // 上锁后记得解锁,去防止死结问题发生 panic(ErrClosedEtcdClient) } - + watcher := c.kapi.Watcher(path, &client.WatcherOptions{Recursive: true}) - - c.Unlock() // 上锁后在适当时机解锁,去防止死结问题发生 + + c.Unlock() // 上锁后在适当时机解锁,去防止死结问题发生 // 在这里解锁是最好的,因为解锁后立刻可以进行监听 - + for { res, err := watcher.Next(context.Background()) if err != nil { diff --git a/models/etcd/etcd_test.go b/models/etcd/etcd_test.go index 4794f0d4..5fb3ee62 100644 --- a/models/etcd/etcd_test.go +++ b/models/etcd/etcd_test.go @@ -23,11 +23,11 @@ import ( func Test_isErrNoNode(t *testing.T) { err := client.Error{} err.Code = client.ErrorCodeKeyNotFound - if !isErrNoNode(err) { + if !IsErrNoNode(err) { t.Fatalf("test isErrNoNode failed, %v", err) } err.Code = client.ErrorCodeNotFile - if isErrNoNode(err) { + if IsErrNoNode(err) { t.Fatalf("test isErrNoNode failed, %v", err) } } diff --git a/models/etcdv3/README.md b/models/etcdv3/README.md index 0f9b5105..448ca3db 100644 --- a/models/etcdv3/README.md +++ b/models/etcdv3/README.md @@ -245,4 +245,3 @@ PR 准备发两次 1. 第一次,送上 Etcd V3 API 的代码和修改旧的 V2 版本的代码,标题为 Etcd API 更新 2. 第二次,数据库中间件接上 Etcd V3 API ,同时修改 Etcd 的接口,标题为整合数据库中间件和 Etcd V3 API - diff --git a/models/etcdv3/etcdv3.go b/models/etcdv3/etcdv3.go index d19adfae..536871bf 100644 --- a/models/etcdv3/etcdv3.go +++ b/models/etcdv3/etcdv3.go @@ -20,11 +20,12 @@ package etcdclientv3 import ( "context" "errors" - "github.com/XiaoMi/Gaea/log" - "github.com/coreos/etcd/clientv3" "strings" "sync" "time" + + "github.com/XiaoMi/Gaea/log" + "github.com/coreos/etcd/clientv3" ) // ErrClosedEtcdClient means etcd client closed @@ -282,7 +283,7 @@ func (c *EtcdClientV3) Read(path string) ([]byte, error) { return r.Kvs[0].Value, nil } } - return []byte{}, nil + return nil, nil } // List list path, return slice of all paths @@ -309,6 +310,29 @@ func (c *EtcdClientV3) List(path string) ([]string, error) { } } +func (c *EtcdClientV3) ListWithValues(path string) (map[string]string, error) { + if c.closed { + return nil, ErrClosedEtcdClient + } + + ctx, canceller := c.contextWithTimeout() + defer canceller() + + _ = log.Debug("etcd list node %s", path) + r, err := c.kapi.Get(ctx, path, clientv3.WithPrefix()) + if err != nil { + return nil, err + } else if r == nil { + return nil, nil + } else { + results := make(map[string]string) + for _, kv := range r.Kvs { + results[string(kv.Key)] = string(kv.Value) + } + return results, nil + } +} + // Watch watch path func (c *EtcdClientV3) Watch(path string, ch chan string) error { c.Lock() // 在这里上锁 diff --git a/models/file/file.go b/models/file/file.go index 32a3a7e4..8cb7809c 100644 --- a/models/file/file.go +++ b/models/file/file.go @@ -18,6 +18,7 @@ import ( "errors" "io/ioutil" "os" + "path/filepath" "strings" "time" @@ -110,6 +111,23 @@ func (c *Client) List(path string) ([]string, error) { return r, nil } +func (c *Client) ListWithValues(path string) (map[string]string, error) { + files, err := ioutil.ReadDir(path) + r := make(map[string]string, len(files)) + if err != nil { + return r, err + } + for _, file := range files { + // concatenate the path and file name to ensure that the full path is used to read the file + data, err := ioutil.ReadFile(filepath.Join(path, file.Name())) + if err != nil { + return r, err + } + r[file.Name()] = string(data) + } + return r, nil +} + // BasePrefix return base prefix func (c *Client) BasePrefix() string { return c.Prefix diff --git a/models/namespace.go b/models/namespace.go index b50cba05..cc998576 100644 --- a/models/namespace.go +++ b/models/namespace.go @@ -21,6 +21,8 @@ import ( "strconv" "strings" + "github.com/XiaoMi/Gaea/log" + "github.com/XiaoMi/Gaea/mysql" "github.com/XiaoMi/Gaea/util" "github.com/XiaoMi/Gaea/util/crypto" @@ -28,25 +30,35 @@ import ( // Namespace means namespace model stored in etcd type Namespace struct { - OpenGeneralLog bool `json:"open_general_log"` - IsEncrypt bool `json:"is_encrypt"` // true: 加密存储 false: 非加密存储,目前加密Slice、User中的用户名、密码 - Name string `json:"name"` - Online bool `json:"online"` - ReadOnly bool `json:"read_only"` - AllowedDBS map[string]bool `json:"allowed_dbs"` - DefaultPhyDBS map[string]string `json:"default_phy_dbs"` - SlowSQLTime string `json:"slow_sql_time"` - BlackSQL []string `json:"black_sql"` - AllowedIP []string `json:"allowed_ip"` - Slices []*Slice `json:"slices"` - ShardRules []*Shard `json:"shard_rules"` - Users []*User `json:"users"` // 客户端接入proxy用户,每个用户可以设置读写分离、读写权限等 - DefaultSlice string `json:"default_slice"` - GlobalSequences []*GlobalSequence `json:"global_sequences"` - DefaultCharset string `json:"default_charset"` - DefaultCollation string `json:"default_collation"` - MaxSqlExecuteTime int `json:"max_sql_execute_time"` // sql最大执行时间,大于该时间,进行熔断 - MaxSqlResultSize int `json:"max_sql_result_size"` // 限制单分片返回结果集大小不超过max_select_rows + OpenGeneralLog bool `json:"open_general_log"` + IsEncrypt bool `json:"is_encrypt"` // true: 加密存储 false: 非加密存储,目前加密Slice、User中的用户名、密码 + Name string `json:"name"` + Online bool `json:"online"` + ReadOnly bool `json:"read_only"` + AllowedDBS map[string]bool `json:"allowed_dbs"` + DefaultPhyDBS map[string]string `json:"default_phy_dbs"` + SlowSQLTime string `json:"slow_sql_time"` + BlackSQL []string `json:"black_sql"` + AllowedIP []string `json:"allowed_ip"` + Slices []*Slice `json:"slices"` + ShardRules []*Shard `json:"shard_rules"` + Users []*User `json:"users"` // 客户端接入proxy用户,每个用户可以设置读写分离、读写权限等 + DefaultSlice string `json:"default_slice"` + GlobalSequences []*GlobalSequence `json:"global_sequences"` + DefaultCharset string `json:"default_charset"` + DefaultCollation string `json:"default_collation"` + MaxSqlExecuteTime int `json:"max_sql_execute_time"` // sql最大执行时间,大于该时间,进行熔断 + MaxSqlResultSize int `json:"max_sql_result_size"` // 限制单分片返回结果集大小不超过max_select_rows + MaxClientConnections int `json:"max_client_connections"` // namespace中最大的前端连接数 + DownAfterNoAlive int `json:"down_after_no_alive"` // 如果探测MySQL服务offline超过该时间后标记mysql为下线 + SecondsBehindMaster uint64 `json:"seconds_behind_master"` // slave延迟超过该值将slave标记为down, 默认值为0,即无限大 + CheckSelectLock bool `json:"check_select_lock"` // 是否将 select for update 语句打到主库 + SupportMultiQuery bool `json:"support_multi_query"` //是否支持多语句 + LocalSlaveReadPriority int `json:"local_slave_read_priority"` //是否可以跨机房访问从库 + SetForKeepSession bool `json:"set_for_keep_session"` // 是否支持业务连接会话保持 + ClientQPSLimit uint32 `json:"client_qps_limit"` // Namespace 级别的 qps 限制,默认为 0,即不开启 + SupportLimitTransaction bool `json:"support_limit_transaction"` // 是否支持限制事务 + AllowedSessionVariables map[string]string `json:"allowed_session_variables"` // 允许设置的会话变量 } // Encode encode json @@ -96,6 +108,9 @@ func (n *Namespace) Verify() error { return err } + n.verifyCapability() + n.verifyDefaultSessionVariables() + return nil } @@ -326,6 +341,25 @@ func (n *Namespace) verifyShardRules() error { return nil } +// verifyCapability only support capability in SupportCapability +func (n *Namespace) verifyCapability() { + for _, slice := range n.Slices { + if (slice.Capability | mysql.SupportCapability) > mysql.SupportCapability { + oldCapability := slice.Capability + slice.Capability &= mysql.SupportCapability ^ mysql.ClientConnectWithDB + log.Warn("Capability %d incompatible, changed to %d", oldCapability, slice.Capability) + } + } +} + +// verifyDefaultSessionVariables only support capability in SupportCapability +func (n *Namespace) verifyDefaultSessionVariables() { + if n.AllowedSessionVariables == nil { + n.AllowedSessionVariables = map[string]string{} + return + } +} + // Decrypt decrypt user/password in namespace func (n *Namespace) Decrypt(key string) (err error) { if !n.IsEncrypt { diff --git a/models/namespace_test.go b/models/namespace_test.go index 3749a408..fa8eaa81 100644 --- a/models/namespace_test.go +++ b/models/namespace_test.go @@ -4,7 +4,7 @@ // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // -// http://www.apache.org/licenses/LICENSE-2.0 +// http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, diff --git a/models/numkey.go b/models/numkey.go index 8feed8ba..ec0f0ab1 100644 --- a/models/numkey.go +++ b/models/numkey.go @@ -69,8 +69,8 @@ func ParseNumSharding(Locations []int, TableRowLimit int) ([]NumKeyRange, error) } // ParseDayRange return date of daynumber by order -//20151201-20151205 -//20151201,20151202,20151203,20151204,20151205 +// 20151201-20151205 +// 20151201,20151202,20151203,20151204,20151205 func ParseDayRange(dateRange string) ([]int, error) { timeFormat := "20060102" dateDays := make([]int, 0) @@ -126,8 +126,8 @@ func ParseDayRange(dateRange string) ([]int, error) { } // ParseMonthRange return date of month by order -//201510-201512 -//201510,201511,201512 +// 201510-201512 +// 201510,201511,201512 func ParseMonthRange(dateRange string) ([]int, error) { timeFormat := "200601" dateMonth := make([]int, 0) @@ -199,8 +199,8 @@ func ParseMonthRange(dateRange string) ([]int, error) { } // ParseYearRange return date of year by order -//2013-2015 -//2013,2014,2015 +// 2013-2015 +// 2013,2014,2015 func ParseYearRange(dateRange string) ([]int, error) { timeFormat := "2006" dateYear := make([]int, 0) diff --git a/models/proxy.go b/models/proxy.go index 94efada1..e66cba33 100644 --- a/models/proxy.go +++ b/models/proxy.go @@ -15,6 +15,11 @@ package models import ( + "fmt" + "github.com/XiaoMi/Gaea/log" + "github.com/XiaoMi/Gaea/log/zap" + "github.com/XiaoMi/Gaea/mysql" + "strconv" "strings" "github.com/go-ini/ini" @@ -43,10 +48,12 @@ type Proxy struct { Service string `ini:"service_name"` Cluster string `ini:"cluster_name"` - LogPath string `ini:"log_path"` - LogLevel string `ini:"log_level"` - LogFileName string `ini:"log_filename"` - LogOutput string `ini:"log_output"` + LogPath string `ini:"log_path"` + LogLevel string `ini:"log_level"` + LogFileName string `ini:"log_filename"` + LogOutput string `ini:"log_output"` + LogKeepDays int `ini:"log_keep_days"` + LogKeepCounts int `ini:"log_keep_counts"` ProtoType string `ini:"proto_type"` ProxyAddr string `ini:"proxy_addr"` @@ -64,6 +71,9 @@ type Proxy struct { ServerVersion string `ini:"server_version"` AuthPlugin string `ini:"auth_plugin"` + NumCPU int `ini:"num_cpu"` + NetBufferSize int `ini:"net_buffer_size"` + ConfigFile string } // ParseProxyConfigFromFile parser proxy config from file @@ -87,12 +97,52 @@ func ParseProxyConfigFromFile(cfgFile string) (*Proxy, error) { } else if proxyConfig.Cluster != "" { proxyConfig.CoordinatorRoot = "/" + proxyConfig.Cluster } + + proxyConfig.ConfigFile = cfgFile + + if proxyConfig.NetBufferSize > 0 { + mysql.InitNetBufferSize(proxyConfig.NetBufferSize) + } + + if err := proxyConfig.Verify(); err != nil { + return nil, err + } return proxyConfig, err } // Verify verify proxy config -func (p *Proxy) Verify() error { - return nil +func (p *Proxy) Verify() (err error) { + + //first check ConfigType + switch p.ConfigType { + case ConfigFile, ConfigEtcd, ConfigEtcdV3: + default: + return fmt.Errorf("unsupport config_type: %s", p.ConfigType) + } + + // check statstics + if _, err = strconv.ParseBool(p.StatsEnabled); err != nil { + return fmt.Errorf("StatsEnabled should be a bool value: current: %s, "+ + "error: %s", p.StatsEnabled, err.Error()) + } + if p.StatsInterval < 0 { + return fmt.Errorf("stats_interval should be >= 0: %d", p.StatsInterval) + } + + // check gloal slow query and session timeout + if p.SlowSQLTime < 0 { + return fmt.Errorf("slow_sql_time should be >= 0: %d", p.SlowSQLTime) + } + if p.SessionTimeout < 0 { + return fmt.Errorf("session_timeout should be >= 0: %d", p.SlowSQLTime) + } + + switch p.AuthPlugin { + case "", mysql.MysqlNativePassword, mysql.CachingSHA2Password: + default: + return fmt.Errorf("unsupport auth_plugin: %s", p.AuthPlugin) + } + return } // ProxyInfo for report proxy information @@ -114,3 +164,28 @@ type ProxyInfo struct { func (p *ProxyInfo) Encode() []byte { return JSONEncode(p) } + +func InitXLog(output, path, filename, level, service string, logKeepDays int, logKeepCounts int) error { + cfg := make(map[string]string) + cfg["path"] = path + cfg["filename"] = filename + cfg["level"] = level + cfg["service"] = service + cfg["skip"] = "5" // 设置xlog打印方法堆栈需要跳过的层数, 5目前为调用log.Debug()等方法的方法名, 比xlog默认值多一层. + cfg["log_keep_days"] = strconv.Itoa(log.DefaultLogKeepDays) + if logKeepDays != 0 { + cfg["log_keep_days"] = strconv.Itoa(logKeepDays) + } + + cfg["log_keep_counts"] = strconv.Itoa(log.DefaultLogKeepCounts) + if logKeepCounts != 0 { + cfg["log_keep_counts"] = strconv.Itoa(logKeepCounts) + } + logger, err := zap.CreateLogManager(cfg) + if err != nil { + return err + } + + log.SetGlobalLogger(logger) + return nil +} diff --git a/models/sequence.go b/models/sequence.go index 18e1cdd9..f830eaab 100644 --- a/models/sequence.go +++ b/models/sequence.go @@ -21,6 +21,7 @@ type GlobalSequence struct { Type string `json:"type"` // 全局序列号类型,目前只兼容mycat的数据库方式 SliceName string `json:"slice_name"` // 对应sequence表所在的分片,默认都在0号片 PKName string `json:"pk_name"` // 全局序列号字段名称 + MaxLimit int64 `json:"max_limit"` // 全局序列号上限设置 } // Encode means encode for easy use diff --git a/models/slice.go b/models/slice.go index d82bfe53..41f3616b 100644 --- a/models/slice.go +++ b/models/slice.go @@ -14,7 +14,10 @@ package models -import "errors" +import ( + "errors" + "fmt" +) // Slice means config model of slice type Slice struct { @@ -24,10 +27,13 @@ type Slice struct { Master string `json:"master"` Slaves []string `json:"slaves"` StatisticSlaves []string `json:"statistic_slaves"` - - Capacity int `json:"capacity"` // connection pool capacity - MaxCapacity int `json:"max_capacity"` // max connection pool capacity - IdleTimeout int `json:"idle_timeout"` // close backend direct connection after idle_timeout,unit: seconds + Capacity int `json:"capacity"` // connection pool capacity + MaxCapacity int `json:"max_capacity"` // max connection pool capacity + IdleTimeout int `json:"idle_timeout"` // close backend direct connection after idle_timeout,unit: seconds + Capability uint32 `json:"capability"` // capability set by client, this capability is used as mysql client parameter when + InitConnect string `json:"init_connect"` // 与MySQL的init_connect相同,连接池中的连接新建之后即会发送请求,以分号分隔 + HealthCheckSql string `json:"health_check_sql"` // 简单语句的健康查询 + // gaea proxy as client connected to MySQL default is 0 } func (s *Slice) verify() error { @@ -57,5 +63,9 @@ func (s *Slice) verify() error { return errors.New("max connection pool capactiy should be > 0") } + if s.Capacity > s.MaxCapacity { + return fmt.Errorf("connection pool capacity should be less than max connection pool capactiy") + } + return nil } diff --git a/models/store.go b/models/store.go index b811e59a..2e92cb5c 100644 --- a/models/store.go +++ b/models/store.go @@ -17,14 +17,15 @@ package models import ( "encoding/json" "fmt" - etcdclientv3 "github.com/XiaoMi/Gaea/models/etcdv3" "path/filepath" "strings" "time" "github.com/XiaoMi/Gaea/log" etcdclient "github.com/XiaoMi/Gaea/models/etcd" + etcdclientv3 "github.com/XiaoMi/Gaea/models/etcdv3" fileclient "github.com/XiaoMi/Gaea/models/file" + "github.com/coreos/etcd/client" ) // config type @@ -42,6 +43,7 @@ type Client interface { Delete(path string) error Read(path string) ([]byte, error) List(path string) ([]string, error) + ListWithValues(path string) (map[string]string, error) Close() error BasePrefix() string } @@ -149,9 +151,11 @@ func (s *Store) LoadNamespace(key, name string) (*Namespace, error) { } if b == nil { - return nil, fmt.Errorf("node %s not exists", s.NamespacePath(name)) + return nil, client.Error{ + Code: client.ErrorCodeKeyNotFound, + Message: fmt.Sprintf("node %s not exists", s.NamespacePath(name)), + } } - p := &Namespace{} if err = json.Unmarshal(b, p); err != nil { return nil, err @@ -198,3 +202,23 @@ func (s *Store) ListProxyMonitorMetrics() (map[string]*ProxyMonitorMetric, error } return proxy, nil } + +func (s *Store) ListNamespaces() (map[string]*Namespace, error) { + values, err := s.client.ListWithValues(s.NamespaceBase()) + if err != nil { + return nil, err + } + // 初始化结果map + res := make(map[string]*Namespace, len(values)) + for key, value := range values { + ns := &Namespace{} + // 反序列化每个值到Namespace结构体 + if err := json.Unmarshal([]byte(value), ns); err != nil { + // 如果出现错误,处理错误,例如记录或返回错误 + return nil, err + } + // 将反序列化的Namespace添加到结果map + res[key] = ns + } + return res, nil +} diff --git a/mysql/conn.go b/mysql/conn.go index 7810c35c..cccfdb7e 100644 --- a/mysql/conn.go +++ b/mysql/conn.go @@ -32,6 +32,7 @@ package mysql import ( "bufio" + "bytes" "errors" "fmt" "io" @@ -44,13 +45,17 @@ import ( ) const ( - // connBufferSize is how much we buffer for reading and - // writing. It is also how much we allocate for ephemeral buffers. - connBufferSize = 128 - // MaxPacketSize is the maximum payload length of a packet(16MB) // the server supports. - MaxPacketSize = (1 << 24) - 1 + MinPacketSize = 128 + MaxPacketSize = (1 << 24) - 1 + WritePacketSize = 16 * 1024 +) + +var ( + // connBufferSize is how much we buffer for reading and + // writing. It is also how much we allocate for ephemeral buffers. + connBufferSize = 16 * 1024 ) // Constants for how ephemeral buffers were used for reading / writing. @@ -67,6 +72,19 @@ const ( ephemeralRead ) +// InitNetBufferSize should only be set when starting the proxy +func InitNetBufferSize(buffSize int) { + if buffSize < 128 { // min + buffSize = 128 + } + + if buffSize > 16*1024 { // max + buffSize = 16 * 1024 + } + // 全局变量 + connBufferSize = buffSize +} + // Conn is a connection between a client and a server, using the MySQL // binary protocol. It is built on top of an existing net.Conn, that // has already been established. @@ -105,10 +123,10 @@ type Conn struct { } // bufPool is used to allocate and free buffers in an efficient way. -var bufPool = bucketpool.New(connBufferSize, MaxPacketSize) +var bufPool = bucketpool.New(MinPacketSize, MaxPacketSize) // writersPool is used for pooling bufio.Writer objects. -var writersPool = sync.Pool{New: func() interface{} { return bufio.NewWriterSize(nil, connBufferSize) }} +var writersPool = sync.Pool{New: func() interface{} { return bufio.NewWriterSize(nil, WritePacketSize) }} // NewConn is an internal method to create a Conn. Used by client and server // side for common creation code. @@ -173,13 +191,18 @@ func (c *Conn) readHeaderFrom(r io.Reader) (int, error) { // The special casing of propagating io.EOF up // is used by the server side only, to suppress an error // message if a client just disconnects. - if err == io.EOF { - return 0, err - } if strings.HasSuffix(err.Error(), "read: connection reset by peer") { - return 0, io.EOF + return 0, ErrResetConn } - return 0, fmt.Errorf("io.ReadFull(header size) failed: %v", err) + + // For example, the backend MySQL execution time exceeds the limit and was killed + return 0, ErrBadConn + } + + length := int(uint32(header[0]) | uint32(header[1])<<8 | uint32(header[2])<<16) + if length == 0 { + c.sequence++ + return 0, nil } sequence := uint8(header[3]) @@ -189,7 +212,7 @@ func (c *Conn) readHeaderFrom(r io.Reader) (int, error) { c.sequence++ - return int(uint32(header[0]) | uint32(header[1])<<8 | uint32(header[2])<<16), nil + return length, nil } // ReadEphemeralPacket attempts to read a packet into buffer from sync.Pool. Do @@ -215,7 +238,7 @@ func (c *Conn) ReadEphemeralPacket() ([]byte, error) { if length == 0 { // This can be caused by the packet after a packet of // exactly size MaxPacketSize. - return nil, nil + return []byte{}, nil } // Use the bufPool. @@ -391,21 +414,21 @@ func (c *Conn) WritePacket(data []byte) error { } // Compute and write the header. - var header [4]byte + header := make([]byte, 4) header[0] = byte(packetLength) header[1] = byte(packetLength >> 8) header[2] = byte(packetLength >> 16) header[3] = c.sequence - if n, err := w.Write(header[:]); err != nil { - return fmt.Errorf("Write(header) failed: %v", err) - } else if n != 4 { - return fmt.Errorf("Write(header) returned a short write: %v < 4", n) - } - // Write the body. - if n, err := w.Write(data[index : index+packetLength]); err != nil { - return fmt.Errorf("Write(packet) failed: %v", err) - } else if n != packetLength { + // 这边合并写入,旧版本分开写入,会多一个 tcp PSH 包和一个 tcp ACK 包 + buf := bytes.NewBuffer(header) + buf.Write(data[index : index+packetLength]) + if n, err := w.Write(buf.Bytes()); err != nil { + if strings.Contains(err.Error(), ErrResetConn.Error()) { + return ErrResetConn + } + return fmt.Errorf("Conn %v:Write(packet) failed: %v", c.GetConnectionID(), err) + } else if n != packetLength+4 { return fmt.Errorf("Write(packet) returned a short write: %v < %v", n, packetLength) } @@ -454,7 +477,7 @@ func (c *Conn) WriteEphemeralPacket() error { switch c.currentEphemeralPolicy { case ephemeralWrite: if err := c.WritePacket(*c.currentEphemeralBuffer); err != nil { - return fmt.Errorf("Conn %v: %v", c.GetConnectionID(), err) + return err } case ephemeralUnused, ephemeralRead: // Programming error. @@ -545,12 +568,13 @@ func (c *Conn) IsClosed() bool { // WriteOKPacket writes an OK packet. // Server -> Client. // This method returns a generic error, not a SQLError. -func (c *Conn) WriteOKPacket(affectedRows, lastInsertID uint64, flags uint16, warnings uint16) error { +func (c *Conn) WriteOKPacket(affectedRows, lastInsertID uint64, flags uint16, warnings uint16, info string) error { length := 1 + // OKHeader LenEncIntSize(affectedRows) + LenEncIntSize(lastInsertID) + 2 + // flags - 2 // warnings + 2 + // warnings + len(info) // info data := c.StartEphemeralPacket(length) pos := 0 pos = WriteByte(data, pos, OKHeader) @@ -558,6 +582,7 @@ func (c *Conn) WriteOKPacket(affectedRows, lastInsertID uint64, flags uint16, wa pos = WriteLenEncInt(data, pos, lastInsertID) pos = WriteUint16(data, pos, flags) pos = WriteUint16(data, pos, warnings) + pos = WriteBytes(data, pos, []byte(info)) return c.WriteEphemeralPacket() } @@ -614,7 +639,11 @@ func (c *Conn) WriteErrorPacketFromError(err error) error { return c.WriteErrorPacket(se.SQLCode(), se.SQLState(), "%v", se.Message) } - return c.WriteErrorPacket(ErrUnknown, DefaultMySQLState, "unknown error: %v", err) + if err.Error() == ErrClientQpsLimitedMsg { + return c.WriteErrorPacket(ErrClientQpsLimited, DefaultMySQLState, "%v", err) + } + + return c.WriteErrorPacket(ErrUnknown, DefaultMySQLState, "%v", err) } // WriteEOFPacket writes an EOF packet, through the buffer, and diff --git a/mysql/conn_test.go b/mysql/conn_test.go index d040f55c..bb4579a6 100644 --- a/mysql/conn_test.go +++ b/mysql/conn_test.go @@ -1,10 +1,25 @@ +// Copyright 2024 The Gaea Authors. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + package mysql import ( "bufio" + "testing" + "github.com/XiaoMi/Gaea/util/mocks/pipeTest" "github.com/stretchr/testify/require" - "testing" ) // TestMariadbConnWithoutDB 为用来测试数据库一开始连线的详细流程,以下测试不使用 MariaDB 的服务器,只是单纯的单元测试 @@ -35,3 +50,15 @@ func TestMariadbConnWithoutDB(t *testing.T) { require.Equal(t, msg1[0], correct) }) } + +func TestInitNetBufferSize(t *testing.T) { + connBufferSize = 128 + InitNetBufferSize(0) + require.Equal(t, connBufferSize, 128) + InitNetBufferSize(128) + require.Equal(t, connBufferSize, 128) + InitNetBufferSize(512) + require.Equal(t, connBufferSize, 512) + InitNetBufferSize(16*1024 + 1) + require.Equal(t, connBufferSize, 16*1024) +} diff --git a/mysql/constants.go b/mysql/constants.go index b7f5459c..0e29ffe4 100644 --- a/mysql/constants.go +++ b/mysql/constants.go @@ -33,10 +33,14 @@ const ( ServerVersion string = "5.6.20-gaea" // MysqlNativePassword uses a salt and transmits a hash on the wire. MysqlNativePassword = "mysql_native_password" + Sha256Password = "sha256_password" CachingSHA2Password = "caching_sha2_password" // ProtocolVersion is the current version of the protocol. // Always 10. - ProtocolVersion = 10 + ProtocolVersion = 10 + SupportCapability = ClientProtocol41 | ClientSecureConnection | ClientLongPassword | ClientTransactions | + ClientLongFlag | ClientConnectWithDB | ClientFoundRows | ClientMultiResults | ClientMultiStatements | + ClientPSMultiResults | ClientLocalFiles ) const ( @@ -46,11 +50,11 @@ const ( // Header information. const ( - OKHeader byte = 0x00 - ErrHeader byte = 0xff - EOFHeader byte = 0xfe - LocalInFileHeader byte = 0xfb - AuthSwitchHeader byte = 0xfe + OKHeader byte = 0x00 + AuthMoreDataHeader byte = 0x01 + ErrHeader byte = 0xff + EOFHeader byte = 0xfe + LocalInFileHeader byte = 0xfb ) // Server information. @@ -69,6 +73,12 @@ const ( ServerPSOutParams uint16 = 0x1000 ) +const ( + CachingSha2PasswordRequestPublicKey = 2 + CachingSha2PasswordFastAuthSuccess = 3 + CachingSha2PasswordPerformFullAuthentication = 4 +) + // ErrTextLength error text length limit. const ErrTextLength = 80 @@ -209,6 +219,76 @@ const ( MaxBlobWidth = 16777216 ) +const ( + TkStrFrom = "from" + TkStrInto = "into" + TkStrSet = "set" + TkStrShow = "show" + + TkStrFields = "fields" // TkStrFields show fields + TkStrColumns = "columns" // TkStrColumns show columns +) + +var ( + TkIdInsert = 1 + TkIdUpdate = 2 + TkIdDelete = 3 + TkIdReplace = 4 + TkIdSet = 5 + TkIdBegin = 6 + TkIdCommit = 7 + TkIdRollback = 8 + TkIdAdmin = 9 + TkIdUse = 10 + + TkIdSelect = 11 + TkIdStart = 12 + TkIdTransaction = 13 + TkIdShow = 14 + TkIdPrepare = 15 + TkIdKill = 16 + TkIdCreate = 17 + TkIdTemporary = 18 + TkIdTruncate = 19 + TkIdLock = 20 + TkIdFlush = 21 + TkIdLoad = 22 + + ParseTokenMap = map[string]int{ + "insert": TkIdInsert, + "update": TkIdUpdate, + "delete": TkIdDelete, + "replace": TkIdReplace, + "set": TkIdSet, + "begin": TkIdBegin, + "commit": TkIdCommit, + "rollback": TkIdRollback, + "admin": TkIdAdmin, + "select": TkIdSelect, + "use": TkIdUse, + "start": TkIdStart, + "transaction": TkIdTransaction, + "show": TkIdShow, + "prepare": TkIdPrepare, + "kill": TkIdKill, + "create": TkIdCreate, + "temporary": TkIdTemporary, + "truncate": TkIdTruncate, + "lock": TkIdLock, + "flush": TkIdFlush, + "load": TkIdLoad, + } + ParseTokenIdStrMap = map[int]string{ + TkIdSelect: TkStrFrom, + TkIdDelete: TkStrFrom, + TkIdInsert: TkStrInto, + TkIdReplace: TkStrInto, + TkIdUpdate: TkStrSet, + TkIdSet: TkStrSet, + TkIdShow: TkStrShow, + } +) + // SQLMode is the type for MySQL sql_mode. // See https://dev.mysql.com/doc/refman/5.7/en/sql-mode.html type SQLMode int diff --git a/mysql/encoding.go b/mysql/encoding.go index 1245e48a..89215efa 100644 --- a/mysql/encoding.go +++ b/mysql/encoding.go @@ -117,7 +117,7 @@ func AppendLenEncInt(data []byte, i uint64) []byte { return data } -// LenNullString return lenght Null terminated string +// LenNullString return length Null terminated string func LenNullString(value string) int { return len(value) + 1 } @@ -397,11 +397,15 @@ func FormatBinaryDate(n int, data []byte) ([]byte, error) { switch n { case 0: return []byte("0000-00-00"), nil - case 4: + case 4, 7: + // 4 : 'dd 07 08 04' = 2015-08-04 + // 7 : 'dd 07 08 04 00 00 00' = 2015-08-04 00:00:00 mysql-connector-java testServPrepStmtSetObjectAndNewSupportedTypes return []byte(fmt.Sprintf("%04d-%02d-%02d", binary.LittleEndian.Uint16(data[:2]), data[2], data[3])), nil + case 10: // string '2017-02-17' + return data, nil default: return nil, fmt.Errorf("invalid date packet length %d", n) } @@ -436,6 +440,8 @@ func FormatBinaryDateTime(n int, data []byte) ([]byte, error) { data[5], data[6], binary.LittleEndian.Uint32(data[7:11]))), nil + case 19, 26: + return data, nil default: return nil, fmt.Errorf("invalid datetime packet length %d", n) } @@ -445,17 +451,23 @@ func FormatBinaryDateTime(n int, data []byte) ([]byte, error) { func FormatBinaryTime(n int, data []byte) ([]byte, error) { if n == 0 { return []byte("0000-00-00"), nil + } else if n == 1 { + if data[0] == 0 { + return []byte("00:00:00"), nil + } } - var sign byte + var sign string if data[0] == 1 { - sign = byte('-') + sign = "-" + } else { + sign = "" } switch n { case 8: return []byte(fmt.Sprintf( - "%c%02d:%02d:%02d", + "%s%02d:%02d:%02d", sign, uint16(data[1])*24+uint16(data[5]), data[6], @@ -463,7 +475,7 @@ func FormatBinaryTime(n int, data []byte) ([]byte, error) { )), nil case 12: return []byte(fmt.Sprintf( - "%c%02d:%02d:%02d.%06d", + "%s%02d:%02d:%02d.%06d", sign, uint16(data[1])*24+uint16(data[5]), data[6], diff --git a/mysql/encoding_test.go b/mysql/encoding_test.go index 32888488..13a133e8 100644 --- a/mysql/encoding_test.go +++ b/mysql/encoding_test.go @@ -69,7 +69,7 @@ func TestEncLenInt(t *testing.T) { t.Errorf("unexpected encoded value for %x, got %v expected %v", test.value, data, test.encoded) } - // Check succesful decoding. + // Check successful decoding. got, pos, _, ok := ReadLenEncInt(test.encoded, 0) if !ok || got != test.value || pos != len(test.encoded) { t.Errorf("ReadLenEncInt returned %x/%v/%v but expected %x/%v/%v", got, pos, ok, test.value, len(test.encoded), true) @@ -261,7 +261,7 @@ func TestEncString(t *testing.T) { t.Errorf("unexpected lenEncoded value for %v, got %v expected %v", test.value, data[1:], test.lenEncoded) } - // Check succesful decoding as string. + // Check successful decoding as string. got, pos, ok := readLenEncString(test.lenEncoded, 0) if !ok || got != test.value || pos != len(test.lenEncoded) { t.Errorf("readLenEncString returned %v/%v/%v but expected %v/%v/%v", got, pos, ok, test.value, len(test.lenEncoded), true) @@ -279,7 +279,7 @@ func TestEncString(t *testing.T) { t.Errorf("readLenEncString returned ok=true for empty value %v", test.value) } - // Check succesful skipping as string. + // Check successful skipping as string. pos, ok = skipLenEncString(test.lenEncoded, 0) if !ok || pos != len(test.lenEncoded) { t.Errorf("skipLenEncString returned %v/%v but expected %v/%v", pos, ok, len(test.lenEncoded), true) @@ -297,7 +297,7 @@ func TestEncString(t *testing.T) { t.Errorf("skipLenEncString returned ok=true for empty value %v", test.value) } - // Check succesful decoding as bytes. + // Check successful decoding as bytes. gotb, pos, _, ok := ReadLenEncStringAsBytes(test.lenEncoded, 0) if !ok || string(gotb) != test.value || pos != len(test.lenEncoded) { t.Errorf("readLenEncString returned %v/%v/%v but expected %v/%v/%v", gotb, pos, ok, test.value, len(test.lenEncoded), true) @@ -327,7 +327,7 @@ func TestEncString(t *testing.T) { t.Errorf("unexpected nullEncoded value for %v, got %v expected %v", test.value, data, test.nullEncoded) } - // Check succesful decoding. + // Check successful decoding. got, pos, ok = ReadNullString(test.nullEncoded, 0) if !ok || got != test.value || pos != len(test.nullEncoded) { t.Errorf("ReadNullString returned %v/%v/%v but expected %v/%v/%v", got, pos, ok, test.value, len(test.nullEncoded), true) diff --git a/mysql/error.go b/mysql/error.go index 0317f2c0..0c8a4d0a 100644 --- a/mysql/error.go +++ b/mysql/error.go @@ -38,11 +38,17 @@ import ( var ( // ErrBadConn bad connection error - ErrBadConn = errors.New("connection was bad") + ErrBadConn = NewSessionCloseError("connection was bad") + // ErrResetConn receive tcp RST packet error + ErrResetConn = errors.New("connection reset by peer") // ErrMalformPacket packet error ErrMalformPacket = errors.New("Malform packet error") // ErrTxDone transaction done error ErrTxDone = errors.New("sql: Transaction has already been committed or rolled back") + // ErrTxNsChanged namespace changed in transaction error + ErrTxNsChanged = errors.New("namespace changed in transaction when keep session") + // ErrClientQpsLimitedMsg client qps is limited error + ErrClientQpsLimitedMsg = "client qps limit" ) // SQLError contains error code、SQLSTATE and message string @@ -117,3 +123,40 @@ func NewErrf(errCode uint16, format string, args ...interface{}) *SQLError { return e } + +type SessionCloseError interface { + Error() string + HasResponse() bool +} + +type SessionCloseNoRespError struct { + s string +} + +type SessionCloseRespError struct { + s string +} + +func NewSessionCloseError(s string) SessionCloseError { + return &SessionCloseNoRespError{s} +} + +func (e *SessionCloseNoRespError) Error() string { + return e.s +} + +func (e *SessionCloseNoRespError) HasResponse() bool { + return false +} + +func NewSessionCloseRespError(s string) SessionCloseError { + return &SessionCloseRespError{s} +} + +func (e *SessionCloseRespError) Error() string { + return e.s +} + +func (e *SessionCloseRespError) HasResponse() bool { + return true +} diff --git a/mysql/error_code.go b/mysql/error_code.go index 24c0450e..b470076e 100644 --- a/mysql/error_code.go +++ b/mysql/error_code.go @@ -13,6 +13,11 @@ package mysql +import ( + "errors" + "strings" +) + // MySQL error code. // This value is numeric. It is not portable to other database systems. const ( @@ -915,4 +920,75 @@ const ( ErrWindowNoGroupOrderUnused = 3597 ErrWindowExplainJSON = 3598 ErrWindowFunctionIgnoresFrame = 3599 + ErrClientQpsLimited = 901 ) + +// IsTableSpaceMissingErr 检查给定的错误是否是缺少表空间 +func IsTableSpaceMissingErr(err error) bool { + return IsSQLErrorCode(err, ErrTablespaceMissing) +} + +// IsTablespaceAutoExtendErr 检查给定的错误是否是表空间自动扩展错误(与表空间的自动扩展配置有关) +func IsTablespaceAutoExtendErr(err error) bool { + return IsSQLErrorCode(err, ErrTablespaceAutoExtend) +} + +// IsTablespaceExistsErr 检查给定的错误是否是表空间已存在(在尝试创建新的表空间时发现同名表空间已存在) +func IsTablespaceExistsErr(err error) bool { + return IsSQLErrorCode(err, ErrTablespaceExists) +} + +// IsTableSpaceDiscardeErr 检查给定的错误是否是表空间已丢弃(尝试访问一个标记为丢弃的表空间) +func IsTableSpaceDiscardeErr(err error) bool { + return IsSQLErrorCode(err, ErrTablespaceDiscarded) +} + +// IsServerShutdownErr 检查给定的错误是否是MySQL服务器已关闭 +func IsServerShutdownErr(err error) bool { + return IsSQLErrorCode(err, ErrServerShutdown) +} + +// IsSQLSyntaxErr 检查给定的错误是否是SQL语法错误 +func IsSQLSyntaxErr(err error) bool { + return IsSQLErrorCode(err, ErrSyntax) +} + +// IsSQLNoPrivilegeErr 检查给定的错误是否表示没有足够的SQL权限。 +func IsSQLNoPrivilegeErr(err error) bool { + return IsSQLErrorCode(err, ErrSpecificAccessDenied) +} + +// IsSQLErrorCode check if error is a SQLError with the given code +func IsSQLErrorCode(err error, code uint16) bool { + var sqlErr *SQLError + if errors.As(err, &sqlErr) { + sqlCode := sqlErr.SQLCode() + return sqlCode == code + } + return false +} + +// IsWrongValueForVarErr checks if the given error indicates a wrong value +// for a SQL variable (e.g., "Variable '...' can't be set to the value of '...'"). +// It returns true if the error matches the ErrWrongValueForVar code. +func IsWrongValueForVarErr(err error) bool { + return IsSQLErrorCode(err, ErrWrongValueForVar) +} + +// IsSQLErrorWithMessage checks if the error is an SQL error with the given code +// and contains the specified message. It returns true if both the code and the +// message match. +func IsSQLErrorWithMessage(err error, code uint16, message string) bool { + var sqlErr *SQLError + if errors.As(err, &sqlErr) { + return sqlErr.SQLCode() == code && strings.Contains(sqlErr.Message, message) + } + return false +} + +// IsWrongValueForSQLModeErr checks if the given error is related to an invalid +// value for the sql_mode variable. It returns true if the error code matches +// ErrWrongValueForVar and the error message indicates an issue with sql_mode. +func IsWrongValueForSQLModeErr(err error) bool { + return IsSQLErrorWithMessage(err, ErrWrongValueForVar, "Variable 'sql_mode'") +} diff --git a/mysql/error_test.go b/mysql/error_test.go index b236ca0c..de9e9dda 100644 --- a/mysql/error_test.go +++ b/mysql/error_test.go @@ -15,6 +15,9 @@ package mysql import ( "github.com/pingcap/check" + "github.com/pingcap/errors" + "github.com/stretchr/testify/assert" + "testing" ) var _ = check.Suite(&testSQLErrorSuite{}) @@ -35,3 +38,51 @@ func (s *testSQLErrorSuite) TestSQLError(c *check.C) { e = NewDefaultError(0, "customized error") c.Assert(len(e.Error()), check.Greater, 0) } + +func TestRespError(t *testing.T) { + v := 0 + var writeResp = func(interface{}) error { + v += 1 + return nil + } + var writeRespErr = func(interface{}) error { + v += 1 + return errors.New("write resp error") + } + err1 := genRespErr(errors.New("normal error"), writeResp) + assert.Equal(t, err1, nil) + assert.Equal(t, v, 1) + err2 := genRespErr(NewSessionCloseError("close no resp"), writeResp) + assert.NotEqual(t, err2, nil) + assert.Equal(t, err2.Error(), "close no resp") + assert.Equal(t, v, 1) + err3 := genRespErr(NewSessionCloseRespError("close resp"), writeResp) + assert.NotEqual(t, err3, nil) + assert.Equal(t, err3.Error(), "close resp") + assert.Equal(t, v, 2) + err4 := genRespErr(errors.New("normal error"), writeRespErr) + assert.NotEqual(t, err4, nil) + assert.Equal(t, err4.Error(), "write resp error") + assert.Equal(t, v, 3) + err5 := genRespErr(NewSessionCloseError("close no resp"), writeRespErr) + assert.NotEqual(t, err5, nil) + assert.Equal(t, err5.Error(), "close no resp") + assert.Equal(t, v, 3) + err6 := genRespErr(NewSessionCloseRespError("close resp"), writeRespErr) + assert.NotEqual(t, err6, nil) + assert.Equal(t, err6.Error(), "close resp") + assert.Equal(t, v, 4) +} + +func genRespErr(err interface{}, writeResp func(interface{}) error) error { + switch err.(type) { + case *SessionCloseRespError: + writeResp(err) + return err.(*SessionCloseRespError) + case *SessionCloseNoRespError: + return err.(*SessionCloseNoRespError) + case error: + return writeResp(err.(error)) + } + return nil +} diff --git a/mysql/result.go b/mysql/result.go index ec1d1cb0..a6ade620 100644 --- a/mysql/result.go +++ b/mysql/result.go @@ -32,10 +32,9 @@ import ( "bytes" "encoding/binary" "fmt" - "strconv" - "github.com/XiaoMi/Gaea/core/errors" "github.com/XiaoMi/Gaea/util/hack" + "strconv" ) // RowData row in []byte format @@ -276,17 +275,30 @@ type Result struct { InsertID uint64 AffectedRows uint64 - + Warnings uint16 // OK包中的warnings信息,EOF包用的是Conn结构体中的warnings + Info string // update请求返回的Rows matched: 1 Changed: 1 Warnings: 0在info中 + pool *resultPool // 对象池复用 *Resultset } +// BuildBinaryResultSet build binary result set +func (r *Result) BuildBinaryResultSet() error { + if r != nil && r.Resultset != nil { + resultSet, err := BuildBinaryResultset(r.Fields, r.Values) + if err != nil { + return err + } + r.Resultset = resultSet + } + return nil +} + // Resultset means mysql results of sql execution, included split table sql type Resultset struct { Fields []*Field // columns information FieldNames map[string]int // column information, key: column name value: index in Fields Values [][]interface{} // values after sql handled - - RowDatas []RowData // data will returned + RowDatas []RowData // data will returned } // RowNumber return row number of results @@ -554,7 +566,7 @@ func BuildBinaryResultset(fields []*Field, values [][]interface{}) (*Resultset, r.Fields[i] = fields[i] } - bitmapLen := ((len(fields) + 7 + 2) >> 3) + bitmapLen := (len(fields) + 7 + 2) >> 3 for i, v := range values { if len(v) != len(r.Fields) { return nil, fmt.Errorf("row %d has %d columns not equal %d", i, len(v), len(r.Fields)) diff --git a/mysql/result_pool.go b/mysql/result_pool.go new file mode 100644 index 00000000..0a354233 --- /dev/null +++ b/mysql/result_pool.go @@ -0,0 +1,85 @@ +// Copyright 2024 The Gaea Authors. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// 借鉴 zap 优秀的设计 + +package mysql + +import "sync" + +type resultPool struct { + p1 *sync.Pool + p2 *sync.Pool +} + +var ResultPool = &resultPool{ + // 有 result 的对象池 + p1: &sync.Pool{ + New: func() interface{} { + return new(Result) + }, + }, + // 没有 result 的对象池 + p2: &sync.Pool{ + New: func() interface{} { + return new(Result) + }, + }, +} + +func (rp *resultPool) Get() *Result { + r := rp.p1.Get().(*Result) + r.pool = rp + r.Reset() + if r.Resultset == nil { + r.Resultset = &Resultset{} + } + return r +} + +func (rp *resultPool) GetWithoutResultSet() *Result { + r := rp.p2.Get().(*Result) + r.pool = rp + r.Reset() + r.Resultset = nil + return r +} + +func (rp *resultPool) Put(r *Result) { + if r.Resultset != nil { + rp.p1.Put(r) + } else { + rp.p2.Put(r) + } +} + +func (r *Result) Reset() { + r.Status = 0 + r.InsertID = 0 + r.AffectedRows = 0 + r.Warnings = 0 + r.Info = "" + if r.Resultset != nil { + r.Resultset.Fields = r.Resultset.Fields[:0] + r.Resultset.Values = r.Resultset.Values[:0] + r.Resultset.RowDatas = r.Resultset.RowDatas[:0] + r.Resultset.FieldNames = make(map[string]int) + } +} + +func (r *Result) Free() { + if r.pool != nil { + r.pool.Put(r) + } +} diff --git a/mysql/result_pool_test.go b/mysql/result_pool_test.go new file mode 100644 index 00000000..4a3ee50b --- /dev/null +++ b/mysql/result_pool_test.go @@ -0,0 +1,55 @@ +// Copyright 2024 The Gaea Authors. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package mysql + +import ( + "testing" + + "github.com/stretchr/testify/assert" +) + +// test result set +func TestGetResultSet(t *testing.T) { + rs := ResultPool.Get() + assert.Equal(t, rs.Resultset == nil, false) + rs.Free() + rs = ResultPool.GetWithoutResultSet() + assert.Equal(t, rs.Resultset == nil, true) + rs.Free() + rss := make([]*Result, 0) + for i := 0; i < 10; i++ { + rs = ResultPool.Get() + assert.Equal(t, rs.Resultset == nil, false) + rss = append(rss, rs) + } + for i := 0; i < 10; i++ { + rs = ResultPool.GetWithoutResultSet() + assert.Equal(t, rs.Resultset == nil, true) + rss = append(rss, rs) + } + for _, rs := range rss { + rs.Free() + } + for i := 0; i < 10; i++ { + rs = ResultPool.Get() + assert.Equal(t, rs.Resultset == nil, false) + rs.Free() + } + for i := 0; i < 10; i++ { + rs = ResultPool.GetWithoutResultSet() + assert.Equal(t, rs.Resultset == nil, true) + rs.Free() + } +} diff --git a/mysql/resultset_sort.go b/mysql/resultset_sort.go index be8c3a2f..57b6862b 100644 --- a/mysql/resultset_sort.go +++ b/mysql/resultset_sort.go @@ -99,7 +99,7 @@ func (r *ResultsetSorter) Less(i, j int) bool { return false } -//compare value using asc +// compare value using asc func cmpValue(v1 interface{}, v2 interface{}) int { if v1 == nil && v2 == nil { return 0 diff --git a/mysql/sql_fingerprint.go b/mysql/sql_fingerprint.go index 906647b9..9757b4bf 100644 --- a/mysql/sql_fingerprint.go +++ b/mysql/sql_fingerprint.go @@ -88,6 +88,7 @@ var ReplaceNumbersInWords = false // - Collapse whitespace // - Remove comments // - Lowercase everything +// // Additional trasnformations are performed which change the syntax of the // original query without affecting its performance characteristics. For // example, "ORDER BY col ASC" is the same as "ORDER BY col", so "ASC" in the diff --git a/mysql/sql_fingerprint_test.go b/mysql/sql_fingerprint_test.go index 1822d4f6..3b618141 100644 --- a/mysql/sql_fingerprint_test.go +++ b/mysql/sql_fingerprint_test.go @@ -28,8 +28,35 @@ package mysql import ( "testing" + + "github.com/stretchr/testify/assert" ) +func TestFingerPrint(t *testing.T) { + tests := []struct { + name string + sql string + want string + }{ + { + name: "test_select", + sql: "SELECT * from `t1` where id IN(5)", + want: "select * from `t1` where id in(?+)", + }, + { + name: "test_update", + sql: "UPDATE `t1` set `column`=1 where id IN(5)", + want: "update `t1` set `column`=? where id in(?+)", + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + fingerprin := GetFingerprint(tt.sql) + assert.Equal(t, fingerprin, tt.want) + }) + } +} + func TestFingerprintBasic(t *testing.T) { var q, fp string diff --git a/mysql/util.go b/mysql/util.go index 23913626..37a54955 100644 --- a/mysql/util.go +++ b/mysql/util.go @@ -29,8 +29,10 @@ package mysql import ( + "bytes" "crypto/sha1" "crypto/sha256" + "encoding/hex" "math/rand" "time" "unicode/utf8" @@ -71,6 +73,32 @@ func CalcPassword(scramble, password []byte) []byte { return scramble } +// CheckHashPassword 以密文密码模式验证客户端密码 +func CheckHashPassword(clientResp, scramble, encryptPassword []byte) bool { + // Client + // SHA1('password') XOR SHA1("20-bytes rnd"+SHA1(SHA1('password'))) + // Server + // SHA1(client-response XOR SHA1("20-bytes rnd"+mysql.user.password)) + if len(encryptPassword) == 0 { + return false + } + hashBytes, _ := hex.DecodeString(string(encryptPassword)) + crypt := sha1.New() + crypt.Write(scramble) + crypt.Write(hashBytes) + hash := crypt.Sum(nil) + + for i := range clientResp { + clientResp[i] ^= hash[i] + } + + crypt.Reset() + crypt.Write(clientResp) + hash = crypt.Sum(nil) + + return bytes.Equal(hashBytes, hash) +} + func CalcCachingSha2Password(salt []byte, password string) []byte { if len(password) == 0 { return nil @@ -96,6 +124,35 @@ func CalcCachingSha2Password(salt []byte, password string) []byte { return message1 } +// CalcPasswordSHA1 根据一次sha1加密半成品生成最终加密串 +func CalcPasswordSHA1(scramble, passwordSHA1 []byte) []byte { + if len(passwordSHA1) == 0 { + return nil + } + + // stage1 = SHA1(password) + stage1, _ := hex.DecodeString(string(passwordSHA1)) + + // scrambleHash = SHA1(scramble + SHA1(stage1Hash)) + // inner Hash + crypt := sha1.New() + crypt.Reset() + crypt.Write(stage1) + hash := crypt.Sum(nil) + + // outer Hash + crypt.Reset() + crypt.Write(scramble) + crypt.Write(hash) + scramble = crypt.Sum(nil) + + // token = scrambleHash XOR stage1Hash + for i := range scramble { + scramble[i] ^= stage1[i] + } + return scramble +} + // RandomBuf return random salt, seed must be in the range of ascii func RandomBuf(size int) ([]byte, error) { buf := make([]byte, size) diff --git a/mysql/variables.go b/mysql/variables.go index e1bfa7ee..bb9f98f2 100644 --- a/mysql/variables.go +++ b/mysql/variables.go @@ -18,17 +18,25 @@ import ( "fmt" "strconv" "strings" - - "github.com/XiaoMi/Gaea/core/errors" ) type verifyFunc func(interface{}) error // allowed session variables const ( - SQLModeStr = "sql_mode" - SQLSafeUpdates = "sql_safe_updates" - TimeZone = "time_zone" + SQLModeStr = "sql_mode" + SQLSafeUpdates = "sql_safe_updates" + TimeZone = "time_zone" + SQLSelectLimit = "sql_select_limit" + TxReadOnly = "tx_read_only" + TransactionReadOnly = "transaction_read_only" + CharacterSetConnection = "character_set_connection" + CharacterSetResults = "character_set_results" + CharacterSetClient = "character_set_client" + GroupConcatMaxLen = "group_concat_max_len" + MaxExecutionTime = "max_execution_time" + UniqueChecks = "unique_checks" + TransactionIsolation = "transaction_isolation" ) // not allowed session variables @@ -37,9 +45,19 @@ const ( ) var variableVerifyFuncMap = map[string]verifyFunc{ - SQLModeStr: verifySQLMode, - SQLSafeUpdates: verifyOnOffInteger, - TimeZone: verifyTimeZone, + SQLModeStr: verifySQLMode, + SQLSafeUpdates: verifyOnOffInteger, + TimeZone: verifyTimeZone, + SQLSelectLimit: verifyInteger, + TxReadOnly: verifyOnOffInteger, + TransactionReadOnly: verifyOnOffInteger, + CharacterSetConnection: verifyString, + CharacterSetResults: verifyString, + CharacterSetClient: verifyString, + GroupConcatMaxLen: verifyInteger, + MaxExecutionTime: verifyInteger, + UniqueChecks: verifyOnOffInteger, + TransactionIsolation: verifyString, } // SessionVariables variables in session @@ -72,7 +90,27 @@ func (s *SessionVariables) Equals(dst *SessionVariables) bool { return true } -// SetEqualsWith set the SessionVariables equals with the dst, and variables not contained in dst are moved to unused. +// SetEqualsWith sets the SessionVariables of the current instance (s) to be equal to those of the destination instance (dst). +// This method ensures that all session variables from dst are replicated in s, and any variables not present in dst are moved to the 'unused' map. +// It returns a boolean indicating if any variables were changed, and an error if any operations fail. +// +// The method handles several scenarios: +// +// 1. If s.variables is empty and dst.variables is not, all variables from dst are copied to s. +// This scenario is for initializing s with the settings from dst when s has no prior variables. +// +// 2. If s.variables is not empty and dst.variables is empty, all variables from s are moved to s.unused. +// This scenario applies when it's determined that no session variables should be actively used in s, +// perhaps resetting s to a state without active session variables. +// +// 3. The general case when both s.variables and dst.variables have variables: +// - It iterates through all variables in dst.variables: +// a. If a variable also exists in s.variables and their values differ, the value from dst is set in s. +// b. If a variable does not exist in s.variables, it is added to s. +// - It then checks for variables that exist in s.variables but not in dst.variables. +// a. Such variables are moved to s.unused to indicate they are no longer actively needed. +// +// SetEqualsWith ensures that s.variables reflect exactly what is in dst.variables post-execution, with any extraneous variables moved to unused. func (s *SessionVariables) SetEqualsWith(dst *SessionVariables) ( /*changed*/ bool, error) { if len(s.variables) == 0 && len(dst.variables) != 0 { for _, v := range dst.variables { @@ -91,22 +129,33 @@ func (s *SessionVariables) SetEqualsWith(dst *SessionVariables) ( /*changed*/ bo return true, nil } + // 用于记录是否有变量更新 changed := false - for variableName := range variableVerifyFuncMap { - srcVar, srcOK := s.variables[variableName] - dstVar, dstOK := dst.variables[variableName] - if srcOK && dstOK { + + for name, dstVar := range dst.variables { + if srcVar, ok := s.variables[name]; ok { + // 如果源存在相同名称的变量并且值不同,则更新 if srcVar.Get() != dstVar.Get() { + if err := srcVar.Set(dstVar.Get()); err != nil { + return false, err + } changed = true - srcVar.Set(dstVar.Get()) } - } else if srcOK && !dstOK { + } else { + // 如果源不存在这个变量,则添加 + if err := s.Set(name, dstVar.Get()); err != nil { + return false, err + } changed = true - s.unused[variableName] = srcVar - delete(s.variables, variableName) - } else if !srcOK && dstOK { + } + } + + // 检查源中有而目标中没有的变量,这些变量应被视为不再使用 + for name, srcVar := range s.variables { + if _, ok := dst.variables[name]; !ok { + s.unused[name] = srcVar + delete(s.variables, name) changed = true - s.Set(variableName, dstVar.Get()) } } @@ -123,7 +172,9 @@ func (s *SessionVariables) Set(key string, value interface{}) error { formatKey := formatVariableName(key) verifyFunc, ok := variableVerifyFuncMap[formatKey] if !ok { - return fmt.Errorf("variable not support") + // Allows the program to perform default validation processing on unsupported or undefined variable names + // instead of returning an error directly + verifyFunc = verifyDefault } if variable, ok := s.variables[formatKey]; ok { @@ -156,6 +207,37 @@ func (s *SessionVariables) GetUnusedAndClear() map[string]*Variable { return unused } +// Reset removes any session variables that are not recognized according to the current verification rules. +func (s *SessionVariables) Reset(err error) { + // Retrieve all current session variables. + allVars := s.GetAll() + // Iterate through all the variables. + for key := range allVars { + // Check if there is a verification function for the key in the map. + if _, ok := variableVerifyFuncMap[key]; !ok { + // If the key is not found in the verification function map, delete it from session variables. + s.Delete(key) + } + } + // Check if the error is related to an invalid sql_mode + if IsWrongValueForSQLModeErr(err) { + // Remove the invalid sql_mode from session variables + s.RemoveInvalidSQLMode() + } + +} + +func (s *SessionVariables) RemoveInvalidSQLMode() { + // Check if 'sql_mode' exists in the session variables + if _, ok := s.Get("sql_mode"); ok { + // Assume the verification function is available in the variableVerifyFuncMap + if _, exists := variableVerifyFuncMap["sql_mode"]; exists { + // If verification fails, remove 'sql_mode' + s.Delete("sql_mode") + } + } +} + func formatVariableName(name string) string { name = strings.Trim(name, "'`\"") name = strings.ToLower(name) @@ -210,14 +292,6 @@ func verifySQLMode(v interface{}) error { return nil } - value = strings.Trim(value, "'`\"") - value = strings.ToUpper(value) - values := strings.Split(value, ",") - for _, sqlMode := range values { - if _, ok := SQLModeSet[sqlMode]; !ok { - return errors.ErrInvalidSQLMode - } - } return nil } @@ -270,6 +344,14 @@ func verifyOnOffInteger(v interface{}) error { return nil } +func verifyInteger(v interface{}) error { + _, ok := v.(int64) + if !ok { + return fmt.Errorf("value is not int64") + } + return nil +} + func verifyTimeZone(v interface{}) error { value, ok := v.(string) if !ok { @@ -302,3 +384,15 @@ func verifyTimeZone(v interface{}) error { return nil } + +func verifyString(v interface{}) error { + _, ok := v.(string) + if !ok { + return fmt.Errorf("value is not string type") + } + return nil +} + +func verifyDefault(v interface{}) error { + return nil +} diff --git a/mysql/variables_test.go b/mysql/variables_test.go new file mode 100644 index 00000000..7c477c15 --- /dev/null +++ b/mysql/variables_test.go @@ -0,0 +1,279 @@ +// Copyright 2024 The Gaea Authors. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package mysql + +import ( + "fmt" + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestSetEqualsWith(t *testing.T) { + // Test case 1: dst has variables not present in s + t.Run("Dst has additional variables", func(t *testing.T) { + // Create src and dst variables + s := NewSessionVariables() + dst := NewSessionVariables() + + // Adding a variable that only exists in dst + dst.Set("transaction_isolation", "READ-COMMITTED") + + // Store the original value of dst for comparison + originalDstVariables := make(map[string]interface{}) + for key, v := range dst.variables { + originalDstVariables[key] = v.Get() + } + + // Check if src has been updated + changed, err := s.SetEqualsWith(dst) + assert.Nil(t, err, "No error should occur during variable synchronization") + assert.True(t, changed, "The 'changed' flag should be true as there are updates and movements of variables") + assert.Nil(t, err, "No error should occur when setting variables") + assert.True(t, changed, "The 'changed' flag should be true as variables were added") + assert.Equal(t, "READ-COMMITTED", s.variables["transaction_isolation"].Get(), "The value of 'transaction_isolation' should match the dst") + + // Check if dst has not been altered + for key, originalValue := range originalDstVariables { + currentVar, exists := dst.variables[key] + assert.True(t, exists, fmt.Sprintf("%s should still exist in dst", key)) + assert.Equal(t, originalValue, currentVar.Get(), fmt.Sprintf("The value of %s in dst should not change", key)) + } + for key := range dst.variables { + _, exists := originalDstVariables[key] + assert.True(t, exists, fmt.Sprintf("No new variables should be added to dst, found %s", key)) + } + }) + + // Test case 2: s has variables not present in dst (should be moved to unused) + t.Run("S has additional variables", func(t *testing.T) { + // Create src and dst variables + s := NewSessionVariables() + dst := NewSessionVariables() + + // Adding a variable that only exists in s + s.Set("max_execution_time", int64(1000)) + + // Store the original value of dst for comparison + originalDstVariables := make(map[string]interface{}) + for key, v := range dst.variables { + originalDstVariables[key] = v.Get() + } + + // Check if src has been updated + changed, err := s.SetEqualsWith(dst) + assert.Nil(t, err, "No error should occur during variable synchronization") + assert.True(t, changed, "The 'changed' flag should be true as there are updates and movements of variables") + _, existsInVariables := s.variables["max_execution_time"] + _, existsInUnused := s.unused["max_execution_time"] + assert.False(t, existsInVariables, "The 'max_execution_time' should not exist in active variables") + assert.True(t, existsInUnused, "The 'max_execution_time' should exist in unused variables") + + // Check if dst has not been altered + for key, originalValue := range originalDstVariables { + currentVar, exists := dst.variables[key] + assert.True(t, exists, fmt.Sprintf("%s should still exist in dst", key)) + assert.Equal(t, originalValue, currentVar.Get(), fmt.Sprintf("The value of %s in dst should not change", key)) + } + for key := range dst.variables { + _, exists := originalDstVariables[key] + assert.True(t, exists, fmt.Sprintf("No new variables should be added to dst, found %s", key)) + } + + }) + + // Test case 3: Both s and dst have the same variables but different values + t.Run("Same variables, different values", func(t *testing.T) { + // Create src and dst variables + s := NewSessionVariables() + dst := NewSessionVariables() + + // Adding a variable that exists in src and dst + s.Set("unique_checks", int64(0)) + dst.Set("unique_checks", int64(1)) + + // Store the original value of dst for comparison + originalDstVariables := make(map[string]interface{}) + for key, v := range dst.variables { + originalDstVariables[key] = v.Get() + } + + // Check if src has been updated + changed, err := s.SetEqualsWith(dst) + assert.Nil(t, err, "No error should occur when updating variables") + assert.True(t, changed, "The 'changed' flag should be true as variables values were updated") + assert.Equal(t, int64(1), s.variables["unique_checks"].Get(), "The value of 'unique_checks' should be updated to match dst") + + // Check if dst has not been altered + for key, originalValue := range originalDstVariables { + currentVar, exists := dst.variables[key] + assert.True(t, exists, fmt.Sprintf("%s should still exist in dst", key)) + assert.Equal(t, originalValue, currentVar.Get(), fmt.Sprintf("The value of %s in dst should not change", key)) + } + for key := range dst.variables { + _, exists := originalDstVariables[key] + assert.True(t, exists, fmt.Sprintf("No new variables should be added to dst, found %s", key)) + } + + }) + // Test case 4: S and dst have partially overlapping variables + t.Run("Partially overlapping variables", func(t *testing.T) { + // Create src and dst variables + s := NewSessionVariables() + dst := NewSessionVariables() + + // Adding variables to src (s) and dst + s.Set("key1", "value1") // unique to s + s.Set("key2", "value2-old") // overlaps with dst, different value + s.Set("key3", "value3") // overlaps with dst, same value + + dst.Set("key2", "value2-new") // overlaps with s, updated value + dst.Set("key3", "value3") // overlaps with s, same value + dst.Set("key4", "value4") // unique to dst + + // Store the original value of dst for comparison + originalDstVariables := make(map[string]interface{}) + for key, v := range dst.variables { + originalDstVariables[key] = v.Get() + } + + // Check if src has been updated + changed, err := s.SetEqualsWith(dst) + assert.Nil(t, err, "No error should occur when syncing variables") + assert.True(t, changed, "The 'changed' flag should be true as there are variable updates and movements") + + _, key1ExistsInVariables := s.variables["key1"] + _, key1ExistsInUnused := s.unused["key1"] + assert.False(t, key1ExistsInVariables, "key1 should not exist in active variables") + assert.True(t, key1ExistsInUnused, "key1 should exist in unused variables") + + assert.Equal(t, "value2-new", s.variables["key2"].Get(), "key2 should be updated to 'value2-new'") + assert.Equal(t, "value3", s.variables["key3"].Get(), "key3 should remain unchanged with 'value3'") + + _, key4ExistsInVariables := s.variables["key4"] + assert.True(t, key4ExistsInVariables, "key4 should be added to active variables") + assert.Equal(t, "value4", s.variables["key4"].Get(), "key4 should have the value 'value4'") + + // Check if dst has not been altered + for key, originalValue := range originalDstVariables { + currentVar, exists := dst.variables[key] + assert.True(t, exists, fmt.Sprintf("%s should still exist in dst", key)) + assert.Equal(t, originalValue, currentVar.Get(), fmt.Sprintf("The value of %s in dst should not change", key)) + } + for key := range dst.variables { + _, exists := originalDstVariables[key] + assert.True(t, exists, fmt.Sprintf("No new variables should be added to dst, found %s", key)) + } + }) + + // Test case 5: S and dst have partially overlapping variables of type bool + t.Run("Partially overlapping variables with bool", func(t *testing.T) { + // Create src and dst variables + s := NewSessionVariables() + dst := NewSessionVariables() + + // Adding bool variables to src (s) and dst + s.Set("flag1", true) // unique to s + s.Set("flag2", false) // overlaps with dst, different value + s.Set("flag3", true) // overlaps with dst, same value + + dst.Set("flag2", true) // overlaps with s, updated value + dst.Set("flag3", true) // overlaps with s, same value + dst.Set("flag4", false) // unique to dst + + // Store the original value of dst for comparison + originalDstVariables := make(map[string]interface{}) + for key, v := range dst.variables { + originalDstVariables[key] = v.Get() + } + + // Check if src has been updated + changed, err := s.SetEqualsWith(dst) + assert.Nil(t, err, "No error should occur when syncing variables") + assert.True(t, changed, "The 'changed' flag should be true as there are variable updates and movements") + + _, flag1ExistsInVariables := s.variables["flag1"] + _, flag1ExistsInUnused := s.unused["flag1"] + assert.False(t, flag1ExistsInVariables, "flag1 should not exist in active variables") + assert.True(t, flag1ExistsInUnused, "flag1 should exist in unused variables") + + assert.Equal(t, true, s.variables["flag2"].Get(), "flag2 should be updated to 'true'") + assert.Equal(t, true, s.variables["flag3"].Get(), "flag3 should remain unchanged with 'true'") + + _, flag4ExistsInVariables := s.variables["flag4"] + assert.True(t, flag4ExistsInVariables, "flag4 should be added to active variables") + assert.Equal(t, false, s.variables["flag4"].Get(), "flag4 should have the value 'false'") + + // Check if dst has not been altered + for key, originalValue := range originalDstVariables { + currentVar, exists := dst.variables[key] + assert.True(t, exists, fmt.Sprintf("%s should still exist in dst", key)) + assert.Equal(t, originalValue, currentVar.Get(), fmt.Sprintf("The value of %s in dst should not change", key)) + } + for key := range dst.variables { + _, exists := originalDstVariables[key] + assert.True(t, exists, fmt.Sprintf("No new variables should be added to dst, found %s", key)) + } + }) + + // Test case6 : S and dst have partially overlapping variables of type int64 + t.Run("Partially overlapping variables with int", func(t *testing.T) { + // Create src and dst variables + s := NewSessionVariables() + dst := NewSessionVariables() + + // Adding int64 variables to src (s) and dst + s.Set("key1", 100) // unique to s + s.Set("key2", 200) // overlaps with dst, different value + s.Set("key3", 300) // overlaps with dst, same value + + dst.Set("key2", 250) // overlaps with s, updated value + dst.Set("key3", 300) // overlaps with s, same value + dst.Set("key4", 400) // unique to dst + // Store the original value of dst for comparison + originalDstVariables := make(map[string]interface{}) + for key, v := range dst.variables { + originalDstVariables[key] = v.Get() + } + + // Check if src has been updated + changed, err := s.SetEqualsWith(dst) + assert.Nil(t, err, "No error should occur when syncing variables") + assert.True(t, changed, "The 'changed' flag should be true as there are variable updates and movements") + + _, key1ExistsInVariables := s.variables["key1"] + _, key1ExistsInUnused := s.unused["key1"] + assert.False(t, key1ExistsInVariables, "key1 should not exist in active variables") + assert.True(t, key1ExistsInUnused, "key1 should exist in unused variables") + + assert.Equal(t, 250, s.variables["key2"].Get(), "key2 should be updated to '250'") + assert.Equal(t, 300, s.variables["key3"].Get(), "key3 should remain unchanged with '300'") + + _, key4ExistsInVariables := s.variables["key4"] + assert.True(t, key4ExistsInVariables, "key4 should be added to active variables") + assert.Equal(t, 400, s.variables["key4"].Get(), "key4 should have the value '400'") + + // Check if dst has not been altered + for key, originalValue := range originalDstVariables { + currentVar, exists := dst.variables[key] + assert.True(t, exists, fmt.Sprintf("%s should still exist in dst", key)) + assert.Equal(t, originalValue, currentVar.Get(), fmt.Sprintf("The value of %s in dst should not change", key)) + } + for key := range dst.variables { + _, exists := originalDstVariables[key] + assert.True(t, exists, fmt.Sprintf("No new variables should be added to dst, found %s", key)) + } + }) +} diff --git a/parser/Makefile b/parser/Makefile index 6cca49ad..ef79f493 100644 --- a/parser/Makefile +++ b/parser/Makefile @@ -1,46 +1,37 @@ -.PHONY: all parser clean +.PHONY: all parser clean goyacc ARCH:="$(shell uname -s)" MAC:="Darwin" LINUX:="Linux" -GOYACCBIN:="" -ifeq ($(ARCH), $(LINUX)) - GOYACCBIN=./goyacc -else - ifeq ($(ARCH), $(MAC)) - GOYACCBIN=./goyacc - else - GOYACCBIN=./goyacc - endif -endif all: parser.go fmt test: parser.go fmt - sh test.sh + GO111MODULE=on go test ./... -coverprofile=coverage.out parser.go: parser.y make parser parser: goyacc - ${GOYACCBIN} -o /dev/null parser.y - $(GOYACCBIN) -o parser.go parser.y 2>&1 | egrep "(shift|reduce)/reduce" | awk '{print} END {if (NR > 0) {print "Find conflict in parser.y. Please check y.output for more information."; exit 1;}}' + ./goyacc/bin/goyacc -o /dev/null parser.y + ./goyacc/bin/goyacc -o parser.go parser.y 2>&1 | egrep "(shift|reduce)/reduce" | awk '{print} END {if (NR > 0) {print "Find conflict in parser.y. Please check y.output for more information."; exit 1;}}' rm -f y.output - @if [ $(ARCH) = $(LINUX) ]; \ - then \ - sed -i -e 's|//line.*||' -e 's/yyEofCode/yyEOFCode/' parser.go; \ - elif [ $(ARCH) = $(MAC) ]; \ - then \ - /usr/bin/sed -i "" 's|//line.*||' parser.go; \ - /usr/bin/sed -i "" 's/yyEofCode/yyEOFCode/' parser.go; \ - fi +# @if [ $(ARCH) = $(LINUX) ]; \ +# then \ +# sed -i -e 's|//line.*||' -e 's/yyEofCode/yyEOFCode/' parser.go; \ +# elif [ $(ARCH) = $(MAC) ]; \ +# then \ +# /usr/bin/sed -i "" 's|//line.*||' parser.go; \ +# /usr/bin/sed -i "" 's/yyEofCode/yyEOFCode/' parser.go; \ +# fi @awk 'BEGIN{print "// Code generated by goyacc DO NOT EDIT."} {print $0}' parser.go > tmp_parser.go && mv tmp_parser.go parser.go; #bin/goyacc: goyacc/main.go goyacc: - #GO111MODULE=on go build -o bin/goyacc goyacc/main.go + #@echo "build goyacc" + cd ./goyacc && make goyacc fmt: #@echo "gofmt (simplify)" diff --git a/parser/README.md b/parser/README.md new file mode 100644 index 00000000..a45d295c --- /dev/null +++ b/parser/README.md @@ -0,0 +1,21 @@ +# parser + + +## goyacc +基于 tidb 的 goyacc 版本:https://github.com/pingcap/parser/releases/tag/v2.1.5 + +### 使用 + +```bash +# 编译 goyacc +make goyacc + +# 生成 parser.go +make parser + +``` + +- 修改 parser.y 后请添加对应的测试用例,并保证测试通过 +```bash +make test +``` diff --git a/parser/analyzer.go b/parser/analyzer.go index 7fca9568..6eea2b9e 100644 --- a/parser/analyzer.go +++ b/parser/analyzer.go @@ -44,6 +44,24 @@ const ( StmtUnknown StmtComment StmtSavepoint + StmtPriv + StmtExplain + StmeSRollback + StmtRelease + StmtLockTables + StmtUnlockTables + StmtFlush + StmtCallProc + StmtRevert + StmtShowMigrationLogs + StmtCommentOnly + StmtPrepare + StmtExecute + StmtDeallocate + StmtKill +) +const ( + eofChar = 0x100 ) // Preview analyzes the beginning of the query using a simpler and faster @@ -51,11 +69,16 @@ const ( func Preview(sql string) int { trimmed := StripLeadingComments(sql) - firstWord := trimmed - if end := strings.IndexFunc(trimmed, unicode.IsSpace); end != -1 { - firstWord = trimmed[:end] + if strings.Index(trimmed, "/*!") == 0 { + return StmtComment + } + + isNotLetter := func(r rune) bool { return !unicode.IsLetter(r) } + firstWord := strings.TrimLeftFunc(trimmed, isNotLetter) + + if end := strings.IndexFunc(firstWord, unicode.IsSpace); end != -1 { + firstWord = firstWord[:end] } - firstWord = strings.TrimLeftFunc(firstWord, func(r rune) bool { return !unicode.IsLetter(r) }) // Comparison is done in order of priority. loweredFirstWord := strings.ToLower(firstWord) switch loweredFirstWord { @@ -71,6 +94,12 @@ func Preview(sql string) int { return StmtUpdate case "delete": return StmtDelete + case "savepoint": + return StmtSavepoint + case "lock": + return StmtLockTables + case "unlock": + return StmtUnlockTables } // For the following statements it is not sufficient to rely // on loweredFirstWord. This is because they are not statements @@ -81,31 +110,34 @@ func Preview(sql string) int { switch strings.ToLower(trimmedNoComments) { case "begin", "start transaction": return StmtBegin + case "commit": + return StmtCommit + case "rollback": + return StmtRollback } switch loweredFirstWord { - case "create", "alter", "rename", "drop", "truncate", "flush": + case "create", "alter", "rename", "drop", "truncate": return StmtDDL + case "flush": + return StmtFlush case "set": return StmtSet case "show": return StmtShow case "use": return StmtUse - case "analyze", "describe", "desc", "explain", "repair", "optimize": + case "explain": + return StmtExplain + case "analyze", "describe", "desc", "repair", "optimize": return StmtOther - case "commit": - return StmtCommit + case "release": + return StmtRelease case "rollback": - return StmtRollback - case "savepoint": - return StmtSavepoint - } - if strings.Index(trimmedNoComments, "release savepoint") == 0 { - return StmtSavepoint - } - if strings.Index(trimmed, "/*!") == 0 { - return StmtComment + return StmeSRollback + case "kill": + return StmtKill } + return StmtUnknown } @@ -146,3 +178,126 @@ func StmtType(stmtType int) string { return "UNKNOWN" } } + +// SplitStatementToPieces split raw sql statement that may have multi sql pieces to sql pieces +// returns the sql pieces blob contains; or error if sql cannot be parsed +func SplitStatementToPieces(blob string) (pieces []string, err error) { + // fast path: the vast majority of SQL statements do not have semicolons in them + if blob == "" { + return nil, nil + } + switch strings.IndexByte(blob, ';') { + case -1: // if there is no semicolon, return blob as a whole + return []string{blob}, nil + case len(blob) - 1: // if there's a single semicolon, and it's the last character, return blob without it + return []string{blob[:len(blob)-1]}, nil + } + + pieces = make([]string, 0, 16) + tokenizer := NewScanner(blob) + + stmt := "" + emptyStatement := true + for stmtBegin := 0; stmtBegin < len(blob); { + tkn, pos, _ := tokenizer.scan() + switch tkn { + case ';': + stmt = blob[stmtBegin:pos.Offset] + if !emptyStatement { + pieces = append(pieces, stmt) + emptyStatement = true + } + stmtBegin = pos.Offset + 1 + case 0, eofChar: + blobTail := pos.Offset - 1 + if stmtBegin < blobTail { + stmt = blob[stmtBegin : blobTail+1] + if !emptyStatement { + pieces = append(pieces, stmt) + } + } + + if len(tokenizer.errs) > 0 { + err = tokenizer.errs[0] + } + return + default: + emptyStatement = false + } + } + return +} + +// Tokenize splits a SQL string into tokens. +func Tokenize(s string) []string { + s = strings.TrimSpace(s) + //trim -- comments + if strings.HasPrefix(s, "--") { + lines := strings.Split(s, "\n") + linesNoComment := []string{} + for _, line := range lines { + line = strings.TrimSpace(line) + if !strings.HasPrefix(line, "--") { + linesNoComment = append(linesNoComment, line) + } + } + s = strings.Join(linesNoComment, "\n") + } + tokens := strings.FieldsFunc(s, IsSqlSep) + // remove first version comment mark + // TODO: 处理 mycat hint: /* !mycat:sql=select 1 from order where order_id = 1 */ + if strings.HasPrefix(s, "/*!") { + if len(tokens) > 1 { + return tokens[1:] + } else { + return tokens + } + } else if strings.HasPrefix(s, "/*") { + masterHint := tokens[0] + idx := strings.Index(s, "*/") + if idx > 0 { + tokens = strings.FieldsFunc(s[idx+2:], IsSqlSep) + } + if masterHint == "*master*" { + tokens = append(tokens, masterHint) + } + } + return tokens +} + +func IsSqlSep(r rune) bool { + // '/' for separate comment '/*master*/' + return r == ' ' || r == ',' || + r == '\t' || r == '/' || + r == '\n' || r == '\r' +} + +// GetDBTable get the database name from token +func GetDBTable(token string) (string, string) { + if len(token) == 0 { + return "", "" + } + + vec := strings.SplitN(token, ".", 2) + if len(vec) == 2 { + return strings.Trim(vec[0], "`"), strings.Trim(vec[1], "`") + } else { + return "", strings.Trim(vec[0], "`") + } +} + +// GetInsertDBTable get the database name from token +func GetInsertDBTable(token string) (string, string) { + if len(token) == 0 { + return "", "" + } + + vec := strings.SplitN(token, ".", 2) + if len(vec) == 2 { + table := strings.Split(vec[1], "(") + return strings.Trim(vec[0], "`"), strings.Trim(table[0], "`") + } else { + table := strings.Split(vec[0], "(") + return "", strings.Trim(table[0], "`") + } +} diff --git a/parser/analyzer_test.go b/parser/analyzer_test.go new file mode 100644 index 00000000..159f1578 --- /dev/null +++ b/parser/analyzer_test.go @@ -0,0 +1,343 @@ +// Copyright 2024 The Gaea Authors. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package parser + +import ( + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestSplitStatementToPieces(t *testing.T) { + type testCase struct { + originSql string + expectSqls []string + assertEqual bool + } + + cases := []testCase{ + { + "select 1;select 2;", + []string{"select 1", "select 2"}, + true, + }, + { + "/*test*/select 1;/*test*/ select 2;", + []string{"/*test*/select 1", "/*test*/ select 2"}, + true, + }, + { + "select 1;/*test;*/ select 2;", + []string{"select 1", "/*test;*/ select 2"}, + true, + }, + { + "-- test;select 1", + []string{"-- test", "select 1"}, + false, + }, + } + + for _, tt := range cases { + res, err := SplitStatementToPieces(tt.originSql) + if err != nil { + t.Fatalf("SplitStatementToPieces err.sql:%s\n", tt.originSql) + } + if tt.assertEqual && !isEqSlice(tt.expectSqls, res) { + t.Fatalf("SplitStatementToPieces res not equal,sql:%s,res:%+q\n", tt.originSql, res) + } + } + +} + +func TestTokenize(t *testing.T) { + tests := []struct { + name string + sql string + want []string + }{ + { + name: "test simple", + sql: "select 1", + want: []string{"select", "1"}, + }, + { + name: "test simple with space", + sql: " select * from t ", + want: []string{"select", "*", "from", "t"}, + }, + { + name: "test simple with semicolon", + sql: "select * from t;", + want: []string{"select", "*", "from", "t;"}, + }, + { + name: "test simple with semicolon and db name", + sql: "select a,b from A.t", + want: []string{"select", "a", "b", "from", "A.t"}, + }, + { + name: "test select subquery", + sql: "select * from (select * from t1);", + want: []string{"select", "*", "from", "(select", "*", "from", "t1);"}, + }, + { + name: "test select subquery 2", + sql: "select a.* from (select * from t1 where id>1000) as a where a.id<2000;", + want: []string{"select", "a.*", "from", "(select", "*", "from", "t1", "where", "id>1000)", "as", "a", "where", "a.id<2000;"}, + }, + { + name: "test simple with tab", + sql: "select a b from A.t", + want: []string{"select", "a", "b", "from", "A.t"}, + }, + { + name: "test simple with comment in sql", + sql: "select /*master*/ a,b from A.t", + want: []string{"select", "*master*", "a", "b", "from", "A.t"}, + }, + { + name: "test select master hint leading", + sql: "/*master*/ select a,b from A.t", + want: []string{"select", "a", "b", "from", "A.t", "*master*"}, + }, + { + name: "test select master hint training", + sql: "select a,b from t /*master*/", + want: []string{"select", "a", "b", "from", "t", "*master*"}, + }, + { + name: "test mycat comment in sql", + sql: "select a,b from A.t /* !mycat:sql=select 1 */ ", + want: []string{"select", "a", "b", "from", "A.t", "*", "!mycat:sql=select", "1", "*"}, + }, + { + name: "test with comment in sql 2", + sql: "select 1 -- test", + want: []string{"select", "1", "--", "test"}, + }, + { + name: "test with comment in multi line sql", + sql: `-- aaa + -- bbb + ccc + -- ddd + eee`, + want: []string{"ccc", "eee"}, + }, + { + name: "test insert", + sql: "insert into tbl_unshard(col1) (select col1 from tbl_unshard_1);", + want: []string{"insert", "into", "tbl_unshard(col1)", "(select", "col1", "from", "tbl_unshard_1);"}, + }, + { + name: "test only comment", + sql: `/*slave*/`, + want: []string{}, + }, + { + name: "test special characters new line", + sql: "select * \nfrom t", + want: []string{"select", "*", "from", "t"}, + }, + { + name: "test special characters page Break", + sql: "select * \f from t", + want: []string{"select", "*", "\f", "from", "t"}, + }, + { + name: "test special characters vertical tabs", + sql: "select * \vfrom t", + want: []string{"select", "*", "\vfrom", "t"}, + }, + { + name: "test only comment", + sql: "select * \u00A0from t", + want: []string{"select", "*", "\u00a0from", "t"}, + }, + { + name: "test only comment", + sql: "select * from t\v", + want: []string{"select", "*", "from", "t"}, + }, + { + name: "test only comment", + sql: "select * from t\v", + want: []string{"select", "*", "from", "t"}, + }, + { + name: "test read_only", + sql: "/* hint */ select @@read_only", + want: []string{"select", "@@read_only"}, + }, + { + name: "test read_only", + sql: "select /* hint */ @@read_only", + want: []string{"select", "*", "hint", "*", "@@read_only"}, + }, + { + name: "test empty", + sql: " ", + want: []string{}, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + assert.Equalf(t, tt.want, Tokenize(tt.sql), "Tokenize(%v)", tt.sql) + }) + } +} + +func isEqSlice(a, b []string) bool { + if (a == nil) != (b == nil) { + return false + } + + if len(a) != len(b) { + return false + } + + for i := range a { + if a[i] != b[i] { + return false + } + } + + return true +} + +func TestGetInsertDBTable(t *testing.T) { + tests := []struct { + name string + token string + wantDB string + wantTable string + }{ + { + name: "test simple", + token: "t", + wantDB: "", + wantTable: "t", + }, + { + name: "test simple with db", + token: "db.t", + wantDB: "db", + wantTable: "t", + }, + { + name: "test simple with db and quote", + token: "`db`.`t`", + wantDB: "db", + wantTable: "t", + }, + { + name: "test simple with db and bracket", + token: "`db`.`t`(col1,col2)", + wantDB: "db", + wantTable: "t", + }, + { + name: "test simple without db and quote", + token: "t(col1,col2)", + wantDB: "", + wantTable: "t", + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + gotDB, gotTable := GetInsertDBTable(tt.token) + assert.Equalf(t, tt.wantDB, gotDB, "GetInsertDBTable(%v)", tt.token) + assert.Equalf(t, tt.wantTable, gotTable, "GetInsertDBTable(%v)", tt.token) + }) + } +} + +func TestPreview(t *testing.T) { + testcases := []struct { + sql string + want int + }{ + {"select ...", StmtSelect}, + {" select ...", StmtSelect}, + {"(select ...", StmtSelect}, + {"( select ...", StmtSelect}, + {"insert ...", StmtInsert}, + {"replace ....", StmtReplace}, + {" update ...", StmtUpdate}, + {"Update", StmtUpdate}, + {"UPDATE ...", StmtUpdate}, + {"\n\t delete ...", StmtDelete}, + {"", StmtUnknown}, + {" ", StmtUnknown}, + {"begin", StmtBegin}, + {" begin", StmtBegin}, + {" begin ", StmtBegin}, + {"\n\t begin ", StmtBegin}, + {"... begin ", StmtUnknown}, + {"begin ...", StmtUnknown}, + {"begin /* ... */", StmtBegin}, + {"begin /* ... *//*test*/", StmtBegin}, + {"begin;", StmtBegin}, + {"begin ;", StmtBegin}, + {"begin; /*...*/", StmtBegin}, + {"start transaction", StmtBegin}, + {"commit", StmtCommit}, + {"commit /*...*/", StmtCommit}, + {"rollback", StmtRollback}, + {"rollback /*...*/", StmtRollback}, + {"rollback to point", StmeSRollback}, + {"rollback to point /*...*/", StmeSRollback}, + {"savepoint point", StmtSavepoint}, + {"release savepoint point", StmtRelease}, + {"release savepoint point /*...*/", StmtRelease}, + {"lock tables", StmtLockTables}, + {"lock table t1 read, t2 write", StmtLockTables}, + {"unlock tables", StmtUnlockTables}, + {"flush", StmtFlush}, + {"create", StmtDDL}, + {"alter", StmtDDL}, + {"rename", StmtDDL}, + {"drop", StmtDDL}, + {"set", StmtSet}, + {"show", StmtShow}, + {"use", StmtUse}, + {"repair", StmtOther}, + {"optimize", StmtOther}, + {"truncate", StmtDDL}, + {"explain ", StmtExplain}, + {"unknown", StmtUnknown}, + + {"/* leading comment */ select ...", StmtSelect}, + {"/* leading comment */ (select ...", StmtSelect}, + {"/* leading comment */ /* leading comment 2 */ select ...", StmtSelect}, + {"/*! MySQL-specific comment */", StmtComment}, + {"/*!50708 MySQL-version comment */", StmtComment}, + {"-- leading single line comment \n select ...", StmtSelect}, + {"-- leading single line comment \n -- leading single line comment 2\n select ...", StmtSelect}, + + {"/* leading comment no end select ...", StmtUnknown}, + {"-- leading single line comment no end select ...", StmtUnknown}, + {"/*!40000 ALTER TABLE `t1` DISABLE KEYS */", StmtComment}} + + for _, tt := range testcases { + t.Run(tt.sql, func(t *testing.T) { + if got := Preview(tt.sql); got != tt.want { + t.Errorf("Preview(%s): %v, want %v", tt.sql, got, tt.want) + } + }) + + } +} diff --git a/parser/ast/ddl.go b/parser/ast/ddl.go index f9ea31d6..126c6b29 100755 --- a/parser/ast/ddl.go +++ b/parser/ast/ddl.go @@ -441,10 +441,12 @@ func (n *ColumnOption) Accept(v Visitor) (Node, bool) { } // IndexOption is the index options. -// KEY_BLOCK_SIZE [=] value -// | index_type -// | WITH PARSER parser_name -// | COMMENT 'string' +// +// KEY_BLOCK_SIZE [=] value +// | index_type +// | WITH PARSER parser_name +// | COMMENT 'string' +// // See http://dev.mysql.com/doc/refman/5.7/en/create-table.html type IndexOption struct { node @@ -1150,6 +1152,68 @@ func (n *DropIndexStmt) Accept(v Visitor) (Node, bool) { return v.Leave(n) } +// LockTablesStmt is a statement to lock tables. +type LockTablesStmt struct { + ddlNode + + TableLocks []TableLock +} + +// TableLock contains the table name and lock type. +type TableLock struct { + Table *TableName + Type model.TableLockType +} + +// Accept implements Node Accept interface. +func (n *LockTablesStmt) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*LockTablesStmt) + for i := range n.TableLocks { + node, ok := n.TableLocks[i].Table.Accept(v) + if !ok { + return n, false + } + n.TableLocks[i].Table = node.(*TableName) + } + return v.Leave(n) +} + +// Restore implements Node interface. +func (n *LockTablesStmt) Restore(ctx *format.RestoreCtx) error { + ctx.WriteKeyWord("LOCK TABLES ") + for i, tl := range n.TableLocks { + if i != 0 { + ctx.WritePlain(", ") + } + if err := tl.Table.Restore(ctx); err != nil { + return errors.Annotate(err, "An error occurred while add index") + } + ctx.WriteKeyWord(" " + tl.Type.String()) + } + return nil +} + +// UnlockTablesStmt is a statement to unlock tables. +type UnlockTablesStmt struct { + ddlNode +} + +// Accept implements Node Accept interface. +func (n *UnlockTablesStmt) Accept(v Visitor) (Node, bool) { + _, _ = v.Enter(n) + return v.Leave(n) +} + +// Restore implements Node interface. +func (n *UnlockTablesStmt) Restore(ctx *format.RestoreCtx) error { + ctx.WriteKeyWord("UNLOCK TABLES") + return nil +} + // TableOptionType is the type for TableOption type TableOptionType int diff --git a/parser/ast/ddl_test.go b/parser/ast/ddl_test.go index 723aa17a..a4292804 100755 --- a/parser/ast/ddl_test.go +++ b/parser/ast/ddl_test.go @@ -14,17 +14,14 @@ package ast_test import ( - . "github.com/pingcap/check" + "testing" + + "github.com/stretchr/testify/require" . "github.com/XiaoMi/Gaea/parser/ast" ) -var _ = Suite(&testDDLSuite{}) - -type testDDLSuite struct { -} - -func (ts *testDDLSuite) TestDDLVisitorCover(c *C) { +func TestDDLVisitorCover(t *testing.T) { ce := &checkExpr{} constraint := &Constraint{Keys: []*IndexColName{{Column: &ColumnName{}}, {Column: &ColumnName{}}}, Refer: &ReferenceDef{}, Option: &IndexOption{}} @@ -59,13 +56,13 @@ func (ts *testDDLSuite) TestDDLVisitorCover(c *C) { for _, v := range stmts { ce.reset() v.node.Accept(checkVisitor{}) - c.Check(ce.enterCnt, Equals, v.expectedEnterCnt) - c.Check(ce.leaveCnt, Equals, v.expectedLeaveCnt) + require.Equal(t, v.expectedEnterCnt, ce.enterCnt) + require.Equal(t, v.expectedLeaveCnt, ce.leaveCnt) v.node.Accept(visitor1{}) } } -func (ts *testDDLSuite) TestDDLIndexColNameRestore(c *C) { +func TestDDLIndexColNameRestore(t *testing.T) { testCases := []NodeRestoreTestCase{ {"world", "`world`"}, {"world(2)", "`world`(2)"}, @@ -73,10 +70,10 @@ func (ts *testDDLSuite) TestDDLIndexColNameRestore(c *C) { extractNodeFunc := func(node Node) Node { return node.(*CreateIndexStmt).IndexColNames[0] } - RunNodeRestoreTest(c, testCases, "CREATE INDEX idx ON t (%s) USING HASH", extractNodeFunc) + runNodeRestoreTest(t, testCases, "CREATE INDEX idx ON t (%s) USING HASH", extractNodeFunc) } -func (ts *testDDLSuite) TestDDLOnDeleteRestore(c *C) { +func TestDDLOnDeleteRestore(t *testing.T) { testCases := []NodeRestoreTestCase{ {"on delete restrict", "ON DELETE RESTRICT"}, {"on delete CASCADE", "ON DELETE CASCADE"}, @@ -86,10 +83,10 @@ func (ts *testDDLSuite) TestDDLOnDeleteRestore(c *C) { extractNodeFunc := func(node Node) Node { return node.(*CreateTableStmt).Constraints[1].Refer.OnDelete } - RunNodeRestoreTest(c, testCases, "CREATE TABLE child (id INT, parent_id INT, INDEX par_ind (parent_id), FOREIGN KEY (parent_id) REFERENCES parent(id) %s)", extractNodeFunc) + runNodeRestoreTest(t, testCases, "CREATE TABLE child (id INT, parent_id INT, INDEX par_ind (parent_id), FOREIGN KEY (parent_id) REFERENCES parent(id) %s)", extractNodeFunc) } -func (ts *testDDLSuite) TestDDLOnUpdateRestore(c *C) { +func TestDDLOnUpdateRestore(t *testing.T) { testCases := []NodeRestoreTestCase{ {"ON UPDATE RESTRICT", "ON UPDATE RESTRICT"}, {"on update CASCADE", "ON UPDATE CASCADE"}, @@ -99,10 +96,10 @@ func (ts *testDDLSuite) TestDDLOnUpdateRestore(c *C) { extractNodeFunc := func(node Node) Node { return node.(*CreateTableStmt).Constraints[1].Refer.OnUpdate } - RunNodeRestoreTest(c, testCases, "CREATE TABLE child ( id INT, parent_id INT, INDEX par_ind (parent_id), FOREIGN KEY (parent_id) REFERENCES parent(id) ON DELETE CASCADE %s )", extractNodeFunc) + runNodeRestoreTest(t, testCases, "CREATE TABLE child ( id INT, parent_id INT, INDEX par_ind (parent_id), FOREIGN KEY (parent_id) REFERENCES parent(id) ON DELETE CASCADE %s )", extractNodeFunc) } -func (ts *testDDLSuite) TestDDLIndexOption(c *C) { +func TestDDLIndexOption(t *testing.T) { testCases := []NodeRestoreTestCase{ {"key_block_size=16", "KEY_BLOCK_SIZE=16"}, {"USING HASH", "USING HASH"}, @@ -117,20 +114,20 @@ func (ts *testDDLSuite) TestDDLIndexOption(c *C) { extractNodeFunc := func(node Node) Node { return node.(*CreateIndexStmt).IndexOption } - RunNodeRestoreTest(c, testCases, "CREATE INDEX idx ON t (a) %s", extractNodeFunc) + runNodeRestoreTest(t, testCases, "CREATE INDEX idx ON t (a) %s", extractNodeFunc) } -func (ts *testDDLSuite) TestTableToTableRestore(c *C) { +func TestTableToTableRestore(t *testing.T) { testCases := []NodeRestoreTestCase{ {"t1 to t2", "`t1` TO `t2`"}, } extractNodeFunc := func(node Node) Node { return node.(*RenameTableStmt).TableToTables[0] } - RunNodeRestoreTest(c, testCases, "rename table %s", extractNodeFunc) + runNodeRestoreTest(t, testCases, "rename table %s", extractNodeFunc) } -func (ts *testDDLSuite) TestDDLReferenceDefRestore(c *C) { +func TestDDLReferenceDefRestore(t *testing.T) { testCases := []NodeRestoreTestCase{ {"REFERENCES parent(id) ON DELETE CASCADE ON UPDATE RESTRICT", "REFERENCES `parent`(`id`) ON DELETE CASCADE ON UPDATE RESTRICT"}, {"REFERENCES parent(id) ON DELETE CASCADE", "REFERENCES `parent`(`id`) ON DELETE CASCADE"}, @@ -142,10 +139,10 @@ func (ts *testDDLSuite) TestDDLReferenceDefRestore(c *C) { extractNodeFunc := func(node Node) Node { return node.(*CreateTableStmt).Constraints[1].Refer } - RunNodeRestoreTest(c, testCases, "CREATE TABLE child (id INT, parent_id INT, INDEX par_ind (parent_id), FOREIGN KEY (parent_id) %s)", extractNodeFunc) + runNodeRestoreTest(t, testCases, "CREATE TABLE child (id INT, parent_id INT, INDEX par_ind (parent_id), FOREIGN KEY (parent_id) %s)", extractNodeFunc) } -func (ts *testDDLSuite) TestDDLConstraintRestore(c *C) { +func TestDDLConstraintRestore(t *testing.T) { testCases := []NodeRestoreTestCase{ {"INDEX par_ind (parent_id)", "INDEX `par_ind`(`parent_id`)"}, {"INDEX par_ind (parent_id(6))", "INDEX `par_ind`(`parent_id`(6))"}, @@ -167,10 +164,10 @@ func (ts *testDDLSuite) TestDDLConstraintRestore(c *C) { extractNodeFunc := func(node Node) Node { return node.(*CreateTableStmt).Constraints[0] } - RunNodeRestoreTest(c, testCases, "CREATE TABLE child (id INT, parent_id INT, %s)", extractNodeFunc) + runNodeRestoreTest(t, testCases, "CREATE TABLE child (id INT, parent_id INT, %s)", extractNodeFunc) } -func (ts *testDDLSuite) TestDDLColumnOptionRestore(c *C) { +func TestDDLColumnOptionRestore(t *testing.T) { testCases := []NodeRestoreTestCase{ {"primary key", "PRIMARY KEY"}, {"not null", "NOT NULL"}, @@ -195,10 +192,10 @@ func (ts *testDDLSuite) TestDDLColumnOptionRestore(c *C) { extractNodeFunc := func(node Node) Node { return node.(*CreateTableStmt).Cols[0].Options[0] } - RunNodeRestoreTest(c, testCases, "CREATE TABLE child (id INT %s)", extractNodeFunc) + runNodeRestoreTest(t, testCases, "CREATE TABLE child (id INT %s)", extractNodeFunc) } -func (ts *testDDLSuite) TestDDLColumnDefRestore(c *C) { +func TestDDLColumnDefRestore(t *testing.T) { testCases := []NodeRestoreTestCase{ // for type {"id json", "`id` JSON"}, @@ -257,10 +254,10 @@ func (ts *testDDLSuite) TestDDLColumnDefRestore(c *C) { extractNodeFunc := func(node Node) Node { return node.(*CreateTableStmt).Cols[0] } - RunNodeRestoreTest(c, testCases, "CREATE TABLE t (%s)", extractNodeFunc) + runNodeRestoreTest(t, testCases, "CREATE TABLE t (%s)", extractNodeFunc) } -func (ts *testDDLSuite) TestDDLTruncateTableStmtRestore(c *C) { +func TestDDLTruncateTableStmtRestore(t *testing.T) { testCases := []NodeRestoreTestCase{ {"truncate t1", "TRUNCATE TABLE `t1`"}, {"truncate table t1", "TRUNCATE TABLE `t1`"}, @@ -269,10 +266,10 @@ func (ts *testDDLSuite) TestDDLTruncateTableStmtRestore(c *C) { extractNodeFunc := func(node Node) Node { return node.(*TruncateTableStmt) } - RunNodeRestoreTest(c, testCases, "%s", extractNodeFunc) + runNodeRestoreTest(t, testCases, "%s", extractNodeFunc) } -func (ts *testDDLSuite) TestColumnPositionRestore(c *C) { +func TestColumnPositionRestore(t *testing.T) { testCases := []NodeRestoreTestCase{ {"", ""}, {"first", "FIRST"}, @@ -281,10 +278,10 @@ func (ts *testDDLSuite) TestColumnPositionRestore(c *C) { extractNodeFunc := func(node Node) Node { return node.(*AlterTableStmt).Specs[0].Position } - RunNodeRestoreTest(c, testCases, "alter table t add column a varchar(255) %s", extractNodeFunc) + runNodeRestoreTest(t, testCases, "alter table t add column a varchar(255) %s", extractNodeFunc) } -func (ts *testDDLSuite) TestAlterTableSpecRestore(c *C) { +func TestAlterTableSpecRestore(t *testing.T) { testCases := []NodeRestoreTestCase{ {"ENGINE innodb", "ENGINE = innodb"}, {"ENGINE = innodb", "ENGINE = innodb"}, @@ -390,5 +387,5 @@ func (ts *testDDLSuite) TestAlterTableSpecRestore(c *C) { extractNodeFunc := func(node Node) Node { return node.(*AlterTableStmt).Specs[0] } - RunNodeRestoreTest(c, testCases, "ALTER TABLE t %s", extractNodeFunc) + runNodeRestoreTest(t, testCases, "ALTER TABLE t %s", extractNodeFunc) } diff --git a/parser/ast/dml.go b/parser/ast/dml.go index 34153989..2fb770a1 100755 --- a/parser/ast/dml.go +++ b/parser/ast/dml.go @@ -457,6 +457,11 @@ const ( SelectLockNone SelectLockType = iota SelectLockForUpdate SelectLockInShareMode + SelectLockForShare + SelectLockForUpdateNoWait + SelectLockForShareNoWait + SelectLockForUpdateSkipLocked + SelectLockForShareSkipLocked ) // String implements fmt.Stringer. @@ -468,6 +473,16 @@ func (slt SelectLockType) String() string { return "for update" case SelectLockInShareMode: return "in share mode" + case SelectLockForShare: + return "for share" + case SelectLockForUpdateNoWait: + return "for update nowait" + case SelectLockForShareNoWait: + return "for share nowait" + case SelectLockForUpdateSkipLocked: + return "for update skip locked" + case SelectLockForShareSkipLocked: + return "for share skip locked" } return "unsupported select lock type" } @@ -664,7 +679,8 @@ func (n *ByItem) Accept(v Visitor) (Node, bool) { // GroupByClause represents group by clause. type GroupByClause struct { node - Items []*ByItem + Items []*ByItem + WithRollup bool } // Restore implements Node interface. @@ -678,6 +694,9 @@ func (n *GroupByClause) Restore(ctx *format.RestoreCtx) error { return errors.Annotatef(err, "An error occurred while restore GroupByClause.Items[%d]", i) } } + if n.WithRollup { + ctx.WriteKeyWord(" WITH ROLLUP") + } return nil } @@ -903,7 +922,8 @@ func (n *SelectStmt) Restore(ctx *format.RestoreCtx) error { case SelectLockInShareMode: ctx.WriteKeyWord(" LOCK ") ctx.WriteKeyWord(n.LockTp.String()) - case SelectLockForUpdate: + case SelectLockForUpdate, SelectLockForShare, SelectLockForUpdateNoWait, SelectLockForShareNoWait, + SelectLockForUpdateSkipLocked, SelectLockForShareSkipLocked: ctx.WritePlain(" ") ctx.WriteKeyWord(n.LockTp.String()) } diff --git a/parser/ast/dml_test.go b/parser/ast/dml_test.go index 1f329f24..daf30cbe 100644 --- a/parser/ast/dml_test.go +++ b/parser/ast/dml_test.go @@ -14,17 +14,14 @@ package ast_test import ( - . "github.com/pingcap/check" + "testing" + + "github.com/stretchr/testify/require" . "github.com/XiaoMi/Gaea/parser/ast" ) -var _ = Suite(&testDMLSuite{}) - -type testDMLSuite struct { -} - -func (ts *testDMLSuite) TestDMLVisitorCover(c *C) { +func TestDMLVisitorCover(t *testing.T) { ce := &checkExpr{} tableRefsClause := &TableRefsClause{TableRefs: &Join{Left: &TableSource{Source: &TableName{}}, On: &OnCondition{Expr: ce}}} @@ -68,13 +65,13 @@ func (ts *testDMLSuite) TestDMLVisitorCover(c *C) { for _, v := range stmts { ce.reset() v.node.Accept(checkVisitor{}) - c.Check(ce.enterCnt, Equals, v.expectedEnterCnt) - c.Check(ce.leaveCnt, Equals, v.expectedLeaveCnt) + require.Equal(t, v.expectedEnterCnt, ce.enterCnt) + require.Equal(t, v.expectedLeaveCnt, ce.leaveCnt) v.node.Accept(visitor1{}) } } -func (ts *testDMLSuite) TestTableNameRestore(c *C) { +func TestTableNameRestore(t *testing.T) { testCases := []NodeRestoreTestCase{ {"dbb.`tbb1`", "`dbb`.`tbb1`"}, {"`tbb2`", "`tbb2`"}, @@ -86,10 +83,10 @@ func (ts *testDMLSuite) TestTableNameRestore(c *C) { extractNodeFunc := func(node Node) Node { return node.(*CreateTableStmt).Table } - RunNodeRestoreTest(c, testCases, "CREATE TABLE %s (id VARCHAR(128) NOT NULL);", extractNodeFunc) + runNodeRestoreTest(t, testCases, "CREATE TABLE %s (id VARCHAR(128) NOT NULL);", extractNodeFunc) } -func (ts *testDMLSuite) TestTableNameIndexHintsRestore(c *C) { +func TestTableNameIndexHintsRestore(t *testing.T) { testCases := []NodeRestoreTestCase{ {"t use index (hello)", "`t` USE INDEX (`hello`)"}, {"t use index (hello, world)", "`t` USE INDEX (`hello`, `world`)"}, @@ -125,10 +122,10 @@ func (ts *testDMLSuite) TestTableNameIndexHintsRestore(c *C) { extractNodeFunc := func(node Node) Node { return node.(*SelectStmt).From.TableRefs.Left.(*TableSource).Source.(*TableName) } - RunNodeRestoreTest(c, testCases, "SELECT * FROM %s", extractNodeFunc) + runNodeRestoreTest(t, testCases, "SELECT * FROM %s", extractNodeFunc) } -func (ts *testDMLSuite) TestLimitRestore(c *C) { +func TestLimitRestore(t *testing.T) { testCases := []NodeRestoreTestCase{ {"limit 10", "LIMIT 10"}, {"limit 10,20", "LIMIT 10,20"}, @@ -137,10 +134,10 @@ func (ts *testDMLSuite) TestLimitRestore(c *C) { extractNodeFunc := func(node Node) Node { return node.(*SelectStmt).Limit } - RunNodeRestoreTest(c, testCases, "SELECT 1 %s", extractNodeFunc) + runNodeRestoreTest(t, testCases, "SELECT 1 %s", extractNodeFunc) } -func (ts *testDMLSuite) TestWildCardFieldRestore(c *C) { +func TestWildCardFieldRestore(t *testing.T) { testCases := []NodeRestoreTestCase{ {"*", "*"}, {"t.*", "`t`.*"}, @@ -149,10 +146,10 @@ func (ts *testDMLSuite) TestWildCardFieldRestore(c *C) { extractNodeFunc := func(node Node) Node { return node.(*SelectStmt).Fields.Fields[0].WildCard } - RunNodeRestoreTest(c, testCases, "SELECT %s", extractNodeFunc) + runNodeRestoreTest(t, testCases, "SELECT %s", extractNodeFunc) } -func (ts *testDMLSuite) TestSelectFieldRestore(c *C) { +func TestSelectFieldRestore(t *testing.T) { testCases := []NodeRestoreTestCase{ {"*", "*"}, {"t.*", "`t`.*"}, @@ -163,10 +160,10 @@ func (ts *testDMLSuite) TestSelectFieldRestore(c *C) { extractNodeFunc := func(node Node) Node { return node.(*SelectStmt).Fields.Fields[0] } - RunNodeRestoreTest(c, testCases, "SELECT %s", extractNodeFunc) + runNodeRestoreTest(t, testCases, "SELECT %s", extractNodeFunc) } -func (ts *testDMLSuite) TestFieldListRestore(c *C) { +func TestFieldListRestore(t *testing.T) { testCases := []NodeRestoreTestCase{ {"*", "*"}, {"t.*", "`t`.*"}, @@ -177,10 +174,10 @@ func (ts *testDMLSuite) TestFieldListRestore(c *C) { extractNodeFunc := func(node Node) Node { return node.(*SelectStmt).Fields } - RunNodeRestoreTest(c, testCases, "SELECT %s", extractNodeFunc) + runNodeRestoreTest(t, testCases, "SELECT %s", extractNodeFunc) } -func (ts *testDMLSuite) TestTableSourceRestore(c *C) { +func TestTableSourceRestore(t *testing.T) { testCases := []NodeRestoreTestCase{ {"tbl", "`tbl`"}, {"tbl as t", "`tbl` AS `t`"}, @@ -190,10 +187,10 @@ func (ts *testDMLSuite) TestTableSourceRestore(c *C) { extractNodeFunc := func(node Node) Node { return node.(*SelectStmt).From.TableRefs.Left } - RunNodeRestoreTest(c, testCases, "select * from %s", extractNodeFunc) + runNodeRestoreTest(t, testCases, "select * from %s", extractNodeFunc) } -func (ts *testDMLSuite) TestOnConditionRestore(c *C) { +func TestOnConditionRestore(t *testing.T) { testCases := []NodeRestoreTestCase{ {"on t1.a=t2.a", "ON `t1`.`a`=`t2`.`a`"}, {"on t1.a=t2.a and t1.b=t2.b", "ON `t1`.`a`=`t2`.`a` AND `t1`.`b`=`t2`.`b`"}, @@ -201,10 +198,10 @@ func (ts *testDMLSuite) TestOnConditionRestore(c *C) { extractNodeFunc := func(node Node) Node { return node.(*SelectStmt).From.TableRefs.On } - RunNodeRestoreTest(c, testCases, "select * from t1 join t2 %s", extractNodeFunc) + runNodeRestoreTest(t, testCases, "select * from t1 join t2 %s", extractNodeFunc) } -func (ts *testDMLSuite) TestJoinRestore(c *C) { +func TestJoinRestore(t *testing.T) { testCases := []NodeRestoreTestCase{ {"t1 natural join t2", "`t1` NATURAL JOIN `t2`"}, {"t1 natural left join t2", "`t1` NATURAL LEFT JOIN `t2`"}, @@ -224,10 +221,10 @@ func (ts *testDMLSuite) TestJoinRestore(c *C) { extractNodeFunc := func(node Node) Node { return node.(*SelectStmt).From.TableRefs } - RunNodeRestoreTest(c, testCases, "select * from %s", extractNodeFunc) + runNodeRestoreTest(t, testCases, "select * from %s", extractNodeFunc) } -func (ts *testDMLSuite) TestTableRefsClauseRestore(c *C) { +func TestTableRefsClauseRestore(t *testing.T) { testCases := []NodeRestoreTestCase{ {"t", "`t`"}, {"t1 join t2", "`t1` JOIN `t2`"}, @@ -236,21 +233,21 @@ func (ts *testDMLSuite) TestTableRefsClauseRestore(c *C) { extractNodeFunc := func(node Node) Node { return node.(*SelectStmt).From } - RunNodeRestoreTest(c, testCases, "select * from %s", extractNodeFunc) + runNodeRestoreTest(t, testCases, "select * from %s", extractNodeFunc) } -func (ts *testDMLSuite) TestDeleteTableListRestore(c *C) { +func TestDeleteTableListRestore(t *testing.T) { testCases := []NodeRestoreTestCase{ {"t1,t2", "`t1`,`t2`"}, } extractNodeFunc := func(node Node) Node { return node.(*DeleteStmt).Tables } - RunNodeRestoreTest(c, testCases, "DELETE %s FROM t1, t2;", extractNodeFunc) - RunNodeRestoreTest(c, testCases, "DELETE FROM %s USING t1, t2;", extractNodeFunc) + runNodeRestoreTest(t, testCases, "DELETE %s FROM t1, t2;", extractNodeFunc) + runNodeRestoreTest(t, testCases, "DELETE FROM %s USING t1, t2;", extractNodeFunc) } -func (ts *testExpressionsSuite) TestByItemRestore(c *C) { +func TestByItemRestore(t *testing.T) { testCases := []NodeRestoreTestCase{ {"a", "`a`"}, {"a desc", "`a` DESC"}, @@ -259,10 +256,10 @@ func (ts *testExpressionsSuite) TestByItemRestore(c *C) { extractNodeFunc := func(node Node) Node { return node.(*SelectStmt).OrderBy.Items[0] } - RunNodeRestoreTest(c, testCases, "select * from t order by %s", extractNodeFunc) + runNodeRestoreTest(t, testCases, "select * from t order by %s", extractNodeFunc) } -func (ts *testExpressionsSuite) TestGroupByClauseRestore(c *C) { +func TestGroupByClauseRestore(t *testing.T) { testCases := []NodeRestoreTestCase{ {"GROUP BY a,b desc", "GROUP BY `a`,`b` DESC"}, {"GROUP BY 1 desc,b", "GROUP BY 1 DESC,`b`"}, @@ -270,10 +267,10 @@ func (ts *testExpressionsSuite) TestGroupByClauseRestore(c *C) { extractNodeFunc := func(node Node) Node { return node.(*SelectStmt).GroupBy } - RunNodeRestoreTest(c, testCases, "select * from t %s", extractNodeFunc) + runNodeRestoreTest(t, testCases, "select * from t %s", extractNodeFunc) } -func (ts *testDMLSuite) TestOrderByClauseRestore(c *C) { +func TestOrderByClauseRestore(t *testing.T) { testCases := []NodeRestoreTestCase{ {"ORDER BY a", "ORDER BY `a`"}, {"ORDER BY a,b", "ORDER BY `a`,`b`"}, @@ -281,15 +278,15 @@ func (ts *testDMLSuite) TestOrderByClauseRestore(c *C) { extractNodeFunc := func(node Node) Node { return node.(*SelectStmt).OrderBy } - RunNodeRestoreTest(c, testCases, "SELECT 1 FROM t1 %s", extractNodeFunc) + runNodeRestoreTest(t, testCases, "SELECT 1 FROM t1 %s", extractNodeFunc) extractNodeFromUnionStmtFunc := func(node Node) Node { return node.(*UnionStmt).OrderBy } - RunNodeRestoreTest(c, testCases, "SELECT 1 FROM t1 UNION SELECT 2 FROM t2 %s", extractNodeFromUnionStmtFunc) + runNodeRestoreTest(t, testCases, "SELECT 1 FROM t1 UNION SELECT 2 FROM t2 %s", extractNodeFromUnionStmtFunc) } -func (ts *testDMLSuite) TestAssignmentRestore(c *C) { +func TestAssignmentRestore(t *testing.T) { testCases := []NodeRestoreTestCase{ {"a=1", "`a`=1"}, {"b=1+2", "`b`=1+2"}, @@ -297,10 +294,10 @@ func (ts *testDMLSuite) TestAssignmentRestore(c *C) { extractNodeFunc := func(node Node) Node { return node.(*UpdateStmt).List[0] } - RunNodeRestoreTest(c, testCases, "UPDATE t1 SET %s", extractNodeFunc) + runNodeRestoreTest(t, testCases, "UPDATE t1 SET %s", extractNodeFunc) } -func (ts *testDMLSuite) TestHavingClauseRestore(c *C) { +func TestHavingClauseRestore(t *testing.T) { testCases := []NodeRestoreTestCase{ {"HAVING a", "HAVING `a`"}, {"HAVING NULL", "HAVING NULL"}, @@ -309,10 +306,10 @@ func (ts *testDMLSuite) TestHavingClauseRestore(c *C) { extractNodeFunc := func(node Node) Node { return node.(*SelectStmt).Having } - RunNodeRestoreTest(c, testCases, "select 1 from t1 group by 1 %s", extractNodeFunc) + runNodeRestoreTest(t, testCases, "select 1 from t1 group by 1 %s", extractNodeFunc) } -func (ts *testDMLSuite) TestFrameBoundRestore(c *C) { +func TestFrameBoundRestore(t *testing.T) { testCases := []NodeRestoreTestCase{ {"CURRENT ROW", "CURRENT ROW"}, {"UNBOUNDED PRECEDING", "UNBOUNDED PRECEDING"}, @@ -327,10 +324,10 @@ func (ts *testDMLSuite) TestFrameBoundRestore(c *C) { extractNodeFunc := func(node Node) Node { return &node.(*SelectStmt).Fields.Fields[0].Expr.(*WindowFuncExpr).Spec.Frame.Extent.Start } - RunNodeRestoreTest(c, testCases, "select avg(val) over (rows between %s and current row) from t", extractNodeFunc) + runNodeRestoreTest(t, testCases, "select avg(val) over (rows between %s and current row) from t", extractNodeFunc) } -func (ts *testDMLSuite) TestFrameClauseRestore(c *C) { +func TestFrameClauseRestore(t *testing.T) { testCases := []NodeRestoreTestCase{ {"ROWS CURRENT ROW", "ROWS BETWEEN CURRENT ROW AND CURRENT ROW"}, {"ROWS UNBOUNDED PRECEDING", "ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW"}, @@ -341,10 +338,10 @@ func (ts *testDMLSuite) TestFrameClauseRestore(c *C) { extractNodeFunc := func(node Node) Node { return node.(*SelectStmt).Fields.Fields[0].Expr.(*WindowFuncExpr).Spec.Frame } - RunNodeRestoreTest(c, testCases, "select avg(val) over (%s) from t", extractNodeFunc) + runNodeRestoreTest(t, testCases, "select avg(val) over (%s) from t", extractNodeFunc) } -func (ts *testDMLSuite) TestPartitionByClauseRestore(c *C) { +func TestPartitionByClauseRestore(t *testing.T) { testCases := []NodeRestoreTestCase{ {"PARTITION BY a", "PARTITION BY `a`"}, {"PARTITION BY NULL", "PARTITION BY NULL"}, @@ -353,10 +350,10 @@ func (ts *testDMLSuite) TestPartitionByClauseRestore(c *C) { extractNodeFunc := func(node Node) Node { return node.(*SelectStmt).Fields.Fields[0].Expr.(*WindowFuncExpr).Spec.PartitionBy } - RunNodeRestoreTest(c, testCases, "select avg(val) over (%s rows current row) from t", extractNodeFunc) + runNodeRestoreTest(t, testCases, "select avg(val) over (%s rows current row) from t", extractNodeFunc) } -func (ts *testDMLSuite) TestWindowSpecRestore(c *C) { +func TestWindowSpecRestore(t *testing.T) { testCases := []NodeRestoreTestCase{ {"w as ()", "`w` AS ()"}, {"w as (w1)", "`w` AS (`w1`)"}, @@ -366,7 +363,7 @@ func (ts *testDMLSuite) TestWindowSpecRestore(c *C) { extractNodeFunc := func(node Node) Node { return &node.(*SelectStmt).WindowSpecs[0] } - RunNodeRestoreTest(c, testCases, "select rank() over w from t window %s", extractNodeFunc) + runNodeRestoreTest(t, testCases, "select rank() over w from t window %s", extractNodeFunc) testCases = []NodeRestoreTestCase{ {"w", "(`w`)"}, @@ -377,5 +374,5 @@ func (ts *testDMLSuite) TestWindowSpecRestore(c *C) { extractNodeFunc = func(node Node) Node { return &node.(*SelectStmt).Fields.Fields[0].Expr.(*WindowFuncExpr).Spec } - RunNodeRestoreTest(c, testCases, "select rank() over %s from t window w as (order by a)", extractNodeFunc) + runNodeRestoreTest(t, testCases, "select rank() over %s from t window w as (order by a)", extractNodeFunc) } diff --git a/parser/ast/expressions_test.go b/parser/ast/expressions_test.go index d0c6d804..f1904559 100644 --- a/parser/ast/expressions_test.go +++ b/parser/ast/expressions_test.go @@ -14,17 +14,14 @@ package ast_test import ( - . "github.com/pingcap/check" + "testing" + + "github.com/stretchr/testify/require" . "github.com/XiaoMi/Gaea/parser/ast" _ "github.com/XiaoMi/Gaea/parser/tidb-types/parser_driver" ) -var _ = Suite(&testExpressionsSuite{}) - -type testExpressionsSuite struct { -} - type checkVisitor struct{} func (v checkVisitor) Enter(in Node) (Node, bool) { @@ -63,7 +60,7 @@ func (n *checkExpr) reset() { n.leaveCnt = 0 } -func (tc *testExpressionsSuite) TestExpresionsVisitorCover(c *C) { +func TestExpresionsVisitorCover(t *testing.T) { ce := &checkExpr{} stmts := []struct { @@ -97,13 +94,13 @@ func (tc *testExpressionsSuite) TestExpresionsVisitorCover(c *C) { for _, v := range stmts { ce.reset() v.node.Accept(checkVisitor{}) - c.Check(ce.enterCnt, Equals, v.expectedEnterCnt) - c.Check(ce.leaveCnt, Equals, v.expectedLeaveCnt) + require.Equal(t, v.expectedEnterCnt, ce.enterCnt) + require.Equal(t, v.expectedLeaveCnt, ce.leaveCnt) v.node.Accept(visitor1{}) } } -func (tc *testExpressionsSuite) TestUnaryOperationExprRestore(c *C) { +func TestUnaryOperationExprRestore(t *testing.T) { testCases := []NodeRestoreTestCase{ {"++1", "++1"}, {"--1", "--1"}, @@ -113,10 +110,10 @@ func (tc *testExpressionsSuite) TestUnaryOperationExprRestore(c *C) { extractNodeFunc := func(node Node) Node { return node.(*SelectStmt).Fields.Fields[0].Expr } - RunNodeRestoreTest(c, testCases, "select %s", extractNodeFunc) + runNodeRestoreTest(t, testCases, "select %s", extractNodeFunc) } -func (tc *testExpressionsSuite) TestColumnNameExprRestore(c *C) { +func TestColumnNameExprRestore(t *testing.T) { testCases := []NodeRestoreTestCase{ {"abc", "`abc`"}, {"`abc`", "`abc`"}, @@ -129,10 +126,10 @@ func (tc *testExpressionsSuite) TestColumnNameExprRestore(c *C) { extractNodeFunc := func(node Node) Node { return node.(*SelectStmt).Fields.Fields[0].Expr } - RunNodeRestoreTest(c, testCases, "select %s", extractNodeFunc) + runNodeRestoreTest(t, testCases, "select %s", extractNodeFunc) } -func (tc *testExpressionsSuite) TestIsNullExprRestore(c *C) { +func TestIsNullExprRestore(t *testing.T) { testCases := []NodeRestoreTestCase{ {"a is null", "`a` IS NULL"}, {"a is not null", "`a` IS NOT NULL"}, @@ -140,10 +137,10 @@ func (tc *testExpressionsSuite) TestIsNullExprRestore(c *C) { extractNodeFunc := func(node Node) Node { return node.(*SelectStmt).Fields.Fields[0].Expr } - RunNodeRestoreTest(c, testCases, "select %s", extractNodeFunc) + runNodeRestoreTest(t, testCases, "select %s", extractNodeFunc) } -func (tc *testExpressionsSuite) TestIsTruthRestore(c *C) { +func TestIsTruthRestore(t *testing.T) { testCases := []NodeRestoreTestCase{ {"a is true", "`a` IS TRUE"}, {"a is not true", "`a` IS NOT TRUE"}, @@ -153,10 +150,10 @@ func (tc *testExpressionsSuite) TestIsTruthRestore(c *C) { extractNodeFunc := func(node Node) Node { return node.(*SelectStmt).Fields.Fields[0].Expr } - RunNodeRestoreTest(c, testCases, "select %s", extractNodeFunc) + runNodeRestoreTest(t, testCases, "select %s", extractNodeFunc) } -func (tc *testExpressionsSuite) TestBetweenExprRestore(c *C) { +func TestBetweenExprRestore(t *testing.T) { testCases := []NodeRestoreTestCase{ {"b between 1 and 2", "`b` BETWEEN 1 AND 2"}, {"b not between 1 and 2", "`b` NOT BETWEEN 1 AND 2"}, @@ -167,10 +164,10 @@ func (tc *testExpressionsSuite) TestBetweenExprRestore(c *C) { extractNodeFunc := func(node Node) Node { return node.(*SelectStmt).Fields.Fields[0].Expr } - RunNodeRestoreTest(c, testCases, "select %s", extractNodeFunc) + runNodeRestoreTest(t, testCases, "select %s", extractNodeFunc) } -func (tc *testExpressionsSuite) TestCaseExpr(c *C) { +func TestCaseExpr(t *testing.T) { testCases := []NodeRestoreTestCase{ {"case when 1 then 2 end", "CASE WHEN 1 THEN 2 END"}, {"case when 1 then 'a' when 2 then 'b' end", "CASE WHEN 1 THEN 'a' WHEN 2 THEN 'b' END"}, @@ -181,10 +178,10 @@ func (tc *testExpressionsSuite) TestCaseExpr(c *C) { extractNodeFunc := func(node Node) Node { return node.(*SelectStmt).Fields.Fields[0].Expr } - RunNodeRestoreTest(c, testCases, "select %s", extractNodeFunc) + runNodeRestoreTest(t, testCases, "select %s", extractNodeFunc) } -func (tc *testExpressionsSuite) TestBinaryOperationExpr(c *C) { +func TestBinaryOperationExpr(t *testing.T) { testCases := []NodeRestoreTestCase{ {"'a'!=1", "'a'!=1"}, {"a!=1", "`a`!=1"}, @@ -198,10 +195,10 @@ func (tc *testExpressionsSuite) TestBinaryOperationExpr(c *C) { extractNodeFunc := func(node Node) Node { return node.(*SelectStmt).Fields.Fields[0].Expr } - RunNodeRestoreTest(c, testCases, "select %s", extractNodeFunc) + runNodeRestoreTest(t, testCases, "select %s", extractNodeFunc) } -func (tc *testExpressionsSuite) TestParenthesesExpr(c *C) { +func TestParenthesesExpr(t *testing.T) { testCases := []NodeRestoreTestCase{ {"(1+2)*3", "(1+2)*3"}, {"1+2*3", "1+2*3"}, @@ -209,10 +206,10 @@ func (tc *testExpressionsSuite) TestParenthesesExpr(c *C) { extractNodeFunc := func(node Node) Node { return node.(*SelectStmt).Fields.Fields[0].Expr } - RunNodeRestoreTest(c, testCases, "select %s", extractNodeFunc) + runNodeRestoreTest(t, testCases, "select %s", extractNodeFunc) } -func (tc *testExpressionsSuite) TestWhenClause(c *C) { +func TestWhenClause(t *testing.T) { testCases := []NodeRestoreTestCase{ {"when 1 then 2", "WHEN 1 THEN 2"}, {"when 1 then 'a'", "WHEN 1 THEN 'a'"}, @@ -221,10 +218,10 @@ func (tc *testExpressionsSuite) TestWhenClause(c *C) { extractNodeFunc := func(node Node) Node { return node.(*SelectStmt).Fields.Fields[0].Expr.(*CaseExpr).WhenClauses[0] } - RunNodeRestoreTest(c, testCases, "select case %s end", extractNodeFunc) + runNodeRestoreTest(t, testCases, "select case %s end", extractNodeFunc) } -func (tc *testExpressionsSuite) TestDefaultExpr(c *C) { +func TestDefaultExpr(t *testing.T) { testCases := []NodeRestoreTestCase{ {"default", "DEFAULT"}, {"default(i)", "DEFAULT(`i`)"}, @@ -232,10 +229,10 @@ func (tc *testExpressionsSuite) TestDefaultExpr(c *C) { extractNodeFunc := func(node Node) Node { return node.(*InsertStmt).Lists[0][0] } - RunNodeRestoreTest(c, testCases, "insert into t values(%s)", extractNodeFunc) + runNodeRestoreTest(t, testCases, "insert into t values(%s)", extractNodeFunc) } -func (tc *testExpressionsSuite) TestPatternInExprRestore(c *C) { +func TestPatternInExprRestore(t *testing.T) { testCases := []NodeRestoreTestCase{ {"'a' in ('b')", "'a' IN ('b')"}, {"2 in (0,3,7)", "2 IN (0,3,7)"}, @@ -246,10 +243,10 @@ func (tc *testExpressionsSuite) TestPatternInExprRestore(c *C) { extractNodeFunc := func(node Node) Node { return node.(*SelectStmt).Fields.Fields[0].Expr } - RunNodeRestoreTest(c, testCases, "select %s", extractNodeFunc) + runNodeRestoreTest(t, testCases, "select %s", extractNodeFunc) } -func (tc *testExpressionsSuite) TestPatternLikeExprRestore(c *C) { +func TestPatternLikeExprRestore(t *testing.T) { testCases := []NodeRestoreTestCase{ {"a like 't1'", "`a` LIKE 't1'"}, {"a like 't1%'", "`a` LIKE 't1%'"}, @@ -263,10 +260,10 @@ func (tc *testExpressionsSuite) TestPatternLikeExprRestore(c *C) { extractNodeFunc := func(node Node) Node { return node.(*SelectStmt).Fields.Fields[0].Expr } - RunNodeRestoreTest(c, testCases, "select %s", extractNodeFunc) + runNodeRestoreTest(t, testCases, "select %s", extractNodeFunc) } -func (tc *testExpressionsSuite) TestValuesExpr(c *C) { +func TestValuesExpr(t *testing.T) { testCases := []NodeRestoreTestCase{ {"values(a)", "VALUES(`a`)"}, {"values(a)+values(b)", "VALUES(`a`)+VALUES(`b`)"}, @@ -274,10 +271,10 @@ func (tc *testExpressionsSuite) TestValuesExpr(c *C) { extractNodeFunc := func(node Node) Node { return node.(*InsertStmt).OnDuplicate[0].Expr } - RunNodeRestoreTest(c, testCases, "insert into t values (1,2,3) on duplicate key update c=%s", extractNodeFunc) + runNodeRestoreTest(t, testCases, "insert into t values (1,2,3) on duplicate key update c=%s", extractNodeFunc) } -func (tc *testExpressionsSuite) TestPatternRegexpExprRestore(c *C) { +func TestPatternRegexpExprRestore(t *testing.T) { testCases := []NodeRestoreTestCase{ {"a regexp 't1'", "`a` REGEXP 't1'"}, {"a regexp '^[abc][0-9]{11}|ok$'", "`a` REGEXP '^[abc][0-9]{11}|ok$'"}, @@ -291,10 +288,10 @@ func (tc *testExpressionsSuite) TestPatternRegexpExprRestore(c *C) { extractNodeFunc := func(node Node) Node { return node.(*SelectStmt).Fields.Fields[0].Expr } - RunNodeRestoreTest(c, testCases, "select %s", extractNodeFunc) + runNodeRestoreTest(t, testCases, "select %s", extractNodeFunc) } -func (tc *testExpressionsSuite) TestRowExprRestore(c *C) { +func TestRowExprRestore(t *testing.T) { testCases := []NodeRestoreTestCase{ {"(1,2)", "ROW(1,2)"}, {"(col1,col2)", "ROW(`col1`,`col2`)"}, @@ -304,31 +301,31 @@ func (tc *testExpressionsSuite) TestRowExprRestore(c *C) { extractNodeFunc := func(node Node) Node { return node.(*SelectStmt).Where.(*BinaryOperationExpr).L } - RunNodeRestoreTest(c, testCases, "select 1 from t1 where %s = row(1,2)", extractNodeFunc) + runNodeRestoreTest(t, testCases, "select 1 from t1 where %s = row(1,2)", extractNodeFunc) } -func (tc *testExpressionsSuite) TestMaxValueExprRestore(c *C) { +func TestMaxValueExprRestore(t *testing.T) { testCases := []NodeRestoreTestCase{ {"maxvalue", "MAXVALUE"}, } extractNodeFunc := func(node Node) Node { return node.(*AlterTableStmt).Specs[0].PartDefinitions[0].LessThan[0] } - RunNodeRestoreTest(c, testCases, "alter table posts add partition ( partition p1 values less than %s)", extractNodeFunc) + runNodeRestoreTest(t, testCases, "alter table posts add partition ( partition p1 values less than %s)", extractNodeFunc) } -func (tc *testExpressionsSuite) TestPositionExprRestore(c *C) { +func TestPositionExprRestore(t *testing.T) { testCases := []NodeRestoreTestCase{ {"1", "1"}, } extractNodeFunc := func(node Node) Node { return node.(*SelectStmt).OrderBy.Items[0] } - RunNodeRestoreTest(c, testCases, "select * from t order by %s", extractNodeFunc) + runNodeRestoreTest(t, testCases, "select * from t order by %s", extractNodeFunc) } -func (tc *testExpressionsSuite) TestExistsSubqueryExprRestore(c *C) { +func TestExistsSubqueryExprRestore(t *testing.T) { testCases := []NodeRestoreTestCase{ {"EXISTS (SELECT 2)", "EXISTS (SELECT 2)"}, {"NOT EXISTS (SELECT 2)", "NOT EXISTS (SELECT 2)"}, @@ -336,10 +333,10 @@ func (tc *testExpressionsSuite) TestExistsSubqueryExprRestore(c *C) { extractNodeFunc := func(node Node) Node { return node.(*SelectStmt).Where } - RunNodeRestoreTest(c, testCases, "select 1 from t1 where %s", extractNodeFunc) + runNodeRestoreTest(t, testCases, "select 1 from t1 where %s", extractNodeFunc) } -func (tc *testExpressionsSuite) TestVariableExpr(c *C) { +func TestVariableExpr(t *testing.T) { testCases := []NodeRestoreTestCase{ {"@a>1", "@`a`>1"}, {"@`aB`+1", "@`aB`+1"}, @@ -359,5 +356,5 @@ func (tc *testExpressionsSuite) TestVariableExpr(c *C) { extractNodeFunc := func(node Node) Node { return node.(*SelectStmt).Fields.Fields[0].Expr } - RunNodeRestoreTest(c, testCases, "select %s", extractNodeFunc) + runNodeRestoreTest(t, testCases, "select %s", extractNodeFunc) } diff --git a/parser/ast/flag_test.go b/parser/ast/flag_test.go index d91debd8..08a38c10 100644 --- a/parser/ast/flag_test.go +++ b/parser/ast/flag_test.go @@ -17,6 +17,7 @@ import ( "testing" . "github.com/pingcap/check" + "github.com/stretchr/testify/require" "github.com/XiaoMi/Gaea/parser" "github.com/XiaoMi/Gaea/parser/ast" @@ -27,17 +28,7 @@ func TestT(t *testing.T) { TestingT(t) } -var _ = Suite(&testFlagSuite{}) - -type testFlagSuite struct { - *parser.Parser -} - -func (ts *testFlagSuite) SetUpSuite(c *C) { - ts.Parser = parser.New() -} - -func (ts *testFlagSuite) TestHasAggFlag(c *C) { +func TestHasAggFlag(t *testing.T) { expr := &ast.BetweenExpr{} flagTests := []struct { flag uint64 @@ -49,11 +40,11 @@ func (ts *testFlagSuite) TestHasAggFlag(c *C) { } for _, tt := range flagTests { expr.SetFlag(tt.flag) - c.Assert(ast.HasAggFlag(expr), Equals, tt.hasAgg) + require.Equal(t, tt.hasAgg, ast.HasAggFlag(expr)) } } -func (ts *testFlagSuite) TestFlag(c *C) { +func TestFlag(t *testing.T) { flagTests := []struct { expr string flag uint64 @@ -143,12 +134,13 @@ func (ts *testFlagSuite) TestFlag(c *C) { ast.FlagHasReference, }, } + p := parser.New() for _, tt := range flagTests { - stmt, err := ts.ParseOneStmt("select "+tt.expr, "", "") - c.Assert(err, IsNil) + stmt, err := p.ParseOneStmt("select "+tt.expr, "", "") + require.NoError(t, err) selectStmt := stmt.(*ast.SelectStmt) ast.SetFlag(selectStmt) expr := selectStmt.Fields.Fields[0].Expr - c.Assert(expr.GetFlag(), Equals, tt.flag, Commentf("For %s", tt.expr)) + require.Equalf(t, tt.flag, expr.GetFlag(), "For %s", tt.expr) } } diff --git a/parser/ast/format_test.go b/parser/ast/format_test.go index 0e594264..3f7482eb 100644 --- a/parser/ast/format_test.go +++ b/parser/ast/format_test.go @@ -1,25 +1,35 @@ +// Copyright 2024 The Gaea Authors. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + package ast_test import ( "bytes" "fmt" + "testing" - . "github.com/pingcap/check" + "github.com/stretchr/testify/require" "github.com/XiaoMi/Gaea/parser" "github.com/XiaoMi/Gaea/parser/ast" ) -var _ = Suite(&testAstFormatSuite{}) - -type testAstFormatSuite struct { -} - func getDefaultCharsetAndCollate() (string, string) { return "utf8", "utf8_bin" } -func (ts *testAstFormatSuite) TestAstFormat(c *C) { +func TestAstFormat(t *testing.T) { var testcases = []struct { input string output string @@ -93,10 +103,10 @@ func (ts *testAstFormatSuite) TestAstFormat(c *C) { charset, collation := getDefaultCharsetAndCollate() stmts, _, err := parser.New().Parse(expr, charset, collation) node := stmts[0].(*ast.SelectStmt).Fields.Fields[0].Expr - c.Assert(err, IsNil) + require.NoError(t, err) writer := bytes.NewBufferString("") node.Format(writer) - c.Assert(writer.String(), Equals, tt.output) + require.Equal(t, tt.output, writer.String()) } } diff --git a/parser/ast/functions.go b/parser/ast/functions.go index f0097a80..27d3518f 100755 --- a/parser/ast/functions.go +++ b/parser/ast/functions.go @@ -416,6 +416,23 @@ func (n *FuncCallExpr) Restore(ctx *format.RestoreCtx) error { } i++ } + case "char": + hasComma := true + for i, argv := range n.Args { + if value, ok := argv.(ValueExpr); ok { + if value.GetString() == "USING" { + ctx.WriteKeyWord(" using ") + hasComma = false + continue + } + } + if i != 0 && hasComma { + ctx.WritePlain(", ") + } + if err := argv.Restore(ctx); err != nil { + return errors.Annotatef(err, "An error occurred while restore FuncCallExpr.Args %d", i) + } + } default: for i, argv := range n.Args { if i != 0 { diff --git a/parser/ast/functions_test.go b/parser/ast/functions_test.go index 7eb15da2..c656bfd2 100644 --- a/parser/ast/functions_test.go +++ b/parser/ast/functions_test.go @@ -14,17 +14,12 @@ package ast_test import ( - . "github.com/pingcap/check" + "testing" . "github.com/XiaoMi/Gaea/parser/ast" ) -var _ = Suite(&testFunctionsSuite{}) - -type testFunctionsSuite struct { -} - -func (ts *testFunctionsSuite) TestFunctionsVisitorCover(c *C) { +func TestFunctionsVisitorCover(t *testing.T) { valueExpr := NewValueExpr(42) stmts := []Node{ &AggregateFuncExpr{Args: []ExprNode{valueExpr}}, @@ -39,7 +34,7 @@ func (ts *testFunctionsSuite) TestFunctionsVisitorCover(c *C) { } } -func (ts *testFunctionsSuite) TestFuncCallExprRestore(c *C) { +func TestFuncCallExprRestore(t *testing.T) { testCases := []NodeRestoreTestCase{ {"JSON_ARRAYAGG(attribute)", "JSON_ARRAYAGG(`attribute`)"}, {"JSON_OBJECTAGG(attribute, value)", "JSON_OBJECTAGG(`attribute`, `value`)"}, @@ -76,10 +71,10 @@ func (ts *testFunctionsSuite) TestFuncCallExprRestore(c *C) { extractNodeFunc := func(node Node) Node { return node.(*SelectStmt).Fields.Fields[0].Expr } - RunNodeRestoreTest(c, testCases, "select %s", extractNodeFunc) + runNodeRestoreTest(t, testCases, "select %s", extractNodeFunc) } -func (ts *testFunctionsSuite) TestFuncCastExprRestore(c *C) { +func TestFuncCastExprRestore(t *testing.T) { testCases := []NodeRestoreTestCase{ {"CONVERT('Müller' USING UtF8Mb4)", "CONVERT('Müller' USING UTF8MB4)"}, {"CONVERT('Müller', CHAR(32) CHARACTER SET UtF8)", "CONVERT('Müller', CHAR(32) CHARACTER SET UtF8)"}, @@ -89,10 +84,10 @@ func (ts *testFunctionsSuite) TestFuncCastExprRestore(c *C) { extractNodeFunc := func(node Node) Node { return node.(*SelectStmt).Fields.Fields[0].Expr } - RunNodeRestoreTest(c, testCases, "select %s", extractNodeFunc) + runNodeRestoreTest(t, testCases, "select %s", extractNodeFunc) } -func (ts *testFunctionsSuite) TestAggregateFuncExprRestore(c *C) { +func TestAggregateFuncExprRestore(t *testing.T) { testCases := []NodeRestoreTestCase{ {"AVG(test_score)", "AVG(`test_score`)"}, {"AVG(distinct test_score)", "AVG(DISTINCT `test_score`)"}, @@ -119,10 +114,10 @@ func (ts *testFunctionsSuite) TestAggregateFuncExprRestore(c *C) { extractNodeFunc := func(node Node) Node { return node.(*SelectStmt).Fields.Fields[0].Expr } - RunNodeRestoreTest(c, testCases, "select %s", extractNodeFunc) + runNodeRestoreTest(t, testCases, "select %s", extractNodeFunc) } -func (ts *testDMLSuite) TestWindowFuncExprRestore(c *C) { +func TestWindowFuncExprRestore(t *testing.T) { testCases := []NodeRestoreTestCase{ {"RANK() OVER w", "RANK() OVER (`w`)"}, {"RANK() OVER (PARTITION BY a)", "RANK() OVER (PARTITION BY `a`)"}, @@ -138,5 +133,5 @@ func (ts *testDMLSuite) TestWindowFuncExprRestore(c *C) { extractNodeFunc := func(node Node) Node { return node.(*SelectStmt).Fields.Fields[0].Expr } - RunNodeRestoreTest(c, testCases, "select %s from t", extractNodeFunc) + runNodeRestoreTest(t, testCases, "select %s from t", extractNodeFunc) } diff --git a/parser/ast/misc.go b/parser/ast/misc.go index 2da4a3bb..bb0dee80 100755 --- a/parser/ast/misc.go +++ b/parser/ast/misc.go @@ -1114,6 +1114,7 @@ const ( ) // ShowSlow is used for the following command: +// // admin show slow top [ internal | all] N // admin show slow recent N type ShowSlow struct { diff --git a/parser/ast/misc_test.go b/parser/ast/misc_test.go index c2df7e5f..a0d05422 100644 --- a/parser/ast/misc_test.go +++ b/parser/ast/misc_test.go @@ -14,18 +14,15 @@ package ast_test import ( - . "github.com/pingcap/check" + "testing" + + "github.com/stretchr/testify/require" "github.com/XiaoMi/Gaea/parser" . "github.com/XiaoMi/Gaea/parser/ast" "github.com/XiaoMi/Gaea/parser/auth" ) -var _ = Suite(&testMiscSuite{}) - -type testMiscSuite struct { -} - type visitor struct{} func (v visitor) Enter(in Node) (Node, bool) { @@ -44,7 +41,7 @@ func (visitor1) Enter(in Node) (Node, bool) { return in, true } -func (ts *testMiscSuite) TestMiscVisitorCover(c *C) { +func TestMiscVisitorCover(t *testing.T) { valueExpr := NewValueExpr(42) stmts := []Node{ &AdminStmt{}, @@ -85,7 +82,7 @@ func (ts *testMiscSuite) TestMiscVisitorCover(c *C) { } } -func (ts *testMiscSuite) TestDDLVisitorCover(c *C) { +func TestDDLVisitorCoverMisc(t *testing.T) { sql := ` create table t (c1 smallint unsigned, c2 int unsigned); alter table t add column a smallint unsigned after b; @@ -102,14 +99,14 @@ constraint foreign key (jobabbr) references ffxi_jobtype (jobabbr) on delete cas ` parse := parser.New() stmts, _, err := parse.Parse(sql, "", "") - c.Assert(err, IsNil) + require.NoError(t, err) for _, stmt := range stmts { stmt.Accept(visitor{}) stmt.Accept(visitor1{}) } } -func (ts *testMiscSuite) TestDMLVistorCover(c *C) { +func TestDMLVistorCover(t *testing.T) { sql := `delete from somelog where user = 'jcole' order by timestamp_column limit 1; delete t1, t2 from t1 inner join t2 inner join t3 where t1.id=t2.id and t2.id=t3.id; select * from t where exists(select * from t k where t.c = k.c having sum(c) = 1); @@ -121,14 +118,14 @@ load data infile '/tmp/t.csv' into table t fields terminated by 'ab' enclosed by p := parser.New() stmts, _, err := p.Parse(sql, "", "") - c.Assert(err, IsNil) + require.NoError(t, err) for _, stmt := range stmts { stmt.Accept(visitor{}) stmt.Accept(visitor1{}) } } -func (ts *testMiscSuite) TestSensitiveStatement(c *C) { +func TestSensitiveStatement(t *testing.T) { positive := []StmtNode{ &SetPwdStmt{}, &CreateUserStmt{}, @@ -137,7 +134,7 @@ func (ts *testMiscSuite) TestSensitiveStatement(c *C) { } for i, stmt := range positive { _, ok := stmt.(SensitiveStmtNode) - c.Assert(ok, IsTrue, Commentf("%d, %#v fail", i, stmt)) + require.Truef(t, ok, "%d, %#v fail", i, stmt) } negative := []StmtNode{ @@ -155,11 +152,11 @@ func (ts *testMiscSuite) TestSensitiveStatement(c *C) { } for _, stmt := range negative { _, ok := stmt.(SensitiveStmtNode) - c.Assert(ok, IsFalse) + require.False(t, ok) } } -func (ts *testMiscSuite) TestUserSpec(c *C) { +func TestUserSpec(t *testing.T) { hashString := "*3D56A309CD04FA2EEF181462E59011F075C89548" u := UserSpec{ User: &auth.UserIdentity{ @@ -172,25 +169,25 @@ func (ts *testMiscSuite) TestUserSpec(c *C) { }, } pwd, ok := u.EncodedPassword() - c.Assert(ok, IsTrue) - c.Assert(pwd, Equals, u.AuthOpt.HashString) + require.True(t, ok) + require.Equal(t, u.AuthOpt.HashString, pwd) u.AuthOpt.HashString = "not-good-password-format" pwd, ok = u.EncodedPassword() - c.Assert(ok, IsFalse) + require.False(t, ok) u.AuthOpt.ByAuthString = true pwd, ok = u.EncodedPassword() - c.Assert(ok, IsTrue) - c.Assert(pwd, Equals, hashString) + require.True(t, ok) + require.Equal(t, hashString, pwd) u.AuthOpt.AuthString = "" pwd, ok = u.EncodedPassword() - c.Assert(ok, IsTrue) - c.Assert(pwd, Equals, "") + require.True(t, ok) + require.Equal(t, "", pwd) } -func (ts *testMiscSuite) TestTableOptimizerHintRestore(c *C) { +func TestTableOptimizerHintRestore(t *testing.T) { testCases := []NodeRestoreTestCase{ {"TIDB_SMJ(`t1`)", "TIDB_SMJ(`t1`)"}, {"TIDB_SMJ(t1)", "TIDB_SMJ(`t1`)"}, @@ -202,5 +199,5 @@ func (ts *testMiscSuite) TestTableOptimizerHintRestore(c *C) { extractNodeFunc := func(node Node) Node { return node.(*SelectStmt).TableHints[0] } - RunNodeRestoreTest(c, testCases, "select /*+ %s */ * from t1 join t2", extractNodeFunc) + runNodeRestoreTest(t, testCases, "select /*+ %s */ * from t1 join t2", extractNodeFunc) } diff --git a/parser/ast/util_test.go b/parser/ast/util_test.go index e5f43413..f5433c53 100755 --- a/parser/ast/util_test.go +++ b/parser/ast/util_test.go @@ -16,8 +16,9 @@ package ast_test import ( "fmt" "strings" + "testing" - . "github.com/pingcap/check" + "github.com/stretchr/testify/require" "github.com/XiaoMi/Gaea/parser" . "github.com/XiaoMi/Gaea/parser/ast" @@ -25,30 +26,25 @@ import ( driver "github.com/XiaoMi/Gaea/parser/tidb-types/parser_driver" ) -var _ = Suite(&testCacheableSuite{}) - -type testCacheableSuite struct { -} - -func (s *testCacheableSuite) TestCacheable(c *C) { +func TestCacheable(t *testing.T) { // test non-SelectStmt var stmt Node = &DeleteStmt{} - c.Assert(IsReadOnly(stmt), IsFalse) + require.False(t, IsReadOnly(stmt)) stmt = &InsertStmt{} - c.Assert(IsReadOnly(stmt), IsFalse) + require.False(t, IsReadOnly(stmt)) stmt = &UpdateStmt{} - c.Assert(IsReadOnly(stmt), IsFalse) + require.False(t, IsReadOnly(stmt)) stmt = &ExplainStmt{} - c.Assert(IsReadOnly(stmt), IsTrue) + require.True(t, IsReadOnly(stmt)) stmt = &ExplainStmt{} - c.Assert(IsReadOnly(stmt), IsTrue) + require.True(t, IsReadOnly(stmt)) stmt = &DoStmt{} - c.Assert(IsReadOnly(stmt), IsTrue) + require.True(t, IsReadOnly(stmt)) } // CleanNodeText set the text of node and all child node empty. @@ -103,25 +99,29 @@ type NodeRestoreTestCase struct { expectSQL string } -func RunNodeRestoreTest(c *C, nodeTestCases []NodeRestoreTestCase, template string, extractNodeFunc func(node Node) Node) { - parser := parser.New() - parser.EnableWindowFunc(true) +func runNodeRestoreTest(t *testing.T, nodeTestCases []NodeRestoreTestCase, template string, extractNodeFunc func(node Node) Node) { + runNodeRestoreTestWithFlags(t, nodeTestCases, template, extractNodeFunc, DefaultRestoreFlags) +} + +func runNodeRestoreTestWithFlags(t *testing.T, nodeTestCases []NodeRestoreTestCase, template string, extractNodeFunc func(node Node) Node, flags RestoreFlags) { + p := parser.New() + p.EnableWindowFunc(true) for _, testCase := range nodeTestCases { sourceSQL := fmt.Sprintf(template, testCase.sourceSQL) expectSQL := fmt.Sprintf(template, testCase.expectSQL) - stmt, err := parser.ParseOneStmt(sourceSQL, "", "") - comment := Commentf("source %#v", testCase) - c.Assert(err, IsNil, comment) + stmt, err := p.ParseOneStmt(sourceSQL, "", "") + comment := fmt.Sprintf("source %#v", testCase) + require.NoError(t, err, comment) var sb strings.Builder - err = extractNodeFunc(stmt).Restore(NewRestoreCtx(DefaultRestoreFlags, &sb)) - c.Assert(err, IsNil, comment) - restoreSQL := fmt.Sprintf(template, sb.String()) - comment = Commentf("source %#v; restore %v", testCase, restoreSQL) - c.Assert(restoreSQL, Equals, expectSQL, comment) - stmt2, err := parser.ParseOneStmt(restoreSQL, "", "") - c.Assert(err, IsNil, comment) + err = extractNodeFunc(stmt).Restore(NewRestoreCtx(flags, &sb)) + require.NoError(t, err, comment) + restoreSql := fmt.Sprintf(template, sb.String()) + comment = fmt.Sprintf("source %#v; restore %v", testCase, restoreSql) + require.Equal(t, expectSQL, restoreSql, comment) + stmt2, err := p.ParseOneStmt(restoreSql, "", "") + require.NoError(t, err, comment) CleanNodeText(stmt) CleanNodeText(stmt2) - c.Assert(stmt2, DeepEquals, stmt, comment) + require.Equal(t, stmt, stmt2, comment) } } diff --git a/parser/auth/auth.go b/parser/auth/auth.go index 49e1ca3f..d8694d1d 100644 --- a/parser/auth/auth.go +++ b/parser/auth/auth.go @@ -68,19 +68,20 @@ func (user *UserIdentity) AuthIdentityString() string { // CheckScrambledPassword check scrambled password received from client. // The new authentication is performed in following manner: -// SERVER: public_seed=create_random_string() -// send(public_seed) -// CLIENT: recv(public_seed) -// hash_stage1=sha1("password") -// hash_stage2=sha1(hash_stage1) -// reply=xor(hash_stage1, sha1(public_seed,hash_stage2) -// // this three steps are done in scramble() -// send(reply) -// SERVER: recv(reply) -// hash_stage1=xor(reply, sha1(public_seed,hash_stage2)) -// candidate_hash2=sha1(hash_stage1) -// check(candidate_hash2==hash_stage2) -// // this three steps are done in check_scramble() +// +// SERVER: public_seed=create_random_string() +// send(public_seed) +// CLIENT: recv(public_seed) +// hash_stage1=sha1("password") +// hash_stage2=sha1(hash_stage1) +// reply=xor(hash_stage1, sha1(public_seed,hash_stage2) +// // this three steps are done in scramble() +// send(reply) +// SERVER: recv(reply) +// hash_stage1=xor(reply, sha1(public_seed,hash_stage2)) +// candidate_hash2=sha1(hash_stage1) +// check(candidate_hash2==hash_stage2) +// // this three steps are done in check_scramble() func CheckScrambledPassword(salt, hpwd, auth []byte) bool { crypt := sha1.New() _, err := crypt.Write(salt) diff --git a/parser/auth/auth_test.go b/parser/auth/auth_test.go index a8fc7ab8..c33a4d27 100644 --- a/parser/auth/auth_test.go +++ b/parser/auth/auth_test.go @@ -14,38 +14,35 @@ package auth import ( - . "github.com/pingcap/check" + "testing" + + "github.com/stretchr/testify/require" "github.com/XiaoMi/Gaea/util/testleak" ) -var _ = Suite(&testAuthSuite{}) - -type testAuthSuite struct { -} - -func (s *testAuthSuite) TestEncodePassword(c *C) { - defer testleak.AfterTest(c)() +func TestEncodePassword(t *testing.T) { + defer testleak.AfterTestT(t)() pwd := "123" - c.Assert(EncodePassword(pwd), Equals, "*23AE809DDACAF96AF0FD78ED04B6A265E05AA257") + require.Equal(t, "*23AE809DDACAF96AF0FD78ED04B6A265E05AA257", EncodePassword(pwd)) // NUL } -func (s *testAuthSuite) TestDecodePassword(c *C) { - defer testleak.AfterTest(c)() +func TestDecodePassword(t *testing.T) { + defer testleak.AfterTestT(t)() x, err := DecodePassword(EncodePassword("123")) - c.Assert(err, IsNil) - c.Assert(x, DeepEquals, Sha1Hash(Sha1Hash([]byte("123")))) + require.NoError(t, err) + require.Equal(t, Sha1Hash(Sha1Hash([]byte("123"))), x) } -func (s *testAuthSuite) TestCheckScramble(c *C) { - defer testleak.AfterTest(c)() +func TestCheckScramble(t *testing.T) { + defer testleak.AfterTestT(t)() pwd := "abc" salt := []byte{85, 92, 45, 22, 58, 79, 107, 6, 122, 125, 58, 80, 12, 90, 103, 32, 90, 10, 74, 82} auth := []byte{24, 180, 183, 225, 166, 6, 81, 102, 70, 248, 199, 143, 91, 204, 169, 9, 161, 171, 203, 33} encodepwd := EncodePassword(pwd) hpwd, err := DecodePassword(encodepwd) - c.Assert(err, IsNil) + require.NoError(t, err) res := CheckScrambledPassword(salt, hpwd, auth) - c.Assert(res, IsTrue) + require.True(t, res) } diff --git a/parser/comments.go b/parser/comments.go index a06dfb40..b93d1466 100644 --- a/parser/comments.go +++ b/parser/comments.go @@ -110,7 +110,9 @@ func SplitMarginComments(sql string) (query string, comments MarginComments) { Leading: strings.TrimLeftFunc(sql[:leadingEnd], unicode.IsSpace), Trailing: strings.TrimRightFunc(sql[trailingStart:], unicode.IsSpace), } - return strings.TrimFunc(sql[leadingEnd:trailingStart], unicode.IsSpace), comments + return strings.TrimFunc(sql[leadingEnd:trailingStart], func(c rune) bool { + return unicode.IsSpace(c) || c == ';' + }), comments } // StripLeadingComments trims the SQL string and removes any leading comments diff --git a/parser/comments_test.go b/parser/comments_test.go new file mode 100644 index 00000000..ffe8fdc2 --- /dev/null +++ b/parser/comments_test.go @@ -0,0 +1,83 @@ +// Copyright 2024 The Gaea Authors. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package parser + +import ( + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestSplitMarginComments(t *testing.T) { + tests := []struct { + name string + sql string + wantQuery string + wantComments MarginComments + }{ + { + name: "test no comment", + sql: "select * from t", + wantQuery: "select * from t", + wantComments: MarginComments{ + Leading: "", + Trailing: "", + }, + }, + { + name: "test leading comment", + sql: "/*master*/ select * from t", + wantQuery: "select * from t", + wantComments: MarginComments{ + Leading: "/*master*/ ", + Trailing: "", + }, + }, + { + name: "test internal comment", + sql: "select /*master*/ * from t", + wantQuery: "select /*master*/ * from t", + wantComments: MarginComments{ + Leading: "", + Trailing: "", + }, + }, + { + name: "test mycat hint comment", + sql: "select * from t /* !mycat:sql=select 1 from xm_order where order_id = 4230329282206593 */", + wantQuery: "select * from t", + wantComments: MarginComments{ + Leading: "", + Trailing: " /* !mycat:sql=select 1 from xm_order where order_id = 4230329282206593 */", + }, + }, + { + name: "test trailing comment", + sql: "select * from t /*master*/", + wantQuery: "select * from t", + wantComments: MarginComments{ + Leading: "", + Trailing: " /*master*/", + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + gotQuery, gotComments := SplitMarginComments(tt.sql) + assert.Equalf(t, tt.wantQuery, gotQuery, "SplitMarginComments(%v)", tt.sql) + assert.Equalf(t, tt.wantComments, gotComments, "SplitMarginComments(%v)", tt.sql) + }) + } +} diff --git a/parser/format/format.go b/parser/format/format.go index c4825e51..ffc38813 100755 --- a/parser/format/format.go +++ b/parser/format/format.go @@ -56,21 +56,28 @@ var replace = map[rune]string{ // nest. The Formatter writes to io.Writer 'w' and inserts one 'indent' // string per current indent level value. // Behaviour of commands reaching negative indent levels is undefined. -// IndentFormatter(os.Stdout, "\t").Format("abc%d%%e%i\nx\ny\n%uz\n", 3) +// +// IndentFormatter(os.Stdout, "\t").Format("abc%d%%e%i\nx\ny\n%uz\n", 3) +// // output: -// abc3%e -// x -// y -// z +// +// abc3%e +// x +// y +// z +// // The Go quoted string literal form of the above is: -// "abc%%e\n\tx\n\tx\nz\n" +// +// "abc%%e\n\tx\n\tx\nz\n" +// // The commands can be scattered between separate invocations of Format(), // i.e. the formatter keeps track of the indent level and knows if it is // positioned on start of a line and should emit indentation(s). // The same output as above can be produced by e.g.: -// f := IndentFormatter(os.Stdout, " ") -// f.Format("abc%d%%e%i\nx\n", 3) -// f.Format("y\n%uz\n") +// +// f := IndentFormatter(os.Stdout, " ") +// f.Format("abc%d%%e%i\nx\n", 3) +// f.Format("y\n%uz\n") func IndentFormatter(w io.Writer, indent string) Formatter { return &indentFormatter{w, []byte(indent), 0, stBOL} } @@ -169,9 +176,12 @@ type flatFormatter indentFormatter // // The FlatFormatter is intended for flattening of normally nested structure textual representation to // a one top level structure per line form. -// FlatFormatter(os.Stdout, " ").Format("abc%d%%e%i\nx\ny\n%uz\n", 3) +// +// FlatFormatter(os.Stdout, " ").Format("abc%d%%e%i\nx\ny\n%uz\n", 3) +// // output in the form of a Go quoted string literal: -// "abc3%%e x y z\n" +// +// "abc3%%e x y z\n" func FlatFormatter(w io.Writer) Formatter { return (*flatFormatter)(IndentFormatter(w, "").(*indentFormatter)) } diff --git a/parser/format/format_test.go b/parser/format/format_test.go index 1b6b8ce6..57a44404 100755 --- a/parser/format/format_test.go +++ b/parser/format/format_test.go @@ -15,11 +15,12 @@ package format import ( "bytes" - "io/ioutil" + "io" "strings" "testing" . "github.com/pingcap/check" + "github.com/stretchr/testify/require" "github.com/XiaoMi/Gaea/util/testleak" ) @@ -29,22 +30,16 @@ func TestT(t *testing.T) { TestingT(t) } -var _ = Suite(&testFormatSuite{}) -var _ = Suite(&testRestoreCtxSuite{}) - -type testFormatSuite struct { -} - -func checkFormat(c *C, f Formatter, buf *bytes.Buffer, str, expect string) { +func checkFormat(t *testing.T, f Formatter, buf *bytes.Buffer, str, expect string) { _, err := f.Format(str, 3) - c.Assert(err, IsNil) - b, err := ioutil.ReadAll(buf) - c.Assert(err, IsNil) - c.Assert(string(b), Equals, expect) + require.NoError(t, err) + b, err := io.ReadAll(buf) + require.NoError(t, err) + require.Equal(t, expect, string(b)) } -func (s *testFormatSuite) TestFormat(c *C) { - defer testleak.AfterTest(c)() +func TestFormat(t *testing.T) { + defer testleak.AfterTestT(t)() str := "abc%d%%e%i\nx\ny\n%uz\n" buf := &bytes.Buffer{} f := IndentFormatter(buf, "\t") @@ -53,19 +48,19 @@ func (s *testFormatSuite) TestFormat(c *C) { y z ` - checkFormat(c, f, buf, str, expect) + checkFormat(t, f, buf, str, expect) str = "abc%d%%e%i\nx\ny\n%uz\n%i\n" buf = &bytes.Buffer{} f = FlatFormatter(buf) expect = "abc3%e x y z\n " - checkFormat(c, f, buf, str, expect) + checkFormat(t, f, buf, str, expect) } type testRestoreCtxSuite struct { } -func (s *testRestoreCtxSuite) TestRestoreCtx(c *C) { +func TestRestoreCtx(t *testing.T) { testCases := []struct { flag RestoreFlags expect string @@ -95,6 +90,6 @@ func (s *testRestoreCtxSuite) TestRestoreCtx(c *C) { ctx.WriteString("str`.'\"ing\\") ctx.WritePlain(" ") ctx.WriteName("na`.'\"Me\\") - c.Assert(sb.String(), Equals, testCase.expect, Commentf("case: %#v", testCase)) + require.Equalf(t, testCase.expect, sb.String(), "case: %#v", testCase) } } diff --git a/parser/goyacc b/parser/goyacc deleted file mode 100755 index 04217fd7..00000000 Binary files a/parser/goyacc and /dev/null differ diff --git a/parser/goyacc/Makefile b/parser/goyacc/Makefile new file mode 100644 index 00000000..fdd11c76 --- /dev/null +++ b/parser/goyacc/Makefile @@ -0,0 +1,7 @@ +.PHONY: goyacc clean + +goyacc: + GO111MODULE=on go build -o ./bin/goyacc main.go + +clean: + rm -rf bin/goyacc diff --git a/parser/goyacc/go.mod b/parser/goyacc/go.mod new file mode 100644 index 00000000..c9f54cd2 --- /dev/null +++ b/parser/goyacc/go.mod @@ -0,0 +1,13 @@ +module goyacc + +go 1.16 + +require ( + github.com/cznic/golex v0.0.0-20181122101858-9c343928389c // indirect + github.com/cznic/mathutil v0.0.0-20181122101859-297441e03548 + github.com/cznic/parser v0.0.0-20181122101858-d773202d5b1f + github.com/cznic/sortutil v0.0.0-20181122101858-f5f958428db8 + github.com/cznic/strutil v0.0.0-20181122101858-275e90344537 + github.com/cznic/y v0.0.0-20181122101901-b05e8c2e8d7b + github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec // indirect +) diff --git a/parser/goyacc/go.sum b/parser/goyacc/go.sum new file mode 100644 index 00000000..61b8e097 --- /dev/null +++ b/parser/goyacc/go.sum @@ -0,0 +1,14 @@ +github.com/cznic/golex v0.0.0-20181122101858-9c343928389c h1:G8zTsaqyVfIHpgMFcGgdbhHSFhlNc77rAKkhVbQ9kQg= +github.com/cznic/golex v0.0.0-20181122101858-9c343928389c/go.mod h1:+bmmJDNmKlhWNG+gwWCkaBoTy39Fs+bzRxVBzoTQbIc= +github.com/cznic/mathutil v0.0.0-20181122101859-297441e03548 h1:iwZdTE0PVqJCos1vaoKsclOGD3ADKpshg3SRtYBbwso= +github.com/cznic/mathutil v0.0.0-20181122101859-297441e03548/go.mod h1:e6NPNENfs9mPDVNRekM7lKScauxd5kXTr1Mfyig6TDM= +github.com/cznic/parser v0.0.0-20181122101858-d773202d5b1f h1:DUtr2TvhM9rmiHKVJWoLqDY2+MdxljW9hlaS/oYoi1c= +github.com/cznic/parser v0.0.0-20181122101858-d773202d5b1f/go.mod h1:2B43mz36vGZNZEwkWi8ayRSSUXLfjL8OkbzwW4NcPMM= +github.com/cznic/sortutil v0.0.0-20181122101858-f5f958428db8 h1:LpMLYGyy67BoAFGda1NeOBQwqlv7nUXpm+rIVHGxZZ4= +github.com/cznic/sortutil v0.0.0-20181122101858-f5f958428db8/go.mod h1:q2w6Bg5jeox1B+QkJ6Wp/+Vn0G/bo3f1uY7Fn3vivIQ= +github.com/cznic/strutil v0.0.0-20181122101858-275e90344537 h1:MZRmHqDBd0vxNwenEbKSQqRVT24d3C05ft8kduSwlqM= +github.com/cznic/strutil v0.0.0-20181122101858-275e90344537/go.mod h1:AHHPPPXTw0h6pVabbcbyGRK1DckRn7r/STdZEeIDzZc= +github.com/cznic/y v0.0.0-20181122101901-b05e8c2e8d7b h1:gvFsf4zJcnW6GRN+HPGTxwuw+7sTwzmoeoBQQCZDEnk= +github.com/cznic/y v0.0.0-20181122101901-b05e8c2e8d7b/go.mod h1:1rk5VM7oSnA4vjp+hrLQ3HWHa+Y4yPCa3/CsJrcNnvs= +github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec h1:W09IVJc94icq4NjY3clb7Lk8O1qJ8BdBEF8z0ibU0rE= +github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= diff --git a/parser/goyacc/main.go b/parser/goyacc/main.go new file mode 100644 index 00000000..b9aaa418 --- /dev/null +++ b/parser/goyacc/main.go @@ -0,0 +1,827 @@ +// Copyright 2016 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. + +// Copyright 2014 The goyacc Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// This source code uses portions of code previously published in the Go tool +// yacc[0] program, the respective license can be found in the LICENSE-GO-YACC +// file. + +// Goyacc is a version of yacc generating Go parsers. +// +// Usage +// +// Note: If no non flag arguments are given, goyacc reads standard input. +// +// goyacc [options] [input] +// +// options and (defaults) +// -c Report state closures. (false) +// -cr Check all states are reducible. (false) +// -dlval Debug value when runtime yyDebug >= 3. ("lval") +// -dlvalf Debug format of -dlval. ("%+v") +// -ex Explain how were conflicts resolved. (false) +// -l Disable line directives, for compatibility only - ignored. (false) +// -la Report all lookahead sets. (false) +// -o outputFile Parser output. ("y.go") +// -p prefix Name prefix to use in generated code. ("yy") +// -v reportFile Create grammar report. ("y.output") +// -xe examplesFile Generate error messages by examples. ("") +// -xegen examplesFile Generate a file suitable for -xe automatically from the grammar. +// The file must not exist. ("") +// +// +// +// Changelog +// +// 2015-03-24: The search for a custom error message is now extended to include +// also the last state that was shifted into, if any. This change resolves a +// problem in which a lookahead symbol is valid for a reduce action in state A, +// but the same symbol is later never accepted by any shift action in some +// state B which is popped from the state stack after the reduction is +// performed. The computed from example state is A but when the error is +// actually detected, the state is now B and the custom error was thus not +// used. +// +// 2015-02-23: Added -xegen flag. It can be used to automagically generate a +// skeleton errors by example file which can be, for example, edited and/or +// submited later as an argument of the -xe option. +// +// 2014-12-18: Support %precedence for better bison compatibility[3]. The +// actual changes are in packages goyacc is dependent on. Goyacc users should +// rebuild the binary: +// +// $ go get -u github.com/cznic/goyacc +// +// 2014-12-02: Added support for the optional yyLexerEx interface. The Reduced +// method can be useful for debugging and/or automatically producing examples +// by parsing code fragments. If it returns true the parser exits immediately +// with return value -1. +// +// Overview +// +// The generated parser is reentrant and mostly backwards compatible with +// parsers generated by go tool yacc[0]. yyParse expects to be given an +// argument that conforms to the following interface: +// +// type yyLexer interface { +// Lex(lval *yySymType) int +// Errorf(format string, a ...interface{}) +// Errors() (warns []error, errs []error) +// } +// +// Optionally the argument to yyParse may implement the following interface: +// +// type yyLexerEx interface { +// yyLexer +// // Hook for recording a reduction. +// Reduced(rule, state int, lval *yySymType) (stop bool) // Client should copy *lval. +// } +// +// Lex should return the token identifier, and place other token information in +// lval (which replaces the usual yylval). Error is equivalent to yyerror in +// the original yacc. +// +// Code inside the parser may refer to the variable yylex, which holds the +// yyLexer passed to Parse. +// +// Multiple grammars compiled into a single program should be placed in +// distinct packages. If that is impossible, the "-p prefix" flag to yacc sets +// the prefix, by default yy, that begins the names of symbols, including +// types, the parser, and the lexer, generated and referenced by yacc's +// generated code. Setting it to distinct values allows multiple grammars to be +// placed in a single package. +// +// Differences wrt go tool yacc +// +// - goyacc implements ideas from "Generating LR Syntax Error Messages from +// Examples"[1]. Use the -xe flag to pass a name of the example file. For more +// details about the example format please see [2]. +// +// - The grammar report includes example token sequences leading to the +// particular state. Can help understanding conflicts. +// +// - Minor changes in parser debug output. +// +// Links +// +// Referenced from elsewhere: +// +// [0]: http://golang.org/cmd/yacc/ +// [1]: http://people.via.ecp.fr/~stilgar/doc/compilo/parser/Generating%20LR%20Syntax%20Error%20Messages.pdf +// [2]: http://godoc.org/github.com/cznic/y#hdr-Error_Examples +// [3]: http://www.gnu.org/software/bison/manual/html_node/Precedence-Only.html#Precedence-Only +package main + +import ( + "bufio" + "bytes" + "flag" + "fmt" + "go/format" + "go/scanner" + "go/token" + "io" + "io/ioutil" + "log" + "os" + "runtime" + "sort" + "strings" + + "github.com/cznic/mathutil" + "github.com/cznic/parser/yacc" + "github.com/cznic/sortutil" + "github.com/cznic/strutil" + "github.com/cznic/y" +) + +var ( + //oNoDefault = flag.Bool("nodefault", false, "disable generating $default actions") + oClosures = flag.Bool("c", false, "report state closures") + oReducible = flag.Bool("cr", false, "check all states are reducible") + oDlval = flag.String("dlval", "lval", "debug value (runtime yyDebug >= 3)") + oDlvalf = flag.String("dlvalf", "%+v", "debug format of -dlval (runtime yyDebug >= 3)") + oLA = flag.Bool("la", false, "report all lookahead sets") + oNoLines = flag.Bool("l", false, "disable line directives (for compatibility ony - ignored)") + oOut = flag.String("o", "y.go", "parser output") + oPref = flag.String("p", "yy", "name prefix to use in generated code") + oReport = flag.String("v", "y.output", "create grammar report") + oResolved = flag.Bool("ex", false, "explain how were conflicts resolved") + oXErrors = flag.String("xe", "", "generate eXtra errors from examples source file") + oXErrorsGen = flag.String("xegen", "", "generate error from examples source file automatically from the grammar") +) + +func main() { + log.SetFlags(0) + + defer func() { + _, file, line, ok := runtime.Caller(2) + if e := recover(); e != nil { + switch { + case ok: + log.Fatalf("%s:%d: panic: %v", file, line, e) + default: + log.Fatalf("panic: %v", e) + } + } + }() + + flag.Parse() + var in string + switch flag.NArg() { + case 0: + in = os.Stdin.Name() + case 1: + in = flag.Arg(0) + default: + log.Fatal("expected at most one non flag argument") + } + + if err := main1(in); err != nil { + switch x := err.(type) { + case scanner.ErrorList: + for _, v := range x { + fmt.Fprintf(os.Stderr, "%v\n", v) + } + os.Exit(1) + default: + log.Fatal(err) + } + } +} + +type symUsed struct { + sym *y.Symbol + used int +} + +type symsUsed []symUsed + +func (s symsUsed) Len() int { return len(s) } +func (s symsUsed) Swap(i, j int) { s[i], s[j] = s[j], s[i] } + +func (s symsUsed) Less(i, j int) bool { + if s[i].used > s[j].used { + return true + } + + if s[i].used < s[j].used { + return false + } + + caseFoldedCompare := strings.Compare(strings.ToLower(s[i].sym.Name), strings.ToLower(s[j].sym.Name)) + if caseFoldedCompare < 0 { + return true + } + if caseFoldedCompare > 0 { + return false + } + + return s[i].sym.Name < s[j].sym.Name +} + +func main1(in string) (err error) { + var out io.Writer + if nm := *oOut; nm != "" { + var f *os.File + var e error + if f, err = os.Create(nm); err != nil { + return err + } + + defer func() { + if e1 := f.Close(); e1 != nil && err == nil { + err = e1 + } + }() + w := bufio.NewWriter(f) + defer func() { + if e1 := w.Flush(); e1 != nil && err == nil { + err = e1 + } + }() + buf := bytes.NewBuffer(nil) + out = buf + defer func() { + var dest []byte + if dest, e = format.Source(buf.Bytes()); e != nil { + dest = buf.Bytes() + } + + if _, e = w.Write(dest); e != nil && err == nil { + err = e + } + }() + } + + var rep io.Writer + if nm := *oReport; nm != "" { + f, err1 := os.Create(nm) + if err1 != nil { + return err1 + } + + defer func() { + if e := f.Close(); e != nil && err == nil { + err = e + } + }() + w := bufio.NewWriter(f) + defer func() { + if e := w.Flush(); e != nil && err == nil { + err = e + } + }() + rep = w + } + + var xerrors []byte + if nm := *oXErrors; nm != "" { + b, err1 := ioutil.ReadFile(nm) + if err1 != nil { + return err1 + } + + xerrors = b + } + + p, err := y.ProcessFile(token.NewFileSet(), in, &y.Options{ + //NoDefault: *oNoDefault, + AllowConflicts: true, + Closures: *oClosures, + LA: *oLA, + Reducible: *oReducible, + Report: rep, + Resolved: *oResolved, + XErrorsName: *oXErrors, + XErrorsSrc: xerrors, + }) + if err != nil { + return err + } + + if fn := *oXErrorsGen; fn != "" { + f, err := os.OpenFile(fn, os.O_RDWR|os.O_CREATE, 0666) + if err != nil { + return err + } + + b := bufio.NewWriter(f) + if err := p.SkeletonXErrors(b); err != nil { + return err + } + + if err := b.Flush(); err != nil { + return err + } + + if err := f.Close(); err != nil { + return err + } + } + + msu := make(map[*y.Symbol]int, len(p.Syms)) // sym -> usage + for nm, sym := range p.Syms { + if nm == "" || nm == "ε" || nm == "$accept" || nm == "#" { + continue + } + + msu[sym] = 0 + } + var minArg, maxArg int + for _, state := range p.Table { + for _, act := range state { + msu[act.Sym]++ + k, arg := act.Kind() + if k == 'a' { + continue + } + + if k == 'r' { + arg = -arg + } + minArg, maxArg = mathutil.Min(minArg, arg), mathutil.Max(maxArg, arg) + } + } + su := make(symsUsed, 0, len(msu)) + for sym, used := range msu { + su = append(su, symUsed{sym, used}) + } + sort.Sort(su) + + // ----------------------------------------------------------- Prologue + f := strutil.IndentFormatter(out, "\t") + mustFormat(f, "// CAUTION: Generated file - DO NOT EDIT.\n\n") + mustFormat(f, "%s", injectImport(p.Prologue)) + mustFormat(f, ` +type %[1]sSymType %i%s%u + +type %[1]sXError struct { + state, xsym int +} +`, *oPref, p.UnionSrc) + + // ---------------------------------------------------------- Constants + nsyms := map[string]*y.Symbol{} + a := make([]string, 0, len(msu)) + maxTokName := 0 + for sym := range msu { + nm := sym.Name + if nm == "$default" || nm == "$end" || sym.IsTerminal && nm[0] != '\'' && sym.Value > 0 { + maxTokName = mathutil.Max(maxTokName, len(nm)) + a = append(a, nm) + } + nsyms[nm] = sym + } + sort.Strings(a) + mustFormat(f, "\nconst (%i\n") + for _, v := range a { + nm := v + switch nm { + case "error": + nm = *oPref + "ErrCode" + case "$default": + nm = *oPref + "Default" + case "$end": + nm = *oPref + "EOFCode" + } + mustFormat(f, "%s%s = %d\n", nm, strings.Repeat(" ", maxTokName-len(nm)+1), nsyms[v].Value) + } + minArg-- // eg: [-13, 42], minArg -14 maps -13 to 1 so zero cell values -> empty. + mustFormat(f, "\n%sMaxDepth = 200\n", *oPref) + mustFormat(f, "%sTabOfs = %d\n", *oPref, minArg) + mustFormat(f, "%u)") + + // ---------------------------------------------------------- Variables + mustFormat(f, "\n\nvar (%i\n") + + // Lex translation table + mustFormat(f, "%sXLAT = map[int]int{%i\n", *oPref) + xlat := make(map[int]int, len(su)) + var errSym int + for i, v := range su { + if v.sym.Name == "error" { + errSym = i + } + xlat[v.sym.Value] = i + mustFormat(f, "%6d: %3d, // %s (%dx)\n", v.sym.Value, i, v.sym.Name, msu[v.sym]) + } + mustFormat(f, "%u}\n") + + // Symbol names + mustFormat(f, "\n%sSymNames = []string{%i\n", *oPref) + for _, v := range su { + mustFormat(f, "%q,\n", v.sym.Name) + } + mustFormat(f, "%u}\n") + + // Reduction table + mustFormat(f, "\n%sReductions = []struct{xsym, components int}{%i\n", *oPref) + for _, rule := range p.Rules { + mustFormat(f, "{%d, %d},\n", xlat[rule.Sym.Value], len(rule.Components)) + } + mustFormat(f, "%u}\n") + + // XError table + mustFormat(f, "\n%[1]sXErrors = map[%[1]sXError]string{%i\n", *oPref) + for _, xerr := range p.XErrors { + state := xerr.Stack[len(xerr.Stack)-1] + xsym := -1 + if xerr.Lookahead != nil { + xsym = xlat[xerr.Lookahead.Value] + } + mustFormat(f, "%[1]sXError{%d, %d}: \"%s\",\n", *oPref, state, xsym, xerr.Msg) + } + mustFormat(f, "%u}\n\n") + + // Parse table + tbits := 32 + switch n := mathutil.BitLen(maxArg - minArg + 1); { + case n < 8: + tbits = 8 + case n < 16: + tbits = 16 + } + mustFormat(f, "%sParseTab = [%d][]uint%d{%i\n", *oPref, len(p.Table), tbits) + nCells := 0 + var tabRow sortutil.Uint64Slice + for si, state := range p.Table { + tabRow = tabRow[:0] + max := 0 + for _, act := range state { + sym := act.Sym + xsym, ok := xlat[sym.Value] + if !ok { + panic("internal error 001") + } + + max = mathutil.Max(max, xsym) + kind, arg := act.Kind() + switch kind { + case 'a': + arg = 0 + case 'r': + arg *= -1 + } + tabRow = append(tabRow, uint64(xsym)<<32|uint64(arg-minArg)) + } + nCells += max + tabRow.Sort() + col := -1 + if si%5 == 0 { + mustFormat(f, "// %d\n", si) + } + mustFormat(f, "{") + for i, v := range tabRow { + xsym := int(uint32(v >> 32)) + arg := int(uint32(v)) + if col+1 != xsym { + mustFormat(f, "%d: ", xsym) + } + switch { + case i == len(tabRow)-1: + mustFormat(f, "%d", arg) + default: + mustFormat(f, "%d, ", arg) + } + col = xsym + } + mustFormat(f, "},\n") + } + mustFormat(f, "%u}\n") + fmt.Fprintf(os.Stderr, "Parse table entries: %d of %d, x %d bits == %d bytes\n", nCells, len(p.Table)*len(msu), tbits, nCells*tbits/8) + if n := p.ConflictsSR; n != 0 { + fmt.Fprintf(os.Stderr, "conflicts: %d shift/reduce\n", n) + } + if n := p.ConflictsRR; n != 0 { + fmt.Fprintf(os.Stderr, "conflicts: %d reduce/reduce\n", n) + } + + mustFormat(f, `%u) + +var %[1]sDebug = 0 + +type %[1]sLexer interface { + Lex(lval *%[1]sSymType) int + Errorf(format string, a ...interface{}) + Errors() (warns []error, errs []error) +} + +type %[1]sLexerEx interface { + %[1]sLexer + Reduced(rule, state int, lval *%[1]sSymType) bool +} + +func %[1]sSymName(c int) (s string) { + x, ok := %[1]sXLAT[c] + if ok { + return %[1]sSymNames[x] + } + + return __yyfmt__.Sprintf("%%d", c) +} + +func %[1]slex1(yylex %[1]sLexer, lval *%[1]sSymType) (n int) { + n = yylex.Lex(lval) + if n <= 0 { + n = %[1]sEOFCode + } + if %[1]sDebug >= 3 { + __yyfmt__.Printf("\nlex %%s(%%#x %%d), %[4]s: %[3]s\n", %[1]sSymName(n), n, n, %[4]s) + } + return n +} + +func %[1]sParse(yylex %[1]sLexer, parser *Parser) int { + const yyError = %[2]d + + yyEx, _ := yylex.(%[1]sLexerEx) + var yyn int + parser.yylval = %[1]sSymType{} + parser.yyVAL = %[1]sSymType{} + yyS := parser.cache + + Nerrs := 0 /* number of errors */ + Errflag := 0 /* error recovery flag */ + yyerrok := func() { + if %[1]sDebug >= 2 { + __yyfmt__.Printf("yyerrok()\n") + } + Errflag = 0 + } + _ = yyerrok + yystate := 0 + yychar := -1 + var yyxchar int + var yyshift int + yyp := -1 + goto yystack + +ret0: + return 0 + +ret1: + return 1 + +yystack: + /* put a state and value onto the stack */ + yyp++ + if yyp >= len(yyS) { + nyys := make([]%[1]sSymType, len(yyS)*2) + copy(nyys, yyS) + yyS = nyys + parser.cache = yyS + } + yyS[yyp] = parser.yyVAL + yyS[yyp].yys = yystate + +yynewstate: + if yychar < 0 { + yychar = %[1]slex1(yylex, &parser.yylval) + var ok bool + if yyxchar, ok = %[1]sXLAT[yychar]; !ok { + yyxchar = len(%[1]sSymNames) // > tab width + } + } + if %[1]sDebug >= 4 { + var a []int + for _, v := range yyS[:yyp+1] { + a = append(a, v.yys) + } + __yyfmt__.Printf("state stack %%v\n", a) + } + row := %[1]sParseTab[yystate] + yyn = 0 + if yyxchar < len(row) { + if yyn = int(row[yyxchar]); yyn != 0 { + yyn += %[1]sTabOfs + } + } + switch { + case yyn > 0: // shift + yychar = -1 + parser.yyVAL = parser.yylval + yystate = yyn + yyshift = yyn + if %[1]sDebug >= 2 { + __yyfmt__.Printf("shift, and goto state %%d\n", yystate) + } + if Errflag > 0 { + Errflag-- + } + goto yystack + case yyn < 0: // reduce + case yystate == 1: // accept + if %[1]sDebug >= 2 { + __yyfmt__.Println("accept") + } + goto ret0 + } + + if yyn == 0 { + /* error ... attempt to resume parsing */ + switch Errflag { + case 0: /* brand new error */ + if %[1]sDebug >= 1 { + __yyfmt__.Printf("no action for %%s in state %%d\n", %[1]sSymName(yychar), yystate) + } + msg, ok := %[1]sXErrors[%[1]sXError{yystate, yyxchar}] + if !ok { + msg, ok = %[1]sXErrors[%[1]sXError{yystate, -1}] + } + if !ok && yyshift != 0 { + msg, ok = %[1]sXErrors[%[1]sXError{yyshift, yyxchar}] + } + if !ok { + msg, ok = %[1]sXErrors[%[1]sXError{yyshift, -1}] + } + if !ok || msg == "" { + msg = "syntax error" + } + // ignore goyacc error message + yylex.Errorf("") + Nerrs++ + fallthrough + + case 1, 2: /* incompletely recovered error ... try again */ + Errflag = 3 + + /* find a state where "error" is a legal shift action */ + for yyp >= 0 { + row := %[1]sParseTab[yyS[yyp].yys] + if yyError < len(row) { + yyn = int(row[yyError])+%[1]sTabOfs + if yyn > 0 { // hit + if %[1]sDebug >= 2 { + __yyfmt__.Printf("error recovery found error shift in state %%d\n", yyS[yyp].yys) + } + yystate = yyn /* simulate a shift of "error" */ + goto yystack + } + } + + /* the current p has no shift on "error", pop stack */ + if %[1]sDebug >= 2 { + __yyfmt__.Printf("error recovery pops state %%d\n", yyS[yyp].yys) + } + yyp-- + } + /* there is no state on the stack with an error shift ... abort */ + if %[1]sDebug >= 2 { + __yyfmt__.Printf("error recovery failed\n") + } + goto ret1 + + case 3: /* no shift yet; clobber input char */ + if %[1]sDebug >= 2 { + __yyfmt__.Printf("error recovery discards %%s\n", %[1]sSymName(yychar)) + } + if yychar == %[1]sEOFCode { + goto ret1 + } + + yychar = -1 + goto yynewstate /* try again in the same state */ + } + } + + r := -yyn + x0 := %[1]sReductions[r] + x, n := x0.xsym, x0.components + yypt := yyp + _ = yypt // guard against "declared and not used" + + yyp -= n + if yyp+1 >= len(yyS) { + nyys := make([]%[1]sSymType, len(yyS)*2) + copy(nyys, yyS) + yyS = nyys + parser.cache = yyS + } + parser.yyVAL = yyS[yyp+1] + + /* consult goto table to find next state */ + exState := yystate + yystate = int(%[1]sParseTab[yyS[yyp].yys][x])+%[1]sTabOfs + /* reduction by production r */ + if %[1]sDebug >= 2 { + __yyfmt__.Printf("reduce using rule %%v (%%s), and goto state %%d\n", r, %[1]sSymNames[x], yystate) + } + + switch r {%i +`, + *oPref, errSym, *oDlvalf, *oDlval) + for r, rule := range p.Rules { + if rule.Action == nil { + continue + } + + action := rule.Action.Values + if len(action) == 0 { + continue + } + + if len(action) == 1 { + part := action[0] + if part.Type == parser.ActionValueGo { + src := part.Src + src = src[1 : len(src)-1] // Remove lead '{' and trail '}' + if strings.TrimSpace(src) == "" { + continue + } + } + } + + components := rule.Components + typ := rule.Sym.Type + max := len(components) + if p1 := rule.Parent; p1 != nil { + max = rule.MaxParentDlr + components = p1.Components + } + mustFormat(f, "case %d: ", r) + for _, part := range action { + num := part.Num + switch part.Type { + case parser.ActionValueGo: + mustFormat(f, "%s", part.Src) + case parser.ActionValueDlrDlr: + mustFormat(f, "parser.yyVAL.%s", typ) + if typ == "" { + panic("internal error 002") + } + case parser.ActionValueDlrNum: + typ := p.Syms[components[num-1]].Type + if typ == "" { + panic("internal error 003") + } + mustFormat(f, "yyS[yypt-%d].%s", max-num, typ) + case parser.ActionValueDlrTagDlr: + mustFormat(f, "parser.yyVAL.%s", part.Tag) + case parser.ActionValueDlrTagNum: + mustFormat(f, "yyS[yypt-%d].%s", max-num, part.Tag) + } + } + mustFormat(f, "\n") + } + mustFormat(f, `%u + } + + if yyEx != nil && yyEx.Reduced(r, exState, &parser.yyVAL) { + return -1 + } + goto yystack /* stack new state and value */ +} + +%[2]s +`, *oPref, p.Tail) + _ = oNoLines //TODO Ignored for now + return nil +} + +func injectImport(src string) string { + const inj = ` + +import __yyfmt__ "fmt" +` + fset := token.NewFileSet() + file := fset.AddFile("", -1, len(src)) + var s scanner.Scanner + s.Init( + file, + []byte(src), + nil, + scanner.ScanComments, + ) + for { + switch _, tok, _ := s.Scan(); tok { + case token.EOF: + return inj + src + case token.PACKAGE: + s.Scan() // ident + pos, _, _ := s.Scan() + ofs := file.Offset(pos) + return src[:ofs] + inj + src[ofs:] + } + } +} + +func mustFormat(f strutil.Formatter, format string, args ...interface{}) { + _, err := f.Format(format, args...) + if err != nil { + log.Fatalf("format error %v", err) + } +} diff --git a/parser/lexer_test.go b/parser/lexer_test.go index 74341836..2f8069dc 100644 --- a/parser/lexer_test.go +++ b/parser/lexer_test.go @@ -15,34 +15,30 @@ package parser import ( "fmt" + "testing" "unicode" - . "github.com/pingcap/check" - "github.com/XiaoMi/Gaea/mysql" -) -var _ = Suite(&testLexerSuite{}) - -type testLexerSuite struct { -} + requires "github.com/stretchr/testify/require" +) -func (s *testLexerSuite) TestTokenID(c *C) { +func TestTokenID(t *testing.T) { for str, tok := range tokenMap { l := NewScanner(str) var v yySymType tok1 := l.Lex(&v) - c.Check(tok, Equals, tok1) + requires.Equal(t, tok1, tok) } } -func (s *testLexerSuite) TestSingleChar(c *C) { +func TestSingleChar(t *testing.T) { table := []byte{'|', '&', '-', '+', '*', '/', '%', '^', '~', '(', ',', ')'} for _, tok := range table { l := NewScanner(string(tok)) var v yySymType tok1 := l.Lex(&v) - c.Check(int(tok), Equals, tok1) + requires.Equal(t, tok1, int(tok)) } } @@ -51,7 +47,7 @@ type testCaseItem struct { tok int } -func (s *testLexerSuite) TestSingleCharOther(c *C) { +func TestSingleCharOther(t *testing.T) { table := []testCaseItem{ {"AT", identifier}, {"?", paramMarker}, @@ -59,10 +55,10 @@ func (s *testLexerSuite) TestSingleCharOther(c *C) { {"=", eq}, {".", int('.')}, } - runTest(c, table) + runTest(t, table) } -func (s *testLexerSuite) TestAtLeadingIdentifier(c *C) { +func TestAtLeadingIdentifier(t *testing.T) { table := []testCaseItem{ {"@", singleAtIdentifier}, {"@''", singleAtIdentifier}, @@ -84,25 +80,25 @@ func (s *testLexerSuite) TestAtLeadingIdentifier(c *C) { {"@@local.`test`", doubleAtIdentifier}, {"@@`test`", doubleAtIdentifier}, } - runTest(c, table) + runTest(t, table) } -func (s *testLexerSuite) TestUnderscoreCS(c *C) { +func TestUnderscoreCS(t *testing.T) { var v yySymType scanner := NewScanner(`_utf8"string"`) tok := scanner.Lex(&v) - c.Check(tok, Equals, underscoreCS) + requires.Equal(t, underscoreCS, tok) tok = scanner.Lex(&v) - c.Check(tok, Equals, stringLit) + requires.Equal(t, stringLit, tok) scanner.reset("N'string'") tok = scanner.Lex(&v) - c.Check(tok, Equals, underscoreCS) + requires.Equal(t, underscoreCS, tok) tok = scanner.Lex(&v) - c.Check(tok, Equals, stringLit) + requires.Equal(t, stringLit, tok) } -func (s *testLexerSuite) TestLiteral(c *C) { +func TestLiteral(t *testing.T) { table := []testCaseItem{ {`'''a'''`, stringLit}, {`''a''`, stringLit}, @@ -147,19 +143,18 @@ func (s *testLexerSuite) TestLiteral(c *C) { {`b'0101'`, bitLit}, {`0b0101`, bitLit}, } - runTest(c, table) + runTest(t, table) } -func runTest(c *C, table []testCaseItem) { +func runTest(t *testing.T, table []testCaseItem) { var val yySymType for _, v := range table { l := NewScanner(v.str) tok := l.Lex(&val) - c.Check(tok, Equals, v.tok, Commentf(v.str)) + requires.Equal(t, v.tok, tok, v.str) } } - -func (s *testLexerSuite) TestComment(c *C) { +func TestComment(t *testing.T) { table := []testCaseItem{ {"-- select --\n1", intLit}, @@ -178,19 +173,19 @@ SELECT`, selectKwd}, {"--\r\nSELECT", selectKwd}, {"--", 0}, } - runTest(c, table) + runTest(t, table) } -func (s *testLexerSuite) TestscanQuotedIdent(c *C) { +func TestScanQuotedIdent(t *testing.T) { l := NewScanner("`fk`") l.r.peek() tok, pos, lit := scanQuotedIdent(l) - c.Assert(pos.Offset, Equals, 0) - c.Assert(tok, Equals, quotedIdentifier) - c.Assert(lit, Equals, "fk") + requires.Zero(t, pos.Offset) + requires.Equal(t, quotedIdentifier, tok) + requires.Equal(t, "fk", lit) } -func (s *testLexerSuite) TestscanString(c *C) { +func TestscanString(t *testing.T) { table := []struct { raw string expect string @@ -215,17 +210,16 @@ func (s *testLexerSuite) TestscanString(c *C) { {"'\\a\x90'", "a\x90"}, {`"\aèàø»"`, `aèàø»`}, } - for _, v := range table { l := NewScanner(v.raw) tok, pos, lit := l.scan() - c.Assert(tok, Equals, stringLit) - c.Assert(pos.Offset, Equals, 0) - c.Assert(lit, Equals, v.expect) + requires.Zero(t, pos.Offset) + requires.Equal(t, stringLit, tok) + requires.Equal(t, v.expect, lit) } } -func (s *testLexerSuite) TestIdentifier(c *C) { +func TestIdentifier(t *testing.T) { replacementString := string(unicode.ReplacementChar) + "xxx" table := [][2]string{ {`哈哈`, "哈哈"}, @@ -251,25 +245,25 @@ func (s *testLexerSuite) TestIdentifier(c *C) { l.reset(item[0]) var v yySymType tok := l.Lex(&v) - c.Assert(tok, Equals, identifier) - c.Assert(v.ident, Equals, item[1]) + requires.Equal(t, identifier, tok, item) + requires.Equal(t, item[1], v.ident, item) } } -func (s *testLexerSuite) TestSpecialComment(c *C) { +func TestSpecialComment(t *testing.T) { l := NewScanner("/*!40101 select\n5*/") tok, pos, lit := l.scan() - c.Assert(tok, Equals, identifier) - c.Assert(lit, Equals, "select") - c.Assert(pos, Equals, Pos{0, 0, 9}) + requires.Equal(t, identifier, tok) + requires.Equal(t, "select", lit) + requires.Equal(t, Pos{0, 0, 9}, pos) tok, pos, lit = l.scan() - c.Assert(tok, Equals, intLit) - c.Assert(lit, Equals, "5") - c.Assert(pos, Equals, Pos{1, 1, 16}) + requires.Equal(t, intLit, tok) + requires.Equal(t, "5", lit) + requires.Equal(t, Pos{1, 1, 16}, pos) } -func (s *testLexerSuite) TestOptimizerHint(c *C) { +func TestOptimizerHint(t *testing.T) { l := NewScanner(" /*+ BKA(t1) */") tokens := []struct { tok int @@ -288,13 +282,13 @@ func (s *testLexerSuite) TestOptimizerHint(c *C) { if tok == 0 { return } - c.Assert(tok, Equals, tokens[i].tok, Commentf("%d", i)) - c.Assert(lit, Equals, tokens[i].lit, Commentf("%d", i)) - c.Assert(pos.Offset, Equals, tokens[i].pos, Commentf("%d", i)) + requires.Equal(t, tokens[i].tok, tok, i) + requires.Equal(t, tokens[i].lit, lit, i) + requires.Equal(t, tokens[i].pos, pos.Offset, i) } } -func (s *testLexerSuite) TestInt(c *C) { +func TestInt(t *testing.T) { tests := []struct { input string expect uint64 @@ -307,23 +301,23 @@ func (s *testLexerSuite) TestInt(c *C) { {"10", 10}, } scanner := NewScanner("") - for _, t := range tests { + for _, test := range tests { var v yySymType - scanner.reset(t.input) + scanner.reset(test.input) tok := scanner.Lex(&v) - c.Assert(tok, Equals, intLit) + requires.Equal(t, intLit, tok) switch i := v.item.(type) { case int64: - c.Assert(uint64(i), Equals, t.expect) + requires.Equal(t, test.expect, uint64(i)) case uint64: - c.Assert(i, Equals, t.expect) + requires.Equal(t, test.expect, i) default: - c.Fail() + t.Fail() } } } -func (s *testLexerSuite) TestSQLModeANSIQuotes(c *C) { +func TestSQLModeANSIQuotes(t *testing.T) { tests := []struct { input string tok int @@ -338,24 +332,25 @@ func (s *testLexerSuite) TestSQLModeANSIQuotes(c *C) { } scanner := NewScanner("") scanner.SetSQLMode(mysql.ModeANSIQuotes) - for _, t := range tests { + for _, test := range tests { var v yySymType - scanner.reset(t.input) + scanner.reset(test.input) tok := scanner.Lex(&v) - c.Assert(tok, Equals, t.tok) - c.Assert(v.ident, Equals, t.ident) + requires.Equal(t, test.tok, tok) + requires.Equal(t, test.ident, v.ident) } scanner.reset(`'string' 'string'`) var v yySymType tok := scanner.Lex(&v) - c.Assert(tok, Equals, stringLit) - c.Assert(v.ident, Equals, "string") + requires.Equal(t, stringLit, tok) + requires.Equal(t, "string", v.ident) tok = scanner.Lex(&v) - c.Assert(tok, Equals, stringLit) - c.Assert(v.ident, Equals, "string") + requires.Equal(t, stringLit, tok) + requires.Equal(t, "string", v.ident) + } -func (s *testLexerSuite) TestIllegal(c *C) { +func TestIllegal(t *testing.T) { table := []testCaseItem{ {"'", 0}, {"'fu", 0}, @@ -370,5 +365,5 @@ func (s *testLexerSuite) TestIllegal(c *C) { {"@@`", 0}, {"@@global.`", 0}, } - runTest(c, table) + runTest(t, table) } diff --git a/parser/misc.go b/parser/misc.go index 26b03cc2..218452bc 100644 --- a/parser/misc.go +++ b/parser/misc.go @@ -422,6 +422,7 @@ var tokenMap = map[string]int{ "RLIKE": rlike, "ROLE": role, "ROLLBACK": rollback, + "ROLLUP": rollup, "ROUTINE": routine, "ROW": row, "ROW_COUNT": rowCount, @@ -544,6 +545,9 @@ var tokenMap = map[string]int{ "WORK": work, "CHAIN": chain, "RELEASE": release, + "NOWAIT": nowait, + "SKIP": skip, + "LOCKED": locked, } // See https://dev.mysql.com/doc/refman/5.7/en/function-resolution.html for details @@ -582,7 +586,7 @@ var btFuncTokenMap = map[string]int{ "VAR_SAMP": builtinVarSamp, } -var windowFuncTokenMap = map[string]int{ +var WindowFuncTokenMap = map[string]int{ "CUME_DIST": cumeDist, "DENSE_RANK": denseRank, "FIRST_VALUE": firstValue, @@ -645,7 +649,7 @@ func (s *Scanner) isTokenIdentifier(lit string, offset int) int { } tok, ok := tokenMap[string(data)] if !ok && s.supportWindowFunc { - tok = windowFuncTokenMap[string(data)] + tok = WindowFuncTokenMap[string(data)] } return tok } diff --git a/parser/model/ddl.go b/parser/model/ddl.go index 1ed20d4e..11424cda 100644 --- a/parser/model/ddl.go +++ b/parser/model/ddl.go @@ -56,6 +56,9 @@ const ( ActionTruncateTablePartition ActionType = 23 ActionDropView ActionType = 24 ActionRestoreTable ActionType = 25 + + ActionLockTable ActionType = 27 + ActionUnlockTable ActionType = 28 ) // AddIndexStr is a string related to the operation of "add index". @@ -87,6 +90,8 @@ var actionMap = map[ActionType]string{ ActionTruncateTablePartition: "truncate partition", ActionDropView: "drop view", ActionRestoreTable: "restore table", + ActionLockTable: "lock table", + ActionUnlockTable: "unlock table", } // String return current ddl action in string diff --git a/parser/model/model.go b/parser/model/model.go index 5a1d0a6b..7c787851 100644 --- a/parser/model/model.go +++ b/parser/model/model.go @@ -15,6 +15,7 @@ package model import ( "encoding/json" + "strconv" "strings" "time" @@ -203,11 +204,98 @@ type TableInfo struct { Compression string `json:"compression"` View *ViewInfo `json:"view"` + // Lock represent the table lock info. + Lock *TableLockInfo `json:"Lock"` // Version means the version of the table info. Version uint16 `json:"version"` } +// TableLockInfo provides meta data describing a table lock. +type TableLockInfo struct { + Tp TableLockType + // Use array because there may be multiple sessions holding the same read lock. + Sessions []SessionInfo + State TableLockState + // TS is used to record the timestamp this table lock been locked. + TS uint64 +} + +// SessionInfo contain the session ID and the server ID. +type SessionInfo struct { + ServerID string + SessionID uint64 +} + +func (s SessionInfo) String() string { + return "server: " + s.ServerID + "_session: " + strconv.FormatUint(s.SessionID, 10) +} + +// TableLockTpInfo is composed by schema ID, table ID and table lock type. +type TableLockTpInfo struct { + SchemaID int64 + TableID int64 + Tp TableLockType +} + +// TableLockState is the state for table lock. +type TableLockState byte + +const ( + // TableLockStateNone means this table lock is absent. + TableLockStateNone TableLockState = iota + // TableLockStatePreLock means this table lock is pre-lock state. Other session doesn't hold this lock should't do corresponding operation according to the lock type. + TableLockStatePreLock + // TableLockStatePublic means this table lock is public state. + TableLockStatePublic +) + +// String implements fmt.Stringer interface. +func (t TableLockState) String() string { + switch t { + case TableLockStatePreLock: + return "pre-lock" + case TableLockStatePublic: + return "public" + default: + return "none" + } +} + +// TableLockType is the type of the table lock. +type TableLockType byte + +const ( + 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. + // Other sessions can read the table without explicitly acquiring a READ lock. + TableLockRead + // TableLockReadLocal is not supported. + TableLockReadLocal + // TableLockWrite means only the session with this lock has write/read permission. + // Only the session that holds the lock can access the table. No other session can access it until the lock is released. + TableLockWrite + // TableLockWriteLocal means the session with this lock has write/read permission, and the other session still has read permission. + TableLockWriteLocal +) + +func (t TableLockType) String() string { + switch t { + case TableLockNone: + return "NONE" + case TableLockRead: + return "READ" + case TableLockReadLocal: + return "READ LOCAL" + case TableLockWriteLocal: + return "WRITE LOCAL" + case TableLockWrite: + return "WRITE" + } + return "" +} + // GetPartitionInfo returns the partition information. func (t *TableInfo) GetPartitionInfo() *PartitionInfo { if t.Partition != nil && t.Partition.Enable { diff --git a/parser/model/model_test.go b/parser/model/model_test.go index 5ccab7d4..0db6063c 100644 --- a/parser/model/model_test.go +++ b/parser/model/model_test.go @@ -19,30 +19,21 @@ import ( "testing" "time" - . "github.com/pingcap/check" + "github.com/stretchr/testify/require" "github.com/XiaoMi/Gaea/mysql" "github.com/XiaoMi/Gaea/parser/types" ) func TestT(t *testing.T) { - CustomVerboseFlag = true - TestingT(t) -} - -var _ = Suite(&testModelSuite{}) - -type testModelSuite struct { -} - -func (*testModelSuite) TestT(c *C) { abc := NewCIStr("aBC") - c.Assert(abc.O, Equals, "aBC") - c.Assert(abc.L, Equals, "abc") - c.Assert(abc.String(), Equals, "aBC") + require.Equal(t, "aBC", abc.O) + require.Equal(t, "abc", abc.L) + require.Equal(t, "aBC", abc.String()) + } -func (*testModelSuite) TestModelBasic(c *C) { +func TestModelBasic(t *testing.T) { column := &ColumnInfo{ ID: 1, Name: NewCIStr("c"), @@ -90,55 +81,55 @@ func (*testModelSuite) TestModelBasic(c *C) { } n := dbInfo.Clone() - c.Assert(n, DeepEquals, dbInfo) + require.Equal(t, dbInfo, n) pkName := table.GetPkName() - c.Assert(pkName, Equals, NewCIStr("c")) + require.Equal(t, NewCIStr("c"), pkName) newColumn := table.GetPkColInfo() - c.Assert(newColumn, DeepEquals, column) + require.Equal(t, column, newColumn) inIdx := table.ColumnIsInIndex(column) - c.Assert(inIdx, Equals, true) + require.True(t, inIdx) tp := IndexTypeBtree - c.Assert(tp.String(), Equals, "BTREE") + require.Equal(t, "BTREE", tp.String()) tp = IndexTypeHash - c.Assert(tp.String(), Equals, "HASH") - tp = 1E5 - c.Assert(tp.String(), Equals, "") + require.Equal(t, "HASH", tp.String()) + tp = 1e5 + require.Equal(t, "", tp.String()) has := index.HasPrefixIndex() - c.Assert(has, Equals, true) - t := table.GetUpdateTime() - c.Assert(t, Equals, TSConvert2Time(table.UpdateTS)) + require.True(t, has) + tbl := table.GetUpdateTime() + require.Equal(t, TSConvert2Time(table.UpdateTS), tbl) // Corner cases column.Flag ^= mysql.PriKeyFlag pkName = table.GetPkName() - c.Assert(pkName, Equals, NewCIStr("")) + require.Equal(t, NewCIStr(""), pkName) newColumn = table.GetPkColInfo() - c.Assert(newColumn, IsNil) + require.Nil(t, newColumn) anCol := &ColumnInfo{ Name: NewCIStr("d"), } exIdx := table.ColumnIsInIndex(anCol) - c.Assert(exIdx, Equals, false) + require.False(t, exIdx) anIndex := &IndexInfo{ Columns: []*IndexColumn{}, } no := anIndex.HasPrefixIndex() - c.Assert(no, Equals, false) + require.False(t, no) } -func (*testModelSuite) TestJobStartTime(c *C) { +func TestJobStartTime(t *testing.T) { job := &Job{ ID: 123, BinlogInfo: &HistoryInfo{}, } - t := time.Unix(0, 0) - c.Assert(t, Equals, TSConvert2Time(job.StartTS)) + time := time.Unix(0, 0) + require.Equal(t, TSConvert2Time(job.StartTS), time) ret := fmt.Sprintf("%s", job) - c.Assert(job.String(), Equals, ret) + require.Equal(t, ret, job.String()) } -func (*testModelSuite) TestJobCodec(c *C) { +func TestJobCodec(t *testing.T) { type A struct { Name string } @@ -165,10 +156,10 @@ func (*testModelSuite) TestJobCodec(c *C) { Args: []interface{}{int64(3), NewCIStr("new_table_name")}, } job1.RawArgs, err = json.Marshal(job1.Args) - c.Assert(err, IsNil) + require.NoError(t, err) isDependent, err := job.IsDependentOn(job1) - c.Assert(err, IsNil) - c.Assert(isDependent, IsTrue) + require.NoError(t, err) + require.True(t, isDependent) // job1: rename table, old schema ID is 3 // job2: create schema, schema ID is 3 job2 := &Job{ @@ -179,62 +170,63 @@ func (*testModelSuite) TestJobCodec(c *C) { BinlogInfo: &HistoryInfo{}, } isDependent, err = job2.IsDependentOn(job1) - c.Assert(err, IsNil) - c.Assert(isDependent, IsTrue) - - c.Assert(job.IsCancelled(), Equals, false) + require.NoError(t, err) + require.True(t, isDependent) + require.False(t, job.IsCancelled()) b, err := job.Encode(false) - c.Assert(err, IsNil) + require.NoError(t, err) newJob := &Job{} err = newJob.Decode(b) - c.Assert(err, IsNil) - c.Assert(newJob.BinlogInfo, DeepEquals, job.BinlogInfo) + require.NoError(t, err) + require.Equal(t, job.BinlogInfo, newJob.BinlogInfo) name := CIStr{} a := A{} err = newJob.DecodeArgs(&name, &a) - c.Assert(err, IsNil) - c.Assert(name, DeepEquals, NewCIStr("")) - c.Assert(a, DeepEquals, A{Name: ""}) - c.Assert(len(newJob.String()), Greater, 0) + require.NoError(t, err) + require.Equal(t, NewCIStr(""), name) + require.Equal(t, A{Name: ""}, a) + require.Greater(t, len(newJob.String()), 0) job.BinlogInfo.Clean() b1, err := job.Encode(true) - c.Assert(err, IsNil) + require.NoError(t, err) newJob = &Job{} err = newJob.Decode(b1) - c.Assert(err, IsNil) - c.Assert(newJob.BinlogInfo, DeepEquals, &HistoryInfo{}) + require.NoError(t, err) + require.Equal(t, &HistoryInfo{}, newJob.BinlogInfo) name = CIStr{} a = A{} err = newJob.DecodeArgs(&name, &a) - c.Assert(err, IsNil) - c.Assert(name, DeepEquals, NewCIStr("a")) - c.Assert(a, DeepEquals, A{Name: "abc"}) - c.Assert(len(newJob.String()), Greater, 0) + require.NoError(t, err) + require.Equal(t, NewCIStr("a"), name) + require.Equal(t, A{Name: "abc"}, a) + require.Greater(t, len(newJob.String()), 0) b2, err := job.Encode(true) - c.Assert(err, IsNil) + require.NoError(t, err) newJob = &Job{} err = newJob.Decode(b2) - c.Assert(err, IsNil) + require.NoError(t, err) name = CIStr{} // Don't decode to a here. err = newJob.DecodeArgs(&name) - c.Assert(err, IsNil) - c.Assert(name, DeepEquals, NewCIStr("a")) - c.Assert(len(newJob.String()), Greater, 0) + require.NoError(t, err) + require.Equal(t, NewCIStr("a"), name) + require.Greater(t, len(newJob.String()), 0) job.State = JobStateDone - c.Assert(job.IsDone(), IsTrue) - c.Assert(job.IsFinished(), IsTrue) - c.Assert(job.IsRunning(), IsFalse) - c.Assert(job.IsSynced(), IsFalse) - c.Assert(job.IsRollbackDone(), IsFalse) + require.True(t, job.IsDone()) + require.True(t, job.IsFinished()) + require.False(t, job.IsRunning()) + require.False(t, job.IsSynced()) + require.False(t, job.IsRollbackDone()) + job.SetRowCount(3) - c.Assert(job.GetRowCount(), Equals, int64(3)) + require.Equal(t, int64(3), job.GetRowCount()) + } -func (testModelSuite) TestState(c *C) { +func TestState(t *testing.T) { schemaTbl := []SchemaState{ StateDeleteOnly, StateWriteOnly, @@ -244,7 +236,7 @@ func (testModelSuite) TestState(c *C) { } for _, state := range schemaTbl { - c.Assert(len(state.String()), Greater, 0) + require.Greater(t, len(state.String()), 0) } jobTbl := []JobState{ @@ -257,11 +249,11 @@ func (testModelSuite) TestState(c *C) { } for _, state := range jobTbl { - c.Assert(len(state.String()), Greater, 0) + require.Greater(t, len(state.String()), 0) } } -func (testModelSuite) TestString(c *C) { +func TestString(t *testing.T) { acts := []struct { act ActionType result string @@ -285,24 +277,25 @@ func (testModelSuite) TestString(c *C) { for _, v := range acts { str := v.act.String() - c.Assert(str, Equals, v.result) + require.Equal(t, v.result, str) } } -func (testModelSuite) TestUnmarshalCIStr(c *C) { +func TestUnmarshalCIStr(t *testing.T) { var ci CIStr // Test unmarshal CIStr from a single string. str := "aaBB" buf, err := json.Marshal(str) - c.Assert(err, IsNil) - ci.UnmarshalJSON(buf) - c.Assert(ci.O, Equals, str) - c.Assert(ci.L, Equals, "aabb") + require.NoError(t, err) + require.NoError(t, ci.UnmarshalJSON(buf)) + require.Equal(t, str, ci.O) + require.Equal(t, "aabb", ci.L) buf, err = json.Marshal(ci) - c.Assert(string(buf), Equals, `{"O":"aaBB","L":"aabb"}`) - ci.UnmarshalJSON(buf) - c.Assert(ci.O, Equals, str) - c.Assert(ci.L, Equals, "aabb") + require.NoError(t, err) + require.Equal(t, `{"O":"aaBB","L":"aabb"}`, string(buf)) + require.NoError(t, ci.UnmarshalJSON(buf)) + require.Equal(t, str, ci.O) + require.Equal(t, "aabb", ci.L) } diff --git a/parser/parser.go b/parser/parser.go index 6abb350b..e189a372 100644 --- a/parser/parser.go +++ b/parser/parser.go @@ -54,12 +54,12 @@ type yyXError struct { } const ( - yyDefault = 57843 + yyDefault = 57848 yyEOFCode = 57344 action = 57556 add = 57359 - addDate = 57728 - admin = 57765 + addDate = 57732 + admin = 57769 after = 57557 algorithm = 57559 all = 57360 @@ -68,12 +68,12 @@ const ( analyze = 57362 and = 57363 andand = 57354 - andnot = 57814 + andnot = 57818 any = 57560 as = 57364 asc = 57365 ascii = 57561 - assignmentEq = 57815 + assignmentEq = 57819 autoIncrement = 57562 avg = 57564 avgRowLength = 57563 @@ -81,54 +81,54 @@ const ( between = 57366 bigIntType = 57367 binaryType = 57368 - binding = 57719 - bindings = 57720 + binding = 57723 + bindings = 57724 binlog = 57566 - bitAnd = 57729 - bitLit = 57813 - bitOr = 57730 + bitAnd = 57733 + bitLit = 57817 + bitOr = 57734 bitType = 57567 - bitXor = 57731 + bitXor = 57735 blobType = 57369 boolType = 57569 booleanType = 57568 both = 57370 btree = 57570 - buckets = 57766 - builtinAddDate = 57783 - builtinBitAnd = 57784 - builtinBitOr = 57785 - builtinBitXor = 57786 - builtinCast = 57787 - builtinCount = 57788 - builtinCurDate = 57789 - builtinCurTime = 57790 - builtinDateAdd = 57791 - builtinDateSub = 57792 - builtinExtract = 57793 - builtinGroupConcat = 57794 - builtinMax = 57795 - builtinMin = 57796 - builtinNow = 57797 - builtinPosition = 57798 - builtinStddevPop = 57803 - builtinStddevSamp = 57804 - builtinSubDate = 57799 - builtinSubstring = 57800 - builtinSum = 57801 - builtinSysDate = 57802 - builtinTrim = 57805 - builtinUser = 57806 - builtinVarPop = 57807 - builtinVarSamp = 57808 + buckets = 57770 + builtinAddDate = 57787 + builtinBitAnd = 57788 + builtinBitOr = 57789 + builtinBitXor = 57790 + builtinCast = 57791 + builtinCount = 57792 + builtinCurDate = 57793 + builtinCurTime = 57794 + builtinDateAdd = 57795 + builtinDateSub = 57796 + builtinExtract = 57797 + builtinGroupConcat = 57798 + builtinMax = 57799 + builtinMin = 57800 + builtinNow = 57801 + builtinPosition = 57802 + builtinStddevPop = 57807 + builtinStddevSamp = 57808 + builtinSubDate = 57803 + builtinSubstring = 57804 + builtinSum = 57805 + builtinSysDate = 57806 + builtinTrim = 57809 + builtinUser = 57810 + builtinVarPop = 57811 + builtinVarSamp = 57812 by = 57371 byteType = 57571 - cancel = 57767 + cancel = 57771 cascade = 57372 cascaded = 57572 caseKwd = 57373 - cast = 57732 - chain = 57726 + cast = 57736 + chain = 57730 change = 57374 charType = 57376 character = 57375 @@ -152,13 +152,13 @@ const ( consistent = 57587 constraint = 57380 convert = 57381 - copyKwd = 57733 - count = 57734 + copyKwd = 57737 + count = 57738 create = 57382 - createTableSelect = 57835 + createTableSelect = 57840 cross = 57383 cumeDist = 57384 - curTime = 57735 + curTime = 57739 current = 57588 currentDate = 57385 currentTime = 57386 @@ -167,8 +167,8 @@ const ( data = 57590 database = 57389 databases = 57390 - dateAdd = 57736 - dateSub = 57737 + dateAdd = 57740 + dateSub = 57741 dateType = 57591 datetimeType = 57592 day = 57589 @@ -176,9 +176,9 @@ const ( dayMicrosecond = 57392 dayMinute = 57393 daySecond = 57394 - ddl = 57768 + ddl = 57772 deallocate = 57593 - decLit = 57810 + decLit = 57814 decimalType = 57395 defaultKwd = 57396 definer = 57594 @@ -195,20 +195,20 @@ const ( do = 57597 doubleAtIdentifier = 57350 doubleType = 57405 - drainer = 57769 + drainer = 57773 drop = 57406 dual = 57407 duplicate = 57598 dynamic = 57599 elseKwd = 57408 - empty = 57828 + empty = 57832 enable = 57600 enclosed = 57409 end = 57601 engine = 57602 engines = 57603 enum = 57604 - eq = 57816 + eq = 57820 yyErrCode = 57345 escape = 57607 escaped = 57410 @@ -219,13 +219,13 @@ const ( execute = 57609 exists = 57411 explain = 57412 - extract = 57738 + extract = 57742 falseKwd = 57414 fields = 57610 first = 57611 firstValue = 57415 fixed = 57612 - floatLit = 57809 + floatLit = 57813 floatType = 57416 flush = 57613 following = 57614 @@ -237,27 +237,27 @@ const ( full = 57616 fulltext = 57421 function = 57617 - ge = 57817 + ge = 57821 generated = 57422 - getFormat = 57739 - global = 57698 + getFormat = 57743 + global = 57702 grant = 57423 grants = 57618 group = 57424 - groupConcat = 57740 + groupConcat = 57744 groups = 57425 hash = 57619 having = 57426 - hexLit = 57812 + hexLit = 57816 highPriority = 57427 - higherThanComma = 57842 + higherThanComma = 57847 hintBegin = 57352 hintEnd = 57353 hour = 57620 hourMicrosecond = 57428 hourMinute = 57429 hourSecond = 57430 - identSQLErrors = 57722 + identSQLErrors = 57726 identified = 57621 identifier = 57346 ifKwd = 57431 @@ -267,44 +267,44 @@ const ( indexes = 57623 infile = 57435 inner = 57436 - inplace = 57742 + inplace = 57746 insert = 57441 - insertValues = 57833 - instant = 57743 + insertValues = 57838 + instant = 57747 int1Type = 57443 int2Type = 57444 int3Type = 57445 int4Type = 57446 int8Type = 57447 - intLit = 57811 + intLit = 57815 intType = 57442 integerType = 57437 - internal = 57744 + internal = 57748 interval = 57438 into = 57439 invalid = 57351 invoker = 57624 is = 57440 isolation = 57622 - job = 57771 - jobs = 57770 + job = 57775 + jobs = 57774 join = 57448 jsonType = 57625 - jss = 57819 - juss = 57820 + jss = 57823 + juss = 57824 key = 57449 keyBlockSize = 57626 keys = 57450 kill = 57451 lag = 57452 - last = 57628 + last = 57629 lastValue = 57453 - le = 57818 + le = 57822 lead = 57454 leading = 57455 left = 57456 - less = 57629 - level = 57630 + less = 57630 + level = 57631 like = 57457 limit = 57458 lines = 57459 @@ -313,69 +313,72 @@ const ( localTime = 57461 localTs = 57462 lock = 57463 + locked = 57628 long = 57543 longblobType = 57464 longtextType = 57465 lowPriority = 57466 - lowerThanComma = 57841 - lowerThanCreateTableSelect = 57834 - lowerThanEq = 57839 - lowerThanInsertValues = 57832 - lowerThanIntervalKeyword = 57829 - lowerThanKey = 57836 - lowerThanOn = 57838 - lowerThanSetKeyword = 57831 - lowerThanStringLitToken = 57830 - lsh = 57821 - master = 57631 - max = 57746 - maxConnectionsPerHour = 57638 - maxExecutionTime = 57747 - maxQueriesPerHour = 57639 - maxRows = 57637 - maxUpdatesPerHour = 57640 - maxUserConnections = 57641 + lowerThanComma = 57846 + lowerThanCreateTableSelect = 57839 + lowerThanEq = 57844 + lowerThanInsertValues = 57837 + lowerThanIntervalKeyword = 57834 + lowerThanKey = 57841 + lowerThanOn = 57843 + lowerThanSetKeyword = 57836 + lowerThanStringLitToken = 57835 + lowerThanWith = 57833 + lsh = 57825 + master = 57632 + max = 57750 + maxConnectionsPerHour = 57639 + maxExecutionTime = 57751 + maxQueriesPerHour = 57640 + maxRows = 57638 + maxUpdatesPerHour = 57641 + maxUserConnections = 57642 maxValue = 57467 mediumIntType = 57469 mediumblobType = 57468 mediumtextType = 57470 - merge = 57642 - microsecond = 57632 - min = 57745 - minRows = 57643 - minute = 57633 + merge = 57643 + microsecond = 57633 + min = 57749 + minRows = 57644 + minute = 57634 minuteMicrosecond = 57471 minuteSecond = 57472 mod = 57473 - mode = 57634 - modify = 57635 - month = 57636 - names = 57644 - national = 57645 + mode = 57635 + modify = 57636 + month = 57637 + names = 57645 + national = 57646 natural = 57555 - neg = 57840 - neq = 57822 - neqSynonym = 57823 - next_row_id = 57741 - no = 57646 + neg = 57845 + neq = 57826 + neqSynonym = 57827 + next_row_id = 57745 + no = 57647 noWriteToBinLog = 57475 - none = 57647 + none = 57648 not = 57474 - not2 = 57827 - now = 57748 + not2 = 57831 + now = 57752 + nowait = 57687 nthValue = 57476 ntile = 57477 null = 57478 - nulleq = 57824 - nulls = 57648 + nulleq = 57828 + nulls = 57649 numericType = 57479 nvarcharType = 57480 odbcDateType = 57356 odbcTimeType = 57357 odbcTimestampType = 57358 - offset = 57649 + offset = 57650 on = 57481 - only = 57650 + only = 57651 option = 57482 optionally = 57483 or = 57484 @@ -383,1104 +386,1112 @@ const ( outer = 57486 over = 57487 packKeys = 57488 - paramMarker = 57825 + paramMarker = 57829 partition = 57489 - partitions = 57652 - password = 57651 + partitions = 57653 + password = 57652 percentRank = 57490 pipes = 57355 - pipesAsOr = 57653 - plugins = 57654 - position = 57749 - preceding = 57655 + pipesAsOr = 57654 + plugins = 57655 + position = 57753 + preceding = 57656 precisionType = 57491 - prepare = 57656 + prepare = 57657 primary = 57492 - privileges = 57657 + privileges = 57658 procedure = 57493 - process = 57658 - processlist = 57659 - profiles = 57660 - pump = 57772 - quarter = 57661 - queries = 57663 - query = 57662 - quick = 57664 + process = 57659 + processlist = 57660 + profiles = 57661 + pump = 57776 + quarter = 57662 + queries = 57664 + query = 57663 + quick = 57665 rangeKwd = 57495 rank = 57496 read = 57497 realType = 57498 - recent = 57750 - recover = 57665 - redundant = 57666 + recent = 57754 + recover = 57666 + redundant = 57667 references = 57499 regexpKwd = 57500 - release = 57727 - reload = 57667 + release = 57731 + reload = 57668 rename = 57501 repeat = 57502 - repeatable = 57668 + repeatable = 57669 replace = 57503 - replication = 57670 - respect = 57669 - restore = 57782 + replication = 57671 + respect = 57670 + restore = 57786 restrict = 57504 - reverse = 57671 + reverse = 57672 revoke = 57505 right = 57506 rlike = 57507 - role = 57672 - rollback = 57673 - routine = 57674 + role = 57673 + rollback = 57674 + rollup = 57675 + routine = 57676 row = 57508 - rowCount = 57675 - rowFormat = 57676 + rowCount = 57677 + rowFormat = 57678 rowNumber = 57510 rows = 57509 - rsh = 57826 - savepoint = 57677 - second = 57678 + rsh = 57830 + savepoint = 57679 + second = 57680 secondMicrosecond = 57511 - security = 57679 + security = 57681 selectKwd = 57512 - separator = 57680 - serializable = 57681 - session = 57682 + separator = 57682 + serializable = 57683 + session = 57684 set = 57513 shardRowIDBits = 57494 - share = 57683 - shared = 57684 + share = 57685 + shared = 57686 show = 57514 - signed = 57685 + signed = 57688 singleAtIdentifier = 57349 - slave = 57686 - slow = 57687 + skip = 57689 + slave = 57690 + slow = 57691 smallIntType = 57515 - snapshot = 57688 - some = 57697 + snapshot = 57692 + some = 57701 sql = 57516 - sqlCache = 57689 + sqlCache = 57693 sqlCalcFoundRows = 57517 - sqlNoCache = 57690 - start = 57691 + sqlNoCache = 57694 + start = 57695 starting = 57518 - stats = 57773 - statsBuckets = 57776 - statsHealthy = 57777 - statsHistograms = 57775 - statsMeta = 57774 - statsPersistent = 57692 - status = 57693 - std = 57751 - stddev = 57752 - stddevPop = 57753 - stddevSamp = 57754 + stats = 57777 + statsBuckets = 57780 + statsHealthy = 57781 + statsHistograms = 57779 + statsMeta = 57778 + statsPersistent = 57696 + status = 57697 + std = 57755 + stddev = 57756 + stddevPop = 57757 + stddevSamp = 57758 stored = 57521 straightJoin = 57519 stringLit = 57348 - subDate = 57755 - subpartition = 57694 - subpartitions = 57695 - substring = 57757 - sum = 57756 - super = 57696 + subDate = 57759 + subpartition = 57698 + subpartitions = 57699 + substring = 57761 + sum = 57760 + super = 57700 tableKwd = 57520 - tableRefPriority = 57837 - tables = 57699 - tablespace = 57700 - temporary = 57701 - temptable = 57702 + tableRefPriority = 57842 + tables = 57703 + tablespace = 57704 + temporary = 57705 + temptable = 57706 terminated = 57522 - textType = 57703 - than = 57704 + textType = 57707 + than = 57708 then = 57523 - tidb = 57778 - tidbHJ = 57779 - tidbINLJ = 57781 - tidbSMJ = 57780 - timeType = 57705 - timestampAdd = 57758 - timestampDiff = 57759 - timestampType = 57706 + tidb = 57782 + tidbHJ = 57783 + tidbINLJ = 57785 + tidbSMJ = 57784 + timeType = 57709 + timestampAdd = 57762 + timestampDiff = 57763 + timestampType = 57710 tinyIntType = 57525 tinyblobType = 57524 tinytextType = 57526 to = 57527 - top = 57760 - trace = 57707 + top = 57764 + trace = 57711 trailing = 57528 - transaction = 57708 + transaction = 57712 trigger = 57529 - triggers = 57709 - trim = 57761 + triggers = 57713 + trim = 57765 trueKwd = 57530 - truncate = 57710 - unbounded = 57711 - uncommitted = 57712 - undefined = 57715 + truncate = 57714 + unbounded = 57715 + uncommitted = 57716 + undefined = 57719 underscoreCS = 57347 union = 57532 unique = 57531 - unknown = 57713 + unknown = 57717 unlock = 57533 unsigned = 57534 update = 57535 usage = 57536 use = 57537 - user = 57714 + user = 57718 using = 57538 utcDate = 57539 utcTime = 57541 utcTimestamp = 57540 - value = 57716 + value = 57720 values = 57542 - varPop = 57763 - varSamp = 57764 + varPop = 57767 + varSamp = 57768 varbinaryType = 57545 varcharType = 57544 - variables = 57717 - variance = 57762 - view = 57718 + variables = 57721 + variance = 57766 + view = 57722 virtual = 57546 - warnings = 57721 - week = 57723 + warnings = 57725 + week = 57727 when = 57547 where = 57548 window = 57550 with = 57551 - work = 57725 + work = 57729 write = 57549 xor = 57552 yearMonth = 57553 - yearType = 57724 + yearType = 57728 zerofill = 57554 yyMaxDepth = 200 - yyTabOfs = -1518 + yyTabOfs = -1532 ) var ( yyXLAT = map[int]int{ - 57344: 0, // $end (1304x) - 59: 1, // ';' (1303x) - 57580: 2, // comment (1170x) - 57562: 3, // autoIncrement (1144x) - 57611: 4, // first (1109x) - 57557: 5, // after (1108x) - 44: 6, // ',' (1089x) - 57573: 7, // charsetKwd (1033x) - 57626: 8, // keyBlockSize (1019x) - 57602: 9, // engine (1013x) - 57586: 10, // connection (1006x) - 57651: 11, // password (1006x) - 57685: 12, // signed (1005x) - 57574: 13, // checksum (1004x) - 57563: 14, // avgRowLength (1003x) - 57585: 15, // compression (1003x) - 57595: 16, // delayKeyWrite (1003x) - 57637: 17, // maxRows (1003x) - 57643: 18, // minRows (1003x) - 57676: 19, // rowFormat (1003x) - 57692: 20, // statsPersistent (1003x) - 41: 21, // ')' (987x) - 57718: 22, // view (982x) - 57693: 23, // status (975x) - 57646: 24, // no (973x) - 57680: 25, // separator (973x) - 57699: 26, // tables (973x) - 57655: 27, // preceding (972x) - 57700: 28, // tablespace (971x) - 57724: 29, // yearType (971x) - 57579: 30, // columns (970x) - 57589: 31, // day (970x) - 57620: 32, // hour (970x) - 57632: 33, // microsecond (970x) - 57633: 34, // minute (970x) - 57636: 35, // month (970x) - 57661: 36, // quarter (970x) - 57678: 37, // second (970x) - 57723: 38, // week (970x) - 57594: 39, // definer (969x) - 57610: 40, // fields (969x) - 57621: 41, // identified (969x) - 57747: 42, // maxExecutionTime (969x) - 57669: 43, // respect (969x) - 57779: 44, // tidbHJ (969x) - 57781: 45, // tidbINLJ (969x) - 57780: 46, // tidbSMJ (969x) - 57614: 47, // following (968x) - 57719: 48, // binding (967x) - 57588: 49, // current (967x) - 57601: 50, // end (967x) - 57657: 51, // privileges (967x) - 57711: 52, // unbounded (967x) - 57559: 53, // algorithm (966x) - 57649: 54, // offset (966x) - 57652: 55, // partitions (966x) - 57656: 56, // prepare (966x) - 57672: 57, // role (966x) - 57778: 58, // tidb (966x) - 57714: 59, // user (966x) - 57720: 60, // bindings (965x) - 57592: 61, // datetimeType (965x) - 57591: 62, // dateType (965x) - 57622: 63, // isolation (965x) - 57627: 64, // local (965x) - 57694: 65, // subpartition (965x) - 57705: 66, // timeType (965x) - 57710: 67, // truncate (965x) - 57717: 68, // variables (965x) - 57609: 69, // execute (964x) - 57698: 70, // global (964x) - 57619: 71, // hash (964x) - 57625: 72, // jsonType (964x) - 57741: 73, // next_row_id (964x) - 57659: 74, // processlist (964x) - 57662: 75, // query (964x) - 57677: 76, // savepoint (964x) - 57682: 77, // session (964x) - 57713: 78, // unknown (964x) - 57716: 79, // value (964x) - 57765: 80, // admin (963x) - 57565: 81, // begin (963x) - 57566: 82, // binlog (963x) - 57766: 83, // buckets (963x) - 57576: 84, // client (963x) - 57577: 85, // coalesce (963x) - 57581: 86, // commit (963x) - 57583: 87, // compact (963x) - 57584: 88, // compressed (963x) - 57733: 89, // copyKwd (963x) - 57593: 90, // deallocate (963x) - 57596: 91, // disable (963x) - 57597: 92, // do (963x) - 57599: 93, // dynamic (963x) - 57600: 94, // enable (963x) - 57612: 95, // fixed (963x) - 57613: 96, // flush (963x) - 57742: 97, // inplace (963x) - 57743: 98, // instant (963x) - 57771: 99, // job (963x) - 57770: 100, // jobs (963x) - 57635: 101, // modify (963x) - 57648: 102, // nulls (963x) - 57654: 103, // plugins (963x) - 57666: 104, // redundant (963x) - 57673: 105, // rollback (963x) - 57674: 106, // routine (963x) - 57686: 107, // slave (963x) - 57691: 108, // start (963x) - 57773: 109, // stats (963x) - 57695: 110, // subpartitions (963x) - 57706: 111, // timestampType (963x) - 57707: 112, // trace (963x) - 57556: 113, // action (962x) - 57558: 114, // always (962x) - 57567: 115, // bitType (962x) - 57568: 116, // booleanType (962x) - 57569: 117, // boolType (962x) - 57570: 118, // btree (962x) - 57767: 119, // cancel (962x) - 57572: 120, // cascaded (962x) - 57575: 121, // cleanup (962x) - 57578: 122, // collation (962x) - 57582: 123, // committed (962x) - 57587: 124, // consistent (962x) - 57590: 125, // data (962x) - 57768: 126, // ddl (962x) - 57769: 127, // drainer (962x) - 57598: 128, // duplicate (962x) - 57603: 129, // engines (962x) - 57604: 130, // enum (962x) - 57605: 131, // event (962x) - 57606: 132, // events (962x) - 57608: 133, // exclusive (962x) - 57615: 134, // format (962x) - 57616: 135, // full (962x) - 57617: 136, // function (962x) - 57618: 137, // grants (962x) - 57722: 138, // identSQLErrors (962x) - 57623: 139, // indexes (962x) - 57744: 140, // internal (962x) - 57624: 141, // invoker (962x) - 57628: 142, // last (962x) - 57629: 143, // less (962x) - 57630: 144, // level (962x) - 57631: 145, // master (962x) - 57638: 146, // maxConnectionsPerHour (962x) - 57639: 147, // maxQueriesPerHour (962x) - 57640: 148, // maxUpdatesPerHour (962x) - 57641: 149, // maxUserConnections (962x) - 57642: 150, // merge (962x) - 57634: 151, // mode (962x) - 57645: 152, // national (962x) - 57647: 153, // none (962x) - 57650: 154, // only (962x) - 57658: 155, // process (962x) - 57660: 156, // profiles (962x) - 57772: 157, // pump (962x) - 57663: 158, // queries (962x) - 57750: 159, // recent (962x) - 57665: 160, // recover (962x) - 57667: 161, // reload (962x) - 57668: 162, // repeatable (962x) - 57670: 163, // replication (962x) - 57782: 164, // restore (962x) - 57679: 165, // security (962x) - 57681: 166, // serializable (962x) - 57683: 167, // share (962x) - 57684: 168, // shared (962x) - 57688: 169, // snapshot (962x) - 57776: 170, // statsBuckets (962x) - 57777: 171, // statsHealthy (962x) - 57775: 172, // statsHistograms (962x) - 57774: 173, // statsMeta (962x) - 57696: 174, // super (962x) - 57701: 175, // temporary (962x) - 57702: 176, // temptable (962x) - 57703: 177, // textType (962x) - 57704: 178, // than (962x) - 57760: 179, // top (962x) - 57708: 180, // transaction (962x) - 57709: 181, // triggers (962x) - 57712: 182, // uncommitted (962x) - 57715: 183, // undefined (962x) - 57721: 184, // warnings (962x) - 57728: 185, // addDate (961x) - 57560: 186, // any (961x) - 57561: 187, // ascii (961x) - 57564: 188, // avg (961x) - 57729: 189, // bitAnd (961x) - 57730: 190, // bitOr (961x) - 57731: 191, // bitXor (961x) - 57571: 192, // byteType (961x) - 57732: 193, // cast (961x) - 57734: 194, // count (961x) - 57735: 195, // curTime (961x) - 57736: 196, // dateAdd (961x) - 57737: 197, // dateSub (961x) - 57607: 198, // escape (961x) - 57738: 199, // extract (961x) - 57739: 200, // getFormat (961x) - 57740: 201, // groupConcat (961x) - 57346: 202, // identifier (961x) - 57746: 203, // max (961x) - 57745: 204, // min (961x) - 57644: 205, // names (961x) - 57748: 206, // now (961x) - 57749: 207, // position (961x) - 57664: 208, // quick (961x) - 57671: 209, // reverse (961x) - 57675: 210, // rowCount (961x) - 57687: 211, // slow (961x) - 57697: 212, // some (961x) - 57689: 213, // sqlCache (961x) - 57690: 214, // sqlNoCache (961x) - 57751: 215, // std (961x) - 57752: 216, // stddev (961x) - 57753: 217, // stddevPop (961x) - 57754: 218, // stddevSamp (961x) - 57755: 219, // subDate (961x) - 57757: 220, // substring (961x) - 57756: 221, // sum (961x) - 57758: 222, // timestampAdd (961x) - 57759: 223, // timestampDiff (961x) - 57761: 224, // trim (961x) - 57762: 225, // variance (961x) - 57763: 226, // varPop (961x) - 57764: 227, // varSamp (961x) - 40: 228, // '(' (809x) - 57481: 229, // on (795x) - 57348: 230, // stringLit (779x) - 57474: 231, // not (744x) - 57456: 232, // left (698x) - 57506: 233, // right (698x) - 57364: 234, // as (695x) - 43: 235, // '+' (652x) - 45: 236, // '-' (652x) - 57473: 237, // mod (650x) - 57396: 238, // defaultKwd (644x) - 57551: 239, // with (609x) - 57538: 240, // using (605x) - 57532: 241, // union (599x) - 57463: 242, // lock (587x) - 57478: 243, // null (586x) - 57417: 244, // forKwd (582x) - 57458: 245, // limit (570x) - 57363: 246, // and (569x) - 57485: 247, // order (568x) - 57484: 248, // or (554x) - 57548: 249, // where (554x) - 57354: 250, // andand (553x) - 57653: 251, // pipesAsOr (553x) - 57552: 252, // xor (553x) - 57420: 253, // from (545x) - 57816: 254, // eq (525x) - 57519: 255, // straightJoin (521x) - 57550: 256, // window (518x) - 57513: 257, // set (517x) - 57426: 258, // having (516x) - 57448: 259, // join (513x) - 57424: 260, // group (508x) - 57378: 261, // collate (506x) - 57383: 262, // cross (502x) - 57436: 263, // inner (502x) - 57555: 264, // natural (502x) - 125: 265, // '}' (501x) - 57811: 266, // intLit (498x) - 57503: 267, // replace (497x) - 57457: 268, // like (496x) - 42: 269, // '*' (489x) - 57495: 270, // rangeKwd (483x) - 57425: 271, // groups (482x) - 57509: 272, // rows (482x) - 57400: 273, // desc (479x) - 57365: 274, // asc (477x) - 57391: 275, // dayHour (476x) - 57392: 276, // dayMicrosecond (476x) - 57393: 277, // dayMinute (476x) - 57394: 278, // daySecond (476x) - 57428: 279, // hourMicrosecond (476x) - 57429: 280, // hourMinute (476x) - 57430: 281, // hourSecond (476x) - 57471: 282, // minuteMicrosecond (476x) - 57472: 283, // minuteSecond (476x) - 57511: 284, // secondMicrosecond (476x) - 57547: 285, // when (476x) - 57553: 286, // yearMonth (476x) - 57408: 287, // elseKwd (473x) - 57433: 288, // in (471x) - 57523: 289, // then (470x) - 46: 290, // '.' (467x) - 60: 291, // '<' (464x) - 62: 292, // '>' (464x) - 57817: 293, // ge (464x) - 57440: 294, // is (464x) - 57818: 295, // le (464x) - 57822: 296, // neq (464x) - 57823: 297, // neqSynonym (464x) - 57824: 298, // nulleq (464x) - 57368: 299, // binaryType (462x) - 57366: 300, // between (456x) - 37: 301, // '%' (455x) - 38: 302, // '&' (455x) - 47: 303, // '/' (455x) - 94: 304, // '^' (455x) - 124: 305, // '|' (455x) - 57404: 306, // div (455x) - 57821: 307, // lsh (455x) - 57826: 308, // rsh (455x) - 57500: 309, // regexpKwd (452x) - 57507: 310, // rlike (452x) - 57388: 311, // currentUser (441x) - 57349: 312, // singleAtIdentifier (441x) - 57431: 313, // ifKwd (437x) - 57441: 314, // insert (435x) - 123: 315, // '{' (433x) - 57810: 316, // decLit (433x) - 57809: 317, // floatLit (433x) - 57825: 318, // paramMarker (433x) - 57376: 319, // charType (430x) - 57438: 320, // interval (429x) - 57542: 321, // values (429x) - 57411: 322, // exists (428x) - 57381: 323, // convert (427x) - 57414: 324, // falseKwd (427x) - 57530: 325, // trueKwd (427x) - 57389: 326, // database (425x) - 57813: 327, // bitLit (424x) - 57797: 328, // builtinNow (424x) - 57387: 329, // currentTs (424x) - 57350: 330, // doubleAtIdentifier (424x) - 57812: 331, // hexLit (424x) - 57461: 332, // localTime (424x) - 57462: 333, // localTs (424x) - 57347: 334, // underscoreCS (424x) - 57508: 335, // row (423x) - 33: 336, // '!' (422x) - 126: 337, // '~' (422x) - 57783: 338, // builtinAddDate (422x) - 57784: 339, // builtinBitAnd (422x) - 57785: 340, // builtinBitOr (422x) - 57786: 341, // builtinBitXor (422x) - 57787: 342, // builtinCast (422x) - 57788: 343, // builtinCount (422x) - 57789: 344, // builtinCurDate (422x) - 57790: 345, // builtinCurTime (422x) - 57791: 346, // builtinDateAdd (422x) - 57792: 347, // builtinDateSub (422x) - 57793: 348, // builtinExtract (422x) - 57794: 349, // builtinGroupConcat (422x) - 57795: 350, // builtinMax (422x) - 57796: 351, // builtinMin (422x) - 57798: 352, // builtinPosition (422x) - 57803: 353, // builtinStddevPop (422x) - 57804: 354, // builtinStddevSamp (422x) - 57799: 355, // builtinSubDate (422x) - 57800: 356, // builtinSubstring (422x) - 57801: 357, // builtinSum (422x) - 57802: 358, // builtinSysDate (422x) - 57805: 359, // builtinTrim (422x) - 57806: 360, // builtinUser (422x) - 57807: 361, // builtinVarPop (422x) - 57808: 362, // builtinVarSamp (422x) - 57373: 363, // caseKwd (422x) - 57384: 364, // cumeDist (422x) - 57385: 365, // currentDate (422x) - 57386: 366, // currentTime (422x) - 57399: 367, // denseRank (422x) - 57415: 368, // firstValue (422x) - 57452: 369, // lag (422x) - 57453: 370, // lastValue (422x) - 57454: 371, // lead (422x) - 57827: 372, // not2 (422x) - 57476: 373, // nthValue (422x) - 57477: 374, // ntile (422x) - 57490: 375, // percentRank (422x) - 57496: 376, // rank (422x) - 57502: 377, // repeat (422x) - 57510: 378, // rowNumber (422x) - 57539: 379, // utcDate (422x) - 57541: 380, // utcTime (422x) - 57540: 381, // utcTimestamp (422x) - 57355: 382, // pipes (421x) - 57449: 383, // key (407x) - 57492: 384, // primary (396x) - 57531: 385, // unique (392x) - 57377: 386, // check (389x) - 57499: 387, // references (388x) - 57422: 388, // generated (384x) - 57986: 389, // Identifier (361x) - 58039: 390, // NotKeywordToken (361x) - 58183: 391, // TiDBKeyword (361x) - 58193: 392, // UnReservedKeyword (361x) - 57432: 393, // ignore (347x) - 57512: 394, // selectKwd (335x) - 57375: 395, // character (308x) - 57489: 396, // partition (284x) - 57488: 397, // packKeys (274x) - 57494: 398, // shardRowIDBits (274x) - 57819: 399, // jss (263x) - 57820: 400, // juss (263x) - 57434: 401, // index (260x) - 57527: 402, // to (256x) - 57459: 403, // lines (250x) - 57371: 404, // by (247x) - 57418: 405, // force (244x) - 57516: 406, // sql (244x) - 57537: 407, // use (244x) - 57372: 408, // cascade (242x) - 57504: 409, // restrict (242x) - 64: 410, // '@' (241x) - 57406: 411, // drop (241x) - 57497: 412, // read (238x) - 57361: 413, // alter (237x) - 57362: 414, // analyze (237x) - 57419: 415, // foreign (235x) - 57421: 416, // fulltext (234x) - 57501: 417, // rename (234x) - 57395: 418, // decimalType (233x) - 57437: 419, // integerType (233x) - 57442: 420, // intType (233x) - 57544: 421, // varcharType (233x) - 57359: 422, // add (232x) - 57374: 423, // change (232x) - 57549: 424, // write (232x) - 57367: 425, // bigIntType (231x) - 57369: 426, // blobType (231x) - 57405: 427, // doubleType (231x) - 57416: 428, // floatType (231x) - 57443: 429, // int1Type (231x) - 57444: 430, // int2Type (231x) - 57445: 431, // int3Type (231x) - 57446: 432, // int4Type (231x) - 57447: 433, // int8Type (231x) - 57543: 434, // long (231x) - 57464: 435, // longblobType (231x) - 57465: 436, // longtextType (231x) - 57468: 437, // mediumblobType (231x) - 57469: 438, // mediumIntType (231x) - 57470: 439, // mediumtextType (231x) - 57479: 440, // numericType (231x) - 57480: 441, // nvarcharType (231x) - 57498: 442, // realType (231x) - 57515: 443, // smallIntType (231x) - 57524: 444, // tinyblobType (231x) - 57525: 445, // tinyIntType (231x) - 57526: 446, // tinytextType (231x) - 57545: 447, // varbinaryType (231x) - 58155: 448, // SubSelect (145x) - 58203: 449, // UserVariable (142x) - 58025: 450, // Literal (141x) - 58143: 451, // SimpleIdent (141x) - 58150: 452, // StringLiteral (141x) - 57967: 453, // FunctionCallGeneric (139x) - 57968: 454, // FunctionCallKeyword (139x) - 57969: 455, // FunctionCallNonKeyword (139x) - 57970: 456, // FunctionNameConflict (139x) - 57971: 457, // FunctionNameDateArith (139x) - 57972: 458, // FunctionNameDateArithMultiForms (139x) - 57973: 459, // FunctionNameDatetimePrecision (139x) - 57974: 460, // FunctionNameOptionalBraces (139x) - 58142: 461, // SimpleExpr (139x) - 58156: 462, // SumExpr (139x) - 58158: 463, // SystemVariable (139x) - 58212: 464, // Variable (139x) - 58234: 465, // WindowFuncCall (139x) - 57863: 466, // BitExpr (127x) - 58089: 467, // PredicateExpr (111x) - 57866: 468, // BoolPri (108x) - 57943: 469, // Expression (108x) - 58242: 470, // logAnd (86x) - 58243: 471, // logOr (86x) - 58167: 472, // TableName (55x) - 58151: 473, // StringName (51x) - 58036: 474, // NUM (45x) - 57534: 475, // unsigned (44x) - 57554: 476, // zerofill (42x) - 57487: 477, // over (38x) - 57360: 478, // all (36x) - 57879: 479, // ColumnName (35x) - 58239: 480, // WindowingClause (28x) - 58118: 481, // SelectStmt (27x) - 58119: 482, // SelectStmtBasic (27x) - 58122: 483, // SelectStmtFromDualTable (27x) - 58123: 484, // SelectStmtFromTable (27x) - 57935: 485, // EqOpt (24x) - 57520: 486, // tableKwd (22x) - 57950: 487, // FieldLen (21x) - 58196: 488, // UnionSelect (19x) - 58017: 489, // LengthNum (18x) - 58194: 490, // UnionClauseList (18x) - 58197: 491, // UnionStmt (18x) - 58068: 492, // OptWindowingClause (17x) - 57517: 493, // sqlCalcFoundRows (17x) - 57535: 494, // update (17x) - 57397: 495, // delayed (16x) - 57427: 496, // highPriority (16x) - 57466: 497, // lowPriority (16x) - 57872: 498, // CharsetKw (15x) - 57402: 499, // distinct (15x) - 57403: 500, // distinctRow (15x) - 58205: 501, // Username (15x) - 57398: 502, // deleteKwd (14x) - 58056: 503, // OptFieldLen (14x) - 57727: 504, // release (14x) - 57944: 505, // ExpressionList (13x) - 58011: 506, // JoinTable (13x) - 58164: 507, // TableFactor (13x) - 58176: 508, // TableRef (13x) - 57920: 509, // DistinctKwd (12x) - 57921: 510, // DistinctOpt (11x) - 57915: 511, // DefaultFalseDistinctOpt (10x) - 57963: 512, // FromOrIn (10x) - 57439: 513, // into (10x) - 58072: 514, // OrderBy (10x) - 58073: 515, // OrderByOptional (10x) - 58111: 516, // Rolename (10x) - 58108: 517, // RoleNameString (10x) - 58168: 518, // TableNameList (10x) - 57868: 519, // BuggyDefaultFalseDistinctOpt (9x) - 58003: 520, // IndexType (9x) - 58012: 521, // JoinType (9x) - 57873: 522, // CharsetName (8x) - 57880: 523, // ColumnNameList (8x) - 57906: 524, // CrossOpt (8x) - 57916: 525, // DefaultKwdOpt (8x) - 57410: 526, // escaped (8x) - 57353: 527, // hintEnd (8x) - 57992: 528, // IndexColName (8x) - 58013: 529, // KeyOrIndex (8x) - 58054: 530, // OptCollate (8x) - 57875: 531, // ColumnDef (7x) - 57919: 532, // DeleteFromStmt (7x) - 57937: 533, // EscapedTableRef (7x) - 57993: 534, // IndexColNameList (7x) - 58005: 535, // InsertIntoStmt (7x) - 58104: 536, // ReplaceIntoStmt (7x) - 58112: 537, // RolenameList (7x) - 58125: 538, // SelectStmtLimit (7x) - 58184: 539, // TimeUnit (7x) - 58199: 540, // UpdateStmt (7x) - 58224: 541, // WhereClause (7x) - 58225: 542, // WhereClauseOptional (7x) - 57382: 543, // create (6x) - 57409: 544, // enclosed (6x) - 57942: 545, // ExprOrDefault (6x) - 57423: 546, // grant (6x) - 58033: 547, // MaxNumBuckets (6x) - 58044: 548, // NumLiteral (6x) - 58052: 549, // OptBinary (6x) - 58114: 550, // RowFormat (6x) - 58117: 551, // SelectLockOpt (6x) - 57514: 552, // show (6x) - 58135: 553, // ShowDatabaseNameOpt (6x) - 58173: 554, // TableOption (6x) - 58177: 555, // TableRefs (6x) - 57522: 556, // terminated (6x) - 57869: 557, // ByItem (5x) - 57379: 558, // column (5x) - 57877: 559, // ColumnKeywordOpt (5x) - 57907: 560, // DBName (5x) - 57945: 561, // ExpressionListOpt (5x) - 57952: 562, // FieldOpt (5x) - 57953: 563, // FieldOpts (5x) - 57988: 564, // IfNotExists (5x) - 57999: 565, // IndexName (5x) - 58001: 566, // IndexOption (5x) - 58002: 567, // IndexOptionList (5x) - 57483: 568, // optionally (5x) - 58063: 569, // OptNullTreatment (5x) - 58093: 570, // PriorityOpt (5x) - 58105: 571, // RestrictOrCascadeOpt (5x) - 58137: 572, // ShowLikeOrWhereOpt (5x) - 58206: 573, // UsernameList (5x) - 58201: 574, // UserSpec (5x) - 57855: 575, // Assignment (4x) - 57859: 576, // AuthString (4x) - 57870: 577, // ByList (4x) - 57726: 578, // chain (4x) - 57990: 579, // IgnoreOptional (4x) - 58000: 580, // IndexNameList (4x) - 58004: 581, // IndexTypeOpt (4x) - 58022: 582, // LimitOption (4x) - 57482: 583, // option (4x) - 57486: 584, // outer (4x) - 58081: 585, // PartitionDefinitionListOpt (4x) - 58084: 586, // PartitionNumOpt (4x) - 58131: 587, // SetExpr (4x) - 58159: 588, // TableAsName (4x) - 58188: 589, // TransactionChar (4x) - 58202: 590, // UserSpecList (4x) - 58235: 591, // WindowName (4x) - 57815: 592, // assignmentEq (3x) - 57856: 593, // AssignmentList (3x) - 57886: 594, // ColumnPosition (3x) - 57893: 595, // Constraint (3x) - 57380: 596, // constraint (3x) - 57895: 597, // ConstraintKeywordOpt (3x) - 57941: 598, // ExplainableStmt (3x) - 57958: 599, // FloatOpt (3x) - 57977: 600, // GlobalScope (3x) - 57352: 601, // hintBegin (3x) - 57985: 602, // HintTableList (3x) - 57987: 603, // IfExists (3x) - 57994: 604, // IndexHint (3x) - 57998: 605, // IndexHintType (3x) - 57435: 606, // infile (3x) - 57450: 607, // keys (3x) - 58029: 608, // LockClause (3x) - 57467: 609, // maxValue (3x) - 58053: 610, // OptCharset (3x) - 58082: 611, // PartitionNameList (3x) - 58088: 612, // Precision (3x) - 58094: 613, // PrivElem (3x) - 58097: 614, // PrivType (3x) - 58099: 615, // ReferDef (3x) - 58115: 616, // RowValue (3x) - 58172: 617, // TableOptimizerHints (3x) - 58174: 618, // TableOptionList (3x) - 58189: 619, // TransactionChars (3x) - 57529: 620, // trigger (3x) - 57536: 621, // usage (3x) - 58207: 622, // ValueSym (3x) - 58232: 623, // WindowFrameStart (3x) - 57845: 624, // AdminStmt (2x) - 57847: 625, // AlterTableOptionListOpt (2x) - 57848: 626, // AlterTableSpec (2x) - 57850: 627, // AlterTableStmt (2x) - 57851: 628, // AlterUserStmt (2x) - 57852: 629, // AnalyzeTableStmt (2x) - 57860: 630, // BeginTransactionStmt (2x) - 57862: 631, // BinlogStmt (2x) - 57871: 632, // CastType (2x) - 57881: 633, // ColumnNameListOpt (2x) - 57883: 634, // ColumnOption (2x) - 57887: 635, // ColumnSetValue (2x) - 57890: 636, // CommitOpt (2x) - 57891: 637, // CommitStmt (2x) - 57896: 638, // CreateBindingStmt (2x) - 57897: 639, // CreateDatabaseStmt (2x) - 57898: 640, // CreateIndexStmt (2x) - 57900: 641, // CreateRoleStmt (2x) - 57903: 642, // CreateTableStmt (2x) - 57904: 643, // CreateUserStmt (2x) - 57905: 644, // CreateViewStmt (2x) - 57908: 645, // DatabaseOption (2x) - 57390: 646, // databases (2x) - 57911: 647, // DatabaseSym (2x) - 57913: 648, // DeallocateStmt (2x) - 57914: 649, // DeallocateSym (2x) - 57401: 650, // describe (2x) - 57922: 651, // DoStmt (2x) - 57923: 652, // DropBindingStmt (2x) - 57924: 653, // DropDatabaseStmt (2x) - 57925: 654, // DropIndexStmt (2x) - 57926: 655, // DropRoleStmt (2x) - 57927: 656, // DropStatsStmt (2x) - 57928: 657, // DropTableStmt (2x) - 57929: 658, // DropUserStmt (2x) - 57930: 659, // DropViewStmt (2x) - 57933: 660, // EmptyStmt (2x) - 57938: 661, // ExecuteStmt (2x) - 57412: 662, // explain (2x) - 57939: 663, // ExplainStmt (2x) - 57940: 664, // ExplainSym (2x) - 57947: 665, // Field (2x) - 57948: 666, // FieldAsName (2x) - 57949: 667, // FieldAsNameOpt (2x) - 57961: 668, // FlushStmt (2x) - 57962: 669, // FromDual (2x) - 57965: 670, // FuncDatetimePrecList (2x) - 57966: 671, // FuncDatetimePrecListOpt (2x) - 57975: 672, // GeneratedAlways (2x) - 57978: 673, // GrantRoleStmt (2x) - 57979: 674, // GrantStmt (2x) - 57981: 675, // HandleRange (2x) - 57983: 676, // HashString (2x) - 57995: 677, // IndexHintList (2x) - 57996: 678, // IndexHintListOpt (2x) - 58006: 679, // InsertValues (2x) - 58008: 680, // IntoOpt (2x) - 58014: 681, // KeyOrIndexOpt (2x) - 57451: 682, // kill (2x) - 58015: 683, // KillOrKillTiDB (2x) - 58016: 684, // KillStmt (2x) - 58021: 685, // LimitClause (2x) - 57460: 686, // load (2x) - 58026: 687, // LoadDataStmt (2x) - 58027: 688, // LoadStatsStmt (2x) - 58031: 689, // LockTablesStmt (2x) - 58034: 690, // MaxValueOrExpression (2x) - 58040: 691, // NowSym (2x) - 58041: 692, // NowSymFunc (2x) - 58042: 693, // NowSymOptionFraction (2x) - 58043: 694, // NumList (2x) - 58047: 695, // ObjectType (2x) - 58046: 696, // ODBCDateTimeType (2x) - 57356: 697, // odbcDateType (2x) - 57358: 698, // odbcTimestampType (2x) - 57357: 699, // odbcTimeType (2x) - 58060: 700, // OptInteger (2x) - 58069: 701, // OptionalBraces (2x) - 58062: 702, // OptLeadLagInfo (2x) - 58061: 703, // OptLLDefault (2x) - 58071: 704, // Order (2x) - 58074: 705, // OuterOpt (2x) - 58075: 706, // PartDefOption (2x) - 58079: 707, // PartitionDefinition (2x) - 58086: 708, // PasswordOpt (2x) - 58091: 709, // PreparedStmt (2x) - 58092: 710, // PrimaryOpt (2x) - 58095: 711, // PrivElemList (2x) - 58096: 712, // PrivLevel (2x) - 58100: 713, // ReferOpt (2x) - 58102: 714, // RegexpSym (2x) - 58103: 715, // RenameTableStmt (2x) - 57505: 716, // revoke (2x) - 58106: 717, // RevokeRoleStmt (2x) - 58107: 718, // RevokeStmt (2x) - 58109: 719, // RoleSpec (2x) - 58113: 720, // RollbackStmt (2x) - 58116: 721, // SavepointStmt (2x) - 58129: 722, // SetDefaultRoleOpt (2x) - 58130: 723, // SetDefaultRoleStmt (2x) - 58133: 724, // SetRoleStmt (2x) - 58134: 725, // SetStmt (2x) - 58138: 726, // ShowStmt (2x) - 58139: 727, // ShowTableAliasOpt (2x) - 58141: 728, // SignedLiteral (2x) - 58146: 729, // Statement (2x) - 58148: 730, // StatsPersistentVal (2x) - 58149: 731, // StringList (2x) - 58153: 732, // SubPartitionNumOpt (2x) - 58157: 733, // Symbol (2x) - 58161: 734, // TableElement (2x) - 58165: 735, // TableLock (2x) - 58171: 736, // TableOptimizerHintOpt (2x) - 58175: 737, // TableOrTables (2x) - 58181: 738, // TablesTerminalSym (2x) - 58179: 739, // TableToTable (2x) - 58185: 740, // TimestampUnit (2x) - 58187: 741, // TraceableStmt (2x) - 58186: 742, // TraceStmt (2x) - 58191: 743, // TruncateTableStmt (2x) - 57533: 744, // unlock (2x) - 58198: 745, // UnlockTablesStmt (2x) - 58200: 746, // UseStmt (2x) - 58209: 747, // ValuesList (2x) - 58213: 748, // VariableAssignment (2x) - 58222: 749, // WhenClause (2x) - 58227: 750, // WindowDefinition (2x) - 58230: 751, // WindowFrameBound (2x) - 58237: 752, // WindowSpec (2x) - 57725: 753, // work (2x) - 57844: 754, // AdminShowSlow (1x) - 57846: 755, // AlterAlgorithm (1x) - 57849: 756, // AlterTableSpecList (1x) - 57853: 757, // AnyOrAll (1x) - 57854: 758, // AsOpt (1x) - 57858: 759, // AuthOption (1x) - 57861: 760, // BetweenOrNotOp (1x) - 57864: 761, // BitValueType (1x) - 57865: 762, // BlobType (1x) - 57867: 763, // BooleanType (1x) - 57370: 764, // both (1x) - 57874: 765, // CharsetOpt (1x) - 57876: 766, // ColumnDefList (1x) - 57878: 767, // ColumnList (1x) - 57882: 768, // ColumnNameListOptWithBrackets (1x) - 57884: 769, // ColumnOptionList (1x) - 57885: 770, // ColumnOptionListOpt (1x) - 57888: 771, // ColumnSetValueList (1x) - 57892: 772, // CompareOp (1x) - 57894: 773, // ConstraintElem (1x) - 57899: 774, // CreateIndexStmtUnique (1x) - 57901: 775, // CreateTableOptionListOpt (1x) - 57902: 776, // CreateTableSelectOpt (1x) - 57909: 777, // DatabaseOptionList (1x) - 57910: 778, // DatabaseOptionListOpt (1x) - 57912: 779, // DateAndTimeType (1x) - 57917: 780, // DefaultTrueDistinctOpt (1x) - 57918: 781, // DefaultValueExpr (1x) - 57407: 782, // dual (1x) - 57931: 783, // DuplicateOpt (1x) - 57932: 784, // ElseOpt (1x) - 57934: 785, // Enclosed (1x) - 57345: 786, // error (1x) - 57936: 787, // Escaped (1x) - 57413: 788, // except (1x) - 57946: 789, // ExpressionOpt (1x) - 57951: 790, // FieldList (1x) - 57954: 791, // Fields (1x) - 57955: 792, // FieldsOrColumns (1x) - 57956: 793, // FieldsTerminated (1x) - 57957: 794, // FixedPointType (1x) - 57959: 795, // FloatingPointType (1x) - 57960: 796, // FlushOption (1x) - 57964: 797, // FuncDatetimePrec (1x) - 57976: 798, // GetFormatSelector (1x) - 57980: 799, // GroupByClause (1x) - 57982: 800, // HandleRangeList (1x) - 57984: 801, // HavingClause (1x) - 57989: 802, // IgnoreLines (1x) - 57997: 803, // IndexHintScope (1x) - 57991: 804, // InOrNotOp (1x) - 58007: 805, // IntegerType (1x) - 58010: 806, // IsolationLevel (1x) - 58009: 807, // IsOrNotOp (1x) - 57455: 808, // leading (1x) - 58018: 809, // LikeEscapeOpt (1x) - 58019: 810, // LikeOrNotOp (1x) - 58020: 811, // LikeTableWithOrWithoutParen (1x) - 58023: 812, // Lines (1x) - 58024: 813, // LinesTerminated (1x) - 58028: 814, // LocalOpt (1x) - 58030: 815, // LockClauseOpt (1x) - 58032: 816, // LockType (1x) - 58035: 817, // MaxValueOrExpressionList (1x) - 58037: 818, // NationalOpt (1x) - 57475: 819, // noWriteToBinLog (1x) - 58038: 820, // NoWriteToBinLogAliasOpt (1x) - 58045: 821, // NumericType (1x) - 58048: 822, // OnDeleteOpt (1x) - 58049: 823, // OnDuplicateKeyUpdate (1x) - 58050: 824, // OnUpdateOpt (1x) - 58051: 825, // OptBinMod (1x) - 58055: 826, // OptExistingWindowName (1x) - 58057: 827, // OptFromFirstLast (1x) - 58058: 828, // OptFull (1x) - 58059: 829, // OptGConcatSeparator (1x) - 58064: 830, // OptPartitionClause (1x) - 58065: 831, // OptTable (1x) - 58066: 832, // OptWindowFrameClause (1x) - 58067: 833, // OptWindowOrderByClause (1x) - 58070: 834, // OrReplace (1x) - 58076: 835, // PartDefOptionList (1x) - 58077: 836, // PartDefOptionsOpt (1x) - 58078: 837, // PartDefValuesOpt (1x) - 58080: 838, // PartitionDefinitionList (1x) - 58083: 839, // PartitionNameListOpt (1x) - 58085: 840, // PartitionOpt (1x) - 58087: 841, // PluginNameList (1x) - 57491: 842, // precisionType (1x) - 58090: 843, // PrepareSQL (1x) - 57493: 844, // procedure (1x) - 58098: 845, // QuickOptional (1x) - 58101: 846, // RegexpOrNotOp (1x) - 58110: 847, // RoleSpecList (1x) - 58120: 848, // SelectStmtCalcFoundRows (1x) - 58121: 849, // SelectStmtFieldList (1x) - 58124: 850, // SelectStmtGroup (1x) - 58126: 851, // SelectStmtOpts (1x) - 58127: 852, // SelectStmtSQLCache (1x) - 58128: 853, // SelectStmtStraightJoin (1x) - 58132: 854, // SetRoleOpt (1x) - 58136: 855, // ShowIndexKwd (1x) - 58140: 856, // ShowTargetFilterable (1x) - 58144: 857, // Start (1x) - 58145: 858, // Starting (1x) - 57518: 859, // starting (1x) - 58147: 860, // StatementList (1x) - 57521: 861, // stored (1x) - 58152: 862, // StringType (1x) - 58154: 863, // SubPartitionOpt (1x) - 58160: 864, // TableAsNameOpt (1x) - 58162: 865, // TableElementList (1x) - 58163: 866, // TableElementListOpt (1x) - 58166: 867, // TableLockList (1x) - 58169: 868, // TableNameListOpt (1x) - 58170: 869, // TableOptimizerHintList (1x) - 58178: 870, // TableRefsClause (1x) - 58180: 871, // TableToTableList (1x) - 58182: 872, // TextType (1x) - 57528: 873, // trailing (1x) - 58190: 874, // TrimDirection (1x) - 58192: 875, // Type (1x) - 58195: 876, // UnionOpt (1x) - 58204: 877, // UserVariableList (1x) - 58208: 878, // Values (1x) - 58210: 879, // ValuesOpt (1x) - 58211: 880, // Varchar (1x) - 58214: 881, // VariableAssignmentList (1x) - 58215: 882, // ViewAlgorithm (1x) - 58216: 883, // ViewCheckOption (1x) - 58217: 884, // ViewDefiner (1x) - 58218: 885, // ViewFieldList (1x) - 58219: 886, // ViewName (1x) - 58220: 887, // ViewSQLSecurity (1x) - 57546: 888, // virtual (1x) - 58221: 889, // VirtualOrStored (1x) - 58223: 890, // WhenClauseList (1x) - 58226: 891, // WindowClauseOptional (1x) - 58228: 892, // WindowDefinitionList (1x) - 58229: 893, // WindowFrameBetween (1x) - 58231: 894, // WindowFrameExtent (1x) - 58233: 895, // WindowFrameUnits (1x) - 58236: 896, // WindowNameOrSpec (1x) - 58238: 897, // WindowSpecDetails (1x) - 58240: 898, // WithGrantOptionOpt (1x) - 58241: 899, // WithReadLockOpt (1x) - 57843: 900, // $default (0x) - 57814: 901, // andnot (0x) - 57857: 902, // AssignmentListOpt (0x) - 57889: 903, // CommaOpt (0x) - 57835: 904, // createTableSelect (0x) - 57828: 905, // empty (0x) - 57842: 906, // higherThanComma (0x) - 57833: 907, // insertValues (0x) - 57351: 908, // invalid (0x) - 57841: 909, // lowerThanComma (0x) - 57834: 910, // lowerThanCreateTableSelect (0x) - 57839: 911, // lowerThanEq (0x) - 57832: 912, // lowerThanInsertValues (0x) - 57829: 913, // lowerThanIntervalKeyword (0x) - 57836: 914, // lowerThanKey (0x) - 57838: 915, // lowerThanOn (0x) - 57831: 916, // lowerThanSetKeyword (0x) - 57830: 917, // lowerThanStringLitToken (0x) - 57840: 918, // neg (0x) - 57837: 919, // tableRefPriority (0x) + 57344: 0, // $end (1317x) + 59: 1, // ';' (1316x) + 57580: 2, // comment (1176x) + 57562: 3, // autoIncrement (1150x) + 57611: 4, // first (1115x) + 57557: 5, // after (1114x) + 44: 6, // ',' (1096x) + 57573: 7, // charsetKwd (1039x) + 57626: 8, // keyBlockSize (1025x) + 57602: 9, // engine (1019x) + 57586: 10, // connection (1012x) + 57652: 11, // password (1012x) + 57688: 12, // signed (1011x) + 57574: 13, // checksum (1010x) + 57563: 14, // avgRowLength (1009x) + 57585: 15, // compression (1009x) + 57595: 16, // delayKeyWrite (1009x) + 57638: 17, // maxRows (1009x) + 57644: 18, // minRows (1009x) + 57678: 19, // rowFormat (1009x) + 57696: 20, // statsPersistent (1009x) + 41: 21, // ')' (998x) + 57722: 22, // view (988x) + 57697: 23, // status (981x) + 57647: 24, // no (979x) + 57682: 25, // separator (979x) + 57703: 26, // tables (979x) + 57656: 27, // preceding (978x) + 57632: 28, // master (977x) + 57704: 29, // tablespace (977x) + 57728: 30, // yearType (977x) + 57579: 31, // columns (976x) + 57589: 32, // day (976x) + 57620: 33, // hour (976x) + 57751: 34, // maxExecutionTime (976x) + 57633: 35, // microsecond (976x) + 57634: 36, // minute (976x) + 57637: 37, // month (976x) + 57662: 38, // quarter (976x) + 57680: 39, // second (976x) + 57783: 40, // tidbHJ (976x) + 57785: 41, // tidbINLJ (976x) + 57784: 42, // tidbSMJ (976x) + 57727: 43, // week (976x) + 57594: 44, // definer (975x) + 57610: 45, // fields (975x) + 57621: 46, // identified (975x) + 57670: 47, // respect (975x) + 57614: 48, // following (974x) + 57723: 49, // binding (973x) + 57588: 50, // current (973x) + 57601: 51, // end (973x) + 57658: 52, // privileges (973x) + 57715: 53, // unbounded (973x) + 57559: 54, // algorithm (972x) + 57627: 55, // local (972x) + 57650: 56, // offset (972x) + 57653: 57, // partitions (972x) + 57657: 58, // prepare (972x) + 57673: 59, // role (972x) + 57782: 60, // tidb (972x) + 57718: 61, // user (972x) + 57724: 62, // bindings (971x) + 57592: 63, // datetimeType (971x) + 57591: 64, // dateType (971x) + 57622: 65, // isolation (971x) + 57698: 66, // subpartition (971x) + 57709: 67, // timeType (971x) + 57714: 68, // truncate (971x) + 57721: 69, // variables (971x) + 57609: 70, // execute (970x) + 57702: 71, // global (970x) + 57619: 72, // hash (970x) + 57625: 73, // jsonType (970x) + 57745: 74, // next_row_id (970x) + 57660: 75, // processlist (970x) + 57663: 76, // query (970x) + 57679: 77, // savepoint (970x) + 57684: 78, // session (970x) + 57717: 79, // unknown (970x) + 57720: 80, // value (970x) + 57769: 81, // admin (969x) + 57565: 82, // begin (969x) + 57566: 83, // binlog (969x) + 57770: 84, // buckets (969x) + 57576: 85, // client (969x) + 57577: 86, // coalesce (969x) + 57581: 87, // commit (969x) + 57583: 88, // compact (969x) + 57584: 89, // compressed (969x) + 57737: 90, // copyKwd (969x) + 57593: 91, // deallocate (969x) + 57596: 92, // disable (969x) + 57597: 93, // do (969x) + 57599: 94, // dynamic (969x) + 57600: 95, // enable (969x) + 57612: 96, // fixed (969x) + 57613: 97, // flush (969x) + 57746: 98, // inplace (969x) + 57747: 99, // instant (969x) + 57775: 100, // job (969x) + 57774: 101, // jobs (969x) + 57628: 102, // locked (969x) + 57636: 103, // modify (969x) + 57687: 104, // nowait (969x) + 57649: 105, // nulls (969x) + 57655: 106, // plugins (969x) + 57667: 107, // redundant (969x) + 57674: 108, // rollback (969x) + 57676: 109, // routine (969x) + 57685: 110, // share (969x) + 57689: 111, // skip (969x) + 57690: 112, // slave (969x) + 57695: 113, // start (969x) + 57777: 114, // stats (969x) + 57699: 115, // subpartitions (969x) + 57710: 116, // timestampType (969x) + 57711: 117, // trace (969x) + 57556: 118, // action (968x) + 57558: 119, // always (968x) + 57567: 120, // bitType (968x) + 57568: 121, // booleanType (968x) + 57569: 122, // boolType (968x) + 57570: 123, // btree (968x) + 57771: 124, // cancel (968x) + 57572: 125, // cascaded (968x) + 57575: 126, // cleanup (968x) + 57578: 127, // collation (968x) + 57582: 128, // committed (968x) + 57587: 129, // consistent (968x) + 57590: 130, // data (968x) + 57772: 131, // ddl (968x) + 57773: 132, // drainer (968x) + 57598: 133, // duplicate (968x) + 57603: 134, // engines (968x) + 57604: 135, // enum (968x) + 57605: 136, // event (968x) + 57606: 137, // events (968x) + 57608: 138, // exclusive (968x) + 57615: 139, // format (968x) + 57616: 140, // full (968x) + 57617: 141, // function (968x) + 57618: 142, // grants (968x) + 57726: 143, // identSQLErrors (968x) + 57623: 144, // indexes (968x) + 57748: 145, // internal (968x) + 57624: 146, // invoker (968x) + 57629: 147, // last (968x) + 57630: 148, // less (968x) + 57631: 149, // level (968x) + 57639: 150, // maxConnectionsPerHour (968x) + 57640: 151, // maxQueriesPerHour (968x) + 57641: 152, // maxUpdatesPerHour (968x) + 57642: 153, // maxUserConnections (968x) + 57643: 154, // merge (968x) + 57635: 155, // mode (968x) + 57646: 156, // national (968x) + 57648: 157, // none (968x) + 57651: 158, // only (968x) + 57659: 159, // process (968x) + 57661: 160, // profiles (968x) + 57776: 161, // pump (968x) + 57664: 162, // queries (968x) + 57754: 163, // recent (968x) + 57666: 164, // recover (968x) + 57668: 165, // reload (968x) + 57669: 166, // repeatable (968x) + 57671: 167, // replication (968x) + 57786: 168, // restore (968x) + 57675: 169, // rollup (968x) + 57681: 170, // security (968x) + 57683: 171, // serializable (968x) + 57686: 172, // shared (968x) + 57692: 173, // snapshot (968x) + 57780: 174, // statsBuckets (968x) + 57781: 175, // statsHealthy (968x) + 57779: 176, // statsHistograms (968x) + 57778: 177, // statsMeta (968x) + 57700: 178, // super (968x) + 57705: 179, // temporary (968x) + 57706: 180, // temptable (968x) + 57707: 181, // textType (968x) + 57708: 182, // than (968x) + 57764: 183, // top (968x) + 57712: 184, // transaction (968x) + 57713: 185, // triggers (968x) + 57716: 186, // uncommitted (968x) + 57719: 187, // undefined (968x) + 57725: 188, // warnings (968x) + 57732: 189, // addDate (967x) + 57560: 190, // any (967x) + 57561: 191, // ascii (967x) + 57564: 192, // avg (967x) + 57733: 193, // bitAnd (967x) + 57734: 194, // bitOr (967x) + 57735: 195, // bitXor (967x) + 57571: 196, // byteType (967x) + 57736: 197, // cast (967x) + 57738: 198, // count (967x) + 57739: 199, // curTime (967x) + 57740: 200, // dateAdd (967x) + 57741: 201, // dateSub (967x) + 57607: 202, // escape (967x) + 57742: 203, // extract (967x) + 57743: 204, // getFormat (967x) + 57744: 205, // groupConcat (967x) + 57346: 206, // identifier (967x) + 57750: 207, // max (967x) + 57749: 208, // min (967x) + 57645: 209, // names (967x) + 57752: 210, // now (967x) + 57753: 211, // position (967x) + 57665: 212, // quick (967x) + 57672: 213, // reverse (967x) + 57677: 214, // rowCount (967x) + 57691: 215, // slow (967x) + 57701: 216, // some (967x) + 57693: 217, // sqlCache (967x) + 57694: 218, // sqlNoCache (967x) + 57755: 219, // std (967x) + 57756: 220, // stddev (967x) + 57757: 221, // stddevPop (967x) + 57758: 222, // stddevSamp (967x) + 57759: 223, // subDate (967x) + 57761: 224, // substring (967x) + 57760: 225, // sum (967x) + 57762: 226, // timestampAdd (967x) + 57763: 227, // timestampDiff (967x) + 57765: 228, // trim (967x) + 57766: 229, // variance (967x) + 57767: 230, // varPop (967x) + 57768: 231, // varSamp (967x) + 40: 232, // '(' (814x) + 57481: 233, // on (806x) + 57348: 234, // stringLit (785x) + 57474: 235, // not (750x) + 57456: 236, // left (703x) + 57506: 237, // right (703x) + 57364: 238, // as (700x) + 43: 239, // '+' (659x) + 45: 240, // '-' (659x) + 57473: 241, // mod (657x) + 57396: 242, // defaultKwd (649x) + 57551: 243, // with (620x) + 57538: 244, // using (616x) + 57532: 245, // union (607x) + 57463: 246, // lock (593x) + 57478: 247, // null (591x) + 57417: 248, // forKwd (588x) + 57458: 249, // limit (576x) + 57363: 250, // and (575x) + 57485: 251, // order (574x) + 57484: 252, // or (560x) + 57354: 253, // andand (559x) + 57654: 254, // pipesAsOr (559x) + 57552: 255, // xor (559x) + 57548: 256, // where (558x) + 57420: 257, // from (550x) + 57820: 258, // eq (531x) + 57519: 259, // straightJoin (525x) + 57550: 260, // window (524x) + 57426: 261, // having (522x) + 57513: 262, // set (521x) + 57448: 263, // join (517x) + 57378: 264, // collate (512x) + 57424: 265, // group (512x) + 57383: 266, // cross (506x) + 57436: 267, // inner (506x) + 57555: 268, // natural (506x) + 125: 269, // '}' (505x) + 57815: 270, // intLit (503x) + 57457: 271, // like (502x) + 57503: 272, // replace (502x) + 42: 273, // '*' (495x) + 57495: 274, // rangeKwd (488x) + 57425: 275, // groups (487x) + 57509: 276, // rows (487x) + 57400: 277, // desc (484x) + 57365: 278, // asc (482x) + 57391: 279, // dayHour (481x) + 57392: 280, // dayMicrosecond (481x) + 57393: 281, // dayMinute (481x) + 57394: 282, // daySecond (481x) + 57428: 283, // hourMicrosecond (481x) + 57429: 284, // hourMinute (481x) + 57430: 285, // hourSecond (481x) + 57471: 286, // minuteMicrosecond (481x) + 57472: 287, // minuteSecond (481x) + 57511: 288, // secondMicrosecond (481x) + 57547: 289, // when (481x) + 57553: 290, // yearMonth (481x) + 57408: 291, // elseKwd (478x) + 57433: 292, // in (477x) + 57523: 293, // then (475x) + 46: 294, // '.' (472x) + 60: 295, // '<' (470x) + 62: 296, // '>' (470x) + 57821: 297, // ge (470x) + 57440: 298, // is (470x) + 57822: 299, // le (470x) + 57826: 300, // neq (470x) + 57827: 301, // neqSynonym (470x) + 57828: 302, // nulleq (470x) + 57368: 303, // binaryType (467x) + 57366: 304, // between (462x) + 37: 305, // '%' (461x) + 38: 306, // '&' (461x) + 47: 307, // '/' (461x) + 94: 308, // '^' (461x) + 124: 309, // '|' (461x) + 57404: 310, // div (461x) + 57825: 311, // lsh (461x) + 57830: 312, // rsh (461x) + 57500: 313, // regexpKwd (458x) + 57507: 314, // rlike (458x) + 57388: 315, // currentUser (446x) + 57349: 316, // singleAtIdentifier (446x) + 57431: 317, // ifKwd (442x) + 57441: 318, // insert (440x) + 123: 319, // '{' (438x) + 57814: 320, // decLit (438x) + 57813: 321, // floatLit (438x) + 57829: 322, // paramMarker (438x) + 57376: 323, // charType (435x) + 57438: 324, // interval (434x) + 57542: 325, // values (434x) + 57411: 326, // exists (433x) + 57381: 327, // convert (432x) + 57414: 328, // falseKwd (432x) + 57530: 329, // trueKwd (432x) + 57389: 330, // database (430x) + 57817: 331, // bitLit (429x) + 57801: 332, // builtinNow (429x) + 57387: 333, // currentTs (429x) + 57350: 334, // doubleAtIdentifier (429x) + 57816: 335, // hexLit (429x) + 57461: 336, // localTime (429x) + 57462: 337, // localTs (429x) + 57347: 338, // underscoreCS (429x) + 57508: 339, // row (428x) + 33: 340, // '!' (427x) + 126: 341, // '~' (427x) + 57787: 342, // builtinAddDate (427x) + 57788: 343, // builtinBitAnd (427x) + 57789: 344, // builtinBitOr (427x) + 57790: 345, // builtinBitXor (427x) + 57791: 346, // builtinCast (427x) + 57792: 347, // builtinCount (427x) + 57793: 348, // builtinCurDate (427x) + 57794: 349, // builtinCurTime (427x) + 57795: 350, // builtinDateAdd (427x) + 57796: 351, // builtinDateSub (427x) + 57797: 352, // builtinExtract (427x) + 57798: 353, // builtinGroupConcat (427x) + 57799: 354, // builtinMax (427x) + 57800: 355, // builtinMin (427x) + 57802: 356, // builtinPosition (427x) + 57807: 357, // builtinStddevPop (427x) + 57808: 358, // builtinStddevSamp (427x) + 57803: 359, // builtinSubDate (427x) + 57804: 360, // builtinSubstring (427x) + 57805: 361, // builtinSum (427x) + 57806: 362, // builtinSysDate (427x) + 57809: 363, // builtinTrim (427x) + 57810: 364, // builtinUser (427x) + 57811: 365, // builtinVarPop (427x) + 57812: 366, // builtinVarSamp (427x) + 57373: 367, // caseKwd (427x) + 57384: 368, // cumeDist (427x) + 57385: 369, // currentDate (427x) + 57386: 370, // currentTime (427x) + 57399: 371, // denseRank (427x) + 57415: 372, // firstValue (427x) + 57452: 373, // lag (427x) + 57453: 374, // lastValue (427x) + 57454: 375, // lead (427x) + 57831: 376, // not2 (427x) + 57476: 377, // nthValue (427x) + 57477: 378, // ntile (427x) + 57490: 379, // percentRank (427x) + 57355: 380, // pipes (427x) + 57496: 381, // rank (427x) + 57502: 382, // repeat (427x) + 57510: 383, // rowNumber (427x) + 57539: 384, // utcDate (427x) + 57541: 385, // utcTime (427x) + 57540: 386, // utcTimestamp (427x) + 57449: 387, // key (411x) + 57492: 388, // primary (400x) + 57531: 389, // unique (396x) + 57377: 390, // check (393x) + 57499: 391, // references (392x) + 57422: 392, // generated (388x) + 57991: 393, // Identifier (361x) + 58044: 394, // NotKeywordToken (361x) + 58188: 395, // TiDBKeyword (361x) + 58198: 396, // UnReservedKeyword (361x) + 57432: 397, // ignore (351x) + 57512: 398, // selectKwd (339x) + 57375: 399, // character (312x) + 57489: 400, // partition (288x) + 57488: 401, // packKeys (278x) + 57494: 402, // shardRowIDBits (278x) + 57823: 403, // jss (267x) + 57824: 404, // juss (267x) + 57434: 405, // index (264x) + 57527: 406, // to (260x) + 57459: 407, // lines (254x) + 57371: 408, // by (251x) + 57418: 409, // force (248x) + 57516: 410, // sql (248x) + 57537: 411, // use (248x) + 57372: 412, // cascade (246x) + 57504: 413, // restrict (246x) + 64: 414, // '@' (245x) + 57406: 415, // drop (245x) + 57497: 416, // read (242x) + 57361: 417, // alter (241x) + 57362: 418, // analyze (241x) + 57419: 419, // foreign (239x) + 57421: 420, // fulltext (238x) + 57501: 421, // rename (238x) + 57395: 422, // decimalType (237x) + 57437: 423, // integerType (237x) + 57442: 424, // intType (237x) + 57544: 425, // varcharType (237x) + 57359: 426, // add (236x) + 57374: 427, // change (236x) + 57549: 428, // write (236x) + 57367: 429, // bigIntType (235x) + 57369: 430, // blobType (235x) + 57405: 431, // doubleType (235x) + 57416: 432, // floatType (235x) + 57443: 433, // int1Type (235x) + 57444: 434, // int2Type (235x) + 57445: 435, // int3Type (235x) + 57446: 436, // int4Type (235x) + 57447: 437, // int8Type (235x) + 57543: 438, // long (235x) + 57464: 439, // longblobType (235x) + 57465: 440, // longtextType (235x) + 57468: 441, // mediumblobType (235x) + 57469: 442, // mediumIntType (235x) + 57470: 443, // mediumtextType (235x) + 57479: 444, // numericType (235x) + 57480: 445, // nvarcharType (235x) + 57498: 446, // realType (235x) + 57515: 447, // smallIntType (235x) + 57524: 448, // tinyblobType (235x) + 57525: 449, // tinyIntType (235x) + 57526: 450, // tinytextType (235x) + 57545: 451, // varbinaryType (235x) + 58160: 452, // SubSelect (161x) + 58208: 453, // UserVariable (143x) + 58030: 454, // Literal (142x) + 58148: 455, // SimpleIdent (142x) + 58155: 456, // StringLiteral (142x) + 57972: 457, // FunctionCallGeneric (140x) + 57973: 458, // FunctionCallKeyword (140x) + 57974: 459, // FunctionCallNonKeyword (140x) + 57975: 460, // FunctionNameConflict (140x) + 57976: 461, // FunctionNameDateArith (140x) + 57977: 462, // FunctionNameDateArithMultiForms (140x) + 57978: 463, // FunctionNameDatetimePrecision (140x) + 57979: 464, // FunctionNameOptionalBraces (140x) + 58147: 465, // SimpleExpr (140x) + 58161: 466, // SumExpr (140x) + 58163: 467, // SystemVariable (140x) + 58217: 468, // Variable (140x) + 58239: 469, // WindowFuncCall (140x) + 57868: 470, // BitExpr (127x) + 58094: 471, // PredicateExpr (111x) + 57871: 472, // BoolPri (108x) + 57948: 473, // Expression (108x) + 58248: 474, // logAnd (86x) + 58249: 475, // logOr (86x) + 58172: 476, // TableName (55x) + 58156: 477, // StringName (51x) + 58041: 478, // NUM (45x) + 57534: 479, // unsigned (44x) + 57554: 480, // zerofill (42x) + 57487: 481, // over (38x) + 57360: 482, // all (36x) + 57884: 483, // ColumnName (35x) + 58244: 484, // WindowingClause (28x) + 58123: 485, // SelectStmt (27x) + 58124: 486, // SelectStmtBasic (27x) + 58127: 487, // SelectStmtFromDualTable (27x) + 58128: 488, // SelectStmtFromTable (27x) + 57940: 489, // EqOpt (24x) + 57520: 490, // tableKwd (22x) + 57955: 491, // FieldLen (21x) + 58201: 492, // UnionSelect (19x) + 58022: 493, // LengthNum (18x) + 58199: 494, // UnionClauseList (18x) + 58202: 495, // UnionStmt (18x) + 58073: 496, // OptWindowingClause (17x) + 57517: 497, // sqlCalcFoundRows (17x) + 57535: 498, // update (17x) + 57397: 499, // delayed (16x) + 57427: 500, // highPriority (16x) + 57466: 501, // lowPriority (16x) + 57877: 502, // CharsetKw (15x) + 57402: 503, // distinct (15x) + 57403: 504, // distinctRow (15x) + 58210: 505, // Username (15x) + 57398: 506, // deleteKwd (14x) + 58061: 507, // OptFieldLen (14x) + 57731: 508, // release (14x) + 57949: 509, // ExpressionList (13x) + 58016: 510, // JoinTable (13x) + 58169: 511, // TableFactor (13x) + 58181: 512, // TableRef (13x) + 57925: 513, // DistinctKwd (12x) + 57926: 514, // DistinctOpt (11x) + 57920: 515, // DefaultFalseDistinctOpt (10x) + 57968: 516, // FromOrIn (10x) + 57439: 517, // into (10x) + 58077: 518, // OrderBy (10x) + 58078: 519, // OrderByOptional (10x) + 58116: 520, // Rolename (10x) + 58113: 521, // RoleNameString (10x) + 58173: 522, // TableNameList (10x) + 57873: 523, // BuggyDefaultFalseDistinctOpt (9x) + 57353: 524, // hintEnd (9x) + 58008: 525, // IndexType (9x) + 58017: 526, // JoinType (9x) + 57878: 527, // CharsetName (8x) + 57885: 528, // ColumnNameList (8x) + 57911: 529, // CrossOpt (8x) + 57921: 530, // DefaultKwdOpt (8x) + 57410: 531, // escaped (8x) + 57997: 532, // IndexColName (8x) + 58018: 533, // KeyOrIndex (8x) + 58059: 534, // OptCollate (8x) + 57880: 535, // ColumnDef (7x) + 57924: 536, // DeleteFromStmt (7x) + 57942: 537, // EscapedTableRef (7x) + 57998: 538, // IndexColNameList (7x) + 58010: 539, // InsertIntoStmt (7x) + 58109: 540, // ReplaceIntoStmt (7x) + 58117: 541, // RolenameList (7x) + 58130: 542, // SelectStmtLimit (7x) + 58189: 543, // TimeUnit (7x) + 58204: 544, // UpdateStmt (7x) + 58229: 545, // WhereClause (7x) + 58230: 546, // WhereClauseOptional (7x) + 57382: 547, // create (6x) + 57409: 548, // enclosed (6x) + 57947: 549, // ExprOrDefault (6x) + 57423: 550, // grant (6x) + 58038: 551, // MaxNumBuckets (6x) + 58049: 552, // NumLiteral (6x) + 58057: 553, // OptBinary (6x) + 58119: 554, // RowFormat (6x) + 58122: 555, // SelectLockOpt (6x) + 57514: 556, // show (6x) + 58140: 557, // ShowDatabaseNameOpt (6x) + 58178: 558, // TableOption (6x) + 58182: 559, // TableRefs (6x) + 57522: 560, // terminated (6x) + 57874: 561, // ByItem (5x) + 57379: 562, // column (5x) + 57882: 563, // ColumnKeywordOpt (5x) + 57912: 564, // DBName (5x) + 57950: 565, // ExpressionListOpt (5x) + 57957: 566, // FieldOpt (5x) + 57958: 567, // FieldOpts (5x) + 57993: 568, // IfNotExists (5x) + 58004: 569, // IndexName (5x) + 58006: 570, // IndexOption (5x) + 58007: 571, // IndexOptionList (5x) + 57483: 572, // optionally (5x) + 58068: 573, // OptNullTreatment (5x) + 58098: 574, // PriorityOpt (5x) + 58110: 575, // RestrictOrCascadeOpt (5x) + 58142: 576, // ShowLikeOrWhereOpt (5x) + 58211: 577, // UsernameList (5x) + 58206: 578, // UserSpec (5x) + 57860: 579, // Assignment (4x) + 57864: 580, // AuthString (4x) + 57875: 581, // ByList (4x) + 57730: 582, // chain (4x) + 57995: 583, // IgnoreOptional (4x) + 58005: 584, // IndexNameList (4x) + 58009: 585, // IndexTypeOpt (4x) + 58027: 586, // LimitOption (4x) + 57482: 587, // option (4x) + 57486: 588, // outer (4x) + 58086: 589, // PartitionDefinitionListOpt (4x) + 58089: 590, // PartitionNumOpt (4x) + 58136: 591, // SetExpr (4x) + 58193: 592, // TransactionChar (4x) + 58207: 593, // UserSpecList (4x) + 58240: 594, // WindowName (4x) + 57819: 595, // assignmentEq (3x) + 57861: 596, // AssignmentList (3x) + 57891: 597, // ColumnPosition (3x) + 57898: 598, // Constraint (3x) + 57380: 599, // constraint (3x) + 57900: 600, // ConstraintKeywordOpt (3x) + 57946: 601, // ExplainableStmt (3x) + 57963: 602, // FloatOpt (3x) + 57982: 603, // GlobalScope (3x) + 57352: 604, // hintBegin (3x) + 57990: 605, // HintTableList (3x) + 57992: 606, // IfExists (3x) + 57999: 607, // IndexHint (3x) + 58003: 608, // IndexHintType (3x) + 57435: 609, // infile (3x) + 57450: 610, // keys (3x) + 58034: 611, // LockClause (3x) + 57467: 612, // maxValue (3x) + 58058: 613, // OptCharset (3x) + 58087: 614, // PartitionNameList (3x) + 58093: 615, // Precision (3x) + 58099: 616, // PrivElem (3x) + 58102: 617, // PrivType (3x) + 58104: 618, // ReferDef (3x) + 58120: 619, // RowValue (3x) + 58164: 620, // TableAsName (3x) + 58177: 621, // TableOptimizerHints (3x) + 58179: 622, // TableOptionList (3x) + 58194: 623, // TransactionChars (3x) + 57529: 624, // trigger (3x) + 57536: 625, // usage (3x) + 58212: 626, // ValueSym (3x) + 58237: 627, // WindowFrameStart (3x) + 57850: 628, // AdminStmt (2x) + 57852: 629, // AlterTableOptionListOpt (2x) + 57853: 630, // AlterTableSpec (2x) + 57855: 631, // AlterTableStmt (2x) + 57856: 632, // AlterUserStmt (2x) + 57857: 633, // AnalyzeTableStmt (2x) + 57865: 634, // BeginTransactionStmt (2x) + 57867: 635, // BinlogStmt (2x) + 57876: 636, // CastType (2x) + 57886: 637, // ColumnNameListOpt (2x) + 57888: 638, // ColumnOption (2x) + 57892: 639, // ColumnSetValue (2x) + 57895: 640, // CommitOpt (2x) + 57896: 641, // CommitStmt (2x) + 57901: 642, // CreateBindingStmt (2x) + 57902: 643, // CreateDatabaseStmt (2x) + 57903: 644, // CreateIndexStmt (2x) + 57905: 645, // CreateRoleStmt (2x) + 57908: 646, // CreateTableStmt (2x) + 57909: 647, // CreateUserStmt (2x) + 57910: 648, // CreateViewStmt (2x) + 57913: 649, // DatabaseOption (2x) + 57390: 650, // databases (2x) + 57916: 651, // DatabaseSym (2x) + 57918: 652, // DeallocateStmt (2x) + 57919: 653, // DeallocateSym (2x) + 57401: 654, // describe (2x) + 57927: 655, // DoStmt (2x) + 57928: 656, // DropBindingStmt (2x) + 57929: 657, // DropDatabaseStmt (2x) + 57930: 658, // DropIndexStmt (2x) + 57931: 659, // DropRoleStmt (2x) + 57932: 660, // DropStatsStmt (2x) + 57933: 661, // DropTableStmt (2x) + 57934: 662, // DropUserStmt (2x) + 57935: 663, // DropViewStmt (2x) + 57938: 664, // EmptyStmt (2x) + 57943: 665, // ExecuteStmt (2x) + 57412: 666, // explain (2x) + 57944: 667, // ExplainStmt (2x) + 57945: 668, // ExplainSym (2x) + 57952: 669, // Field (2x) + 57953: 670, // FieldAsName (2x) + 57954: 671, // FieldAsNameOpt (2x) + 57966: 672, // FlushStmt (2x) + 57967: 673, // FromDual (2x) + 57970: 674, // FuncDatetimePrecList (2x) + 57971: 675, // FuncDatetimePrecListOpt (2x) + 57980: 676, // GeneratedAlways (2x) + 57983: 677, // GrantRoleStmt (2x) + 57984: 678, // GrantStmt (2x) + 57986: 679, // HandleRange (2x) + 57988: 680, // HashString (2x) + 58000: 681, // IndexHintList (2x) + 58001: 682, // IndexHintListOpt (2x) + 58011: 683, // InsertValues (2x) + 58013: 684, // IntoOpt (2x) + 58019: 685, // KeyOrIndexOpt (2x) + 57451: 686, // kill (2x) + 58020: 687, // KillOrKillTiDB (2x) + 58021: 688, // KillStmt (2x) + 58026: 689, // LimitClause (2x) + 57460: 690, // load (2x) + 58031: 691, // LoadDataStmt (2x) + 58032: 692, // LoadStatsStmt (2x) + 58036: 693, // LockTablesStmt (2x) + 58039: 694, // MaxValueOrExpression (2x) + 58045: 695, // NowSym (2x) + 58046: 696, // NowSymFunc (2x) + 58047: 697, // NowSymOptionFraction (2x) + 58048: 698, // NumList (2x) + 58052: 699, // ObjectType (2x) + 58051: 700, // ODBCDateTimeType (2x) + 57356: 701, // odbcDateType (2x) + 57358: 702, // odbcTimestampType (2x) + 57357: 703, // odbcTimeType (2x) + 58065: 704, // OptInteger (2x) + 58074: 705, // OptionalBraces (2x) + 58067: 706, // OptLeadLagInfo (2x) + 58066: 707, // OptLLDefault (2x) + 58076: 708, // Order (2x) + 58079: 709, // OuterOpt (2x) + 58080: 710, // PartDefOption (2x) + 58084: 711, // PartitionDefinition (2x) + 58091: 712, // PasswordOpt (2x) + 58096: 713, // PreparedStmt (2x) + 58097: 714, // PrimaryOpt (2x) + 58100: 715, // PrivElemList (2x) + 58101: 716, // PrivLevel (2x) + 58105: 717, // ReferOpt (2x) + 58107: 718, // RegexpSym (2x) + 58108: 719, // RenameTableStmt (2x) + 57505: 720, // revoke (2x) + 58111: 721, // RevokeRoleStmt (2x) + 58112: 722, // RevokeStmt (2x) + 58114: 723, // RoleSpec (2x) + 58118: 724, // RollbackStmt (2x) + 58121: 725, // SavepointStmt (2x) + 58134: 726, // SetDefaultRoleOpt (2x) + 58135: 727, // SetDefaultRoleStmt (2x) + 58138: 728, // SetRoleStmt (2x) + 58139: 729, // SetStmt (2x) + 58143: 730, // ShowStmt (2x) + 58144: 731, // ShowTableAliasOpt (2x) + 58146: 732, // SignedLiteral (2x) + 58151: 733, // Statement (2x) + 58153: 734, // StatsPersistentVal (2x) + 58154: 735, // StringList (2x) + 58158: 736, // SubPartitionNumOpt (2x) + 58162: 737, // Symbol (2x) + 58166: 738, // TableElement (2x) + 58170: 739, // TableLock (2x) + 58176: 740, // TableOptimizerHintOpt (2x) + 58180: 741, // TableOrTables (2x) + 58186: 742, // TablesTerminalSym (2x) + 58184: 743, // TableToTable (2x) + 58190: 744, // TimestampUnit (2x) + 58192: 745, // TraceableStmt (2x) + 58191: 746, // TraceStmt (2x) + 58196: 747, // TruncateTableStmt (2x) + 57533: 748, // unlock (2x) + 58203: 749, // UnlockTablesStmt (2x) + 58205: 750, // UseStmt (2x) + 58214: 751, // ValuesList (2x) + 58218: 752, // VariableAssignment (2x) + 58227: 753, // WhenClause (2x) + 58232: 754, // WindowDefinition (2x) + 58235: 755, // WindowFrameBound (2x) + 58242: 756, // WindowSpec (2x) + 57729: 757, // work (2x) + 57849: 758, // AdminShowSlow (1x) + 57851: 759, // AlterAlgorithm (1x) + 57854: 760, // AlterTableSpecList (1x) + 57858: 761, // AnyOrAll (1x) + 57859: 762, // AsOpt (1x) + 57863: 763, // AuthOption (1x) + 57866: 764, // BetweenOrNotOp (1x) + 57869: 765, // BitValueType (1x) + 57870: 766, // BlobType (1x) + 57872: 767, // BooleanType (1x) + 57370: 768, // both (1x) + 57879: 769, // CharsetOpt (1x) + 57881: 770, // ColumnDefList (1x) + 57883: 771, // ColumnList (1x) + 57887: 772, // ColumnNameListOptWithBrackets (1x) + 57889: 773, // ColumnOptionList (1x) + 57890: 774, // ColumnOptionListOpt (1x) + 57893: 775, // ColumnSetValueList (1x) + 57897: 776, // CompareOp (1x) + 57899: 777, // ConstraintElem (1x) + 57904: 778, // CreateIndexStmtUnique (1x) + 57906: 779, // CreateTableOptionListOpt (1x) + 57907: 780, // CreateTableSelectOpt (1x) + 57914: 781, // DatabaseOptionList (1x) + 57915: 782, // DatabaseOptionListOpt (1x) + 57917: 783, // DateAndTimeType (1x) + 57922: 784, // DefaultTrueDistinctOpt (1x) + 57923: 785, // DefaultValueExpr (1x) + 57407: 786, // dual (1x) + 57936: 787, // DuplicateOpt (1x) + 57937: 788, // ElseOpt (1x) + 57939: 789, // Enclosed (1x) + 57345: 790, // error (1x) + 57941: 791, // Escaped (1x) + 57413: 792, // except (1x) + 57951: 793, // ExpressionOpt (1x) + 57956: 794, // FieldList (1x) + 57959: 795, // Fields (1x) + 57960: 796, // FieldsOrColumns (1x) + 57961: 797, // FieldsTerminated (1x) + 57962: 798, // FixedPointType (1x) + 57964: 799, // FloatingPointType (1x) + 57965: 800, // FlushOption (1x) + 57969: 801, // FuncDatetimePrec (1x) + 57981: 802, // GetFormatSelector (1x) + 57985: 803, // GroupByClause (1x) + 57987: 804, // HandleRangeList (1x) + 57989: 805, // HavingClause (1x) + 57994: 806, // IgnoreLines (1x) + 58002: 807, // IndexHintScope (1x) + 57996: 808, // InOrNotOp (1x) + 58012: 809, // IntegerType (1x) + 58015: 810, // IsolationLevel (1x) + 58014: 811, // IsOrNotOp (1x) + 57455: 812, // leading (1x) + 58023: 813, // LikeEscapeOpt (1x) + 58024: 814, // LikeOrNotOp (1x) + 58025: 815, // LikeTableWithOrWithoutParen (1x) + 58028: 816, // Lines (1x) + 58029: 817, // LinesTerminated (1x) + 58033: 818, // LocalOpt (1x) + 58035: 819, // LockClauseOpt (1x) + 58037: 820, // LockType (1x) + 58040: 821, // MaxValueOrExpressionList (1x) + 58042: 822, // NationalOpt (1x) + 57475: 823, // noWriteToBinLog (1x) + 58043: 824, // NoWriteToBinLogAliasOpt (1x) + 58050: 825, // NumericType (1x) + 58053: 826, // OnDeleteOpt (1x) + 58054: 827, // OnDuplicateKeyUpdate (1x) + 58055: 828, // OnUpdateOpt (1x) + 58056: 829, // OptBinMod (1x) + 58060: 830, // OptExistingWindowName (1x) + 58062: 831, // OptFromFirstLast (1x) + 58063: 832, // OptFull (1x) + 58064: 833, // OptGConcatSeparator (1x) + 58069: 834, // OptPartitionClause (1x) + 58070: 835, // OptTable (1x) + 58071: 836, // OptWindowFrameClause (1x) + 58072: 837, // OptWindowOrderByClause (1x) + 58075: 838, // OrReplace (1x) + 58081: 839, // PartDefOptionList (1x) + 58082: 840, // PartDefOptionsOpt (1x) + 58083: 841, // PartDefValuesOpt (1x) + 58085: 842, // PartitionDefinitionList (1x) + 58088: 843, // PartitionNameListOpt (1x) + 58090: 844, // PartitionOpt (1x) + 58092: 845, // PluginNameList (1x) + 57491: 846, // precisionType (1x) + 58095: 847, // PrepareSQL (1x) + 57493: 848, // procedure (1x) + 58103: 849, // QuickOptional (1x) + 58106: 850, // RegexpOrNotOp (1x) + 58115: 851, // RoleSpecList (1x) + 58125: 852, // SelectStmtCalcFoundRows (1x) + 58126: 853, // SelectStmtFieldList (1x) + 58129: 854, // SelectStmtGroup (1x) + 58131: 855, // SelectStmtOpts (1x) + 58132: 856, // SelectStmtSQLCache (1x) + 58133: 857, // SelectStmtStraightJoin (1x) + 58137: 858, // SetRoleOpt (1x) + 58141: 859, // ShowIndexKwd (1x) + 58145: 860, // ShowTargetFilterable (1x) + 58149: 861, // Start (1x) + 58150: 862, // Starting (1x) + 57518: 863, // starting (1x) + 58152: 864, // StatementList (1x) + 57521: 865, // stored (1x) + 58157: 866, // StringType (1x) + 58159: 867, // SubPartitionOpt (1x) + 58165: 868, // TableAsNameOpt (1x) + 58167: 869, // TableElementList (1x) + 58168: 870, // TableElementListOpt (1x) + 58171: 871, // TableLockList (1x) + 58174: 872, // TableNameListOpt (1x) + 58175: 873, // TableOptimizerHintList (1x) + 58183: 874, // TableRefsClause (1x) + 58185: 875, // TableToTableList (1x) + 58187: 876, // TextType (1x) + 57528: 877, // trailing (1x) + 58195: 878, // TrimDirection (1x) + 58197: 879, // Type (1x) + 58200: 880, // UnionOpt (1x) + 58209: 881, // UserVariableList (1x) + 58213: 882, // Values (1x) + 58215: 883, // ValuesOpt (1x) + 58216: 884, // Varchar (1x) + 58219: 885, // VariableAssignmentList (1x) + 58220: 886, // ViewAlgorithm (1x) + 58221: 887, // ViewCheckOption (1x) + 58222: 888, // ViewDefiner (1x) + 58223: 889, // ViewFieldList (1x) + 58224: 890, // ViewName (1x) + 58225: 891, // ViewSQLSecurity (1x) + 57546: 892, // virtual (1x) + 58226: 893, // VirtualOrStored (1x) + 58228: 894, // WhenClauseList (1x) + 58231: 895, // WindowClauseOptional (1x) + 58233: 896, // WindowDefinitionList (1x) + 58234: 897, // WindowFrameBetween (1x) + 58236: 898, // WindowFrameExtent (1x) + 58238: 899, // WindowFrameUnits (1x) + 58241: 900, // WindowNameOrSpec (1x) + 58243: 901, // WindowSpecDetails (1x) + 58245: 902, // WithGrantOptionOpt (1x) + 58246: 903, // WithReadLockOpt (1x) + 58247: 904, // WithRollUpOpt (1x) + 57848: 905, // $default (0x) + 57818: 906, // andnot (0x) + 57862: 907, // AssignmentListOpt (0x) + 57894: 908, // CommaOpt (0x) + 57840: 909, // createTableSelect (0x) + 57832: 910, // empty (0x) + 57847: 911, // higherThanComma (0x) + 57838: 912, // insertValues (0x) + 57351: 913, // invalid (0x) + 57846: 914, // lowerThanComma (0x) + 57839: 915, // lowerThanCreateTableSelect (0x) + 57844: 916, // lowerThanEq (0x) + 57837: 917, // lowerThanInsertValues (0x) + 57834: 918, // lowerThanIntervalKeyword (0x) + 57841: 919, // lowerThanKey (0x) + 57843: 920, // lowerThanOn (0x) + 57836: 921, // lowerThanSetKeyword (0x) + 57835: 922, // lowerThanStringLitToken (0x) + 57833: 923, // lowerThanWith (0x) + 57845: 924, // neg (0x) + 57842: 925, // tableRefPriority (0x) } yySymNames = []string{ @@ -1512,25 +1523,26 @@ var ( "separator", "tables", "preceding", + "master", "tablespace", "yearType", "columns", "day", "hour", + "maxExecutionTime", "microsecond", "minute", "month", "quarter", "second", + "tidbHJ", + "tidbINLJ", + "tidbSMJ", "week", "definer", "fields", "identified", - "maxExecutionTime", "respect", - "tidbHJ", - "tidbINLJ", - "tidbSMJ", "following", "binding", "current", @@ -1538,6 +1550,7 @@ var ( "privileges", "unbounded", "algorithm", + "local", "offset", "partitions", "prepare", @@ -1548,7 +1561,6 @@ var ( "datetimeType", "dateType", "isolation", - "local", "subpartition", "timeType", "truncate", @@ -1585,12 +1597,16 @@ var ( "instant", "job", "jobs", + "locked", "modify", + "nowait", "nulls", "plugins", "redundant", "rollback", "routine", + "share", + "skip", "slave", "start", "stats", @@ -1629,7 +1645,6 @@ var ( "last", "less", "level", - "master", "maxConnectionsPerHour", "maxQueriesPerHour", "maxUpdatesPerHour", @@ -1649,9 +1664,9 @@ var ( "repeatable", "replication", "restore", + "rollup", "security", "serializable", - "share", "shared", "snapshot", "statsBuckets", @@ -1733,26 +1748,26 @@ var ( "and", "order", "or", - "where", "andand", "pipesAsOr", "xor", + "where", "from", "eq", "straightJoin", "window", - "set", "having", + "set", "join", - "group", "collate", + "group", "cross", "inner", "natural", "'}'", "intLit", - "replace", "like", + "replace", "'*'", "rangeKwd", "groups", @@ -1860,13 +1875,13 @@ var ( "nthValue", "ntile", "percentRank", + "pipes", "rank", "repeat", "rowNumber", "utcDate", "utcTime", "utcTimestamp", - "pipes", "key", "primary", "unique", @@ -2004,6 +2019,7 @@ var ( "RoleNameString", "TableNameList", "BuggyDefaultFalseDistinctOpt", + "hintEnd", "IndexType", "JoinType", "CharsetName", @@ -2011,7 +2027,6 @@ var ( "CrossOpt", "DefaultKwdOpt", "escaped", - "hintEnd", "IndexColName", "KeyOrIndex", "OptCollate", @@ -2072,7 +2087,6 @@ var ( "PartitionDefinitionListOpt", "PartitionNumOpt", "SetExpr", - "TableAsName", "TransactionChar", "UserSpecList", "WindowName", @@ -2101,6 +2115,7 @@ var ( "PrivType", "ReferDef", "RowValue", + "TableAsName", "TableOptimizerHints", "TableOptionList", "TransactionChars", @@ -2384,6 +2399,7 @@ var ( "WindowSpecDetails", "WithGrantOptionOpt", "WithReadLockOpt", + "WithRollUpOpt", "$default", "andnot", "AssignmentListOpt", @@ -2402,4716 +2418,4749 @@ var ( "lowerThanOn", "lowerThanSetKeyword", "lowerThanStringLitToken", + "lowerThanWith", "neg", "tableRefPriority", } yyReductions = []struct{ xsym, components int }{ {0, 1}, - {857, 1}, - {627, 5}, - {627, 8}, - {627, 10}, - {626, 1}, - {626, 5}, - {626, 4}, - {626, 5}, - {626, 2}, - {626, 3}, - {626, 4}, - {626, 3}, - {626, 4}, - {626, 3}, - {626, 3}, - {626, 3}, - {626, 3}, - {626, 4}, - {626, 2}, - {626, 2}, - {626, 4}, - {626, 5}, - {626, 6}, - {626, 5}, - {626, 3}, - {626, 2}, - {626, 3}, - {626, 5}, - {626, 1}, - {626, 3}, - {626, 1}, - {755, 1}, - {755, 1}, - {755, 1}, - {755, 1}, - {815, 0}, - {815, 1}, - {608, 3}, - {608, 3}, - {608, 3}, - {608, 3}, - {529, 1}, - {529, 1}, - {681, 0}, - {681, 1}, - {559, 0}, - {559, 1}, - {594, 0}, - {594, 1}, - {594, 2}, - {756, 1}, - {756, 3}, - {611, 1}, + {861, 1}, + {631, 5}, + {631, 8}, + {631, 10}, + {630, 1}, + {630, 5}, + {630, 4}, + {630, 5}, + {630, 2}, + {630, 3}, + {630, 4}, + {630, 3}, + {630, 4}, + {630, 3}, + {630, 3}, + {630, 3}, + {630, 3}, + {630, 4}, + {630, 2}, + {630, 2}, + {630, 4}, + {630, 5}, + {630, 6}, + {630, 5}, + {630, 3}, + {630, 2}, + {630, 3}, + {630, 5}, + {630, 1}, + {630, 3}, + {630, 1}, + {759, 1}, + {759, 1}, + {759, 1}, + {759, 1}, + {819, 0}, + {819, 1}, + {611, 3}, + {611, 3}, {611, 3}, + {611, 3}, + {533, 1}, + {533, 1}, + {685, 0}, + {685, 1}, + {563, 0}, + {563, 1}, {597, 0}, {597, 1}, {597, 2}, - {733, 1}, - {715, 3}, - {871, 1}, - {871, 3}, - {739, 3}, - {629, 4}, - {629, 6}, - {629, 6}, - {629, 8}, - {547, 0}, - {547, 3}, - {575, 3}, - {593, 1}, - {593, 3}, - {902, 0}, - {902, 1}, - {630, 1}, - {630, 2}, - {630, 5}, - {631, 2}, - {766, 1}, - {766, 3}, - {531, 3}, - {479, 1}, - {479, 3}, - {479, 5}, - {523, 1}, - {523, 3}, - {633, 0}, - {633, 1}, - {768, 0}, - {768, 3}, - {636, 1}, - {636, 6}, - {636, 5}, - {636, 5}, - {636, 3}, - {636, 2}, - {636, 5}, - {636, 4}, - {636, 4}, - {636, 2}, - {636, 1}, - {637, 1}, - {637, 2}, - {710, 0}, - {710, 1}, - {634, 2}, - {634, 1}, - {634, 1}, - {634, 2}, + {760, 1}, + {760, 3}, + {614, 1}, + {614, 3}, + {600, 0}, + {600, 1}, + {600, 2}, + {737, 1}, + {719, 3}, + {875, 1}, + {875, 3}, + {743, 3}, + {633, 4}, + {633, 6}, + {633, 6}, + {633, 8}, + {551, 0}, + {551, 3}, + {579, 3}, + {596, 1}, + {596, 3}, + {907, 0}, + {907, 1}, {634, 1}, {634, 2}, - {634, 2}, - {634, 3}, - {634, 2}, - {634, 4}, - {634, 6}, - {634, 1}, - {672, 0}, - {672, 2}, - {889, 0}, - {889, 1}, - {889, 1}, - {769, 1}, - {769, 2}, - {770, 0}, + {634, 5}, + {635, 2}, {770, 1}, - {773, 8}, - {773, 7}, - {773, 7}, - {773, 8}, - {773, 7}, - {615, 7}, - {822, 0}, - {822, 3}, - {824, 0}, - {824, 3}, - {713, 1}, - {713, 1}, - {713, 2}, - {713, 2}, - {781, 1}, - {781, 1}, - {693, 1}, - {693, 3}, - {693, 4}, - {692, 1}, - {692, 1}, - {692, 1}, - {692, 1}, - {691, 1}, - {691, 1}, - {691, 1}, - {728, 1}, - {728, 2}, - {728, 2}, - {548, 1}, - {548, 1}, - {548, 1}, - {640, 12}, + {770, 3}, + {535, 3}, + {483, 1}, + {483, 3}, + {483, 5}, + {528, 1}, + {528, 3}, + {637, 0}, + {637, 1}, + {772, 0}, + {772, 3}, + {640, 1}, + {640, 6}, + {640, 5}, + {640, 5}, + {640, 3}, + {640, 2}, + {640, 5}, + {640, 4}, + {640, 4}, + {640, 2}, + {640, 1}, + {641, 1}, + {641, 2}, + {714, 0}, + {714, 1}, + {638, 2}, + {638, 1}, + {638, 1}, + {638, 2}, + {638, 1}, + {638, 2}, + {638, 2}, + {638, 3}, + {638, 2}, + {638, 4}, + {638, 6}, + {638, 1}, + {676, 0}, + {676, 2}, + {893, 0}, + {893, 1}, + {893, 1}, + {773, 1}, + {773, 2}, {774, 0}, {774, 1}, - {528, 3}, - {534, 1}, - {534, 3}, - {639, 5}, - {560, 1}, - {645, 4}, - {645, 4}, + {777, 8}, + {777, 7}, + {777, 7}, + {777, 8}, + {777, 7}, + {618, 7}, + {826, 0}, + {826, 3}, + {828, 0}, + {828, 3}, + {717, 1}, + {717, 1}, + {717, 2}, + {717, 2}, + {785, 1}, + {785, 1}, + {697, 1}, + {697, 3}, + {697, 4}, + {696, 1}, + {696, 1}, + {696, 1}, + {696, 1}, + {695, 1}, + {695, 1}, + {695, 1}, + {732, 1}, + {732, 2}, + {732, 2}, + {552, 1}, + {552, 1}, + {552, 1}, + {644, 12}, {778, 0}, {778, 1}, - {777, 1}, - {777, 2}, - {642, 10}, - {642, 5}, - {525, 0}, - {525, 1}, + {532, 3}, + {538, 1}, + {538, 3}, + {643, 5}, + {564, 1}, + {649, 4}, + {649, 4}, + {782, 0}, + {782, 1}, + {781, 1}, + {781, 2}, + {646, 10}, + {646, 5}, + {530, 0}, + {530, 1}, + {844, 0}, + {844, 8}, + {844, 7}, + {844, 9}, + {844, 9}, + {867, 0}, + {867, 7}, + {867, 7}, + {736, 0}, + {736, 2}, + {590, 0}, + {590, 2}, + {589, 0}, + {589, 3}, + {842, 1}, + {842, 3}, + {711, 4}, {840, 0}, - {840, 8}, - {840, 7}, - {840, 9}, - {840, 9}, - {863, 0}, - {863, 7}, - {863, 7}, - {732, 0}, - {732, 2}, - {586, 0}, - {586, 2}, - {585, 0}, - {585, 3}, - {838, 1}, - {838, 3}, - {707, 4}, - {836, 0}, - {836, 1}, - {835, 1}, - {835, 2}, - {706, 3}, - {706, 3}, - {706, 3}, - {837, 0}, - {837, 4}, - {837, 6}, - {783, 0}, - {783, 1}, - {783, 1}, - {758, 0}, - {758, 1}, - {776, 0}, - {776, 1}, - {776, 1}, - {776, 1}, - {811, 2}, - {811, 4}, - {644, 11}, - {834, 0}, - {834, 2}, - {882, 0}, - {882, 3}, - {882, 3}, - {882, 3}, - {884, 0}, - {884, 3}, + {840, 1}, + {839, 1}, + {839, 2}, + {710, 3}, + {710, 3}, + {710, 3}, + {841, 0}, + {841, 4}, + {841, 6}, + {787, 0}, + {787, 1}, + {787, 1}, + {762, 0}, + {762, 1}, + {780, 0}, + {780, 1}, + {780, 1}, + {780, 1}, + {815, 2}, + {815, 4}, + {648, 11}, + {838, 0}, + {838, 2}, + {886, 0}, + {886, 3}, + {886, 3}, + {886, 3}, + {888, 0}, + {888, 3}, + {891, 0}, + {891, 3}, + {891, 3}, + {890, 1}, + {889, 0}, + {889, 3}, + {771, 1}, + {771, 3}, {887, 0}, - {887, 3}, - {887, 3}, - {886, 1}, - {885, 0}, - {885, 3}, - {767, 1}, - {767, 3}, - {883, 0}, - {883, 4}, - {883, 4}, - {651, 2}, - {532, 11}, - {532, 9}, - {532, 10}, - {647, 1}, - {653, 4}, - {654, 6}, + {887, 4}, + {887, 4}, + {655, 2}, + {536, 11}, + {536, 9}, + {536, 10}, + {651, 1}, {657, 4}, - {657, 6}, - {659, 4}, - {659, 6}, - {658, 3}, - {658, 5}, - {655, 3}, - {655, 5}, - {656, 3}, - {571, 0}, - {571, 1}, - {571, 1}, - {737, 1}, - {737, 1}, - {485, 0}, - {485, 1}, - {660, 0}, - {742, 2}, - {742, 5}, - {664, 1}, - {664, 1}, - {664, 1}, - {663, 2}, - {663, 3}, - {663, 2}, - {663, 5}, - {663, 3}, + {658, 6}, + {661, 4}, + {661, 6}, + {663, 4}, + {663, 6}, + {662, 3}, + {662, 5}, + {659, 3}, + {659, 5}, + {660, 3}, + {575, 0}, + {575, 1}, + {575, 1}, + {741, 1}, + {741, 1}, + {489, 0}, {489, 1}, + {664, 0}, + {746, 2}, + {746, 5}, + {668, 1}, + {668, 1}, + {668, 1}, + {667, 2}, + {667, 3}, + {667, 2}, + {667, 5}, + {667, 3}, + {493, 1}, + {478, 1}, + {473, 3}, + {473, 3}, + {473, 3}, + {473, 3}, + {473, 2}, + {473, 3}, + {473, 3}, + {473, 3}, + {473, 1}, + {694, 1}, + {694, 1}, + {475, 1}, + {475, 1}, {474, 1}, - {469, 3}, - {469, 3}, - {469, 3}, - {469, 3}, - {469, 2}, - {469, 3}, - {469, 3}, - {469, 3}, - {469, 1}, - {690, 1}, - {690, 1}, - {471, 1}, + {474, 1}, + {509, 1}, + {509, 3}, + {821, 1}, + {821, 3}, + {565, 0}, + {565, 1}, + {675, 0}, + {675, 1}, + {674, 1}, + {472, 3}, + {472, 3}, + {472, 4}, + {472, 5}, + {472, 1}, + {776, 1}, + {776, 1}, + {776, 1}, + {776, 1}, + {776, 1}, + {776, 1}, + {776, 1}, + {776, 1}, + {764, 1}, + {764, 2}, + {811, 1}, + {811, 2}, + {808, 1}, + {808, 2}, + {814, 1}, + {814, 2}, + {850, 1}, + {850, 2}, + {761, 1}, + {761, 1}, + {761, 1}, + {471, 5}, + {471, 3}, + {471, 5}, + {471, 4}, + {471, 3}, {471, 1}, - {470, 1}, - {470, 1}, - {505, 1}, - {505, 3}, - {817, 1}, - {817, 3}, - {561, 0}, - {561, 1}, + {718, 1}, + {718, 1}, + {813, 0}, + {813, 2}, + {669, 1}, + {669, 3}, + {669, 5}, + {669, 2}, + {669, 5}, {671, 0}, {671, 1}, {670, 1}, - {468, 3}, - {468, 3}, - {468, 4}, - {468, 5}, - {468, 1}, - {772, 1}, - {772, 1}, - {772, 1}, - {772, 1}, - {772, 1}, - {772, 1}, - {772, 1}, - {772, 1}, - {760, 1}, - {760, 2}, - {807, 1}, - {807, 2}, - {804, 1}, - {804, 2}, - {810, 1}, - {810, 2}, - {846, 1}, - {846, 2}, - {757, 1}, - {757, 1}, - {757, 1}, - {467, 5}, - {467, 3}, - {467, 5}, - {467, 4}, - {467, 3}, - {467, 1}, - {714, 1}, - {714, 1}, - {809, 0}, - {809, 2}, - {665, 1}, - {665, 3}, - {665, 5}, - {665, 2}, - {665, 5}, - {667, 0}, - {667, 1}, - {666, 1}, - {666, 2}, - {666, 1}, - {666, 2}, - {790, 1}, - {790, 3}, - {799, 3}, - {801, 0}, - {801, 2}, - {603, 0}, - {603, 2}, - {564, 0}, - {564, 3}, - {579, 0}, - {579, 1}, - {565, 0}, - {565, 1}, - {567, 0}, - {567, 2}, - {566, 3}, - {566, 1}, - {566, 2}, - {520, 2}, - {520, 2}, - {581, 0}, + {670, 2}, + {670, 1}, + {670, 2}, + {794, 1}, + {794, 3}, + {803, 4}, + {805, 0}, + {805, 2}, + {904, 0}, + {904, 2}, + {606, 0}, + {606, 2}, + {568, 0}, + {568, 3}, + {583, 0}, + {583, 1}, + {569, 0}, + {569, 1}, + {571, 0}, + {571, 2}, + {570, 3}, + {570, 1}, + {570, 2}, + {525, 2}, + {525, 2}, + {585, 0}, + {585, 1}, + {393, 1}, + {393, 1}, + {393, 1}, + {393, 1}, + {396, 1}, + {396, 1}, + {396, 1}, + {396, 1}, + {396, 1}, + {396, 1}, + {396, 1}, + {396, 1}, + {396, 1}, + {396, 1}, + {396, 1}, + {396, 1}, + {396, 1}, + {396, 1}, + {396, 1}, + {396, 1}, + {396, 1}, + {396, 1}, + {396, 1}, + {396, 1}, + {396, 1}, + {396, 1}, + {396, 1}, + {396, 1}, + {396, 1}, + {396, 1}, + {396, 1}, + {396, 1}, + {396, 1}, + {396, 1}, + {396, 1}, + {396, 1}, + {396, 1}, + {396, 1}, + {396, 1}, + {396, 1}, + {396, 1}, + {396, 1}, + {396, 1}, + {396, 1}, + {396, 1}, + {396, 1}, + {396, 1}, + {396, 1}, + {396, 1}, + {396, 1}, + {396, 1}, + {396, 1}, + {396, 1}, + {396, 1}, + {396, 1}, + {396, 1}, + {396, 1}, + {396, 1}, + {396, 1}, + {396, 1}, + {396, 1}, + {396, 1}, + {396, 1}, + {396, 1}, + {396, 1}, + {396, 1}, + {396, 1}, + {396, 1}, + {396, 1}, + {396, 1}, + {396, 1}, + {396, 1}, + {396, 1}, + {396, 1}, + {396, 1}, + {396, 1}, + {396, 1}, + {396, 1}, + {396, 1}, + {396, 1}, + {396, 1}, + {396, 1}, + {396, 1}, + {396, 1}, + {396, 1}, + {396, 1}, + {396, 1}, + {396, 1}, + {396, 1}, + {396, 1}, + {396, 1}, + {396, 1}, + {396, 1}, + {396, 1}, + {396, 1}, + {396, 1}, + {396, 1}, + {396, 1}, + {396, 1}, + {396, 1}, + {396, 1}, + {396, 1}, + {396, 1}, + {396, 1}, + {396, 1}, + {396, 1}, + {396, 1}, + {396, 1}, + {396, 1}, + {396, 1}, + {396, 1}, + {396, 1}, + {396, 1}, + {396, 1}, + {396, 1}, + {396, 1}, + {396, 1}, + {396, 1}, + {396, 1}, + {396, 1}, + {396, 1}, + {396, 1}, + {396, 1}, + {396, 1}, + {396, 1}, + {396, 1}, + {396, 1}, + {396, 1}, + {396, 1}, + {396, 1}, + {396, 1}, + {396, 1}, + {396, 1}, + {396, 1}, + {396, 1}, + {396, 1}, + {396, 1}, + {396, 1}, + {396, 1}, + {396, 1}, + {396, 1}, + {396, 1}, + {396, 1}, + {396, 1}, + {396, 1}, + {396, 1}, + {396, 1}, + {396, 1}, + {396, 1}, + {396, 1}, + {396, 1}, + {396, 1}, + {396, 1}, + {396, 1}, + {396, 1}, + {396, 1}, + {396, 1}, + {396, 1}, + {396, 1}, + {396, 1}, + {396, 1}, + {396, 1}, + {396, 1}, + {396, 1}, + {396, 1}, + {396, 1}, + {396, 1}, + {396, 1}, + {396, 1}, + {396, 1}, + {396, 1}, + {396, 1}, + {396, 1}, + {396, 1}, + {396, 1}, + {396, 1}, + {395, 1}, + {395, 1}, + {395, 1}, + {395, 1}, + {395, 1}, + {395, 1}, + {395, 1}, + {395, 1}, + {395, 1}, + {395, 1}, + {395, 1}, + {395, 1}, + {395, 1}, + {395, 1}, + {395, 1}, + {395, 1}, + {395, 1}, + {395, 1}, + {394, 1}, + {394, 1}, + {394, 1}, + {394, 1}, + {394, 1}, + {394, 1}, + {394, 1}, + {394, 1}, + {394, 1}, + {394, 1}, + {394, 1}, + {394, 1}, + {394, 1}, + {394, 1}, + {394, 1}, + {394, 1}, + {394, 1}, + {394, 1}, + {394, 1}, + {394, 1}, + {394, 1}, + {394, 1}, + {394, 1}, + {394, 1}, + {394, 1}, + {394, 1}, + {394, 1}, + {394, 1}, + {394, 1}, + {394, 1}, + {394, 1}, + {394, 1}, + {394, 1}, + {394, 1}, + {394, 1}, + {394, 1}, + {394, 1}, + {539, 7}, + {684, 0}, + {684, 1}, + {683, 5}, + {683, 4}, + {683, 6}, + {683, 4}, + {683, 2}, + {683, 3}, + {683, 1}, + {683, 1}, + {683, 2}, + {626, 1}, + {626, 1}, + {751, 1}, + {751, 3}, + {619, 3}, + {883, 0}, + {883, 1}, + {882, 3}, + {882, 1}, + {549, 1}, + {549, 1}, + {639, 3}, + {775, 0}, + {775, 1}, + {775, 3}, + {827, 0}, + {827, 5}, + {540, 5}, + {700, 1}, + {700, 1}, + {700, 1}, + {454, 1}, + {454, 1}, + {454, 1}, + {454, 1}, + {454, 1}, + {454, 1}, + {454, 1}, + {454, 2}, + {454, 1}, + {454, 1}, + {456, 1}, + {456, 2}, + {518, 3}, {581, 1}, - {389, 1}, - {389, 1}, - {389, 1}, - {389, 1}, - {392, 1}, - {392, 1}, - {392, 1}, - {392, 1}, - {392, 1}, - {392, 1}, - {392, 1}, - {392, 1}, - {392, 1}, - {392, 1}, - {392, 1}, - {392, 1}, - {392, 1}, - {392, 1}, - {392, 1}, - {392, 1}, - {392, 1}, - {392, 1}, - {392, 1}, - {392, 1}, - {392, 1}, - {392, 1}, - {392, 1}, - {392, 1}, - {392, 1}, - {392, 1}, - {392, 1}, - {392, 1}, - {392, 1}, - {392, 1}, - {392, 1}, - {392, 1}, - {392, 1}, - {392, 1}, - {392, 1}, - {392, 1}, - {392, 1}, - {392, 1}, - {392, 1}, - {392, 1}, - {392, 1}, - {392, 1}, - {392, 1}, - {392, 1}, - {392, 1}, - {392, 1}, - {392, 1}, - {392, 1}, - {392, 1}, - {392, 1}, - {392, 1}, - {392, 1}, - {392, 1}, - {392, 1}, - {392, 1}, - {392, 1}, - {392, 1}, - {392, 1}, - {392, 1}, - {392, 1}, - {392, 1}, - {392, 1}, - {392, 1}, - {392, 1}, - {392, 1}, - {392, 1}, - {392, 1}, - {392, 1}, - {392, 1}, - {392, 1}, - {392, 1}, - {392, 1}, - {392, 1}, - {392, 1}, - {392, 1}, - {392, 1}, - {392, 1}, - {392, 1}, - {392, 1}, - {392, 1}, - {392, 1}, - {392, 1}, - {392, 1}, - {392, 1}, - {392, 1}, - {392, 1}, - {392, 1}, - {392, 1}, - {392, 1}, - {392, 1}, - {392, 1}, - {392, 1}, - {392, 1}, - {392, 1}, - {392, 1}, - {392, 1}, - {392, 1}, - {392, 1}, - {392, 1}, - {392, 1}, - {392, 1}, - {392, 1}, - {392, 1}, - {392, 1}, - {392, 1}, - {392, 1}, - {392, 1}, - {392, 1}, - {392, 1}, - {392, 1}, - {392, 1}, - {392, 1}, - {392, 1}, - {392, 1}, - {392, 1}, - {392, 1}, - {392, 1}, - {392, 1}, - {392, 1}, - {392, 1}, - {392, 1}, - {392, 1}, - {392, 1}, - {392, 1}, - {392, 1}, - {392, 1}, - {392, 1}, - {392, 1}, - {392, 1}, - {392, 1}, - {392, 1}, - {392, 1}, - {392, 1}, - {392, 1}, - {392, 1}, - {392, 1}, - {392, 1}, - {392, 1}, - {392, 1}, - {392, 1}, - {392, 1}, - {392, 1}, - {392, 1}, - {392, 1}, - {392, 1}, - {392, 1}, - {392, 1}, - {392, 1}, - {392, 1}, - {392, 1}, - {392, 1}, - {392, 1}, - {392, 1}, - {392, 1}, - {392, 1}, - {392, 1}, - {392, 1}, - {392, 1}, - {392, 1}, - {392, 1}, - {392, 1}, - {392, 1}, - {392, 1}, - {392, 1}, - {392, 1}, - {392, 1}, - {392, 1}, - {392, 1}, - {391, 1}, - {391, 1}, - {391, 1}, - {391, 1}, - {391, 1}, - {391, 1}, - {391, 1}, - {391, 1}, - {391, 1}, - {391, 1}, - {391, 1}, - {391, 1}, - {391, 1}, - {391, 1}, - {391, 1}, - {391, 1}, - {391, 1}, - {391, 1}, - {390, 1}, - {390, 1}, - {390, 1}, - {390, 1}, - {390, 1}, - {390, 1}, - {390, 1}, - {390, 1}, - {390, 1}, - {390, 1}, - {390, 1}, - {390, 1}, - {390, 1}, - {390, 1}, - {390, 1}, - {390, 1}, - {390, 1}, - {390, 1}, - {390, 1}, - {390, 1}, - {390, 1}, - {390, 1}, - {390, 1}, - {390, 1}, - {390, 1}, - {390, 1}, - {390, 1}, - {390, 1}, - {390, 1}, - {390, 1}, - {390, 1}, - {390, 1}, - {390, 1}, - {390, 1}, - {390, 1}, - {390, 1}, - {390, 1}, - {535, 7}, - {680, 0}, - {680, 1}, - {679, 5}, - {679, 4}, - {679, 6}, - {679, 4}, - {679, 2}, - {679, 3}, - {679, 1}, - {679, 1}, - {679, 2}, - {622, 1}, - {622, 1}, - {747, 1}, - {747, 3}, - {616, 3}, - {879, 0}, - {879, 1}, - {878, 3}, - {878, 1}, - {545, 1}, - {545, 1}, - {635, 3}, - {771, 0}, - {771, 1}, - {771, 3}, - {823, 0}, - {823, 5}, - {536, 5}, - {696, 1}, - {696, 1}, - {696, 1}, - {450, 1}, - {450, 1}, - {450, 1}, - {450, 1}, - {450, 1}, - {450, 1}, - {450, 1}, - {450, 2}, - {450, 1}, - {450, 1}, - {452, 1}, - {452, 2}, - {514, 3}, - {577, 1}, - {577, 3}, - {557, 2}, - {704, 0}, - {704, 1}, - {704, 1}, + {581, 3}, + {561, 2}, + {708, 0}, + {708, 1}, + {708, 1}, + {519, 0}, + {519, 1}, + {470, 3}, + {470, 3}, + {470, 3}, + {470, 3}, + {470, 3}, + {470, 3}, + {470, 5}, + {470, 5}, + {470, 3}, + {470, 3}, + {470, 3}, + {470, 3}, + {470, 3}, + {470, 3}, + {470, 1}, + {455, 1}, + {455, 3}, + {455, 4}, + {455, 5}, + {465, 1}, + {465, 1}, + {465, 1}, + {465, 1}, + {465, 3}, + {465, 1}, + {465, 1}, + {465, 1}, + {465, 1}, + {465, 1}, + {465, 2}, + {465, 2}, + {465, 2}, + {465, 2}, + {465, 3}, + {465, 2}, + {465, 1}, + {465, 3}, + {465, 5}, + {465, 6}, + {465, 2}, + {465, 2}, + {465, 6}, + {465, 5}, + {465, 6}, + {465, 6}, + {465, 4}, + {465, 4}, + {465, 3}, + {465, 3}, + {513, 1}, + {513, 1}, + {514, 1}, + {514, 1}, {515, 0}, {515, 1}, - {466, 3}, - {466, 3}, - {466, 3}, - {466, 3}, - {466, 3}, - {466, 3}, - {466, 5}, - {466, 5}, - {466, 3}, - {466, 3}, - {466, 3}, - {466, 3}, - {466, 3}, - {466, 3}, - {466, 1}, - {451, 1}, - {451, 3}, - {451, 4}, - {451, 5}, - {461, 1}, - {461, 1}, - {461, 1}, - {461, 1}, - {461, 3}, - {461, 1}, - {461, 1}, - {461, 1}, - {461, 1}, - {461, 1}, - {461, 2}, - {461, 2}, - {461, 2}, - {461, 2}, - {461, 3}, - {461, 2}, - {461, 1}, - {461, 3}, - {461, 5}, - {461, 6}, - {461, 2}, - {461, 2}, - {461, 6}, - {461, 5}, - {461, 6}, - {461, 6}, - {461, 4}, - {461, 4}, - {461, 3}, - {461, 3}, - {509, 1}, - {509, 1}, - {510, 1}, - {510, 1}, - {511, 0}, - {511, 1}, - {780, 0}, - {780, 1}, - {519, 1}, - {519, 2}, - {456, 1}, - {456, 1}, - {456, 1}, - {456, 1}, - {456, 1}, - {456, 1}, - {456, 1}, - {456, 1}, - {456, 1}, - {456, 1}, - {456, 1}, - {456, 1}, - {456, 1}, - {456, 1}, - {456, 1}, - {456, 1}, - {456, 1}, - {456, 1}, - {456, 1}, - {456, 1}, - {456, 1}, - {456, 1}, - {456, 1}, - {456, 1}, - {456, 1}, - {456, 1}, - {456, 1}, - {456, 1}, - {456, 1}, - {701, 0}, - {701, 2}, + {784, 0}, + {784, 1}, + {523, 1}, + {523, 2}, {460, 1}, {460, 1}, {460, 1}, - {459, 1}, - {459, 1}, - {459, 1}, - {459, 1}, - {459, 1}, - {459, 1}, - {454, 4}, - {454, 4}, - {454, 2}, - {454, 3}, - {454, 2}, - {454, 4}, - {454, 6}, - {454, 2}, - {454, 2}, - {454, 2}, - {454, 4}, - {454, 6}, - {454, 4}, - {454, 4}, - {455, 4}, - {455, 4}, - {455, 6}, - {455, 8}, - {455, 8}, - {455, 6}, - {455, 6}, - {455, 6}, - {455, 6}, - {455, 6}, - {455, 8}, - {455, 8}, - {455, 8}, - {455, 8}, - {455, 4}, - {455, 6}, - {455, 6}, - {455, 7}, - {798, 1}, - {798, 1}, - {798, 1}, - {798, 1}, - {457, 1}, - {457, 1}, - {458, 1}, - {458, 1}, - {874, 1}, - {874, 1}, - {874, 1}, - {462, 6}, - {462, 5}, - {462, 6}, - {462, 5}, - {462, 6}, - {462, 5}, - {462, 6}, - {462, 5}, - {462, 6}, - {462, 5}, - {462, 5}, - {462, 7}, - {462, 6}, - {462, 6}, - {462, 6}, - {462, 6}, - {462, 6}, - {462, 6}, - {462, 6}, - {829, 0}, - {829, 2}, - {453, 4}, - {797, 0}, - {797, 2}, - {797, 3}, - {539, 1}, - {539, 1}, - {539, 1}, - {539, 1}, - {539, 1}, - {539, 1}, - {539, 1}, - {539, 1}, - {539, 1}, - {539, 1}, - {539, 1}, - {539, 1}, - {539, 1}, - {539, 1}, - {539, 1}, - {539, 1}, - {539, 1}, - {539, 1}, - {539, 1}, - {539, 1}, - {740, 1}, - {740, 1}, - {740, 1}, - {740, 1}, - {740, 1}, - {740, 1}, - {740, 1}, - {740, 1}, - {740, 1}, - {789, 0}, - {789, 1}, - {890, 1}, - {890, 2}, - {749, 4}, - {784, 0}, - {784, 2}, - {632, 2}, - {632, 3}, - {632, 1}, - {632, 2}, - {632, 2}, - {632, 2}, - {632, 2}, - {632, 2}, - {632, 1}, - {570, 0}, - {570, 1}, - {570, 1}, - {570, 1}, - {472, 1}, - {472, 3}, - {472, 3}, - {518, 1}, - {518, 3}, - {845, 0}, - {845, 1}, - {709, 4}, - {843, 1}, - {843, 1}, - {661, 2}, - {661, 4}, - {877, 1}, - {877, 3}, - {648, 3}, - {649, 1}, - {649, 1}, - {720, 1}, - {720, 2}, - {720, 5}, - {720, 4}, - {720, 4}, - {720, 3}, - {721, 2}, - {721, 3}, - {482, 3}, - {483, 3}, - {484, 7}, - {481, 4}, - {481, 4}, - {481, 4}, - {669, 2}, - {891, 0}, - {891, 2}, - {892, 1}, - {892, 3}, - {750, 3}, - {591, 1}, - {752, 3}, - {897, 4}, - {826, 0}, - {826, 1}, - {830, 0}, - {830, 3}, + {460, 1}, + {460, 1}, + {460, 1}, + {460, 1}, + {460, 1}, + {460, 1}, + {460, 1}, + {460, 1}, + {460, 1}, + {460, 1}, + {460, 1}, + {460, 1}, + {460, 1}, + {460, 1}, + {460, 1}, + {460, 1}, + {460, 1}, + {460, 1}, + {460, 1}, + {460, 1}, + {460, 1}, + {460, 1}, + {460, 1}, + {460, 1}, + {460, 1}, + {460, 1}, + {705, 0}, + {705, 2}, + {464, 1}, + {464, 1}, + {464, 1}, + {463, 1}, + {463, 1}, + {463, 1}, + {463, 1}, + {463, 1}, + {463, 1}, + {458, 4}, + {458, 4}, + {458, 2}, + {458, 3}, + {458, 2}, + {458, 4}, + {458, 6}, + {458, 2}, + {458, 2}, + {458, 2}, + {458, 4}, + {458, 6}, + {458, 4}, + {458, 4}, + {459, 4}, + {459, 4}, + {459, 6}, + {459, 8}, + {459, 8}, + {459, 6}, + {459, 6}, + {459, 6}, + {459, 6}, + {459, 6}, + {459, 8}, + {459, 8}, + {459, 8}, + {459, 8}, + {459, 4}, + {459, 6}, + {459, 6}, + {459, 7}, + {802, 1}, + {802, 1}, + {802, 1}, + {802, 1}, + {461, 1}, + {461, 1}, + {462, 1}, + {462, 1}, + {878, 1}, + {878, 1}, + {878, 1}, + {466, 6}, + {466, 5}, + {466, 6}, + {466, 5}, + {466, 6}, + {466, 5}, + {466, 6}, + {466, 5}, + {466, 6}, + {466, 5}, + {466, 5}, + {466, 7}, + {466, 6}, + {466, 6}, + {466, 6}, + {466, 6}, + {466, 6}, + {466, 6}, + {466, 6}, {833, 0}, - {833, 3}, - {832, 0}, - {832, 2}, - {895, 1}, - {895, 1}, - {895, 1}, - {894, 1}, + {833, 2}, + {457, 4}, + {801, 0}, + {801, 2}, + {801, 3}, + {543, 1}, + {543, 1}, + {543, 1}, + {543, 1}, + {543, 1}, + {543, 1}, + {543, 1}, + {543, 1}, + {543, 1}, + {543, 1}, + {543, 1}, + {543, 1}, + {543, 1}, + {543, 1}, + {543, 1}, + {543, 1}, + {543, 1}, + {543, 1}, + {543, 1}, + {543, 1}, + {744, 1}, + {744, 1}, + {744, 1}, + {744, 1}, + {744, 1}, + {744, 1}, + {744, 1}, + {744, 1}, + {744, 1}, + {793, 0}, + {793, 1}, {894, 1}, - {623, 2}, - {623, 2}, - {623, 2}, - {623, 4}, - {623, 2}, - {893, 4}, - {751, 1}, - {751, 2}, - {751, 2}, - {751, 2}, - {751, 4}, - {492, 0}, - {492, 1}, - {480, 2}, - {896, 1}, - {896, 1}, - {465, 4}, - {465, 4}, - {465, 4}, - {465, 4}, - {465, 4}, - {465, 5}, - {465, 7}, - {465, 7}, - {465, 6}, - {465, 6}, - {465, 9}, - {702, 0}, - {702, 3}, - {702, 3}, - {703, 0}, - {703, 2}, - {569, 0}, - {569, 2}, - {569, 2}, - {827, 0}, - {827, 2}, - {827, 2}, - {870, 1}, - {555, 1}, - {555, 3}, - {533, 1}, - {533, 4}, - {508, 1}, - {508, 1}, - {507, 4}, - {507, 4}, - {507, 4}, - {507, 3}, - {839, 0}, - {839, 4}, - {864, 0}, - {864, 1}, - {588, 1}, - {588, 2}, - {605, 2}, - {605, 2}, - {605, 2}, - {803, 0}, - {803, 2}, - {803, 3}, - {803, 3}, - {604, 5}, - {580, 0}, - {580, 1}, - {580, 3}, - {580, 1}, - {677, 1}, - {677, 2}, - {678, 0}, - {678, 1}, - {506, 3}, - {506, 5}, - {506, 7}, - {506, 7}, - {506, 9}, - {506, 4}, - {506, 6}, - {506, 3}, - {506, 5}, - {521, 1}, - {521, 1}, - {705, 0}, - {705, 1}, - {524, 1}, - {524, 2}, - {524, 2}, - {685, 0}, - {685, 2}, - {582, 1}, - {582, 1}, - {538, 0}, - {538, 2}, - {538, 4}, - {538, 4}, - {851, 6}, - {617, 0}, - {617, 3}, - {617, 3}, - {602, 1}, - {602, 3}, - {869, 1}, - {869, 2}, - {736, 4}, - {736, 4}, - {736, 4}, - {736, 4}, - {848, 0}, - {848, 1}, - {852, 0}, - {852, 1}, - {852, 1}, - {853, 0}, - {853, 1}, - {849, 1}, - {850, 0}, - {850, 1}, - {448, 3}, - {448, 3}, - {551, 0}, - {551, 2}, - {551, 4}, - {491, 7}, - {491, 7}, - {491, 7}, - {491, 8}, - {490, 1}, - {490, 4}, - {488, 1}, - {488, 3}, - {876, 1}, - {725, 2}, - {725, 4}, - {725, 6}, - {725, 4}, - {725, 4}, - {725, 3}, - {724, 3}, - {723, 6}, - {722, 1}, - {722, 1}, - {722, 1}, - {854, 3}, - {854, 1}, - {854, 1}, - {619, 1}, - {619, 3}, - {589, 3}, - {589, 2}, - {589, 2}, - {806, 2}, - {806, 2}, - {806, 2}, - {806, 1}, - {587, 1}, - {587, 1}, - {748, 3}, - {748, 4}, - {748, 4}, - {748, 4}, - {748, 3}, - {748, 3}, - {748, 3}, - {748, 2}, - {748, 4}, - {748, 4}, - {748, 2}, - {522, 1}, + {894, 2}, + {753, 4}, + {788, 0}, + {788, 2}, + {636, 2}, + {636, 3}, + {636, 1}, + {636, 2}, + {636, 2}, + {636, 2}, + {636, 2}, + {636, 2}, + {636, 1}, + {574, 0}, + {574, 1}, + {574, 1}, + {574, 1}, + {476, 1}, + {476, 3}, + {476, 3}, {522, 1}, - {881, 0}, + {522, 3}, + {849, 0}, + {849, 1}, + {713, 4}, + {847, 1}, + {847, 1}, + {665, 2}, + {665, 4}, {881, 1}, {881, 3}, - {464, 1}, - {464, 1}, - {463, 1}, - {449, 1}, - {501, 1}, - {501, 3}, - {501, 2}, - {501, 2}, - {573, 1}, - {573, 3}, - {708, 1}, - {708, 4}, - {576, 1}, - {517, 1}, - {517, 1}, - {516, 1}, - {516, 3}, - {516, 2}, - {537, 1}, - {537, 3}, - {624, 3}, - {624, 4}, - {624, 5}, - {624, 4}, - {624, 4}, - {624, 5}, - {624, 5}, - {624, 6}, - {624, 4}, - {624, 5}, - {624, 5}, - {624, 6}, - {624, 4}, - {624, 5}, - {624, 6}, - {624, 4}, - {754, 2}, - {754, 2}, - {754, 3}, + {652, 3}, + {653, 1}, + {653, 1}, + {724, 1}, + {724, 2}, + {724, 5}, + {724, 4}, + {724, 4}, + {724, 3}, + {725, 2}, + {725, 3}, + {486, 3}, + {487, 3}, + {488, 7}, + {485, 4}, + {485, 4}, + {485, 4}, + {673, 2}, + {895, 0}, + {895, 2}, + {896, 1}, + {896, 3}, {754, 3}, - {800, 1}, - {800, 3}, - {675, 5}, - {694, 1}, - {694, 3}, - {726, 3}, - {726, 4}, - {726, 4}, - {726, 5}, - {726, 4}, - {726, 2}, - {726, 4}, - {726, 3}, - {726, 3}, - {726, 3}, - {726, 3}, - {726, 3}, - {726, 3}, - {726, 2}, - {726, 2}, - {855, 1}, - {855, 1}, - {855, 1}, + {594, 1}, + {756, 3}, + {901, 4}, + {830, 0}, + {830, 1}, + {834, 0}, + {834, 3}, + {837, 0}, + {837, 3}, + {836, 0}, + {836, 2}, + {899, 1}, + {899, 1}, + {899, 1}, + {898, 1}, + {898, 1}, + {627, 2}, + {627, 2}, + {627, 2}, + {627, 4}, + {627, 2}, + {897, 4}, + {755, 1}, + {755, 2}, + {755, 2}, + {755, 2}, + {755, 4}, + {496, 0}, + {496, 1}, + {484, 2}, + {900, 1}, + {900, 1}, + {469, 4}, + {469, 4}, + {469, 4}, + {469, 4}, + {469, 4}, + {469, 5}, + {469, 7}, + {469, 7}, + {469, 6}, + {469, 6}, + {469, 9}, + {706, 0}, + {706, 3}, + {706, 3}, + {707, 0}, + {707, 2}, + {573, 0}, + {573, 2}, + {573, 2}, + {831, 0}, + {831, 2}, + {831, 2}, + {874, 1}, + {559, 1}, + {559, 3}, + {537, 1}, + {537, 4}, {512, 1}, {512, 1}, - {856, 1}, - {856, 1}, - {856, 1}, - {856, 3}, - {856, 3}, - {856, 3}, - {856, 5}, - {856, 4}, - {856, 4}, - {856, 1}, - {856, 1}, - {856, 2}, - {856, 2}, - {856, 2}, - {856, 1}, - {856, 2}, - {856, 2}, - {856, 2}, - {856, 2}, - {856, 2}, - {856, 2}, - {856, 1}, - {572, 0}, - {572, 2}, - {572, 2}, - {600, 0}, - {600, 1}, - {600, 1}, - {828, 0}, - {828, 1}, - {553, 0}, - {553, 2}, - {727, 2}, - {668, 3}, - {841, 1}, - {841, 3}, - {796, 1}, - {796, 1}, - {796, 3}, - {796, 3}, - {820, 0}, - {820, 1}, - {820, 1}, + {511, 4}, + {511, 2}, + {511, 3}, + {843, 0}, + {843, 4}, {868, 0}, {868, 1}, - {899, 0}, - {899, 3}, - {729, 1}, - {729, 1}, - {729, 1}, - {729, 1}, - {729, 1}, - {729, 1}, - {729, 1}, - {729, 1}, - {729, 1}, - {729, 1}, - {729, 1}, - {729, 1}, - {729, 1}, - {729, 1}, - {729, 1}, - {729, 1}, - {729, 1}, - {729, 1}, - {729, 1}, - {729, 1}, - {729, 1}, - {729, 1}, - {729, 1}, - {729, 1}, - {729, 1}, - {729, 1}, - {729, 1}, - {729, 1}, - {729, 1}, - {729, 1}, - {729, 1}, - {729, 1}, - {729, 1}, - {729, 1}, - {729, 1}, - {729, 1}, - {729, 1}, - {729, 1}, - {729, 1}, - {729, 1}, - {729, 1}, - {729, 1}, - {729, 1}, - {729, 1}, - {729, 1}, - {729, 1}, - {729, 1}, - {729, 1}, - {729, 1}, - {729, 1}, - {729, 1}, - {729, 1}, - {729, 1}, - {729, 1}, - {729, 1}, - {741, 1}, - {741, 1}, - {741, 1}, - {741, 1}, - {741, 1}, - {741, 1}, - {598, 1}, - {598, 1}, - {598, 1}, - {598, 1}, - {598, 1}, - {598, 1}, + {620, 1}, + {620, 2}, + {608, 2}, + {608, 2}, + {608, 2}, + {807, 0}, + {807, 2}, + {807, 3}, + {807, 3}, + {607, 5}, + {584, 0}, + {584, 1}, + {584, 3}, + {584, 1}, + {681, 1}, + {681, 2}, + {682, 0}, + {682, 1}, + {510, 3}, + {510, 5}, + {510, 7}, + {510, 7}, + {510, 9}, + {510, 4}, + {510, 6}, + {510, 3}, + {510, 5}, + {526, 1}, + {526, 1}, + {709, 0}, + {709, 1}, + {529, 1}, + {529, 2}, + {529, 2}, + {689, 0}, + {689, 2}, + {586, 1}, + {586, 1}, + {542, 0}, + {542, 2}, + {542, 4}, + {542, 4}, + {855, 6}, + {621, 0}, + {621, 3}, + {621, 3}, + {605, 1}, + {605, 3}, + {873, 1}, + {873, 2}, + {740, 4}, + {740, 4}, + {740, 4}, + {740, 4}, + {740, 1}, + {852, 0}, + {852, 1}, + {856, 0}, + {856, 1}, + {856, 1}, + {857, 0}, + {857, 1}, + {853, 1}, + {854, 0}, + {854, 1}, + {452, 3}, + {452, 3}, + {452, 3}, + {555, 0}, + {555, 2}, + {555, 2}, + {555, 3}, + {555, 3}, + {555, 4}, + {555, 4}, + {555, 4}, + {495, 7}, + {495, 7}, + {495, 7}, + {495, 8}, + {494, 1}, + {494, 4}, + {492, 1}, + {492, 3}, + {880, 1}, + {729, 2}, + {729, 4}, + {729, 6}, + {729, 4}, + {729, 4}, + {729, 3}, + {728, 3}, + {727, 6}, + {726, 1}, + {726, 1}, + {726, 1}, + {858, 3}, + {858, 1}, + {858, 1}, + {623, 1}, + {623, 3}, + {592, 3}, + {592, 2}, + {592, 2}, + {810, 2}, + {810, 2}, + {810, 2}, + {810, 1}, + {591, 1}, + {591, 1}, + {591, 1}, + {752, 3}, + {752, 4}, + {752, 4}, + {752, 4}, + {752, 3}, + {752, 3}, + {752, 3}, + {752, 2}, + {752, 4}, + {752, 4}, + {752, 2}, + {527, 1}, + {527, 1}, + {885, 0}, + {885, 1}, + {885, 3}, + {468, 1}, + {468, 1}, + {467, 1}, + {453, 1}, + {505, 1}, + {505, 3}, + {505, 2}, + {505, 2}, + {577, 1}, + {577, 3}, + {712, 1}, + {712, 4}, + {580, 1}, + {521, 1}, + {521, 1}, + {520, 1}, + {520, 3}, + {520, 2}, + {541, 1}, + {541, 3}, + {628, 3}, + {628, 4}, + {628, 5}, + {628, 4}, + {628, 4}, + {628, 5}, + {628, 5}, + {628, 6}, + {628, 4}, + {628, 5}, + {628, 5}, + {628, 6}, + {628, 4}, + {628, 5}, + {628, 6}, + {628, 4}, + {758, 2}, + {758, 2}, + {758, 3}, + {758, 3}, + {804, 1}, + {804, 3}, + {679, 5}, + {698, 1}, + {698, 3}, + {730, 3}, + {730, 4}, + {730, 4}, + {730, 5}, + {730, 4}, + {730, 2}, + {730, 4}, + {730, 3}, + {730, 3}, + {730, 3}, + {730, 3}, + {730, 3}, + {730, 3}, + {730, 2}, + {730, 2}, + {859, 1}, + {859, 1}, + {859, 1}, + {516, 1}, + {516, 1}, + {860, 1}, {860, 1}, + {860, 1}, + {860, 3}, {860, 3}, - {595, 2}, + {860, 3}, + {860, 5}, + {860, 4}, + {860, 4}, + {860, 1}, + {860, 1}, + {860, 2}, + {860, 2}, + {860, 2}, + {860, 1}, + {860, 2}, + {860, 2}, + {860, 2}, + {860, 2}, + {860, 2}, + {860, 2}, + {860, 1}, + {576, 0}, + {576, 2}, + {576, 2}, + {603, 0}, + {603, 1}, + {603, 1}, + {832, 0}, + {832, 1}, + {557, 0}, + {557, 2}, + {731, 2}, + {672, 3}, + {845, 1}, + {845, 3}, + {800, 1}, + {800, 1}, + {800, 3}, + {800, 3}, + {824, 0}, + {824, 1}, + {824, 1}, + {872, 0}, + {872, 1}, + {903, 0}, + {903, 3}, + {733, 1}, + {733, 1}, + {733, 1}, + {733, 1}, + {733, 1}, + {733, 1}, + {733, 1}, + {733, 1}, + {733, 1}, + {733, 1}, + {733, 1}, + {733, 1}, + {733, 1}, + {733, 1}, + {733, 1}, + {733, 1}, + {733, 1}, + {733, 1}, + {733, 1}, + {733, 1}, + {733, 1}, + {733, 1}, + {733, 1}, + {733, 1}, + {733, 1}, + {733, 1}, + {733, 1}, + {733, 1}, + {733, 1}, + {733, 1}, + {733, 1}, + {733, 1}, + {733, 1}, + {733, 1}, + {733, 1}, + {733, 1}, + {733, 1}, + {733, 1}, + {733, 1}, + {733, 1}, + {733, 1}, + {733, 1}, + {733, 1}, + {733, 1}, + {733, 1}, + {733, 1}, + {733, 1}, + {733, 1}, + {733, 1}, + {733, 1}, + {733, 1}, + {733, 1}, + {733, 1}, + {733, 1}, + {733, 1}, + {745, 1}, + {745, 1}, + {745, 1}, + {745, 1}, + {745, 1}, + {745, 1}, + {601, 1}, + {601, 1}, + {601, 1}, + {601, 1}, + {601, 1}, + {601, 1}, + {864, 1}, + {864, 3}, + {598, 2}, + {738, 1}, + {738, 1}, + {738, 4}, + {869, 1}, + {869, 3}, + {870, 0}, + {870, 3}, + {558, 2}, + {558, 3}, + {558, 4}, + {558, 4}, + {558, 3}, + {558, 3}, + {558, 3}, + {558, 3}, + {558, 3}, + {558, 3}, + {558, 3}, + {558, 3}, + {558, 3}, + {558, 3}, + {558, 3}, + {558, 1}, + {558, 3}, + {558, 3}, + {558, 3}, {734, 1}, {734, 1}, - {734, 4}, - {865, 1}, - {865, 3}, - {866, 0}, - {866, 3}, - {554, 2}, - {554, 3}, - {554, 4}, - {554, 4}, - {554, 3}, - {554, 3}, - {554, 3}, - {554, 3}, - {554, 3}, - {554, 3}, - {554, 3}, - {554, 3}, + {629, 0}, + {629, 1}, + {779, 0}, + {779, 1}, + {622, 1}, + {622, 2}, + {622, 3}, + {835, 0}, + {835, 1}, + {747, 3}, {554, 3}, {554, 3}, {554, 3}, - {554, 1}, {554, 3}, {554, 3}, {554, 3}, - {730, 1}, - {730, 1}, - {625, 0}, - {625, 1}, - {775, 0}, - {775, 1}, - {618, 1}, - {618, 2}, - {618, 3}, - {831, 0}, - {831, 1}, - {743, 3}, - {550, 3}, - {550, 3}, - {550, 3}, - {550, 3}, - {550, 3}, - {550, 3}, - {875, 1}, - {875, 1}, - {875, 1}, - {821, 3}, - {821, 2}, - {821, 3}, - {821, 3}, - {821, 2}, - {805, 1}, - {805, 1}, - {805, 1}, - {805, 1}, - {805, 1}, - {805, 1}, - {805, 1}, - {805, 1}, - {805, 1}, - {805, 1}, - {805, 1}, - {763, 1}, - {763, 1}, - {700, 0}, - {700, 1}, - {700, 1}, - {794, 1}, - {794, 1}, - {795, 1}, - {795, 1}, - {795, 1}, - {795, 2}, - {761, 1}, - {862, 5}, - {862, 4}, - {862, 5}, - {862, 4}, - {862, 2}, - {862, 2}, - {862, 1}, - {862, 3}, - {862, 6}, - {862, 6}, - {862, 1}, + {879, 1}, + {879, 1}, + {879, 1}, + {825, 3}, + {825, 2}, + {825, 3}, + {825, 3}, + {825, 2}, + {809, 1}, + {809, 1}, + {809, 1}, + {809, 1}, + {809, 1}, + {809, 1}, + {809, 1}, + {809, 1}, + {809, 1}, + {809, 1}, + {809, 1}, + {767, 1}, + {767, 1}, + {704, 0}, + {704, 1}, + {704, 1}, + {798, 1}, + {798, 1}, + {799, 1}, + {799, 1}, + {799, 1}, + {799, 2}, + {765, 1}, + {866, 5}, + {866, 4}, + {866, 5}, + {866, 4}, + {866, 2}, + {866, 2}, + {866, 1}, + {866, 3}, + {866, 6}, + {866, 6}, + {866, 1}, + {822, 0}, + {822, 1}, + {884, 2}, + {884, 1}, + {884, 1}, + {766, 1}, + {766, 2}, + {766, 1}, + {766, 1}, + {876, 1}, + {876, 2}, + {876, 1}, + {876, 1}, + {876, 2}, + {783, 1}, + {783, 2}, + {783, 2}, + {783, 2}, + {783, 3}, + {491, 3}, + {507, 0}, + {507, 1}, + {566, 1}, + {566, 1}, + {566, 1}, + {567, 0}, + {567, 2}, + {602, 0}, + {602, 1}, + {602, 1}, + {615, 5}, + {829, 0}, + {829, 1}, + {553, 0}, + {553, 2}, + {553, 3}, + {613, 0}, + {613, 2}, + {502, 2}, + {502, 1}, + {534, 0}, + {534, 2}, + {735, 1}, + {735, 3}, + {477, 1}, + {477, 1}, + {544, 10}, + {544, 8}, + {750, 2}, + {545, 2}, + {546, 0}, + {546, 1}, + {908, 0}, + {908, 1}, + {647, 4}, + {645, 4}, + {632, 4}, + {632, 9}, + {578, 2}, + {593, 1}, + {593, 3}, + {763, 0}, + {763, 3}, + {763, 3}, + {763, 5}, + {763, 5}, + {763, 4}, + {680, 1}, + {723, 1}, + {851, 1}, + {851, 3}, + {642, 7}, + {656, 5}, + {678, 8}, + {677, 4}, + {902, 0}, + {902, 3}, + {902, 3}, + {902, 3}, + {902, 3}, + {902, 3}, + {616, 1}, + {616, 4}, + {715, 1}, + {715, 3}, + {617, 1}, + {617, 2}, + {617, 1}, + {617, 1}, + {617, 2}, + {617, 1}, + {617, 1}, + {617, 1}, + {617, 1}, + {617, 1}, + {617, 1}, + {617, 1}, + {617, 1}, + {617, 1}, + {617, 2}, + {617, 1}, + {617, 2}, + {617, 1}, + {617, 2}, + {617, 2}, + {617, 1}, + {617, 1}, + {617, 3}, + {617, 2}, + {617, 2}, + {617, 2}, + {617, 2}, + {617, 2}, + {617, 2}, + {617, 2}, + {617, 1}, + {699, 0}, + {699, 1}, + {716, 1}, + {716, 3}, + {716, 3}, + {716, 3}, + {716, 1}, + {722, 7}, + {721, 4}, + {691, 13}, + {806, 0}, + {806, 3}, + {769, 0}, + {769, 3}, {818, 0}, {818, 1}, - {880, 2}, - {880, 1}, - {880, 1}, - {762, 1}, - {762, 2}, - {762, 1}, - {762, 1}, - {872, 1}, - {872, 2}, - {872, 1}, - {872, 1}, - {872, 2}, - {779, 1}, - {779, 2}, - {779, 2}, - {779, 2}, - {779, 3}, - {487, 3}, - {503, 0}, - {503, 1}, - {562, 1}, - {562, 1}, - {562, 1}, - {563, 0}, - {563, 2}, - {599, 0}, - {599, 1}, - {599, 1}, - {612, 5}, - {825, 0}, - {825, 1}, - {549, 0}, - {549, 2}, - {549, 3}, - {610, 0}, - {610, 2}, - {498, 2}, - {498, 1}, - {530, 0}, - {530, 2}, - {731, 1}, - {731, 3}, - {473, 1}, - {473, 1}, - {540, 10}, - {540, 8}, - {746, 2}, - {541, 2}, - {542, 0}, - {542, 1}, - {903, 0}, - {903, 1}, - {643, 4}, - {641, 4}, - {628, 4}, - {628, 9}, - {574, 2}, - {590, 1}, - {590, 3}, - {759, 0}, - {759, 3}, - {759, 3}, - {759, 5}, - {759, 5}, - {759, 4}, - {676, 1}, - {719, 1}, - {847, 1}, - {847, 3}, - {638, 7}, - {652, 5}, - {674, 8}, - {673, 4}, - {898, 0}, - {898, 3}, - {898, 3}, - {898, 3}, - {898, 3}, - {898, 3}, - {613, 1}, - {613, 4}, - {711, 1}, - {711, 3}, - {614, 1}, - {614, 2}, - {614, 1}, - {614, 1}, - {614, 2}, - {614, 1}, - {614, 1}, - {614, 1}, - {614, 1}, - {614, 1}, - {614, 1}, - {614, 1}, - {614, 1}, - {614, 1}, - {614, 2}, - {614, 1}, - {614, 2}, - {614, 1}, - {614, 2}, - {614, 2}, - {614, 1}, - {614, 1}, - {614, 3}, - {614, 2}, - {614, 2}, - {614, 2}, - {614, 2}, - {614, 2}, - {614, 2}, - {614, 2}, - {614, 1}, - {695, 0}, - {695, 1}, - {712, 1}, - {712, 3}, - {712, 3}, - {712, 3}, - {712, 1}, - {718, 7}, - {717, 4}, - {687, 13}, - {802, 0}, - {802, 3}, - {765, 0}, - {765, 3}, - {814, 0}, - {814, 1}, + {795, 0}, + {795, 4}, + {796, 1}, + {796, 1}, + {797, 0}, + {797, 3}, + {789, 0}, + {789, 4}, + {789, 3}, {791, 0}, - {791, 4}, - {792, 1}, - {792, 1}, - {793, 0}, - {793, 3}, - {785, 0}, - {785, 4}, - {785, 3}, - {787, 0}, - {787, 3}, - {812, 0}, - {812, 3}, - {858, 0}, - {858, 3}, - {813, 0}, - {813, 3}, - {745, 2}, - {689, 3}, - {738, 1}, - {738, 1}, - {735, 2}, - {816, 1}, - {816, 2}, - {816, 1}, - {867, 1}, - {867, 3}, - {684, 2}, - {684, 3}, - {684, 3}, - {683, 1}, - {683, 2}, + {791, 3}, + {816, 0}, + {816, 3}, + {862, 0}, + {862, 3}, + {817, 0}, + {817, 3}, + {749, 2}, + {693, 3}, + {742, 1}, + {742, 1}, + {739, 2}, + {820, 1}, + {820, 2}, + {820, 1}, + {820, 2}, + {871, 1}, + {871, 3}, + {688, 2}, {688, 3}, + {688, 3}, + {687, 1}, + {687, 2}, + {692, 3}, } yyXErrors = map[yyXError]string{} - yyParseTab = [2651][]uint16{ + yyParseTab = [2666][]uint16{ // 0 - {1261, 1261, 56: 1539, 67: 1613, 69: 1540, 76: 1544, 80: 1555, 1524, 1526, 86: 1527, 90: 1542, 92: 1529, 96: 1557, 105: 1543, 108: 1525, 112: 1532, 228: 1550, 242: 1620, 257: 1554, 267: 1538, 273: 1535, 314: 1537, 394: 1546, 407: 1615, 411: 1531, 413: 1521, 1523, 417: 1522, 448: 1605, 481: 1553, 1547, 1548, 1549, 488: 1552, 490: 1551, 1600, 494: 1614, 502: 1530, 504: 1545, 532: 1567, 535: 1589, 1596, 540: 1608, 543: 1528, 546: 1616, 552: 1556, 624: 1559, 627: 1560, 1561, 1562, 1563, 1564, 637: 1565, 1576, 1570, 1571, 1575, 1572, 1574, 1573, 648: 1566, 1541, 1534, 1577, 1585, 1578, 1579, 1583, 1584, 1580, 1582, 1581, 1558, 1568, 1533, 1569, 1536, 668: 1586, 673: 1588, 1587, 682: 1622, 1621, 1590, 686: 1618, 1591, 1592, 1611, 709: 1593, 715: 1595, 1617, 1598, 1597, 720: 1594, 1599, 723: 1603, 1602, 1601, 1604, 729: 1612, 742: 1606, 1607, 1619, 1610, 1609, 857: 1519, 860: 1520}, - {1518}, - {1517, 4167}, - {59: 4060, 393: 2073, 486: 1168, 579: 4059}, - {486: 4051}, + {1275, 1275, 58: 1553, 68: 1627, 70: 1554, 77: 1558, 81: 1569, 1538, 1540, 87: 1541, 91: 1556, 93: 1543, 97: 1571, 108: 1557, 113: 1539, 117: 1546, 232: 1564, 246: 1634, 262: 1568, 272: 1552, 277: 1549, 318: 1551, 398: 1560, 411: 1629, 415: 1545, 417: 1535, 1537, 421: 1536, 452: 1619, 485: 1567, 1561, 1562, 1563, 492: 1566, 494: 1565, 1614, 498: 1628, 506: 1544, 508: 1559, 536: 1581, 539: 1603, 1610, 544: 1622, 547: 1542, 550: 1630, 556: 1570, 628: 1573, 631: 1574, 1575, 1576, 1577, 1578, 641: 1579, 1590, 1584, 1585, 1589, 1586, 1588, 1587, 652: 1580, 1555, 1548, 1591, 1599, 1592, 1593, 1597, 1598, 1594, 1596, 1595, 1572, 1582, 1547, 1583, 1550, 672: 1600, 677: 1602, 1601, 686: 1636, 1635, 1604, 690: 1632, 1605, 1606, 1625, 713: 1607, 719: 1609, 1631, 1612, 1611, 724: 1608, 1613, 727: 1617, 1616, 1615, 1618, 733: 1626, 746: 1620, 1621, 1633, 1624, 1623, 861: 1533, 864: 1534}, + {1532}, + {1531, 4196}, + {61: 4089, 397: 2092, 490: 1180, 583: 4088}, + {490: 4080}, // 5 - {486: 4035}, - {1444, 1444}, - {180: 4031}, - {230: 4030}, - {1417, 1417, 24: 3334, 246: 3333, 504: 3335, 636: 4029, 753: 4028}, + {490: 4064}, + {1458, 1458}, + {184: 4060}, + {234: 4059}, + {1431, 1431, 24: 3360, 250: 3359, 508: 3361, 640: 4058, 757: 4057}, // 10 - {22: 1303, 39: 1303, 48: 343, 53: 1303, 57: 3527, 59: 3526, 70: 3018, 77: 3019, 248: 3525, 326: 3457, 385: 3521, 401: 1359, 406: 1303, 486: 3523, 600: 3528, 647: 3522, 774: 3520, 834: 3524}, - {2: 1722, 1639, 1673, 1640, 7: 2119, 1727, 1666, 1724, 2124, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 2128, 1651, 2121, 2123, 2137, 2138, 2136, 2132, 2139, 2129, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 2130, 1760, 1659, 2120, 1737, 1683, 1700, 2125, 2127, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 2135, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 2126, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 2131, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 2122, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 2117, 2118, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 2140, 1835, 2116, 1840, 1839, 1685, 1842, 1844, 1689, 2133, 2134, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 2141, 2142, 1858, 1852, 1853, 1854, 2172, 230: 2153, 2112, 2184, 2188, 235: 2169, 2168, 2205, 2179, 243: 2144, 266: 2148, 2187, 290: 2156, 299: 2175, 311: 2189, 2110, 2182, 2204, 2206, 2147, 2146, 2163, 2203, 2183, 2180, 2174, 2178, 2143, 2145, 2181, 2152, 2185, 2193, 2244, 2151, 2194, 2195, 2150, 2173, 2166, 2167, 2217, 2219, 2220, 2221, 2176, 2222, 2201, 2207, 2215, 2216, 2211, 2223, 2224, 2225, 2212, 2227, 2228, 2218, 2213, 2226, 2208, 2214, 2199, 2229, 2230, 2177, 2234, 2190, 2192, 2233, 2239, 2238, 2240, 2237, 2170, 2241, 2236, 2235, 2232, 2186, 2231, 2191, 2196, 2197, 389: 2155, 1635, 1636, 1634, 448: 2171, 2243, 2162, 2157, 2149, 2160, 2158, 2159, 2198, 2210, 2209, 2202, 2200, 2154, 2165, 2242, 2164, 2161, 2115, 2114, 2113, 2451, 505: 3519}, - {2: 509, 509, 509, 509, 7: 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 22: 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 253: 509, 393: 509, 495: 509, 509, 509, 601: 2067, 617: 3500}, - {22: 3461, 26: 2968, 48: 343, 56: 642, 3463, 59: 3462, 70: 3018, 77: 3019, 109: 3464, 326: 3457, 401: 3459, 486: 2967, 600: 3465, 647: 3458, 737: 3460}, - {134: 3447, 228: 2711, 267: 1538, 314: 1537, 394: 1546, 481: 3448, 1547, 1548, 1549, 488: 1552, 490: 1551, 3453, 494: 1614, 502: 1530, 532: 3449, 535: 3451, 3452, 540: 3450, 741: 3446}, + {22: 1317, 44: 1317, 49: 344, 54: 1317, 59: 3556, 61: 3555, 71: 3033, 78: 3034, 252: 3554, 330: 3486, 389: 3550, 405: 1373, 410: 1317, 490: 3552, 603: 3557, 651: 3551, 778: 3549, 838: 3553}, + {2: 1736, 1653, 1687, 1654, 7: 2140, 1741, 1680, 1738, 2145, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 2149, 1665, 2142, 2144, 1859, 2158, 2159, 2157, 2153, 2160, 1837, 1839, 1838, 2150, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 2151, 1774, 1673, 2141, 1751, 1714, 2146, 2148, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 2156, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 2147, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 2152, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 2143, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 2138, 2139, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 2161, 1853, 2137, 1858, 1857, 1699, 1860, 1862, 1703, 2154, 2155, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 2162, 2163, 1876, 1870, 1871, 1872, 2193, 234: 2174, 2133, 2205, 2209, 239: 2190, 2189, 2226, 2200, 247: 2165, 270: 2169, 272: 2208, 294: 2177, 303: 2196, 315: 2210, 2131, 2203, 2225, 2227, 2168, 2167, 2184, 2224, 2204, 2201, 2195, 2199, 2164, 2166, 2202, 2173, 2206, 2214, 2265, 2172, 2215, 2216, 2171, 2194, 2187, 2188, 2238, 2240, 2241, 2242, 2197, 2243, 2222, 2228, 2236, 2237, 2232, 2244, 2245, 2246, 2233, 2248, 2249, 2239, 2234, 2247, 2229, 2235, 2220, 2250, 2251, 2198, 2255, 2211, 2213, 2254, 2260, 2259, 2261, 2258, 2191, 2262, 2257, 2256, 381: 2253, 2207, 2252, 2212, 2217, 2218, 393: 2176, 1649, 1650, 1648, 452: 2192, 2264, 2183, 2178, 2170, 2181, 2179, 2180, 2219, 2231, 2230, 2223, 2221, 2175, 2186, 2263, 2185, 2182, 2136, 2135, 2134, 2472, 509: 3548}, + {2: 518, 518, 518, 518, 7: 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 22: 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 257: 518, 397: 518, 499: 518, 518, 518, 604: 2086, 621: 3529}, + {22: 3490, 26: 2983, 49: 344, 58: 650, 3492, 61: 3491, 71: 3033, 78: 3034, 114: 3493, 330: 3486, 405: 3488, 490: 2982, 603: 3494, 651: 3487, 741: 3489}, + {139: 3476, 232: 3462, 272: 1552, 318: 1551, 398: 1560, 485: 3477, 1561, 1562, 1563, 492: 1566, 494: 1565, 3482, 498: 1628, 506: 1544, 536: 3478, 539: 3480, 3481, 544: 3479, 745: 3475}, // 15 - {2: 1258, 1258, 1258, 1258, 7: 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 22: 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 267: 1258, 314: 1258, 394: 1258, 414: 1258, 494: 1258, 502: 1258}, - {2: 1257, 1257, 1257, 1257, 7: 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 22: 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 267: 1257, 314: 1257, 394: 1257, 414: 1257, 494: 1257, 502: 1257}, - {2: 1256, 1256, 1256, 1256, 7: 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 22: 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 267: 1256, 314: 1256, 394: 1256, 414: 1256, 494: 1256, 502: 1256}, - {2: 1722, 1639, 1673, 1640, 7: 1650, 1727, 1666, 1724, 1687, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 1714, 1651, 1660, 1681, 1774, 1775, 1771, 1733, 1780, 1716, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 1719, 1760, 1659, 1658, 1737, 1683, 1700, 1705, 1709, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 1770, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 1706, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 1721, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 3433, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 1638, 1642, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 1834, 1835, 1633, 1840, 1839, 1685, 1842, 1844, 1689, 1753, 1769, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 1855, 1856, 1858, 1852, 1853, 1854, 2711, 267: 1538, 314: 1537, 389: 1860, 1635, 1636, 1634, 394: 1546, 414: 3434, 472: 3431, 481: 3435, 1547, 1548, 1549, 488: 1552, 490: 1551, 3440, 494: 1614, 502: 1530, 532: 3436, 535: 3438, 3439, 540: 3437, 598: 3432}, - {2: 662, 662, 662, 662, 7: 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 22: 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 393: 662, 495: 2071, 2070, 2069, 513: 662, 570: 3420}, + {2: 1272, 1272, 1272, 1272, 7: 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 22: 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 272: 1272, 318: 1272, 398: 1272, 418: 1272, 498: 1272, 506: 1272}, + {2: 1271, 1271, 1271, 1271, 7: 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 22: 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 272: 1271, 318: 1271, 398: 1271, 418: 1271, 498: 1271, 506: 1271}, + {2: 1270, 1270, 1270, 1270, 7: 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 22: 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 272: 1270, 318: 1270, 398: 1270, 418: 1270, 498: 1270, 506: 1270}, + {2: 1736, 1653, 1687, 1654, 7: 1664, 1741, 1680, 1738, 1701, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 1728, 1665, 1674, 1695, 1859, 1788, 1789, 1785, 1747, 1794, 1837, 1839, 1838, 1730, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 1733, 1774, 1673, 1672, 1751, 1714, 1719, 1723, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 1784, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 1720, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 1735, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 3459, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 1652, 1656, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 1852, 1853, 1647, 1858, 1857, 1699, 1860, 1862, 1703, 1767, 1783, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 1873, 1874, 1876, 1870, 1871, 1872, 3462, 272: 1552, 318: 1551, 393: 1878, 1649, 1650, 1648, 398: 1560, 418: 3460, 476: 3457, 485: 3461, 1561, 1562, 1563, 492: 1566, 494: 1565, 3467, 498: 1628, 506: 1544, 536: 3463, 539: 3465, 3466, 544: 3464, 601: 3458}, + {2: 670, 670, 670, 670, 7: 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 22: 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 397: 670, 499: 2090, 2089, 2088, 517: 670, 574: 3446}, // 20 - {2: 662, 662, 662, 662, 7: 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 22: 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 495: 2071, 2070, 2069, 513: 662, 570: 3379}, - {2: 1722, 1639, 1673, 1640, 7: 1650, 1727, 1666, 1724, 1687, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 1714, 1651, 1660, 1681, 1774, 1775, 1771, 1733, 1780, 1716, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 1719, 1760, 1659, 1658, 1737, 1683, 1700, 1705, 1709, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 1770, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 1706, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 1721, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 1677, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 1638, 1642, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 1834, 1835, 1633, 1840, 1839, 1685, 1842, 1844, 1689, 1753, 1769, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 1855, 1856, 1858, 1852, 1853, 1854, 389: 3374, 1635, 1636, 1634}, - {2: 1722, 1639, 1673, 1640, 7: 1650, 1727, 1666, 1724, 1687, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 1714, 1651, 1660, 1681, 1774, 1775, 1771, 1733, 1780, 1716, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 1719, 1760, 1659, 1658, 1737, 1683, 1700, 1705, 1709, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 1770, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 1706, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 1721, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 1677, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 1638, 1642, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 1834, 1835, 1633, 1840, 1839, 1685, 1842, 1844, 1689, 1753, 1769, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 1855, 1856, 1858, 1852, 1853, 1854, 389: 3368, 1635, 1636, 1634}, - {56: 3366}, - {56: 643}, + {2: 670, 670, 670, 670, 7: 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 22: 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 499: 2090, 2089, 2088, 517: 670, 574: 3405}, + {2: 1736, 1653, 1687, 1654, 7: 1664, 1741, 1680, 1738, 1701, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 1728, 1665, 1674, 1695, 1859, 1788, 1789, 1785, 1747, 1794, 1837, 1839, 1838, 1730, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 1733, 1774, 1673, 1672, 1751, 1714, 1719, 1723, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 1784, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 1720, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 1735, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 1691, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 1652, 1656, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 1852, 1853, 1647, 1858, 1857, 1699, 1860, 1862, 1703, 1767, 1783, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 1873, 1874, 1876, 1870, 1871, 1872, 393: 3400, 1649, 1650, 1648}, + {2: 1736, 1653, 1687, 1654, 7: 1664, 1741, 1680, 1738, 1701, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 1728, 1665, 1674, 1695, 1859, 1788, 1789, 1785, 1747, 1794, 1837, 1839, 1838, 1730, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 1733, 1774, 1673, 1672, 1751, 1714, 1719, 1723, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 1784, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 1720, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 1735, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 1691, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 1652, 1656, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 1852, 1853, 1647, 1858, 1857, 1699, 1860, 1862, 1703, 1767, 1783, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 1873, 1874, 1876, 1870, 1871, 1872, 393: 3394, 1649, 1650, 1648}, + {58: 3392}, + {58: 651}, // 25 - {641, 641, 24: 3334, 246: 3333, 402: 3337, 504: 3335, 636: 3336, 753: 3332}, - {2: 1722, 1639, 1673, 1640, 7: 1650, 1727, 1666, 1724, 1687, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 1714, 1651, 1660, 1681, 1774, 1775, 1771, 1733, 1780, 1716, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 1719, 1760, 1659, 1658, 1737, 1683, 1700, 1705, 1709, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 1770, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 1706, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 1721, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 1677, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 1638, 1642, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 1834, 1835, 1633, 1840, 1839, 1685, 1842, 1844, 1689, 1753, 1769, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 1855, 1856, 1858, 1852, 1853, 1854, 230: 1889, 389: 1890, 1635, 1636, 1634, 473: 3331}, - {76: 3329}, - {2: 509, 509, 509, 509, 7: 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 22: 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 230: 509, 509, 509, 509, 235: 509, 509, 509, 509, 243: 509, 255: 509, 266: 509, 509, 269: 509, 290: 509, 299: 509, 311: 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 478: 509, 493: 509, 495: 509, 509, 509, 499: 509, 509, 601: 2067, 617: 3294, 851: 3293}, - {876, 876, 21: 876, 229: 876, 239: 876, 876, 876, 876, 244: 876, 876, 247: 2454, 253: 3258, 514: 2455, 3290, 669: 3257}, + {649, 649, 24: 3360, 250: 3359, 406: 3363, 508: 3361, 640: 3362, 757: 3358}, + {2: 1736, 1653, 1687, 1654, 7: 1664, 1741, 1680, 1738, 1701, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 1728, 1665, 1674, 1695, 1859, 1788, 1789, 1785, 1747, 1794, 1837, 1839, 1838, 1730, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 1733, 1774, 1673, 1672, 1751, 1714, 1719, 1723, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 1784, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 1720, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 1735, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 1691, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 1652, 1656, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 1852, 1853, 1647, 1858, 1857, 1699, 1860, 1862, 1703, 1767, 1783, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 1873, 1874, 1876, 1870, 1871, 1872, 234: 1908, 393: 1909, 1649, 1650, 1648, 477: 3357}, + {77: 3355}, + {2: 518, 518, 518, 518, 7: 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 22: 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 234: 518, 518, 518, 518, 239: 518, 518, 518, 518, 247: 518, 259: 518, 270: 518, 272: 518, 518, 294: 518, 303: 518, 315: 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 381: 518, 518, 518, 518, 518, 518, 482: 518, 497: 518, 499: 518, 518, 518, 503: 518, 518, 604: 2086, 621: 3320, 855: 3319}, + {884, 884, 21: 884, 233: 884, 243: 884, 884, 884, 884, 248: 884, 884, 251: 2475, 257: 3281, 518: 2476, 3316, 673: 3280}, // 30 - {876, 876, 21: 876, 229: 876, 239: 876, 876, 876, 876, 244: 876, 876, 247: 2454, 514: 2455, 3287}, - {876, 876, 21: 876, 229: 876, 239: 876, 876, 876, 876, 244: 876, 876, 247: 2454, 514: 2455, 3284}, - {228: 2711, 394: 1546, 481: 2724, 1547, 1548, 1549, 488: 1552, 490: 1551, 2710}, - {241: 3224}, - {241: 479}, + {884, 884, 21: 884, 233: 884, 243: 884, 884, 884, 884, 248: 884, 884, 251: 2475, 518: 2476, 3313}, + {884, 884, 21: 884, 233: 884, 243: 884, 884, 884, 884, 248: 884, 884, 251: 2475, 518: 2476, 3310}, + {232: 1564, 398: 1560, 452: 2730, 485: 2111, 1561, 1562, 1563, 492: 1566, 494: 1565, 2108}, + {245: 3240}, + {245: 481}, // 35 - {279, 279, 241: 477}, - {436, 436, 1722, 1639, 1673, 1640, 436, 3135, 1727, 1666, 1724, 3139, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 1714, 1651, 1660, 1681, 1774, 1775, 1771, 1733, 1780, 1716, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 3140, 1818, 1719, 1760, 1659, 1658, 1737, 3137, 1700, 1705, 1709, 1746, 1671, 3136, 1680, 1738, 1859, 1749, 1778, 1693, 3141, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 1770, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 1706, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 1721, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 1677, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 3142, 1735, 1742, 1801, 1713, 1823, 1717, 1638, 1642, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 1834, 1835, 1633, 1840, 1839, 3138, 1842, 1844, 1689, 1753, 1769, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 1855, 1856, 1858, 1852, 1853, 1854, 238: 3144, 312: 3147, 330: 3146, 389: 3145, 1635, 1636, 1634, 395: 2677, 498: 3148, 748: 3149, 881: 3143}, - {13: 3081, 119: 3082, 121: 3080, 160: 3078, 164: 3079, 386: 3077, 552: 3076}, - {7: 2678, 23: 343, 26: 340, 30: 340, 40: 340, 51: 2998, 60: 343, 68: 343, 70: 3018, 74: 340, 77: 3019, 103: 3017, 122: 3010, 127: 3014, 129: 3002, 132: 3016, 135: 3020, 3015, 2990, 3008, 3000, 145: 2991, 156: 2997, 3013, 170: 2995, 2996, 2994, 2993, 181: 3011, 184: 3007, 395: 2677, 401: 2999, 486: 3005, 498: 3004, 543: 2989, 600: 3009, 607: 3001, 646: 3003, 828: 2992, 844: 3012, 855: 3006, 2988}, - {23: 328, 26: 328, 51: 328, 58: 328, 64: 2966, 486: 328, 819: 2965, 2964}, + {280, 280, 245: 479}, + {437, 437, 1736, 1653, 1687, 1654, 437, 3150, 1741, 1680, 1738, 3154, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 1728, 1665, 1674, 1695, 1859, 1788, 1789, 1785, 1747, 1794, 1837, 1839, 1838, 1730, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 3152, 1700, 1777, 1702, 3155, 1836, 1733, 1774, 1673, 1672, 1751, 1714, 1719, 1723, 1760, 1685, 3151, 1694, 1752, 1877, 1763, 1792, 1707, 3156, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 1784, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 1720, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 1735, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 1691, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 3157, 1749, 1756, 1815, 1727, 1841, 1731, 1652, 1656, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 1852, 1853, 1647, 1858, 1857, 3153, 1860, 1862, 1703, 1767, 1783, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 1873, 1874, 1876, 1870, 1871, 1872, 242: 3159, 316: 3162, 334: 3161, 393: 3160, 1649, 1650, 1648, 399: 2698, 502: 3163, 752: 3164, 885: 3158}, + {13: 3096, 124: 3097, 126: 3095, 164: 3093, 168: 3094, 390: 3092, 556: 3091}, + {7: 2699, 23: 344, 26: 341, 28: 3006, 31: 341, 45: 341, 52: 3013, 62: 344, 69: 344, 71: 3033, 75: 341, 78: 3034, 106: 3032, 127: 3025, 132: 3029, 134: 3017, 137: 3031, 140: 3035, 3030, 3005, 3023, 3015, 160: 3012, 3028, 174: 3010, 3011, 3009, 3008, 185: 3026, 188: 3022, 399: 2698, 405: 3014, 490: 3020, 502: 3019, 547: 3004, 603: 3024, 610: 3016, 650: 3018, 832: 3007, 848: 3027, 859: 3021, 3003}, + {23: 329, 26: 329, 52: 329, 55: 2981, 60: 329, 490: 329, 823: 2980, 2979}, // 40 + {322, 322}, {321, 321}, {320, 320}, {319, 319}, {318, 318}, - {317, 317}, // 45 + {317, 317}, {316, 316}, {315, 315}, {314, 314}, {313, 313}, - {312, 312}, // 50 + {312, 312}, {311, 311}, {310, 310}, {309, 309}, {308, 308}, - {307, 307}, // 55 + {307, 307}, {306, 306}, {305, 305}, {304, 304}, {303, 303}, - {302, 302}, // 60 + {302, 302}, {301, 301}, {300, 300}, {299, 299}, {298, 298}, - {297, 297}, // 65 + {297, 297}, {296, 296}, {295, 295}, {294, 294}, {293, 293}, - {292, 292}, // 70 + {292, 292}, {291, 291}, {290, 290}, {289, 289}, {288, 288}, - {287, 287}, // 75 + {287, 287}, {286, 286}, {285, 285}, {284, 284}, {283, 283}, - {282, 282}, // 80 + {282, 282}, {281, 281}, - {280, 280}, + {279, 279}, {278, 278}, {277, 277}, - {276, 276}, // 85 + {276, 276}, {275, 275}, {274, 274}, {273, 273}, {272, 272}, - {271, 271}, // 90 + {271, 271}, {270, 270}, {269, 269}, {268, 268}, - {267, 267}, - {254, 254}, + {255, 255}, // 95 - {2: 216, 216, 216, 216, 7: 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 22: 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 486: 2961, 831: 2962}, - {2: 509, 509, 509, 509, 7: 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 22: 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 315: 509, 393: 509, 495: 509, 509, 509, 601: 2067, 617: 2068}, - {2: 1722, 1639, 1673, 1640, 7: 1650, 1727, 1666, 1724, 1687, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 1714, 1651, 1660, 1681, 1774, 1775, 1771, 1733, 1780, 1716, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 1719, 1760, 1659, 1658, 1737, 1683, 1700, 1705, 1709, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 1770, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 1706, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 1721, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 1677, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 1638, 1642, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 1834, 1835, 1633, 1840, 1839, 1685, 1842, 1844, 1689, 1753, 1769, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 1855, 1856, 1858, 1852, 1853, 1854, 389: 2065, 1635, 1636, 1634, 560: 2066}, - {2: 1722, 1639, 1673, 1640, 7: 1650, 1727, 1666, 1724, 1687, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 1714, 1651, 1660, 1681, 1774, 1775, 1771, 1733, 1780, 1716, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 1719, 1760, 1659, 1658, 1737, 1683, 1700, 1705, 1709, 1746, 1940, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 1770, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 1706, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 1721, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1945, 1762, 1767, 1677, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1942, 1773, 1812, 1779, 1843, 1804, 1944, 1739, 1943, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1941, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 1638, 1642, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 1834, 1835, 1939, 1840, 1839, 1685, 1842, 1844, 1689, 1753, 1769, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 1855, 1856, 1858, 1852, 1853, 1854, 230: 1946, 242: 1968, 314: 1961, 387: 1966, 389: 1890, 1635, 1636, 1634, 394: 1962, 401: 1960, 411: 1959, 413: 1955, 473: 1948, 478: 1954, 494: 1964, 502: 1958, 516: 1949, 1947, 537: 2044, 543: 1956, 546: 1965, 552: 1963, 613: 1952, 1951, 620: 1957, 1967, 711: 2045}, - {2: 1722, 1639, 1673, 1640, 7: 1650, 1727, 1666, 1724, 1687, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 1714, 1651, 1660, 1681, 1774, 1775, 1771, 1733, 1780, 1716, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 1719, 1760, 1659, 1658, 1737, 1683, 1700, 1705, 1709, 1746, 1940, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 1770, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 1706, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 1721, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1945, 1762, 1767, 1677, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1942, 1773, 1812, 1779, 1843, 1804, 1944, 1739, 1943, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1941, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 1638, 1642, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 1834, 1835, 1939, 1840, 1839, 1685, 1842, 1844, 1689, 1753, 1769, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 1855, 1856, 1858, 1852, 1853, 1854, 230: 1946, 242: 1968, 314: 1961, 387: 1966, 389: 1890, 1635, 1636, 1634, 394: 1962, 401: 1960, 411: 1959, 413: 1955, 473: 1948, 478: 1954, 494: 1964, 502: 1958, 516: 1949, 1947, 537: 1950, 543: 1956, 546: 1965, 552: 1963, 613: 1952, 1951, 620: 1957, 1967, 711: 1953}, + {2: 217, 217, 217, 217, 7: 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 22: 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 490: 2976, 835: 2977}, + {2: 518, 518, 518, 518, 7: 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 22: 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 319: 518, 397: 518, 499: 518, 518, 518, 604: 2086, 621: 2087}, + {2: 1736, 1653, 1687, 1654, 7: 1664, 1741, 1680, 1738, 1701, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 1728, 1665, 1674, 1695, 1859, 1788, 1789, 1785, 1747, 1794, 1837, 1839, 1838, 1730, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 1733, 1774, 1673, 1672, 1751, 1714, 1719, 1723, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 1784, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 1720, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 1735, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 1691, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 1652, 1656, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 1852, 1853, 1647, 1858, 1857, 1699, 1860, 1862, 1703, 1767, 1783, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 1873, 1874, 1876, 1870, 1871, 1872, 393: 2084, 1649, 1650, 1648, 564: 2085}, + {2: 1736, 1653, 1687, 1654, 7: 1664, 1741, 1680, 1738, 1701, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 1728, 1665, 1674, 1695, 1859, 1788, 1789, 1785, 1747, 1794, 1837, 1839, 1838, 1730, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 1733, 1774, 1673, 1672, 1751, 1714, 1719, 1723, 1760, 1959, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 1784, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 1720, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 1735, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1964, 1776, 1781, 1691, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1961, 1787, 1830, 1793, 1861, 1818, 1963, 1753, 1962, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1960, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 1652, 1656, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 1852, 1853, 1958, 1858, 1857, 1699, 1860, 1862, 1703, 1767, 1783, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 1873, 1874, 1876, 1870, 1871, 1872, 234: 1965, 246: 1987, 318: 1980, 391: 1985, 393: 1909, 1649, 1650, 1648, 398: 1981, 405: 1979, 415: 1978, 417: 1974, 477: 1967, 482: 1973, 498: 1983, 506: 1977, 520: 1968, 1966, 541: 2063, 547: 1975, 550: 1984, 556: 1982, 616: 1971, 1970, 624: 1976, 1986, 715: 2064}, + {2: 1736, 1653, 1687, 1654, 7: 1664, 1741, 1680, 1738, 1701, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 1728, 1665, 1674, 1695, 1859, 1788, 1789, 1785, 1747, 1794, 1837, 1839, 1838, 1730, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 1733, 1774, 1673, 1672, 1751, 1714, 1719, 1723, 1760, 1959, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 1784, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 1720, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 1735, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1964, 1776, 1781, 1691, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1961, 1787, 1830, 1793, 1861, 1818, 1963, 1753, 1962, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1960, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 1652, 1656, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 1852, 1853, 1958, 1858, 1857, 1699, 1860, 1862, 1703, 1767, 1783, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 1873, 1874, 1876, 1870, 1871, 1872, 234: 1965, 246: 1987, 318: 1980, 391: 1985, 393: 1909, 1649, 1650, 1648, 398: 1981, 405: 1979, 415: 1978, 417: 1974, 477: 1967, 482: 1973, 498: 1983, 506: 1977, 520: 1968, 1966, 541: 1969, 547: 1975, 550: 1984, 556: 1982, 616: 1971, 1970, 624: 1976, 1986, 715: 1972}, // 100 - {109: 1875, 125: 1874}, - {26: 1631, 486: 1632, 738: 1873}, - {26: 1631, 486: 1632, 738: 1630}, - {10: 1626, 75: 1627, 266: 1624, 474: 1625}, - {10: 3, 58: 1623, 75: 3, 266: 3}, + {114: 1894, 130: 1893}, + {26: 1645, 490: 1646, 742: 1892}, + {26: 1645, 490: 1646, 742: 1644}, + {10: 1640, 76: 1641, 270: 1638, 478: 1639}, + {10: 3, 60: 1637, 76: 3, 270: 3}, // 105 - {10: 2, 75: 2, 266: 2}, - {1249, 1249, 1249, 1249, 6: 1249, 1249, 1249, 1249, 1249, 1249, 13: 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 54: 1249, 65: 1249, 83: 1249, 228: 1249, 1249, 234: 1249, 238: 1249, 1249, 1249, 1249, 1249, 244: 1249, 261: 1249, 267: 1249, 393: 1249, 1249, 1249, 1249, 1249, 1249, 403: 1249}, + {10: 2, 76: 2, 270: 2}, + {1263, 1263, 1263, 1263, 6: 1263, 1263, 1263, 1263, 1263, 1263, 13: 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 56: 1263, 66: 1263, 84: 1263, 232: 1263, 1263, 238: 1263, 242: 1263, 1263, 1263, 1263, 1263, 248: 1263, 264: 1263, 272: 1263, 397: 1263, 1263, 1263, 1263, 1263, 1263, 407: 1263}, {6, 6}, - {266: 1624, 474: 1629}, - {266: 1624, 474: 1628}, + {270: 1638, 478: 1643}, + {270: 1638, 478: 1642}, // 110 {4, 4}, {5, 5}, - {2: 1722, 1639, 1673, 1640, 7: 1650, 1727, 1666, 1724, 1687, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 1714, 1651, 1660, 1681, 1774, 1775, 1771, 1733, 1780, 1716, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 1719, 1760, 1659, 1658, 1737, 1683, 1700, 1705, 1709, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 1770, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 1706, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 1721, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 1677, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 1638, 1642, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 1834, 1835, 1633, 1840, 1839, 1685, 1842, 1844, 1689, 1753, 1769, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 1855, 1856, 1858, 1852, 1853, 1854, 389: 1860, 1635, 1636, 1634, 472: 1862, 735: 1863, 867: 1861}, - {14, 14, 14, 14, 14, 14, 7: 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 22: 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 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, 7: 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 22: 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 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}, + {2: 1736, 1653, 1687, 1654, 7: 1664, 1741, 1680, 1738, 1701, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 1728, 1665, 1674, 1695, 1859, 1788, 1789, 1785, 1747, 1794, 1837, 1839, 1838, 1730, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 1733, 1774, 1673, 1672, 1751, 1714, 1719, 1723, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 1784, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 1720, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 1735, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 1691, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 1652, 1656, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 1852, 1853, 1647, 1858, 1857, 1699, 1860, 1862, 1703, 1767, 1783, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 1873, 1874, 1876, 1870, 1871, 1872, 393: 1878, 1649, 1650, 1648, 476: 1880, 739: 1881, 871: 1879}, + {15, 15, 15, 15, 15, 15, 7: 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 22: 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 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, 7: 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 22: 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 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}, // 115 - {1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 393: 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155}, - {1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 393: 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154}, - {1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 393: 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153}, - {1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 393: 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152}, - {1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 393: 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151}, + {1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 397: 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167}, + {1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 397: 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166}, + {1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 397: 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165}, + {1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 397: 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164}, + {1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 397: 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163}, // 120 - {1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 393: 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150}, - {1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 393: 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149}, - {1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 393: 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148}, - {1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 393: 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147}, - {1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 393: 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146}, + {1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 397: 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162}, + {1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 397: 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161}, + {1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 397: 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160}, + {1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 397: 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159}, + {1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 397: 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158}, // 125 - {1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 393: 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145}, - {1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 393: 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144}, - {1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 393: 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143}, - {1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 393: 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142}, - {1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 393: 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141}, + {1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 397: 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157}, + {1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 397: 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156}, + {1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 397: 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155}, + {1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 397: 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154}, + {1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 397: 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153}, // 130 - {1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 393: 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140}, - {1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 393: 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139}, - {1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 393: 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138}, - {1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 393: 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137}, - {1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 393: 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136}, + {1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 397: 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152}, + {1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 397: 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151}, + {1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 397: 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150}, + {1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 397: 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149}, + {1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 397: 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148}, // 135 - {1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 393: 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135}, - {1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 393: 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134}, - {1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 393: 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133}, - {1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 393: 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132}, - {1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 393: 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131}, + {1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 397: 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147}, + {1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 397: 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146}, + {1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 397: 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145}, + {1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 397: 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144}, + {1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 397: 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143}, // 140 - {1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 393: 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130}, - {1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 393: 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129}, - {1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 393: 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128}, - {1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 393: 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127}, - {1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 393: 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126}, + {1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 397: 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142}, + {1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 397: 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141}, + {1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 397: 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140}, + {1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 397: 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139}, + {1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 397: 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138}, // 145 - {1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 393: 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125}, - {1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 393: 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124}, - {1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 393: 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123}, - {1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 393: 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122}, - {1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 393: 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121}, + {1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 397: 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137}, + {1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 397: 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136}, + {1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 397: 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135}, + {1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 397: 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134}, + {1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 397: 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133}, // 150 - {1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 393: 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120}, - {1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 393: 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119}, - {1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 393: 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118}, - {1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 393: 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117}, - {1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 393: 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116}, + {1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 397: 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132}, + {1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 397: 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131}, + {1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 397: 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130}, + {1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 397: 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129}, + {1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 397: 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128}, // 155 - {1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 393: 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115}, - {1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 393: 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114}, - {1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 393: 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113}, - {1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 393: 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112}, - {1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 393: 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111}, + {1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 397: 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127}, + {1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 397: 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126}, + {1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 397: 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125}, + {1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 397: 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124}, + {1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 397: 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123}, // 160 - {1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 393: 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110}, - {1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 393: 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109}, - {1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 393: 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108}, - {1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 393: 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107}, - {1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 393: 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106}, + {1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 397: 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122}, + {1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 397: 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121}, + {1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 397: 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120}, + {1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 397: 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119}, + {1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 397: 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118}, // 165 - {1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 393: 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105}, - {1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 393: 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104}, - {1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 393: 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103}, - {1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 393: 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102}, - {1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 393: 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101}, + {1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 397: 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117}, + {1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 397: 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116}, + {1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 397: 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115}, + {1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 397: 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114}, + {1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 397: 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113}, // 170 - {1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 393: 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100}, - {1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 393: 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099}, - {1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 393: 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098}, - {1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 393: 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097}, - {1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 393: 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096}, + {1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 397: 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112}, + {1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 397: 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111}, + {1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 397: 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110}, + {1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 397: 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109}, + {1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 397: 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108}, // 175 - {1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 393: 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095}, - {1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 393: 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094}, - {1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 393: 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093}, - {1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 393: 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092}, - {1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 393: 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091}, + {1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 397: 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107}, + {1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 397: 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106}, + {1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 397: 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105}, + {1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 397: 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104}, + {1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 397: 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103}, // 180 - {1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 393: 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090}, - {1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 393: 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089}, - {1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 393: 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088}, - {1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 393: 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087}, - {1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 393: 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086}, + {1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 397: 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102}, + {1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 397: 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101}, + {1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 397: 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100}, + {1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 397: 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099}, + {1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 397: 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098}, // 185 - {1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 393: 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085}, - {1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 393: 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084}, - {1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 393: 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083}, - {1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 393: 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082}, - {1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 393: 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081}, + {1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 397: 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097}, + {1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 397: 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096}, + {1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 397: 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095}, + {1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 397: 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094}, + {1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 397: 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093}, // 190 - {1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 393: 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080}, - {1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 393: 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079}, - {1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 393: 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078}, - {1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 393: 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077}, - {1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 393: 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076}, + {1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 397: 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092}, + {1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 397: 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091}, + {1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 397: 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090}, + {1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 397: 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089}, + {1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 397: 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088}, // 195 - {1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 393: 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075}, - {1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 393: 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 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, 393: 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 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, 393: 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072}, - {1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 393: 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071}, + {1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 397: 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087}, + {1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 397: 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086}, + {1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 397: 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085}, + {1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 397: 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084}, + {1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 397: 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083}, // 200 - {1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 393: 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070}, - {1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 393: 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069}, - {1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 393: 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068}, - {1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 393: 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067}, - {1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 393: 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066}, + {1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 397: 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082}, + {1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 397: 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081}, + {1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 397: 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080}, + {1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 397: 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079}, + {1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 397: 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078}, // 205 - {1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 393: 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065}, - {1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 393: 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064}, - {1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 393: 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063}, - {1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 393: 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062}, - {1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 393: 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061}, + {1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 397: 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077}, + {1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 397: 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076}, + {1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 397: 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075}, + {1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 397: 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 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, 397: 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073}, // 210 - {1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 393: 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060}, - {1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 393: 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059}, - {1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 393: 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058}, - {1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 393: 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057}, - {1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 393: 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056}, + {1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 397: 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072}, + {1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 397: 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071}, + {1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 397: 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070}, + {1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 397: 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069}, + {1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 397: 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068}, // 215 - {1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 393: 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055}, - {1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 393: 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054}, - {1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 393: 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053}, - {1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 393: 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052}, - {1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 393: 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051}, + {1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 397: 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067}, + {1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 397: 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066}, + {1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 397: 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065}, + {1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 397: 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064}, + {1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 397: 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063}, // 220 - {1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 393: 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050}, - {1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 393: 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049}, - {1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 393: 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048}, - {1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 393: 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047}, - {1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 393: 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046}, + {1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 397: 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062}, + {1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 397: 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061}, + {1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 397: 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060}, + {1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 397: 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059}, + {1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 397: 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058}, // 225 - {1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 393: 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045}, - {1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 393: 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044}, - {1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 393: 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043}, - {1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 393: 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042}, - {1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 393: 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041}, + {1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 397: 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057}, + {1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 397: 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056}, + {1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 397: 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055}, + {1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 397: 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054}, + {1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 397: 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053}, // 230 - {1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 393: 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040}, - {1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 393: 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039}, - {1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 393: 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038}, - {1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 393: 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037}, - {1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 393: 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036}, + {1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 397: 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052}, + {1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 397: 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051}, + {1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 397: 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050}, + {1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 397: 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049}, + {1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 397: 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048}, // 235 - {1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 393: 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035}, - {1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 393: 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034}, - {1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 393: 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033}, - {1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 393: 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032}, - {1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 393: 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031}, + {1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 397: 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047}, + {1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 397: 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046}, + {1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 397: 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045}, + {1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 397: 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044}, + {1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 397: 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043}, // 240 - {1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 393: 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030}, - {1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 393: 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029}, - {1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 393: 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028}, - {1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 393: 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027}, - {1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 393: 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026}, + {1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 397: 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042}, + {1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 397: 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041}, + {1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 397: 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040}, + {1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 397: 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039}, + {1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 397: 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038}, // 245 - {1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 393: 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025}, - {1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 393: 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024}, - {1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 393: 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023}, - {1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 393: 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022}, - {1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 393: 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021}, + {1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 397: 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037}, + {1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 397: 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036}, + {1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 397: 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035}, + {1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 397: 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034}, + {1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 397: 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033}, // 250 - {1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 393: 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020}, - {1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 393: 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019}, - {1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 393: 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018}, - {1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 393: 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017}, - {1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 393: 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016}, + {1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 397: 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032}, + {1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 397: 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031}, + {1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 397: 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030}, + {1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 397: 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029}, + {1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 397: 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028}, // 255 - {1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 393: 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015}, - {1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 393: 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014}, - {1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 393: 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013}, - {1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 393: 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012}, - {1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 393: 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011}, + {1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 397: 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027}, + {1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 397: 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026}, + {1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 397: 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025}, + {1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 397: 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024}, + {1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 397: 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023}, // 260 - {1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 393: 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010}, - {1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 393: 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009}, - {1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 393: 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008}, - {1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 393: 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007}, - {1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 393: 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006}, + {1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 397: 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022}, + {1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 397: 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021}, + {1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 397: 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020}, + {1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 397: 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019}, + {1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 397: 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018}, // 265 - {1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 393: 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005}, - {1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 393: 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004}, - {1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 393: 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003}, - {1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 393: 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002}, - {1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 393: 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001}, + {1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 397: 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017}, + {1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 397: 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016}, + {1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 397: 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015}, + {1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 397: 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014}, + {1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 397: 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013}, // 270 - {1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 393: 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000}, - {999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 393: 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999}, - {998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 393: 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998}, - {997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 393: 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997}, - {996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 393: 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996}, + {1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 397: 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012}, + {1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 397: 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011}, + {1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 397: 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010}, + {1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 397: 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009}, + {1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 397: 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008}, // 275 - {995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 393: 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995}, - {994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 393: 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994}, - {993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 393: 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993}, - {992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 393: 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992}, - {991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 393: 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991}, + {1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 397: 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007}, + {1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 397: 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006}, + {1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 397: 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005}, + {1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 397: 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004}, + {1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 397: 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003}, // 280 - {990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 393: 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990}, - {989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 393: 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989}, - {988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 393: 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988}, - {987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 393: 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987}, - {986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 393: 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986}, + {1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 397: 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002}, + {1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 397: 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001}, + {1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 397: 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000}, + {999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 397: 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999}, + {998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 397: 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998}, // 285 - {985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 393: 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985}, - {984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 393: 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984}, - {983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 393: 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983}, - {982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 393: 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982}, - {981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 393: 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981}, + {997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 397: 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997}, + {996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 397: 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996}, + {995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 397: 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995}, + {994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 397: 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994}, + {993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 397: 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993}, // 290 - {980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 393: 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980}, - {979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 393: 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979}, - {978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 393: 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978}, - {977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 393: 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977}, - {976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 393: 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976}, + {992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 397: 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992}, + {991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 397: 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991}, + {990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 397: 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990}, + {989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 397: 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989}, + {988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 397: 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988}, // 295 - {975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 393: 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975}, - {974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 393: 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974}, - {973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 393: 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973}, - {972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 393: 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972}, - {971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 393: 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971}, + {987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 397: 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987}, + {986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 397: 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986}, + {985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 397: 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985}, + {984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 397: 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984}, + {983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 397: 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983}, // 300 - {970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 393: 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970}, - {969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 393: 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969}, - {968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 393: 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968}, - {967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 393: 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967}, - {966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 393: 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966}, + {982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 397: 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982}, + {981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 397: 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981}, + {980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 397: 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980}, + {979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 397: 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979}, + {978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 397: 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978}, // 305 - {965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 393: 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965}, - {964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 393: 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964}, - {963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 393: 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963}, - {962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 393: 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962}, - {961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 393: 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961}, + {977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 397: 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977}, + {976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 397: 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976}, + {975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 397: 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975}, + {974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 397: 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974}, + {973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 397: 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973}, // 310 - {960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 393: 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960}, - {959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 393: 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959}, - {958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 393: 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958}, - {957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 393: 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957}, - {956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 393: 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956}, + {972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 397: 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972}, + {971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 397: 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971}, + {970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 397: 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970}, + {969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 397: 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969}, + {968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 397: 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968}, // 315 - {955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 393: 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955}, - {954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 393: 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954}, - {953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 393: 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953}, - {952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 393: 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952}, - {951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 393: 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951}, + {967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 397: 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967}, + {966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 397: 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966}, + {965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 397: 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965}, + {964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 397: 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964}, + {963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 397: 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963}, // 320 - {950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 393: 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950}, - {949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 393: 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949}, - {948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 393: 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 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, 393: 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 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, 393: 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946}, + {962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 397: 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962}, + {961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 397: 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961}, + {960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 397: 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960}, + {959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 397: 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959}, + {958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 397: 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958}, // 325 - {945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 393: 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945}, - {944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 393: 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944}, - {943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 393: 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943}, - {942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 393: 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942}, - {941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 393: 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941}, + {957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 397: 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957}, + {956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 397: 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956}, + {955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 397: 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955}, + {954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 397: 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954}, + {953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 397: 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953}, // 330 - {940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 393: 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940}, - {939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 393: 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939}, - {938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 393: 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938}, - {937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 393: 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937}, - {936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 393: 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936}, + {952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 397: 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952}, + {951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 397: 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951}, + {950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 397: 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950}, + {949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 397: 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949}, + {948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 397: 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948}, // 335 - {935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 393: 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935}, - {934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 393: 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934}, - {933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 393: 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933}, - {932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 393: 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932}, - {931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 393: 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931}, + {947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 397: 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 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, 397: 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946}, + {945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 397: 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945}, + {944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 397: 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944}, + {943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 397: 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943}, // 340 - {930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 393: 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930}, - {929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 393: 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929}, - {658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 232: 658, 658, 658, 238: 658, 658, 658, 658, 658, 244: 658, 658, 247: 658, 249: 658, 253: 658, 255: 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 288: 658, 290: 1870, 321: 658, 323: 658, 393: 658, 658, 658, 658, 658, 658, 401: 658, 658, 658, 405: 658, 407: 658, 658, 658, 411: 658, 658, 658, 658, 417: 658, 422: 658, 658, 658}, - {15, 15, 6: 1868}, - {412: 1865, 424: 1866, 816: 1864}, + {942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 397: 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942}, + {941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 397: 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941}, + {940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 397: 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940}, + {939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 397: 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939}, + {938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 397: 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938}, // 345 + {937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 397: 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937}, + {666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 236: 666, 666, 666, 242: 666, 666, 666, 666, 666, 248: 666, 666, 251: 666, 256: 666, 666, 259: 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 292: 666, 294: 1889, 325: 666, 327: 666, 397: 666, 666, 666, 666, 666, 666, 405: 666, 666, 666, 409: 666, 411: 666, 666, 666, 415: 666, 666, 666, 666, 421: 666, 426: 666, 666, 666}, + {16, 16, 6: 1887}, + {416: 1883, 428: 1884, 820: 1882}, {8, 8, 6: 8}, - {12, 12, 6: 12}, - {11, 11, 6: 11, 64: 1867}, - {9, 9, 6: 9}, - {10, 10, 6: 10}, // 350 - {2: 1722, 1639, 1673, 1640, 7: 1650, 1727, 1666, 1724, 1687, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 1714, 1651, 1660, 1681, 1774, 1775, 1771, 1733, 1780, 1716, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 1719, 1760, 1659, 1658, 1737, 1683, 1700, 1705, 1709, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 1770, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 1706, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 1721, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 1677, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 1638, 1642, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 1834, 1835, 1633, 1840, 1839, 1685, 1842, 1844, 1689, 1753, 1769, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 1855, 1856, 1858, 1852, 1853, 1854, 389: 1860, 1635, 1636, 1634, 472: 1862, 735: 1869}, - {7, 7, 6: 7}, - {2: 1722, 1639, 1673, 1640, 7: 1650, 1727, 1666, 1724, 1687, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 1714, 1651, 1660, 1681, 1774, 1775, 1771, 1733, 1780, 1716, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 1719, 1760, 1659, 1658, 1737, 1683, 1700, 1705, 1709, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 1770, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 1706, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 1721, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 1677, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 1638, 1642, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 1834, 1835, 1633, 1840, 1839, 1685, 1842, 1844, 1689, 1753, 1769, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 1855, 1856, 1858, 1852, 1853, 1854, 269: 1872, 389: 1871, 1635, 1636, 1634}, - {657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 232: 657, 657, 657, 238: 657, 657, 657, 657, 657, 244: 657, 657, 247: 657, 249: 657, 253: 657, 255: 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 288: 657, 321: 657, 323: 657, 393: 657, 657, 657, 657, 657, 657, 401: 657, 657, 657, 405: 657, 407: 657, 657, 657, 411: 657, 657, 657, 657, 417: 657, 422: 657, 657, 657}, - {656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 232: 656, 656, 656, 238: 656, 656, 656, 656, 656, 244: 656, 656, 247: 656, 249: 656, 253: 656, 255: 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 288: 656, 321: 656, 323: 656, 393: 656, 656, 656, 656, 656, 656, 401: 656, 656, 656, 405: 656, 407: 656, 656, 656, 411: 656, 656, 656, 656, 417: 656, 422: 656, 656, 656}, + {13, 13, 6: 13}, + {12, 12, 6: 12, 55: 1886}, + {10, 10, 6: 10, 55: 1885}, + {9, 9, 6: 9}, + {11, 11, 6: 11}, // 355 - {16, 16}, - {64: 1878, 606: 35, 814: 1877}, - {230: 1876}, - {1, 1}, - {606: 1879}, + {2: 1736, 1653, 1687, 1654, 7: 1664, 1741, 1680, 1738, 1701, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 1728, 1665, 1674, 1695, 1859, 1788, 1789, 1785, 1747, 1794, 1837, 1839, 1838, 1730, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 1733, 1774, 1673, 1672, 1751, 1714, 1719, 1723, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 1784, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 1720, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 1735, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 1691, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 1652, 1656, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 1852, 1853, 1647, 1858, 1857, 1699, 1860, 1862, 1703, 1767, 1783, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 1873, 1874, 1876, 1870, 1871, 1872, 393: 1878, 1649, 1650, 1648, 476: 1880, 739: 1888}, + {7, 7, 6: 7}, + {2: 1736, 1653, 1687, 1654, 7: 1664, 1741, 1680, 1738, 1701, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 1728, 1665, 1674, 1695, 1859, 1788, 1789, 1785, 1747, 1794, 1837, 1839, 1838, 1730, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 1733, 1774, 1673, 1672, 1751, 1714, 1719, 1723, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 1784, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 1720, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 1735, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 1691, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 1652, 1656, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 1852, 1853, 1647, 1858, 1857, 1699, 1860, 1862, 1703, 1767, 1783, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 1873, 1874, 1876, 1870, 1871, 1872, 273: 1891, 393: 1890, 1649, 1650, 1648}, + {665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 236: 665, 665, 665, 242: 665, 665, 665, 665, 665, 248: 665, 665, 251: 665, 256: 665, 665, 259: 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 292: 665, 325: 665, 327: 665, 397: 665, 665, 665, 665, 665, 665, 405: 665, 665, 665, 409: 665, 411: 665, 665, 665, 415: 665, 665, 665, 665, 421: 665, 426: 665, 665, 665}, + {664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 236: 664, 664, 664, 242: 664, 664, 664, 664, 664, 248: 664, 664, 251: 664, 256: 664, 664, 259: 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 292: 664, 325: 664, 327: 664, 397: 664, 664, 664, 664, 664, 664, 405: 664, 664, 664, 409: 664, 411: 664, 664, 664, 415: 664, 664, 664, 664, 421: 664, 426: 664, 664, 664}, // 360 - {606: 34}, - {230: 1880}, - {513: 1881}, - {486: 1882}, - {2: 1722, 1639, 1673, 1640, 7: 1650, 1727, 1666, 1724, 1687, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 1714, 1651, 1660, 1681, 1774, 1775, 1771, 1733, 1780, 1716, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 1719, 1760, 1659, 1658, 1737, 1683, 1700, 1705, 1709, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 1770, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 1706, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 1721, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 1677, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 1638, 1642, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 1834, 1835, 1633, 1840, 1839, 1685, 1842, 1844, 1689, 1753, 1769, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 1855, 1856, 1858, 1852, 1853, 1854, 389: 1860, 1635, 1636, 1634, 472: 1883}, + {17, 17}, + {55: 1897, 609: 36, 818: 1896}, + {234: 1895}, + {1, 1}, + {609: 1898}, // 365 - {37, 37, 30: 37, 40: 37, 228: 37, 393: 37, 395: 1885, 403: 37, 765: 1884}, - {33, 33, 30: 1895, 40: 1894, 228: 33, 393: 33, 403: 33, 791: 1892, 1893}, - {257: 1886}, - {2: 1722, 1639, 1673, 1640, 7: 1650, 1727, 1666, 1724, 1687, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 1714, 1651, 1660, 1681, 1774, 1775, 1771, 1733, 1780, 1716, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 1719, 1760, 1659, 1658, 1737, 1683, 1700, 1705, 1709, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 1770, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 1706, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 1721, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 1677, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 1638, 1642, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 1834, 1835, 1633, 1840, 1839, 1685, 1842, 1844, 1689, 1753, 1769, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 1855, 1856, 1858, 1852, 1853, 1854, 230: 1889, 299: 1888, 389: 1890, 1635, 1636, 1634, 473: 1887, 522: 1891}, - {438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 13: 438, 438, 438, 438, 438, 438, 438, 438, 438, 30: 438, 40: 438, 228: 438, 438, 231: 438, 234: 438, 238: 438, 243: 438, 261: 438, 267: 438, 299: 438, 383: 438, 438, 438, 438, 438, 438, 393: 438, 438, 438, 438, 438, 438, 403: 438}, + {609: 35}, + {234: 1899}, + {517: 1900}, + {490: 1901}, + {2: 1736, 1653, 1687, 1654, 7: 1664, 1741, 1680, 1738, 1701, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 1728, 1665, 1674, 1695, 1859, 1788, 1789, 1785, 1747, 1794, 1837, 1839, 1838, 1730, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 1733, 1774, 1673, 1672, 1751, 1714, 1719, 1723, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 1784, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 1720, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 1735, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 1691, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 1652, 1656, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 1852, 1853, 1647, 1858, 1857, 1699, 1860, 1862, 1703, 1767, 1783, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 1873, 1874, 1876, 1870, 1871, 1872, 393: 1878, 1649, 1650, 1648, 476: 1902}, // 370 - {437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 13: 437, 437, 437, 437, 437, 437, 437, 437, 437, 30: 437, 40: 437, 228: 437, 437, 231: 437, 234: 437, 238: 437, 243: 437, 261: 437, 267: 437, 299: 437, 383: 437, 437, 437, 437, 437, 437, 393: 437, 437, 437, 437, 437, 437, 403: 437}, - {121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 267: 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 291: 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 312: 121, 382: 121, 121, 121, 121, 121, 121, 121, 393: 121, 121, 121, 121, 121, 121, 402: 121, 121, 121, 406: 121, 410: 121}, - {120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 267: 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 291: 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 312: 120, 382: 120, 120, 120, 120, 120, 120, 120, 393: 120, 120, 120, 120, 120, 120, 402: 120, 120, 120, 406: 120, 410: 120}, - {36, 36, 30: 36, 40: 36, 228: 36, 393: 36, 403: 36}, - {22, 22, 228: 22, 393: 22, 403: 1913, 812: 1912}, + {38, 38, 31: 38, 45: 38, 232: 38, 397: 38, 399: 1904, 407: 38, 769: 1903}, + {34, 34, 31: 1914, 45: 1913, 232: 34, 397: 34, 407: 34, 795: 1911, 1912}, + {262: 1905}, + {2: 1736, 1653, 1687, 1654, 7: 1664, 1741, 1680, 1738, 1701, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 1728, 1665, 1674, 1695, 1859, 1788, 1789, 1785, 1747, 1794, 1837, 1839, 1838, 1730, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 1733, 1774, 1673, 1672, 1751, 1714, 1719, 1723, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 1784, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 1720, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 1735, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 1691, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 1652, 1656, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 1852, 1853, 1647, 1858, 1857, 1699, 1860, 1862, 1703, 1767, 1783, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 1873, 1874, 1876, 1870, 1871, 1872, 234: 1908, 303: 1907, 393: 1909, 1649, 1650, 1648, 477: 1906, 527: 1910}, + {439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 13: 439, 439, 439, 439, 439, 439, 439, 439, 439, 31: 439, 45: 439, 232: 439, 439, 235: 439, 238: 439, 242: 439, 247: 439, 264: 439, 272: 439, 303: 439, 387: 439, 439, 439, 439, 439, 439, 397: 439, 439, 439, 439, 439, 439, 407: 439}, // 375 - {29, 29, 228: 29, 393: 29, 403: 29, 526: 29, 544: 29, 556: 1897, 568: 29, 793: 1896}, - {31, 31, 228: 31, 393: 31, 403: 31, 526: 31, 544: 31, 556: 31, 568: 31}, - {30, 30, 228: 30, 393: 30, 403: 30, 526: 30, 544: 30, 556: 30, 568: 30}, - {27, 27, 228: 27, 393: 27, 403: 27, 526: 27, 544: 1902, 568: 1901, 785: 1900}, - {404: 1898}, + {438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 13: 438, 438, 438, 438, 438, 438, 438, 438, 438, 31: 438, 45: 438, 232: 438, 438, 235: 438, 238: 438, 242: 438, 247: 438, 264: 438, 272: 438, 303: 438, 387: 438, 438, 438, 438, 438, 438, 397: 438, 438, 438, 438, 438, 438, 407: 438}, + {122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 271: 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 295: 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 316: 122, 380: 122, 387: 122, 122, 122, 122, 122, 122, 397: 122, 122, 122, 122, 122, 122, 406: 122, 122, 122, 410: 122, 414: 122}, + {121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 271: 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 295: 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 316: 121, 380: 121, 387: 121, 121, 121, 121, 121, 121, 397: 121, 121, 121, 121, 121, 121, 406: 121, 121, 121, 410: 121, 414: 121}, + {37, 37, 31: 37, 45: 37, 232: 37, 397: 37, 407: 37}, + {23, 23, 232: 23, 397: 23, 407: 1932, 816: 1931}, // 380 - {230: 1899}, - {28, 28, 228: 28, 393: 28, 403: 28, 526: 28, 544: 28, 568: 28}, - {24, 24, 228: 24, 393: 24, 403: 24, 526: 1909, 787: 1908}, - {544: 1905}, - {404: 1903}, + {30, 30, 232: 30, 397: 30, 407: 30, 531: 30, 548: 30, 560: 1916, 572: 30, 797: 1915}, + {32, 32, 232: 32, 397: 32, 407: 32, 531: 32, 548: 32, 560: 32, 572: 32}, + {31, 31, 232: 31, 397: 31, 407: 31, 531: 31, 548: 31, 560: 31, 572: 31}, + {28, 28, 232: 28, 397: 28, 407: 28, 531: 28, 548: 1921, 572: 1920, 789: 1919}, + {408: 1917}, // 385 - {230: 1904}, - {25, 25, 228: 25, 393: 25, 403: 25, 526: 25}, - {404: 1906}, - {230: 1907}, - {26, 26, 228: 26, 393: 26, 403: 26, 526: 26}, + {234: 1918}, + {29, 29, 232: 29, 397: 29, 407: 29, 531: 29, 548: 29, 572: 29}, + {25, 25, 232: 25, 397: 25, 407: 25, 531: 1928, 791: 1927}, + {548: 1924}, + {408: 1922}, // 390 - {32, 32, 228: 32, 393: 32, 403: 32}, - {404: 1910}, - {230: 1911}, - {23, 23, 228: 23, 393: 23, 403: 23}, - {39, 39, 228: 39, 393: 1923, 802: 1922}, + {234: 1923}, + {26, 26, 232: 26, 397: 26, 407: 26, 531: 26}, + {408: 1925}, + {234: 1926}, + {27, 27, 232: 27, 397: 27, 407: 27, 531: 27}, // 395 - {20, 20, 228: 20, 393: 20, 556: 20, 858: 1914, 1915}, - {18, 18, 228: 18, 393: 18, 556: 1919, 813: 1918}, - {404: 1916}, - {230: 1917}, - {19, 19, 228: 19, 393: 19, 556: 19}, + {33, 33, 232: 33, 397: 33, 407: 33}, + {408: 1929}, + {234: 1930}, + {24, 24, 232: 24, 397: 24, 407: 24}, + {40, 40, 232: 40, 397: 1942, 806: 1941}, // 400 - {21, 21, 228: 21, 393: 21}, - {404: 1920}, - {230: 1921}, - {17, 17, 228: 17, 393: 17}, - {1430, 1430, 228: 1926, 768: 1927}, + {21, 21, 232: 21, 397: 21, 560: 21, 862: 1933, 1934}, + {19, 19, 232: 19, 397: 19, 560: 1938, 817: 1937}, + {408: 1935}, + {234: 1936}, + {20, 20, 232: 20, 397: 20, 560: 20}, // 405 - {266: 1624, 474: 1924}, - {403: 1925}, - {38, 38, 228: 38}, - {2: 1722, 1639, 1673, 1640, 7: 1650, 1727, 1666, 1724, 1687, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 1432, 1758, 1698, 1755, 1781, 1701, 1777, 1702, 1714, 1651, 1660, 1681, 1774, 1775, 1771, 1733, 1780, 1716, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 1719, 1760, 1659, 1658, 1737, 1683, 1700, 1705, 1709, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 1770, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 1706, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 1721, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 1677, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 1638, 1642, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 1834, 1835, 1633, 1840, 1839, 1685, 1842, 1844, 1689, 1753, 1769, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 1855, 1856, 1858, 1852, 1853, 1854, 389: 1928, 1635, 1636, 1634, 479: 1929, 523: 1930, 633: 1931}, - {40, 40}, + {22, 22, 232: 22, 397: 22}, + {408: 1939}, + {234: 1940}, + {18, 18, 232: 18, 397: 18}, + {1444, 1444, 232: 1945, 772: 1946}, // 410 - {1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 254: 1437, 257: 1437, 273: 1437, 1437, 290: 1935, 299: 1437, 319: 1437, 408: 1437, 1437, 411: 1437, 418: 1437, 1437, 1437, 1437, 425: 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437}, - {6: 1434, 21: 1434}, - {6: 1933, 21: 1431}, - {21: 1932}, - {1429, 1429}, + {270: 1638, 478: 1943}, + {407: 1944}, + {39, 39, 232: 39}, + {2: 1736, 1653, 1687, 1654, 7: 1664, 1741, 1680, 1738, 1701, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 1446, 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 1728, 1665, 1674, 1695, 1859, 1788, 1789, 1785, 1747, 1794, 1837, 1839, 1838, 1730, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 1733, 1774, 1673, 1672, 1751, 1714, 1719, 1723, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 1784, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 1720, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 1735, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 1691, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 1652, 1656, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 1852, 1853, 1647, 1858, 1857, 1699, 1860, 1862, 1703, 1767, 1783, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 1873, 1874, 1876, 1870, 1871, 1872, 393: 1947, 1649, 1650, 1648, 483: 1948, 528: 1949, 637: 1950}, + {41, 41}, // 415 - {2: 1722, 1639, 1673, 1640, 7: 1650, 1727, 1666, 1724, 1687, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 1714, 1651, 1660, 1681, 1774, 1775, 1771, 1733, 1780, 1716, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 1719, 1760, 1659, 1658, 1737, 1683, 1700, 1705, 1709, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 1770, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 1706, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 1721, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 1677, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 1638, 1642, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 1834, 1835, 1633, 1840, 1839, 1685, 1842, 1844, 1689, 1753, 1769, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 1855, 1856, 1858, 1852, 1853, 1854, 389: 1928, 1635, 1636, 1634, 479: 1934}, - {6: 1433, 21: 1433}, - {2: 1722, 1639, 1673, 1640, 7: 1650, 1727, 1666, 1724, 1687, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 1714, 1651, 1660, 1681, 1774, 1775, 1771, 1733, 1780, 1716, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 1719, 1760, 1659, 1658, 1737, 1683, 1700, 1705, 1709, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 1770, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 1706, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 1721, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 1677, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 1638, 1642, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 1834, 1835, 1633, 1840, 1839, 1685, 1842, 1844, 1689, 1753, 1769, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 1855, 1856, 1858, 1852, 1853, 1854, 389: 1936, 1635, 1636, 1634}, - {1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 254: 1436, 257: 1436, 273: 1436, 1436, 290: 1937, 299: 1436, 319: 1436, 408: 1436, 1436, 411: 1436, 418: 1436, 1436, 1436, 1436, 425: 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436}, - {2: 1722, 1639, 1673, 1640, 7: 1650, 1727, 1666, 1724, 1687, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 1714, 1651, 1660, 1681, 1774, 1775, 1771, 1733, 1780, 1716, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 1719, 1760, 1659, 1658, 1737, 1683, 1700, 1705, 1709, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 1770, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 1706, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 1721, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 1677, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 1638, 1642, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 1834, 1835, 1633, 1840, 1839, 1685, 1842, 1844, 1689, 1753, 1769, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 1855, 1856, 1858, 1852, 1853, 1854, 389: 1938, 1635, 1636, 1634}, + {1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 258: 1451, 262: 1451, 277: 1451, 1451, 294: 1954, 303: 1451, 323: 1451, 412: 1451, 1451, 415: 1451, 422: 1451, 1451, 1451, 1451, 429: 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451}, + {6: 1448, 21: 1448}, + {6: 1952, 21: 1445}, + {21: 1951}, + {1443, 1443}, // 420 - {1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 254: 1435, 257: 1435, 273: 1435, 1435, 299: 1435, 319: 1435, 408: 1435, 1435, 411: 1435, 418: 1435, 1435, 1435, 1435, 425: 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435}, - {419, 419, 6: 419, 253: 419, 312: 1155, 402: 419, 410: 1155}, - {6: 71, 228: 71, 71, 312: 1117, 410: 1117}, - {6: 67, 228: 67, 67, 312: 1022, 410: 1022}, - {6: 72, 228: 72, 72, 312: 1016, 410: 1016}, + {2: 1736, 1653, 1687, 1654, 7: 1664, 1741, 1680, 1738, 1701, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 1728, 1665, 1674, 1695, 1859, 1788, 1789, 1785, 1747, 1794, 1837, 1839, 1838, 1730, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 1733, 1774, 1673, 1672, 1751, 1714, 1719, 1723, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 1784, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 1720, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 1735, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 1691, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 1652, 1656, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 1852, 1853, 1647, 1858, 1857, 1699, 1860, 1862, 1703, 1767, 1783, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 1873, 1874, 1876, 1870, 1871, 1872, 393: 1947, 1649, 1650, 1648, 483: 1953}, + {6: 1447, 21: 1447}, + {2: 1736, 1653, 1687, 1654, 7: 1664, 1741, 1680, 1738, 1701, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 1728, 1665, 1674, 1695, 1859, 1788, 1789, 1785, 1747, 1794, 1837, 1839, 1838, 1730, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 1733, 1774, 1673, 1672, 1751, 1714, 1719, 1723, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 1784, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 1720, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 1735, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 1691, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 1652, 1656, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 1852, 1853, 1647, 1858, 1857, 1699, 1860, 1862, 1703, 1767, 1783, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 1873, 1874, 1876, 1870, 1871, 1872, 393: 1955, 1649, 1650, 1648}, + {1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 258: 1450, 262: 1450, 277: 1450, 1450, 294: 1956, 303: 1450, 323: 1450, 412: 1450, 1450, 415: 1450, 422: 1450, 1450, 1450, 1450, 429: 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450}, + {2: 1736, 1653, 1687, 1654, 7: 1664, 1741, 1680, 1738, 1701, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 1728, 1665, 1674, 1695, 1859, 1788, 1789, 1785, 1747, 1794, 1837, 1839, 1838, 1730, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 1733, 1774, 1673, 1672, 1751, 1714, 1719, 1723, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 1784, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 1720, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 1735, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 1691, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 1652, 1656, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 1852, 1853, 1647, 1858, 1857, 1699, 1860, 1862, 1703, 1767, 1783, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 1873, 1874, 1876, 1870, 1871, 1872, 393: 1957, 1649, 1650, 1648}, // 425 - {84: 2030, 107: 2029, 312: 999, 410: 999}, - {6: 59, 228: 59, 59, 312: 996, 410: 996}, - {6: 50, 228: 50, 50, 312: 993, 410: 993}, - {420, 420, 6: 420, 253: 420, 312: 121, 402: 420, 410: 121}, - {418, 418, 6: 418, 253: 418, 402: 418}, + {1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 258: 1449, 262: 1449, 277: 1449, 1449, 303: 1449, 323: 1449, 412: 1449, 1449, 415: 1449, 422: 1449, 1449, 1449, 1449, 429: 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449}, + {420, 420, 6: 420, 257: 420, 316: 1167, 406: 420, 414: 1167}, + {6: 72, 232: 72, 72, 316: 1129, 414: 1129}, + {6: 68, 232: 68, 68, 316: 1034, 414: 1034}, + {6: 73, 232: 73, 73, 316: 1028, 414: 1028}, // 430 - {312: 2042, 410: 2041}, - {415, 415, 6: 415, 253: 415, 402: 415}, - {6: 2034, 253: 2035}, - {6: 84, 228: 2031, 84}, - {6: 82, 229: 82}, + {85: 2049, 112: 2048, 316: 1011, 414: 1011}, + {6: 60, 232: 60, 60, 316: 1008, 414: 1008}, + {6: 51, 232: 51, 51, 316: 1005, 414: 1005}, + {421, 421, 6: 421, 257: 421, 316: 122, 406: 421, 414: 122}, + {419, 419, 6: 419, 257: 419, 406: 419}, // 435 - {6: 1982, 229: 1983}, - {6: 80, 51: 1981, 228: 80, 80}, - {6: 78, 106: 1980, 228: 78, 78}, - {6: 77, 22: 1976, 57: 1977, 59: 1974, 106: 1978, 175: 1975, 228: 77, 77}, - {6: 75, 228: 75, 75}, + {316: 2061, 414: 2060}, + {416, 416, 6: 416, 257: 416, 406: 416}, + {6: 2053, 257: 2054}, + {6: 85, 232: 2050, 85}, + {6: 83, 233: 83}, // 440 - {6: 74, 228: 74, 74}, - {6: 73, 57: 1973, 228: 73, 73}, - {6: 70, 228: 70, 70}, - {6: 69, 228: 69, 69}, - {6: 68, 228: 68, 68}, + {6: 2001, 233: 2002}, + {6: 81, 52: 2000, 232: 81, 81}, + {6: 79, 109: 1999, 232: 79, 79}, + {6: 78, 22: 1995, 59: 1996, 61: 1993, 109: 1997, 179: 1994, 232: 78, 78}, + {6: 76, 232: 76, 76}, // 445 - {22: 1972, 646: 1971}, - {6: 65, 228: 65, 65}, - {583: 1970}, - {6: 63, 228: 63, 63}, - {6: 60, 228: 60, 60}, + {6: 75, 232: 75, 75}, + {6: 74, 59: 1992, 232: 74, 74}, + {6: 71, 232: 71, 71}, + {6: 70, 232: 70, 70}, + {6: 69, 232: 69, 69}, // 450 - {26: 1969}, - {6: 57, 228: 57, 57}, - {6: 64, 228: 64, 64}, - {6: 66, 228: 66, 66}, - {6: 55, 228: 55, 55}, + {22: 1991, 650: 1990}, + {6: 66, 232: 66, 66}, + {587: 1989}, + {6: 64, 232: 64, 64}, + {6: 61, 232: 61, 61}, // 455 - {6: 53, 228: 53, 53}, - {6: 76, 228: 76, 76}, - {26: 1979}, - {6: 56, 228: 56, 56}, - {6: 54, 228: 54, 54}, + {26: 1988}, + {6: 58, 232: 58, 58}, + {6: 65, 232: 65, 65}, + {6: 67, 232: 67, 67}, + {6: 56, 232: 56, 56}, // 460 - {6: 52, 228: 52, 52}, - {6: 58, 228: 58, 58}, - {6: 51, 228: 51, 51}, - {6: 79, 228: 79, 79}, - {69: 2024, 131: 2028, 155: 2023, 161: 2027, 163: 2026, 174: 2025, 242: 1968, 314: 1961, 387: 1966, 394: 1962, 401: 1960, 411: 1959, 413: 1955, 478: 1954, 494: 1964, 502: 1958, 543: 1956, 546: 1965, 552: 1963, 613: 2022, 1951, 620: 1957, 1967}, + {6: 54, 232: 54, 54}, + {6: 77, 232: 77, 77}, + {26: 1998}, + {6: 57, 232: 57, 57}, + {6: 55, 232: 55, 55}, // 465 - {2: 49, 49, 49, 49, 7: 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 22: 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 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, 269: 49, 486: 1984, 695: 1985}, - {2: 48, 48, 48, 48, 7: 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 22: 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 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, 269: 48}, - {2: 1722, 1639, 1673, 1640, 7: 1650, 1727, 1666, 1724, 1687, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 1714, 1651, 1660, 1681, 1774, 1775, 1771, 1733, 1780, 1716, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 1719, 1760, 1659, 1658, 1737, 1683, 1700, 1705, 1709, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 1770, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 1706, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 1721, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 1677, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 1638, 1642, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 1834, 1835, 1633, 1840, 1839, 1685, 1842, 1844, 1689, 1753, 1769, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 1855, 1856, 1858, 1852, 1853, 1854, 269: 1986, 389: 1987, 1635, 1636, 1634, 712: 1988}, - {253: 47, 290: 2020, 402: 47}, - {253: 43, 290: 2017, 402: 43}, + {6: 53, 232: 53, 53}, + {6: 59, 232: 59, 59}, + {6: 52, 232: 52, 52}, + {6: 80, 232: 80, 80}, + {70: 2043, 136: 2047, 159: 2042, 165: 2046, 167: 2045, 178: 2044, 246: 1987, 318: 1980, 391: 1985, 398: 1981, 405: 1979, 415: 1978, 417: 1974, 482: 1973, 498: 1983, 506: 1977, 547: 1975, 550: 1984, 556: 1982, 616: 2041, 1970, 624: 1976, 1986}, // 470 - {253: 1989}, - {2: 1722, 1639, 1673, 1640, 7: 1650, 1727, 1666, 1724, 1687, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 1714, 1651, 1660, 1681, 1774, 1775, 1771, 1733, 1780, 1716, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 1719, 1760, 1659, 1658, 1737, 1683, 1700, 1705, 1709, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 1770, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 1706, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 1721, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 1677, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 1638, 1642, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 1834, 1835, 1633, 1840, 1839, 1685, 1842, 1844, 1689, 1753, 1769, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 1855, 1856, 1858, 1852, 1853, 1854, 230: 1889, 311: 1991, 389: 1890, 1635, 1636, 1634, 473: 1990, 501: 1992, 574: 1993, 590: 1994}, - {429, 429, 6: 429, 22: 429, 41: 429, 239: 429, 254: 429, 312: 2015, 406: 429, 410: 2014}, - {786, 786, 6: 786, 22: 786, 41: 786, 228: 2011, 239: 786, 254: 786, 406: 786, 701: 2012}, - {104, 104, 6: 104, 41: 1998, 239: 104, 759: 1997}, + {2: 50, 50, 50, 50, 7: 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 22: 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 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, 273: 50, 490: 2003, 699: 2004}, + {2: 49, 49, 49, 49, 7: 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 22: 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 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, 273: 49}, + {2: 1736, 1653, 1687, 1654, 7: 1664, 1741, 1680, 1738, 1701, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 1728, 1665, 1674, 1695, 1859, 1788, 1789, 1785, 1747, 1794, 1837, 1839, 1838, 1730, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 1733, 1774, 1673, 1672, 1751, 1714, 1719, 1723, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 1784, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 1720, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 1735, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 1691, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 1652, 1656, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 1852, 1853, 1647, 1858, 1857, 1699, 1860, 1862, 1703, 1767, 1783, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 1873, 1874, 1876, 1870, 1871, 1872, 273: 2005, 393: 2006, 1649, 1650, 1648, 716: 2007}, + {257: 48, 294: 2039, 406: 48}, + {257: 44, 294: 2036, 406: 44}, // 475 - {106, 106, 6: 106, 239: 106}, - {42, 42, 6: 1995}, - {2: 1722, 1639, 1673, 1640, 7: 1650, 1727, 1666, 1724, 1687, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 1714, 1651, 1660, 1681, 1774, 1775, 1771, 1733, 1780, 1716, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 1719, 1760, 1659, 1658, 1737, 1683, 1700, 1705, 1709, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 1770, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 1706, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 1721, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 1677, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 1638, 1642, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 1834, 1835, 1633, 1840, 1839, 1685, 1842, 1844, 1689, 1753, 1769, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 1855, 1856, 1858, 1852, 1853, 1854, 230: 1889, 311: 1991, 389: 1890, 1635, 1636, 1634, 473: 1990, 501: 1992, 574: 1996}, - {105, 105, 6: 105, 239: 105}, - {107, 107, 6: 107, 239: 107}, + {257: 2008}, + {2: 1736, 1653, 1687, 1654, 7: 1664, 1741, 1680, 1738, 1701, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 1728, 1665, 1674, 1695, 1859, 1788, 1789, 1785, 1747, 1794, 1837, 1839, 1838, 1730, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 1733, 1774, 1673, 1672, 1751, 1714, 1719, 1723, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 1784, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 1720, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 1735, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 1691, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 1652, 1656, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 1852, 1853, 1647, 1858, 1857, 1699, 1860, 1862, 1703, 1767, 1783, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 1873, 1874, 1876, 1870, 1871, 1872, 234: 1908, 315: 2010, 393: 1909, 1649, 1650, 1648, 477: 2009, 505: 2011, 578: 2012, 593: 2013}, + {430, 430, 6: 430, 22: 430, 46: 430, 243: 430, 258: 430, 316: 2034, 410: 430, 414: 2033}, + {794, 794, 6: 794, 22: 794, 46: 794, 232: 2030, 243: 794, 258: 794, 410: 794, 705: 2031}, + {105, 105, 6: 105, 46: 2017, 243: 105, 763: 2016}, // 480 - {239: 2000, 404: 1999}, - {11: 2009, 230: 2006, 576: 2008}, - {2: 1722, 1639, 1673, 1640, 7: 1650, 1727, 1666, 1724, 1687, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 1714, 1651, 1660, 1681, 1774, 1775, 1771, 1733, 1780, 1716, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 1719, 1760, 1659, 1658, 1737, 1683, 1700, 1705, 1709, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 1770, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 1706, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 1721, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 1677, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 1638, 1642, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 1834, 1835, 1633, 1840, 1839, 1685, 1842, 1844, 1689, 1753, 1769, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 1855, 1856, 1858, 1852, 1853, 1854, 230: 1889, 389: 1890, 1635, 1636, 1634, 473: 2001}, - {102, 102, 6: 102, 234: 2003, 239: 102, 404: 2002}, - {230: 2006, 576: 2007}, + {107, 107, 6: 107, 243: 107}, + {43, 43, 6: 2014}, + {2: 1736, 1653, 1687, 1654, 7: 1664, 1741, 1680, 1738, 1701, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 1728, 1665, 1674, 1695, 1859, 1788, 1789, 1785, 1747, 1794, 1837, 1839, 1838, 1730, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 1733, 1774, 1673, 1672, 1751, 1714, 1719, 1723, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 1784, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 1720, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 1735, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 1691, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 1652, 1656, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 1852, 1853, 1647, 1858, 1857, 1699, 1860, 1862, 1703, 1767, 1783, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 1873, 1874, 1876, 1870, 1871, 1872, 234: 1908, 315: 2010, 393: 1909, 1649, 1650, 1648, 477: 2009, 505: 2011, 578: 2015}, + {106, 106, 6: 106, 243: 106}, + {108, 108, 6: 108, 243: 108}, // 485 - {230: 2005, 676: 2004}, - {100, 100, 6: 100, 239: 100}, - {98, 98, 6: 98, 239: 98}, - {421, 421, 6: 421, 21: 421, 239: 421}, - {101, 101, 6: 101, 239: 101}, + {243: 2019, 408: 2018}, + {11: 2028, 234: 2025, 580: 2027}, + {2: 1736, 1653, 1687, 1654, 7: 1664, 1741, 1680, 1738, 1701, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 1728, 1665, 1674, 1695, 1859, 1788, 1789, 1785, 1747, 1794, 1837, 1839, 1838, 1730, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 1733, 1774, 1673, 1672, 1751, 1714, 1719, 1723, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 1784, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 1720, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 1735, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 1691, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 1652, 1656, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 1852, 1853, 1647, 1858, 1857, 1699, 1860, 1862, 1703, 1767, 1783, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 1873, 1874, 1876, 1870, 1871, 1872, 234: 1908, 393: 1909, 1649, 1650, 1648, 477: 2020}, + {103, 103, 6: 103, 238: 2022, 243: 103, 408: 2021}, + {234: 2025, 580: 2026}, // 490 - {103, 103, 6: 103, 239: 103}, - {230: 2005, 676: 2010}, - {99, 99, 6: 99, 239: 99}, - {21: 2013}, - {426, 426, 6: 426, 22: 426, 41: 426, 239: 426, 254: 426, 406: 426}, + {234: 2024, 680: 2023}, + {101, 101, 6: 101, 243: 101}, + {99, 99, 6: 99, 243: 99}, + {422, 422, 6: 422, 21: 422, 243: 422}, + {102, 102, 6: 102, 243: 102}, // 495 - {785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 229: 785, 785, 785, 785, 785, 785, 785, 785, 785, 239: 785, 785, 785, 785, 244: 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 268: 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 291: 785, 785, 785, 785, 785, 785, 785, 785, 300: 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 382: 785, 406: 785}, - {2: 1722, 1639, 1673, 1640, 7: 1650, 1727, 1666, 1724, 1687, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 1714, 1651, 1660, 1681, 1774, 1775, 1771, 1733, 1780, 1716, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 1719, 1760, 1659, 1658, 1737, 1683, 1700, 1705, 1709, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 1770, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 1706, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 1721, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 1677, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 1638, 1642, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 1834, 1835, 1633, 1840, 1839, 1685, 1842, 1844, 1689, 1753, 1769, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 1855, 1856, 1858, 1852, 1853, 1854, 230: 1889, 389: 1890, 1635, 1636, 1634, 473: 2016}, - {427, 427, 6: 427, 22: 427, 41: 427, 239: 427, 254: 427, 406: 427}, - {428, 428, 6: 428, 22: 428, 41: 428, 239: 428, 254: 428, 406: 428}, - {2: 1722, 1639, 1673, 1640, 7: 1650, 1727, 1666, 1724, 1687, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 1714, 1651, 1660, 1681, 1774, 1775, 1771, 1733, 1780, 1716, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 1719, 1760, 1659, 1658, 1737, 1683, 1700, 1705, 1709, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 1770, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 1706, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 1721, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 1677, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 1638, 1642, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 1834, 1835, 1633, 1840, 1839, 1685, 1842, 1844, 1689, 1753, 1769, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 1855, 1856, 1858, 1852, 1853, 1854, 269: 2018, 389: 2019, 1635, 1636, 1634}, + {104, 104, 6: 104, 243: 104}, + {234: 2024, 680: 2029}, + {100, 100, 6: 100, 243: 100}, + {21: 2032}, + {427, 427, 6: 427, 22: 427, 46: 427, 243: 427, 258: 427, 410: 427}, // 500 - {253: 45, 402: 45}, - {253: 44, 402: 44}, - {269: 2021}, - {253: 46, 402: 46}, - {6: 81, 229: 81}, + {793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 233: 793, 793, 793, 793, 793, 793, 793, 793, 793, 243: 793, 793, 793, 793, 248: 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 271: 793, 273: 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 295: 793, 793, 793, 793, 793, 793, 793, 793, 304: 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 380: 793, 410: 793}, + {2: 1736, 1653, 1687, 1654, 7: 1664, 1741, 1680, 1738, 1701, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 1728, 1665, 1674, 1695, 1859, 1788, 1789, 1785, 1747, 1794, 1837, 1839, 1838, 1730, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 1733, 1774, 1673, 1672, 1751, 1714, 1719, 1723, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 1784, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 1720, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 1735, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 1691, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 1652, 1656, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 1852, 1853, 1647, 1858, 1857, 1699, 1860, 1862, 1703, 1767, 1783, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 1873, 1874, 1876, 1870, 1871, 1872, 234: 1908, 393: 1909, 1649, 1650, 1648, 477: 2035}, + {428, 428, 6: 428, 22: 428, 46: 428, 243: 428, 258: 428, 410: 428}, + {429, 429, 6: 429, 22: 429, 46: 429, 243: 429, 258: 429, 410: 429}, + {2: 1736, 1653, 1687, 1654, 7: 1664, 1741, 1680, 1738, 1701, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 1728, 1665, 1674, 1695, 1859, 1788, 1789, 1785, 1747, 1794, 1837, 1839, 1838, 1730, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 1733, 1774, 1673, 1672, 1751, 1714, 1719, 1723, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 1784, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 1720, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 1735, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 1691, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 1652, 1656, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 1852, 1853, 1647, 1858, 1857, 1699, 1860, 1862, 1703, 1767, 1783, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 1873, 1874, 1876, 1870, 1871, 1872, 273: 2037, 393: 2038, 1649, 1650, 1648}, // 505 - {6: 72, 228: 72, 72}, - {6: 71, 228: 71, 71}, - {6: 67, 228: 67, 67}, - {84: 2030, 107: 2029}, - {6: 59, 228: 59, 59}, + {257: 46, 406: 46}, + {257: 45, 406: 45}, + {273: 2040}, + {257: 47, 406: 47}, + {6: 82, 233: 82}, // 510 - {6: 50, 228: 50, 50}, - {6: 62, 228: 62, 62}, - {6: 61, 228: 61, 61}, - {2: 1722, 1639, 1673, 1640, 7: 1650, 1727, 1666, 1724, 1687, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 1714, 1651, 1660, 1681, 1774, 1775, 1771, 1733, 1780, 1716, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 1719, 1760, 1659, 1658, 1737, 1683, 1700, 1705, 1709, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 1770, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 1706, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 1721, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 1677, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 1638, 1642, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 1834, 1835, 1633, 1840, 1839, 1685, 1842, 1844, 1689, 1753, 1769, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 1855, 1856, 1858, 1852, 1853, 1854, 389: 1928, 1635, 1636, 1634, 479: 1929, 523: 2032}, - {6: 1933, 21: 2033}, + {6: 73, 232: 73, 73}, + {6: 72, 232: 72, 72}, + {6: 68, 232: 68, 68}, + {85: 2049, 112: 2048}, + {6: 60, 232: 60, 60}, // 515 - {6: 83, 229: 83}, - {2: 1722, 1639, 1673, 1640, 7: 1650, 1727, 1666, 1724, 1687, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 1714, 1651, 1660, 1681, 1774, 1775, 1771, 1733, 1780, 1716, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 1719, 1760, 1659, 1658, 1737, 1683, 1700, 1705, 1709, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 1770, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 1706, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 1721, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 1677, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 1638, 1642, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 1834, 1835, 1939, 1840, 1839, 1685, 1842, 1844, 1689, 1753, 1769, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 1855, 1856, 1858, 1852, 1853, 1854, 230: 1946, 389: 1890, 1635, 1636, 1634, 473: 1948, 516: 2040, 1947}, - {2: 1722, 1639, 1673, 1640, 7: 1650, 1727, 1666, 1724, 1687, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 1714, 1651, 1660, 1681, 1774, 1775, 1771, 1733, 1780, 1716, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 1719, 1760, 1659, 1658, 1737, 1683, 1700, 1705, 1709, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 1770, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 1706, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 1721, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 1677, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 1638, 1642, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 1834, 1835, 1633, 1840, 1839, 1685, 1842, 1844, 1689, 1753, 1769, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 1855, 1856, 1858, 1852, 1853, 1854, 230: 1889, 311: 1991, 389: 1890, 1635, 1636, 1634, 473: 1990, 501: 2036, 573: 2037}, - {425, 425, 6: 425}, - {41, 41, 6: 2038}, + {6: 51, 232: 51, 51}, + {6: 63, 232: 63, 63}, + {6: 62, 232: 62, 62}, + {2: 1736, 1653, 1687, 1654, 7: 1664, 1741, 1680, 1738, 1701, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 1728, 1665, 1674, 1695, 1859, 1788, 1789, 1785, 1747, 1794, 1837, 1839, 1838, 1730, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 1733, 1774, 1673, 1672, 1751, 1714, 1719, 1723, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 1784, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 1720, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 1735, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 1691, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 1652, 1656, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 1852, 1853, 1647, 1858, 1857, 1699, 1860, 1862, 1703, 1767, 1783, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 1873, 1874, 1876, 1870, 1871, 1872, 393: 1947, 1649, 1650, 1648, 483: 1948, 528: 2051}, + {6: 1952, 21: 2052}, // 520 - {2: 1722, 1639, 1673, 1640, 7: 1650, 1727, 1666, 1724, 1687, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 1714, 1651, 1660, 1681, 1774, 1775, 1771, 1733, 1780, 1716, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 1719, 1760, 1659, 1658, 1737, 1683, 1700, 1705, 1709, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 1770, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 1706, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 1721, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 1677, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 1638, 1642, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 1834, 1835, 1633, 1840, 1839, 1685, 1842, 1844, 1689, 1753, 1769, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 1855, 1856, 1858, 1852, 1853, 1854, 230: 1889, 311: 1991, 389: 1890, 1635, 1636, 1634, 473: 1990, 501: 2039}, - {424, 424, 6: 424}, - {414, 414, 6: 414, 253: 414, 402: 414}, - {2: 1722, 1639, 1673, 1640, 7: 1650, 1727, 1666, 1724, 1687, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 1714, 1651, 1660, 1681, 1774, 1775, 1771, 1733, 1780, 1716, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 1719, 1760, 1659, 1658, 1737, 1683, 1700, 1705, 1709, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 1770, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 1706, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 1721, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 1677, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 1638, 1642, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 1834, 1835, 1633, 1840, 1839, 1685, 1842, 1844, 1689, 1753, 1769, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 1855, 1856, 1858, 1852, 1853, 1854, 230: 1889, 389: 1890, 1635, 1636, 1634, 473: 2043}, - {416, 416, 6: 416, 253: 416, 402: 416}, + {6: 84, 233: 84}, + {2: 1736, 1653, 1687, 1654, 7: 1664, 1741, 1680, 1738, 1701, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 1728, 1665, 1674, 1695, 1859, 1788, 1789, 1785, 1747, 1794, 1837, 1839, 1838, 1730, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 1733, 1774, 1673, 1672, 1751, 1714, 1719, 1723, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 1784, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 1720, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 1735, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 1691, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 1652, 1656, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 1852, 1853, 1958, 1858, 1857, 1699, 1860, 1862, 1703, 1767, 1783, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 1873, 1874, 1876, 1870, 1871, 1872, 234: 1965, 393: 1909, 1649, 1650, 1648, 477: 1967, 520: 2059, 1966}, + {2: 1736, 1653, 1687, 1654, 7: 1664, 1741, 1680, 1738, 1701, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 1728, 1665, 1674, 1695, 1859, 1788, 1789, 1785, 1747, 1794, 1837, 1839, 1838, 1730, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 1733, 1774, 1673, 1672, 1751, 1714, 1719, 1723, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 1784, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 1720, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 1735, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 1691, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 1652, 1656, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 1852, 1853, 1647, 1858, 1857, 1699, 1860, 1862, 1703, 1767, 1783, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 1873, 1874, 1876, 1870, 1871, 1872, 234: 1908, 315: 2010, 393: 1909, 1649, 1650, 1648, 477: 2009, 505: 2055, 577: 2056}, + {426, 426, 6: 426}, + {42, 42, 6: 2057}, // 525 - {417, 417, 6: 417, 253: 417, 402: 417}, - {6: 2034, 402: 2063}, - {6: 1982, 229: 2046}, - {2: 49, 49, 49, 49, 7: 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 22: 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 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, 269: 49, 486: 1984, 695: 2047}, - {2: 1722, 1639, 1673, 1640, 7: 1650, 1727, 1666, 1724, 1687, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 1714, 1651, 1660, 1681, 1774, 1775, 1771, 1733, 1780, 1716, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 1719, 1760, 1659, 1658, 1737, 1683, 1700, 1705, 1709, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 1770, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 1706, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 1721, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 1677, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 1638, 1642, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 1834, 1835, 1633, 1840, 1839, 1685, 1842, 1844, 1689, 1753, 1769, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 1855, 1856, 1858, 1852, 1853, 1854, 269: 1986, 389: 1987, 1635, 1636, 1634, 712: 2048}, + {2: 1736, 1653, 1687, 1654, 7: 1664, 1741, 1680, 1738, 1701, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 1728, 1665, 1674, 1695, 1859, 1788, 1789, 1785, 1747, 1794, 1837, 1839, 1838, 1730, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 1733, 1774, 1673, 1672, 1751, 1714, 1719, 1723, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 1784, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 1720, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 1735, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 1691, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 1652, 1656, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 1852, 1853, 1647, 1858, 1857, 1699, 1860, 1862, 1703, 1767, 1783, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 1873, 1874, 1876, 1870, 1871, 1872, 234: 1908, 315: 2010, 393: 1909, 1649, 1650, 1648, 477: 2009, 505: 2058}, + {425, 425, 6: 425}, + {415, 415, 6: 415, 257: 415, 406: 415}, + {2: 1736, 1653, 1687, 1654, 7: 1664, 1741, 1680, 1738, 1701, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 1728, 1665, 1674, 1695, 1859, 1788, 1789, 1785, 1747, 1794, 1837, 1839, 1838, 1730, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 1733, 1774, 1673, 1672, 1751, 1714, 1719, 1723, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 1784, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 1720, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 1735, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 1691, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 1652, 1656, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 1852, 1853, 1647, 1858, 1857, 1699, 1860, 1862, 1703, 1767, 1783, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 1873, 1874, 1876, 1870, 1871, 1872, 234: 1908, 393: 1909, 1649, 1650, 1648, 477: 2062}, + {417, 417, 6: 417, 257: 417, 406: 417}, // 530 - {402: 2049}, - {2: 1722, 1639, 1673, 1640, 7: 1650, 1727, 1666, 1724, 1687, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 1714, 1651, 1660, 1681, 1774, 1775, 1771, 1733, 1780, 1716, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 1719, 1760, 1659, 1658, 1737, 1683, 1700, 1705, 1709, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 1770, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 1706, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 1721, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 1677, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 1638, 1642, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 1834, 1835, 1633, 1840, 1839, 1685, 1842, 1844, 1689, 1753, 1769, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 1855, 1856, 1858, 1852, 1853, 1854, 230: 1889, 311: 1991, 389: 1890, 1635, 1636, 1634, 473: 1990, 501: 1992, 574: 1993, 590: 2050}, - {90, 90, 6: 1995, 239: 2052, 898: 2051}, - {92, 92}, - {146: 2056, 2054, 2055, 2057, 546: 2053}, + {418, 418, 6: 418, 257: 418, 406: 418}, + {6: 2053, 406: 2082}, + {6: 2001, 233: 2065}, + {2: 50, 50, 50, 50, 7: 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 22: 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 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, 273: 50, 490: 2003, 699: 2066}, + {2: 1736, 1653, 1687, 1654, 7: 1664, 1741, 1680, 1738, 1701, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 1728, 1665, 1674, 1695, 1859, 1788, 1789, 1785, 1747, 1794, 1837, 1839, 1838, 1730, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 1733, 1774, 1673, 1672, 1751, 1714, 1719, 1723, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 1784, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 1720, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 1735, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 1691, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 1652, 1656, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 1852, 1853, 1647, 1858, 1857, 1699, 1860, 1862, 1703, 1767, 1783, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 1873, 1874, 1876, 1870, 1871, 1872, 273: 2005, 393: 2006, 1649, 1650, 1648, 716: 2067}, // 535 - {583: 2062}, - {266: 1624, 474: 2061}, - {266: 1624, 474: 2060}, - {266: 1624, 474: 2059}, - {266: 1624, 474: 2058}, + {406: 2068}, + {2: 1736, 1653, 1687, 1654, 7: 1664, 1741, 1680, 1738, 1701, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 1728, 1665, 1674, 1695, 1859, 1788, 1789, 1785, 1747, 1794, 1837, 1839, 1838, 1730, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 1733, 1774, 1673, 1672, 1751, 1714, 1719, 1723, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 1784, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 1720, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 1735, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 1691, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 1652, 1656, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 1852, 1853, 1647, 1858, 1857, 1699, 1860, 1862, 1703, 1767, 1783, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 1873, 1874, 1876, 1870, 1871, 1872, 234: 1908, 315: 2010, 393: 1909, 1649, 1650, 1648, 477: 2009, 505: 2011, 578: 2012, 593: 2069}, + {91, 91, 6: 2014, 243: 2071, 902: 2070}, + {93, 93}, + {150: 2075, 2073, 2074, 2076, 550: 2072}, // 540 - {85, 85}, + {587: 2081}, + {270: 1638, 478: 2080}, + {270: 1638, 478: 2079}, + {270: 1638, 478: 2078}, + {270: 1638, 478: 2077}, + // 545 {86, 86}, {87, 87}, {88, 88}, {89, 89}, - // 545 - {2: 1722, 1639, 1673, 1640, 7: 1650, 1727, 1666, 1724, 1687, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 1714, 1651, 1660, 1681, 1774, 1775, 1771, 1733, 1780, 1716, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 1719, 1760, 1659, 1658, 1737, 1683, 1700, 1705, 1709, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 1770, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 1706, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 1721, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 1677, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 1638, 1642, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 1834, 1835, 1633, 1840, 1839, 1685, 1842, 1844, 1689, 1753, 1769, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 1855, 1856, 1858, 1852, 1853, 1854, 230: 1889, 311: 1991, 389: 1890, 1635, 1636, 1634, 473: 1990, 501: 2036, 573: 2064}, - {91, 91, 6: 2038}, - {1353, 1353, 7: 1353, 238: 1353, 249: 1353, 261: 1353, 268: 1353, 395: 1353}, - {117, 117}, - {42: 2942, 44: 2941, 2940, 2939, 736: 2938, 786: 2937, 869: 2936}, + {90, 90}, // 550 - {2: 662, 662, 662, 662, 7: 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 22: 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 315: 662, 393: 662, 495: 2071, 2070, 2069, 570: 2072}, - {2: 661, 661, 661, 661, 7: 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 22: 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 230: 661, 661, 661, 661, 235: 661, 661, 661, 661, 243: 661, 253: 661, 255: 661, 266: 661, 661, 269: 661, 290: 661, 299: 661, 311: 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 393: 661, 493: 661, 513: 661}, - {2: 660, 660, 660, 660, 7: 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 22: 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 230: 660, 660, 660, 660, 235: 660, 660, 660, 660, 243: 660, 253: 660, 255: 660, 266: 660, 660, 269: 660, 290: 660, 299: 660, 311: 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 393: 660, 493: 660, 513: 660}, - {2: 659, 659, 659, 659, 7: 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 22: 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 230: 659, 659, 659, 659, 235: 659, 659, 659, 659, 243: 659, 253: 659, 255: 659, 266: 659, 659, 269: 659, 290: 659, 299: 659, 311: 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 393: 659, 493: 659, 513: 659}, - {2: 1168, 1168, 1168, 1168, 7: 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 22: 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 315: 1168, 393: 2073, 579: 2074}, + {2: 1736, 1653, 1687, 1654, 7: 1664, 1741, 1680, 1738, 1701, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 1728, 1665, 1674, 1695, 1859, 1788, 1789, 1785, 1747, 1794, 1837, 1839, 1838, 1730, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 1733, 1774, 1673, 1672, 1751, 1714, 1719, 1723, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 1784, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 1720, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 1735, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 1691, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 1652, 1656, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 1852, 1853, 1647, 1858, 1857, 1699, 1860, 1862, 1703, 1767, 1783, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 1873, 1874, 1876, 1870, 1871, 1872, 234: 1908, 315: 2010, 393: 1909, 1649, 1650, 1648, 477: 2009, 505: 2055, 577: 2083}, + {92, 92, 6: 2057}, + {1367, 1367, 7: 1367, 242: 1367, 256: 1367, 264: 1367, 271: 1367, 399: 1367}, + {118, 118}, + {28: 2957, 34: 2956, 40: 2955, 2954, 2953, 740: 2952, 790: 2951, 873: 2950}, // 555 - {2: 1167, 1167, 1167, 1167, 7: 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 22: 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 253: 1167, 315: 1167, 486: 1167, 513: 1167}, - {2: 1722, 1639, 1673, 1640, 7: 1650, 1727, 1666, 1724, 1687, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 1714, 1651, 1660, 1681, 1774, 1775, 1771, 1733, 1780, 1716, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 1719, 1760, 1659, 1658, 1737, 1683, 1700, 1705, 1709, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 1770, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 1706, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 1721, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 1677, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 1638, 1642, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 1834, 1835, 1633, 1840, 1839, 1685, 1842, 1844, 1689, 1753, 1769, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 1855, 1856, 1858, 1852, 1853, 1854, 2082, 315: 2078, 389: 1860, 1635, 1636, 1634, 472: 2081, 506: 2080, 2079, 2077, 533: 2075, 555: 2076}, - {566, 566, 6: 566, 21: 566, 229: 566, 239: 566, 566, 566, 566, 244: 566, 566, 247: 566, 249: 566, 256: 566, 566, 566, 260: 566}, - {6: 2872, 257: 2933}, - {6: 564, 232: 2101, 2102, 255: 2100, 257: 2915, 259: 2103, 262: 2104, 2105, 2099, 521: 2098, 524: 2097}, + {2: 670, 670, 670, 670, 7: 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 22: 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 319: 670, 397: 670, 499: 2090, 2089, 2088, 574: 2091}, + {2: 669, 669, 669, 669, 7: 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 22: 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 234: 669, 669, 669, 669, 239: 669, 669, 669, 669, 247: 669, 257: 669, 259: 669, 270: 669, 272: 669, 669, 294: 669, 303: 669, 315: 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 381: 669, 669, 669, 669, 669, 669, 397: 669, 497: 669, 517: 669}, + {2: 668, 668, 668, 668, 7: 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 22: 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 234: 668, 668, 668, 668, 239: 668, 668, 668, 668, 247: 668, 257: 668, 259: 668, 270: 668, 272: 668, 668, 294: 668, 303: 668, 315: 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 381: 668, 668, 668, 668, 668, 668, 397: 668, 497: 668, 517: 668}, + {2: 667, 667, 667, 667, 7: 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 22: 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 234: 667, 667, 667, 667, 239: 667, 667, 667, 667, 247: 667, 257: 667, 259: 667, 270: 667, 272: 667, 667, 294: 667, 303: 667, 315: 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 381: 667, 667, 667, 667, 667, 667, 397: 667, 497: 667, 517: 667}, + {2: 1180, 1180, 1180, 1180, 7: 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 22: 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 319: 1180, 397: 2092, 583: 2093}, // 560 - {2: 1722, 1639, 1673, 1640, 7: 1650, 1727, 1666, 1724, 1687, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 1714, 1651, 1660, 1681, 1774, 1775, 1771, 1733, 1780, 1716, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 1719, 1760, 1659, 1658, 1737, 1683, 1700, 1705, 1709, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 1770, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 1706, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 1721, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 1677, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 1638, 1642, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 1834, 1835, 1633, 1840, 1839, 1685, 1842, 1844, 1689, 1753, 1769, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 1855, 1856, 1858, 1852, 1853, 1854, 389: 2912, 1635, 1636, 1634}, - {562, 562, 6: 562, 21: 562, 229: 562, 232: 562, 562, 239: 562, 562, 562, 562, 244: 562, 562, 247: 562, 249: 562, 255: 562, 562, 562, 562, 562, 562, 262: 562, 562, 562, 562}, - {561, 561, 6: 561, 21: 561, 229: 561, 232: 561, 561, 239: 561, 561, 561, 561, 244: 561, 561, 247: 561, 249: 561, 255: 561, 561, 561, 561, 561, 561, 262: 561, 561, 561, 561}, - {556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 229: 556, 232: 556, 556, 556, 239: 556, 556, 556, 556, 244: 556, 556, 247: 556, 249: 556, 255: 556, 556, 556, 556, 556, 556, 262: 556, 556, 556, 556, 393: 556, 396: 2876, 405: 556, 407: 556, 839: 2875}, - {2: 1722, 1639, 1673, 1640, 7: 1650, 1727, 1666, 1724, 1687, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 1714, 1651, 1660, 1681, 1774, 1775, 1771, 1733, 1780, 1716, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 1719, 1760, 1659, 1658, 1737, 1683, 1700, 1705, 1709, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 1770, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 1706, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 1721, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 1677, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 1638, 1642, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 1834, 1835, 1633, 1840, 1839, 1685, 1842, 1844, 1689, 1753, 1769, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 1855, 1856, 1858, 1852, 1853, 1854, 2085, 315: 2078, 389: 1860, 1635, 1636, 1634, 394: 1546, 472: 2081, 481: 2086, 1547, 1548, 1549, 488: 1552, 490: 1551, 2087, 506: 2080, 2079, 2084, 533: 2075, 555: 2083}, + {2: 1179, 1179, 1179, 1179, 7: 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 22: 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 257: 1179, 319: 1179, 490: 1179, 517: 1179}, + {2: 1736, 1653, 1687, 1654, 7: 1664, 1741, 1680, 1738, 1701, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 1728, 1665, 1674, 1695, 1859, 1788, 1789, 1785, 1747, 1794, 1837, 1839, 1838, 1730, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 1733, 1774, 1673, 1672, 1751, 1714, 1719, 1723, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 1784, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 1720, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 1735, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 1691, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 1652, 1656, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 1852, 1853, 1647, 1858, 1857, 1699, 1860, 1862, 1703, 1767, 1783, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 1873, 1874, 1876, 1870, 1871, 1872, 2102, 319: 2097, 393: 1878, 1649, 1650, 1648, 452: 2101, 476: 2100, 510: 2099, 2098, 2096, 537: 2094, 559: 2095}, + {574, 574, 6: 574, 21: 574, 233: 574, 243: 574, 574, 574, 574, 248: 574, 574, 251: 574, 256: 574, 260: 574, 574, 574, 265: 574}, + {6: 2886, 262: 2947}, + {6: 572, 236: 2122, 2123, 259: 2121, 262: 2929, 2124, 266: 2125, 2126, 2120, 526: 2119, 529: 2118}, // 565 - {6: 2872, 21: 2873}, - {564, 564, 6: 564, 21: 564, 229: 564, 232: 2101, 2102, 239: 564, 564, 564, 564, 244: 564, 564, 247: 564, 249: 564, 255: 2100, 564, 564, 564, 2103, 564, 262: 2104, 2105, 2099, 521: 2098, 524: 2097}, - {2: 1722, 1639, 1673, 1640, 7: 1650, 1727, 1666, 1724, 1687, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 1714, 1651, 1660, 1681, 1774, 1775, 1771, 1733, 1780, 1716, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 1719, 1760, 1659, 1658, 1737, 1683, 1700, 1705, 1709, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 1770, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 1706, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 1721, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 1677, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 1638, 1642, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 1834, 1835, 1633, 1840, 1839, 1685, 1842, 1844, 1689, 1753, 1769, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 1855, 1856, 1858, 1852, 1853, 1854, 2085, 315: 2078, 389: 1860, 1635, 1636, 1634, 394: 1546, 472: 2081, 481: 2095, 1547, 1548, 1549, 488: 1552, 490: 1551, 2087, 506: 2080, 2079, 2084, 533: 2075, 555: 2083}, - {21: 2093, 241: 477}, - {21: 2088}, + {2: 1736, 1653, 1687, 1654, 7: 1664, 1741, 1680, 1738, 1701, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 1728, 1665, 1674, 1695, 1859, 1788, 1789, 1785, 1747, 1794, 1837, 1839, 1838, 1730, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 1733, 1774, 1673, 1672, 1751, 1714, 1719, 1723, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 1784, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 1720, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 1735, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 1691, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 1652, 1656, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 1852, 1853, 1647, 1858, 1857, 1699, 1860, 1862, 1703, 1767, 1783, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 1873, 1874, 1876, 1870, 1871, 1872, 393: 2926, 1649, 1650, 1648}, + {570, 570, 6: 570, 21: 570, 233: 570, 236: 570, 570, 243: 570, 570, 570, 570, 248: 570, 570, 251: 570, 256: 570, 259: 570, 570, 570, 570, 570, 265: 570, 570, 570, 570, 570}, + {569, 569, 6: 569, 21: 569, 233: 569, 236: 569, 569, 243: 569, 569, 569, 569, 248: 569, 569, 251: 569, 256: 569, 259: 569, 569, 569, 569, 569, 265: 569, 569, 569, 569, 569}, + {565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 233: 565, 236: 565, 565, 565, 243: 565, 565, 565, 565, 248: 565, 565, 251: 565, 256: 565, 259: 565, 565, 565, 565, 565, 265: 565, 565, 565, 565, 565, 397: 565, 400: 2890, 409: 565, 411: 565, 843: 2889}, + {2: 1736, 1653, 1687, 1654, 7: 1664, 1741, 1680, 1738, 1701, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 1728, 1665, 1674, 1695, 1859, 1788, 1789, 1785, 1747, 1794, 1837, 1839, 1838, 1730, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 1733, 1774, 1673, 1672, 1751, 1714, 1719, 1723, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 1784, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 1720, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 1735, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 1691, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 1652, 1656, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 1852, 1853, 1647, 1858, 1857, 1699, 1860, 1862, 1703, 1767, 1783, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 1873, 1874, 1876, 1870, 1871, 1872, 238: 2115, 393: 2114, 1649, 1650, 1648, 620: 2113}, // 570 - {2: 1722, 1639, 1673, 1640, 7: 1650, 1727, 1666, 1724, 1687, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 1714, 1651, 1660, 1681, 1774, 1775, 1771, 1733, 1780, 1716, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 1719, 1760, 1659, 1658, 1737, 1683, 1700, 1705, 1709, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 1770, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 1706, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 1721, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 1677, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 1638, 1642, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 1834, 1835, 1633, 1840, 1839, 1685, 1842, 1844, 1689, 1753, 1769, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 1855, 1856, 1858, 1852, 1853, 1854, 234: 2091, 389: 2090, 1635, 1636, 1634, 588: 2089}, - {558, 558, 6: 558, 21: 558, 229: 558, 232: 558, 558, 239: 558, 558, 558, 558, 244: 558, 558, 247: 558, 249: 558, 255: 558, 558, 558, 558, 558, 558, 262: 558, 558, 558, 558}, - {552, 552, 6: 552, 21: 552, 229: 552, 232: 552, 552, 239: 552, 552, 552, 552, 244: 552, 552, 247: 552, 249: 552, 255: 552, 552, 552, 552, 552, 552, 262: 552, 552, 552, 552, 393: 552, 405: 552, 407: 552}, - {2: 1722, 1639, 1673, 1640, 7: 1650, 1727, 1666, 1724, 1687, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 1714, 1651, 1660, 1681, 1774, 1775, 1771, 1733, 1780, 1716, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 1719, 1760, 1659, 1658, 1737, 1683, 1700, 1705, 1709, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 1770, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 1706, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 1721, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 1677, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 1638, 1642, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 1834, 1835, 1633, 1840, 1839, 1685, 1842, 1844, 1689, 1753, 1769, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 1855, 1856, 1858, 1852, 1853, 1854, 389: 2092, 1635, 1636, 1634}, - {551, 551, 6: 551, 21: 551, 229: 551, 232: 551, 551, 239: 551, 551, 551, 551, 244: 551, 551, 247: 551, 249: 551, 255: 551, 551, 551, 551, 551, 551, 262: 551, 551, 551, 551, 393: 551, 405: 551, 407: 551}, + {2: 1736, 1653, 1687, 1654, 7: 1664, 1741, 1680, 1738, 1701, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 1728, 1665, 1674, 1695, 1859, 1788, 1789, 1785, 1747, 1794, 1837, 1839, 1838, 1730, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 1733, 1774, 1673, 1672, 1751, 1714, 1719, 1723, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 1784, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 1720, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 1735, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 1691, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 1652, 1656, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 1852, 1853, 1647, 1858, 1857, 1699, 1860, 1862, 1703, 1767, 1783, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 1873, 1874, 1876, 1870, 1871, 1872, 2106, 319: 2097, 393: 1878, 1649, 1650, 1648, 398: 1560, 452: 2105, 476: 2100, 485: 2107, 1561, 1562, 1563, 492: 1566, 494: 1565, 2108, 510: 2099, 2098, 2104, 537: 2094, 559: 2103}, + {6: 2886, 21: 2887}, + {572, 572, 6: 572, 21: 572, 233: 572, 236: 2122, 2123, 243: 572, 572, 572, 572, 248: 572, 572, 251: 572, 256: 572, 259: 2121, 572, 572, 572, 2124, 265: 572, 2125, 2126, 2120, 526: 2119, 529: 2118}, + {2: 1736, 1653, 1687, 1654, 7: 1664, 1741, 1680, 1738, 1701, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 2116, 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 1728, 1665, 1674, 1695, 1859, 1788, 1789, 1785, 1747, 1794, 1837, 1839, 1838, 1730, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 1733, 1774, 1673, 1672, 1751, 1714, 1719, 1723, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 1784, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 1720, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 1735, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 1691, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 1652, 1656, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 1852, 1853, 1647, 1858, 1857, 1699, 1860, 1862, 1703, 1767, 1783, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 1873, 1874, 1876, 1870, 1871, 1872, 238: 2115, 393: 2114, 1649, 1650, 1648, 620: 2113}, + {2: 1736, 1653, 1687, 1654, 7: 1664, 1741, 1680, 1738, 1701, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 1728, 1665, 1674, 1695, 1859, 1788, 1789, 1785, 1747, 1794, 1837, 1839, 1838, 1730, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 1733, 1774, 1673, 1672, 1751, 1714, 1719, 1723, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 1784, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 1720, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 1735, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 1691, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 1652, 1656, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 1852, 1853, 1647, 1858, 1857, 1699, 1860, 1862, 1703, 1767, 1783, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 1873, 1874, 1876, 1870, 1871, 1872, 2106, 319: 2097, 393: 1878, 1649, 1650, 1648, 398: 1560, 452: 2105, 476: 2100, 485: 2111, 1561, 1562, 1563, 492: 1566, 494: 1565, 2108, 510: 2099, 2098, 2104, 537: 2094, 559: 2103}, // 575 - {2: 1722, 1639, 1673, 1640, 7: 1650, 1727, 1666, 1724, 1687, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 1714, 1651, 1660, 1681, 1774, 1775, 1771, 1733, 1780, 1716, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 1719, 1760, 1659, 1658, 1737, 1683, 1700, 1705, 1709, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 1770, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 1706, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 1721, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 1677, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 1638, 1642, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 1834, 1835, 1633, 1840, 1839, 1685, 1842, 1844, 1689, 1753, 1769, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 1855, 1856, 1858, 1852, 1853, 1854, 234: 2091, 389: 2090, 1635, 1636, 1634, 588: 2094}, - {559, 559, 6: 559, 21: 559, 229: 559, 232: 559, 559, 239: 559, 559, 559, 559, 244: 559, 559, 247: 559, 249: 559, 255: 559, 559, 559, 559, 559, 559, 262: 559, 559, 559, 559}, - {21: 2096, 241: 477}, - {2: 1722, 1639, 1673, 1640, 7: 1650, 1727, 1666, 1724, 1687, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 1714, 1651, 1660, 1681, 1774, 1775, 1771, 1733, 1780, 1716, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 1719, 1760, 1659, 1658, 1737, 1683, 1700, 1705, 1709, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 1770, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 1706, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 1721, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 1677, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 1638, 1642, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 1834, 1835, 1633, 1840, 1839, 1685, 1842, 1844, 1689, 1753, 1769, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 1855, 1856, 1858, 1852, 1853, 1854, 234: 2091, 241: 476, 389: 2090, 1635, 1636, 1634, 588: 2094}, - {2: 1722, 1639, 1673, 1640, 7: 1650, 1727, 1666, 1724, 1687, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 1714, 1651, 1660, 1681, 1774, 1775, 1771, 1733, 1780, 1716, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 1719, 1760, 1659, 1658, 1737, 1683, 1700, 1705, 1709, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 1770, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 1706, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 1721, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 1677, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 1638, 1642, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 1834, 1835, 1633, 1840, 1839, 1685, 1842, 1844, 1689, 1753, 1769, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 1855, 1856, 1858, 1852, 1853, 1854, 2082, 389: 1860, 1635, 1636, 1634, 472: 2081, 506: 2080, 2079, 2865}, + {21: 2110, 245: 479}, + {21: 2109}, + {495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 233: 495, 495, 495, 495, 495, 495, 495, 495, 495, 243: 495, 495, 495, 495, 248: 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 271: 495, 273: 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 295: 495, 495, 495, 495, 495, 495, 495, 495, 304: 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 380: 495}, + {496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 233: 496, 496, 496, 496, 496, 496, 496, 496, 496, 243: 496, 496, 496, 496, 248: 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 271: 496, 273: 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 295: 496, 496, 496, 496, 496, 496, 496, 496, 304: 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 380: 496}, + {21: 2112, 245: 479}, // 580 - {259: 523, 584: 2852, 705: 2856}, - {232: 2101, 2102, 259: 2849, 521: 2850}, - {2: 1722, 1639, 1673, 1640, 7: 1650, 1727, 1666, 1724, 1687, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 1714, 1651, 1660, 1681, 1774, 1775, 1771, 1733, 1780, 1716, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 1719, 1760, 1659, 1658, 1737, 1683, 1700, 1705, 1709, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 1770, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 1706, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 1721, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 1677, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 1638, 1642, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 1834, 1835, 1633, 1840, 1839, 1685, 1842, 1844, 1689, 1753, 1769, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 1855, 1856, 1858, 1852, 1853, 1854, 2082, 389: 1860, 1635, 1636, 1634, 472: 2081, 506: 2080, 2079, 2108}, - {259: 525, 584: 525}, - {259: 524, 584: 524}, + {496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 235: 496, 238: 496, 496, 496, 496, 245: 478, 250: 496, 252: 496, 496, 496, 496, 258: 496, 264: 496, 271: 496, 273: 496, 292: 496, 295: 496, 496, 496, 496, 496, 496, 496, 496, 304: 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 380: 496}, + {567, 567, 6: 567, 21: 567, 233: 567, 236: 567, 567, 243: 567, 567, 567, 567, 248: 567, 567, 251: 567, 256: 567, 259: 567, 567, 567, 567, 567, 265: 567, 567, 567, 567, 567}, + {561, 561, 6: 561, 21: 561, 233: 561, 236: 561, 561, 243: 561, 561, 561, 561, 248: 561, 561, 251: 561, 256: 561, 259: 561, 561, 561, 561, 561, 265: 561, 561, 561, 561, 561, 397: 561, 409: 561, 411: 561}, + {2: 1736, 1653, 1687, 1654, 7: 1664, 1741, 1680, 1738, 1701, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 1728, 1665, 1674, 1695, 1859, 1788, 1789, 1785, 1747, 1794, 1837, 1839, 1838, 1730, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 1733, 1774, 1673, 1672, 1751, 1714, 1719, 1723, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 1784, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 1720, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 1735, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 1691, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 1652, 1656, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 1852, 1853, 1647, 1858, 1857, 1699, 1860, 1862, 1703, 1767, 1783, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 1873, 1874, 1876, 1870, 1871, 1872, 393: 2117, 1649, 1650, 1648}, + {494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 233: 494, 494, 494, 494, 494, 494, 494, 494, 494, 243: 494, 494, 494, 494, 248: 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 271: 494, 273: 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 295: 494, 494, 494, 494, 494, 494, 494, 494, 304: 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 380: 494}, // 585 - {2: 521, 521, 521, 521, 7: 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 22: 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521}, - {259: 2107}, - {259: 2106}, - {2: 519, 519, 519, 519, 7: 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 22: 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519}, - {2: 520, 520, 520, 520, 7: 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 22: 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520}, + {560, 560, 6: 560, 21: 560, 233: 560, 236: 560, 560, 243: 560, 560, 560, 560, 248: 560, 560, 251: 560, 256: 560, 259: 560, 560, 560, 560, 560, 265: 560, 560, 560, 560, 560, 397: 560, 409: 560, 411: 560}, + {2: 1736, 1653, 1687, 1654, 7: 1664, 1741, 1680, 1738, 1701, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 1728, 1665, 1674, 1695, 1859, 1788, 1789, 1785, 1747, 1794, 1837, 1839, 1838, 1730, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 1733, 1774, 1673, 1672, 1751, 1714, 1719, 1723, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 1784, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 1720, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 1735, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 1691, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 1652, 1656, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 1852, 1853, 1647, 1858, 1857, 1699, 1860, 1862, 1703, 1767, 1783, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 1873, 1874, 1876, 1870, 1871, 1872, 2102, 393: 1878, 1649, 1650, 1648, 452: 2101, 476: 2100, 510: 2099, 2098, 2879}, + {263: 532, 588: 2866, 709: 2870}, + {236: 2122, 2123, 263: 2863, 526: 2864}, + {2: 1736, 1653, 1687, 1654, 7: 1664, 1741, 1680, 1738, 1701, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 1728, 1665, 1674, 1695, 1859, 1788, 1789, 1785, 1747, 1794, 1837, 1839, 1838, 1730, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 1733, 1774, 1673, 1672, 1751, 1714, 1719, 1723, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 1784, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 1720, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 1735, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 1691, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 1652, 1656, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 1852, 1853, 1647, 1858, 1857, 1699, 1860, 1862, 1703, 1767, 1783, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 1873, 1874, 1876, 1870, 1871, 1872, 2102, 393: 1878, 1649, 1650, 1648, 452: 2101, 476: 2100, 510: 2099, 2098, 2129}, // 590 - {527, 527, 6: 527, 21: 527, 229: 2109, 232: 527, 527, 239: 527, 527, 527, 527, 244: 527, 527, 247: 527, 249: 527, 255: 527, 527, 527, 527, 527, 527, 262: 527, 527, 527, 527, 521: 2098, 524: 2097}, - {2: 1722, 1639, 1673, 1640, 7: 2119, 1727, 1666, 1724, 2124, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 2128, 1651, 2121, 2123, 2137, 2138, 2136, 2132, 2139, 2129, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 2130, 1760, 1659, 2120, 1737, 1683, 1700, 2125, 2127, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 2135, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 2126, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 2131, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 2122, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 2117, 2118, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 2140, 1835, 2116, 1840, 1839, 1685, 1842, 1844, 1689, 2133, 2134, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 2141, 2142, 1858, 1852, 1853, 1854, 2172, 230: 2153, 2112, 2184, 2188, 235: 2169, 2168, 2205, 2179, 243: 2144, 266: 2148, 2187, 290: 2156, 299: 2175, 311: 2189, 2110, 2182, 2204, 2206, 2147, 2146, 2163, 2203, 2183, 2180, 2174, 2178, 2143, 2145, 2181, 2152, 2185, 2193, 2244, 2151, 2194, 2195, 2150, 2173, 2166, 2167, 2217, 2219, 2220, 2221, 2176, 2222, 2201, 2207, 2215, 2216, 2211, 2223, 2224, 2225, 2212, 2227, 2228, 2218, 2213, 2226, 2208, 2214, 2199, 2229, 2230, 2177, 2234, 2190, 2192, 2233, 2239, 2238, 2240, 2237, 2170, 2241, 2236, 2235, 2232, 2186, 2231, 2191, 2196, 2197, 389: 2155, 1635, 1636, 1634, 448: 2171, 2243, 2162, 2157, 2149, 2160, 2158, 2159, 2198, 2210, 2209, 2202, 2200, 2154, 2165, 2242, 2164, 2161, 2115, 2114, 2113, 2111}, - {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, 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, 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, 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, 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, 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, 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, 229: 430, 430, 430, 430, 430, 430, 430, 430, 430, 239: 430, 430, 430, 430, 244: 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 268: 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 291: 430, 430, 430, 430, 430, 430, 430, 430, 300: 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 382: 430, 592: 2847}, - {526, 526, 6: 526, 21: 526, 229: 526, 232: 526, 526, 239: 526, 526, 526, 526, 244: 526, 526, 2253, 526, 2251, 526, 2252, 2250, 2248, 255: 526, 526, 526, 526, 526, 526, 262: 526, 526, 526, 526, 470: 2249, 2247}, - {2: 1722, 1639, 1673, 1640, 7: 2119, 1727, 1666, 1724, 2124, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 2128, 1651, 2121, 2123, 2137, 2138, 2136, 2132, 2139, 2129, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 2130, 1760, 1659, 2120, 1737, 1683, 1700, 2125, 2127, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 2135, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 2126, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 2131, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 2122, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 2117, 2118, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 2140, 1835, 2116, 1840, 1839, 1685, 1842, 1844, 1689, 2133, 2134, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 2141, 2142, 1858, 1852, 1853, 1854, 2172, 230: 2153, 2112, 2184, 2188, 235: 2169, 2168, 2205, 2179, 243: 2144, 266: 2148, 2187, 290: 2156, 299: 2175, 311: 2189, 2110, 2182, 2204, 2206, 2147, 2146, 2163, 2203, 2183, 2180, 2174, 2178, 2143, 2145, 2181, 2152, 2185, 2193, 2244, 2151, 2194, 2195, 2150, 2173, 2166, 2167, 2217, 2219, 2220, 2221, 2176, 2222, 2201, 2207, 2215, 2216, 2211, 2223, 2224, 2225, 2212, 2227, 2228, 2218, 2213, 2226, 2208, 2214, 2199, 2229, 2230, 2177, 2234, 2190, 2192, 2233, 2239, 2238, 2240, 2237, 2170, 2241, 2236, 2235, 2232, 2186, 2231, 2191, 2196, 2197, 389: 2155, 1635, 1636, 1634, 448: 2171, 2243, 2162, 2157, 2149, 2160, 2158, 2159, 2198, 2210, 2209, 2202, 2200, 2154, 2165, 2242, 2164, 2161, 2115, 2114, 2113, 2846}, + {263: 534, 588: 534}, + {263: 533, 588: 533}, + {2: 530, 530, 530, 530, 7: 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 22: 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530}, + {263: 2128}, + {263: 2127}, // 595 - {1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 229: 1240, 1240, 232: 1240, 1240, 1240, 239: 1240, 1240, 1240, 1240, 244: 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 2829, 1240, 1240, 1240, 1240, 1240, 1240, 262: 1240, 1240, 1240, 1240, 270: 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 289: 1240, 291: 2826, 2824, 2823, 2831, 2825, 2827, 2828, 2830, 772: 2822, 807: 2821}, - {1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 229: 1220, 1220, 232: 1220, 1220, 1220, 239: 1220, 1220, 1220, 1220, 244: 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 262: 1220, 1220, 1220, 1220, 270: 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 289: 1220, 291: 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220}, - {1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 229: 1193, 1193, 2795, 1193, 1193, 1193, 2539, 2540, 2545, 239: 1193, 1193, 1193, 1193, 244: 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 262: 1193, 1193, 1193, 1193, 268: 2797, 2541, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 2796, 1193, 291: 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 300: 2794, 2543, 2536, 2542, 2546, 2535, 2544, 2537, 2538, 2803, 2804, 714: 2798, 760: 2800, 804: 2799, 810: 2801, 846: 2802}, - {1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 2791, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 239: 1155, 1155, 1155, 1155, 244: 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 268: 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 300: 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 382: 1155, 399: 1155, 1155}, - {1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 815, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 239: 1150, 1150, 1150, 1150, 244: 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 268: 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 300: 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 382: 1150, 399: 1150, 1150}, + {2: 528, 528, 528, 528, 7: 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 22: 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528}, + {2: 529, 529, 529, 529, 7: 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 22: 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529}, + {536, 536, 6: 536, 21: 536, 233: 2130, 236: 536, 536, 243: 536, 536, 536, 536, 248: 536, 536, 251: 536, 256: 536, 259: 536, 536, 536, 536, 536, 265: 536, 536, 536, 536, 536, 526: 2119, 529: 2118}, + {2: 1736, 1653, 1687, 1654, 7: 2140, 1741, 1680, 1738, 2145, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 2149, 1665, 2142, 2144, 1859, 2158, 2159, 2157, 2153, 2160, 1837, 1839, 1838, 2150, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 2151, 1774, 1673, 2141, 1751, 1714, 2146, 2148, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 2156, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 2147, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 2152, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 2143, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 2138, 2139, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 2161, 1853, 2137, 1858, 1857, 1699, 1860, 1862, 1703, 2154, 2155, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 2162, 2163, 1876, 1870, 1871, 1872, 2193, 234: 2174, 2133, 2205, 2209, 239: 2190, 2189, 2226, 2200, 247: 2165, 270: 2169, 272: 2208, 294: 2177, 303: 2196, 315: 2210, 2131, 2203, 2225, 2227, 2168, 2167, 2184, 2224, 2204, 2201, 2195, 2199, 2164, 2166, 2202, 2173, 2206, 2214, 2265, 2172, 2215, 2216, 2171, 2194, 2187, 2188, 2238, 2240, 2241, 2242, 2197, 2243, 2222, 2228, 2236, 2237, 2232, 2244, 2245, 2246, 2233, 2248, 2249, 2239, 2234, 2247, 2229, 2235, 2220, 2250, 2251, 2198, 2255, 2211, 2213, 2254, 2260, 2259, 2261, 2258, 2191, 2262, 2257, 2256, 381: 2253, 2207, 2252, 2212, 2217, 2218, 393: 2176, 1649, 1650, 1648, 452: 2192, 2264, 2183, 2178, 2170, 2181, 2179, 2180, 2219, 2231, 2230, 2223, 2221, 2175, 2186, 2263, 2185, 2182, 2136, 2135, 2134, 2132}, + {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, 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, 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, 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, 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, 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, 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, 431, 233: 431, 431, 431, 431, 431, 431, 431, 431, 431, 243: 431, 431, 431, 431, 248: 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 271: 431, 273: 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 295: 431, 431, 431, 431, 431, 431, 431, 431, 304: 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 380: 431, 595: 2861}, // 600 - {1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 2786, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 239: 1146, 1146, 1146, 1146, 244: 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 268: 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 300: 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 382: 1146, 399: 1146, 1146}, - {1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 814, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 239: 1138, 1138, 1138, 1138, 244: 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 268: 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 300: 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 382: 1138, 399: 1138, 1138}, - {1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 811, 1130, 2785, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 239: 1130, 1130, 1130, 1130, 244: 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 268: 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 300: 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 382: 1130, 399: 1130, 1130}, - {1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 809, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 239: 1128, 1128, 1128, 1128, 244: 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 268: 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 300: 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 382: 1128, 399: 1128, 1128}, - {1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 805, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 239: 1111, 1111, 1111, 1111, 244: 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 268: 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 300: 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 382: 1111, 399: 1111, 1111}, + {535, 535, 6: 535, 21: 535, 233: 535, 236: 535, 535, 243: 535, 535, 535, 535, 248: 535, 535, 2274, 535, 2272, 2273, 2271, 2269, 535, 259: 535, 535, 535, 535, 535, 265: 535, 535, 535, 535, 535, 474: 2270, 2268}, + {2: 1736, 1653, 1687, 1654, 7: 2140, 1741, 1680, 1738, 2145, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 2149, 1665, 2142, 2144, 1859, 2158, 2159, 2157, 2153, 2160, 1837, 1839, 1838, 2150, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 2151, 1774, 1673, 2141, 1751, 1714, 2146, 2148, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 2156, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 2147, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 2152, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 2143, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 2138, 2139, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 2161, 1853, 2137, 1858, 1857, 1699, 1860, 1862, 1703, 2154, 2155, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 2162, 2163, 1876, 1870, 1871, 1872, 2193, 234: 2174, 2133, 2205, 2209, 239: 2190, 2189, 2226, 2200, 247: 2165, 270: 2169, 272: 2208, 294: 2177, 303: 2196, 315: 2210, 2131, 2203, 2225, 2227, 2168, 2167, 2184, 2224, 2204, 2201, 2195, 2199, 2164, 2166, 2202, 2173, 2206, 2214, 2265, 2172, 2215, 2216, 2171, 2194, 2187, 2188, 2238, 2240, 2241, 2242, 2197, 2243, 2222, 2228, 2236, 2237, 2232, 2244, 2245, 2246, 2233, 2248, 2249, 2239, 2234, 2247, 2229, 2235, 2220, 2250, 2251, 2198, 2255, 2211, 2213, 2254, 2260, 2259, 2261, 2258, 2191, 2262, 2257, 2256, 381: 2253, 2207, 2252, 2212, 2217, 2218, 393: 2176, 1649, 1650, 1648, 452: 2192, 2264, 2183, 2178, 2170, 2181, 2179, 2180, 2219, 2231, 2230, 2223, 2221, 2175, 2186, 2263, 2185, 2182, 2136, 2135, 2134, 2860}, + {1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 233: 1254, 1254, 236: 1254, 1254, 1254, 243: 1254, 1254, 1254, 1254, 248: 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 2843, 1254, 1254, 1254, 1254, 1254, 265: 1254, 1254, 1254, 1254, 1254, 274: 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 293: 1254, 295: 2840, 2838, 2837, 2845, 2839, 2841, 2842, 2844, 776: 2836, 811: 2835}, + {1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 233: 1234, 1234, 236: 1234, 1234, 1234, 243: 1234, 1234, 1234, 1234, 248: 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 265: 1234, 1234, 1234, 1234, 1234, 274: 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 293: 1234, 295: 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234}, + {1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 233: 1207, 1207, 2809, 1207, 1207, 1207, 2560, 2561, 2566, 243: 1207, 1207, 1207, 1207, 248: 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 265: 1207, 1207, 1207, 1207, 1207, 271: 2811, 273: 2562, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 2810, 1207, 295: 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 304: 2808, 2564, 2557, 2563, 2567, 2556, 2565, 2558, 2559, 2817, 2818, 718: 2812, 764: 2814, 808: 2813, 814: 2815, 850: 2816}, // 605 - {1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 808, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 239: 1107, 1107, 1107, 1107, 244: 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 268: 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 300: 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 382: 1107, 399: 1107, 1107}, - {1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 2782, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 239: 1101, 1101, 1101, 1101, 244: 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 268: 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 300: 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 382: 1101, 399: 1101, 1101}, - {1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 792, 1083, 2781, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 239: 1083, 1083, 1083, 1083, 244: 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 268: 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 300: 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 382: 1083, 399: 1083, 1083}, - {1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 791, 1082, 2780, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 239: 1082, 1082, 1082, 1082, 244: 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 268: 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 300: 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 382: 1082, 399: 1082, 1082}, - {1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 790, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 239: 1079, 1079, 1079, 1079, 244: 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 268: 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 300: 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 382: 1079, 399: 1079, 1079}, + {1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 2805, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 243: 1167, 1167, 1167, 1167, 248: 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 271: 1167, 273: 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 304: 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 380: 1167, 403: 1167, 1167}, + {1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 823, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 243: 1162, 1162, 1162, 1162, 248: 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 271: 1162, 273: 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 304: 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 380: 1162, 403: 1162, 1162}, + {1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 2800, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 243: 1158, 1158, 1158, 1158, 248: 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 271: 1158, 273: 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 304: 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 380: 1158, 403: 1158, 1158}, + {1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 822, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 243: 1150, 1150, 1150, 1150, 248: 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 271: 1150, 273: 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 304: 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 380: 1150, 403: 1150, 1150}, + {1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 819, 1142, 2799, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 243: 1142, 1142, 1142, 1142, 248: 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 271: 1142, 273: 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 304: 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 380: 1142, 403: 1142, 1142}, // 610 - {1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 787, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 239: 1074, 1074, 1074, 1074, 244: 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 268: 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 300: 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 382: 1074, 399: 1074, 1074}, - {1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 788, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 239: 1072, 1072, 1072, 1072, 244: 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 268: 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 300: 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 382: 1072, 399: 1072, 1072}, - {1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 789, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 239: 1069, 1069, 1069, 1069, 244: 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 268: 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 300: 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 382: 1069, 399: 1069, 1069}, - {1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 812, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 239: 1067, 1067, 1067, 1067, 244: 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 268: 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 300: 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 382: 1067, 399: 1067, 1067}, - {1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 799, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 239: 1055, 1055, 1055, 1055, 244: 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 268: 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 300: 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 382: 1055, 399: 1055, 1055}, + {1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 817, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 243: 1140, 1140, 1140, 1140, 248: 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 271: 1140, 273: 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 304: 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 380: 1140, 403: 1140, 1140}, + {1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 813, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 243: 1123, 1123, 1123, 1123, 248: 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 271: 1123, 273: 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 304: 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 380: 1123, 403: 1123, 1123}, + {1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 816, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 243: 1119, 1119, 1119, 1119, 248: 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 271: 1119, 273: 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 304: 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 380: 1119, 403: 1119, 1119}, + {1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 2796, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 243: 1113, 1113, 1113, 1113, 248: 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 271: 1113, 273: 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 304: 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 380: 1113, 403: 1113, 1113}, + {1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 800, 1095, 2795, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 243: 1095, 1095, 1095, 1095, 248: 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 271: 1095, 273: 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 304: 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 380: 1095, 403: 1095, 1095}, // 615 - {1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 796, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 239: 1035, 1035, 1035, 1035, 244: 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 268: 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 300: 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 382: 1035, 399: 1035, 1035}, - {1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 794, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 239: 1019, 1019, 1019, 1019, 244: 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 268: 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 300: 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 382: 1019, 399: 1019, 1019}, - {1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 813, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 239: 1018, 1018, 1018, 1018, 244: 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 268: 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 300: 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 382: 1018, 399: 1018, 1018}, - {1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 801, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 239: 1017, 1017, 1017, 1017, 244: 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 268: 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 300: 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 382: 1017, 399: 1017, 1017}, - {1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 803, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 239: 1014, 1014, 1014, 1014, 244: 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 268: 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 300: 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 382: 1014, 399: 1014, 1014}, + {1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 799, 1094, 2794, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 243: 1094, 1094, 1094, 1094, 248: 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 271: 1094, 273: 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 304: 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 380: 1094, 403: 1094, 1094}, + {1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 798, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 243: 1091, 1091, 1091, 1091, 248: 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 271: 1091, 273: 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 304: 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 380: 1091, 403: 1091, 1091}, + {1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 795, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 243: 1086, 1086, 1086, 1086, 248: 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 271: 1086, 273: 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 304: 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 380: 1086, 403: 1086, 1086}, + {1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 796, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 243: 1084, 1084, 1084, 1084, 248: 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 271: 1084, 273: 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 304: 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 380: 1084, 403: 1084, 1084}, + {1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 797, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 243: 1081, 1081, 1081, 1081, 248: 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 271: 1081, 273: 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 304: 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 380: 1081, 403: 1081, 1081}, // 620 - {1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 802, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 239: 1013, 1013, 1013, 1013, 244: 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 268: 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 300: 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 382: 1013, 399: 1013, 1013}, - {1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 793, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 239: 1008, 1008, 1008, 1008, 244: 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 268: 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 300: 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 382: 1008, 399: 1008, 1008}, - {954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 2771, 954, 954, 954, 954, 954, 954, 954, 954, 954, 239: 954, 954, 954, 954, 244: 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 268: 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 300: 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 382: 954, 399: 954, 954}, - {933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 2764, 933, 933, 933, 933, 933, 933, 933, 933, 933, 239: 933, 933, 933, 933, 244: 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 268: 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 300: 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 382: 933, 399: 933, 933}, - {932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 2748, 932, 932, 932, 932, 932, 932, 932, 932, 932, 239: 932, 932, 932, 932, 244: 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 268: 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 300: 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 382: 932, 399: 932, 932}, + {1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 820, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 243: 1079, 1079, 1079, 1079, 248: 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 271: 1079, 273: 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 304: 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 380: 1079, 403: 1079, 1079}, + {1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 807, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 243: 1067, 1067, 1067, 1067, 248: 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 271: 1067, 273: 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 304: 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 380: 1067, 403: 1067, 1067}, + {1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 804, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 243: 1047, 1047, 1047, 1047, 248: 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 271: 1047, 273: 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 304: 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 380: 1047, 403: 1047, 1047}, + {1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 802, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 243: 1031, 1031, 1031, 1031, 248: 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 271: 1031, 273: 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 304: 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 380: 1031, 403: 1031, 1031}, + {1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 821, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 243: 1030, 1030, 1030, 1030, 248: 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 271: 1030, 273: 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 304: 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 380: 1030, 403: 1030, 1030}, // 625 - {895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 229: 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 268: 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 291: 895, 895, 895, 895, 895, 895, 895, 895, 300: 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 382: 895, 895, 895, 895, 895, 895, 895}, - {894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 229: 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 268: 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 291: 894, 894, 894, 894, 894, 894, 894, 894, 300: 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 382: 894, 894, 894, 894, 894, 894, 894}, - {893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 229: 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 268: 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 291: 893, 893, 893, 893, 893, 893, 893, 893, 300: 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 382: 893, 893, 893, 893, 893, 893, 893}, - {892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 229: 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 268: 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 291: 892, 892, 892, 892, 892, 892, 892, 892, 300: 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 382: 892, 892, 892, 892, 892, 892, 892}, - {891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 229: 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 268: 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 291: 891, 891, 891, 891, 891, 891, 891, 891, 300: 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 382: 891, 891, 891, 891, 891, 891, 891}, + {1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 809, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 243: 1029, 1029, 1029, 1029, 248: 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 271: 1029, 273: 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 304: 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 380: 1029, 403: 1029, 1029}, + {1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 811, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 243: 1026, 1026, 1026, 1026, 248: 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 271: 1026, 273: 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 304: 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 380: 1026, 403: 1026, 1026}, + {1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 810, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 243: 1025, 1025, 1025, 1025, 248: 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 271: 1025, 273: 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 304: 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 380: 1025, 403: 1025, 1025}, + {1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 801, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 243: 1020, 1020, 1020, 1020, 248: 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 271: 1020, 273: 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 304: 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 380: 1020, 403: 1020, 1020}, + {962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 2785, 962, 962, 962, 962, 962, 962, 962, 962, 962, 243: 962, 962, 962, 962, 248: 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 271: 962, 273: 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 304: 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 380: 962, 403: 962, 962}, // 630 - {890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 229: 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 268: 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 291: 890, 890, 890, 890, 890, 890, 890, 890, 300: 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 382: 890, 890, 890, 890, 890, 890, 890}, - {889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 229: 889, 2747, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 268: 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 291: 889, 889, 889, 889, 889, 889, 889, 889, 300: 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 382: 889, 889, 889, 889, 889, 889, 889}, - {230: 2746}, - {887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 229: 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 268: 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 291: 887, 887, 887, 887, 887, 887, 887, 887, 300: 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 382: 887, 887, 887, 887, 887, 887, 887}, - {886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 229: 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 268: 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 291: 886, 886, 886, 886, 886, 886, 886, 886, 300: 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 382: 886, 886, 886, 886, 886, 886, 886}, + {941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 2778, 941, 941, 941, 941, 941, 941, 941, 941, 941, 243: 941, 941, 941, 941, 248: 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 271: 941, 273: 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 304: 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 380: 941, 403: 941, 941}, + {940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 2762, 940, 940, 940, 940, 940, 940, 940, 940, 940, 243: 940, 940, 940, 940, 248: 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 271: 940, 273: 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 304: 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 380: 940, 403: 940, 940}, + {903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 233: 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 271: 903, 273: 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 295: 903, 903, 903, 903, 903, 903, 903, 903, 304: 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 380: 903, 387: 903, 903, 903, 903, 903, 903}, + {902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 233: 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 271: 902, 273: 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 295: 902, 902, 902, 902, 902, 902, 902, 902, 304: 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 380: 902, 387: 902, 902, 902, 902, 902, 902}, + {901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 233: 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 271: 901, 273: 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 295: 901, 901, 901, 901, 901, 901, 901, 901, 304: 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 380: 901, 387: 901, 901, 901, 901, 901, 901}, // 635 - {885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 229: 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 268: 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 291: 885, 885, 885, 885, 885, 885, 885, 885, 300: 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 382: 885, 885, 885, 885, 885, 885, 885}, - {860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 229: 860, 860, 860, 860, 860, 860, 860, 860, 860, 239: 860, 860, 860, 860, 244: 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 2257, 860, 860, 860, 860, 268: 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 291: 860, 860, 860, 860, 860, 860, 860, 860, 300: 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 382: 2258}, - {859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 229: 859, 859, 859, 859, 859, 859, 859, 859, 859, 239: 859, 859, 859, 859, 244: 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 268: 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 2742, 859, 859, 859, 859, 859, 859, 859, 859, 300: 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 382: 859, 399: 859, 859}, - {2: 1722, 1639, 1673, 1640, 7: 1650, 1727, 1666, 1724, 1687, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 1714, 1651, 1660, 1681, 1774, 1775, 1771, 1733, 1780, 1716, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 1719, 1760, 1659, 1658, 1737, 1683, 1700, 1705, 1709, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 1770, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 1706, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 1721, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 1677, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 1638, 1642, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 1834, 1835, 1633, 1840, 1839, 1685, 1842, 1844, 1689, 1753, 1769, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 1855, 1856, 1858, 1852, 1853, 1854, 389: 2739, 1635, 1636, 1634}, - {855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 229: 855, 855, 855, 855, 855, 855, 855, 855, 855, 239: 855, 855, 855, 855, 244: 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 268: 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 291: 855, 855, 855, 855, 855, 855, 855, 855, 300: 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 382: 855, 399: 2735, 2736}, + {900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 233: 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 271: 900, 273: 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 295: 900, 900, 900, 900, 900, 900, 900, 900, 304: 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 380: 900, 387: 900, 900, 900, 900, 900, 900}, + {899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 233: 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 271: 899, 273: 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 295: 899, 899, 899, 899, 899, 899, 899, 899, 304: 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 380: 899, 387: 899, 899, 899, 899, 899, 899}, + {898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 233: 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 271: 898, 273: 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 295: 898, 898, 898, 898, 898, 898, 898, 898, 304: 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 380: 898, 387: 898, 898, 898, 898, 898, 898}, + {897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 233: 897, 2761, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 271: 897, 273: 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 295: 897, 897, 897, 897, 897, 897, 897, 897, 304: 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 380: 897, 387: 897, 897, 897, 897, 897, 897}, + {234: 2760}, // 640 - {854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 229: 854, 854, 854, 854, 854, 854, 854, 854, 854, 239: 854, 854, 854, 854, 244: 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 268: 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 291: 854, 854, 854, 854, 854, 854, 854, 854, 300: 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 382: 854}, - {853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 229: 853, 853, 853, 853, 853, 853, 853, 853, 853, 239: 853, 853, 853, 853, 244: 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 268: 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 291: 853, 853, 853, 853, 853, 853, 853, 853, 300: 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 382: 853}, - {852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 229: 852, 852, 852, 852, 852, 852, 852, 852, 852, 239: 852, 852, 852, 852, 244: 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 268: 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 291: 852, 852, 852, 852, 852, 852, 852, 852, 300: 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 382: 852}, - {850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 229: 850, 850, 850, 850, 850, 850, 850, 850, 850, 239: 850, 850, 850, 850, 244: 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 268: 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 291: 850, 850, 850, 850, 850, 850, 850, 850, 300: 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 382: 850}, - {849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 229: 849, 849, 849, 849, 849, 849, 849, 849, 849, 239: 849, 849, 849, 849, 244: 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 268: 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 291: 849, 849, 849, 849, 849, 849, 849, 849, 300: 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 382: 849}, + {895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 233: 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 271: 895, 273: 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 295: 895, 895, 895, 895, 895, 895, 895, 895, 304: 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 380: 895, 387: 895, 895, 895, 895, 895, 895}, + {894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 233: 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 271: 894, 273: 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 295: 894, 894, 894, 894, 894, 894, 894, 894, 304: 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 380: 894, 387: 894, 894, 894, 894, 894, 894}, + {893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 233: 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 271: 893, 273: 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 295: 893, 893, 893, 893, 893, 893, 893, 893, 304: 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 380: 893, 387: 893, 893, 893, 893, 893, 893}, + {868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 233: 868, 868, 868, 868, 868, 868, 868, 868, 868, 243: 868, 868, 868, 868, 248: 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 2278, 868, 868, 868, 868, 868, 271: 868, 273: 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 295: 868, 868, 868, 868, 868, 868, 868, 868, 304: 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 380: 2279}, + {867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 233: 867, 867, 867, 867, 867, 867, 867, 867, 867, 243: 867, 867, 867, 867, 248: 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 271: 867, 273: 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 2756, 867, 867, 867, 867, 867, 867, 867, 867, 304: 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 380: 867, 403: 867, 867}, // 645 - {848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 229: 848, 848, 848, 848, 848, 848, 848, 848, 848, 239: 848, 848, 848, 848, 244: 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 268: 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 291: 848, 848, 848, 848, 848, 848, 848, 848, 300: 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 382: 848}, - {847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 229: 847, 847, 847, 847, 847, 847, 847, 847, 847, 239: 847, 847, 847, 847, 244: 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 268: 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 291: 847, 847, 847, 847, 847, 847, 847, 847, 300: 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 382: 847}, - {846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 229: 846, 846, 846, 846, 846, 846, 846, 846, 846, 239: 846, 846, 846, 846, 244: 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 268: 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 291: 846, 846, 846, 846, 846, 846, 846, 846, 300: 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 382: 846}, - {2: 1722, 1639, 1673, 1640, 7: 2119, 1727, 1666, 1724, 2124, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 2128, 1651, 2121, 2123, 2137, 2138, 2136, 2132, 2139, 2129, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 2130, 1760, 1659, 2120, 1737, 1683, 1700, 2125, 2127, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 2135, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 2126, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 2131, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 2122, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 2117, 2118, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 2140, 1835, 2116, 1840, 1839, 1685, 1842, 1844, 1689, 2133, 2134, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 2141, 2142, 1858, 1852, 1853, 1854, 2172, 230: 2153, 232: 2184, 2188, 235: 2169, 2168, 2205, 2179, 243: 2144, 266: 2148, 2187, 290: 2156, 299: 2175, 311: 2189, 2256, 2182, 2204, 2206, 2147, 2146, 2163, 2203, 2183, 2180, 2174, 2178, 2143, 2145, 2181, 2152, 2185, 2193, 2244, 2151, 2194, 2195, 2150, 2173, 2166, 2167, 2217, 2219, 2220, 2221, 2176, 2222, 2201, 2207, 2215, 2216, 2211, 2223, 2224, 2225, 2212, 2227, 2228, 2218, 2213, 2226, 2208, 2214, 2199, 2229, 2230, 2177, 2234, 2190, 2192, 2233, 2239, 2238, 2240, 2237, 2170, 2241, 2236, 2235, 2232, 2186, 2231, 2191, 2196, 2197, 389: 2155, 1635, 1636, 1634, 448: 2171, 2243, 2162, 2157, 2149, 2160, 2158, 2159, 2198, 2210, 2209, 2202, 2200, 2734, 2165, 2242, 2164, 2161}, - {2: 1722, 1639, 1673, 1640, 7: 2119, 1727, 1666, 1724, 2124, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 2128, 1651, 2121, 2123, 2137, 2138, 2136, 2132, 2139, 2129, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 2130, 1760, 1659, 2120, 1737, 1683, 1700, 2125, 2127, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 2135, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 2126, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 2131, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 2122, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 2117, 2118, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 2140, 1835, 2116, 1840, 1839, 1685, 1842, 1844, 1689, 2133, 2134, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 2141, 2142, 1858, 1852, 1853, 1854, 2172, 230: 2153, 232: 2184, 2188, 235: 2169, 2168, 2205, 2179, 243: 2144, 266: 2148, 2187, 290: 2156, 299: 2175, 311: 2189, 2256, 2182, 2204, 2206, 2147, 2146, 2163, 2203, 2183, 2180, 2174, 2178, 2143, 2145, 2181, 2152, 2185, 2193, 2244, 2151, 2194, 2195, 2150, 2173, 2166, 2167, 2217, 2219, 2220, 2221, 2176, 2222, 2201, 2207, 2215, 2216, 2211, 2223, 2224, 2225, 2212, 2227, 2228, 2218, 2213, 2226, 2208, 2214, 2199, 2229, 2230, 2177, 2234, 2190, 2192, 2233, 2239, 2238, 2240, 2237, 2170, 2241, 2236, 2235, 2232, 2186, 2231, 2191, 2196, 2197, 389: 2155, 1635, 1636, 1634, 448: 2171, 2243, 2162, 2157, 2149, 2160, 2158, 2159, 2198, 2210, 2209, 2202, 2200, 2733, 2165, 2242, 2164, 2161}, + {2: 1736, 1653, 1687, 1654, 7: 1664, 1741, 1680, 1738, 1701, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 1728, 1665, 1674, 1695, 1859, 1788, 1789, 1785, 1747, 1794, 1837, 1839, 1838, 1730, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 1733, 1774, 1673, 1672, 1751, 1714, 1719, 1723, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 1784, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 1720, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 1735, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 1691, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 1652, 1656, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 1852, 1853, 1647, 1858, 1857, 1699, 1860, 1862, 1703, 1767, 1783, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 1873, 1874, 1876, 1870, 1871, 1872, 393: 2753, 1649, 1650, 1648}, + {863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 233: 863, 863, 863, 863, 863, 863, 863, 863, 863, 243: 863, 863, 863, 863, 248: 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 271: 863, 273: 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 295: 863, 863, 863, 863, 863, 863, 863, 863, 304: 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 380: 863, 403: 2749, 2750}, + {862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 233: 862, 862, 862, 862, 862, 862, 862, 862, 862, 243: 862, 862, 862, 862, 248: 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 271: 862, 273: 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 295: 862, 862, 862, 862, 862, 862, 862, 862, 304: 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 380: 862}, + {861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 233: 861, 861, 861, 861, 861, 861, 861, 861, 861, 243: 861, 861, 861, 861, 248: 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 271: 861, 273: 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 295: 861, 861, 861, 861, 861, 861, 861, 861, 304: 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 380: 861}, + {860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 233: 860, 860, 860, 860, 860, 860, 860, 860, 860, 243: 860, 860, 860, 860, 248: 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 271: 860, 273: 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 295: 860, 860, 860, 860, 860, 860, 860, 860, 304: 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 380: 860}, // 650 - {2: 1722, 1639, 1673, 1640, 7: 2119, 1727, 1666, 1724, 2124, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 2128, 1651, 2121, 2123, 2137, 2138, 2136, 2132, 2139, 2129, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 2130, 1760, 1659, 2120, 1737, 1683, 1700, 2125, 2127, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 2135, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 2126, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 2131, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 2122, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 2117, 2118, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 2140, 1835, 2116, 1840, 1839, 1685, 1842, 1844, 1689, 2133, 2134, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 2141, 2142, 1858, 1852, 1853, 1854, 2172, 230: 2153, 232: 2184, 2188, 235: 2169, 2168, 2205, 2179, 243: 2144, 266: 2148, 2187, 290: 2156, 299: 2175, 311: 2189, 2256, 2182, 2204, 2206, 2147, 2146, 2163, 2203, 2183, 2180, 2174, 2178, 2143, 2145, 2181, 2152, 2185, 2193, 2244, 2151, 2194, 2195, 2150, 2173, 2166, 2167, 2217, 2219, 2220, 2221, 2176, 2222, 2201, 2207, 2215, 2216, 2211, 2223, 2224, 2225, 2212, 2227, 2228, 2218, 2213, 2226, 2208, 2214, 2199, 2229, 2230, 2177, 2234, 2190, 2192, 2233, 2239, 2238, 2240, 2237, 2170, 2241, 2236, 2235, 2232, 2186, 2231, 2191, 2196, 2197, 389: 2155, 1635, 1636, 1634, 448: 2171, 2243, 2162, 2157, 2149, 2160, 2158, 2159, 2198, 2210, 2209, 2202, 2200, 2732, 2165, 2242, 2164, 2161}, - {2: 1722, 1639, 1673, 1640, 7: 2119, 1727, 1666, 1724, 2124, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 2128, 1651, 2121, 2123, 2137, 2138, 2136, 2132, 2139, 2129, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 2130, 1760, 1659, 2120, 1737, 1683, 1700, 2125, 2127, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 2135, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 2126, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 2131, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 2122, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 2117, 2118, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 2140, 1835, 2116, 1840, 1839, 1685, 1842, 1844, 1689, 2133, 2134, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 2141, 2142, 1858, 1852, 1853, 1854, 2172, 230: 2153, 232: 2184, 2188, 235: 2169, 2168, 2205, 2179, 243: 2144, 266: 2148, 2187, 290: 2156, 299: 2175, 311: 2189, 2256, 2182, 2204, 2206, 2147, 2146, 2163, 2203, 2183, 2180, 2174, 2178, 2143, 2145, 2181, 2152, 2185, 2193, 2244, 2151, 2194, 2195, 2150, 2173, 2166, 2167, 2217, 2219, 2220, 2221, 2176, 2222, 2201, 2207, 2215, 2216, 2211, 2223, 2224, 2225, 2212, 2227, 2228, 2218, 2213, 2226, 2208, 2214, 2199, 2229, 2230, 2177, 2234, 2190, 2192, 2233, 2239, 2238, 2240, 2237, 2170, 2241, 2236, 2235, 2232, 2186, 2231, 2191, 2196, 2197, 389: 2155, 1635, 1636, 1634, 448: 2171, 2243, 2162, 2157, 2149, 2160, 2158, 2159, 2198, 2210, 2209, 2202, 2200, 2731, 2165, 2242, 2164, 2161}, - {2: 1722, 1639, 1673, 1640, 7: 2119, 1727, 1666, 1724, 2124, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 2128, 1651, 2121, 2123, 2137, 2138, 2136, 2132, 2139, 2129, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 2130, 1760, 1659, 2120, 1737, 1683, 1700, 2125, 2127, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 2135, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 2126, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 2131, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 2122, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 2117, 2118, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 2140, 1835, 2116, 1840, 1839, 1685, 1842, 1844, 1689, 2133, 2134, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 2141, 2142, 1858, 1852, 1853, 1854, 2172, 230: 2153, 232: 2184, 2188, 235: 2169, 2168, 2205, 2179, 243: 2144, 266: 2148, 2187, 290: 2156, 299: 2175, 311: 2189, 2256, 2182, 2204, 2206, 2147, 2146, 2163, 2203, 2183, 2180, 2174, 2178, 2143, 2145, 2181, 2152, 2185, 2193, 2244, 2151, 2194, 2195, 2150, 2173, 2166, 2167, 2217, 2219, 2220, 2221, 2176, 2222, 2201, 2207, 2215, 2216, 2211, 2223, 2224, 2225, 2212, 2227, 2228, 2218, 2213, 2226, 2208, 2214, 2199, 2229, 2230, 2177, 2234, 2190, 2192, 2233, 2239, 2238, 2240, 2237, 2170, 2241, 2236, 2235, 2232, 2186, 2231, 2191, 2196, 2197, 389: 2155, 1635, 1636, 1634, 448: 2171, 2243, 2162, 2157, 2149, 2160, 2158, 2159, 2198, 2210, 2209, 2202, 2200, 2730, 2165, 2242, 2164, 2161}, - {839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 229: 839, 839, 839, 839, 839, 839, 839, 839, 839, 239: 839, 839, 839, 839, 244: 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 268: 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 291: 839, 839, 839, 839, 839, 839, 839, 839, 300: 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 382: 839}, - {2: 1722, 1639, 1673, 1640, 7: 2119, 1727, 1666, 1724, 2124, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 2128, 1651, 2121, 2123, 2137, 2138, 2136, 2132, 2139, 2129, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 2130, 1760, 1659, 2120, 1737, 1683, 1700, 2125, 2127, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 2135, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 2126, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 2131, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 2122, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 2117, 2118, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 2140, 1835, 2116, 1840, 1839, 1685, 1842, 1844, 1689, 2133, 2134, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 2141, 2142, 1858, 1852, 1853, 1854, 2723, 230: 2153, 2112, 2184, 2188, 235: 2169, 2168, 2205, 2179, 243: 2144, 266: 2148, 2187, 290: 2156, 299: 2175, 311: 2189, 2110, 2182, 2204, 2206, 2147, 2146, 2163, 2203, 2183, 2180, 2174, 2178, 2143, 2145, 2181, 2152, 2185, 2193, 2244, 2151, 2194, 2195, 2150, 2173, 2166, 2167, 2217, 2219, 2220, 2221, 2176, 2222, 2201, 2207, 2215, 2216, 2211, 2223, 2224, 2225, 2212, 2227, 2228, 2218, 2213, 2226, 2208, 2214, 2199, 2229, 2230, 2177, 2234, 2190, 2192, 2233, 2239, 2238, 2240, 2237, 2170, 2241, 2236, 2235, 2232, 2186, 2231, 2191, 2196, 2197, 389: 2155, 1635, 1636, 1634, 394: 1546, 448: 2171, 2243, 2162, 2157, 2149, 2160, 2158, 2159, 2198, 2210, 2209, 2202, 2200, 2154, 2165, 2242, 2164, 2161, 2115, 2114, 2113, 2721, 481: 2709, 1547, 1548, 1549, 488: 1552, 490: 1551, 2710, 505: 2722}, + {858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 233: 858, 858, 858, 858, 858, 858, 858, 858, 858, 243: 858, 858, 858, 858, 248: 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 271: 858, 273: 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 295: 858, 858, 858, 858, 858, 858, 858, 858, 304: 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 380: 858}, + {857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 233: 857, 857, 857, 857, 857, 857, 857, 857, 857, 243: 857, 857, 857, 857, 248: 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 271: 857, 273: 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 295: 857, 857, 857, 857, 857, 857, 857, 857, 304: 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 380: 857}, + {856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 233: 856, 856, 856, 856, 856, 856, 856, 856, 856, 243: 856, 856, 856, 856, 248: 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 271: 856, 273: 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 295: 856, 856, 856, 856, 856, 856, 856, 856, 304: 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 380: 856}, + {855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 233: 855, 855, 855, 855, 855, 855, 855, 855, 855, 243: 855, 855, 855, 855, 248: 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 271: 855, 273: 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 295: 855, 855, 855, 855, 855, 855, 855, 855, 304: 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 380: 855}, + {854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 233: 854, 854, 854, 854, 854, 854, 854, 854, 854, 243: 854, 854, 854, 854, 248: 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 271: 854, 273: 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 295: 854, 854, 854, 854, 854, 854, 854, 854, 304: 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 380: 854}, // 655 - {228: 2716}, - {228: 2708, 448: 2707}, - {2: 1722, 1639, 1673, 1640, 7: 2119, 1727, 1666, 1724, 2124, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 2128, 1651, 2121, 2123, 2137, 2138, 2136, 2132, 2139, 2129, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 2130, 1760, 1659, 2120, 1737, 1683, 1700, 2125, 2127, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 2135, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 2126, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 2131, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 2122, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 2117, 2118, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 2140, 1835, 2116, 1840, 1839, 1685, 1842, 1844, 1689, 2133, 2134, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 2141, 2142, 1858, 1852, 1853, 1854, 2172, 230: 2153, 232: 2184, 2188, 235: 2169, 2168, 2205, 2179, 243: 2144, 266: 2148, 2187, 290: 2156, 299: 2175, 311: 2189, 2256, 2182, 2204, 2206, 2147, 2146, 2163, 2203, 2183, 2180, 2174, 2178, 2143, 2145, 2181, 2152, 2185, 2193, 2244, 2151, 2194, 2195, 2150, 2173, 2166, 2167, 2217, 2219, 2220, 2221, 2176, 2222, 2201, 2207, 2215, 2216, 2211, 2223, 2224, 2225, 2212, 2227, 2228, 2218, 2213, 2226, 2208, 2214, 2199, 2229, 2230, 2177, 2234, 2190, 2192, 2233, 2239, 2238, 2240, 2237, 2170, 2241, 2236, 2235, 2232, 2186, 2231, 2191, 2196, 2197, 389: 2155, 1635, 1636, 1634, 448: 2171, 2243, 2162, 2157, 2149, 2160, 2158, 2159, 2198, 2210, 2209, 2202, 2200, 2706, 2165, 2242, 2164, 2161}, - {228: 2701}, - {2: 1722, 1639, 1673, 1640, 7: 2119, 1727, 1666, 1724, 2124, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 2128, 1651, 2121, 2123, 2137, 2138, 2136, 2132, 2139, 2129, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 2130, 1760, 1659, 2120, 1737, 1683, 1700, 2125, 2127, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 2135, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 2126, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 2131, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 2122, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 2117, 2118, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 2140, 1835, 2116, 1840, 1839, 1685, 1842, 1844, 1689, 2133, 2134, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 2141, 2142, 1858, 1852, 1853, 1854, 2172, 230: 2153, 2112, 2184, 2188, 235: 2169, 2168, 2205, 2179, 243: 2144, 266: 2148, 2187, 285: 678, 290: 2156, 299: 2175, 311: 2189, 2110, 2182, 2204, 2206, 2147, 2146, 2163, 2203, 2183, 2180, 2174, 2178, 2143, 2145, 2181, 2152, 2185, 2193, 2244, 2151, 2194, 2195, 2150, 2173, 2166, 2167, 2217, 2219, 2220, 2221, 2176, 2222, 2201, 2207, 2215, 2216, 2211, 2223, 2224, 2225, 2212, 2227, 2228, 2218, 2213, 2226, 2208, 2214, 2199, 2229, 2230, 2177, 2234, 2190, 2192, 2233, 2239, 2238, 2240, 2237, 2170, 2241, 2236, 2235, 2232, 2186, 2231, 2191, 2196, 2197, 389: 2155, 1635, 1636, 1634, 448: 2171, 2243, 2162, 2157, 2149, 2160, 2158, 2159, 2198, 2210, 2209, 2202, 2200, 2154, 2165, 2242, 2164, 2161, 2115, 2114, 2113, 2688, 789: 2689}, + {2: 1736, 1653, 1687, 1654, 7: 2140, 1741, 1680, 1738, 2145, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 2149, 1665, 2142, 2144, 1859, 2158, 2159, 2157, 2153, 2160, 1837, 1839, 1838, 2150, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 2151, 1774, 1673, 2141, 1751, 1714, 2146, 2148, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 2156, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 2147, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 2152, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 2143, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 2138, 2139, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 2161, 1853, 2137, 1858, 1857, 1699, 1860, 1862, 1703, 2154, 2155, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 2162, 2163, 1876, 1870, 1871, 1872, 2193, 234: 2174, 236: 2205, 2209, 239: 2190, 2189, 2226, 2200, 247: 2165, 270: 2169, 272: 2208, 294: 2177, 303: 2196, 315: 2210, 2277, 2203, 2225, 2227, 2168, 2167, 2184, 2224, 2204, 2201, 2195, 2199, 2164, 2166, 2202, 2173, 2206, 2214, 2265, 2172, 2215, 2216, 2171, 2194, 2187, 2188, 2238, 2240, 2241, 2242, 2197, 2243, 2222, 2228, 2236, 2237, 2232, 2244, 2245, 2246, 2233, 2248, 2249, 2239, 2234, 2247, 2229, 2235, 2220, 2250, 2251, 2198, 2255, 2211, 2213, 2254, 2260, 2259, 2261, 2258, 2191, 2262, 2257, 2256, 381: 2253, 2207, 2252, 2212, 2217, 2218, 393: 2176, 1649, 1650, 1648, 452: 2192, 2264, 2183, 2178, 2170, 2181, 2179, 2180, 2219, 2231, 2230, 2223, 2221, 2748, 2186, 2263, 2185, 2182}, + {2: 1736, 1653, 1687, 1654, 7: 2140, 1741, 1680, 1738, 2145, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 2149, 1665, 2142, 2144, 1859, 2158, 2159, 2157, 2153, 2160, 1837, 1839, 1838, 2150, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 2151, 1774, 1673, 2141, 1751, 1714, 2146, 2148, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 2156, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 2147, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 2152, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 2143, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 2138, 2139, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 2161, 1853, 2137, 1858, 1857, 1699, 1860, 1862, 1703, 2154, 2155, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 2162, 2163, 1876, 1870, 1871, 1872, 2193, 234: 2174, 236: 2205, 2209, 239: 2190, 2189, 2226, 2200, 247: 2165, 270: 2169, 272: 2208, 294: 2177, 303: 2196, 315: 2210, 2277, 2203, 2225, 2227, 2168, 2167, 2184, 2224, 2204, 2201, 2195, 2199, 2164, 2166, 2202, 2173, 2206, 2214, 2265, 2172, 2215, 2216, 2171, 2194, 2187, 2188, 2238, 2240, 2241, 2242, 2197, 2243, 2222, 2228, 2236, 2237, 2232, 2244, 2245, 2246, 2233, 2248, 2249, 2239, 2234, 2247, 2229, 2235, 2220, 2250, 2251, 2198, 2255, 2211, 2213, 2254, 2260, 2259, 2261, 2258, 2191, 2262, 2257, 2256, 381: 2253, 2207, 2252, 2212, 2217, 2218, 393: 2176, 1649, 1650, 1648, 452: 2192, 2264, 2183, 2178, 2170, 2181, 2179, 2180, 2219, 2231, 2230, 2223, 2221, 2747, 2186, 2263, 2185, 2182}, + {2: 1736, 1653, 1687, 1654, 7: 2140, 1741, 1680, 1738, 2145, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 2149, 1665, 2142, 2144, 1859, 2158, 2159, 2157, 2153, 2160, 1837, 1839, 1838, 2150, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 2151, 1774, 1673, 2141, 1751, 1714, 2146, 2148, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 2156, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 2147, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 2152, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 2143, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 2138, 2139, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 2161, 1853, 2137, 1858, 1857, 1699, 1860, 1862, 1703, 2154, 2155, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 2162, 2163, 1876, 1870, 1871, 1872, 2193, 234: 2174, 236: 2205, 2209, 239: 2190, 2189, 2226, 2200, 247: 2165, 270: 2169, 272: 2208, 294: 2177, 303: 2196, 315: 2210, 2277, 2203, 2225, 2227, 2168, 2167, 2184, 2224, 2204, 2201, 2195, 2199, 2164, 2166, 2202, 2173, 2206, 2214, 2265, 2172, 2215, 2216, 2171, 2194, 2187, 2188, 2238, 2240, 2241, 2242, 2197, 2243, 2222, 2228, 2236, 2237, 2232, 2244, 2245, 2246, 2233, 2248, 2249, 2239, 2234, 2247, 2229, 2235, 2220, 2250, 2251, 2198, 2255, 2211, 2213, 2254, 2260, 2259, 2261, 2258, 2191, 2262, 2257, 2256, 381: 2253, 2207, 2252, 2212, 2217, 2218, 393: 2176, 1649, 1650, 1648, 452: 2192, 2264, 2183, 2178, 2170, 2181, 2179, 2180, 2219, 2231, 2230, 2223, 2221, 2746, 2186, 2263, 2185, 2182}, + {2: 1736, 1653, 1687, 1654, 7: 2140, 1741, 1680, 1738, 2145, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 2149, 1665, 2142, 2144, 1859, 2158, 2159, 2157, 2153, 2160, 1837, 1839, 1838, 2150, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 2151, 1774, 1673, 2141, 1751, 1714, 2146, 2148, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 2156, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 2147, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 2152, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 2143, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 2138, 2139, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 2161, 1853, 2137, 1858, 1857, 1699, 1860, 1862, 1703, 2154, 2155, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 2162, 2163, 1876, 1870, 1871, 1872, 2193, 234: 2174, 236: 2205, 2209, 239: 2190, 2189, 2226, 2200, 247: 2165, 270: 2169, 272: 2208, 294: 2177, 303: 2196, 315: 2210, 2277, 2203, 2225, 2227, 2168, 2167, 2184, 2224, 2204, 2201, 2195, 2199, 2164, 2166, 2202, 2173, 2206, 2214, 2265, 2172, 2215, 2216, 2171, 2194, 2187, 2188, 2238, 2240, 2241, 2242, 2197, 2243, 2222, 2228, 2236, 2237, 2232, 2244, 2245, 2246, 2233, 2248, 2249, 2239, 2234, 2247, 2229, 2235, 2220, 2250, 2251, 2198, 2255, 2211, 2213, 2254, 2260, 2259, 2261, 2258, 2191, 2262, 2257, 2256, 381: 2253, 2207, 2252, 2212, 2217, 2218, 393: 2176, 1649, 1650, 1648, 452: 2192, 2264, 2183, 2178, 2170, 2181, 2179, 2180, 2219, 2231, 2230, 2223, 2221, 2745, 2186, 2263, 2185, 2182}, + {2: 1736, 1653, 1687, 1654, 7: 2140, 1741, 1680, 1738, 2145, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 2149, 1665, 2142, 2144, 1859, 2158, 2159, 2157, 2153, 2160, 1837, 1839, 1838, 2150, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 2151, 1774, 1673, 2141, 1751, 1714, 2146, 2148, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 2156, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 2147, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 2152, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 2143, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 2138, 2139, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 2161, 1853, 2137, 1858, 1857, 1699, 1860, 1862, 1703, 2154, 2155, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 2162, 2163, 1876, 1870, 1871, 1872, 2193, 234: 2174, 236: 2205, 2209, 239: 2190, 2189, 2226, 2200, 247: 2165, 270: 2169, 272: 2208, 294: 2177, 303: 2196, 315: 2210, 2277, 2203, 2225, 2227, 2168, 2167, 2184, 2224, 2204, 2201, 2195, 2199, 2164, 2166, 2202, 2173, 2206, 2214, 2265, 2172, 2215, 2216, 2171, 2194, 2187, 2188, 2238, 2240, 2241, 2242, 2197, 2243, 2222, 2228, 2236, 2237, 2232, 2244, 2245, 2246, 2233, 2248, 2249, 2239, 2234, 2247, 2229, 2235, 2220, 2250, 2251, 2198, 2255, 2211, 2213, 2254, 2260, 2259, 2261, 2258, 2191, 2262, 2257, 2256, 381: 2253, 2207, 2252, 2212, 2217, 2218, 393: 2176, 1649, 1650, 1648, 452: 2192, 2264, 2183, 2178, 2170, 2181, 2179, 2180, 2219, 2231, 2230, 2223, 2221, 2744, 2186, 2263, 2185, 2182}, // 660 - {228: 2638}, - {228: 2635}, - {228: 2632}, - {228: 810}, - {228: 807}, + {847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 233: 847, 847, 847, 847, 847, 847, 847, 847, 847, 243: 847, 847, 847, 847, 248: 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 271: 847, 273: 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 295: 847, 847, 847, 847, 847, 847, 847, 847, 304: 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 380: 847}, + {2: 1736, 1653, 1687, 1654, 7: 2140, 1741, 1680, 1738, 2145, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 2149, 1665, 2142, 2144, 1859, 2158, 2159, 2157, 2153, 2160, 1837, 1839, 1838, 2150, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 2151, 1774, 1673, 2141, 1751, 1714, 2146, 2148, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 2156, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 2147, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 2152, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 2143, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 2138, 2139, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 2161, 1853, 2137, 1858, 1857, 1699, 1860, 1862, 1703, 2154, 2155, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 2162, 2163, 1876, 1870, 1871, 1872, 2739, 234: 2174, 2133, 2205, 2209, 239: 2190, 2189, 2226, 2200, 247: 2165, 270: 2169, 272: 2208, 294: 2177, 303: 2196, 315: 2210, 2131, 2203, 2225, 2227, 2168, 2167, 2184, 2224, 2204, 2201, 2195, 2199, 2164, 2166, 2202, 2173, 2206, 2214, 2265, 2172, 2215, 2216, 2171, 2194, 2187, 2188, 2238, 2240, 2241, 2242, 2197, 2243, 2222, 2228, 2236, 2237, 2232, 2244, 2245, 2246, 2233, 2248, 2249, 2239, 2234, 2247, 2229, 2235, 2220, 2250, 2251, 2198, 2255, 2211, 2213, 2254, 2260, 2259, 2261, 2258, 2191, 2262, 2257, 2256, 381: 2253, 2207, 2252, 2212, 2217, 2218, 393: 2176, 1649, 1650, 1648, 398: 1560, 452: 2738, 2264, 2183, 2178, 2170, 2181, 2179, 2180, 2219, 2231, 2230, 2223, 2221, 2175, 2186, 2263, 2185, 2182, 2136, 2135, 2134, 2736, 485: 2107, 1561, 1562, 1563, 492: 1566, 494: 1565, 2108, 509: 2737}, + {232: 2731}, + {232: 2729, 452: 2728}, + {2: 1736, 1653, 1687, 1654, 7: 2140, 1741, 1680, 1738, 2145, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 2149, 1665, 2142, 2144, 1859, 2158, 2159, 2157, 2153, 2160, 1837, 1839, 1838, 2150, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 2151, 1774, 1673, 2141, 1751, 1714, 2146, 2148, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 2156, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 2147, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 2152, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 2143, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 2138, 2139, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 2161, 1853, 2137, 1858, 1857, 1699, 1860, 1862, 1703, 2154, 2155, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 2162, 2163, 1876, 1870, 1871, 1872, 2193, 234: 2174, 236: 2205, 2209, 239: 2190, 2189, 2226, 2200, 247: 2165, 270: 2169, 272: 2208, 294: 2177, 303: 2196, 315: 2210, 2277, 2203, 2225, 2227, 2168, 2167, 2184, 2224, 2204, 2201, 2195, 2199, 2164, 2166, 2202, 2173, 2206, 2214, 2265, 2172, 2215, 2216, 2171, 2194, 2187, 2188, 2238, 2240, 2241, 2242, 2197, 2243, 2222, 2228, 2236, 2237, 2232, 2244, 2245, 2246, 2233, 2248, 2249, 2239, 2234, 2247, 2229, 2235, 2220, 2250, 2251, 2198, 2255, 2211, 2213, 2254, 2260, 2259, 2261, 2258, 2191, 2262, 2257, 2256, 381: 2253, 2207, 2252, 2212, 2217, 2218, 393: 2176, 1649, 1650, 1648, 452: 2192, 2264, 2183, 2178, 2170, 2181, 2179, 2180, 2219, 2231, 2230, 2223, 2221, 2727, 2186, 2263, 2185, 2182}, // 665 - {228: 806}, - {228: 804}, - {228: 800}, - {228: 798}, - {228: 797}, + {232: 2722}, + {2: 1736, 1653, 1687, 1654, 7: 2140, 1741, 1680, 1738, 2145, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 2149, 1665, 2142, 2144, 1859, 2158, 2159, 2157, 2153, 2160, 1837, 1839, 1838, 2150, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 2151, 1774, 1673, 2141, 1751, 1714, 2146, 2148, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 2156, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 2147, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 2152, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 2143, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 2138, 2139, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 2161, 1853, 2137, 1858, 1857, 1699, 1860, 1862, 1703, 2154, 2155, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 2162, 2163, 1876, 1870, 1871, 1872, 2193, 234: 2174, 2133, 2205, 2209, 239: 2190, 2189, 2226, 2200, 247: 2165, 270: 2169, 272: 2208, 289: 686, 294: 2177, 303: 2196, 315: 2210, 2131, 2203, 2225, 2227, 2168, 2167, 2184, 2224, 2204, 2201, 2195, 2199, 2164, 2166, 2202, 2173, 2206, 2214, 2265, 2172, 2215, 2216, 2171, 2194, 2187, 2188, 2238, 2240, 2241, 2242, 2197, 2243, 2222, 2228, 2236, 2237, 2232, 2244, 2245, 2246, 2233, 2248, 2249, 2239, 2234, 2247, 2229, 2235, 2220, 2250, 2251, 2198, 2255, 2211, 2213, 2254, 2260, 2259, 2261, 2258, 2191, 2262, 2257, 2256, 381: 2253, 2207, 2252, 2212, 2217, 2218, 393: 2176, 1649, 1650, 1648, 452: 2192, 2264, 2183, 2178, 2170, 2181, 2179, 2180, 2219, 2231, 2230, 2223, 2221, 2175, 2186, 2263, 2185, 2182, 2136, 2135, 2134, 2709, 793: 2710}, + {232: 2659}, + {232: 2656}, + {232: 2653}, // 670 - {228: 795}, - {784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 239: 784, 784, 784, 784, 244: 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 268: 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 291: 784, 784, 784, 784, 784, 784, 784, 784, 300: 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 382: 784}, - {783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 239: 783, 783, 783, 783, 244: 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 268: 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 291: 783, 783, 783, 783, 783, 783, 783, 783, 300: 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 382: 783}, - {782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 239: 782, 782, 782, 782, 244: 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 268: 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 291: 782, 782, 782, 782, 782, 782, 782, 782, 300: 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 382: 782}, - {781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 239: 781, 781, 781, 781, 244: 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 268: 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 291: 781, 781, 781, 781, 781, 781, 781, 781, 300: 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 382: 781}, + {232: 818}, + {232: 815}, + {232: 814}, + {232: 812}, + {232: 808}, // 675 - {780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 239: 780, 780, 780, 780, 244: 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 268: 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 291: 780, 780, 780, 780, 780, 780, 780, 780, 300: 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 382: 780}, - {779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 239: 779, 779, 779, 779, 244: 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 268: 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 291: 779, 779, 779, 779, 779, 779, 779, 779, 300: 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 382: 779}, - {778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 239: 778, 778, 778, 778, 244: 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 268: 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 291: 778, 778, 778, 778, 778, 778, 778, 778, 300: 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 382: 778}, - {777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 239: 777, 777, 777, 777, 244: 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 268: 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 291: 777, 777, 777, 777, 777, 777, 777, 777, 300: 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 382: 777}, - {776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 239: 776, 776, 776, 776, 244: 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 268: 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 291: 776, 776, 776, 776, 776, 776, 776, 776, 300: 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 382: 776}, + {232: 806}, + {232: 805}, + {232: 803}, + {792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 243: 792, 792, 792, 792, 248: 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 271: 792, 273: 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 295: 792, 792, 792, 792, 792, 792, 792, 792, 304: 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 380: 792}, + {791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 243: 791, 791, 791, 791, 248: 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 271: 791, 273: 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 295: 791, 791, 791, 791, 791, 791, 791, 791, 304: 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 380: 791}, // 680 - {228: 2629}, - {228: 2626}, - {786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 2011, 786, 786, 786, 786, 786, 786, 786, 786, 786, 239: 786, 786, 786, 786, 244: 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 268: 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 291: 786, 786, 786, 786, 786, 786, 786, 786, 300: 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 382: 786, 701: 2625}, - {228: 2623}, - {710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 2619, 710, 710, 710, 710, 710, 710, 710, 710, 710, 239: 710, 710, 710, 710, 244: 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 268: 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 291: 710, 710, 710, 710, 710, 710, 710, 710, 300: 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 382: 710, 797: 2618}, + {790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 243: 790, 790, 790, 790, 248: 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 271: 790, 273: 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 295: 790, 790, 790, 790, 790, 790, 790, 790, 304: 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 380: 790}, + {789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 243: 789, 789, 789, 789, 248: 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 271: 789, 273: 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 295: 789, 789, 789, 789, 789, 789, 789, 789, 304: 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 380: 789}, + {788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 243: 788, 788, 788, 788, 248: 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 271: 788, 273: 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 295: 788, 788, 788, 788, 788, 788, 788, 788, 304: 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 380: 788}, + {787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 243: 787, 787, 787, 787, 248: 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 271: 787, 273: 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 295: 787, 787, 787, 787, 787, 787, 787, 787, 304: 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 380: 787}, + {786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 243: 786, 786, 786, 786, 248: 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 271: 786, 273: 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 295: 786, 786, 786, 786, 786, 786, 786, 786, 304: 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 380: 786}, // 685 - {228: 2612}, - {228: 2608}, - {228: 2603}, - {696: 2600, 2597, 2599, 2598}, - {228: 2594}, + {785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 243: 785, 785, 785, 785, 248: 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 271: 785, 273: 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 295: 785, 785, 785, 785, 785, 785, 785, 785, 304: 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 380: 785}, + {784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 243: 784, 784, 784, 784, 248: 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 271: 784, 273: 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 295: 784, 784, 784, 784, 784, 784, 784, 784, 304: 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, 380: 784}, + {232: 2650}, + {232: 2647}, + {794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 2030, 794, 794, 794, 794, 794, 794, 794, 794, 794, 243: 794, 794, 794, 794, 248: 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 271: 794, 273: 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 295: 794, 794, 794, 794, 794, 794, 794, 794, 304: 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 380: 794, 705: 2646}, // 690 - {228: 2589}, - {228: 2580}, - {228: 2573}, - {228: 2568}, - {228: 2533}, + {232: 2644}, + {718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 2640, 718, 718, 718, 718, 718, 718, 718, 718, 718, 243: 718, 718, 718, 718, 248: 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 271: 718, 273: 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 295: 718, 718, 718, 718, 718, 718, 718, 718, 304: 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 380: 718, 801: 2639}, + {232: 2633}, + {232: 2629}, + {232: 2624}, // 695 - {228: 2519}, - {228: 2502}, - {228: 739}, - {228: 738}, - {228: 737}, + {700: 2621, 2618, 2620, 2619}, + {232: 2615}, + {232: 2610}, + {232: 2601}, + {232: 2594}, // 700 - {228: 736}, - {228: 2494}, - {228: 2486}, - {228: 2478}, - {228: 2464}, + {232: 2589}, + {232: 2554}, + {232: 2540}, + {232: 2523}, + {232: 747}, // 705 - {228: 2449}, - {228: 2444}, - {228: 2439}, - {228: 2434}, - {228: 2429}, + {232: 746}, + {232: 745}, + {232: 744}, + {232: 2515}, + {232: 2507}, // 710 - {228: 2424}, - {228: 2419}, - {228: 2406}, - {228: 2403}, - {228: 2400}, + {232: 2499}, + {232: 2485}, + {232: 2470}, + {232: 2465}, + {232: 2460}, // 715 - {228: 2397}, - {228: 2394}, - {228: 2391}, - {228: 2387}, - {228: 2381}, + {232: 2455}, + {232: 2450}, + {232: 2445}, + {232: 2440}, + {232: 2427}, // 720 - {228: 2368}, - {228: 2363}, - {228: 2358}, - {228: 2245}, - {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, 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, 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, 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, 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, 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, 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, 229: 433, 433, 433, 433, 433, 433, 433, 433, 433, 239: 433, 433, 433, 433, 244: 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 268: 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 291: 433, 433, 433, 433, 433, 433, 433, 433, 300: 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 382: 433}, + {232: 2424}, + {232: 2421}, + {232: 2418}, + {232: 2415}, + {232: 2412}, // 725 - {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, 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, 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, 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, 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, 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, 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, 229: 432, 432, 432, 432, 432, 432, 432, 432, 432, 239: 432, 432, 432, 432, 244: 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 268: 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 291: 432, 432, 432, 432, 432, 432, 432, 432, 300: 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 382: 432}, - {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, 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, 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, 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, 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, 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, 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, 229: 431, 431, 431, 431, 431, 431, 431, 431, 431, 239: 431, 431, 431, 431, 244: 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 268: 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 291: 431, 431, 431, 431, 431, 431, 431, 431, 300: 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 382: 431}, - {2: 1722, 1639, 1673, 1640, 7: 2119, 1727, 1666, 1724, 2124, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 2128, 1651, 2121, 2123, 2137, 2138, 2136, 2132, 2139, 2129, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 2130, 1760, 1659, 2120, 1737, 1683, 1700, 2125, 2127, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 2135, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 2126, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 2131, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 2122, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 2117, 2118, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 2140, 1835, 2116, 1840, 1839, 1685, 1842, 1844, 1689, 2133, 2134, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 2141, 2142, 1858, 1852, 1853, 1854, 2172, 230: 2153, 2112, 2184, 2188, 235: 2169, 2168, 2205, 2179, 243: 2144, 266: 2148, 2187, 290: 2156, 299: 2175, 311: 2189, 2110, 2182, 2204, 2206, 2147, 2146, 2163, 2203, 2183, 2180, 2174, 2178, 2143, 2145, 2181, 2152, 2185, 2193, 2244, 2151, 2194, 2195, 2150, 2173, 2166, 2167, 2217, 2219, 2220, 2221, 2176, 2222, 2201, 2207, 2215, 2216, 2211, 2223, 2224, 2225, 2212, 2227, 2228, 2218, 2213, 2226, 2208, 2214, 2199, 2229, 2230, 2177, 2234, 2190, 2192, 2233, 2239, 2238, 2240, 2237, 2170, 2241, 2236, 2235, 2232, 2186, 2231, 2191, 2196, 2197, 389: 2155, 1635, 1636, 1634, 448: 2171, 2243, 2162, 2157, 2149, 2160, 2158, 2159, 2198, 2210, 2209, 2202, 2200, 2154, 2165, 2242, 2164, 2161, 2115, 2114, 2113, 2246}, - {6: 2254, 246: 2253, 248: 2251, 250: 2252, 2250, 2248, 470: 2249, 2247}, - {2: 1722, 1639, 1673, 1640, 7: 2119, 1727, 1666, 1724, 2124, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 2128, 1651, 2121, 2123, 2137, 2138, 2136, 2132, 2139, 2129, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 2130, 1760, 1659, 2120, 1737, 1683, 1700, 2125, 2127, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 2135, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 2126, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 2131, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 2122, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 2117, 2118, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 2140, 1835, 2116, 1840, 1839, 1685, 1842, 1844, 1689, 2133, 2134, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 2141, 2142, 1858, 1852, 1853, 1854, 2172, 230: 2153, 2112, 2184, 2188, 235: 2169, 2168, 2205, 2179, 243: 2144, 266: 2148, 2187, 290: 2156, 299: 2175, 311: 2189, 2110, 2182, 2204, 2206, 2147, 2146, 2163, 2203, 2183, 2180, 2174, 2178, 2143, 2145, 2181, 2152, 2185, 2193, 2244, 2151, 2194, 2195, 2150, 2173, 2166, 2167, 2217, 2219, 2220, 2221, 2176, 2222, 2201, 2207, 2215, 2216, 2211, 2223, 2224, 2225, 2212, 2227, 2228, 2218, 2213, 2226, 2208, 2214, 2199, 2229, 2230, 2177, 2234, 2190, 2192, 2233, 2239, 2238, 2240, 2237, 2170, 2241, 2236, 2235, 2232, 2186, 2231, 2191, 2196, 2197, 389: 2155, 1635, 1636, 1634, 448: 2171, 2243, 2162, 2157, 2149, 2160, 2158, 2159, 2198, 2210, 2209, 2202, 2200, 2154, 2165, 2242, 2164, 2161, 2115, 2114, 2113, 2357}, + {232: 2408}, + {232: 2402}, + {232: 2389}, + {232: 2384}, + {232: 2379}, // 730 - {2: 1722, 1639, 1673, 1640, 7: 2119, 1727, 1666, 1724, 2124, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 2128, 1651, 2121, 2123, 2137, 2138, 2136, 2132, 2139, 2129, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 2130, 1760, 1659, 2120, 1737, 1683, 1700, 2125, 2127, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 2135, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 2126, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 2131, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 2122, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 2117, 2118, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 2140, 1835, 2116, 1840, 1839, 1685, 1842, 1844, 1689, 2133, 2134, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 2141, 2142, 1858, 1852, 1853, 1854, 2172, 230: 2153, 2112, 2184, 2188, 235: 2169, 2168, 2205, 2179, 243: 2144, 266: 2148, 2187, 290: 2156, 299: 2175, 311: 2189, 2110, 2182, 2204, 2206, 2147, 2146, 2163, 2203, 2183, 2180, 2174, 2178, 2143, 2145, 2181, 2152, 2185, 2193, 2244, 2151, 2194, 2195, 2150, 2173, 2166, 2167, 2217, 2219, 2220, 2221, 2176, 2222, 2201, 2207, 2215, 2216, 2211, 2223, 2224, 2225, 2212, 2227, 2228, 2218, 2213, 2226, 2208, 2214, 2199, 2229, 2230, 2177, 2234, 2190, 2192, 2233, 2239, 2238, 2240, 2237, 2170, 2241, 2236, 2235, 2232, 2186, 2231, 2191, 2196, 2197, 389: 2155, 1635, 1636, 1634, 448: 2171, 2243, 2162, 2157, 2149, 2160, 2158, 2159, 2198, 2210, 2209, 2202, 2200, 2154, 2165, 2242, 2164, 2161, 2115, 2114, 2113, 2356}, - {2: 1722, 1639, 1673, 1640, 7: 2119, 1727, 1666, 1724, 2124, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 2128, 1651, 2121, 2123, 2137, 2138, 2136, 2132, 2139, 2129, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 2130, 1760, 1659, 2120, 1737, 1683, 1700, 2125, 2127, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 2135, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 2126, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 2131, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 2122, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 2117, 2118, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 2140, 1835, 2116, 1840, 1839, 1685, 1842, 1844, 1689, 2133, 2134, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 2141, 2142, 1858, 1852, 1853, 1854, 2172, 230: 2153, 2112, 2184, 2188, 235: 2169, 2168, 2205, 2179, 243: 2144, 266: 2148, 2187, 290: 2156, 299: 2175, 311: 2189, 2110, 2182, 2204, 2206, 2147, 2146, 2163, 2203, 2183, 2180, 2174, 2178, 2143, 2145, 2181, 2152, 2185, 2193, 2244, 2151, 2194, 2195, 2150, 2173, 2166, 2167, 2217, 2219, 2220, 2221, 2176, 2222, 2201, 2207, 2215, 2216, 2211, 2223, 2224, 2225, 2212, 2227, 2228, 2218, 2213, 2226, 2208, 2214, 2199, 2229, 2230, 2177, 2234, 2190, 2192, 2233, 2239, 2238, 2240, 2237, 2170, 2241, 2236, 2235, 2232, 2186, 2231, 2191, 2196, 2197, 389: 2155, 1635, 1636, 1634, 448: 2171, 2243, 2162, 2157, 2149, 2160, 2158, 2159, 2198, 2210, 2209, 2202, 2200, 2154, 2165, 2242, 2164, 2161, 2115, 2114, 2113, 2355}, - {2: 1237, 1237, 1237, 1237, 7: 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 22: 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 230: 1237, 1237, 1237, 1237, 235: 1237, 1237, 1237, 1237, 243: 1237, 266: 1237, 1237, 290: 1237, 299: 1237, 311: 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237}, - {2: 1236, 1236, 1236, 1236, 7: 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 22: 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 230: 1236, 1236, 1236, 1236, 235: 1236, 1236, 1236, 1236, 243: 1236, 266: 1236, 1236, 290: 1236, 299: 1236, 311: 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236}, - {2: 1235, 1235, 1235, 1235, 7: 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 22: 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 230: 1235, 1235, 1235, 1235, 235: 1235, 1235, 1235, 1235, 243: 1235, 266: 1235, 1235, 290: 1235, 299: 1235, 311: 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235}, + {232: 2266}, + {434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 233: 434, 434, 434, 434, 434, 434, 434, 434, 434, 243: 434, 434, 434, 434, 248: 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 271: 434, 273: 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 295: 434, 434, 434, 434, 434, 434, 434, 434, 304: 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 380: 434}, + {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, 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, 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, 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, 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, 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, 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, 433, 233: 433, 433, 433, 433, 433, 433, 433, 433, 433, 243: 433, 433, 433, 433, 248: 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 271: 433, 273: 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 295: 433, 433, 433, 433, 433, 433, 433, 433, 304: 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 380: 433}, + {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, 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, 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, 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, 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, 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, 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, 432, 233: 432, 432, 432, 432, 432, 432, 432, 432, 432, 243: 432, 432, 432, 432, 248: 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 271: 432, 273: 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 295: 432, 432, 432, 432, 432, 432, 432, 432, 304: 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 380: 432}, + {2: 1736, 1653, 1687, 1654, 7: 2140, 1741, 1680, 1738, 2145, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 2149, 1665, 2142, 2144, 1859, 2158, 2159, 2157, 2153, 2160, 1837, 1839, 1838, 2150, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 2151, 1774, 1673, 2141, 1751, 1714, 2146, 2148, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 2156, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 2147, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 2152, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 2143, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 2138, 2139, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 2161, 1853, 2137, 1858, 1857, 1699, 1860, 1862, 1703, 2154, 2155, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 2162, 2163, 1876, 1870, 1871, 1872, 2193, 234: 2174, 2133, 2205, 2209, 239: 2190, 2189, 2226, 2200, 247: 2165, 270: 2169, 272: 2208, 294: 2177, 303: 2196, 315: 2210, 2131, 2203, 2225, 2227, 2168, 2167, 2184, 2224, 2204, 2201, 2195, 2199, 2164, 2166, 2202, 2173, 2206, 2214, 2265, 2172, 2215, 2216, 2171, 2194, 2187, 2188, 2238, 2240, 2241, 2242, 2197, 2243, 2222, 2228, 2236, 2237, 2232, 2244, 2245, 2246, 2233, 2248, 2249, 2239, 2234, 2247, 2229, 2235, 2220, 2250, 2251, 2198, 2255, 2211, 2213, 2254, 2260, 2259, 2261, 2258, 2191, 2262, 2257, 2256, 381: 2253, 2207, 2252, 2212, 2217, 2218, 393: 2176, 1649, 1650, 1648, 452: 2192, 2264, 2183, 2178, 2170, 2181, 2179, 2180, 2219, 2231, 2230, 2223, 2221, 2175, 2186, 2263, 2185, 2182, 2136, 2135, 2134, 2267}, // 735 - {2: 1234, 1234, 1234, 1234, 7: 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 22: 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 230: 1234, 1234, 1234, 1234, 235: 1234, 1234, 1234, 1234, 243: 1234, 266: 1234, 1234, 290: 1234, 299: 1234, 311: 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234}, - {2: 1722, 1639, 1673, 1640, 7: 2119, 1727, 1666, 1724, 2124, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 2128, 1651, 2121, 2123, 2137, 2138, 2136, 2132, 2139, 2129, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 2130, 1760, 1659, 2120, 1737, 1683, 1700, 2125, 2127, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 2135, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 2126, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 2131, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 2122, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 2117, 2118, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 2140, 1835, 2116, 1840, 1839, 1685, 1842, 1844, 1689, 2133, 2134, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 2141, 2142, 1858, 1852, 1853, 1854, 2172, 230: 2153, 232: 2184, 2188, 235: 2169, 2168, 2205, 2179, 243: 2144, 266: 2148, 2187, 290: 2156, 299: 2175, 311: 2189, 2256, 2182, 2204, 2206, 2147, 2146, 2163, 2203, 2183, 2180, 2174, 2178, 2143, 2145, 2181, 2152, 2185, 2193, 2244, 2151, 2194, 2195, 2150, 2173, 2166, 2167, 2217, 2219, 2220, 2221, 2176, 2222, 2201, 2207, 2215, 2216, 2211, 2223, 2224, 2225, 2212, 2227, 2228, 2218, 2213, 2226, 2208, 2214, 2199, 2229, 2230, 2177, 2234, 2190, 2192, 2233, 2239, 2238, 2240, 2237, 2170, 2241, 2236, 2235, 2232, 2186, 2231, 2191, 2196, 2197, 389: 2155, 1635, 1636, 1634, 448: 2171, 2243, 2162, 2157, 2149, 2160, 2158, 2159, 2198, 2210, 2209, 2202, 2200, 2255, 2165, 2242, 2164, 2161}, - {21: 2259, 261: 2257, 382: 2258}, - {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, 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, 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, 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, 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, 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, 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, 229: 430, 430, 430, 430, 430, 430, 430, 430, 430, 239: 430, 430, 430, 430, 244: 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 268: 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 291: 430, 430, 430, 430, 430, 430, 430, 430, 300: 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 382: 430}, - {2: 1722, 1639, 1673, 1640, 7: 1650, 1727, 1666, 1724, 1687, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 1714, 1651, 1660, 1681, 1774, 1775, 1771, 1733, 1780, 1716, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 1719, 1760, 1659, 1658, 1737, 1683, 1700, 1705, 1709, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 1770, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 1706, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 1721, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 1677, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 1638, 1642, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 1834, 1835, 1633, 1840, 1839, 1685, 1842, 1844, 1689, 1753, 1769, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 1855, 1856, 1858, 1852, 1853, 1854, 230: 1889, 389: 1890, 1635, 1636, 1634, 473: 2354}, + {6: 2275, 250: 2274, 252: 2272, 2273, 2271, 2269, 474: 2270, 2268}, + {2: 1736, 1653, 1687, 1654, 7: 2140, 1741, 1680, 1738, 2145, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 2149, 1665, 2142, 2144, 1859, 2158, 2159, 2157, 2153, 2160, 1837, 1839, 1838, 2150, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 2151, 1774, 1673, 2141, 1751, 1714, 2146, 2148, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 2156, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 2147, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 2152, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 2143, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 2138, 2139, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 2161, 1853, 2137, 1858, 1857, 1699, 1860, 1862, 1703, 2154, 2155, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 2162, 2163, 1876, 1870, 1871, 1872, 2193, 234: 2174, 2133, 2205, 2209, 239: 2190, 2189, 2226, 2200, 247: 2165, 270: 2169, 272: 2208, 294: 2177, 303: 2196, 315: 2210, 2131, 2203, 2225, 2227, 2168, 2167, 2184, 2224, 2204, 2201, 2195, 2199, 2164, 2166, 2202, 2173, 2206, 2214, 2265, 2172, 2215, 2216, 2171, 2194, 2187, 2188, 2238, 2240, 2241, 2242, 2197, 2243, 2222, 2228, 2236, 2237, 2232, 2244, 2245, 2246, 2233, 2248, 2249, 2239, 2234, 2247, 2229, 2235, 2220, 2250, 2251, 2198, 2255, 2211, 2213, 2254, 2260, 2259, 2261, 2258, 2191, 2262, 2257, 2256, 381: 2253, 2207, 2252, 2212, 2217, 2218, 393: 2176, 1649, 1650, 1648, 452: 2192, 2264, 2183, 2178, 2170, 2181, 2179, 2180, 2219, 2231, 2230, 2223, 2221, 2175, 2186, 2263, 2185, 2182, 2136, 2135, 2134, 2378}, + {2: 1736, 1653, 1687, 1654, 7: 2140, 1741, 1680, 1738, 2145, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 2149, 1665, 2142, 2144, 1859, 2158, 2159, 2157, 2153, 2160, 1837, 1839, 1838, 2150, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 2151, 1774, 1673, 2141, 1751, 1714, 2146, 2148, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 2156, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 2147, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 2152, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 2143, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 2138, 2139, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 2161, 1853, 2137, 1858, 1857, 1699, 1860, 1862, 1703, 2154, 2155, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 2162, 2163, 1876, 1870, 1871, 1872, 2193, 234: 2174, 2133, 2205, 2209, 239: 2190, 2189, 2226, 2200, 247: 2165, 270: 2169, 272: 2208, 294: 2177, 303: 2196, 315: 2210, 2131, 2203, 2225, 2227, 2168, 2167, 2184, 2224, 2204, 2201, 2195, 2199, 2164, 2166, 2202, 2173, 2206, 2214, 2265, 2172, 2215, 2216, 2171, 2194, 2187, 2188, 2238, 2240, 2241, 2242, 2197, 2243, 2222, 2228, 2236, 2237, 2232, 2244, 2245, 2246, 2233, 2248, 2249, 2239, 2234, 2247, 2229, 2235, 2220, 2250, 2251, 2198, 2255, 2211, 2213, 2254, 2260, 2259, 2261, 2258, 2191, 2262, 2257, 2256, 381: 2253, 2207, 2252, 2212, 2217, 2218, 393: 2176, 1649, 1650, 1648, 452: 2192, 2264, 2183, 2178, 2170, 2181, 2179, 2180, 2219, 2231, 2230, 2223, 2221, 2175, 2186, 2263, 2185, 2182, 2136, 2135, 2134, 2377}, + {2: 1736, 1653, 1687, 1654, 7: 2140, 1741, 1680, 1738, 2145, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 2149, 1665, 2142, 2144, 1859, 2158, 2159, 2157, 2153, 2160, 1837, 1839, 1838, 2150, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 2151, 1774, 1673, 2141, 1751, 1714, 2146, 2148, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 2156, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 2147, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 2152, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 2143, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 2138, 2139, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 2161, 1853, 2137, 1858, 1857, 1699, 1860, 1862, 1703, 2154, 2155, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 2162, 2163, 1876, 1870, 1871, 1872, 2193, 234: 2174, 2133, 2205, 2209, 239: 2190, 2189, 2226, 2200, 247: 2165, 270: 2169, 272: 2208, 294: 2177, 303: 2196, 315: 2210, 2131, 2203, 2225, 2227, 2168, 2167, 2184, 2224, 2204, 2201, 2195, 2199, 2164, 2166, 2202, 2173, 2206, 2214, 2265, 2172, 2215, 2216, 2171, 2194, 2187, 2188, 2238, 2240, 2241, 2242, 2197, 2243, 2222, 2228, 2236, 2237, 2232, 2244, 2245, 2246, 2233, 2248, 2249, 2239, 2234, 2247, 2229, 2235, 2220, 2250, 2251, 2198, 2255, 2211, 2213, 2254, 2260, 2259, 2261, 2258, 2191, 2262, 2257, 2256, 381: 2253, 2207, 2252, 2212, 2217, 2218, 393: 2176, 1649, 1650, 1648, 452: 2192, 2264, 2183, 2178, 2170, 2181, 2179, 2180, 2219, 2231, 2230, 2223, 2221, 2175, 2186, 2263, 2185, 2182, 2136, 2135, 2134, 2376}, + {2: 1251, 1251, 1251, 1251, 7: 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 22: 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 234: 1251, 1251, 1251, 1251, 239: 1251, 1251, 1251, 1251, 247: 1251, 270: 1251, 272: 1251, 294: 1251, 303: 1251, 315: 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 381: 1251, 1251, 1251, 1251, 1251, 1251}, // 740 - {2: 1722, 1639, 1673, 1640, 7: 2119, 1727, 1666, 1724, 2124, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 2128, 1651, 2121, 2123, 2137, 2138, 2136, 2132, 2139, 2129, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 2130, 1760, 1659, 2120, 1737, 1683, 1700, 2125, 2127, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 2135, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 2126, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 2131, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 2122, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 2117, 2118, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 2140, 1835, 2116, 1840, 1839, 1685, 1842, 1844, 1689, 2133, 2134, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 2141, 2142, 1858, 1852, 1853, 1854, 2172, 230: 2153, 232: 2184, 2188, 235: 2169, 2168, 2205, 2179, 243: 2144, 266: 2148, 2187, 290: 2156, 299: 2175, 311: 2189, 2256, 2182, 2204, 2206, 2147, 2146, 2163, 2203, 2183, 2180, 2174, 2178, 2143, 2145, 2181, 2152, 2185, 2193, 2244, 2151, 2194, 2195, 2150, 2173, 2166, 2167, 2217, 2219, 2220, 2221, 2176, 2222, 2201, 2207, 2215, 2216, 2211, 2223, 2224, 2225, 2212, 2227, 2228, 2218, 2213, 2226, 2208, 2214, 2199, 2229, 2230, 2177, 2234, 2190, 2192, 2233, 2239, 2238, 2240, 2237, 2170, 2241, 2236, 2235, 2232, 2186, 2231, 2191, 2196, 2197, 389: 2155, 1635, 1636, 1634, 448: 2171, 2243, 2162, 2157, 2149, 2160, 2158, 2159, 2198, 2210, 2209, 2202, 2200, 2353, 2165, 2242, 2164, 2161}, - {43: 570, 253: 2261, 393: 570, 477: 570, 827: 2260}, - {43: 2265, 393: 2266, 477: 573, 569: 2264}, - {4: 2262, 142: 2263}, - {43: 569, 393: 569, 477: 569}, + {2: 1250, 1250, 1250, 1250, 7: 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 22: 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 234: 1250, 1250, 1250, 1250, 239: 1250, 1250, 1250, 1250, 247: 1250, 270: 1250, 272: 1250, 294: 1250, 303: 1250, 315: 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 381: 1250, 1250, 1250, 1250, 1250, 1250}, + {2: 1249, 1249, 1249, 1249, 7: 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 22: 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 234: 1249, 1249, 1249, 1249, 239: 1249, 1249, 1249, 1249, 247: 1249, 270: 1249, 272: 1249, 294: 1249, 303: 1249, 315: 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 381: 1249, 1249, 1249, 1249, 1249, 1249}, + {2: 1248, 1248, 1248, 1248, 7: 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 22: 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 234: 1248, 1248, 1248, 1248, 239: 1248, 1248, 1248, 1248, 247: 1248, 270: 1248, 272: 1248, 294: 1248, 303: 1248, 315: 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 381: 1248, 1248, 1248, 1248, 1248, 1248}, + {2: 1736, 1653, 1687, 1654, 7: 2140, 1741, 1680, 1738, 2145, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 2149, 1665, 2142, 2144, 1859, 2158, 2159, 2157, 2153, 2160, 1837, 1839, 1838, 2150, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 2151, 1774, 1673, 2141, 1751, 1714, 2146, 2148, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 2156, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 2147, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 2152, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 2143, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 2138, 2139, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 2161, 1853, 2137, 1858, 1857, 1699, 1860, 1862, 1703, 2154, 2155, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 2162, 2163, 1876, 1870, 1871, 1872, 2193, 234: 2174, 236: 2205, 2209, 239: 2190, 2189, 2226, 2200, 247: 2165, 270: 2169, 272: 2208, 294: 2177, 303: 2196, 315: 2210, 2277, 2203, 2225, 2227, 2168, 2167, 2184, 2224, 2204, 2201, 2195, 2199, 2164, 2166, 2202, 2173, 2206, 2214, 2265, 2172, 2215, 2216, 2171, 2194, 2187, 2188, 2238, 2240, 2241, 2242, 2197, 2243, 2222, 2228, 2236, 2237, 2232, 2244, 2245, 2246, 2233, 2248, 2249, 2239, 2234, 2247, 2229, 2235, 2220, 2250, 2251, 2198, 2255, 2211, 2213, 2254, 2260, 2259, 2261, 2258, 2191, 2262, 2257, 2256, 381: 2253, 2207, 2252, 2212, 2217, 2218, 393: 2176, 1649, 1650, 1648, 452: 2192, 2264, 2183, 2178, 2170, 2181, 2179, 2180, 2219, 2231, 2230, 2223, 2221, 2276, 2186, 2263, 2185, 2182}, + {21: 2280, 264: 2278, 380: 2279}, // 745 - {43: 568, 393: 568, 477: 568}, - {477: 2269, 480: 2270}, - {102: 2268}, - {102: 2267}, - {477: 571}, + {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, 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, 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, 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, 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, 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, 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, 431, 233: 431, 431, 431, 431, 431, 431, 431, 431, 431, 243: 431, 431, 431, 431, 248: 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 271: 431, 273: 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 295: 431, 431, 431, 431, 431, 431, 431, 431, 304: 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 380: 431}, + {2: 1736, 1653, 1687, 1654, 7: 1664, 1741, 1680, 1738, 1701, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 1728, 1665, 1674, 1695, 1859, 1788, 1789, 1785, 1747, 1794, 1837, 1839, 1838, 1730, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 1733, 1774, 1673, 1672, 1751, 1714, 1719, 1723, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 1784, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 1720, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 1735, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 1691, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 1652, 1656, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 1852, 1853, 1647, 1858, 1857, 1699, 1860, 1862, 1703, 1767, 1783, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 1873, 1874, 1876, 1870, 1871, 1872, 234: 1908, 393: 1909, 1649, 1650, 1648, 477: 2375}, + {2: 1736, 1653, 1687, 1654, 7: 2140, 1741, 1680, 1738, 2145, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 2149, 1665, 2142, 2144, 1859, 2158, 2159, 2157, 2153, 2160, 1837, 1839, 1838, 2150, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 2151, 1774, 1673, 2141, 1751, 1714, 2146, 2148, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 2156, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 2147, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 2152, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 2143, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 2138, 2139, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 2161, 1853, 2137, 1858, 1857, 1699, 1860, 1862, 1703, 2154, 2155, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 2162, 2163, 1876, 1870, 1871, 1872, 2193, 234: 2174, 236: 2205, 2209, 239: 2190, 2189, 2226, 2200, 247: 2165, 270: 2169, 272: 2208, 294: 2177, 303: 2196, 315: 2210, 2277, 2203, 2225, 2227, 2168, 2167, 2184, 2224, 2204, 2201, 2195, 2199, 2164, 2166, 2202, 2173, 2206, 2214, 2265, 2172, 2215, 2216, 2171, 2194, 2187, 2188, 2238, 2240, 2241, 2242, 2197, 2243, 2222, 2228, 2236, 2237, 2232, 2244, 2245, 2246, 2233, 2248, 2249, 2239, 2234, 2247, 2229, 2235, 2220, 2250, 2251, 2198, 2255, 2211, 2213, 2254, 2260, 2259, 2261, 2258, 2191, 2262, 2257, 2256, 381: 2253, 2207, 2252, 2212, 2217, 2218, 393: 2176, 1649, 1650, 1648, 452: 2192, 2264, 2183, 2178, 2170, 2181, 2179, 2180, 2219, 2231, 2230, 2223, 2221, 2374, 2186, 2263, 2185, 2182}, + {47: 578, 257: 2282, 397: 578, 481: 578, 831: 2281}, + {47: 2286, 397: 2287, 481: 581, 573: 2285}, // 750 - {477: 572}, - {2: 1722, 1639, 1673, 1640, 7: 1650, 1727, 1666, 1724, 1687, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 1714, 1651, 1660, 1681, 1774, 1775, 1771, 1733, 1780, 1716, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 1719, 1760, 1659, 1658, 1737, 1683, 1700, 1705, 1709, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 1770, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 1706, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 1721, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 1677, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 1638, 1642, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 1834, 1835, 1633, 1840, 1839, 1685, 1842, 1844, 1689, 1753, 1769, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 1855, 1856, 1858, 1852, 1853, 1854, 2272, 389: 2271, 1635, 1636, 1634, 591: 2274, 752: 2275, 896: 2273}, - {579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 229: 579, 579, 579, 579, 579, 579, 579, 579, 579, 239: 579, 579, 579, 579, 244: 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 268: 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 291: 579, 579, 579, 579, 579, 579, 579, 579, 300: 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 382: 579}, - {621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 229: 621, 621, 621, 621, 621, 621, 621, 621, 621, 239: 621, 621, 621, 621, 244: 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 268: 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 291: 621, 621, 621, 621, 621, 621, 621, 621, 300: 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 382: 621, 396: 621}, - {2: 1722, 1639, 1673, 1640, 7: 1650, 1727, 1666, 1724, 1687, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 618, 1758, 1698, 1755, 1781, 1701, 1777, 1702, 1714, 1651, 1660, 1681, 1774, 1775, 1771, 1733, 1780, 1716, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 1719, 1760, 1659, 1658, 1737, 1683, 1700, 1705, 1709, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 1770, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 1706, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 1721, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 1677, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 1638, 1642, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 1834, 1835, 1633, 1840, 1839, 1685, 1842, 1844, 1689, 1753, 1769, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 1855, 1856, 1858, 1852, 1853, 1854, 247: 618, 270: 618, 618, 618, 389: 2271, 1635, 1636, 1634, 396: 618, 591: 2278, 826: 2277, 897: 2276}, + {4: 2283, 147: 2284}, + {47: 577, 397: 577, 481: 577}, + {47: 576, 397: 576, 481: 576}, + {481: 2290, 484: 2291}, + {105: 2289}, // 755 - {592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 229: 592, 592, 592, 592, 592, 592, 592, 592, 592, 239: 592, 592, 592, 592, 244: 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 268: 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 291: 592, 592, 592, 592, 592, 592, 592, 592, 300: 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 382: 592}, - {591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 229: 591, 591, 591, 591, 591, 591, 591, 591, 591, 239: 591, 591, 591, 591, 244: 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 268: 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 291: 591, 591, 591, 591, 591, 591, 591, 591, 300: 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 382: 591}, - {590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 229: 590, 590, 590, 590, 590, 590, 590, 590, 590, 239: 590, 590, 590, 590, 244: 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 268: 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 291: 590, 590, 590, 590, 590, 590, 590, 590, 300: 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 382: 590}, - {21: 2352}, - {21: 616, 247: 616, 270: 616, 616, 616, 396: 2280, 830: 2279}, + {105: 2288}, + {481: 579}, + {481: 580}, + {2: 1736, 1653, 1687, 1654, 7: 1664, 1741, 1680, 1738, 1701, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 1728, 1665, 1674, 1695, 1859, 1788, 1789, 1785, 1747, 1794, 1837, 1839, 1838, 1730, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 1733, 1774, 1673, 1672, 1751, 1714, 1719, 1723, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 1784, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 1720, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 1735, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 1691, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 1652, 1656, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 1852, 1853, 1647, 1858, 1857, 1699, 1860, 1862, 1703, 1767, 1783, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 1873, 1874, 1876, 1870, 1871, 1872, 2293, 393: 2292, 1649, 1650, 1648, 594: 2295, 756: 2296, 900: 2294}, + {587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 233: 587, 587, 587, 587, 587, 587, 587, 587, 587, 243: 587, 587, 587, 587, 248: 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 271: 587, 273: 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 295: 587, 587, 587, 587, 587, 587, 587, 587, 304: 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 380: 587}, // 760 - {21: 617, 247: 617, 270: 617, 617, 617, 396: 617}, - {21: 614, 247: 2291, 270: 614, 614, 614, 833: 2290}, - {404: 2281}, - {2: 1722, 1639, 1673, 1640, 7: 2119, 1727, 1666, 1724, 2124, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 2128, 1651, 2121, 2123, 2137, 2138, 2136, 2132, 2139, 2129, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 2130, 1760, 1659, 2120, 1737, 1683, 1700, 2125, 2127, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 2135, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 2126, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 2131, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 2122, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 2117, 2118, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 2140, 1835, 2116, 1840, 1839, 1685, 1842, 1844, 1689, 2133, 2134, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 2141, 2142, 1858, 1852, 1853, 1854, 2172, 230: 2153, 2112, 2184, 2188, 235: 2169, 2168, 2205, 2179, 243: 2144, 266: 2148, 2187, 290: 2156, 299: 2175, 311: 2189, 2110, 2182, 2204, 2206, 2147, 2146, 2163, 2203, 2183, 2180, 2174, 2178, 2143, 2145, 2181, 2152, 2185, 2193, 2244, 2151, 2194, 2195, 2150, 2173, 2166, 2167, 2217, 2219, 2220, 2221, 2176, 2222, 2201, 2207, 2215, 2216, 2211, 2223, 2224, 2225, 2212, 2227, 2228, 2218, 2213, 2226, 2208, 2214, 2199, 2229, 2230, 2177, 2234, 2190, 2192, 2233, 2239, 2238, 2240, 2237, 2170, 2241, 2236, 2235, 2232, 2186, 2231, 2191, 2196, 2197, 389: 2155, 1635, 1636, 1634, 448: 2171, 2243, 2162, 2157, 2149, 2160, 2158, 2159, 2198, 2210, 2209, 2202, 2200, 2154, 2165, 2242, 2164, 2161, 2115, 2114, 2113, 2282, 557: 2283, 577: 2284}, - {879, 879, 6: 879, 21: 879, 25: 879, 229: 879, 239: 879, 879, 879, 879, 244: 879, 879, 2253, 879, 2251, 250: 2252, 2250, 2248, 256: 879, 258: 879, 270: 879, 879, 879, 2289, 2288, 470: 2249, 2247, 704: 2287}, + {629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 233: 629, 629, 629, 629, 629, 629, 629, 629, 629, 243: 629, 629, 629, 629, 248: 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 271: 629, 273: 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 295: 629, 629, 629, 629, 629, 629, 629, 629, 304: 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 380: 629, 400: 629}, + {2: 1736, 1653, 1687, 1654, 7: 1664, 1741, 1680, 1738, 1701, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 626, 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 1728, 1665, 1674, 1695, 1859, 1788, 1789, 1785, 1747, 1794, 1837, 1839, 1838, 1730, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 1733, 1774, 1673, 1672, 1751, 1714, 1719, 1723, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 1784, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 1720, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 1735, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 1691, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 1652, 1656, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 1852, 1853, 1647, 1858, 1857, 1699, 1860, 1862, 1703, 1767, 1783, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 1873, 1874, 1876, 1870, 1871, 1872, 251: 626, 274: 626, 626, 626, 393: 2292, 1649, 1650, 1648, 400: 626, 594: 2299, 830: 2298, 901: 2297}, + {600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 233: 600, 600, 600, 600, 600, 600, 600, 600, 600, 243: 600, 600, 600, 600, 248: 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 271: 600, 273: 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 295: 600, 600, 600, 600, 600, 600, 600, 600, 304: 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 380: 600}, + {599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 233: 599, 599, 599, 599, 599, 599, 599, 599, 599, 243: 599, 599, 599, 599, 248: 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 271: 599, 273: 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 295: 599, 599, 599, 599, 599, 599, 599, 599, 304: 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 380: 599}, + {598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 233: 598, 598, 598, 598, 598, 598, 598, 598, 598, 243: 598, 598, 598, 598, 248: 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 271: 598, 273: 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 295: 598, 598, 598, 598, 598, 598, 598, 598, 304: 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 380: 598}, // 765 - {882, 882, 6: 882, 21: 882, 25: 882, 229: 882, 239: 882, 882, 882, 882, 244: 882, 882, 247: 882, 256: 882, 258: 882, 270: 882, 882, 882}, - {6: 2285, 21: 615, 247: 615, 270: 615, 615, 615}, - {2: 1722, 1639, 1673, 1640, 7: 2119, 1727, 1666, 1724, 2124, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 2128, 1651, 2121, 2123, 2137, 2138, 2136, 2132, 2139, 2129, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 2130, 1760, 1659, 2120, 1737, 1683, 1700, 2125, 2127, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 2135, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 2126, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 2131, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 2122, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 2117, 2118, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 2140, 1835, 2116, 1840, 1839, 1685, 1842, 1844, 1689, 2133, 2134, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 2141, 2142, 1858, 1852, 1853, 1854, 2172, 230: 2153, 2112, 2184, 2188, 235: 2169, 2168, 2205, 2179, 243: 2144, 266: 2148, 2187, 290: 2156, 299: 2175, 311: 2189, 2110, 2182, 2204, 2206, 2147, 2146, 2163, 2203, 2183, 2180, 2174, 2178, 2143, 2145, 2181, 2152, 2185, 2193, 2244, 2151, 2194, 2195, 2150, 2173, 2166, 2167, 2217, 2219, 2220, 2221, 2176, 2222, 2201, 2207, 2215, 2216, 2211, 2223, 2224, 2225, 2212, 2227, 2228, 2218, 2213, 2226, 2208, 2214, 2199, 2229, 2230, 2177, 2234, 2190, 2192, 2233, 2239, 2238, 2240, 2237, 2170, 2241, 2236, 2235, 2232, 2186, 2231, 2191, 2196, 2197, 389: 2155, 1635, 1636, 1634, 448: 2171, 2243, 2162, 2157, 2149, 2160, 2158, 2159, 2198, 2210, 2209, 2202, 2200, 2154, 2165, 2242, 2164, 2161, 2115, 2114, 2113, 2282, 557: 2286}, - {881, 881, 6: 881, 21: 881, 25: 881, 229: 881, 239: 881, 881, 881, 881, 244: 881, 881, 247: 881, 256: 881, 258: 881, 270: 881, 881, 881}, - {880, 880, 6: 880, 21: 880, 25: 880, 229: 880, 239: 880, 880, 880, 880, 244: 880, 880, 247: 880, 256: 880, 258: 880, 270: 880, 880, 880}, + {21: 2373}, + {21: 624, 251: 624, 274: 624, 624, 624, 400: 2301, 834: 2300}, + {21: 625, 251: 625, 274: 625, 625, 625, 400: 625}, + {21: 622, 251: 2312, 274: 622, 622, 622, 837: 2311}, + {408: 2302}, // 770 - {878, 878, 6: 878, 21: 878, 25: 878, 229: 878, 239: 878, 878, 878, 878, 244: 878, 878, 247: 878, 256: 878, 258: 878, 270: 878, 878, 878}, - {877, 877, 6: 877, 21: 877, 25: 877, 229: 877, 239: 877, 877, 877, 877, 244: 877, 877, 247: 877, 256: 877, 258: 877, 270: 877, 877, 877}, - {21: 612, 270: 2297, 2298, 2296, 832: 2294, 895: 2295}, - {404: 2292}, - {2: 1722, 1639, 1673, 1640, 7: 2119, 1727, 1666, 1724, 2124, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 2128, 1651, 2121, 2123, 2137, 2138, 2136, 2132, 2139, 2129, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 2130, 1760, 1659, 2120, 1737, 1683, 1700, 2125, 2127, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 2135, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 2126, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 2131, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 2122, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 2117, 2118, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 2140, 1835, 2116, 1840, 1839, 1685, 1842, 1844, 1689, 2133, 2134, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 2141, 2142, 1858, 1852, 1853, 1854, 2172, 230: 2153, 2112, 2184, 2188, 235: 2169, 2168, 2205, 2179, 243: 2144, 266: 2148, 2187, 290: 2156, 299: 2175, 311: 2189, 2110, 2182, 2204, 2206, 2147, 2146, 2163, 2203, 2183, 2180, 2174, 2178, 2143, 2145, 2181, 2152, 2185, 2193, 2244, 2151, 2194, 2195, 2150, 2173, 2166, 2167, 2217, 2219, 2220, 2221, 2176, 2222, 2201, 2207, 2215, 2216, 2211, 2223, 2224, 2225, 2212, 2227, 2228, 2218, 2213, 2226, 2208, 2214, 2199, 2229, 2230, 2177, 2234, 2190, 2192, 2233, 2239, 2238, 2240, 2237, 2170, 2241, 2236, 2235, 2232, 2186, 2231, 2191, 2196, 2197, 389: 2155, 1635, 1636, 1634, 448: 2171, 2243, 2162, 2157, 2149, 2160, 2158, 2159, 2198, 2210, 2209, 2202, 2200, 2154, 2165, 2242, 2164, 2161, 2115, 2114, 2113, 2282, 557: 2283, 577: 2293}, + {2: 1736, 1653, 1687, 1654, 7: 2140, 1741, 1680, 1738, 2145, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 2149, 1665, 2142, 2144, 1859, 2158, 2159, 2157, 2153, 2160, 1837, 1839, 1838, 2150, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 2151, 1774, 1673, 2141, 1751, 1714, 2146, 2148, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 2156, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 2147, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 2152, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 2143, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 2138, 2139, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 2161, 1853, 2137, 1858, 1857, 1699, 1860, 1862, 1703, 2154, 2155, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 2162, 2163, 1876, 1870, 1871, 1872, 2193, 234: 2174, 2133, 2205, 2209, 239: 2190, 2189, 2226, 2200, 247: 2165, 270: 2169, 272: 2208, 294: 2177, 303: 2196, 315: 2210, 2131, 2203, 2225, 2227, 2168, 2167, 2184, 2224, 2204, 2201, 2195, 2199, 2164, 2166, 2202, 2173, 2206, 2214, 2265, 2172, 2215, 2216, 2171, 2194, 2187, 2188, 2238, 2240, 2241, 2242, 2197, 2243, 2222, 2228, 2236, 2237, 2232, 2244, 2245, 2246, 2233, 2248, 2249, 2239, 2234, 2247, 2229, 2235, 2220, 2250, 2251, 2198, 2255, 2211, 2213, 2254, 2260, 2259, 2261, 2258, 2191, 2262, 2257, 2256, 381: 2253, 2207, 2252, 2212, 2217, 2218, 393: 2176, 1649, 1650, 1648, 452: 2192, 2264, 2183, 2178, 2170, 2181, 2179, 2180, 2219, 2231, 2230, 2223, 2221, 2175, 2186, 2263, 2185, 2182, 2136, 2135, 2134, 2303, 561: 2304, 581: 2305}, + {887, 887, 6: 887, 21: 887, 25: 887, 233: 887, 243: 887, 887, 887, 887, 248: 887, 887, 2274, 887, 2272, 2273, 2271, 2269, 260: 887, 887, 274: 887, 887, 887, 2310, 2309, 474: 2270, 2268, 708: 2308}, + {890, 890, 6: 890, 21: 890, 25: 890, 233: 890, 243: 890, 890, 890, 890, 248: 890, 890, 251: 890, 260: 890, 890, 274: 890, 890, 890}, + {6: 2306, 21: 623, 251: 623, 274: 623, 623, 623}, + {2: 1736, 1653, 1687, 1654, 7: 2140, 1741, 1680, 1738, 2145, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 2149, 1665, 2142, 2144, 1859, 2158, 2159, 2157, 2153, 2160, 1837, 1839, 1838, 2150, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 2151, 1774, 1673, 2141, 1751, 1714, 2146, 2148, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 2156, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 2147, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 2152, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 2143, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 2138, 2139, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 2161, 1853, 2137, 1858, 1857, 1699, 1860, 1862, 1703, 2154, 2155, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 2162, 2163, 1876, 1870, 1871, 1872, 2193, 234: 2174, 2133, 2205, 2209, 239: 2190, 2189, 2226, 2200, 247: 2165, 270: 2169, 272: 2208, 294: 2177, 303: 2196, 315: 2210, 2131, 2203, 2225, 2227, 2168, 2167, 2184, 2224, 2204, 2201, 2195, 2199, 2164, 2166, 2202, 2173, 2206, 2214, 2265, 2172, 2215, 2216, 2171, 2194, 2187, 2188, 2238, 2240, 2241, 2242, 2197, 2243, 2222, 2228, 2236, 2237, 2232, 2244, 2245, 2246, 2233, 2248, 2249, 2239, 2234, 2247, 2229, 2235, 2220, 2250, 2251, 2198, 2255, 2211, 2213, 2254, 2260, 2259, 2261, 2258, 2191, 2262, 2257, 2256, 381: 2253, 2207, 2252, 2212, 2217, 2218, 393: 2176, 1649, 1650, 1648, 452: 2192, 2264, 2183, 2178, 2170, 2181, 2179, 2180, 2219, 2231, 2230, 2223, 2221, 2175, 2186, 2263, 2185, 2182, 2136, 2135, 2134, 2303, 561: 2307}, // 775 - {6: 2285, 21: 613, 270: 613, 613, 613}, - {21: 619}, - {49: 2309, 52: 2305, 266: 2299, 300: 2310, 316: 2301, 2300, 2307, 320: 2308, 548: 2306, 623: 2303, 893: 2304, 2302}, - {49: 610, 52: 610, 266: 610, 300: 610, 316: 610, 610, 610, 320: 610}, - {49: 609, 52: 609, 266: 609, 300: 609, 316: 609, 609, 609, 320: 609}, + {889, 889, 6: 889, 21: 889, 25: 889, 233: 889, 243: 889, 889, 889, 889, 248: 889, 889, 251: 889, 260: 889, 889, 274: 889, 889, 889}, + {888, 888, 6: 888, 21: 888, 25: 888, 233: 888, 243: 888, 888, 888, 888, 248: 888, 888, 251: 888, 260: 888, 888, 274: 888, 888, 888}, + {886, 886, 6: 886, 21: 886, 25: 886, 233: 886, 243: 886, 886, 886, 886, 248: 886, 886, 251: 886, 260: 886, 886, 274: 886, 886, 886}, + {885, 885, 6: 885, 21: 885, 25: 885, 233: 885, 243: 885, 885, 885, 885, 248: 885, 885, 251: 885, 260: 885, 885, 274: 885, 885, 885}, + {21: 620, 274: 2318, 2319, 2317, 836: 2315, 899: 2316}, // 780 - {49: 608, 52: 608, 266: 608, 300: 608, 316: 608, 608, 608, 320: 608}, - {1363, 1363, 1363, 1363, 1363, 1363, 1363, 21: 1363, 27: 1363, 47: 1363, 229: 1363, 231: 1363, 234: 1363, 238: 1363, 243: 1363, 383: 1363, 1363, 1363, 1363, 1363, 1363}, - {1362, 1362, 1362, 1362, 1362, 1362, 1362, 21: 1362, 27: 1362, 47: 1362, 229: 1362, 231: 1362, 234: 1362, 238: 1362, 243: 1362, 383: 1362, 1362, 1362, 1362, 1362, 1362}, - {1361, 1361, 1361, 1361, 1361, 1361, 1361, 21: 1361, 27: 1361, 47: 1361, 229: 1361, 231: 1361, 234: 1361, 238: 1361, 243: 1361, 383: 1361, 1361, 1361, 1361, 1361, 1361}, - {21: 611}, + {408: 2313}, + {2: 1736, 1653, 1687, 1654, 7: 2140, 1741, 1680, 1738, 2145, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 2149, 1665, 2142, 2144, 1859, 2158, 2159, 2157, 2153, 2160, 1837, 1839, 1838, 2150, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 2151, 1774, 1673, 2141, 1751, 1714, 2146, 2148, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 2156, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 2147, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 2152, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 2143, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 2138, 2139, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 2161, 1853, 2137, 1858, 1857, 1699, 1860, 1862, 1703, 2154, 2155, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 2162, 2163, 1876, 1870, 1871, 1872, 2193, 234: 2174, 2133, 2205, 2209, 239: 2190, 2189, 2226, 2200, 247: 2165, 270: 2169, 272: 2208, 294: 2177, 303: 2196, 315: 2210, 2131, 2203, 2225, 2227, 2168, 2167, 2184, 2224, 2204, 2201, 2195, 2199, 2164, 2166, 2202, 2173, 2206, 2214, 2265, 2172, 2215, 2216, 2171, 2194, 2187, 2188, 2238, 2240, 2241, 2242, 2197, 2243, 2222, 2228, 2236, 2237, 2232, 2244, 2245, 2246, 2233, 2248, 2249, 2239, 2234, 2247, 2229, 2235, 2220, 2250, 2251, 2198, 2255, 2211, 2213, 2254, 2260, 2259, 2261, 2258, 2191, 2262, 2257, 2256, 381: 2253, 2207, 2252, 2212, 2217, 2218, 393: 2176, 1649, 1650, 1648, 452: 2192, 2264, 2183, 2178, 2170, 2181, 2179, 2180, 2219, 2231, 2230, 2223, 2221, 2175, 2186, 2263, 2185, 2182, 2136, 2135, 2134, 2303, 561: 2304, 581: 2314}, + {6: 2306, 21: 621, 274: 621, 621, 621}, + {21: 627}, + {50: 2330, 53: 2326, 270: 2320, 304: 2331, 320: 2322, 2321, 2328, 324: 2329, 552: 2327, 627: 2324, 897: 2325, 2323}, // 785 - {21: 607}, - {21: 606}, - {27: 2347}, - {27: 2345}, - {27: 2343}, + {50: 618, 53: 618, 270: 618, 304: 618, 320: 618, 618, 618, 324: 618}, + {50: 617, 53: 617, 270: 617, 304: 617, 320: 617, 617, 617, 324: 617}, + {50: 616, 53: 616, 270: 616, 304: 616, 320: 616, 616, 616, 324: 616}, + {1377, 1377, 1377, 1377, 1377, 1377, 1377, 21: 1377, 27: 1377, 48: 1377, 233: 1377, 235: 1377, 238: 1377, 242: 1377, 247: 1377, 387: 1377, 1377, 1377, 1377, 1377, 1377}, + {1376, 1376, 1376, 1376, 1376, 1376, 1376, 21: 1376, 27: 1376, 48: 1376, 233: 1376, 235: 1376, 238: 1376, 242: 1376, 247: 1376, 387: 1376, 1376, 1376, 1376, 1376, 1376}, // 790 - {2: 1722, 1639, 1673, 1640, 7: 2119, 1727, 1666, 1724, 2124, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 2128, 1651, 2121, 2123, 2137, 2138, 2136, 2132, 2139, 2129, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 2130, 1760, 1659, 2120, 1737, 1683, 1700, 2125, 2127, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 2135, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 2126, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 2131, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 2122, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 2117, 2118, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 2140, 1835, 2116, 1840, 1839, 1685, 1842, 1844, 1689, 2133, 2134, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 2141, 2142, 1858, 1852, 1853, 1854, 2172, 230: 2153, 2112, 2184, 2188, 235: 2169, 2168, 2205, 2179, 243: 2144, 266: 2148, 2187, 290: 2156, 299: 2175, 311: 2189, 2110, 2182, 2204, 2206, 2147, 2146, 2163, 2203, 2183, 2180, 2174, 2178, 2143, 2145, 2181, 2152, 2185, 2193, 2244, 2151, 2194, 2195, 2150, 2173, 2166, 2167, 2217, 2219, 2220, 2221, 2176, 2222, 2201, 2207, 2215, 2216, 2211, 2223, 2224, 2225, 2212, 2227, 2228, 2218, 2213, 2226, 2208, 2214, 2199, 2229, 2230, 2177, 2234, 2190, 2192, 2233, 2239, 2238, 2240, 2237, 2170, 2241, 2236, 2235, 2232, 2186, 2231, 2191, 2196, 2197, 389: 2155, 1635, 1636, 1634, 448: 2171, 2243, 2162, 2157, 2149, 2160, 2158, 2159, 2198, 2210, 2209, 2202, 2200, 2154, 2165, 2242, 2164, 2161, 2115, 2114, 2113, 2350}, - {335: 2349}, - {49: 2309, 52: 2311, 266: 2299, 316: 2301, 2300, 2313, 320: 2314, 548: 2312, 623: 2316, 751: 2315}, - {27: 2347, 47: 2348}, - {27: 2345, 47: 2346}, + {1375, 1375, 1375, 1375, 1375, 1375, 1375, 21: 1375, 27: 1375, 48: 1375, 233: 1375, 235: 1375, 238: 1375, 242: 1375, 247: 1375, 387: 1375, 1375, 1375, 1375, 1375, 1375}, + {21: 619}, + {21: 615}, + {21: 614}, + {27: 2368}, // 795 - {27: 2343, 47: 2344}, - {2: 1722, 1639, 1673, 1640, 7: 2119, 1727, 1666, 1724, 2124, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 2128, 1651, 2121, 2123, 2137, 2138, 2136, 2132, 2139, 2129, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 2130, 1760, 1659, 2120, 1737, 1683, 1700, 2125, 2127, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 2135, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 2126, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 2131, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 2122, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 2117, 2118, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 2140, 1835, 2116, 1840, 1839, 1685, 1842, 1844, 1689, 2133, 2134, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 2141, 2142, 1858, 1852, 1853, 1854, 2172, 230: 2153, 2112, 2184, 2188, 235: 2169, 2168, 2205, 2179, 243: 2144, 266: 2148, 2187, 290: 2156, 299: 2175, 311: 2189, 2110, 2182, 2204, 2206, 2147, 2146, 2163, 2203, 2183, 2180, 2174, 2178, 2143, 2145, 2181, 2152, 2185, 2193, 2244, 2151, 2194, 2195, 2150, 2173, 2166, 2167, 2217, 2219, 2220, 2221, 2176, 2222, 2201, 2207, 2215, 2216, 2211, 2223, 2224, 2225, 2212, 2227, 2228, 2218, 2213, 2226, 2208, 2214, 2199, 2229, 2230, 2177, 2234, 2190, 2192, 2233, 2239, 2238, 2240, 2237, 2170, 2241, 2236, 2235, 2232, 2186, 2231, 2191, 2196, 2197, 389: 2155, 1635, 1636, 1634, 448: 2171, 2243, 2162, 2157, 2149, 2160, 2158, 2159, 2198, 2210, 2209, 2202, 2200, 2154, 2165, 2242, 2164, 2161, 2115, 2114, 2113, 2319}, - {246: 2317}, - {21: 599, 246: 599}, - {49: 2309, 52: 2311, 266: 2299, 316: 2301, 2300, 2313, 320: 2314, 548: 2312, 623: 2316, 751: 2318}, + {27: 2366}, + {27: 2364}, + {2: 1736, 1653, 1687, 1654, 7: 2140, 1741, 1680, 1738, 2145, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 2149, 1665, 2142, 2144, 1859, 2158, 2159, 2157, 2153, 2160, 1837, 1839, 1838, 2150, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 2151, 1774, 1673, 2141, 1751, 1714, 2146, 2148, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 2156, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 2147, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 2152, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 2143, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 2138, 2139, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 2161, 1853, 2137, 1858, 1857, 1699, 1860, 1862, 1703, 2154, 2155, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 2162, 2163, 1876, 1870, 1871, 1872, 2193, 234: 2174, 2133, 2205, 2209, 239: 2190, 2189, 2226, 2200, 247: 2165, 270: 2169, 272: 2208, 294: 2177, 303: 2196, 315: 2210, 2131, 2203, 2225, 2227, 2168, 2167, 2184, 2224, 2204, 2201, 2195, 2199, 2164, 2166, 2202, 2173, 2206, 2214, 2265, 2172, 2215, 2216, 2171, 2194, 2187, 2188, 2238, 2240, 2241, 2242, 2197, 2243, 2222, 2228, 2236, 2237, 2232, 2244, 2245, 2246, 2233, 2248, 2249, 2239, 2234, 2247, 2229, 2235, 2220, 2250, 2251, 2198, 2255, 2211, 2213, 2254, 2260, 2259, 2261, 2258, 2191, 2262, 2257, 2256, 381: 2253, 2207, 2252, 2212, 2217, 2218, 393: 2176, 1649, 1650, 1648, 452: 2192, 2264, 2183, 2178, 2170, 2181, 2179, 2180, 2219, 2231, 2230, 2223, 2221, 2175, 2186, 2263, 2185, 2182, 2136, 2135, 2134, 2371}, + {339: 2370}, + {50: 2330, 53: 2332, 270: 2320, 320: 2322, 2321, 2334, 324: 2335, 552: 2333, 627: 2337, 755: 2336}, // 800 - {21: 600}, - {29: 2328, 31: 2324, 2323, 2320, 2322, 2326, 2327, 2321, 2325, 246: 2253, 248: 2251, 250: 2252, 2250, 2248, 275: 2338, 2335, 2337, 2336, 2332, 2334, 2333, 2330, 2331, 2329, 286: 2339, 470: 2249, 2247, 539: 2340}, - {707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 229: 707, 707, 707, 707, 707, 707, 707, 707, 707, 239: 707, 707, 707, 707, 244: 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 262: 707, 707, 707, 707, 268: 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 291: 707, 707, 707, 707, 707, 707, 707, 707, 300: 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707}, - {706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 229: 706, 706, 706, 706, 706, 706, 706, 706, 706, 239: 706, 706, 706, 706, 244: 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 262: 706, 706, 706, 706, 268: 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 291: 706, 706, 706, 706, 706, 706, 706, 706, 300: 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706}, - {705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 229: 705, 705, 705, 705, 705, 705, 705, 705, 705, 239: 705, 705, 705, 705, 244: 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 262: 705, 705, 705, 705, 268: 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 291: 705, 705, 705, 705, 705, 705, 705, 705, 300: 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705}, + {27: 2368, 48: 2369}, + {27: 2366, 48: 2367}, + {27: 2364, 48: 2365}, + {2: 1736, 1653, 1687, 1654, 7: 2140, 1741, 1680, 1738, 2145, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 2149, 1665, 2142, 2144, 1859, 2158, 2159, 2157, 2153, 2160, 1837, 1839, 1838, 2150, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 2151, 1774, 1673, 2141, 1751, 1714, 2146, 2148, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 2156, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 2147, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 2152, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 2143, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 2138, 2139, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 2161, 1853, 2137, 1858, 1857, 1699, 1860, 1862, 1703, 2154, 2155, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 2162, 2163, 1876, 1870, 1871, 1872, 2193, 234: 2174, 2133, 2205, 2209, 239: 2190, 2189, 2226, 2200, 247: 2165, 270: 2169, 272: 2208, 294: 2177, 303: 2196, 315: 2210, 2131, 2203, 2225, 2227, 2168, 2167, 2184, 2224, 2204, 2201, 2195, 2199, 2164, 2166, 2202, 2173, 2206, 2214, 2265, 2172, 2215, 2216, 2171, 2194, 2187, 2188, 2238, 2240, 2241, 2242, 2197, 2243, 2222, 2228, 2236, 2237, 2232, 2244, 2245, 2246, 2233, 2248, 2249, 2239, 2234, 2247, 2229, 2235, 2220, 2250, 2251, 2198, 2255, 2211, 2213, 2254, 2260, 2259, 2261, 2258, 2191, 2262, 2257, 2256, 381: 2253, 2207, 2252, 2212, 2217, 2218, 393: 2176, 1649, 1650, 1648, 452: 2192, 2264, 2183, 2178, 2170, 2181, 2179, 2180, 2219, 2231, 2230, 2223, 2221, 2175, 2186, 2263, 2185, 2182, 2136, 2135, 2134, 2340}, + {250: 2338}, // 805 - {704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 229: 704, 704, 704, 704, 704, 704, 704, 704, 704, 239: 704, 704, 704, 704, 244: 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 262: 704, 704, 704, 704, 268: 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 291: 704, 704, 704, 704, 704, 704, 704, 704, 300: 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704}, - {703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 229: 703, 703, 703, 703, 703, 703, 703, 703, 703, 239: 703, 703, 703, 703, 244: 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 262: 703, 703, 703, 703, 268: 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 291: 703, 703, 703, 703, 703, 703, 703, 703, 300: 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703}, - {702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 229: 702, 702, 702, 702, 702, 702, 702, 702, 702, 239: 702, 702, 702, 702, 244: 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 262: 702, 702, 702, 702, 268: 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 291: 702, 702, 702, 702, 702, 702, 702, 702, 300: 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702}, - {701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 229: 701, 701, 701, 701, 701, 701, 701, 701, 701, 239: 701, 701, 701, 701, 244: 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 262: 701, 701, 701, 701, 268: 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 291: 701, 701, 701, 701, 701, 701, 701, 701, 300: 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701}, - {700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 229: 700, 700, 700, 700, 700, 700, 700, 700, 700, 239: 700, 700, 700, 700, 244: 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 262: 700, 700, 700, 700, 268: 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 291: 700, 700, 700, 700, 700, 700, 700, 700, 300: 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700}, + {21: 607, 250: 607}, + {50: 2330, 53: 2332, 270: 2320, 320: 2322, 2321, 2334, 324: 2335, 552: 2333, 627: 2337, 755: 2339}, + {21: 608}, + {30: 2349, 32: 2345, 2344, 35: 2341, 2343, 2347, 2348, 2342, 43: 2346, 250: 2274, 252: 2272, 2273, 2271, 2269, 279: 2359, 2356, 2358, 2357, 2353, 2355, 2354, 2351, 2352, 2350, 290: 2360, 474: 2270, 2268, 543: 2361}, + {715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 233: 715, 715, 715, 715, 715, 715, 715, 715, 715, 243: 715, 715, 715, 715, 248: 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 265: 715, 715, 715, 715, 715, 271: 715, 273: 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 295: 715, 715, 715, 715, 715, 715, 715, 715, 304: 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715}, // 810 - {699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 229: 699, 699, 699, 699, 699, 699, 699, 699, 699, 239: 699, 699, 699, 699, 244: 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 262: 699, 699, 699, 699, 268: 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 291: 699, 699, 699, 699, 699, 699, 699, 699, 300: 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699}, - {698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 229: 698, 698, 698, 698, 698, 698, 698, 698, 698, 239: 698, 698, 698, 698, 244: 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 262: 698, 698, 698, 698, 268: 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 291: 698, 698, 698, 698, 698, 698, 698, 698, 300: 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698}, - {697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 229: 697, 697, 697, 697, 697, 697, 697, 697, 697, 239: 697, 697, 697, 697, 244: 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 262: 697, 697, 697, 697, 268: 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 291: 697, 697, 697, 697, 697, 697, 697, 697, 300: 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697}, - {696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 229: 696, 696, 696, 696, 696, 696, 696, 696, 696, 239: 696, 696, 696, 696, 244: 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 262: 696, 696, 696, 696, 268: 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 291: 696, 696, 696, 696, 696, 696, 696, 696, 300: 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696}, - {695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 229: 695, 695, 695, 695, 695, 695, 695, 695, 695, 239: 695, 695, 695, 695, 244: 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 262: 695, 695, 695, 695, 268: 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 291: 695, 695, 695, 695, 695, 695, 695, 695, 300: 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695}, + {714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 233: 714, 714, 714, 714, 714, 714, 714, 714, 714, 243: 714, 714, 714, 714, 248: 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 265: 714, 714, 714, 714, 714, 271: 714, 273: 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 295: 714, 714, 714, 714, 714, 714, 714, 714, 304: 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714}, + {713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 233: 713, 713, 713, 713, 713, 713, 713, 713, 713, 243: 713, 713, 713, 713, 248: 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 265: 713, 713, 713, 713, 713, 271: 713, 273: 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 295: 713, 713, 713, 713, 713, 713, 713, 713, 304: 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713}, + {712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 233: 712, 712, 712, 712, 712, 712, 712, 712, 712, 243: 712, 712, 712, 712, 248: 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 265: 712, 712, 712, 712, 712, 271: 712, 273: 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 295: 712, 712, 712, 712, 712, 712, 712, 712, 304: 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712}, + {711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 233: 711, 711, 711, 711, 711, 711, 711, 711, 711, 243: 711, 711, 711, 711, 248: 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 265: 711, 711, 711, 711, 711, 271: 711, 273: 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 295: 711, 711, 711, 711, 711, 711, 711, 711, 304: 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711}, + {710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 233: 710, 710, 710, 710, 710, 710, 710, 710, 710, 243: 710, 710, 710, 710, 248: 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 265: 710, 710, 710, 710, 710, 271: 710, 273: 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 295: 710, 710, 710, 710, 710, 710, 710, 710, 304: 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710}, // 815 - {694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 229: 694, 694, 694, 694, 694, 694, 694, 694, 694, 239: 694, 694, 694, 694, 244: 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 262: 694, 694, 694, 694, 268: 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 291: 694, 694, 694, 694, 694, 694, 694, 694, 300: 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694}, - {693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 229: 693, 693, 693, 693, 693, 693, 693, 693, 693, 239: 693, 693, 693, 693, 244: 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 262: 693, 693, 693, 693, 268: 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 291: 693, 693, 693, 693, 693, 693, 693, 693, 300: 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693}, - {692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 229: 692, 692, 692, 692, 692, 692, 692, 692, 692, 239: 692, 692, 692, 692, 244: 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 262: 692, 692, 692, 692, 268: 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 291: 692, 692, 692, 692, 692, 692, 692, 692, 300: 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, 692}, - {691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 229: 691, 691, 691, 691, 691, 691, 691, 691, 691, 239: 691, 691, 691, 691, 244: 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 262: 691, 691, 691, 691, 268: 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 291: 691, 691, 691, 691, 691, 691, 691, 691, 300: 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691}, - {690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 229: 690, 690, 690, 690, 690, 690, 690, 690, 690, 239: 690, 690, 690, 690, 244: 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 262: 690, 690, 690, 690, 268: 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 291: 690, 690, 690, 690, 690, 690, 690, 690, 300: 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690}, + {709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 233: 709, 709, 709, 709, 709, 709, 709, 709, 709, 243: 709, 709, 709, 709, 248: 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 265: 709, 709, 709, 709, 709, 271: 709, 273: 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 295: 709, 709, 709, 709, 709, 709, 709, 709, 304: 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709}, + {708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 233: 708, 708, 708, 708, 708, 708, 708, 708, 708, 243: 708, 708, 708, 708, 248: 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 265: 708, 708, 708, 708, 708, 271: 708, 273: 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 295: 708, 708, 708, 708, 708, 708, 708, 708, 304: 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708}, + {707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 233: 707, 707, 707, 707, 707, 707, 707, 707, 707, 243: 707, 707, 707, 707, 248: 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 265: 707, 707, 707, 707, 707, 271: 707, 273: 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 295: 707, 707, 707, 707, 707, 707, 707, 707, 304: 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707}, + {706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 233: 706, 706, 706, 706, 706, 706, 706, 706, 706, 243: 706, 706, 706, 706, 248: 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 265: 706, 706, 706, 706, 706, 271: 706, 273: 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 295: 706, 706, 706, 706, 706, 706, 706, 706, 304: 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706}, + {705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 233: 705, 705, 705, 705, 705, 705, 705, 705, 705, 243: 705, 705, 705, 705, 248: 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 265: 705, 705, 705, 705, 705, 271: 705, 273: 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 295: 705, 705, 705, 705, 705, 705, 705, 705, 304: 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705}, // 820 - {689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 229: 689, 689, 689, 689, 689, 689, 689, 689, 689, 239: 689, 689, 689, 689, 244: 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 262: 689, 689, 689, 689, 268: 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 291: 689, 689, 689, 689, 689, 689, 689, 689, 300: 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689}, - {688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 229: 688, 688, 688, 688, 688, 688, 688, 688, 688, 239: 688, 688, 688, 688, 244: 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 262: 688, 688, 688, 688, 268: 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 291: 688, 688, 688, 688, 688, 688, 688, 688, 300: 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688}, - {27: 2341, 47: 2342}, - {21: 602, 246: 602}, - {21: 595, 246: 595}, + {704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 233: 704, 704, 704, 704, 704, 704, 704, 704, 704, 243: 704, 704, 704, 704, 248: 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 265: 704, 704, 704, 704, 704, 271: 704, 273: 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 295: 704, 704, 704, 704, 704, 704, 704, 704, 304: 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704}, + {703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 233: 703, 703, 703, 703, 703, 703, 703, 703, 703, 243: 703, 703, 703, 703, 248: 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 265: 703, 703, 703, 703, 703, 271: 703, 273: 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 295: 703, 703, 703, 703, 703, 703, 703, 703, 304: 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703}, + {702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 233: 702, 702, 702, 702, 702, 702, 702, 702, 702, 243: 702, 702, 702, 702, 248: 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 265: 702, 702, 702, 702, 702, 271: 702, 273: 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 295: 702, 702, 702, 702, 702, 702, 702, 702, 304: 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702}, + {701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 233: 701, 701, 701, 701, 701, 701, 701, 701, 701, 243: 701, 701, 701, 701, 248: 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 265: 701, 701, 701, 701, 701, 271: 701, 273: 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 295: 701, 701, 701, 701, 701, 701, 701, 701, 304: 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701}, + {700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 233: 700, 700, 700, 700, 700, 700, 700, 700, 700, 243: 700, 700, 700, 700, 248: 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 265: 700, 700, 700, 700, 700, 271: 700, 273: 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 295: 700, 700, 700, 700, 700, 700, 700, 700, 304: 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700}, // 825 - {21: 603, 246: 603}, - {21: 596, 246: 596}, - {21: 604, 246: 604}, - {21: 597, 246: 597}, - {21: 605, 246: 605}, + {699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 233: 699, 699, 699, 699, 699, 699, 699, 699, 699, 243: 699, 699, 699, 699, 248: 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 265: 699, 699, 699, 699, 699, 271: 699, 273: 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 295: 699, 699, 699, 699, 699, 699, 699, 699, 304: 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699}, + {698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 233: 698, 698, 698, 698, 698, 698, 698, 698, 698, 243: 698, 698, 698, 698, 248: 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 265: 698, 698, 698, 698, 698, 271: 698, 273: 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 295: 698, 698, 698, 698, 698, 698, 698, 698, 304: 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698}, + {697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 233: 697, 697, 697, 697, 697, 697, 697, 697, 697, 243: 697, 697, 697, 697, 248: 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 265: 697, 697, 697, 697, 697, 271: 697, 273: 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 295: 697, 697, 697, 697, 697, 697, 697, 697, 304: 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697}, + {696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 233: 696, 696, 696, 696, 696, 696, 696, 696, 696, 243: 696, 696, 696, 696, 248: 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 265: 696, 696, 696, 696, 696, 271: 696, 273: 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 295: 696, 696, 696, 696, 696, 696, 696, 696, 304: 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696}, + {27: 2362, 48: 2363}, // 830 - {21: 598, 246: 598}, - {21: 601, 246: 601}, - {29: 2328, 31: 2324, 2323, 2320, 2322, 2326, 2327, 2321, 2325, 246: 2253, 248: 2251, 250: 2252, 2250, 2248, 275: 2338, 2335, 2337, 2336, 2332, 2334, 2333, 2330, 2331, 2329, 286: 2339, 470: 2249, 2247, 539: 2351}, - {27: 2341}, - {620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 229: 620, 620, 620, 620, 620, 620, 620, 620, 620, 239: 620, 620, 620, 620, 244: 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 268: 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 291: 620, 620, 620, 620, 620, 620, 620, 620, 300: 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 382: 620}, + {21: 610, 250: 610}, + {21: 603, 250: 603}, + {21: 611, 250: 611}, + {21: 604, 250: 604}, + {21: 612, 250: 612}, // 835 - {841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 229: 841, 841, 841, 841, 841, 841, 841, 841, 841, 239: 841, 841, 841, 841, 244: 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 2257, 841, 841, 841, 841, 268: 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 291: 841, 841, 841, 841, 841, 841, 841, 841, 300: 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 382: 841}, - {851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 229: 851, 851, 851, 851, 851, 851, 851, 851, 851, 239: 851, 851, 851, 851, 244: 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 268: 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 291: 851, 851, 851, 851, 851, 851, 851, 851, 300: 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 382: 851}, - {1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 229: 1245, 1245, 232: 1245, 1245, 1245, 239: 1245, 1245, 1245, 1245, 244: 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 255: 1245, 1245, 1245, 1245, 1245, 1245, 262: 1245, 1245, 1245, 1245, 270: 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 289: 1245, 470: 2249, 2247}, - {1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 229: 1246, 1246, 232: 1246, 1246, 1246, 239: 1246, 1246, 1246, 1246, 244: 1246, 1246, 2253, 1246, 1246, 1246, 2252, 1246, 1246, 1246, 255: 1246, 1246, 1246, 1246, 1246, 1246, 262: 1246, 1246, 1246, 1246, 270: 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 289: 1246, 470: 2249, 2247}, - {1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 229: 1247, 1247, 232: 1247, 1247, 1247, 239: 1247, 1247, 1247, 1247, 244: 1247, 1247, 2253, 1247, 1247, 1247, 2252, 1247, 2248, 1247, 255: 1247, 1247, 1247, 1247, 1247, 1247, 262: 1247, 1247, 1247, 1247, 270: 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 289: 1247, 470: 2249, 2247}, + {21: 605, 250: 605}, + {21: 613, 250: 613}, + {21: 606, 250: 606}, + {21: 609, 250: 609}, + {30: 2349, 32: 2345, 2344, 35: 2341, 2343, 2347, 2348, 2342, 43: 2346, 250: 2274, 252: 2272, 2273, 2271, 2269, 279: 2359, 2356, 2358, 2357, 2353, 2355, 2354, 2351, 2352, 2350, 290: 2360, 474: 2270, 2268, 543: 2372}, // 840 - {2: 1722, 1639, 1673, 1640, 7: 2119, 1727, 1666, 1724, 2124, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 2128, 1651, 2121, 2123, 2137, 2138, 2136, 2132, 2139, 2129, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 2130, 1760, 1659, 2120, 1737, 1683, 1700, 2125, 2127, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 2135, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 2126, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 2131, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 2122, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 2117, 2118, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 2140, 1835, 2116, 1840, 1839, 1685, 1842, 1844, 1689, 2133, 2134, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 2141, 2142, 1858, 1852, 1853, 1854, 2172, 230: 2153, 2112, 2184, 2188, 235: 2169, 2168, 2205, 2179, 243: 2144, 266: 2148, 2187, 290: 2156, 299: 2175, 311: 2189, 2110, 2182, 2204, 2206, 2147, 2146, 2163, 2203, 2183, 2180, 2174, 2178, 2143, 2145, 2181, 2152, 2185, 2193, 2244, 2151, 2194, 2195, 2150, 2173, 2166, 2167, 2217, 2219, 2220, 2221, 2176, 2222, 2201, 2207, 2215, 2216, 2211, 2223, 2224, 2225, 2212, 2227, 2228, 2218, 2213, 2226, 2208, 2214, 2199, 2229, 2230, 2177, 2234, 2190, 2192, 2233, 2239, 2238, 2240, 2237, 2170, 2241, 2236, 2235, 2232, 2186, 2231, 2191, 2196, 2197, 389: 2155, 1635, 1636, 1634, 448: 2171, 2243, 2162, 2157, 2149, 2160, 2158, 2159, 2198, 2210, 2209, 2202, 2200, 2154, 2165, 2242, 2164, 2161, 2115, 2114, 2113, 2359}, - {21: 2360, 246: 2253, 248: 2251, 250: 2252, 2250, 2248, 470: 2249, 2247}, - {43: 2265, 393: 2266, 477: 573, 569: 2361}, - {477: 2269, 480: 2362}, - {580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 229: 580, 580, 580, 580, 580, 580, 580, 580, 580, 239: 580, 580, 580, 580, 244: 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 268: 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 291: 580, 580, 580, 580, 580, 580, 580, 580, 300: 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 382: 580}, + {27: 2362}, + {628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 233: 628, 628, 628, 628, 628, 628, 628, 628, 628, 243: 628, 628, 628, 628, 248: 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 271: 628, 273: 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 295: 628, 628, 628, 628, 628, 628, 628, 628, 304: 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 380: 628}, + {849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 233: 849, 849, 849, 849, 849, 849, 849, 849, 849, 243: 849, 849, 849, 849, 248: 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 2278, 849, 849, 849, 849, 849, 271: 849, 273: 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 295: 849, 849, 849, 849, 849, 849, 849, 849, 304: 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 380: 849}, + {859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 233: 859, 859, 859, 859, 859, 859, 859, 859, 859, 243: 859, 859, 859, 859, 248: 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 271: 859, 273: 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 295: 859, 859, 859, 859, 859, 859, 859, 859, 304: 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 380: 859}, + {1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 233: 1259, 1259, 236: 1259, 1259, 1259, 243: 1259, 1259, 1259, 1259, 248: 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 259: 1259, 1259, 1259, 1259, 1259, 265: 1259, 1259, 1259, 1259, 1259, 274: 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 293: 1259, 474: 2270, 2268}, // 845 - {2: 1722, 1639, 1673, 1640, 7: 2119, 1727, 1666, 1724, 2124, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 2128, 1651, 2121, 2123, 2137, 2138, 2136, 2132, 2139, 2129, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 2130, 1760, 1659, 2120, 1737, 1683, 1700, 2125, 2127, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 2135, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 2126, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 2131, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 2122, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 2117, 2118, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 2140, 1835, 2116, 1840, 1839, 1685, 1842, 1844, 1689, 2133, 2134, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 2141, 2142, 1858, 1852, 1853, 1854, 2172, 230: 2153, 2112, 2184, 2188, 235: 2169, 2168, 2205, 2179, 243: 2144, 266: 2148, 2187, 290: 2156, 299: 2175, 311: 2189, 2110, 2182, 2204, 2206, 2147, 2146, 2163, 2203, 2183, 2180, 2174, 2178, 2143, 2145, 2181, 2152, 2185, 2193, 2244, 2151, 2194, 2195, 2150, 2173, 2166, 2167, 2217, 2219, 2220, 2221, 2176, 2222, 2201, 2207, 2215, 2216, 2211, 2223, 2224, 2225, 2212, 2227, 2228, 2218, 2213, 2226, 2208, 2214, 2199, 2229, 2230, 2177, 2234, 2190, 2192, 2233, 2239, 2238, 2240, 2237, 2170, 2241, 2236, 2235, 2232, 2186, 2231, 2191, 2196, 2197, 389: 2155, 1635, 1636, 1634, 448: 2171, 2243, 2162, 2157, 2149, 2160, 2158, 2159, 2198, 2210, 2209, 2202, 2200, 2154, 2165, 2242, 2164, 2161, 2115, 2114, 2113, 2364}, - {21: 2365, 246: 2253, 248: 2251, 250: 2252, 2250, 2248, 470: 2249, 2247}, - {43: 2265, 393: 2266, 477: 573, 569: 2366}, - {477: 2269, 480: 2367}, - {581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 229: 581, 581, 581, 581, 581, 581, 581, 581, 581, 239: 581, 581, 581, 581, 244: 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 268: 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 291: 581, 581, 581, 581, 581, 581, 581, 581, 300: 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 382: 581}, + {1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 233: 1260, 1260, 236: 1260, 1260, 1260, 243: 1260, 1260, 1260, 1260, 248: 1260, 1260, 2274, 1260, 1260, 2273, 1260, 1260, 1260, 1260, 259: 1260, 1260, 1260, 1260, 1260, 265: 1260, 1260, 1260, 1260, 1260, 274: 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 293: 1260, 474: 2270, 2268}, + {1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 233: 1261, 1261, 236: 1261, 1261, 1261, 243: 1261, 1261, 1261, 1261, 248: 1261, 1261, 2274, 1261, 1261, 2273, 1261, 2269, 1261, 1261, 259: 1261, 1261, 1261, 1261, 1261, 265: 1261, 1261, 1261, 1261, 1261, 274: 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 293: 1261, 474: 2270, 2268}, + {2: 1736, 1653, 1687, 1654, 7: 2140, 1741, 1680, 1738, 2145, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 2149, 1665, 2142, 2144, 1859, 2158, 2159, 2157, 2153, 2160, 1837, 1839, 1838, 2150, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 2151, 1774, 1673, 2141, 1751, 1714, 2146, 2148, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 2156, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 2147, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 2152, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 2143, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 2138, 2139, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 2161, 1853, 2137, 1858, 1857, 1699, 1860, 1862, 1703, 2154, 2155, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 2162, 2163, 1876, 1870, 1871, 1872, 2193, 234: 2174, 2133, 2205, 2209, 239: 2190, 2189, 2226, 2200, 247: 2165, 270: 2169, 272: 2208, 294: 2177, 303: 2196, 315: 2210, 2131, 2203, 2225, 2227, 2168, 2167, 2184, 2224, 2204, 2201, 2195, 2199, 2164, 2166, 2202, 2173, 2206, 2214, 2265, 2172, 2215, 2216, 2171, 2194, 2187, 2188, 2238, 2240, 2241, 2242, 2197, 2243, 2222, 2228, 2236, 2237, 2232, 2244, 2245, 2246, 2233, 2248, 2249, 2239, 2234, 2247, 2229, 2235, 2220, 2250, 2251, 2198, 2255, 2211, 2213, 2254, 2260, 2259, 2261, 2258, 2191, 2262, 2257, 2256, 381: 2253, 2207, 2252, 2212, 2217, 2218, 393: 2176, 1649, 1650, 1648, 452: 2192, 2264, 2183, 2178, 2170, 2181, 2179, 2180, 2219, 2231, 2230, 2223, 2221, 2175, 2186, 2263, 2185, 2182, 2136, 2135, 2134, 2380}, + {21: 2381, 250: 2274, 252: 2272, 2273, 2271, 2269, 474: 2270, 2268}, + {47: 2286, 397: 2287, 481: 581, 573: 2382}, // 850 - {2: 1722, 1639, 1673, 1640, 7: 2119, 1727, 1666, 1724, 2124, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 2128, 1651, 2121, 2123, 2137, 2138, 2136, 2132, 2139, 2129, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 2130, 1760, 1659, 2120, 1737, 1683, 1700, 2125, 2127, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 2135, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 2126, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 2131, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 2122, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 2117, 2118, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 2140, 1835, 2116, 1840, 1839, 1685, 1842, 1844, 1689, 2133, 2134, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 2141, 2142, 1858, 1852, 1853, 1854, 2172, 230: 2153, 2112, 2184, 2188, 235: 2169, 2168, 2205, 2179, 243: 2144, 266: 2148, 2187, 290: 2156, 299: 2175, 311: 2189, 2110, 2182, 2204, 2206, 2147, 2146, 2163, 2203, 2183, 2180, 2174, 2178, 2143, 2145, 2181, 2152, 2185, 2193, 2244, 2151, 2194, 2195, 2150, 2173, 2166, 2167, 2217, 2219, 2220, 2221, 2176, 2222, 2201, 2207, 2215, 2216, 2211, 2223, 2224, 2225, 2212, 2227, 2228, 2218, 2213, 2226, 2208, 2214, 2199, 2229, 2230, 2177, 2234, 2190, 2192, 2233, 2239, 2238, 2240, 2237, 2170, 2241, 2236, 2235, 2232, 2186, 2231, 2191, 2196, 2197, 389: 2155, 1635, 1636, 1634, 448: 2171, 2243, 2162, 2157, 2149, 2160, 2158, 2159, 2198, 2210, 2209, 2202, 2200, 2154, 2165, 2242, 2164, 2161, 2115, 2114, 2113, 2369}, - {6: 2371, 21: 578, 246: 2253, 248: 2251, 250: 2252, 2250, 2248, 470: 2249, 2247, 702: 2370}, - {21: 2378}, - {266: 2299, 316: 2301, 2300, 2373, 548: 2372}, - {6: 2375, 21: 575, 703: 2377}, + {481: 2290, 484: 2383}, + {588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 233: 588, 588, 588, 588, 588, 588, 588, 588, 588, 243: 588, 588, 588, 588, 248: 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 271: 588, 273: 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 295: 588, 588, 588, 588, 588, 588, 588, 588, 304: 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 380: 588}, + {2: 1736, 1653, 1687, 1654, 7: 2140, 1741, 1680, 1738, 2145, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 2149, 1665, 2142, 2144, 1859, 2158, 2159, 2157, 2153, 2160, 1837, 1839, 1838, 2150, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 2151, 1774, 1673, 2141, 1751, 1714, 2146, 2148, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 2156, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 2147, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 2152, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 2143, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 2138, 2139, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 2161, 1853, 2137, 1858, 1857, 1699, 1860, 1862, 1703, 2154, 2155, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 2162, 2163, 1876, 1870, 1871, 1872, 2193, 234: 2174, 2133, 2205, 2209, 239: 2190, 2189, 2226, 2200, 247: 2165, 270: 2169, 272: 2208, 294: 2177, 303: 2196, 315: 2210, 2131, 2203, 2225, 2227, 2168, 2167, 2184, 2224, 2204, 2201, 2195, 2199, 2164, 2166, 2202, 2173, 2206, 2214, 2265, 2172, 2215, 2216, 2171, 2194, 2187, 2188, 2238, 2240, 2241, 2242, 2197, 2243, 2222, 2228, 2236, 2237, 2232, 2244, 2245, 2246, 2233, 2248, 2249, 2239, 2234, 2247, 2229, 2235, 2220, 2250, 2251, 2198, 2255, 2211, 2213, 2254, 2260, 2259, 2261, 2258, 2191, 2262, 2257, 2256, 381: 2253, 2207, 2252, 2212, 2217, 2218, 393: 2176, 1649, 1650, 1648, 452: 2192, 2264, 2183, 2178, 2170, 2181, 2179, 2180, 2219, 2231, 2230, 2223, 2221, 2175, 2186, 2263, 2185, 2182, 2136, 2135, 2134, 2385}, + {21: 2386, 250: 2274, 252: 2272, 2273, 2271, 2269, 474: 2270, 2268}, + {47: 2286, 397: 2287, 481: 581, 573: 2387}, // 855 - {6: 2375, 21: 575, 703: 2374}, - {21: 576}, - {2: 1722, 1639, 1673, 1640, 7: 2119, 1727, 1666, 1724, 2124, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 2128, 1651, 2121, 2123, 2137, 2138, 2136, 2132, 2139, 2129, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 2130, 1760, 1659, 2120, 1737, 1683, 1700, 2125, 2127, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 2135, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 2126, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 2131, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 2122, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 2117, 2118, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 2140, 1835, 2116, 1840, 1839, 1685, 1842, 1844, 1689, 2133, 2134, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 2141, 2142, 1858, 1852, 1853, 1854, 2172, 230: 2153, 2112, 2184, 2188, 235: 2169, 2168, 2205, 2179, 243: 2144, 266: 2148, 2187, 290: 2156, 299: 2175, 311: 2189, 2110, 2182, 2204, 2206, 2147, 2146, 2163, 2203, 2183, 2180, 2174, 2178, 2143, 2145, 2181, 2152, 2185, 2193, 2244, 2151, 2194, 2195, 2150, 2173, 2166, 2167, 2217, 2219, 2220, 2221, 2176, 2222, 2201, 2207, 2215, 2216, 2211, 2223, 2224, 2225, 2212, 2227, 2228, 2218, 2213, 2226, 2208, 2214, 2199, 2229, 2230, 2177, 2234, 2190, 2192, 2233, 2239, 2238, 2240, 2237, 2170, 2241, 2236, 2235, 2232, 2186, 2231, 2191, 2196, 2197, 389: 2155, 1635, 1636, 1634, 448: 2171, 2243, 2162, 2157, 2149, 2160, 2158, 2159, 2198, 2210, 2209, 2202, 2200, 2154, 2165, 2242, 2164, 2161, 2115, 2114, 2113, 2376}, - {21: 574, 246: 2253, 248: 2251, 250: 2252, 2250, 2248, 470: 2249, 2247}, - {21: 577}, + {481: 2290, 484: 2388}, + {589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 233: 589, 589, 589, 589, 589, 589, 589, 589, 589, 243: 589, 589, 589, 589, 248: 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 271: 589, 273: 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 295: 589, 589, 589, 589, 589, 589, 589, 589, 304: 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 380: 589}, + {2: 1736, 1653, 1687, 1654, 7: 2140, 1741, 1680, 1738, 2145, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 2149, 1665, 2142, 2144, 1859, 2158, 2159, 2157, 2153, 2160, 1837, 1839, 1838, 2150, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 2151, 1774, 1673, 2141, 1751, 1714, 2146, 2148, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 2156, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 2147, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 2152, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 2143, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 2138, 2139, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 2161, 1853, 2137, 1858, 1857, 1699, 1860, 1862, 1703, 2154, 2155, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 2162, 2163, 1876, 1870, 1871, 1872, 2193, 234: 2174, 2133, 2205, 2209, 239: 2190, 2189, 2226, 2200, 247: 2165, 270: 2169, 272: 2208, 294: 2177, 303: 2196, 315: 2210, 2131, 2203, 2225, 2227, 2168, 2167, 2184, 2224, 2204, 2201, 2195, 2199, 2164, 2166, 2202, 2173, 2206, 2214, 2265, 2172, 2215, 2216, 2171, 2194, 2187, 2188, 2238, 2240, 2241, 2242, 2197, 2243, 2222, 2228, 2236, 2237, 2232, 2244, 2245, 2246, 2233, 2248, 2249, 2239, 2234, 2247, 2229, 2235, 2220, 2250, 2251, 2198, 2255, 2211, 2213, 2254, 2260, 2259, 2261, 2258, 2191, 2262, 2257, 2256, 381: 2253, 2207, 2252, 2212, 2217, 2218, 393: 2176, 1649, 1650, 1648, 452: 2192, 2264, 2183, 2178, 2170, 2181, 2179, 2180, 2219, 2231, 2230, 2223, 2221, 2175, 2186, 2263, 2185, 2182, 2136, 2135, 2134, 2390}, + {6: 2392, 21: 586, 250: 2274, 252: 2272, 2273, 2271, 2269, 474: 2270, 2268, 706: 2391}, + {21: 2399}, // 860 - {43: 2265, 393: 2266, 477: 573, 569: 2379}, - {477: 2269, 480: 2380}, - {582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 229: 582, 582, 582, 582, 582, 582, 582, 582, 582, 239: 582, 582, 582, 582, 244: 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 268: 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 291: 582, 582, 582, 582, 582, 582, 582, 582, 300: 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 382: 582}, - {2: 1722, 1639, 1673, 1640, 7: 2119, 1727, 1666, 1724, 2124, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 2128, 1651, 2121, 2123, 2137, 2138, 2136, 2132, 2139, 2129, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 2130, 1760, 1659, 2120, 1737, 1683, 1700, 2125, 2127, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 2135, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 2126, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 2131, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 2122, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 2117, 2118, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 2140, 1835, 2116, 1840, 1839, 1685, 1842, 1844, 1689, 2133, 2134, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 2141, 2142, 1858, 1852, 1853, 1854, 2172, 230: 2153, 2112, 2184, 2188, 235: 2169, 2168, 2205, 2179, 243: 2144, 266: 2148, 2187, 290: 2156, 299: 2175, 311: 2189, 2110, 2182, 2204, 2206, 2147, 2146, 2163, 2203, 2183, 2180, 2174, 2178, 2143, 2145, 2181, 2152, 2185, 2193, 2244, 2151, 2194, 2195, 2150, 2173, 2166, 2167, 2217, 2219, 2220, 2221, 2176, 2222, 2201, 2207, 2215, 2216, 2211, 2223, 2224, 2225, 2212, 2227, 2228, 2218, 2213, 2226, 2208, 2214, 2199, 2229, 2230, 2177, 2234, 2190, 2192, 2233, 2239, 2238, 2240, 2237, 2170, 2241, 2236, 2235, 2232, 2186, 2231, 2191, 2196, 2197, 389: 2155, 1635, 1636, 1634, 448: 2171, 2243, 2162, 2157, 2149, 2160, 2158, 2159, 2198, 2210, 2209, 2202, 2200, 2154, 2165, 2242, 2164, 2161, 2115, 2114, 2113, 2382}, - {6: 2371, 21: 578, 246: 2253, 248: 2251, 250: 2252, 2250, 2248, 470: 2249, 2247, 702: 2383}, + {270: 2320, 320: 2322, 2321, 2394, 552: 2393}, + {6: 2396, 21: 583, 707: 2398}, + {6: 2396, 21: 583, 707: 2395}, + {21: 584}, + {2: 1736, 1653, 1687, 1654, 7: 2140, 1741, 1680, 1738, 2145, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 2149, 1665, 2142, 2144, 1859, 2158, 2159, 2157, 2153, 2160, 1837, 1839, 1838, 2150, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 2151, 1774, 1673, 2141, 1751, 1714, 2146, 2148, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 2156, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 2147, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 2152, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 2143, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 2138, 2139, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 2161, 1853, 2137, 1858, 1857, 1699, 1860, 1862, 1703, 2154, 2155, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 2162, 2163, 1876, 1870, 1871, 1872, 2193, 234: 2174, 2133, 2205, 2209, 239: 2190, 2189, 2226, 2200, 247: 2165, 270: 2169, 272: 2208, 294: 2177, 303: 2196, 315: 2210, 2131, 2203, 2225, 2227, 2168, 2167, 2184, 2224, 2204, 2201, 2195, 2199, 2164, 2166, 2202, 2173, 2206, 2214, 2265, 2172, 2215, 2216, 2171, 2194, 2187, 2188, 2238, 2240, 2241, 2242, 2197, 2243, 2222, 2228, 2236, 2237, 2232, 2244, 2245, 2246, 2233, 2248, 2249, 2239, 2234, 2247, 2229, 2235, 2220, 2250, 2251, 2198, 2255, 2211, 2213, 2254, 2260, 2259, 2261, 2258, 2191, 2262, 2257, 2256, 381: 2253, 2207, 2252, 2212, 2217, 2218, 393: 2176, 1649, 1650, 1648, 452: 2192, 2264, 2183, 2178, 2170, 2181, 2179, 2180, 2219, 2231, 2230, 2223, 2221, 2175, 2186, 2263, 2185, 2182, 2136, 2135, 2134, 2397}, // 865 - {21: 2384}, - {43: 2265, 393: 2266, 477: 573, 569: 2385}, - {477: 2269, 480: 2386}, - {583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 229: 583, 583, 583, 583, 583, 583, 583, 583, 583, 239: 583, 583, 583, 583, 244: 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 268: 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 291: 583, 583, 583, 583, 583, 583, 583, 583, 300: 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 382: 583}, - {2: 1722, 1639, 1673, 1640, 7: 2119, 1727, 1666, 1724, 2124, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 2128, 1651, 2121, 2123, 2137, 2138, 2136, 2132, 2139, 2129, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 2130, 1760, 1659, 2120, 1737, 1683, 1700, 2125, 2127, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 2135, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 2126, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 2131, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 2122, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 2117, 2118, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 2140, 1835, 2116, 1840, 1839, 1685, 1842, 1844, 1689, 2133, 2134, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 2141, 2142, 1858, 1852, 1853, 1854, 2172, 230: 2153, 232: 2184, 2188, 235: 2169, 2168, 2205, 2179, 243: 2144, 266: 2148, 2187, 290: 2156, 299: 2175, 311: 2189, 2256, 2182, 2204, 2206, 2147, 2146, 2163, 2203, 2183, 2180, 2174, 2178, 2143, 2145, 2181, 2152, 2185, 2193, 2244, 2151, 2194, 2195, 2150, 2173, 2166, 2167, 2217, 2219, 2220, 2221, 2176, 2222, 2201, 2207, 2215, 2216, 2211, 2223, 2224, 2225, 2212, 2227, 2228, 2218, 2213, 2226, 2208, 2214, 2199, 2229, 2230, 2177, 2234, 2190, 2192, 2233, 2239, 2238, 2240, 2237, 2170, 2241, 2236, 2235, 2232, 2186, 2231, 2191, 2196, 2197, 389: 2155, 1635, 1636, 1634, 448: 2171, 2243, 2162, 2157, 2149, 2160, 2158, 2159, 2198, 2210, 2209, 2202, 2200, 2388, 2165, 2242, 2164, 2161}, + {21: 582, 250: 2274, 252: 2272, 2273, 2271, 2269, 474: 2270, 2268}, + {21: 585}, + {47: 2286, 397: 2287, 481: 581, 573: 2400}, + {481: 2290, 484: 2401}, + {590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 233: 590, 590, 590, 590, 590, 590, 590, 590, 590, 243: 590, 590, 590, 590, 248: 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 271: 590, 273: 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 295: 590, 590, 590, 590, 590, 590, 590, 590, 304: 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 380: 590}, // 870 - {21: 2389, 261: 2257, 382: 2258}, - {477: 2269, 480: 2390}, - {584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 229: 584, 584, 584, 584, 584, 584, 584, 584, 584, 239: 584, 584, 584, 584, 244: 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 268: 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 291: 584, 584, 584, 584, 584, 584, 584, 584, 300: 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 382: 584}, - {21: 2392}, - {477: 2269, 480: 2393}, + {2: 1736, 1653, 1687, 1654, 7: 2140, 1741, 1680, 1738, 2145, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 2149, 1665, 2142, 2144, 1859, 2158, 2159, 2157, 2153, 2160, 1837, 1839, 1838, 2150, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 2151, 1774, 1673, 2141, 1751, 1714, 2146, 2148, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 2156, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 2147, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 2152, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 2143, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 2138, 2139, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 2161, 1853, 2137, 1858, 1857, 1699, 1860, 1862, 1703, 2154, 2155, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 2162, 2163, 1876, 1870, 1871, 1872, 2193, 234: 2174, 2133, 2205, 2209, 239: 2190, 2189, 2226, 2200, 247: 2165, 270: 2169, 272: 2208, 294: 2177, 303: 2196, 315: 2210, 2131, 2203, 2225, 2227, 2168, 2167, 2184, 2224, 2204, 2201, 2195, 2199, 2164, 2166, 2202, 2173, 2206, 2214, 2265, 2172, 2215, 2216, 2171, 2194, 2187, 2188, 2238, 2240, 2241, 2242, 2197, 2243, 2222, 2228, 2236, 2237, 2232, 2244, 2245, 2246, 2233, 2248, 2249, 2239, 2234, 2247, 2229, 2235, 2220, 2250, 2251, 2198, 2255, 2211, 2213, 2254, 2260, 2259, 2261, 2258, 2191, 2262, 2257, 2256, 381: 2253, 2207, 2252, 2212, 2217, 2218, 393: 2176, 1649, 1650, 1648, 452: 2192, 2264, 2183, 2178, 2170, 2181, 2179, 2180, 2219, 2231, 2230, 2223, 2221, 2175, 2186, 2263, 2185, 2182, 2136, 2135, 2134, 2403}, + {6: 2392, 21: 586, 250: 2274, 252: 2272, 2273, 2271, 2269, 474: 2270, 2268, 706: 2404}, + {21: 2405}, + {47: 2286, 397: 2287, 481: 581, 573: 2406}, + {481: 2290, 484: 2407}, // 875 - {585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 229: 585, 585, 585, 585, 585, 585, 585, 585, 585, 239: 585, 585, 585, 585, 244: 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 268: 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 291: 585, 585, 585, 585, 585, 585, 585, 585, 300: 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 382: 585}, - {21: 2395}, - {477: 2269, 480: 2396}, - {586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 229: 586, 586, 586, 586, 586, 586, 586, 586, 586, 239: 586, 586, 586, 586, 244: 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 268: 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 291: 586, 586, 586, 586, 586, 586, 586, 586, 300: 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 382: 586}, - {21: 2398}, + {591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 233: 591, 591, 591, 591, 591, 591, 591, 591, 591, 243: 591, 591, 591, 591, 248: 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 271: 591, 273: 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 295: 591, 591, 591, 591, 591, 591, 591, 591, 304: 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 380: 591}, + {2: 1736, 1653, 1687, 1654, 7: 2140, 1741, 1680, 1738, 2145, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 2149, 1665, 2142, 2144, 1859, 2158, 2159, 2157, 2153, 2160, 1837, 1839, 1838, 2150, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 2151, 1774, 1673, 2141, 1751, 1714, 2146, 2148, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 2156, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 2147, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 2152, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 2143, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 2138, 2139, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 2161, 1853, 2137, 1858, 1857, 1699, 1860, 1862, 1703, 2154, 2155, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 2162, 2163, 1876, 1870, 1871, 1872, 2193, 234: 2174, 236: 2205, 2209, 239: 2190, 2189, 2226, 2200, 247: 2165, 270: 2169, 272: 2208, 294: 2177, 303: 2196, 315: 2210, 2277, 2203, 2225, 2227, 2168, 2167, 2184, 2224, 2204, 2201, 2195, 2199, 2164, 2166, 2202, 2173, 2206, 2214, 2265, 2172, 2215, 2216, 2171, 2194, 2187, 2188, 2238, 2240, 2241, 2242, 2197, 2243, 2222, 2228, 2236, 2237, 2232, 2244, 2245, 2246, 2233, 2248, 2249, 2239, 2234, 2247, 2229, 2235, 2220, 2250, 2251, 2198, 2255, 2211, 2213, 2254, 2260, 2259, 2261, 2258, 2191, 2262, 2257, 2256, 381: 2253, 2207, 2252, 2212, 2217, 2218, 393: 2176, 1649, 1650, 1648, 452: 2192, 2264, 2183, 2178, 2170, 2181, 2179, 2180, 2219, 2231, 2230, 2223, 2221, 2409, 2186, 2263, 2185, 2182}, + {21: 2410, 264: 2278, 380: 2279}, + {481: 2290, 484: 2411}, + {592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 233: 592, 592, 592, 592, 592, 592, 592, 592, 592, 243: 592, 592, 592, 592, 248: 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 271: 592, 273: 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 295: 592, 592, 592, 592, 592, 592, 592, 592, 304: 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 380: 592}, // 880 - {477: 2269, 480: 2399}, - {587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 229: 587, 587, 587, 587, 587, 587, 587, 587, 587, 239: 587, 587, 587, 587, 244: 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 268: 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 291: 587, 587, 587, 587, 587, 587, 587, 587, 300: 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 382: 587}, - {21: 2401}, - {477: 2269, 480: 2402}, - {588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 229: 588, 588, 588, 588, 588, 588, 588, 588, 588, 239: 588, 588, 588, 588, 244: 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 268: 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 291: 588, 588, 588, 588, 588, 588, 588, 588, 300: 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 382: 588}, + {21: 2413}, + {481: 2290, 484: 2414}, + {593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 233: 593, 593, 593, 593, 593, 593, 593, 593, 593, 243: 593, 593, 593, 593, 248: 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 271: 593, 273: 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 295: 593, 593, 593, 593, 593, 593, 593, 593, 304: 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 380: 593}, + {21: 2416}, + {481: 2290, 484: 2417}, // 885 - {21: 2404}, - {477: 2269, 480: 2405}, - {589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 229: 589, 589, 589, 589, 589, 589, 589, 589, 589, 239: 589, 589, 589, 589, 244: 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 268: 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 291: 589, 589, 589, 589, 589, 589, 589, 589, 300: 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 382: 589}, - {2: 821, 821, 821, 821, 7: 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 22: 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 230: 821, 821, 821, 821, 235: 821, 821, 821, 821, 243: 821, 266: 821, 821, 290: 821, 299: 821, 311: 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 478: 2409, 499: 2407, 2408, 509: 2410, 2411, 2412, 519: 2413}, - {2: 825, 825, 825, 825, 7: 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 22: 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 230: 825, 825, 825, 825, 235: 825, 825, 825, 825, 243: 825, 255: 825, 266: 825, 825, 269: 825, 290: 825, 299: 825, 311: 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 394: 825, 478: 825, 493: 825, 495: 825, 825, 825}, + {594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 233: 594, 594, 594, 594, 594, 594, 594, 594, 594, 243: 594, 594, 594, 594, 248: 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 271: 594, 273: 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 295: 594, 594, 594, 594, 594, 594, 594, 594, 304: 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 380: 594}, + {21: 2419}, + {481: 2290, 484: 2420}, + {595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 233: 595, 595, 595, 595, 595, 595, 595, 595, 595, 243: 595, 595, 595, 595, 248: 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 271: 595, 273: 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 295: 595, 595, 595, 595, 595, 595, 595, 595, 304: 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 380: 595}, + {21: 2422}, // 890 - {2: 824, 824, 824, 824, 7: 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 22: 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 230: 824, 824, 824, 824, 235: 824, 824, 824, 824, 243: 824, 255: 824, 266: 824, 824, 269: 824, 290: 824, 299: 824, 311: 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 394: 824, 478: 824, 493: 824, 495: 824, 824, 824}, - {2: 823, 823, 823, 823, 7: 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 22: 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 230: 823, 823, 823, 823, 235: 823, 823, 823, 823, 243: 823, 255: 823, 266: 823, 823, 269: 823, 290: 823, 299: 823, 311: 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 394: 823, 493: 823, 495: 823, 823, 823}, - {2: 822, 822, 822, 822, 7: 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 22: 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 230: 822, 822, 822, 822, 235: 822, 822, 822, 822, 243: 822, 266: 822, 822, 290: 822, 299: 822, 311: 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 478: 2418}, - {2: 820, 820, 820, 820, 7: 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 22: 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 230: 820, 820, 820, 820, 235: 820, 820, 820, 820, 243: 820, 255: 820, 266: 820, 820, 269: 820, 290: 820, 299: 820, 311: 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 493: 820, 495: 820, 820, 820}, - {2: 817, 817, 817, 817, 7: 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 22: 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 230: 817, 817, 817, 817, 235: 817, 817, 817, 817, 243: 817, 266: 817, 817, 290: 817, 299: 817, 311: 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817}, + {481: 2290, 484: 2423}, + {596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 233: 596, 596, 596, 596, 596, 596, 596, 596, 596, 243: 596, 596, 596, 596, 248: 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 271: 596, 273: 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 295: 596, 596, 596, 596, 596, 596, 596, 596, 304: 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 380: 596}, + {21: 2425}, + {481: 2290, 484: 2426}, + {597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 233: 597, 597, 597, 597, 597, 597, 597, 597, 597, 243: 597, 597, 597, 597, 248: 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 271: 597, 273: 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 295: 597, 597, 597, 597, 597, 597, 597, 597, 304: 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 380: 597}, // 895 - {2: 1722, 1639, 1673, 1640, 7: 2119, 1727, 1666, 1724, 2124, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 2128, 1651, 2121, 2123, 2137, 2138, 2136, 2132, 2139, 2129, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 2130, 1760, 1659, 2120, 1737, 1683, 1700, 2125, 2127, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 2135, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 2126, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 2131, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 2122, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 2117, 2118, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 2140, 1835, 2116, 1840, 1839, 1685, 1842, 1844, 1689, 2133, 2134, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 2141, 2142, 1858, 1852, 1853, 1854, 2172, 230: 2153, 2112, 2184, 2188, 235: 2169, 2168, 2205, 2179, 243: 2144, 266: 2148, 2187, 290: 2156, 299: 2175, 311: 2189, 2110, 2182, 2204, 2206, 2147, 2146, 2163, 2203, 2183, 2180, 2174, 2178, 2143, 2145, 2181, 2152, 2185, 2193, 2244, 2151, 2194, 2195, 2150, 2173, 2166, 2167, 2217, 2219, 2220, 2221, 2176, 2222, 2201, 2207, 2215, 2216, 2211, 2223, 2224, 2225, 2212, 2227, 2228, 2218, 2213, 2226, 2208, 2214, 2199, 2229, 2230, 2177, 2234, 2190, 2192, 2233, 2239, 2238, 2240, 2237, 2170, 2241, 2236, 2235, 2232, 2186, 2231, 2191, 2196, 2197, 389: 2155, 1635, 1636, 1634, 448: 2171, 2243, 2162, 2157, 2149, 2160, 2158, 2159, 2198, 2210, 2209, 2202, 2200, 2154, 2165, 2242, 2164, 2161, 2115, 2114, 2113, 2414}, - {21: 2415, 246: 2253, 248: 2251, 250: 2252, 2250, 2248, 470: 2249, 2247}, - {594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 229: 594, 594, 594, 594, 594, 594, 594, 594, 594, 239: 594, 594, 594, 594, 244: 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 268: 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 291: 594, 594, 594, 594, 594, 594, 594, 594, 300: 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 382: 594, 477: 2269, 480: 2417, 492: 2416}, - {714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 229: 714, 714, 714, 714, 714, 714, 714, 714, 714, 239: 714, 714, 714, 714, 244: 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 268: 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 291: 714, 714, 714, 714, 714, 714, 714, 714, 300: 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 382: 714}, - {593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 229: 593, 593, 593, 593, 593, 593, 593, 593, 593, 239: 593, 593, 593, 593, 244: 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 268: 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 291: 593, 593, 593, 593, 593, 593, 593, 593, 300: 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 382: 593}, + {2: 829, 829, 829, 829, 7: 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 22: 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 234: 829, 829, 829, 829, 239: 829, 829, 829, 829, 247: 829, 270: 829, 272: 829, 294: 829, 303: 829, 315: 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 381: 829, 829, 829, 829, 829, 829, 482: 2430, 503: 2428, 2429, 513: 2431, 2432, 2433, 523: 2434}, + {2: 833, 833, 833, 833, 7: 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 22: 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 234: 833, 833, 833, 833, 239: 833, 833, 833, 833, 247: 833, 259: 833, 270: 833, 272: 833, 833, 294: 833, 303: 833, 315: 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 381: 833, 833, 833, 833, 833, 833, 398: 833, 482: 833, 497: 833, 499: 833, 833, 833}, + {2: 832, 832, 832, 832, 7: 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 22: 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 234: 832, 832, 832, 832, 239: 832, 832, 832, 832, 247: 832, 259: 832, 270: 832, 272: 832, 832, 294: 832, 303: 832, 315: 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 381: 832, 832, 832, 832, 832, 832, 398: 832, 482: 832, 497: 832, 499: 832, 832, 832}, + {2: 831, 831, 831, 831, 7: 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 22: 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 234: 831, 831, 831, 831, 239: 831, 831, 831, 831, 247: 831, 259: 831, 270: 831, 272: 831, 831, 294: 831, 303: 831, 315: 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 381: 831, 831, 831, 831, 831, 831, 398: 831, 497: 831, 499: 831, 831, 831}, + {2: 830, 830, 830, 830, 7: 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 22: 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 234: 830, 830, 830, 830, 239: 830, 830, 830, 830, 247: 830, 270: 830, 272: 830, 294: 830, 303: 830, 315: 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 381: 830, 830, 830, 830, 830, 830, 482: 2439}, // 900 - {2: 816, 816, 816, 816, 7: 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 22: 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 230: 816, 816, 816, 816, 235: 816, 816, 816, 816, 243: 816, 266: 816, 816, 290: 816, 299: 816, 311: 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816}, - {2: 821, 821, 821, 821, 7: 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 22: 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 230: 821, 821, 821, 821, 235: 821, 821, 821, 821, 243: 821, 266: 821, 821, 290: 821, 299: 821, 311: 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 478: 2409, 499: 2407, 2408, 509: 2410, 2411, 2412, 519: 2420}, - {2: 1722, 1639, 1673, 1640, 7: 2119, 1727, 1666, 1724, 2124, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 2128, 1651, 2121, 2123, 2137, 2138, 2136, 2132, 2139, 2129, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 2130, 1760, 1659, 2120, 1737, 1683, 1700, 2125, 2127, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 2135, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 2126, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 2131, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 2122, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 2117, 2118, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 2140, 1835, 2116, 1840, 1839, 1685, 1842, 1844, 1689, 2133, 2134, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 2141, 2142, 1858, 1852, 1853, 1854, 2172, 230: 2153, 2112, 2184, 2188, 235: 2169, 2168, 2205, 2179, 243: 2144, 266: 2148, 2187, 290: 2156, 299: 2175, 311: 2189, 2110, 2182, 2204, 2206, 2147, 2146, 2163, 2203, 2183, 2180, 2174, 2178, 2143, 2145, 2181, 2152, 2185, 2193, 2244, 2151, 2194, 2195, 2150, 2173, 2166, 2167, 2217, 2219, 2220, 2221, 2176, 2222, 2201, 2207, 2215, 2216, 2211, 2223, 2224, 2225, 2212, 2227, 2228, 2218, 2213, 2226, 2208, 2214, 2199, 2229, 2230, 2177, 2234, 2190, 2192, 2233, 2239, 2238, 2240, 2237, 2170, 2241, 2236, 2235, 2232, 2186, 2231, 2191, 2196, 2197, 389: 2155, 1635, 1636, 1634, 448: 2171, 2243, 2162, 2157, 2149, 2160, 2158, 2159, 2198, 2210, 2209, 2202, 2200, 2154, 2165, 2242, 2164, 2161, 2115, 2114, 2113, 2421}, - {21: 2422, 246: 2253, 248: 2251, 250: 2252, 2250, 2248, 470: 2249, 2247}, - {594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 229: 594, 594, 594, 594, 594, 594, 594, 594, 594, 239: 594, 594, 594, 594, 244: 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 268: 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 291: 594, 594, 594, 594, 594, 594, 594, 594, 300: 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 382: 594, 477: 2269, 480: 2417, 492: 2423}, + {2: 828, 828, 828, 828, 7: 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 22: 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 234: 828, 828, 828, 828, 239: 828, 828, 828, 828, 247: 828, 259: 828, 270: 828, 272: 828, 828, 294: 828, 303: 828, 315: 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 381: 828, 828, 828, 828, 828, 828, 497: 828, 499: 828, 828, 828}, + {2: 825, 825, 825, 825, 7: 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 22: 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 234: 825, 825, 825, 825, 239: 825, 825, 825, 825, 247: 825, 270: 825, 272: 825, 294: 825, 303: 825, 315: 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 381: 825, 825, 825, 825, 825, 825}, + {2: 1736, 1653, 1687, 1654, 7: 2140, 1741, 1680, 1738, 2145, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 2149, 1665, 2142, 2144, 1859, 2158, 2159, 2157, 2153, 2160, 1837, 1839, 1838, 2150, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 2151, 1774, 1673, 2141, 1751, 1714, 2146, 2148, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 2156, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 2147, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 2152, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 2143, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 2138, 2139, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 2161, 1853, 2137, 1858, 1857, 1699, 1860, 1862, 1703, 2154, 2155, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 2162, 2163, 1876, 1870, 1871, 1872, 2193, 234: 2174, 2133, 2205, 2209, 239: 2190, 2189, 2226, 2200, 247: 2165, 270: 2169, 272: 2208, 294: 2177, 303: 2196, 315: 2210, 2131, 2203, 2225, 2227, 2168, 2167, 2184, 2224, 2204, 2201, 2195, 2199, 2164, 2166, 2202, 2173, 2206, 2214, 2265, 2172, 2215, 2216, 2171, 2194, 2187, 2188, 2238, 2240, 2241, 2242, 2197, 2243, 2222, 2228, 2236, 2237, 2232, 2244, 2245, 2246, 2233, 2248, 2249, 2239, 2234, 2247, 2229, 2235, 2220, 2250, 2251, 2198, 2255, 2211, 2213, 2254, 2260, 2259, 2261, 2258, 2191, 2262, 2257, 2256, 381: 2253, 2207, 2252, 2212, 2217, 2218, 393: 2176, 1649, 1650, 1648, 452: 2192, 2264, 2183, 2178, 2170, 2181, 2179, 2180, 2219, 2231, 2230, 2223, 2221, 2175, 2186, 2263, 2185, 2182, 2136, 2135, 2134, 2435}, + {21: 2436, 250: 2274, 252: 2272, 2273, 2271, 2269, 474: 2270, 2268}, + {602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 233: 602, 602, 602, 602, 602, 602, 602, 602, 602, 243: 602, 602, 602, 602, 248: 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 271: 602, 273: 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 295: 602, 602, 602, 602, 602, 602, 602, 602, 304: 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 380: 602, 481: 2290, 484: 2438, 496: 2437}, // 905 - {715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 229: 715, 715, 715, 715, 715, 715, 715, 715, 715, 239: 715, 715, 715, 715, 244: 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 268: 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 291: 715, 715, 715, 715, 715, 715, 715, 715, 300: 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 382: 715}, - {2: 821, 821, 821, 821, 7: 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 22: 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 230: 821, 821, 821, 821, 235: 821, 821, 821, 821, 243: 821, 266: 821, 821, 290: 821, 299: 821, 311: 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 478: 2409, 499: 2407, 2408, 509: 2410, 2411, 2412, 519: 2425}, - {2: 1722, 1639, 1673, 1640, 7: 2119, 1727, 1666, 1724, 2124, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 2128, 1651, 2121, 2123, 2137, 2138, 2136, 2132, 2139, 2129, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 2130, 1760, 1659, 2120, 1737, 1683, 1700, 2125, 2127, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 2135, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 2126, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 2131, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 2122, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 2117, 2118, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 2140, 1835, 2116, 1840, 1839, 1685, 1842, 1844, 1689, 2133, 2134, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 2141, 2142, 1858, 1852, 1853, 1854, 2172, 230: 2153, 2112, 2184, 2188, 235: 2169, 2168, 2205, 2179, 243: 2144, 266: 2148, 2187, 290: 2156, 299: 2175, 311: 2189, 2110, 2182, 2204, 2206, 2147, 2146, 2163, 2203, 2183, 2180, 2174, 2178, 2143, 2145, 2181, 2152, 2185, 2193, 2244, 2151, 2194, 2195, 2150, 2173, 2166, 2167, 2217, 2219, 2220, 2221, 2176, 2222, 2201, 2207, 2215, 2216, 2211, 2223, 2224, 2225, 2212, 2227, 2228, 2218, 2213, 2226, 2208, 2214, 2199, 2229, 2230, 2177, 2234, 2190, 2192, 2233, 2239, 2238, 2240, 2237, 2170, 2241, 2236, 2235, 2232, 2186, 2231, 2191, 2196, 2197, 389: 2155, 1635, 1636, 1634, 448: 2171, 2243, 2162, 2157, 2149, 2160, 2158, 2159, 2198, 2210, 2209, 2202, 2200, 2154, 2165, 2242, 2164, 2161, 2115, 2114, 2113, 2426}, - {21: 2427, 246: 2253, 248: 2251, 250: 2252, 2250, 2248, 470: 2249, 2247}, - {594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 229: 594, 594, 594, 594, 594, 594, 594, 594, 594, 239: 594, 594, 594, 594, 244: 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 268: 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 291: 594, 594, 594, 594, 594, 594, 594, 594, 300: 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 382: 594, 477: 2269, 480: 2417, 492: 2428}, + {722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 233: 722, 722, 722, 722, 722, 722, 722, 722, 722, 243: 722, 722, 722, 722, 248: 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 271: 722, 273: 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 295: 722, 722, 722, 722, 722, 722, 722, 722, 304: 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 380: 722}, + {601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 233: 601, 601, 601, 601, 601, 601, 601, 601, 601, 243: 601, 601, 601, 601, 248: 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 271: 601, 273: 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 295: 601, 601, 601, 601, 601, 601, 601, 601, 304: 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 380: 601}, + {2: 824, 824, 824, 824, 7: 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 22: 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 234: 824, 824, 824, 824, 239: 824, 824, 824, 824, 247: 824, 270: 824, 272: 824, 294: 824, 303: 824, 315: 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 381: 824, 824, 824, 824, 824, 824}, + {2: 829, 829, 829, 829, 7: 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 22: 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 234: 829, 829, 829, 829, 239: 829, 829, 829, 829, 247: 829, 270: 829, 272: 829, 294: 829, 303: 829, 315: 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 381: 829, 829, 829, 829, 829, 829, 482: 2430, 503: 2428, 2429, 513: 2431, 2432, 2433, 523: 2441}, + {2: 1736, 1653, 1687, 1654, 7: 2140, 1741, 1680, 1738, 2145, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 2149, 1665, 2142, 2144, 1859, 2158, 2159, 2157, 2153, 2160, 1837, 1839, 1838, 2150, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 2151, 1774, 1673, 2141, 1751, 1714, 2146, 2148, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 2156, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 2147, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 2152, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 2143, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 2138, 2139, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 2161, 1853, 2137, 1858, 1857, 1699, 1860, 1862, 1703, 2154, 2155, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 2162, 2163, 1876, 1870, 1871, 1872, 2193, 234: 2174, 2133, 2205, 2209, 239: 2190, 2189, 2226, 2200, 247: 2165, 270: 2169, 272: 2208, 294: 2177, 303: 2196, 315: 2210, 2131, 2203, 2225, 2227, 2168, 2167, 2184, 2224, 2204, 2201, 2195, 2199, 2164, 2166, 2202, 2173, 2206, 2214, 2265, 2172, 2215, 2216, 2171, 2194, 2187, 2188, 2238, 2240, 2241, 2242, 2197, 2243, 2222, 2228, 2236, 2237, 2232, 2244, 2245, 2246, 2233, 2248, 2249, 2239, 2234, 2247, 2229, 2235, 2220, 2250, 2251, 2198, 2255, 2211, 2213, 2254, 2260, 2259, 2261, 2258, 2191, 2262, 2257, 2256, 381: 2253, 2207, 2252, 2212, 2217, 2218, 393: 2176, 1649, 1650, 1648, 452: 2192, 2264, 2183, 2178, 2170, 2181, 2179, 2180, 2219, 2231, 2230, 2223, 2221, 2175, 2186, 2263, 2185, 2182, 2136, 2135, 2134, 2442}, // 910 - {716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 229: 716, 716, 716, 716, 716, 716, 716, 716, 716, 239: 716, 716, 716, 716, 244: 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 268: 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 291: 716, 716, 716, 716, 716, 716, 716, 716, 300: 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 382: 716}, - {2: 821, 821, 821, 821, 7: 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 22: 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 230: 821, 821, 821, 821, 235: 821, 821, 821, 821, 243: 821, 266: 821, 821, 290: 821, 299: 821, 311: 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 478: 2409, 499: 2407, 2408, 509: 2410, 2411, 2412, 519: 2430}, - {2: 1722, 1639, 1673, 1640, 7: 2119, 1727, 1666, 1724, 2124, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 2128, 1651, 2121, 2123, 2137, 2138, 2136, 2132, 2139, 2129, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 2130, 1760, 1659, 2120, 1737, 1683, 1700, 2125, 2127, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 2135, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 2126, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 2131, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 2122, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 2117, 2118, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 2140, 1835, 2116, 1840, 1839, 1685, 1842, 1844, 1689, 2133, 2134, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 2141, 2142, 1858, 1852, 1853, 1854, 2172, 230: 2153, 2112, 2184, 2188, 235: 2169, 2168, 2205, 2179, 243: 2144, 266: 2148, 2187, 290: 2156, 299: 2175, 311: 2189, 2110, 2182, 2204, 2206, 2147, 2146, 2163, 2203, 2183, 2180, 2174, 2178, 2143, 2145, 2181, 2152, 2185, 2193, 2244, 2151, 2194, 2195, 2150, 2173, 2166, 2167, 2217, 2219, 2220, 2221, 2176, 2222, 2201, 2207, 2215, 2216, 2211, 2223, 2224, 2225, 2212, 2227, 2228, 2218, 2213, 2226, 2208, 2214, 2199, 2229, 2230, 2177, 2234, 2190, 2192, 2233, 2239, 2238, 2240, 2237, 2170, 2241, 2236, 2235, 2232, 2186, 2231, 2191, 2196, 2197, 389: 2155, 1635, 1636, 1634, 448: 2171, 2243, 2162, 2157, 2149, 2160, 2158, 2159, 2198, 2210, 2209, 2202, 2200, 2154, 2165, 2242, 2164, 2161, 2115, 2114, 2113, 2431}, - {21: 2432, 246: 2253, 248: 2251, 250: 2252, 2250, 2248, 470: 2249, 2247}, - {594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 229: 594, 594, 594, 594, 594, 594, 594, 594, 594, 239: 594, 594, 594, 594, 244: 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 268: 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 291: 594, 594, 594, 594, 594, 594, 594, 594, 300: 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 382: 594, 477: 2269, 480: 2417, 492: 2433}, + {21: 2443, 250: 2274, 252: 2272, 2273, 2271, 2269, 474: 2270, 2268}, + {602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 233: 602, 602, 602, 602, 602, 602, 602, 602, 602, 243: 602, 602, 602, 602, 248: 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 271: 602, 273: 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 295: 602, 602, 602, 602, 602, 602, 602, 602, 304: 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 380: 602, 481: 2290, 484: 2438, 496: 2444}, + {723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 233: 723, 723, 723, 723, 723, 723, 723, 723, 723, 243: 723, 723, 723, 723, 248: 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 271: 723, 273: 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 295: 723, 723, 723, 723, 723, 723, 723, 723, 304: 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 380: 723}, + {2: 829, 829, 829, 829, 7: 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 22: 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 234: 829, 829, 829, 829, 239: 829, 829, 829, 829, 247: 829, 270: 829, 272: 829, 294: 829, 303: 829, 315: 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 381: 829, 829, 829, 829, 829, 829, 482: 2430, 503: 2428, 2429, 513: 2431, 2432, 2433, 523: 2446}, + {2: 1736, 1653, 1687, 1654, 7: 2140, 1741, 1680, 1738, 2145, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 2149, 1665, 2142, 2144, 1859, 2158, 2159, 2157, 2153, 2160, 1837, 1839, 1838, 2150, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 2151, 1774, 1673, 2141, 1751, 1714, 2146, 2148, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 2156, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 2147, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 2152, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 2143, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 2138, 2139, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 2161, 1853, 2137, 1858, 1857, 1699, 1860, 1862, 1703, 2154, 2155, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 2162, 2163, 1876, 1870, 1871, 1872, 2193, 234: 2174, 2133, 2205, 2209, 239: 2190, 2189, 2226, 2200, 247: 2165, 270: 2169, 272: 2208, 294: 2177, 303: 2196, 315: 2210, 2131, 2203, 2225, 2227, 2168, 2167, 2184, 2224, 2204, 2201, 2195, 2199, 2164, 2166, 2202, 2173, 2206, 2214, 2265, 2172, 2215, 2216, 2171, 2194, 2187, 2188, 2238, 2240, 2241, 2242, 2197, 2243, 2222, 2228, 2236, 2237, 2232, 2244, 2245, 2246, 2233, 2248, 2249, 2239, 2234, 2247, 2229, 2235, 2220, 2250, 2251, 2198, 2255, 2211, 2213, 2254, 2260, 2259, 2261, 2258, 2191, 2262, 2257, 2256, 381: 2253, 2207, 2252, 2212, 2217, 2218, 393: 2176, 1649, 1650, 1648, 452: 2192, 2264, 2183, 2178, 2170, 2181, 2179, 2180, 2219, 2231, 2230, 2223, 2221, 2175, 2186, 2263, 2185, 2182, 2136, 2135, 2134, 2447}, // 915 - {717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 229: 717, 717, 717, 717, 717, 717, 717, 717, 717, 239: 717, 717, 717, 717, 244: 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 268: 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 291: 717, 717, 717, 717, 717, 717, 717, 717, 300: 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 382: 717}, - {2: 821, 821, 821, 821, 7: 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 22: 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 230: 821, 821, 821, 821, 235: 821, 821, 821, 821, 243: 821, 266: 821, 821, 290: 821, 299: 821, 311: 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 478: 2409, 499: 2407, 2408, 509: 2410, 2411, 2412, 519: 2435}, - {2: 1722, 1639, 1673, 1640, 7: 2119, 1727, 1666, 1724, 2124, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 2128, 1651, 2121, 2123, 2137, 2138, 2136, 2132, 2139, 2129, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 2130, 1760, 1659, 2120, 1737, 1683, 1700, 2125, 2127, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 2135, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 2126, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 2131, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 2122, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 2117, 2118, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 2140, 1835, 2116, 1840, 1839, 1685, 1842, 1844, 1689, 2133, 2134, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 2141, 2142, 1858, 1852, 1853, 1854, 2172, 230: 2153, 2112, 2184, 2188, 235: 2169, 2168, 2205, 2179, 243: 2144, 266: 2148, 2187, 290: 2156, 299: 2175, 311: 2189, 2110, 2182, 2204, 2206, 2147, 2146, 2163, 2203, 2183, 2180, 2174, 2178, 2143, 2145, 2181, 2152, 2185, 2193, 2244, 2151, 2194, 2195, 2150, 2173, 2166, 2167, 2217, 2219, 2220, 2221, 2176, 2222, 2201, 2207, 2215, 2216, 2211, 2223, 2224, 2225, 2212, 2227, 2228, 2218, 2213, 2226, 2208, 2214, 2199, 2229, 2230, 2177, 2234, 2190, 2192, 2233, 2239, 2238, 2240, 2237, 2170, 2241, 2236, 2235, 2232, 2186, 2231, 2191, 2196, 2197, 389: 2155, 1635, 1636, 1634, 448: 2171, 2243, 2162, 2157, 2149, 2160, 2158, 2159, 2198, 2210, 2209, 2202, 2200, 2154, 2165, 2242, 2164, 2161, 2115, 2114, 2113, 2436}, - {21: 2437, 246: 2253, 248: 2251, 250: 2252, 2250, 2248, 470: 2249, 2247}, - {594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 229: 594, 594, 594, 594, 594, 594, 594, 594, 594, 239: 594, 594, 594, 594, 244: 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 268: 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 291: 594, 594, 594, 594, 594, 594, 594, 594, 300: 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 382: 594, 477: 2269, 480: 2417, 492: 2438}, + {21: 2448, 250: 2274, 252: 2272, 2273, 2271, 2269, 474: 2270, 2268}, + {602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 233: 602, 602, 602, 602, 602, 602, 602, 602, 602, 243: 602, 602, 602, 602, 248: 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 271: 602, 273: 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 295: 602, 602, 602, 602, 602, 602, 602, 602, 304: 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 380: 602, 481: 2290, 484: 2438, 496: 2449}, + {724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 233: 724, 724, 724, 724, 724, 724, 724, 724, 724, 243: 724, 724, 724, 724, 248: 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 271: 724, 273: 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 295: 724, 724, 724, 724, 724, 724, 724, 724, 304: 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 380: 724}, + {2: 829, 829, 829, 829, 7: 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 22: 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 234: 829, 829, 829, 829, 239: 829, 829, 829, 829, 247: 829, 270: 829, 272: 829, 294: 829, 303: 829, 315: 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 381: 829, 829, 829, 829, 829, 829, 482: 2430, 503: 2428, 2429, 513: 2431, 2432, 2433, 523: 2451}, + {2: 1736, 1653, 1687, 1654, 7: 2140, 1741, 1680, 1738, 2145, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 2149, 1665, 2142, 2144, 1859, 2158, 2159, 2157, 2153, 2160, 1837, 1839, 1838, 2150, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 2151, 1774, 1673, 2141, 1751, 1714, 2146, 2148, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 2156, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 2147, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 2152, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 2143, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 2138, 2139, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 2161, 1853, 2137, 1858, 1857, 1699, 1860, 1862, 1703, 2154, 2155, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 2162, 2163, 1876, 1870, 1871, 1872, 2193, 234: 2174, 2133, 2205, 2209, 239: 2190, 2189, 2226, 2200, 247: 2165, 270: 2169, 272: 2208, 294: 2177, 303: 2196, 315: 2210, 2131, 2203, 2225, 2227, 2168, 2167, 2184, 2224, 2204, 2201, 2195, 2199, 2164, 2166, 2202, 2173, 2206, 2214, 2265, 2172, 2215, 2216, 2171, 2194, 2187, 2188, 2238, 2240, 2241, 2242, 2197, 2243, 2222, 2228, 2236, 2237, 2232, 2244, 2245, 2246, 2233, 2248, 2249, 2239, 2234, 2247, 2229, 2235, 2220, 2250, 2251, 2198, 2255, 2211, 2213, 2254, 2260, 2259, 2261, 2258, 2191, 2262, 2257, 2256, 381: 2253, 2207, 2252, 2212, 2217, 2218, 393: 2176, 1649, 1650, 1648, 452: 2192, 2264, 2183, 2178, 2170, 2181, 2179, 2180, 2219, 2231, 2230, 2223, 2221, 2175, 2186, 2263, 2185, 2182, 2136, 2135, 2134, 2452}, // 920 - {718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 229: 718, 718, 718, 718, 718, 718, 718, 718, 718, 239: 718, 718, 718, 718, 244: 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 268: 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 291: 718, 718, 718, 718, 718, 718, 718, 718, 300: 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 382: 718}, - {2: 821, 821, 821, 821, 7: 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 22: 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 230: 821, 821, 821, 821, 235: 821, 821, 821, 821, 243: 821, 266: 821, 821, 290: 821, 299: 821, 311: 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 478: 2409, 499: 2407, 2408, 509: 2410, 2411, 2412, 519: 2440}, - {2: 1722, 1639, 1673, 1640, 7: 2119, 1727, 1666, 1724, 2124, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 2128, 1651, 2121, 2123, 2137, 2138, 2136, 2132, 2139, 2129, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 2130, 1760, 1659, 2120, 1737, 1683, 1700, 2125, 2127, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 2135, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 2126, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 2131, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 2122, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 2117, 2118, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 2140, 1835, 2116, 1840, 1839, 1685, 1842, 1844, 1689, 2133, 2134, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 2141, 2142, 1858, 1852, 1853, 1854, 2172, 230: 2153, 2112, 2184, 2188, 235: 2169, 2168, 2205, 2179, 243: 2144, 266: 2148, 2187, 290: 2156, 299: 2175, 311: 2189, 2110, 2182, 2204, 2206, 2147, 2146, 2163, 2203, 2183, 2180, 2174, 2178, 2143, 2145, 2181, 2152, 2185, 2193, 2244, 2151, 2194, 2195, 2150, 2173, 2166, 2167, 2217, 2219, 2220, 2221, 2176, 2222, 2201, 2207, 2215, 2216, 2211, 2223, 2224, 2225, 2212, 2227, 2228, 2218, 2213, 2226, 2208, 2214, 2199, 2229, 2230, 2177, 2234, 2190, 2192, 2233, 2239, 2238, 2240, 2237, 2170, 2241, 2236, 2235, 2232, 2186, 2231, 2191, 2196, 2197, 389: 2155, 1635, 1636, 1634, 448: 2171, 2243, 2162, 2157, 2149, 2160, 2158, 2159, 2198, 2210, 2209, 2202, 2200, 2154, 2165, 2242, 2164, 2161, 2115, 2114, 2113, 2441}, - {21: 2442, 246: 2253, 248: 2251, 250: 2252, 2250, 2248, 470: 2249, 2247}, - {594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 229: 594, 594, 594, 594, 594, 594, 594, 594, 594, 239: 594, 594, 594, 594, 244: 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 268: 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 291: 594, 594, 594, 594, 594, 594, 594, 594, 300: 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 382: 594, 477: 2269, 480: 2417, 492: 2443}, + {21: 2453, 250: 2274, 252: 2272, 2273, 2271, 2269, 474: 2270, 2268}, + {602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 233: 602, 602, 602, 602, 602, 602, 602, 602, 602, 243: 602, 602, 602, 602, 248: 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 271: 602, 273: 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 295: 602, 602, 602, 602, 602, 602, 602, 602, 304: 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 380: 602, 481: 2290, 484: 2438, 496: 2454}, + {725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 233: 725, 725, 725, 725, 725, 725, 725, 725, 725, 243: 725, 725, 725, 725, 248: 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 271: 725, 273: 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 295: 725, 725, 725, 725, 725, 725, 725, 725, 304: 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 380: 725}, + {2: 829, 829, 829, 829, 7: 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 22: 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 234: 829, 829, 829, 829, 239: 829, 829, 829, 829, 247: 829, 270: 829, 272: 829, 294: 829, 303: 829, 315: 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 381: 829, 829, 829, 829, 829, 829, 482: 2430, 503: 2428, 2429, 513: 2431, 2432, 2433, 523: 2456}, + {2: 1736, 1653, 1687, 1654, 7: 2140, 1741, 1680, 1738, 2145, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 2149, 1665, 2142, 2144, 1859, 2158, 2159, 2157, 2153, 2160, 1837, 1839, 1838, 2150, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 2151, 1774, 1673, 2141, 1751, 1714, 2146, 2148, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 2156, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 2147, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 2152, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 2143, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 2138, 2139, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 2161, 1853, 2137, 1858, 1857, 1699, 1860, 1862, 1703, 2154, 2155, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 2162, 2163, 1876, 1870, 1871, 1872, 2193, 234: 2174, 2133, 2205, 2209, 239: 2190, 2189, 2226, 2200, 247: 2165, 270: 2169, 272: 2208, 294: 2177, 303: 2196, 315: 2210, 2131, 2203, 2225, 2227, 2168, 2167, 2184, 2224, 2204, 2201, 2195, 2199, 2164, 2166, 2202, 2173, 2206, 2214, 2265, 2172, 2215, 2216, 2171, 2194, 2187, 2188, 2238, 2240, 2241, 2242, 2197, 2243, 2222, 2228, 2236, 2237, 2232, 2244, 2245, 2246, 2233, 2248, 2249, 2239, 2234, 2247, 2229, 2235, 2220, 2250, 2251, 2198, 2255, 2211, 2213, 2254, 2260, 2259, 2261, 2258, 2191, 2262, 2257, 2256, 381: 2253, 2207, 2252, 2212, 2217, 2218, 393: 2176, 1649, 1650, 1648, 452: 2192, 2264, 2183, 2178, 2170, 2181, 2179, 2180, 2219, 2231, 2230, 2223, 2221, 2175, 2186, 2263, 2185, 2182, 2136, 2135, 2134, 2457}, // 925 - {719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 229: 719, 719, 719, 719, 719, 719, 719, 719, 719, 239: 719, 719, 719, 719, 244: 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 268: 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 291: 719, 719, 719, 719, 719, 719, 719, 719, 300: 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 382: 719}, - {2: 821, 821, 821, 821, 7: 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 22: 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 230: 821, 821, 821, 821, 235: 821, 821, 821, 821, 243: 821, 266: 821, 821, 290: 821, 299: 821, 311: 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 478: 2409, 499: 2407, 2408, 509: 2410, 2411, 2412, 519: 2445}, - {2: 1722, 1639, 1673, 1640, 7: 2119, 1727, 1666, 1724, 2124, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 2128, 1651, 2121, 2123, 2137, 2138, 2136, 2132, 2139, 2129, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 2130, 1760, 1659, 2120, 1737, 1683, 1700, 2125, 2127, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 2135, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 2126, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 2131, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 2122, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 2117, 2118, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 2140, 1835, 2116, 1840, 1839, 1685, 1842, 1844, 1689, 2133, 2134, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 2141, 2142, 1858, 1852, 1853, 1854, 2172, 230: 2153, 2112, 2184, 2188, 235: 2169, 2168, 2205, 2179, 243: 2144, 266: 2148, 2187, 290: 2156, 299: 2175, 311: 2189, 2110, 2182, 2204, 2206, 2147, 2146, 2163, 2203, 2183, 2180, 2174, 2178, 2143, 2145, 2181, 2152, 2185, 2193, 2244, 2151, 2194, 2195, 2150, 2173, 2166, 2167, 2217, 2219, 2220, 2221, 2176, 2222, 2201, 2207, 2215, 2216, 2211, 2223, 2224, 2225, 2212, 2227, 2228, 2218, 2213, 2226, 2208, 2214, 2199, 2229, 2230, 2177, 2234, 2190, 2192, 2233, 2239, 2238, 2240, 2237, 2170, 2241, 2236, 2235, 2232, 2186, 2231, 2191, 2196, 2197, 389: 2155, 1635, 1636, 1634, 448: 2171, 2243, 2162, 2157, 2149, 2160, 2158, 2159, 2198, 2210, 2209, 2202, 2200, 2154, 2165, 2242, 2164, 2161, 2115, 2114, 2113, 2446}, - {21: 2447, 246: 2253, 248: 2251, 250: 2252, 2250, 2248, 470: 2249, 2247}, - {594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 229: 594, 594, 594, 594, 594, 594, 594, 594, 594, 239: 594, 594, 594, 594, 244: 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 268: 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 291: 594, 594, 594, 594, 594, 594, 594, 594, 300: 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 382: 594, 477: 2269, 480: 2417, 492: 2448}, + {21: 2458, 250: 2274, 252: 2272, 2273, 2271, 2269, 474: 2270, 2268}, + {602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 233: 602, 602, 602, 602, 602, 602, 602, 602, 602, 243: 602, 602, 602, 602, 248: 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 271: 602, 273: 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 295: 602, 602, 602, 602, 602, 602, 602, 602, 304: 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 380: 602, 481: 2290, 484: 2438, 496: 2459}, + {726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 233: 726, 726, 726, 726, 726, 726, 726, 726, 726, 243: 726, 726, 726, 726, 248: 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 271: 726, 273: 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 295: 726, 726, 726, 726, 726, 726, 726, 726, 304: 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 380: 726}, + {2: 829, 829, 829, 829, 7: 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 22: 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 234: 829, 829, 829, 829, 239: 829, 829, 829, 829, 247: 829, 270: 829, 272: 829, 294: 829, 303: 829, 315: 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 381: 829, 829, 829, 829, 829, 829, 482: 2430, 503: 2428, 2429, 513: 2431, 2432, 2433, 523: 2461}, + {2: 1736, 1653, 1687, 1654, 7: 2140, 1741, 1680, 1738, 2145, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 2149, 1665, 2142, 2144, 1859, 2158, 2159, 2157, 2153, 2160, 1837, 1839, 1838, 2150, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 2151, 1774, 1673, 2141, 1751, 1714, 2146, 2148, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 2156, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 2147, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 2152, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 2143, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 2138, 2139, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 2161, 1853, 2137, 1858, 1857, 1699, 1860, 1862, 1703, 2154, 2155, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 2162, 2163, 1876, 1870, 1871, 1872, 2193, 234: 2174, 2133, 2205, 2209, 239: 2190, 2189, 2226, 2200, 247: 2165, 270: 2169, 272: 2208, 294: 2177, 303: 2196, 315: 2210, 2131, 2203, 2225, 2227, 2168, 2167, 2184, 2224, 2204, 2201, 2195, 2199, 2164, 2166, 2202, 2173, 2206, 2214, 2265, 2172, 2215, 2216, 2171, 2194, 2187, 2188, 2238, 2240, 2241, 2242, 2197, 2243, 2222, 2228, 2236, 2237, 2232, 2244, 2245, 2246, 2233, 2248, 2249, 2239, 2234, 2247, 2229, 2235, 2220, 2250, 2251, 2198, 2255, 2211, 2213, 2254, 2260, 2259, 2261, 2258, 2191, 2262, 2257, 2256, 381: 2253, 2207, 2252, 2212, 2217, 2218, 393: 2176, 1649, 1650, 1648, 452: 2192, 2264, 2183, 2178, 2170, 2181, 2179, 2180, 2219, 2231, 2230, 2223, 2221, 2175, 2186, 2263, 2185, 2182, 2136, 2135, 2134, 2462}, // 930 - {720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 229: 720, 720, 720, 720, 720, 720, 720, 720, 720, 239: 720, 720, 720, 720, 244: 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 268: 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 291: 720, 720, 720, 720, 720, 720, 720, 720, 300: 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 382: 720}, - {2: 821, 821, 821, 821, 7: 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 22: 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 230: 821, 821, 821, 821, 235: 821, 821, 821, 821, 243: 821, 266: 821, 821, 290: 821, 299: 821, 311: 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 478: 2409, 499: 2407, 2408, 509: 2410, 2411, 2412, 519: 2450}, - {2: 1722, 1639, 1673, 1640, 7: 2119, 1727, 1666, 1724, 2124, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 2128, 1651, 2121, 2123, 2137, 2138, 2136, 2132, 2139, 2129, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 2130, 1760, 1659, 2120, 1737, 1683, 1700, 2125, 2127, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 2135, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 2126, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 2131, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 2122, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 2117, 2118, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 2140, 1835, 2116, 1840, 1839, 1685, 1842, 1844, 1689, 2133, 2134, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 2141, 2142, 1858, 1852, 1853, 1854, 2172, 230: 2153, 2112, 2184, 2188, 235: 2169, 2168, 2205, 2179, 243: 2144, 266: 2148, 2187, 290: 2156, 299: 2175, 311: 2189, 2110, 2182, 2204, 2206, 2147, 2146, 2163, 2203, 2183, 2180, 2174, 2178, 2143, 2145, 2181, 2152, 2185, 2193, 2244, 2151, 2194, 2195, 2150, 2173, 2166, 2167, 2217, 2219, 2220, 2221, 2176, 2222, 2201, 2207, 2215, 2216, 2211, 2223, 2224, 2225, 2212, 2227, 2228, 2218, 2213, 2226, 2208, 2214, 2199, 2229, 2230, 2177, 2234, 2190, 2192, 2233, 2239, 2238, 2240, 2237, 2170, 2241, 2236, 2235, 2232, 2186, 2231, 2191, 2196, 2197, 389: 2155, 1635, 1636, 1634, 448: 2171, 2243, 2162, 2157, 2149, 2160, 2158, 2159, 2198, 2210, 2209, 2202, 2200, 2154, 2165, 2242, 2164, 2161, 2115, 2114, 2113, 2451, 505: 2452}, - {1233, 1233, 6: 1233, 21: 1233, 25: 1233, 240: 1233, 246: 2253, 1233, 2251, 250: 2252, 2250, 2248, 470: 2249, 2247}, - {6: 2453, 21: 876, 25: 876, 247: 2454, 514: 2455, 2456}, + {21: 2463, 250: 2274, 252: 2272, 2273, 2271, 2269, 474: 2270, 2268}, + {602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 233: 602, 602, 602, 602, 602, 602, 602, 602, 602, 243: 602, 602, 602, 602, 248: 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 271: 602, 273: 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 295: 602, 602, 602, 602, 602, 602, 602, 602, 304: 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 380: 602, 481: 2290, 484: 2438, 496: 2464}, + {727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 233: 727, 727, 727, 727, 727, 727, 727, 727, 727, 243: 727, 727, 727, 727, 248: 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 271: 727, 273: 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 295: 727, 727, 727, 727, 727, 727, 727, 727, 304: 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 380: 727}, + {2: 829, 829, 829, 829, 7: 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 22: 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 234: 829, 829, 829, 829, 239: 829, 829, 829, 829, 247: 829, 270: 829, 272: 829, 294: 829, 303: 829, 315: 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 381: 829, 829, 829, 829, 829, 829, 482: 2430, 503: 2428, 2429, 513: 2431, 2432, 2433, 523: 2466}, + {2: 1736, 1653, 1687, 1654, 7: 2140, 1741, 1680, 1738, 2145, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 2149, 1665, 2142, 2144, 1859, 2158, 2159, 2157, 2153, 2160, 1837, 1839, 1838, 2150, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 2151, 1774, 1673, 2141, 1751, 1714, 2146, 2148, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 2156, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 2147, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 2152, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 2143, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 2138, 2139, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 2161, 1853, 2137, 1858, 1857, 1699, 1860, 1862, 1703, 2154, 2155, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 2162, 2163, 1876, 1870, 1871, 1872, 2193, 234: 2174, 2133, 2205, 2209, 239: 2190, 2189, 2226, 2200, 247: 2165, 270: 2169, 272: 2208, 294: 2177, 303: 2196, 315: 2210, 2131, 2203, 2225, 2227, 2168, 2167, 2184, 2224, 2204, 2201, 2195, 2199, 2164, 2166, 2202, 2173, 2206, 2214, 2265, 2172, 2215, 2216, 2171, 2194, 2187, 2188, 2238, 2240, 2241, 2242, 2197, 2243, 2222, 2228, 2236, 2237, 2232, 2244, 2245, 2246, 2233, 2248, 2249, 2239, 2234, 2247, 2229, 2235, 2220, 2250, 2251, 2198, 2255, 2211, 2213, 2254, 2260, 2259, 2261, 2258, 2191, 2262, 2257, 2256, 381: 2253, 2207, 2252, 2212, 2217, 2218, 393: 2176, 1649, 1650, 1648, 452: 2192, 2264, 2183, 2178, 2170, 2181, 2179, 2180, 2219, 2231, 2230, 2223, 2221, 2175, 2186, 2263, 2185, 2182, 2136, 2135, 2134, 2467}, // 935 - {2: 1722, 1639, 1673, 1640, 7: 2119, 1727, 1666, 1724, 2124, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 2128, 1651, 2121, 2123, 2137, 2138, 2136, 2132, 2139, 2129, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 2130, 1760, 1659, 2120, 1737, 1683, 1700, 2125, 2127, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 2135, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 2126, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 2131, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 2122, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 2117, 2118, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 2140, 1835, 2116, 1840, 1839, 1685, 1842, 1844, 1689, 2133, 2134, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 2141, 2142, 1858, 1852, 1853, 1854, 2172, 230: 2153, 2112, 2184, 2188, 235: 2169, 2168, 2205, 2179, 243: 2144, 266: 2148, 2187, 290: 2156, 299: 2175, 311: 2189, 2110, 2182, 2204, 2206, 2147, 2146, 2163, 2203, 2183, 2180, 2174, 2178, 2143, 2145, 2181, 2152, 2185, 2193, 2244, 2151, 2194, 2195, 2150, 2173, 2166, 2167, 2217, 2219, 2220, 2221, 2176, 2222, 2201, 2207, 2215, 2216, 2211, 2223, 2224, 2225, 2212, 2227, 2228, 2218, 2213, 2226, 2208, 2214, 2199, 2229, 2230, 2177, 2234, 2190, 2192, 2233, 2239, 2238, 2240, 2237, 2170, 2241, 2236, 2235, 2232, 2186, 2231, 2191, 2196, 2197, 389: 2155, 1635, 1636, 1634, 448: 2171, 2243, 2162, 2157, 2149, 2160, 2158, 2159, 2198, 2210, 2209, 2202, 2200, 2154, 2165, 2242, 2164, 2161, 2115, 2114, 2113, 2463}, - {404: 2461}, - {875, 875, 21: 875, 25: 875, 229: 875, 239: 875, 875, 875, 875, 244: 875, 875}, - {21: 713, 25: 2458, 829: 2457}, - {21: 2460}, + {21: 2468, 250: 2274, 252: 2272, 2273, 2271, 2269, 474: 2270, 2268}, + {602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 233: 602, 602, 602, 602, 602, 602, 602, 602, 602, 243: 602, 602, 602, 602, 248: 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 271: 602, 273: 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 295: 602, 602, 602, 602, 602, 602, 602, 602, 304: 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 380: 602, 481: 2290, 484: 2438, 496: 2469}, + {728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 233: 728, 728, 728, 728, 728, 728, 728, 728, 728, 243: 728, 728, 728, 728, 248: 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 271: 728, 273: 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 295: 728, 728, 728, 728, 728, 728, 728, 728, 304: 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 380: 728}, + {2: 829, 829, 829, 829, 7: 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 22: 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 234: 829, 829, 829, 829, 239: 829, 829, 829, 829, 247: 829, 270: 829, 272: 829, 294: 829, 303: 829, 315: 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 381: 829, 829, 829, 829, 829, 829, 482: 2430, 503: 2428, 2429, 513: 2431, 2432, 2433, 523: 2471}, + {2: 1736, 1653, 1687, 1654, 7: 2140, 1741, 1680, 1738, 2145, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 2149, 1665, 2142, 2144, 1859, 2158, 2159, 2157, 2153, 2160, 1837, 1839, 1838, 2150, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 2151, 1774, 1673, 2141, 1751, 1714, 2146, 2148, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 2156, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 2147, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 2152, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 2143, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 2138, 2139, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 2161, 1853, 2137, 1858, 1857, 1699, 1860, 1862, 1703, 2154, 2155, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 2162, 2163, 1876, 1870, 1871, 1872, 2193, 234: 2174, 2133, 2205, 2209, 239: 2190, 2189, 2226, 2200, 247: 2165, 270: 2169, 272: 2208, 294: 2177, 303: 2196, 315: 2210, 2131, 2203, 2225, 2227, 2168, 2167, 2184, 2224, 2204, 2201, 2195, 2199, 2164, 2166, 2202, 2173, 2206, 2214, 2265, 2172, 2215, 2216, 2171, 2194, 2187, 2188, 2238, 2240, 2241, 2242, 2197, 2243, 2222, 2228, 2236, 2237, 2232, 2244, 2245, 2246, 2233, 2248, 2249, 2239, 2234, 2247, 2229, 2235, 2220, 2250, 2251, 2198, 2255, 2211, 2213, 2254, 2260, 2259, 2261, 2258, 2191, 2262, 2257, 2256, 381: 2253, 2207, 2252, 2212, 2217, 2218, 393: 2176, 1649, 1650, 1648, 452: 2192, 2264, 2183, 2178, 2170, 2181, 2179, 2180, 2219, 2231, 2230, 2223, 2221, 2175, 2186, 2263, 2185, 2182, 2136, 2135, 2134, 2472, 509: 2473}, // 940 - {230: 2459}, - {21: 712}, - {721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 229: 721, 721, 721, 721, 721, 721, 721, 721, 721, 239: 721, 721, 721, 721, 244: 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 268: 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 291: 721, 721, 721, 721, 721, 721, 721, 721, 300: 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 382: 721}, - {2: 1722, 1639, 1673, 1640, 7: 2119, 1727, 1666, 1724, 2124, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 2128, 1651, 2121, 2123, 2137, 2138, 2136, 2132, 2139, 2129, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 2130, 1760, 1659, 2120, 1737, 1683, 1700, 2125, 2127, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 2135, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 2126, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 2131, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 2122, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 2117, 2118, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 2140, 1835, 2116, 1840, 1839, 1685, 1842, 1844, 1689, 2133, 2134, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 2141, 2142, 1858, 1852, 1853, 1854, 2172, 230: 2153, 2112, 2184, 2188, 235: 2169, 2168, 2205, 2179, 243: 2144, 266: 2148, 2187, 290: 2156, 299: 2175, 311: 2189, 2110, 2182, 2204, 2206, 2147, 2146, 2163, 2203, 2183, 2180, 2174, 2178, 2143, 2145, 2181, 2152, 2185, 2193, 2244, 2151, 2194, 2195, 2150, 2173, 2166, 2167, 2217, 2219, 2220, 2221, 2176, 2222, 2201, 2207, 2215, 2216, 2211, 2223, 2224, 2225, 2212, 2227, 2228, 2218, 2213, 2226, 2208, 2214, 2199, 2229, 2230, 2177, 2234, 2190, 2192, 2233, 2239, 2238, 2240, 2237, 2170, 2241, 2236, 2235, 2232, 2186, 2231, 2191, 2196, 2197, 389: 2155, 1635, 1636, 1634, 448: 2171, 2243, 2162, 2157, 2149, 2160, 2158, 2159, 2198, 2210, 2209, 2202, 2200, 2154, 2165, 2242, 2164, 2161, 2115, 2114, 2113, 2282, 557: 2283, 577: 2462}, - {883, 883, 6: 2285, 21: 883, 25: 883, 229: 883, 239: 883, 883, 883, 883, 244: 883, 883}, + {1247, 1247, 6: 1247, 21: 1247, 25: 1247, 244: 1247, 250: 2274, 1247, 2272, 2273, 2271, 2269, 474: 2270, 2268}, + {6: 2474, 21: 884, 25: 884, 251: 2475, 518: 2476, 2477}, + {2: 1736, 1653, 1687, 1654, 7: 2140, 1741, 1680, 1738, 2145, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 2149, 1665, 2142, 2144, 1859, 2158, 2159, 2157, 2153, 2160, 1837, 1839, 1838, 2150, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 2151, 1774, 1673, 2141, 1751, 1714, 2146, 2148, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 2156, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 2147, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 2152, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 2143, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 2138, 2139, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 2161, 1853, 2137, 1858, 1857, 1699, 1860, 1862, 1703, 2154, 2155, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 2162, 2163, 1876, 1870, 1871, 1872, 2193, 234: 2174, 2133, 2205, 2209, 239: 2190, 2189, 2226, 2200, 247: 2165, 270: 2169, 272: 2208, 294: 2177, 303: 2196, 315: 2210, 2131, 2203, 2225, 2227, 2168, 2167, 2184, 2224, 2204, 2201, 2195, 2199, 2164, 2166, 2202, 2173, 2206, 2214, 2265, 2172, 2215, 2216, 2171, 2194, 2187, 2188, 2238, 2240, 2241, 2242, 2197, 2243, 2222, 2228, 2236, 2237, 2232, 2244, 2245, 2246, 2233, 2248, 2249, 2239, 2234, 2247, 2229, 2235, 2220, 2250, 2251, 2198, 2255, 2211, 2213, 2254, 2260, 2259, 2261, 2258, 2191, 2262, 2257, 2256, 381: 2253, 2207, 2252, 2212, 2217, 2218, 393: 2176, 1649, 1650, 1648, 452: 2192, 2264, 2183, 2178, 2170, 2181, 2179, 2180, 2219, 2231, 2230, 2223, 2221, 2175, 2186, 2263, 2185, 2182, 2136, 2135, 2134, 2484}, + {408: 2482}, + {883, 883, 21: 883, 25: 883, 233: 883, 243: 883, 883, 883, 883, 248: 883, 883}, // 945 - {1232, 1232, 6: 1232, 21: 1232, 25: 1232, 240: 1232, 246: 2253, 1232, 2251, 250: 2252, 2250, 2248, 470: 2249, 2247}, - {2: 1722, 1639, 1673, 1640, 7: 2119, 1727, 1666, 1724, 2124, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 2128, 1651, 2121, 2123, 2137, 2138, 2136, 2132, 2139, 2129, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 2130, 1760, 1659, 2120, 1737, 1683, 1700, 2125, 2127, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 2135, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 2126, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 2131, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 2122, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 2117, 2118, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 2140, 1835, 2116, 1840, 1839, 1685, 1842, 1844, 1689, 2133, 2134, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 2141, 2142, 1858, 1852, 1853, 1854, 2172, 230: 2153, 2112, 2184, 2188, 235: 2169, 2168, 2205, 2179, 243: 2144, 266: 2148, 2187, 269: 2468, 290: 2156, 299: 2175, 311: 2189, 2110, 2182, 2204, 2206, 2147, 2146, 2163, 2203, 2183, 2180, 2174, 2178, 2143, 2145, 2181, 2152, 2185, 2193, 2244, 2151, 2194, 2195, 2150, 2173, 2166, 2167, 2217, 2219, 2220, 2221, 2176, 2222, 2201, 2207, 2215, 2216, 2211, 2223, 2224, 2225, 2212, 2227, 2228, 2218, 2213, 2226, 2208, 2214, 2199, 2229, 2230, 2177, 2234, 2190, 2192, 2233, 2239, 2238, 2240, 2237, 2170, 2241, 2236, 2235, 2232, 2186, 2231, 2191, 2196, 2197, 389: 2155, 1635, 1636, 1634, 448: 2171, 2243, 2162, 2157, 2149, 2160, 2158, 2159, 2198, 2210, 2209, 2202, 2200, 2154, 2165, 2242, 2164, 2161, 2115, 2114, 2113, 2465, 478: 2467, 499: 2407, 2408, 509: 2466}, - {21: 2476, 246: 2253, 248: 2251, 250: 2252, 2250, 2248, 470: 2249, 2247}, - {2: 1722, 1639, 1673, 1640, 7: 2119, 1727, 1666, 1724, 2124, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 2128, 1651, 2121, 2123, 2137, 2138, 2136, 2132, 2139, 2129, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 2130, 1760, 1659, 2120, 1737, 1683, 1700, 2125, 2127, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 2135, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 2126, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 2131, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 2122, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 2117, 2118, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 2140, 1835, 2116, 1840, 1839, 1685, 1842, 1844, 1689, 2133, 2134, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 2141, 2142, 1858, 1852, 1853, 1854, 2172, 230: 2153, 2112, 2184, 2188, 235: 2169, 2168, 2205, 2179, 243: 2144, 266: 2148, 2187, 290: 2156, 299: 2175, 311: 2189, 2110, 2182, 2204, 2206, 2147, 2146, 2163, 2203, 2183, 2180, 2174, 2178, 2143, 2145, 2181, 2152, 2185, 2193, 2244, 2151, 2194, 2195, 2150, 2173, 2166, 2167, 2217, 2219, 2220, 2221, 2176, 2222, 2201, 2207, 2215, 2216, 2211, 2223, 2224, 2225, 2212, 2227, 2228, 2218, 2213, 2226, 2208, 2214, 2199, 2229, 2230, 2177, 2234, 2190, 2192, 2233, 2239, 2238, 2240, 2237, 2170, 2241, 2236, 2235, 2232, 2186, 2231, 2191, 2196, 2197, 389: 2155, 1635, 1636, 1634, 448: 2171, 2243, 2162, 2157, 2149, 2160, 2158, 2159, 2198, 2210, 2209, 2202, 2200, 2154, 2165, 2242, 2164, 2161, 2115, 2114, 2113, 2451, 505: 2474}, - {2: 1722, 1639, 1673, 1640, 7: 2119, 1727, 1666, 1724, 2124, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 2128, 1651, 2121, 2123, 2137, 2138, 2136, 2132, 2139, 2129, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 2130, 1760, 1659, 2120, 1737, 1683, 1700, 2125, 2127, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 2135, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 2126, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 2131, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 2122, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 2117, 2118, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 2140, 1835, 2116, 1840, 1839, 1685, 1842, 1844, 1689, 2133, 2134, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 2141, 2142, 1858, 1852, 1853, 1854, 2172, 230: 2153, 2112, 2184, 2188, 235: 2169, 2168, 2205, 2179, 243: 2144, 266: 2148, 2187, 290: 2156, 299: 2175, 311: 2189, 2110, 2182, 2204, 2206, 2147, 2146, 2163, 2203, 2183, 2180, 2174, 2178, 2143, 2145, 2181, 2152, 2185, 2193, 2244, 2151, 2194, 2195, 2150, 2173, 2166, 2167, 2217, 2219, 2220, 2221, 2176, 2222, 2201, 2207, 2215, 2216, 2211, 2223, 2224, 2225, 2212, 2227, 2228, 2218, 2213, 2226, 2208, 2214, 2199, 2229, 2230, 2177, 2234, 2190, 2192, 2233, 2239, 2238, 2240, 2237, 2170, 2241, 2236, 2235, 2232, 2186, 2231, 2191, 2196, 2197, 389: 2155, 1635, 1636, 1634, 448: 2171, 2243, 2162, 2157, 2149, 2160, 2158, 2159, 2198, 2210, 2209, 2202, 2200, 2154, 2165, 2242, 2164, 2161, 2115, 2114, 2113, 2471}, + {21: 721, 25: 2479, 833: 2478}, + {21: 2481}, + {234: 2480}, + {21: 720}, + {729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 233: 729, 729, 729, 729, 729, 729, 729, 729, 729, 243: 729, 729, 729, 729, 248: 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 271: 729, 273: 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 295: 729, 729, 729, 729, 729, 729, 729, 729, 304: 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 380: 729}, // 950 - {21: 2469}, - {594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 229: 594, 594, 594, 594, 594, 594, 594, 594, 594, 239: 594, 594, 594, 594, 244: 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 268: 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 291: 594, 594, 594, 594, 594, 594, 594, 594, 300: 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 382: 594, 477: 2269, 480: 2417, 492: 2470}, - {722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 229: 722, 722, 722, 722, 722, 722, 722, 722, 722, 239: 722, 722, 722, 722, 244: 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 268: 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 291: 722, 722, 722, 722, 722, 722, 722, 722, 300: 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 382: 722}, - {21: 2472, 246: 2253, 248: 2251, 250: 2252, 2250, 2248, 470: 2249, 2247}, - {594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 229: 594, 594, 594, 594, 594, 594, 594, 594, 594, 239: 594, 594, 594, 594, 244: 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 268: 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 291: 594, 594, 594, 594, 594, 594, 594, 594, 300: 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 382: 594, 477: 2269, 480: 2417, 492: 2473}, + {2: 1736, 1653, 1687, 1654, 7: 2140, 1741, 1680, 1738, 2145, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 2149, 1665, 2142, 2144, 1859, 2158, 2159, 2157, 2153, 2160, 1837, 1839, 1838, 2150, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 2151, 1774, 1673, 2141, 1751, 1714, 2146, 2148, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 2156, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 2147, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 2152, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 2143, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 2138, 2139, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 2161, 1853, 2137, 1858, 1857, 1699, 1860, 1862, 1703, 2154, 2155, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 2162, 2163, 1876, 1870, 1871, 1872, 2193, 234: 2174, 2133, 2205, 2209, 239: 2190, 2189, 2226, 2200, 247: 2165, 270: 2169, 272: 2208, 294: 2177, 303: 2196, 315: 2210, 2131, 2203, 2225, 2227, 2168, 2167, 2184, 2224, 2204, 2201, 2195, 2199, 2164, 2166, 2202, 2173, 2206, 2214, 2265, 2172, 2215, 2216, 2171, 2194, 2187, 2188, 2238, 2240, 2241, 2242, 2197, 2243, 2222, 2228, 2236, 2237, 2232, 2244, 2245, 2246, 2233, 2248, 2249, 2239, 2234, 2247, 2229, 2235, 2220, 2250, 2251, 2198, 2255, 2211, 2213, 2254, 2260, 2259, 2261, 2258, 2191, 2262, 2257, 2256, 381: 2253, 2207, 2252, 2212, 2217, 2218, 393: 2176, 1649, 1650, 1648, 452: 2192, 2264, 2183, 2178, 2170, 2181, 2179, 2180, 2219, 2231, 2230, 2223, 2221, 2175, 2186, 2263, 2185, 2182, 2136, 2135, 2134, 2303, 561: 2304, 581: 2483}, + {891, 891, 6: 2306, 21: 891, 25: 891, 233: 891, 243: 891, 891, 891, 891, 248: 891, 891}, + {1246, 1246, 6: 1246, 21: 1246, 25: 1246, 244: 1246, 250: 2274, 1246, 2272, 2273, 2271, 2269, 474: 2270, 2268}, + {2: 1736, 1653, 1687, 1654, 7: 2140, 1741, 1680, 1738, 2145, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 2149, 1665, 2142, 2144, 1859, 2158, 2159, 2157, 2153, 2160, 1837, 1839, 1838, 2150, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 2151, 1774, 1673, 2141, 1751, 1714, 2146, 2148, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 2156, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 2147, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 2152, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 2143, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 2138, 2139, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 2161, 1853, 2137, 1858, 1857, 1699, 1860, 1862, 1703, 2154, 2155, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 2162, 2163, 1876, 1870, 1871, 1872, 2193, 234: 2174, 2133, 2205, 2209, 239: 2190, 2189, 2226, 2200, 247: 2165, 270: 2169, 272: 2208, 2489, 294: 2177, 303: 2196, 315: 2210, 2131, 2203, 2225, 2227, 2168, 2167, 2184, 2224, 2204, 2201, 2195, 2199, 2164, 2166, 2202, 2173, 2206, 2214, 2265, 2172, 2215, 2216, 2171, 2194, 2187, 2188, 2238, 2240, 2241, 2242, 2197, 2243, 2222, 2228, 2236, 2237, 2232, 2244, 2245, 2246, 2233, 2248, 2249, 2239, 2234, 2247, 2229, 2235, 2220, 2250, 2251, 2198, 2255, 2211, 2213, 2254, 2260, 2259, 2261, 2258, 2191, 2262, 2257, 2256, 381: 2253, 2207, 2252, 2212, 2217, 2218, 393: 2176, 1649, 1650, 1648, 452: 2192, 2264, 2183, 2178, 2170, 2181, 2179, 2180, 2219, 2231, 2230, 2223, 2221, 2175, 2186, 2263, 2185, 2182, 2136, 2135, 2134, 2486, 482: 2488, 503: 2428, 2429, 513: 2487}, + {21: 2497, 250: 2274, 252: 2272, 2273, 2271, 2269, 474: 2270, 2268}, // 955 - {724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 229: 724, 724, 724, 724, 724, 724, 724, 724, 724, 239: 724, 724, 724, 724, 244: 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 268: 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 291: 724, 724, 724, 724, 724, 724, 724, 724, 300: 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 382: 724}, - {6: 2453, 21: 2475}, - {725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 229: 725, 725, 725, 725, 725, 725, 725, 725, 725, 239: 725, 725, 725, 725, 244: 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 268: 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 291: 725, 725, 725, 725, 725, 725, 725, 725, 300: 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 382: 725}, - {594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 229: 594, 594, 594, 594, 594, 594, 594, 594, 594, 239: 594, 594, 594, 594, 244: 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 268: 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 291: 594, 594, 594, 594, 594, 594, 594, 594, 300: 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 382: 594, 477: 2269, 480: 2417, 492: 2477}, - {723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 229: 723, 723, 723, 723, 723, 723, 723, 723, 723, 239: 723, 723, 723, 723, 244: 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 268: 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 291: 723, 723, 723, 723, 723, 723, 723, 723, 300: 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 382: 723}, + {2: 1736, 1653, 1687, 1654, 7: 2140, 1741, 1680, 1738, 2145, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 2149, 1665, 2142, 2144, 1859, 2158, 2159, 2157, 2153, 2160, 1837, 1839, 1838, 2150, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 2151, 1774, 1673, 2141, 1751, 1714, 2146, 2148, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 2156, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 2147, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 2152, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 2143, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 2138, 2139, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 2161, 1853, 2137, 1858, 1857, 1699, 1860, 1862, 1703, 2154, 2155, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 2162, 2163, 1876, 1870, 1871, 1872, 2193, 234: 2174, 2133, 2205, 2209, 239: 2190, 2189, 2226, 2200, 247: 2165, 270: 2169, 272: 2208, 294: 2177, 303: 2196, 315: 2210, 2131, 2203, 2225, 2227, 2168, 2167, 2184, 2224, 2204, 2201, 2195, 2199, 2164, 2166, 2202, 2173, 2206, 2214, 2265, 2172, 2215, 2216, 2171, 2194, 2187, 2188, 2238, 2240, 2241, 2242, 2197, 2243, 2222, 2228, 2236, 2237, 2232, 2244, 2245, 2246, 2233, 2248, 2249, 2239, 2234, 2247, 2229, 2235, 2220, 2250, 2251, 2198, 2255, 2211, 2213, 2254, 2260, 2259, 2261, 2258, 2191, 2262, 2257, 2256, 381: 2253, 2207, 2252, 2212, 2217, 2218, 393: 2176, 1649, 1650, 1648, 452: 2192, 2264, 2183, 2178, 2170, 2181, 2179, 2180, 2219, 2231, 2230, 2223, 2221, 2175, 2186, 2263, 2185, 2182, 2136, 2135, 2134, 2472, 509: 2495}, + {2: 1736, 1653, 1687, 1654, 7: 2140, 1741, 1680, 1738, 2145, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 2149, 1665, 2142, 2144, 1859, 2158, 2159, 2157, 2153, 2160, 1837, 1839, 1838, 2150, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 2151, 1774, 1673, 2141, 1751, 1714, 2146, 2148, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 2156, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 2147, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 2152, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 2143, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 2138, 2139, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 2161, 1853, 2137, 1858, 1857, 1699, 1860, 1862, 1703, 2154, 2155, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 2162, 2163, 1876, 1870, 1871, 1872, 2193, 234: 2174, 2133, 2205, 2209, 239: 2190, 2189, 2226, 2200, 247: 2165, 270: 2169, 272: 2208, 294: 2177, 303: 2196, 315: 2210, 2131, 2203, 2225, 2227, 2168, 2167, 2184, 2224, 2204, 2201, 2195, 2199, 2164, 2166, 2202, 2173, 2206, 2214, 2265, 2172, 2215, 2216, 2171, 2194, 2187, 2188, 2238, 2240, 2241, 2242, 2197, 2243, 2222, 2228, 2236, 2237, 2232, 2244, 2245, 2246, 2233, 2248, 2249, 2239, 2234, 2247, 2229, 2235, 2220, 2250, 2251, 2198, 2255, 2211, 2213, 2254, 2260, 2259, 2261, 2258, 2191, 2262, 2257, 2256, 381: 2253, 2207, 2252, 2212, 2217, 2218, 393: 2176, 1649, 1650, 1648, 452: 2192, 2264, 2183, 2178, 2170, 2181, 2179, 2180, 2219, 2231, 2230, 2223, 2221, 2175, 2186, 2263, 2185, 2182, 2136, 2135, 2134, 2492}, + {21: 2490}, + {602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 233: 602, 602, 602, 602, 602, 602, 602, 602, 602, 243: 602, 602, 602, 602, 248: 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 271: 602, 273: 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 295: 602, 602, 602, 602, 602, 602, 602, 602, 304: 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 380: 602, 481: 2290, 484: 2438, 496: 2491}, + {730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 233: 730, 730, 730, 730, 730, 730, 730, 730, 730, 243: 730, 730, 730, 730, 248: 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 271: 730, 273: 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 295: 730, 730, 730, 730, 730, 730, 730, 730, 304: 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 380: 730}, // 960 - {2: 1722, 1639, 1673, 1640, 7: 2119, 1727, 1666, 1724, 2124, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 2128, 1651, 2121, 2123, 2137, 2138, 2136, 2132, 2139, 2129, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 2130, 1760, 1659, 2120, 1737, 1683, 1700, 2125, 2127, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 2135, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 2126, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 2131, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 2122, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 2117, 2118, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 2140, 1835, 2116, 1840, 1839, 1685, 1842, 1844, 1689, 2133, 2134, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 2141, 2142, 1858, 1852, 1853, 1854, 2172, 230: 2153, 2112, 2184, 2188, 235: 2169, 2168, 2205, 2179, 243: 2144, 266: 2148, 2187, 290: 2156, 299: 2175, 311: 2189, 2110, 2182, 2204, 2206, 2147, 2146, 2163, 2203, 2183, 2180, 2174, 2178, 2143, 2145, 2181, 2152, 2185, 2193, 2244, 2151, 2194, 2195, 2150, 2173, 2166, 2167, 2217, 2219, 2220, 2221, 2176, 2222, 2201, 2207, 2215, 2216, 2211, 2223, 2224, 2225, 2212, 2227, 2228, 2218, 2213, 2226, 2208, 2214, 2199, 2229, 2230, 2177, 2234, 2190, 2192, 2233, 2239, 2238, 2240, 2237, 2170, 2241, 2236, 2235, 2232, 2186, 2231, 2191, 2196, 2197, 389: 2155, 1635, 1636, 1634, 448: 2171, 2243, 2162, 2157, 2149, 2160, 2158, 2159, 2198, 2210, 2209, 2202, 2200, 2154, 2165, 2242, 2164, 2161, 2115, 2114, 2113, 2479, 478: 2480}, - {21: 2484, 246: 2253, 248: 2251, 250: 2252, 2250, 2248, 470: 2249, 2247}, - {2: 1722, 1639, 1673, 1640, 7: 2119, 1727, 1666, 1724, 2124, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 2128, 1651, 2121, 2123, 2137, 2138, 2136, 2132, 2139, 2129, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 2130, 1760, 1659, 2120, 1737, 1683, 1700, 2125, 2127, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 2135, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 2126, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 2131, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 2122, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 2117, 2118, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 2140, 1835, 2116, 1840, 1839, 1685, 1842, 1844, 1689, 2133, 2134, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 2141, 2142, 1858, 1852, 1853, 1854, 2172, 230: 2153, 2112, 2184, 2188, 235: 2169, 2168, 2205, 2179, 243: 2144, 266: 2148, 2187, 290: 2156, 299: 2175, 311: 2189, 2110, 2182, 2204, 2206, 2147, 2146, 2163, 2203, 2183, 2180, 2174, 2178, 2143, 2145, 2181, 2152, 2185, 2193, 2244, 2151, 2194, 2195, 2150, 2173, 2166, 2167, 2217, 2219, 2220, 2221, 2176, 2222, 2201, 2207, 2215, 2216, 2211, 2223, 2224, 2225, 2212, 2227, 2228, 2218, 2213, 2226, 2208, 2214, 2199, 2229, 2230, 2177, 2234, 2190, 2192, 2233, 2239, 2238, 2240, 2237, 2170, 2241, 2236, 2235, 2232, 2186, 2231, 2191, 2196, 2197, 389: 2155, 1635, 1636, 1634, 448: 2171, 2243, 2162, 2157, 2149, 2160, 2158, 2159, 2198, 2210, 2209, 2202, 2200, 2154, 2165, 2242, 2164, 2161, 2115, 2114, 2113, 2481}, - {21: 2482, 246: 2253, 248: 2251, 250: 2252, 2250, 2248, 470: 2249, 2247}, - {594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 229: 594, 594, 594, 594, 594, 594, 594, 594, 594, 239: 594, 594, 594, 594, 244: 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 268: 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 291: 594, 594, 594, 594, 594, 594, 594, 594, 300: 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 382: 594, 477: 2269, 480: 2417, 492: 2483}, + {21: 2493, 250: 2274, 252: 2272, 2273, 2271, 2269, 474: 2270, 2268}, + {602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 233: 602, 602, 602, 602, 602, 602, 602, 602, 602, 243: 602, 602, 602, 602, 248: 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 271: 602, 273: 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 295: 602, 602, 602, 602, 602, 602, 602, 602, 304: 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 380: 602, 481: 2290, 484: 2438, 496: 2494}, + {732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 233: 732, 732, 732, 732, 732, 732, 732, 732, 732, 243: 732, 732, 732, 732, 248: 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 271: 732, 273: 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 295: 732, 732, 732, 732, 732, 732, 732, 732, 304: 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 380: 732}, + {6: 2474, 21: 2496}, + {733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 233: 733, 733, 733, 733, 733, 733, 733, 733, 733, 243: 733, 733, 733, 733, 248: 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 271: 733, 273: 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 295: 733, 733, 733, 733, 733, 733, 733, 733, 304: 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 380: 733}, // 965 - {726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 229: 726, 726, 726, 726, 726, 726, 726, 726, 726, 239: 726, 726, 726, 726, 244: 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 268: 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 291: 726, 726, 726, 726, 726, 726, 726, 726, 300: 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 382: 726}, - {594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 229: 594, 594, 594, 594, 594, 594, 594, 594, 594, 239: 594, 594, 594, 594, 244: 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 268: 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 291: 594, 594, 594, 594, 594, 594, 594, 594, 300: 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 382: 594, 477: 2269, 480: 2417, 492: 2485}, - {727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 229: 727, 727, 727, 727, 727, 727, 727, 727, 727, 239: 727, 727, 727, 727, 244: 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 268: 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 291: 727, 727, 727, 727, 727, 727, 727, 727, 300: 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 382: 727}, - {2: 1722, 1639, 1673, 1640, 7: 2119, 1727, 1666, 1724, 2124, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 2128, 1651, 2121, 2123, 2137, 2138, 2136, 2132, 2139, 2129, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 2130, 1760, 1659, 2120, 1737, 1683, 1700, 2125, 2127, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 2135, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 2126, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 2131, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 2122, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 2117, 2118, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 2140, 1835, 2116, 1840, 1839, 1685, 1842, 1844, 1689, 2133, 2134, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 2141, 2142, 1858, 1852, 1853, 1854, 2172, 230: 2153, 2112, 2184, 2188, 235: 2169, 2168, 2205, 2179, 243: 2144, 266: 2148, 2187, 290: 2156, 299: 2175, 311: 2189, 2110, 2182, 2204, 2206, 2147, 2146, 2163, 2203, 2183, 2180, 2174, 2178, 2143, 2145, 2181, 2152, 2185, 2193, 2244, 2151, 2194, 2195, 2150, 2173, 2166, 2167, 2217, 2219, 2220, 2221, 2176, 2222, 2201, 2207, 2215, 2216, 2211, 2223, 2224, 2225, 2212, 2227, 2228, 2218, 2213, 2226, 2208, 2214, 2199, 2229, 2230, 2177, 2234, 2190, 2192, 2233, 2239, 2238, 2240, 2237, 2170, 2241, 2236, 2235, 2232, 2186, 2231, 2191, 2196, 2197, 389: 2155, 1635, 1636, 1634, 448: 2171, 2243, 2162, 2157, 2149, 2160, 2158, 2159, 2198, 2210, 2209, 2202, 2200, 2154, 2165, 2242, 2164, 2161, 2115, 2114, 2113, 2487, 478: 2488}, - {21: 2492, 246: 2253, 248: 2251, 250: 2252, 2250, 2248, 470: 2249, 2247}, + {602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 233: 602, 602, 602, 602, 602, 602, 602, 602, 602, 243: 602, 602, 602, 602, 248: 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 271: 602, 273: 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 295: 602, 602, 602, 602, 602, 602, 602, 602, 304: 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 380: 602, 481: 2290, 484: 2438, 496: 2498}, + {731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 233: 731, 731, 731, 731, 731, 731, 731, 731, 731, 243: 731, 731, 731, 731, 248: 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 271: 731, 273: 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 295: 731, 731, 731, 731, 731, 731, 731, 731, 304: 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 380: 731}, + {2: 1736, 1653, 1687, 1654, 7: 2140, 1741, 1680, 1738, 2145, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 2149, 1665, 2142, 2144, 1859, 2158, 2159, 2157, 2153, 2160, 1837, 1839, 1838, 2150, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 2151, 1774, 1673, 2141, 1751, 1714, 2146, 2148, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 2156, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 2147, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 2152, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 2143, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 2138, 2139, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 2161, 1853, 2137, 1858, 1857, 1699, 1860, 1862, 1703, 2154, 2155, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 2162, 2163, 1876, 1870, 1871, 1872, 2193, 234: 2174, 2133, 2205, 2209, 239: 2190, 2189, 2226, 2200, 247: 2165, 270: 2169, 272: 2208, 294: 2177, 303: 2196, 315: 2210, 2131, 2203, 2225, 2227, 2168, 2167, 2184, 2224, 2204, 2201, 2195, 2199, 2164, 2166, 2202, 2173, 2206, 2214, 2265, 2172, 2215, 2216, 2171, 2194, 2187, 2188, 2238, 2240, 2241, 2242, 2197, 2243, 2222, 2228, 2236, 2237, 2232, 2244, 2245, 2246, 2233, 2248, 2249, 2239, 2234, 2247, 2229, 2235, 2220, 2250, 2251, 2198, 2255, 2211, 2213, 2254, 2260, 2259, 2261, 2258, 2191, 2262, 2257, 2256, 381: 2253, 2207, 2252, 2212, 2217, 2218, 393: 2176, 1649, 1650, 1648, 452: 2192, 2264, 2183, 2178, 2170, 2181, 2179, 2180, 2219, 2231, 2230, 2223, 2221, 2175, 2186, 2263, 2185, 2182, 2136, 2135, 2134, 2500, 482: 2501}, + {21: 2505, 250: 2274, 252: 2272, 2273, 2271, 2269, 474: 2270, 2268}, + {2: 1736, 1653, 1687, 1654, 7: 2140, 1741, 1680, 1738, 2145, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 2149, 1665, 2142, 2144, 1859, 2158, 2159, 2157, 2153, 2160, 1837, 1839, 1838, 2150, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 2151, 1774, 1673, 2141, 1751, 1714, 2146, 2148, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 2156, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 2147, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 2152, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 2143, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 2138, 2139, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 2161, 1853, 2137, 1858, 1857, 1699, 1860, 1862, 1703, 2154, 2155, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 2162, 2163, 1876, 1870, 1871, 1872, 2193, 234: 2174, 2133, 2205, 2209, 239: 2190, 2189, 2226, 2200, 247: 2165, 270: 2169, 272: 2208, 294: 2177, 303: 2196, 315: 2210, 2131, 2203, 2225, 2227, 2168, 2167, 2184, 2224, 2204, 2201, 2195, 2199, 2164, 2166, 2202, 2173, 2206, 2214, 2265, 2172, 2215, 2216, 2171, 2194, 2187, 2188, 2238, 2240, 2241, 2242, 2197, 2243, 2222, 2228, 2236, 2237, 2232, 2244, 2245, 2246, 2233, 2248, 2249, 2239, 2234, 2247, 2229, 2235, 2220, 2250, 2251, 2198, 2255, 2211, 2213, 2254, 2260, 2259, 2261, 2258, 2191, 2262, 2257, 2256, 381: 2253, 2207, 2252, 2212, 2217, 2218, 393: 2176, 1649, 1650, 1648, 452: 2192, 2264, 2183, 2178, 2170, 2181, 2179, 2180, 2219, 2231, 2230, 2223, 2221, 2175, 2186, 2263, 2185, 2182, 2136, 2135, 2134, 2502}, // 970 - {2: 1722, 1639, 1673, 1640, 7: 2119, 1727, 1666, 1724, 2124, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 2128, 1651, 2121, 2123, 2137, 2138, 2136, 2132, 2139, 2129, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 2130, 1760, 1659, 2120, 1737, 1683, 1700, 2125, 2127, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 2135, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 2126, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 2131, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 2122, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 2117, 2118, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 2140, 1835, 2116, 1840, 1839, 1685, 1842, 1844, 1689, 2133, 2134, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 2141, 2142, 1858, 1852, 1853, 1854, 2172, 230: 2153, 2112, 2184, 2188, 235: 2169, 2168, 2205, 2179, 243: 2144, 266: 2148, 2187, 290: 2156, 299: 2175, 311: 2189, 2110, 2182, 2204, 2206, 2147, 2146, 2163, 2203, 2183, 2180, 2174, 2178, 2143, 2145, 2181, 2152, 2185, 2193, 2244, 2151, 2194, 2195, 2150, 2173, 2166, 2167, 2217, 2219, 2220, 2221, 2176, 2222, 2201, 2207, 2215, 2216, 2211, 2223, 2224, 2225, 2212, 2227, 2228, 2218, 2213, 2226, 2208, 2214, 2199, 2229, 2230, 2177, 2234, 2190, 2192, 2233, 2239, 2238, 2240, 2237, 2170, 2241, 2236, 2235, 2232, 2186, 2231, 2191, 2196, 2197, 389: 2155, 1635, 1636, 1634, 448: 2171, 2243, 2162, 2157, 2149, 2160, 2158, 2159, 2198, 2210, 2209, 2202, 2200, 2154, 2165, 2242, 2164, 2161, 2115, 2114, 2113, 2489}, - {21: 2490, 246: 2253, 248: 2251, 250: 2252, 2250, 2248, 470: 2249, 2247}, - {594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 229: 594, 594, 594, 594, 594, 594, 594, 594, 594, 239: 594, 594, 594, 594, 244: 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 268: 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 291: 594, 594, 594, 594, 594, 594, 594, 594, 300: 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 382: 594, 477: 2269, 480: 2417, 492: 2491}, - {728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 229: 728, 728, 728, 728, 728, 728, 728, 728, 728, 239: 728, 728, 728, 728, 244: 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 268: 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 291: 728, 728, 728, 728, 728, 728, 728, 728, 300: 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 382: 728}, - {594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 229: 594, 594, 594, 594, 594, 594, 594, 594, 594, 239: 594, 594, 594, 594, 244: 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 268: 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 291: 594, 594, 594, 594, 594, 594, 594, 594, 300: 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 382: 594, 477: 2269, 480: 2417, 492: 2493}, + {21: 2503, 250: 2274, 252: 2272, 2273, 2271, 2269, 474: 2270, 2268}, + {602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 233: 602, 602, 602, 602, 602, 602, 602, 602, 602, 243: 602, 602, 602, 602, 248: 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 271: 602, 273: 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 295: 602, 602, 602, 602, 602, 602, 602, 602, 304: 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 380: 602, 481: 2290, 484: 2438, 496: 2504}, + {734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 233: 734, 734, 734, 734, 734, 734, 734, 734, 734, 243: 734, 734, 734, 734, 248: 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 271: 734, 273: 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 295: 734, 734, 734, 734, 734, 734, 734, 734, 304: 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 380: 734}, + {602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 233: 602, 602, 602, 602, 602, 602, 602, 602, 602, 243: 602, 602, 602, 602, 248: 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 271: 602, 273: 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 295: 602, 602, 602, 602, 602, 602, 602, 602, 304: 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 380: 602, 481: 2290, 484: 2438, 496: 2506}, + {735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 233: 735, 735, 735, 735, 735, 735, 735, 735, 735, 243: 735, 735, 735, 735, 248: 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 271: 735, 273: 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 295: 735, 735, 735, 735, 735, 735, 735, 735, 304: 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 380: 735}, // 975 - {729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 229: 729, 729, 729, 729, 729, 729, 729, 729, 729, 239: 729, 729, 729, 729, 244: 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 268: 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 291: 729, 729, 729, 729, 729, 729, 729, 729, 300: 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 382: 729}, - {2: 1722, 1639, 1673, 1640, 7: 2119, 1727, 1666, 1724, 2124, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 2128, 1651, 2121, 2123, 2137, 2138, 2136, 2132, 2139, 2129, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 2130, 1760, 1659, 2120, 1737, 1683, 1700, 2125, 2127, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 2135, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 2126, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 2131, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 2122, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 2117, 2118, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 2140, 1835, 2116, 1840, 1839, 1685, 1842, 1844, 1689, 2133, 2134, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 2141, 2142, 1858, 1852, 1853, 1854, 2172, 230: 2153, 2112, 2184, 2188, 235: 2169, 2168, 2205, 2179, 243: 2144, 266: 2148, 2187, 290: 2156, 299: 2175, 311: 2189, 2110, 2182, 2204, 2206, 2147, 2146, 2163, 2203, 2183, 2180, 2174, 2178, 2143, 2145, 2181, 2152, 2185, 2193, 2244, 2151, 2194, 2195, 2150, 2173, 2166, 2167, 2217, 2219, 2220, 2221, 2176, 2222, 2201, 2207, 2215, 2216, 2211, 2223, 2224, 2225, 2212, 2227, 2228, 2218, 2213, 2226, 2208, 2214, 2199, 2229, 2230, 2177, 2234, 2190, 2192, 2233, 2239, 2238, 2240, 2237, 2170, 2241, 2236, 2235, 2232, 2186, 2231, 2191, 2196, 2197, 389: 2155, 1635, 1636, 1634, 448: 2171, 2243, 2162, 2157, 2149, 2160, 2158, 2159, 2198, 2210, 2209, 2202, 2200, 2154, 2165, 2242, 2164, 2161, 2115, 2114, 2113, 2495, 478: 2496}, - {21: 2500, 246: 2253, 248: 2251, 250: 2252, 2250, 2248, 470: 2249, 2247}, - {2: 1722, 1639, 1673, 1640, 7: 2119, 1727, 1666, 1724, 2124, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 2128, 1651, 2121, 2123, 2137, 2138, 2136, 2132, 2139, 2129, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 2130, 1760, 1659, 2120, 1737, 1683, 1700, 2125, 2127, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 2135, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 2126, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 2131, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 2122, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 2117, 2118, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 2140, 1835, 2116, 1840, 1839, 1685, 1842, 1844, 1689, 2133, 2134, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 2141, 2142, 1858, 1852, 1853, 1854, 2172, 230: 2153, 2112, 2184, 2188, 235: 2169, 2168, 2205, 2179, 243: 2144, 266: 2148, 2187, 290: 2156, 299: 2175, 311: 2189, 2110, 2182, 2204, 2206, 2147, 2146, 2163, 2203, 2183, 2180, 2174, 2178, 2143, 2145, 2181, 2152, 2185, 2193, 2244, 2151, 2194, 2195, 2150, 2173, 2166, 2167, 2217, 2219, 2220, 2221, 2176, 2222, 2201, 2207, 2215, 2216, 2211, 2223, 2224, 2225, 2212, 2227, 2228, 2218, 2213, 2226, 2208, 2214, 2199, 2229, 2230, 2177, 2234, 2190, 2192, 2233, 2239, 2238, 2240, 2237, 2170, 2241, 2236, 2235, 2232, 2186, 2231, 2191, 2196, 2197, 389: 2155, 1635, 1636, 1634, 448: 2171, 2243, 2162, 2157, 2149, 2160, 2158, 2159, 2198, 2210, 2209, 2202, 2200, 2154, 2165, 2242, 2164, 2161, 2115, 2114, 2113, 2497}, - {21: 2498, 246: 2253, 248: 2251, 250: 2252, 2250, 2248, 470: 2249, 2247}, + {2: 1736, 1653, 1687, 1654, 7: 2140, 1741, 1680, 1738, 2145, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 2149, 1665, 2142, 2144, 1859, 2158, 2159, 2157, 2153, 2160, 1837, 1839, 1838, 2150, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 2151, 1774, 1673, 2141, 1751, 1714, 2146, 2148, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 2156, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 2147, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 2152, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 2143, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 2138, 2139, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 2161, 1853, 2137, 1858, 1857, 1699, 1860, 1862, 1703, 2154, 2155, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 2162, 2163, 1876, 1870, 1871, 1872, 2193, 234: 2174, 2133, 2205, 2209, 239: 2190, 2189, 2226, 2200, 247: 2165, 270: 2169, 272: 2208, 294: 2177, 303: 2196, 315: 2210, 2131, 2203, 2225, 2227, 2168, 2167, 2184, 2224, 2204, 2201, 2195, 2199, 2164, 2166, 2202, 2173, 2206, 2214, 2265, 2172, 2215, 2216, 2171, 2194, 2187, 2188, 2238, 2240, 2241, 2242, 2197, 2243, 2222, 2228, 2236, 2237, 2232, 2244, 2245, 2246, 2233, 2248, 2249, 2239, 2234, 2247, 2229, 2235, 2220, 2250, 2251, 2198, 2255, 2211, 2213, 2254, 2260, 2259, 2261, 2258, 2191, 2262, 2257, 2256, 381: 2253, 2207, 2252, 2212, 2217, 2218, 393: 2176, 1649, 1650, 1648, 452: 2192, 2264, 2183, 2178, 2170, 2181, 2179, 2180, 2219, 2231, 2230, 2223, 2221, 2175, 2186, 2263, 2185, 2182, 2136, 2135, 2134, 2508, 482: 2509}, + {21: 2513, 250: 2274, 252: 2272, 2273, 2271, 2269, 474: 2270, 2268}, + {2: 1736, 1653, 1687, 1654, 7: 2140, 1741, 1680, 1738, 2145, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 2149, 1665, 2142, 2144, 1859, 2158, 2159, 2157, 2153, 2160, 1837, 1839, 1838, 2150, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 2151, 1774, 1673, 2141, 1751, 1714, 2146, 2148, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 2156, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 2147, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 2152, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 2143, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 2138, 2139, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 2161, 1853, 2137, 1858, 1857, 1699, 1860, 1862, 1703, 2154, 2155, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 2162, 2163, 1876, 1870, 1871, 1872, 2193, 234: 2174, 2133, 2205, 2209, 239: 2190, 2189, 2226, 2200, 247: 2165, 270: 2169, 272: 2208, 294: 2177, 303: 2196, 315: 2210, 2131, 2203, 2225, 2227, 2168, 2167, 2184, 2224, 2204, 2201, 2195, 2199, 2164, 2166, 2202, 2173, 2206, 2214, 2265, 2172, 2215, 2216, 2171, 2194, 2187, 2188, 2238, 2240, 2241, 2242, 2197, 2243, 2222, 2228, 2236, 2237, 2232, 2244, 2245, 2246, 2233, 2248, 2249, 2239, 2234, 2247, 2229, 2235, 2220, 2250, 2251, 2198, 2255, 2211, 2213, 2254, 2260, 2259, 2261, 2258, 2191, 2262, 2257, 2256, 381: 2253, 2207, 2252, 2212, 2217, 2218, 393: 2176, 1649, 1650, 1648, 452: 2192, 2264, 2183, 2178, 2170, 2181, 2179, 2180, 2219, 2231, 2230, 2223, 2221, 2175, 2186, 2263, 2185, 2182, 2136, 2135, 2134, 2510}, + {21: 2511, 250: 2274, 252: 2272, 2273, 2271, 2269, 474: 2270, 2268}, + {602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 233: 602, 602, 602, 602, 602, 602, 602, 602, 602, 243: 602, 602, 602, 602, 248: 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 271: 602, 273: 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 295: 602, 602, 602, 602, 602, 602, 602, 602, 304: 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 380: 602, 481: 2290, 484: 2438, 496: 2512}, // 980 - {594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 229: 594, 594, 594, 594, 594, 594, 594, 594, 594, 239: 594, 594, 594, 594, 244: 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 268: 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 291: 594, 594, 594, 594, 594, 594, 594, 594, 300: 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 382: 594, 477: 2269, 480: 2417, 492: 2499}, - {730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 229: 730, 730, 730, 730, 730, 730, 730, 730, 730, 239: 730, 730, 730, 730, 244: 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 268: 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 291: 730, 730, 730, 730, 730, 730, 730, 730, 300: 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 382: 730}, - {594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 229: 594, 594, 594, 594, 594, 594, 594, 594, 594, 239: 594, 594, 594, 594, 244: 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 268: 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 291: 594, 594, 594, 594, 594, 594, 594, 594, 300: 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 382: 594, 477: 2269, 480: 2417, 492: 2501}, - {731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 229: 731, 731, 731, 731, 731, 731, 731, 731, 731, 239: 731, 731, 731, 731, 244: 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 268: 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 291: 731, 731, 731, 731, 731, 731, 731, 731, 300: 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 382: 731}, - {2: 1722, 1639, 1673, 1640, 7: 2119, 1727, 1666, 1724, 2124, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 2128, 1651, 2121, 2123, 2137, 2138, 2136, 2132, 2139, 2129, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 2130, 1760, 1659, 2120, 1737, 1683, 1700, 2125, 2127, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 2135, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 2126, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 2131, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 2122, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 2117, 2118, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 2140, 1835, 2116, 1840, 1839, 1685, 1842, 1844, 1689, 2133, 2134, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 2141, 2142, 1858, 1852, 1853, 1854, 2172, 230: 2153, 2112, 2184, 2188, 235: 2169, 2168, 2205, 2179, 243: 2144, 266: 2148, 2187, 290: 2156, 299: 2175, 311: 2189, 2110, 2182, 2204, 2206, 2147, 2146, 2163, 2203, 2183, 2180, 2174, 2178, 2143, 2145, 2181, 2152, 2185, 2193, 2244, 2151, 2194, 2195, 2150, 2173, 2166, 2167, 2217, 2219, 2220, 2221, 2176, 2222, 2201, 2207, 2215, 2216, 2211, 2223, 2224, 2225, 2212, 2227, 2228, 2218, 2213, 2226, 2208, 2214, 2199, 2229, 2230, 2177, 2234, 2190, 2192, 2233, 2239, 2238, 2240, 2237, 2170, 2241, 2236, 2235, 2232, 2186, 2231, 2191, 2196, 2197, 389: 2155, 1635, 1636, 1634, 448: 2171, 2243, 2162, 2157, 2149, 2160, 2158, 2159, 2198, 2210, 2209, 2202, 2200, 2154, 2165, 2242, 2164, 2161, 2115, 2114, 2113, 2503, 764: 2505, 808: 2506, 873: 2507, 2504}, + {736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 233: 736, 736, 736, 736, 736, 736, 736, 736, 736, 243: 736, 736, 736, 736, 248: 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 271: 736, 273: 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 295: 736, 736, 736, 736, 736, 736, 736, 736, 304: 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 380: 736}, + {602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 233: 602, 602, 602, 602, 602, 602, 602, 602, 602, 243: 602, 602, 602, 602, 248: 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 271: 602, 273: 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 295: 602, 602, 602, 602, 602, 602, 602, 602, 304: 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 380: 602, 481: 2290, 484: 2438, 496: 2514}, + {737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 233: 737, 737, 737, 737, 737, 737, 737, 737, 737, 243: 737, 737, 737, 737, 248: 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 271: 737, 273: 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 295: 737, 737, 737, 737, 737, 737, 737, 737, 304: 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 380: 737}, + {2: 1736, 1653, 1687, 1654, 7: 2140, 1741, 1680, 1738, 2145, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 2149, 1665, 2142, 2144, 1859, 2158, 2159, 2157, 2153, 2160, 1837, 1839, 1838, 2150, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 2151, 1774, 1673, 2141, 1751, 1714, 2146, 2148, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 2156, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 2147, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 2152, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 2143, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 2138, 2139, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 2161, 1853, 2137, 1858, 1857, 1699, 1860, 1862, 1703, 2154, 2155, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 2162, 2163, 1876, 1870, 1871, 1872, 2193, 234: 2174, 2133, 2205, 2209, 239: 2190, 2189, 2226, 2200, 247: 2165, 270: 2169, 272: 2208, 294: 2177, 303: 2196, 315: 2210, 2131, 2203, 2225, 2227, 2168, 2167, 2184, 2224, 2204, 2201, 2195, 2199, 2164, 2166, 2202, 2173, 2206, 2214, 2265, 2172, 2215, 2216, 2171, 2194, 2187, 2188, 2238, 2240, 2241, 2242, 2197, 2243, 2222, 2228, 2236, 2237, 2232, 2244, 2245, 2246, 2233, 2248, 2249, 2239, 2234, 2247, 2229, 2235, 2220, 2250, 2251, 2198, 2255, 2211, 2213, 2254, 2260, 2259, 2261, 2258, 2191, 2262, 2257, 2256, 381: 2253, 2207, 2252, 2212, 2217, 2218, 393: 2176, 1649, 1650, 1648, 452: 2192, 2264, 2183, 2178, 2170, 2181, 2179, 2180, 2219, 2231, 2230, 2223, 2221, 2175, 2186, 2263, 2185, 2182, 2136, 2135, 2134, 2516, 482: 2517}, + {21: 2521, 250: 2274, 252: 2272, 2273, 2271, 2269, 474: 2270, 2268}, // 985 - {21: 2515, 246: 2253, 248: 2251, 250: 2252, 2250, 2248, 2516, 470: 2249, 2247}, - {2: 1722, 1639, 1673, 1640, 7: 2119, 1727, 1666, 1724, 2124, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 2128, 1651, 2121, 2123, 2137, 2138, 2136, 2132, 2139, 2129, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 2130, 1760, 1659, 2120, 1737, 1683, 1700, 2125, 2127, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 2135, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 2126, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 2131, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 2122, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 2117, 2118, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 2140, 1835, 2116, 1840, 1839, 1685, 1842, 1844, 1689, 2133, 2134, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 2141, 2142, 1858, 1852, 1853, 1854, 2172, 230: 2153, 2112, 2184, 2188, 235: 2169, 2168, 2205, 2179, 243: 2144, 253: 2509, 266: 2148, 2187, 290: 2156, 299: 2175, 311: 2189, 2110, 2182, 2204, 2206, 2147, 2146, 2163, 2203, 2183, 2180, 2174, 2178, 2143, 2145, 2181, 2152, 2185, 2193, 2244, 2151, 2194, 2195, 2150, 2173, 2166, 2167, 2217, 2219, 2220, 2221, 2176, 2222, 2201, 2207, 2215, 2216, 2211, 2223, 2224, 2225, 2212, 2227, 2228, 2218, 2213, 2226, 2208, 2214, 2199, 2229, 2230, 2177, 2234, 2190, 2192, 2233, 2239, 2238, 2240, 2237, 2170, 2241, 2236, 2235, 2232, 2186, 2231, 2191, 2196, 2197, 389: 2155, 1635, 1636, 1634, 448: 2171, 2243, 2162, 2157, 2149, 2160, 2158, 2159, 2198, 2210, 2209, 2202, 2200, 2154, 2165, 2242, 2164, 2161, 2115, 2114, 2113, 2508}, - {2: 735, 735, 735, 735, 7: 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 22: 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 230: 735, 735, 735, 735, 235: 735, 735, 735, 735, 243: 735, 253: 735, 266: 735, 735, 290: 735, 299: 735, 311: 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735}, - {2: 734, 734, 734, 734, 7: 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 22: 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 230: 734, 734, 734, 734, 235: 734, 734, 734, 734, 243: 734, 253: 734, 266: 734, 734, 290: 734, 299: 734, 311: 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734}, - {2: 733, 733, 733, 733, 7: 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 22: 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 230: 733, 733, 733, 733, 235: 733, 733, 733, 733, 243: 733, 253: 733, 266: 733, 733, 290: 733, 299: 733, 311: 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733}, + {2: 1736, 1653, 1687, 1654, 7: 2140, 1741, 1680, 1738, 2145, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 2149, 1665, 2142, 2144, 1859, 2158, 2159, 2157, 2153, 2160, 1837, 1839, 1838, 2150, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 2151, 1774, 1673, 2141, 1751, 1714, 2146, 2148, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 2156, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 2147, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 2152, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 2143, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 2138, 2139, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 2161, 1853, 2137, 1858, 1857, 1699, 1860, 1862, 1703, 2154, 2155, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 2162, 2163, 1876, 1870, 1871, 1872, 2193, 234: 2174, 2133, 2205, 2209, 239: 2190, 2189, 2226, 2200, 247: 2165, 270: 2169, 272: 2208, 294: 2177, 303: 2196, 315: 2210, 2131, 2203, 2225, 2227, 2168, 2167, 2184, 2224, 2204, 2201, 2195, 2199, 2164, 2166, 2202, 2173, 2206, 2214, 2265, 2172, 2215, 2216, 2171, 2194, 2187, 2188, 2238, 2240, 2241, 2242, 2197, 2243, 2222, 2228, 2236, 2237, 2232, 2244, 2245, 2246, 2233, 2248, 2249, 2239, 2234, 2247, 2229, 2235, 2220, 2250, 2251, 2198, 2255, 2211, 2213, 2254, 2260, 2259, 2261, 2258, 2191, 2262, 2257, 2256, 381: 2253, 2207, 2252, 2212, 2217, 2218, 393: 2176, 1649, 1650, 1648, 452: 2192, 2264, 2183, 2178, 2170, 2181, 2179, 2180, 2219, 2231, 2230, 2223, 2221, 2175, 2186, 2263, 2185, 2182, 2136, 2135, 2134, 2518}, + {21: 2519, 250: 2274, 252: 2272, 2273, 2271, 2269, 474: 2270, 2268}, + {602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 233: 602, 602, 602, 602, 602, 602, 602, 602, 602, 243: 602, 602, 602, 602, 248: 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 271: 602, 273: 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 295: 602, 602, 602, 602, 602, 602, 602, 602, 304: 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 380: 602, 481: 2290, 484: 2438, 496: 2520}, + {738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 233: 738, 738, 738, 738, 738, 738, 738, 738, 738, 243: 738, 738, 738, 738, 248: 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 271: 738, 273: 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 295: 738, 738, 738, 738, 738, 738, 738, 738, 304: 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 380: 738}, + {602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 233: 602, 602, 602, 602, 602, 602, 602, 602, 602, 243: 602, 602, 602, 602, 248: 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 271: 602, 273: 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 295: 602, 602, 602, 602, 602, 602, 602, 602, 304: 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 380: 602, 481: 2290, 484: 2438, 496: 2522}, // 990 - {246: 2253, 248: 2251, 250: 2252, 2250, 2248, 2512, 470: 2249, 2247}, - {2: 1722, 1639, 1673, 1640, 7: 2119, 1727, 1666, 1724, 2124, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 2128, 1651, 2121, 2123, 2137, 2138, 2136, 2132, 2139, 2129, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 2130, 1760, 1659, 2120, 1737, 1683, 1700, 2125, 2127, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 2135, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 2126, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 2131, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 2122, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 2117, 2118, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 2140, 1835, 2116, 1840, 1839, 1685, 1842, 1844, 1689, 2133, 2134, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 2141, 2142, 1858, 1852, 1853, 1854, 2172, 230: 2153, 2112, 2184, 2188, 235: 2169, 2168, 2205, 2179, 243: 2144, 266: 2148, 2187, 290: 2156, 299: 2175, 311: 2189, 2110, 2182, 2204, 2206, 2147, 2146, 2163, 2203, 2183, 2180, 2174, 2178, 2143, 2145, 2181, 2152, 2185, 2193, 2244, 2151, 2194, 2195, 2150, 2173, 2166, 2167, 2217, 2219, 2220, 2221, 2176, 2222, 2201, 2207, 2215, 2216, 2211, 2223, 2224, 2225, 2212, 2227, 2228, 2218, 2213, 2226, 2208, 2214, 2199, 2229, 2230, 2177, 2234, 2190, 2192, 2233, 2239, 2238, 2240, 2237, 2170, 2241, 2236, 2235, 2232, 2186, 2231, 2191, 2196, 2197, 389: 2155, 1635, 1636, 1634, 448: 2171, 2243, 2162, 2157, 2149, 2160, 2158, 2159, 2198, 2210, 2209, 2202, 2200, 2154, 2165, 2242, 2164, 2161, 2115, 2114, 2113, 2510}, - {21: 2511, 246: 2253, 248: 2251, 250: 2252, 2250, 2248, 470: 2249, 2247}, - {745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 229: 745, 745, 745, 745, 745, 745, 745, 745, 745, 239: 745, 745, 745, 745, 244: 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 268: 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 291: 745, 745, 745, 745, 745, 745, 745, 745, 300: 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 382: 745}, - {2: 1722, 1639, 1673, 1640, 7: 2119, 1727, 1666, 1724, 2124, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 2128, 1651, 2121, 2123, 2137, 2138, 2136, 2132, 2139, 2129, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 2130, 1760, 1659, 2120, 1737, 1683, 1700, 2125, 2127, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 2135, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 2126, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 2131, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 2122, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 2117, 2118, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 2140, 1835, 2116, 1840, 1839, 1685, 1842, 1844, 1689, 2133, 2134, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 2141, 2142, 1858, 1852, 1853, 1854, 2172, 230: 2153, 2112, 2184, 2188, 235: 2169, 2168, 2205, 2179, 243: 2144, 266: 2148, 2187, 290: 2156, 299: 2175, 311: 2189, 2110, 2182, 2204, 2206, 2147, 2146, 2163, 2203, 2183, 2180, 2174, 2178, 2143, 2145, 2181, 2152, 2185, 2193, 2244, 2151, 2194, 2195, 2150, 2173, 2166, 2167, 2217, 2219, 2220, 2221, 2176, 2222, 2201, 2207, 2215, 2216, 2211, 2223, 2224, 2225, 2212, 2227, 2228, 2218, 2213, 2226, 2208, 2214, 2199, 2229, 2230, 2177, 2234, 2190, 2192, 2233, 2239, 2238, 2240, 2237, 2170, 2241, 2236, 2235, 2232, 2186, 2231, 2191, 2196, 2197, 389: 2155, 1635, 1636, 1634, 448: 2171, 2243, 2162, 2157, 2149, 2160, 2158, 2159, 2198, 2210, 2209, 2202, 2200, 2154, 2165, 2242, 2164, 2161, 2115, 2114, 2113, 2513}, + {739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 233: 739, 739, 739, 739, 739, 739, 739, 739, 739, 243: 739, 739, 739, 739, 248: 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 271: 739, 273: 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 295: 739, 739, 739, 739, 739, 739, 739, 739, 304: 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 380: 739}, + {2: 1736, 1653, 1687, 1654, 7: 2140, 1741, 1680, 1738, 2145, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 2149, 1665, 2142, 2144, 1859, 2158, 2159, 2157, 2153, 2160, 1837, 1839, 1838, 2150, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 2151, 1774, 1673, 2141, 1751, 1714, 2146, 2148, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 2156, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 2147, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 2152, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 2143, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 2138, 2139, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 2161, 1853, 2137, 1858, 1857, 1699, 1860, 1862, 1703, 2154, 2155, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 2162, 2163, 1876, 1870, 1871, 1872, 2193, 234: 2174, 2133, 2205, 2209, 239: 2190, 2189, 2226, 2200, 247: 2165, 270: 2169, 272: 2208, 294: 2177, 303: 2196, 315: 2210, 2131, 2203, 2225, 2227, 2168, 2167, 2184, 2224, 2204, 2201, 2195, 2199, 2164, 2166, 2202, 2173, 2206, 2214, 2265, 2172, 2215, 2216, 2171, 2194, 2187, 2188, 2238, 2240, 2241, 2242, 2197, 2243, 2222, 2228, 2236, 2237, 2232, 2244, 2245, 2246, 2233, 2248, 2249, 2239, 2234, 2247, 2229, 2235, 2220, 2250, 2251, 2198, 2255, 2211, 2213, 2254, 2260, 2259, 2261, 2258, 2191, 2262, 2257, 2256, 381: 2253, 2207, 2252, 2212, 2217, 2218, 393: 2176, 1649, 1650, 1648, 452: 2192, 2264, 2183, 2178, 2170, 2181, 2179, 2180, 2219, 2231, 2230, 2223, 2221, 2175, 2186, 2263, 2185, 2182, 2136, 2135, 2134, 2524, 768: 2526, 812: 2527, 877: 2528, 2525}, + {21: 2536, 250: 2274, 252: 2272, 2273, 2271, 2269, 257: 2537, 474: 2270, 2268}, + {2: 1736, 1653, 1687, 1654, 7: 2140, 1741, 1680, 1738, 2145, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 2149, 1665, 2142, 2144, 1859, 2158, 2159, 2157, 2153, 2160, 1837, 1839, 1838, 2150, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 2151, 1774, 1673, 2141, 1751, 1714, 2146, 2148, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 2156, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 2147, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 2152, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 2143, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 2138, 2139, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 2161, 1853, 2137, 1858, 1857, 1699, 1860, 1862, 1703, 2154, 2155, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 2162, 2163, 1876, 1870, 1871, 1872, 2193, 234: 2174, 2133, 2205, 2209, 239: 2190, 2189, 2226, 2200, 247: 2165, 257: 2530, 270: 2169, 272: 2208, 294: 2177, 303: 2196, 315: 2210, 2131, 2203, 2225, 2227, 2168, 2167, 2184, 2224, 2204, 2201, 2195, 2199, 2164, 2166, 2202, 2173, 2206, 2214, 2265, 2172, 2215, 2216, 2171, 2194, 2187, 2188, 2238, 2240, 2241, 2242, 2197, 2243, 2222, 2228, 2236, 2237, 2232, 2244, 2245, 2246, 2233, 2248, 2249, 2239, 2234, 2247, 2229, 2235, 2220, 2250, 2251, 2198, 2255, 2211, 2213, 2254, 2260, 2259, 2261, 2258, 2191, 2262, 2257, 2256, 381: 2253, 2207, 2252, 2212, 2217, 2218, 393: 2176, 1649, 1650, 1648, 452: 2192, 2264, 2183, 2178, 2170, 2181, 2179, 2180, 2219, 2231, 2230, 2223, 2221, 2175, 2186, 2263, 2185, 2182, 2136, 2135, 2134, 2529}, + {2: 743, 743, 743, 743, 7: 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 22: 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 234: 743, 743, 743, 743, 239: 743, 743, 743, 743, 247: 743, 257: 743, 270: 743, 272: 743, 294: 743, 303: 743, 315: 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 381: 743, 743, 743, 743, 743, 743}, // 995 - {21: 2514, 246: 2253, 248: 2251, 250: 2252, 2250, 2248, 470: 2249, 2247}, - {744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 229: 744, 744, 744, 744, 744, 744, 744, 744, 744, 239: 744, 744, 744, 744, 244: 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 268: 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 291: 744, 744, 744, 744, 744, 744, 744, 744, 300: 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 382: 744}, - {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, 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, 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, 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, 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, 229: 747, 747, 747, 747, 747, 747, 747, 747, 747, 239: 747, 747, 747, 747, 244: 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 268: 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 291: 747, 747, 747, 747, 747, 747, 747, 747, 300: 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 382: 747}, - {2: 1722, 1639, 1673, 1640, 7: 2119, 1727, 1666, 1724, 2124, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 2128, 1651, 2121, 2123, 2137, 2138, 2136, 2132, 2139, 2129, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 2130, 1760, 1659, 2120, 1737, 1683, 1700, 2125, 2127, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 2135, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 2126, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 2131, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 2122, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 2117, 2118, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 2140, 1835, 2116, 1840, 1839, 1685, 1842, 1844, 1689, 2133, 2134, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 2141, 2142, 1858, 1852, 1853, 1854, 2172, 230: 2153, 2112, 2184, 2188, 235: 2169, 2168, 2205, 2179, 243: 2144, 266: 2148, 2187, 290: 2156, 299: 2175, 311: 2189, 2110, 2182, 2204, 2206, 2147, 2146, 2163, 2203, 2183, 2180, 2174, 2178, 2143, 2145, 2181, 2152, 2185, 2193, 2244, 2151, 2194, 2195, 2150, 2173, 2166, 2167, 2217, 2219, 2220, 2221, 2176, 2222, 2201, 2207, 2215, 2216, 2211, 2223, 2224, 2225, 2212, 2227, 2228, 2218, 2213, 2226, 2208, 2214, 2199, 2229, 2230, 2177, 2234, 2190, 2192, 2233, 2239, 2238, 2240, 2237, 2170, 2241, 2236, 2235, 2232, 2186, 2231, 2191, 2196, 2197, 389: 2155, 1635, 1636, 1634, 448: 2171, 2243, 2162, 2157, 2149, 2160, 2158, 2159, 2198, 2210, 2209, 2202, 2200, 2154, 2165, 2242, 2164, 2161, 2115, 2114, 2113, 2517}, - {21: 2518, 246: 2253, 248: 2251, 250: 2252, 2250, 2248, 470: 2249, 2247}, + {2: 742, 742, 742, 742, 7: 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 22: 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 234: 742, 742, 742, 742, 239: 742, 742, 742, 742, 247: 742, 257: 742, 270: 742, 272: 742, 294: 742, 303: 742, 315: 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 381: 742, 742, 742, 742, 742, 742}, + {2: 741, 741, 741, 741, 7: 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 22: 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 234: 741, 741, 741, 741, 239: 741, 741, 741, 741, 247: 741, 257: 741, 270: 741, 272: 741, 294: 741, 303: 741, 315: 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 381: 741, 741, 741, 741, 741, 741}, + {250: 2274, 252: 2272, 2273, 2271, 2269, 257: 2533, 474: 2270, 2268}, + {2: 1736, 1653, 1687, 1654, 7: 2140, 1741, 1680, 1738, 2145, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 2149, 1665, 2142, 2144, 1859, 2158, 2159, 2157, 2153, 2160, 1837, 1839, 1838, 2150, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 2151, 1774, 1673, 2141, 1751, 1714, 2146, 2148, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 2156, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 2147, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 2152, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 2143, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 2138, 2139, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 2161, 1853, 2137, 1858, 1857, 1699, 1860, 1862, 1703, 2154, 2155, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 2162, 2163, 1876, 1870, 1871, 1872, 2193, 234: 2174, 2133, 2205, 2209, 239: 2190, 2189, 2226, 2200, 247: 2165, 270: 2169, 272: 2208, 294: 2177, 303: 2196, 315: 2210, 2131, 2203, 2225, 2227, 2168, 2167, 2184, 2224, 2204, 2201, 2195, 2199, 2164, 2166, 2202, 2173, 2206, 2214, 2265, 2172, 2215, 2216, 2171, 2194, 2187, 2188, 2238, 2240, 2241, 2242, 2197, 2243, 2222, 2228, 2236, 2237, 2232, 2244, 2245, 2246, 2233, 2248, 2249, 2239, 2234, 2247, 2229, 2235, 2220, 2250, 2251, 2198, 2255, 2211, 2213, 2254, 2260, 2259, 2261, 2258, 2191, 2262, 2257, 2256, 381: 2253, 2207, 2252, 2212, 2217, 2218, 393: 2176, 1649, 1650, 1648, 452: 2192, 2264, 2183, 2178, 2170, 2181, 2179, 2180, 2219, 2231, 2230, 2223, 2221, 2175, 2186, 2263, 2185, 2182, 2136, 2135, 2134, 2531}, + {21: 2532, 250: 2274, 252: 2272, 2273, 2271, 2269, 474: 2270, 2268}, // 1000 - {746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 229: 746, 746, 746, 746, 746, 746, 746, 746, 746, 239: 746, 746, 746, 746, 244: 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 268: 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 291: 746, 746, 746, 746, 746, 746, 746, 746, 300: 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 382: 746}, - {2: 1722, 1639, 1673, 1640, 7: 2119, 1727, 1666, 1724, 2124, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 2128, 1651, 2121, 2123, 2137, 2138, 2136, 2132, 2139, 2129, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 2130, 1760, 1659, 2120, 1737, 1683, 1700, 2125, 2127, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 2135, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 2126, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 2131, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 2122, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 2117, 2118, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 2140, 1835, 2116, 1840, 1839, 1685, 1842, 1844, 1689, 2133, 2134, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 2141, 2142, 1858, 1852, 1853, 1854, 2172, 230: 2153, 2112, 2184, 2188, 235: 2169, 2168, 2205, 2179, 243: 2144, 266: 2148, 2187, 290: 2156, 299: 2175, 311: 2189, 2110, 2182, 2204, 2206, 2147, 2146, 2163, 2203, 2183, 2180, 2174, 2178, 2143, 2145, 2181, 2152, 2185, 2193, 2244, 2151, 2194, 2195, 2150, 2173, 2166, 2167, 2217, 2219, 2220, 2221, 2176, 2222, 2201, 2207, 2215, 2216, 2211, 2223, 2224, 2225, 2212, 2227, 2228, 2218, 2213, 2226, 2208, 2214, 2199, 2229, 2230, 2177, 2234, 2190, 2192, 2233, 2239, 2238, 2240, 2237, 2170, 2241, 2236, 2235, 2232, 2186, 2231, 2191, 2196, 2197, 389: 2155, 1635, 1636, 1634, 448: 2171, 2243, 2162, 2157, 2149, 2160, 2158, 2159, 2198, 2210, 2209, 2202, 2200, 2154, 2165, 2242, 2164, 2161, 2115, 2114, 2113, 2520}, - {6: 2521, 246: 2253, 248: 2251, 250: 2252, 2250, 2248, 2522, 470: 2249, 2247}, - {2: 1722, 1639, 1673, 1640, 7: 2119, 1727, 1666, 1724, 2124, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 2128, 1651, 2121, 2123, 2137, 2138, 2136, 2132, 2139, 2129, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 2130, 1760, 1659, 2120, 1737, 1683, 1700, 2125, 2127, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 2135, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 2126, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 2131, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 2122, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 2117, 2118, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 2140, 1835, 2116, 1840, 1839, 1685, 1842, 1844, 1689, 2133, 2134, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 2141, 2142, 1858, 1852, 1853, 1854, 2172, 230: 2153, 2112, 2184, 2188, 235: 2169, 2168, 2205, 2179, 243: 2144, 266: 2148, 2187, 290: 2156, 299: 2175, 311: 2189, 2110, 2182, 2204, 2206, 2147, 2146, 2163, 2203, 2183, 2180, 2174, 2178, 2143, 2145, 2181, 2152, 2185, 2193, 2244, 2151, 2194, 2195, 2150, 2173, 2166, 2167, 2217, 2219, 2220, 2221, 2176, 2222, 2201, 2207, 2215, 2216, 2211, 2223, 2224, 2225, 2212, 2227, 2228, 2218, 2213, 2226, 2208, 2214, 2199, 2229, 2230, 2177, 2234, 2190, 2192, 2233, 2239, 2238, 2240, 2237, 2170, 2241, 2236, 2235, 2232, 2186, 2231, 2191, 2196, 2197, 389: 2155, 1635, 1636, 1634, 448: 2171, 2243, 2162, 2157, 2149, 2160, 2158, 2159, 2198, 2210, 2209, 2202, 2200, 2154, 2165, 2242, 2164, 2161, 2115, 2114, 2113, 2528}, - {2: 1722, 1639, 1673, 1640, 7: 2119, 1727, 1666, 1724, 2124, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 2128, 1651, 2121, 2123, 2137, 2138, 2136, 2132, 2139, 2129, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 2130, 1760, 1659, 2120, 1737, 1683, 1700, 2125, 2127, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 2135, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 2126, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 2131, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 2122, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 2117, 2118, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 2140, 1835, 2116, 1840, 1839, 1685, 1842, 1844, 1689, 2133, 2134, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 2141, 2142, 1858, 1852, 1853, 1854, 2172, 230: 2153, 2112, 2184, 2188, 235: 2169, 2168, 2205, 2179, 243: 2144, 266: 2148, 2187, 290: 2156, 299: 2175, 311: 2189, 2110, 2182, 2204, 2206, 2147, 2146, 2163, 2203, 2183, 2180, 2174, 2178, 2143, 2145, 2181, 2152, 2185, 2193, 2244, 2151, 2194, 2195, 2150, 2173, 2166, 2167, 2217, 2219, 2220, 2221, 2176, 2222, 2201, 2207, 2215, 2216, 2211, 2223, 2224, 2225, 2212, 2227, 2228, 2218, 2213, 2226, 2208, 2214, 2199, 2229, 2230, 2177, 2234, 2190, 2192, 2233, 2239, 2238, 2240, 2237, 2170, 2241, 2236, 2235, 2232, 2186, 2231, 2191, 2196, 2197, 389: 2155, 1635, 1636, 1634, 448: 2171, 2243, 2162, 2157, 2149, 2160, 2158, 2159, 2198, 2210, 2209, 2202, 2200, 2154, 2165, 2242, 2164, 2161, 2115, 2114, 2113, 2523}, + {753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 233: 753, 753, 753, 753, 753, 753, 753, 753, 753, 243: 753, 753, 753, 753, 248: 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 271: 753, 273: 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 295: 753, 753, 753, 753, 753, 753, 753, 753, 304: 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 380: 753}, + {2: 1736, 1653, 1687, 1654, 7: 2140, 1741, 1680, 1738, 2145, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 2149, 1665, 2142, 2144, 1859, 2158, 2159, 2157, 2153, 2160, 1837, 1839, 1838, 2150, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 2151, 1774, 1673, 2141, 1751, 1714, 2146, 2148, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 2156, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 2147, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 2152, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 2143, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 2138, 2139, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 2161, 1853, 2137, 1858, 1857, 1699, 1860, 1862, 1703, 2154, 2155, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 2162, 2163, 1876, 1870, 1871, 1872, 2193, 234: 2174, 2133, 2205, 2209, 239: 2190, 2189, 2226, 2200, 247: 2165, 270: 2169, 272: 2208, 294: 2177, 303: 2196, 315: 2210, 2131, 2203, 2225, 2227, 2168, 2167, 2184, 2224, 2204, 2201, 2195, 2199, 2164, 2166, 2202, 2173, 2206, 2214, 2265, 2172, 2215, 2216, 2171, 2194, 2187, 2188, 2238, 2240, 2241, 2242, 2197, 2243, 2222, 2228, 2236, 2237, 2232, 2244, 2245, 2246, 2233, 2248, 2249, 2239, 2234, 2247, 2229, 2235, 2220, 2250, 2251, 2198, 2255, 2211, 2213, 2254, 2260, 2259, 2261, 2258, 2191, 2262, 2257, 2256, 381: 2253, 2207, 2252, 2212, 2217, 2218, 393: 2176, 1649, 1650, 1648, 452: 2192, 2264, 2183, 2178, 2170, 2181, 2179, 2180, 2219, 2231, 2230, 2223, 2221, 2175, 2186, 2263, 2185, 2182, 2136, 2135, 2134, 2534}, + {21: 2535, 250: 2274, 252: 2272, 2273, 2271, 2269, 474: 2270, 2268}, + {752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 233: 752, 752, 752, 752, 752, 752, 752, 752, 752, 243: 752, 752, 752, 752, 248: 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 271: 752, 273: 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 295: 752, 752, 752, 752, 752, 752, 752, 752, 304: 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 380: 752}, + {755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 233: 755, 755, 755, 755, 755, 755, 755, 755, 755, 243: 755, 755, 755, 755, 248: 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 271: 755, 273: 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 295: 755, 755, 755, 755, 755, 755, 755, 755, 304: 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 380: 755}, // 1005 - {21: 2524, 244: 2525, 246: 2253, 248: 2251, 250: 2252, 2250, 2248, 470: 2249, 2247}, - {752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 229: 752, 752, 752, 752, 752, 752, 752, 752, 752, 239: 752, 752, 752, 752, 244: 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 268: 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 291: 752, 752, 752, 752, 752, 752, 752, 752, 300: 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 382: 752}, - {2: 1722, 1639, 1673, 1640, 7: 2119, 1727, 1666, 1724, 2124, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 2128, 1651, 2121, 2123, 2137, 2138, 2136, 2132, 2139, 2129, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 2130, 1760, 1659, 2120, 1737, 1683, 1700, 2125, 2127, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 2135, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 2126, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 2131, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 2122, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 2117, 2118, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 2140, 1835, 2116, 1840, 1839, 1685, 1842, 1844, 1689, 2133, 2134, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 2141, 2142, 1858, 1852, 1853, 1854, 2172, 230: 2153, 2112, 2184, 2188, 235: 2169, 2168, 2205, 2179, 243: 2144, 266: 2148, 2187, 290: 2156, 299: 2175, 311: 2189, 2110, 2182, 2204, 2206, 2147, 2146, 2163, 2203, 2183, 2180, 2174, 2178, 2143, 2145, 2181, 2152, 2185, 2193, 2244, 2151, 2194, 2195, 2150, 2173, 2166, 2167, 2217, 2219, 2220, 2221, 2176, 2222, 2201, 2207, 2215, 2216, 2211, 2223, 2224, 2225, 2212, 2227, 2228, 2218, 2213, 2226, 2208, 2214, 2199, 2229, 2230, 2177, 2234, 2190, 2192, 2233, 2239, 2238, 2240, 2237, 2170, 2241, 2236, 2235, 2232, 2186, 2231, 2191, 2196, 2197, 389: 2155, 1635, 1636, 1634, 448: 2171, 2243, 2162, 2157, 2149, 2160, 2158, 2159, 2198, 2210, 2209, 2202, 2200, 2154, 2165, 2242, 2164, 2161, 2115, 2114, 2113, 2526}, - {21: 2527, 246: 2253, 248: 2251, 250: 2252, 2250, 2248, 470: 2249, 2247}, - {750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 229: 750, 750, 750, 750, 750, 750, 750, 750, 750, 239: 750, 750, 750, 750, 244: 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 268: 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 291: 750, 750, 750, 750, 750, 750, 750, 750, 300: 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 382: 750}, + {2: 1736, 1653, 1687, 1654, 7: 2140, 1741, 1680, 1738, 2145, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 2149, 1665, 2142, 2144, 1859, 2158, 2159, 2157, 2153, 2160, 1837, 1839, 1838, 2150, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 2151, 1774, 1673, 2141, 1751, 1714, 2146, 2148, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 2156, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 2147, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 2152, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 2143, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 2138, 2139, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 2161, 1853, 2137, 1858, 1857, 1699, 1860, 1862, 1703, 2154, 2155, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 2162, 2163, 1876, 1870, 1871, 1872, 2193, 234: 2174, 2133, 2205, 2209, 239: 2190, 2189, 2226, 2200, 247: 2165, 270: 2169, 272: 2208, 294: 2177, 303: 2196, 315: 2210, 2131, 2203, 2225, 2227, 2168, 2167, 2184, 2224, 2204, 2201, 2195, 2199, 2164, 2166, 2202, 2173, 2206, 2214, 2265, 2172, 2215, 2216, 2171, 2194, 2187, 2188, 2238, 2240, 2241, 2242, 2197, 2243, 2222, 2228, 2236, 2237, 2232, 2244, 2245, 2246, 2233, 2248, 2249, 2239, 2234, 2247, 2229, 2235, 2220, 2250, 2251, 2198, 2255, 2211, 2213, 2254, 2260, 2259, 2261, 2258, 2191, 2262, 2257, 2256, 381: 2253, 2207, 2252, 2212, 2217, 2218, 393: 2176, 1649, 1650, 1648, 452: 2192, 2264, 2183, 2178, 2170, 2181, 2179, 2180, 2219, 2231, 2230, 2223, 2221, 2175, 2186, 2263, 2185, 2182, 2136, 2135, 2134, 2538}, + {21: 2539, 250: 2274, 252: 2272, 2273, 2271, 2269, 474: 2270, 2268}, + {754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 233: 754, 754, 754, 754, 754, 754, 754, 754, 754, 243: 754, 754, 754, 754, 248: 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 271: 754, 273: 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 295: 754, 754, 754, 754, 754, 754, 754, 754, 304: 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 380: 754}, + {2: 1736, 1653, 1687, 1654, 7: 2140, 1741, 1680, 1738, 2145, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 2149, 1665, 2142, 2144, 1859, 2158, 2159, 2157, 2153, 2160, 1837, 1839, 1838, 2150, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 2151, 1774, 1673, 2141, 1751, 1714, 2146, 2148, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 2156, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 2147, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 2152, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 2143, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 2138, 2139, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 2161, 1853, 2137, 1858, 1857, 1699, 1860, 1862, 1703, 2154, 2155, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 2162, 2163, 1876, 1870, 1871, 1872, 2193, 234: 2174, 2133, 2205, 2209, 239: 2190, 2189, 2226, 2200, 247: 2165, 270: 2169, 272: 2208, 294: 2177, 303: 2196, 315: 2210, 2131, 2203, 2225, 2227, 2168, 2167, 2184, 2224, 2204, 2201, 2195, 2199, 2164, 2166, 2202, 2173, 2206, 2214, 2265, 2172, 2215, 2216, 2171, 2194, 2187, 2188, 2238, 2240, 2241, 2242, 2197, 2243, 2222, 2228, 2236, 2237, 2232, 2244, 2245, 2246, 2233, 2248, 2249, 2239, 2234, 2247, 2229, 2235, 2220, 2250, 2251, 2198, 2255, 2211, 2213, 2254, 2260, 2259, 2261, 2258, 2191, 2262, 2257, 2256, 381: 2253, 2207, 2252, 2212, 2217, 2218, 393: 2176, 1649, 1650, 1648, 452: 2192, 2264, 2183, 2178, 2170, 2181, 2179, 2180, 2219, 2231, 2230, 2223, 2221, 2175, 2186, 2263, 2185, 2182, 2136, 2135, 2134, 2541}, + {6: 2542, 250: 2274, 252: 2272, 2273, 2271, 2269, 257: 2543, 474: 2270, 2268}, // 1010 - {6: 2530, 21: 2529, 246: 2253, 248: 2251, 250: 2252, 2250, 2248, 470: 2249, 2247}, - {753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 229: 753, 753, 753, 753, 753, 753, 753, 753, 753, 239: 753, 753, 753, 753, 244: 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 268: 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 291: 753, 753, 753, 753, 753, 753, 753, 753, 300: 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 382: 753}, - {2: 1722, 1639, 1673, 1640, 7: 2119, 1727, 1666, 1724, 2124, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 2128, 1651, 2121, 2123, 2137, 2138, 2136, 2132, 2139, 2129, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 2130, 1760, 1659, 2120, 1737, 1683, 1700, 2125, 2127, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 2135, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 2126, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 2131, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 2122, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 2117, 2118, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 2140, 1835, 2116, 1840, 1839, 1685, 1842, 1844, 1689, 2133, 2134, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 2141, 2142, 1858, 1852, 1853, 1854, 2172, 230: 2153, 2112, 2184, 2188, 235: 2169, 2168, 2205, 2179, 243: 2144, 266: 2148, 2187, 290: 2156, 299: 2175, 311: 2189, 2110, 2182, 2204, 2206, 2147, 2146, 2163, 2203, 2183, 2180, 2174, 2178, 2143, 2145, 2181, 2152, 2185, 2193, 2244, 2151, 2194, 2195, 2150, 2173, 2166, 2167, 2217, 2219, 2220, 2221, 2176, 2222, 2201, 2207, 2215, 2216, 2211, 2223, 2224, 2225, 2212, 2227, 2228, 2218, 2213, 2226, 2208, 2214, 2199, 2229, 2230, 2177, 2234, 2190, 2192, 2233, 2239, 2238, 2240, 2237, 2170, 2241, 2236, 2235, 2232, 2186, 2231, 2191, 2196, 2197, 389: 2155, 1635, 1636, 1634, 448: 2171, 2243, 2162, 2157, 2149, 2160, 2158, 2159, 2198, 2210, 2209, 2202, 2200, 2154, 2165, 2242, 2164, 2161, 2115, 2114, 2113, 2531}, - {21: 2532, 246: 2253, 248: 2251, 250: 2252, 2250, 2248, 470: 2249, 2247}, - {751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 229: 751, 751, 751, 751, 751, 751, 751, 751, 751, 239: 751, 751, 751, 751, 244: 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 268: 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 291: 751, 751, 751, 751, 751, 751, 751, 751, 300: 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 382: 751}, + {2: 1736, 1653, 1687, 1654, 7: 2140, 1741, 1680, 1738, 2145, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 2149, 1665, 2142, 2144, 1859, 2158, 2159, 2157, 2153, 2160, 1837, 1839, 1838, 2150, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 2151, 1774, 1673, 2141, 1751, 1714, 2146, 2148, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 2156, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 2147, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 2152, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 2143, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 2138, 2139, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 2161, 1853, 2137, 1858, 1857, 1699, 1860, 1862, 1703, 2154, 2155, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 2162, 2163, 1876, 1870, 1871, 1872, 2193, 234: 2174, 2133, 2205, 2209, 239: 2190, 2189, 2226, 2200, 247: 2165, 270: 2169, 272: 2208, 294: 2177, 303: 2196, 315: 2210, 2131, 2203, 2225, 2227, 2168, 2167, 2184, 2224, 2204, 2201, 2195, 2199, 2164, 2166, 2202, 2173, 2206, 2214, 2265, 2172, 2215, 2216, 2171, 2194, 2187, 2188, 2238, 2240, 2241, 2242, 2197, 2243, 2222, 2228, 2236, 2237, 2232, 2244, 2245, 2246, 2233, 2248, 2249, 2239, 2234, 2247, 2229, 2235, 2220, 2250, 2251, 2198, 2255, 2211, 2213, 2254, 2260, 2259, 2261, 2258, 2191, 2262, 2257, 2256, 381: 2253, 2207, 2252, 2212, 2217, 2218, 393: 2176, 1649, 1650, 1648, 452: 2192, 2264, 2183, 2178, 2170, 2181, 2179, 2180, 2219, 2231, 2230, 2223, 2221, 2175, 2186, 2263, 2185, 2182, 2136, 2135, 2134, 2549}, + {2: 1736, 1653, 1687, 1654, 7: 2140, 1741, 1680, 1738, 2145, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 2149, 1665, 2142, 2144, 1859, 2158, 2159, 2157, 2153, 2160, 1837, 1839, 1838, 2150, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 2151, 1774, 1673, 2141, 1751, 1714, 2146, 2148, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 2156, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 2147, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 2152, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 2143, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 2138, 2139, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 2161, 1853, 2137, 1858, 1857, 1699, 1860, 1862, 1703, 2154, 2155, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 2162, 2163, 1876, 1870, 1871, 1872, 2193, 234: 2174, 2133, 2205, 2209, 239: 2190, 2189, 2226, 2200, 247: 2165, 270: 2169, 272: 2208, 294: 2177, 303: 2196, 315: 2210, 2131, 2203, 2225, 2227, 2168, 2167, 2184, 2224, 2204, 2201, 2195, 2199, 2164, 2166, 2202, 2173, 2206, 2214, 2265, 2172, 2215, 2216, 2171, 2194, 2187, 2188, 2238, 2240, 2241, 2242, 2197, 2243, 2222, 2228, 2236, 2237, 2232, 2244, 2245, 2246, 2233, 2248, 2249, 2239, 2234, 2247, 2229, 2235, 2220, 2250, 2251, 2198, 2255, 2211, 2213, 2254, 2260, 2259, 2261, 2258, 2191, 2262, 2257, 2256, 381: 2253, 2207, 2252, 2212, 2217, 2218, 393: 2176, 1649, 1650, 1648, 452: 2192, 2264, 2183, 2178, 2170, 2181, 2179, 2180, 2219, 2231, 2230, 2223, 2221, 2175, 2186, 2263, 2185, 2182, 2136, 2135, 2134, 2544}, + {21: 2545, 248: 2546, 250: 2274, 252: 2272, 2273, 2271, 2269, 474: 2270, 2268}, + {760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 233: 760, 760, 760, 760, 760, 760, 760, 760, 760, 243: 760, 760, 760, 760, 248: 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 271: 760, 273: 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 295: 760, 760, 760, 760, 760, 760, 760, 760, 304: 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 380: 760}, + {2: 1736, 1653, 1687, 1654, 7: 2140, 1741, 1680, 1738, 2145, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 2149, 1665, 2142, 2144, 1859, 2158, 2159, 2157, 2153, 2160, 1837, 1839, 1838, 2150, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 2151, 1774, 1673, 2141, 1751, 1714, 2146, 2148, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 2156, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 2147, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 2152, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 2143, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 2138, 2139, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 2161, 1853, 2137, 1858, 1857, 1699, 1860, 1862, 1703, 2154, 2155, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 2162, 2163, 1876, 1870, 1871, 1872, 2193, 234: 2174, 2133, 2205, 2209, 239: 2190, 2189, 2226, 2200, 247: 2165, 270: 2169, 272: 2208, 294: 2177, 303: 2196, 315: 2210, 2131, 2203, 2225, 2227, 2168, 2167, 2184, 2224, 2204, 2201, 2195, 2199, 2164, 2166, 2202, 2173, 2206, 2214, 2265, 2172, 2215, 2216, 2171, 2194, 2187, 2188, 2238, 2240, 2241, 2242, 2197, 2243, 2222, 2228, 2236, 2237, 2232, 2244, 2245, 2246, 2233, 2248, 2249, 2239, 2234, 2247, 2229, 2235, 2220, 2250, 2251, 2198, 2255, 2211, 2213, 2254, 2260, 2259, 2261, 2258, 2191, 2262, 2257, 2256, 381: 2253, 2207, 2252, 2212, 2217, 2218, 393: 2176, 1649, 1650, 1648, 452: 2192, 2264, 2183, 2178, 2170, 2181, 2179, 2180, 2219, 2231, 2230, 2223, 2221, 2175, 2186, 2263, 2185, 2182, 2136, 2135, 2134, 2547}, // 1015 - {2: 1722, 1639, 1673, 1640, 7: 2119, 1727, 1666, 1724, 2124, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 2128, 1651, 2121, 2123, 2137, 2138, 2136, 2132, 2139, 2129, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 2130, 1760, 1659, 2120, 1737, 1683, 1700, 2125, 2127, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 2135, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 2126, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 2131, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 2122, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 2117, 2118, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 2140, 1835, 2116, 1840, 1839, 1685, 1842, 1844, 1689, 2133, 2134, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 2141, 2142, 1858, 1852, 1853, 1854, 2172, 230: 2153, 232: 2184, 2188, 235: 2169, 2168, 2205, 2179, 243: 2144, 266: 2148, 2187, 290: 2156, 299: 2175, 311: 2189, 2256, 2182, 2204, 2206, 2147, 2146, 2163, 2203, 2183, 2180, 2174, 2178, 2143, 2145, 2181, 2152, 2185, 2193, 2244, 2151, 2194, 2195, 2150, 2173, 2166, 2167, 2217, 2219, 2220, 2221, 2176, 2222, 2201, 2207, 2215, 2216, 2211, 2223, 2224, 2225, 2212, 2227, 2228, 2218, 2213, 2226, 2208, 2214, 2199, 2229, 2230, 2177, 2234, 2190, 2192, 2233, 2239, 2238, 2240, 2237, 2170, 2241, 2236, 2235, 2232, 2186, 2231, 2191, 2196, 2197, 389: 2155, 1635, 1636, 1634, 448: 2171, 2243, 2162, 2157, 2149, 2160, 2158, 2159, 2198, 2210, 2209, 2202, 2200, 2154, 2165, 2242, 2164, 2161, 2534}, - {235: 2539, 2540, 2545, 269: 2541, 288: 2547, 301: 2543, 2536, 2542, 2546, 2535, 2544, 2537, 2538}, - {2: 1722, 1639, 1673, 1640, 7: 2119, 1727, 1666, 1724, 2124, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 2128, 1651, 2121, 2123, 2137, 2138, 2136, 2132, 2139, 2129, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 2130, 1760, 1659, 2120, 1737, 1683, 1700, 2125, 2127, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 2135, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 2126, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 2131, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 2122, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 2117, 2118, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 2140, 1835, 2116, 1840, 1839, 1685, 1842, 1844, 1689, 2133, 2134, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 2141, 2142, 1858, 1852, 1853, 1854, 2172, 230: 2153, 232: 2184, 2188, 235: 2169, 2168, 2205, 2179, 243: 2144, 266: 2148, 2187, 290: 2156, 299: 2175, 311: 2189, 2256, 2182, 2204, 2206, 2147, 2146, 2163, 2203, 2183, 2180, 2174, 2178, 2143, 2145, 2181, 2152, 2185, 2193, 2244, 2151, 2194, 2195, 2150, 2173, 2166, 2167, 2217, 2219, 2220, 2221, 2176, 2222, 2201, 2207, 2215, 2216, 2211, 2223, 2224, 2225, 2212, 2227, 2228, 2218, 2213, 2226, 2208, 2214, 2199, 2229, 2230, 2177, 2234, 2190, 2192, 2233, 2239, 2238, 2240, 2237, 2170, 2241, 2236, 2235, 2232, 2186, 2231, 2191, 2196, 2197, 389: 2155, 1635, 1636, 1634, 448: 2171, 2243, 2162, 2157, 2149, 2160, 2158, 2159, 2198, 2210, 2209, 2202, 2200, 2154, 2165, 2242, 2164, 2161, 2567}, - {2: 1722, 1639, 1673, 1640, 7: 2119, 1727, 1666, 1724, 2124, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 2128, 1651, 2121, 2123, 2137, 2138, 2136, 2132, 2139, 2129, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 2130, 1760, 1659, 2120, 1737, 1683, 1700, 2125, 2127, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 2135, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 2126, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 2131, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 2122, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 2117, 2118, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 2140, 1835, 2116, 1840, 1839, 1685, 1842, 1844, 1689, 2133, 2134, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 2141, 2142, 1858, 1852, 1853, 1854, 2172, 230: 2153, 232: 2184, 2188, 235: 2169, 2168, 2205, 2179, 243: 2144, 266: 2148, 2187, 290: 2156, 299: 2175, 311: 2189, 2256, 2182, 2204, 2206, 2147, 2146, 2163, 2203, 2183, 2180, 2174, 2178, 2143, 2145, 2181, 2152, 2185, 2193, 2244, 2151, 2194, 2195, 2150, 2173, 2166, 2167, 2217, 2219, 2220, 2221, 2176, 2222, 2201, 2207, 2215, 2216, 2211, 2223, 2224, 2225, 2212, 2227, 2228, 2218, 2213, 2226, 2208, 2214, 2199, 2229, 2230, 2177, 2234, 2190, 2192, 2233, 2239, 2238, 2240, 2237, 2170, 2241, 2236, 2235, 2232, 2186, 2231, 2191, 2196, 2197, 389: 2155, 1635, 1636, 1634, 448: 2171, 2243, 2162, 2157, 2149, 2160, 2158, 2159, 2198, 2210, 2209, 2202, 2200, 2154, 2165, 2242, 2164, 2161, 2566}, - {2: 1722, 1639, 1673, 1640, 7: 2119, 1727, 1666, 1724, 2124, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 2128, 1651, 2121, 2123, 2137, 2138, 2136, 2132, 2139, 2129, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 2130, 1760, 1659, 2120, 1737, 1683, 1700, 2125, 2127, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 2135, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 2126, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 2131, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 2122, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 2117, 2118, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 2140, 1835, 2116, 1840, 1839, 1685, 1842, 1844, 1689, 2133, 2134, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 2141, 2142, 1858, 1852, 1853, 1854, 2172, 230: 2153, 232: 2184, 2188, 235: 2169, 2168, 2205, 2179, 243: 2144, 266: 2148, 2187, 290: 2156, 299: 2175, 311: 2189, 2256, 2182, 2204, 2206, 2147, 2146, 2163, 2203, 2183, 2180, 2174, 2178, 2143, 2145, 2181, 2152, 2185, 2193, 2244, 2151, 2194, 2195, 2150, 2173, 2166, 2167, 2217, 2219, 2220, 2221, 2176, 2222, 2201, 2207, 2215, 2216, 2211, 2223, 2224, 2225, 2212, 2227, 2228, 2218, 2213, 2226, 2208, 2214, 2199, 2229, 2230, 2177, 2234, 2190, 2192, 2233, 2239, 2238, 2240, 2237, 2170, 2241, 2236, 2235, 2232, 2186, 2231, 2191, 2196, 2197, 389: 2155, 1635, 1636, 1634, 448: 2171, 2243, 2162, 2157, 2149, 2160, 2158, 2159, 2198, 2210, 2209, 2202, 2200, 2154, 2165, 2242, 2164, 2161, 2565}, + {21: 2548, 250: 2274, 252: 2272, 2273, 2271, 2269, 474: 2270, 2268}, + {758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 233: 758, 758, 758, 758, 758, 758, 758, 758, 758, 243: 758, 758, 758, 758, 248: 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 271: 758, 273: 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 295: 758, 758, 758, 758, 758, 758, 758, 758, 304: 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 380: 758}, + {6: 2551, 21: 2550, 250: 2274, 252: 2272, 2273, 2271, 2269, 474: 2270, 2268}, + {761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 233: 761, 761, 761, 761, 761, 761, 761, 761, 761, 243: 761, 761, 761, 761, 248: 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 271: 761, 273: 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 295: 761, 761, 761, 761, 761, 761, 761, 761, 304: 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 380: 761}, + {2: 1736, 1653, 1687, 1654, 7: 2140, 1741, 1680, 1738, 2145, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 2149, 1665, 2142, 2144, 1859, 2158, 2159, 2157, 2153, 2160, 1837, 1839, 1838, 2150, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 2151, 1774, 1673, 2141, 1751, 1714, 2146, 2148, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 2156, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 2147, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 2152, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 2143, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 2138, 2139, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 2161, 1853, 2137, 1858, 1857, 1699, 1860, 1862, 1703, 2154, 2155, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 2162, 2163, 1876, 1870, 1871, 1872, 2193, 234: 2174, 2133, 2205, 2209, 239: 2190, 2189, 2226, 2200, 247: 2165, 270: 2169, 272: 2208, 294: 2177, 303: 2196, 315: 2210, 2131, 2203, 2225, 2227, 2168, 2167, 2184, 2224, 2204, 2201, 2195, 2199, 2164, 2166, 2202, 2173, 2206, 2214, 2265, 2172, 2215, 2216, 2171, 2194, 2187, 2188, 2238, 2240, 2241, 2242, 2197, 2243, 2222, 2228, 2236, 2237, 2232, 2244, 2245, 2246, 2233, 2248, 2249, 2239, 2234, 2247, 2229, 2235, 2220, 2250, 2251, 2198, 2255, 2211, 2213, 2254, 2260, 2259, 2261, 2258, 2191, 2262, 2257, 2256, 381: 2253, 2207, 2252, 2212, 2217, 2218, 393: 2176, 1649, 1650, 1648, 452: 2192, 2264, 2183, 2178, 2170, 2181, 2179, 2180, 2219, 2231, 2230, 2223, 2221, 2175, 2186, 2263, 2185, 2182, 2136, 2135, 2134, 2552}, // 1020 - {2: 1722, 1639, 1673, 1640, 7: 2119, 1727, 1666, 1724, 2124, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 2128, 1651, 2121, 2123, 2137, 2138, 2136, 2132, 2139, 2129, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 2130, 1760, 1659, 2120, 1737, 1683, 1700, 2125, 2127, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 2135, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 2126, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 2131, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 2122, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 2117, 2118, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 2140, 1835, 2116, 1840, 1839, 1685, 1842, 1844, 1689, 2133, 2134, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 2141, 2142, 1858, 1852, 1853, 1854, 2172, 230: 2153, 232: 2184, 2188, 235: 2169, 2168, 2205, 2179, 243: 2144, 266: 2148, 2187, 290: 2156, 299: 2175, 311: 2189, 2256, 2182, 2204, 2206, 2147, 2146, 2163, 2203, 2183, 2180, 2174, 2178, 2143, 2145, 2181, 2152, 2185, 2193, 2244, 2151, 2194, 2195, 2150, 2173, 2166, 2167, 2217, 2219, 2220, 2221, 2176, 2222, 2201, 2207, 2215, 2216, 2211, 2223, 2224, 2225, 2212, 2227, 2228, 2218, 2213, 2226, 2208, 2214, 2199, 2229, 2230, 2177, 2234, 2190, 2192, 2233, 2239, 2238, 2240, 2237, 2170, 2241, 2236, 2235, 2232, 2186, 2231, 2191, 2196, 2197, 389: 2155, 1635, 1636, 1634, 448: 2171, 2243, 2162, 2157, 2149, 2160, 2158, 2159, 2198, 2210, 2209, 2202, 2200, 2154, 2165, 2242, 2164, 2161, 2564}, - {2: 1722, 1639, 1673, 1640, 7: 2119, 1727, 1666, 1724, 2124, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 2128, 1651, 2121, 2123, 2137, 2138, 2136, 2132, 2139, 2129, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 2130, 1760, 1659, 2120, 1737, 1683, 1700, 2125, 2127, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 2135, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 2126, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 2131, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 2122, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 2117, 2118, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 2140, 1835, 2116, 1840, 1839, 1685, 1842, 1844, 1689, 2133, 2134, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 2141, 2142, 1858, 1852, 1853, 1854, 2172, 230: 2153, 232: 2184, 2188, 235: 2169, 2168, 2205, 2179, 243: 2144, 266: 2148, 2187, 290: 2156, 299: 2175, 311: 2189, 2256, 2182, 2204, 2206, 2147, 2146, 2163, 2203, 2561, 2180, 2174, 2178, 2143, 2145, 2181, 2152, 2185, 2193, 2244, 2151, 2194, 2195, 2150, 2173, 2166, 2167, 2217, 2219, 2220, 2221, 2176, 2222, 2201, 2207, 2215, 2216, 2211, 2223, 2224, 2225, 2212, 2227, 2228, 2218, 2213, 2226, 2208, 2214, 2199, 2229, 2230, 2177, 2234, 2190, 2192, 2233, 2239, 2238, 2240, 2237, 2170, 2241, 2236, 2235, 2232, 2186, 2231, 2191, 2196, 2197, 389: 2155, 1635, 1636, 1634, 448: 2171, 2243, 2162, 2157, 2149, 2160, 2158, 2159, 2198, 2210, 2209, 2202, 2200, 2154, 2165, 2242, 2164, 2161, 2560}, - {2: 1722, 1639, 1673, 1640, 7: 2119, 1727, 1666, 1724, 2124, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 2128, 1651, 2121, 2123, 2137, 2138, 2136, 2132, 2139, 2129, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 2130, 1760, 1659, 2120, 1737, 1683, 1700, 2125, 2127, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 2135, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 2126, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 2131, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 2122, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 2117, 2118, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 2140, 1835, 2116, 1840, 1839, 1685, 1842, 1844, 1689, 2133, 2134, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 2141, 2142, 1858, 1852, 1853, 1854, 2172, 230: 2153, 232: 2184, 2188, 235: 2169, 2168, 2205, 2179, 243: 2144, 266: 2148, 2187, 290: 2156, 299: 2175, 311: 2189, 2256, 2182, 2204, 2206, 2147, 2146, 2163, 2203, 2557, 2180, 2174, 2178, 2143, 2145, 2181, 2152, 2185, 2193, 2244, 2151, 2194, 2195, 2150, 2173, 2166, 2167, 2217, 2219, 2220, 2221, 2176, 2222, 2201, 2207, 2215, 2216, 2211, 2223, 2224, 2225, 2212, 2227, 2228, 2218, 2213, 2226, 2208, 2214, 2199, 2229, 2230, 2177, 2234, 2190, 2192, 2233, 2239, 2238, 2240, 2237, 2170, 2241, 2236, 2235, 2232, 2186, 2231, 2191, 2196, 2197, 389: 2155, 1635, 1636, 1634, 448: 2171, 2243, 2162, 2157, 2149, 2160, 2158, 2159, 2198, 2210, 2209, 2202, 2200, 2154, 2165, 2242, 2164, 2161, 2556}, - {2: 1722, 1639, 1673, 1640, 7: 2119, 1727, 1666, 1724, 2124, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 2128, 1651, 2121, 2123, 2137, 2138, 2136, 2132, 2139, 2129, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 2130, 1760, 1659, 2120, 1737, 1683, 1700, 2125, 2127, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 2135, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 2126, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 2131, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 2122, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 2117, 2118, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 2140, 1835, 2116, 1840, 1839, 1685, 1842, 1844, 1689, 2133, 2134, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 2141, 2142, 1858, 1852, 1853, 1854, 2172, 230: 2153, 232: 2184, 2188, 235: 2169, 2168, 2205, 2179, 243: 2144, 266: 2148, 2187, 290: 2156, 299: 2175, 311: 2189, 2256, 2182, 2204, 2206, 2147, 2146, 2163, 2203, 2183, 2180, 2174, 2178, 2143, 2145, 2181, 2152, 2185, 2193, 2244, 2151, 2194, 2195, 2150, 2173, 2166, 2167, 2217, 2219, 2220, 2221, 2176, 2222, 2201, 2207, 2215, 2216, 2211, 2223, 2224, 2225, 2212, 2227, 2228, 2218, 2213, 2226, 2208, 2214, 2199, 2229, 2230, 2177, 2234, 2190, 2192, 2233, 2239, 2238, 2240, 2237, 2170, 2241, 2236, 2235, 2232, 2186, 2231, 2191, 2196, 2197, 389: 2155, 1635, 1636, 1634, 448: 2171, 2243, 2162, 2157, 2149, 2160, 2158, 2159, 2198, 2210, 2209, 2202, 2200, 2154, 2165, 2242, 2164, 2161, 2555}, - {2: 1722, 1639, 1673, 1640, 7: 2119, 1727, 1666, 1724, 2124, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 2128, 1651, 2121, 2123, 2137, 2138, 2136, 2132, 2139, 2129, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 2130, 1760, 1659, 2120, 1737, 1683, 1700, 2125, 2127, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 2135, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 2126, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 2131, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 2122, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 2117, 2118, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 2140, 1835, 2116, 1840, 1839, 1685, 1842, 1844, 1689, 2133, 2134, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 2141, 2142, 1858, 1852, 1853, 1854, 2172, 230: 2153, 232: 2184, 2188, 235: 2169, 2168, 2205, 2179, 243: 2144, 266: 2148, 2187, 290: 2156, 299: 2175, 311: 2189, 2256, 2182, 2204, 2206, 2147, 2146, 2163, 2203, 2183, 2180, 2174, 2178, 2143, 2145, 2181, 2152, 2185, 2193, 2244, 2151, 2194, 2195, 2150, 2173, 2166, 2167, 2217, 2219, 2220, 2221, 2176, 2222, 2201, 2207, 2215, 2216, 2211, 2223, 2224, 2225, 2212, 2227, 2228, 2218, 2213, 2226, 2208, 2214, 2199, 2229, 2230, 2177, 2234, 2190, 2192, 2233, 2239, 2238, 2240, 2237, 2170, 2241, 2236, 2235, 2232, 2186, 2231, 2191, 2196, 2197, 389: 2155, 1635, 1636, 1634, 448: 2171, 2243, 2162, 2157, 2149, 2160, 2158, 2159, 2198, 2210, 2209, 2202, 2200, 2154, 2165, 2242, 2164, 2161, 2554}, + {21: 2553, 250: 2274, 252: 2272, 2273, 2271, 2269, 474: 2270, 2268}, + {759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 233: 759, 759, 759, 759, 759, 759, 759, 759, 759, 243: 759, 759, 759, 759, 248: 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 271: 759, 273: 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 295: 759, 759, 759, 759, 759, 759, 759, 759, 304: 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 380: 759}, + {2: 1736, 1653, 1687, 1654, 7: 2140, 1741, 1680, 1738, 2145, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 2149, 1665, 2142, 2144, 1859, 2158, 2159, 2157, 2153, 2160, 1837, 1839, 1838, 2150, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 2151, 1774, 1673, 2141, 1751, 1714, 2146, 2148, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 2156, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 2147, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 2152, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 2143, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 2138, 2139, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 2161, 1853, 2137, 1858, 1857, 1699, 1860, 1862, 1703, 2154, 2155, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 2162, 2163, 1876, 1870, 1871, 1872, 2193, 234: 2174, 236: 2205, 2209, 239: 2190, 2189, 2226, 2200, 247: 2165, 270: 2169, 272: 2208, 294: 2177, 303: 2196, 315: 2210, 2277, 2203, 2225, 2227, 2168, 2167, 2184, 2224, 2204, 2201, 2195, 2199, 2164, 2166, 2202, 2173, 2206, 2214, 2265, 2172, 2215, 2216, 2171, 2194, 2187, 2188, 2238, 2240, 2241, 2242, 2197, 2243, 2222, 2228, 2236, 2237, 2232, 2244, 2245, 2246, 2233, 2248, 2249, 2239, 2234, 2247, 2229, 2235, 2220, 2250, 2251, 2198, 2255, 2211, 2213, 2254, 2260, 2259, 2261, 2258, 2191, 2262, 2257, 2256, 381: 2253, 2207, 2252, 2212, 2217, 2218, 393: 2176, 1649, 1650, 1648, 452: 2192, 2264, 2183, 2178, 2170, 2181, 2179, 2180, 2219, 2231, 2230, 2223, 2221, 2175, 2186, 2263, 2185, 2182, 2555}, + {239: 2560, 2561, 2566, 273: 2562, 292: 2568, 305: 2564, 2557, 2563, 2567, 2556, 2565, 2558, 2559}, + {2: 1736, 1653, 1687, 1654, 7: 2140, 1741, 1680, 1738, 2145, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 2149, 1665, 2142, 2144, 1859, 2158, 2159, 2157, 2153, 2160, 1837, 1839, 1838, 2150, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 2151, 1774, 1673, 2141, 1751, 1714, 2146, 2148, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 2156, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 2147, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 2152, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 2143, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 2138, 2139, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 2161, 1853, 2137, 1858, 1857, 1699, 1860, 1862, 1703, 2154, 2155, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 2162, 2163, 1876, 1870, 1871, 1872, 2193, 234: 2174, 236: 2205, 2209, 239: 2190, 2189, 2226, 2200, 247: 2165, 270: 2169, 272: 2208, 294: 2177, 303: 2196, 315: 2210, 2277, 2203, 2225, 2227, 2168, 2167, 2184, 2224, 2204, 2201, 2195, 2199, 2164, 2166, 2202, 2173, 2206, 2214, 2265, 2172, 2215, 2216, 2171, 2194, 2187, 2188, 2238, 2240, 2241, 2242, 2197, 2243, 2222, 2228, 2236, 2237, 2232, 2244, 2245, 2246, 2233, 2248, 2249, 2239, 2234, 2247, 2229, 2235, 2220, 2250, 2251, 2198, 2255, 2211, 2213, 2254, 2260, 2259, 2261, 2258, 2191, 2262, 2257, 2256, 381: 2253, 2207, 2252, 2212, 2217, 2218, 393: 2176, 1649, 1650, 1648, 452: 2192, 2264, 2183, 2178, 2170, 2181, 2179, 2180, 2219, 2231, 2230, 2223, 2221, 2175, 2186, 2263, 2185, 2182, 2588}, // 1025 - {2: 1722, 1639, 1673, 1640, 7: 2119, 1727, 1666, 1724, 2124, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 2128, 1651, 2121, 2123, 2137, 2138, 2136, 2132, 2139, 2129, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 2130, 1760, 1659, 2120, 1737, 1683, 1700, 2125, 2127, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 2135, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 2126, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 2131, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 2122, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 2117, 2118, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 2140, 1835, 2116, 1840, 1839, 1685, 1842, 1844, 1689, 2133, 2134, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 2141, 2142, 1858, 1852, 1853, 1854, 2172, 230: 2153, 232: 2184, 2188, 235: 2169, 2168, 2205, 2179, 243: 2144, 266: 2148, 2187, 290: 2156, 299: 2175, 311: 2189, 2256, 2182, 2204, 2206, 2147, 2146, 2163, 2203, 2183, 2180, 2174, 2178, 2143, 2145, 2181, 2152, 2185, 2193, 2244, 2151, 2194, 2195, 2150, 2173, 2166, 2167, 2217, 2219, 2220, 2221, 2176, 2222, 2201, 2207, 2215, 2216, 2211, 2223, 2224, 2225, 2212, 2227, 2228, 2218, 2213, 2226, 2208, 2214, 2199, 2229, 2230, 2177, 2234, 2190, 2192, 2233, 2239, 2238, 2240, 2237, 2170, 2241, 2236, 2235, 2232, 2186, 2231, 2191, 2196, 2197, 389: 2155, 1635, 1636, 1634, 448: 2171, 2243, 2162, 2157, 2149, 2160, 2158, 2159, 2198, 2210, 2209, 2202, 2200, 2154, 2165, 2242, 2164, 2161, 2553}, - {2: 1722, 1639, 1673, 1640, 7: 2119, 1727, 1666, 1724, 2124, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 2128, 1651, 2121, 2123, 2137, 2138, 2136, 2132, 2139, 2129, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 2130, 1760, 1659, 2120, 1737, 1683, 1700, 2125, 2127, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 2135, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 2126, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 2131, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 2122, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 2117, 2118, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 2140, 1835, 2116, 1840, 1839, 1685, 1842, 1844, 1689, 2133, 2134, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 2141, 2142, 1858, 1852, 1853, 1854, 2172, 230: 2153, 232: 2184, 2188, 235: 2169, 2168, 2205, 2179, 243: 2144, 266: 2148, 2187, 290: 2156, 299: 2175, 311: 2189, 2256, 2182, 2204, 2206, 2147, 2146, 2163, 2203, 2183, 2180, 2174, 2178, 2143, 2145, 2181, 2152, 2185, 2193, 2244, 2151, 2194, 2195, 2150, 2173, 2166, 2167, 2217, 2219, 2220, 2221, 2176, 2222, 2201, 2207, 2215, 2216, 2211, 2223, 2224, 2225, 2212, 2227, 2228, 2218, 2213, 2226, 2208, 2214, 2199, 2229, 2230, 2177, 2234, 2190, 2192, 2233, 2239, 2238, 2240, 2237, 2170, 2241, 2236, 2235, 2232, 2186, 2231, 2191, 2196, 2197, 389: 2155, 1635, 1636, 1634, 448: 2171, 2243, 2162, 2157, 2149, 2160, 2158, 2159, 2198, 2210, 2209, 2202, 2200, 2154, 2165, 2242, 2164, 2161, 2552}, - {2: 1722, 1639, 1673, 1640, 7: 2119, 1727, 1666, 1724, 2124, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 2128, 1651, 2121, 2123, 2137, 2138, 2136, 2132, 2139, 2129, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 2130, 1760, 1659, 2120, 1737, 1683, 1700, 2125, 2127, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 2135, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 2126, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 2131, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 2122, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 2117, 2118, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 2140, 1835, 2116, 1840, 1839, 1685, 1842, 1844, 1689, 2133, 2134, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 2141, 2142, 1858, 1852, 1853, 1854, 2172, 230: 2153, 232: 2184, 2188, 235: 2169, 2168, 2205, 2179, 243: 2144, 266: 2148, 2187, 290: 2156, 299: 2175, 311: 2189, 2256, 2182, 2204, 2206, 2147, 2146, 2163, 2203, 2183, 2180, 2174, 2178, 2143, 2145, 2181, 2152, 2185, 2193, 2244, 2151, 2194, 2195, 2150, 2173, 2166, 2167, 2217, 2219, 2220, 2221, 2176, 2222, 2201, 2207, 2215, 2216, 2211, 2223, 2224, 2225, 2212, 2227, 2228, 2218, 2213, 2226, 2208, 2214, 2199, 2229, 2230, 2177, 2234, 2190, 2192, 2233, 2239, 2238, 2240, 2237, 2170, 2241, 2236, 2235, 2232, 2186, 2231, 2191, 2196, 2197, 389: 2155, 1635, 1636, 1634, 448: 2171, 2243, 2162, 2157, 2149, 2160, 2158, 2159, 2198, 2210, 2209, 2202, 2200, 2154, 2165, 2242, 2164, 2161, 2551}, - {2: 1722, 1639, 1673, 1640, 7: 2119, 1727, 1666, 1724, 2124, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 2128, 1651, 2121, 2123, 2137, 2138, 2136, 2132, 2139, 2129, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 2130, 1760, 1659, 2120, 1737, 1683, 1700, 2125, 2127, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 2135, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 2126, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 2131, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 2122, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 2117, 2118, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 2140, 1835, 2116, 1840, 1839, 1685, 1842, 1844, 1689, 2133, 2134, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 2141, 2142, 1858, 1852, 1853, 1854, 2172, 230: 2153, 232: 2184, 2188, 235: 2169, 2168, 2205, 2179, 243: 2144, 266: 2148, 2187, 290: 2156, 299: 2175, 311: 2189, 2256, 2182, 2204, 2206, 2147, 2146, 2163, 2203, 2183, 2180, 2174, 2178, 2143, 2145, 2181, 2152, 2185, 2193, 2244, 2151, 2194, 2195, 2150, 2173, 2166, 2167, 2217, 2219, 2220, 2221, 2176, 2222, 2201, 2207, 2215, 2216, 2211, 2223, 2224, 2225, 2212, 2227, 2228, 2218, 2213, 2226, 2208, 2214, 2199, 2229, 2230, 2177, 2234, 2190, 2192, 2233, 2239, 2238, 2240, 2237, 2170, 2241, 2236, 2235, 2232, 2186, 2231, 2191, 2196, 2197, 389: 2155, 1635, 1636, 1634, 448: 2171, 2243, 2162, 2157, 2149, 2160, 2158, 2159, 2198, 2210, 2209, 2202, 2200, 2154, 2165, 2242, 2164, 2161, 2550}, - {2: 1722, 1639, 1673, 1640, 7: 2119, 1727, 1666, 1724, 2124, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 2128, 1651, 2121, 2123, 2137, 2138, 2136, 2132, 2139, 2129, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 2130, 1760, 1659, 2120, 1737, 1683, 1700, 2125, 2127, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 2135, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 2126, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 2131, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 2122, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 2117, 2118, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 2140, 1835, 2116, 1840, 1839, 1685, 1842, 1844, 1689, 2133, 2134, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 2141, 2142, 1858, 1852, 1853, 1854, 2172, 230: 2153, 2112, 2184, 2188, 235: 2169, 2168, 2205, 2179, 243: 2144, 266: 2148, 2187, 290: 2156, 299: 2175, 311: 2189, 2110, 2182, 2204, 2206, 2147, 2146, 2163, 2203, 2183, 2180, 2174, 2178, 2143, 2145, 2181, 2152, 2185, 2193, 2244, 2151, 2194, 2195, 2150, 2173, 2166, 2167, 2217, 2219, 2220, 2221, 2176, 2222, 2201, 2207, 2215, 2216, 2211, 2223, 2224, 2225, 2212, 2227, 2228, 2218, 2213, 2226, 2208, 2214, 2199, 2229, 2230, 2177, 2234, 2190, 2192, 2233, 2239, 2238, 2240, 2237, 2170, 2241, 2236, 2235, 2232, 2186, 2231, 2191, 2196, 2197, 389: 2155, 1635, 1636, 1634, 448: 2171, 2243, 2162, 2157, 2149, 2160, 2158, 2159, 2198, 2210, 2209, 2202, 2200, 2154, 2165, 2242, 2164, 2161, 2115, 2114, 2113, 2548}, + {2: 1736, 1653, 1687, 1654, 7: 2140, 1741, 1680, 1738, 2145, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 2149, 1665, 2142, 2144, 1859, 2158, 2159, 2157, 2153, 2160, 1837, 1839, 1838, 2150, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 2151, 1774, 1673, 2141, 1751, 1714, 2146, 2148, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 2156, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 2147, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 2152, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 2143, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 2138, 2139, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 2161, 1853, 2137, 1858, 1857, 1699, 1860, 1862, 1703, 2154, 2155, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 2162, 2163, 1876, 1870, 1871, 1872, 2193, 234: 2174, 236: 2205, 2209, 239: 2190, 2189, 2226, 2200, 247: 2165, 270: 2169, 272: 2208, 294: 2177, 303: 2196, 315: 2210, 2277, 2203, 2225, 2227, 2168, 2167, 2184, 2224, 2204, 2201, 2195, 2199, 2164, 2166, 2202, 2173, 2206, 2214, 2265, 2172, 2215, 2216, 2171, 2194, 2187, 2188, 2238, 2240, 2241, 2242, 2197, 2243, 2222, 2228, 2236, 2237, 2232, 2244, 2245, 2246, 2233, 2248, 2249, 2239, 2234, 2247, 2229, 2235, 2220, 2250, 2251, 2198, 2255, 2211, 2213, 2254, 2260, 2259, 2261, 2258, 2191, 2262, 2257, 2256, 381: 2253, 2207, 2252, 2212, 2217, 2218, 393: 2176, 1649, 1650, 1648, 452: 2192, 2264, 2183, 2178, 2170, 2181, 2179, 2180, 2219, 2231, 2230, 2223, 2221, 2175, 2186, 2263, 2185, 2182, 2587}, + {2: 1736, 1653, 1687, 1654, 7: 2140, 1741, 1680, 1738, 2145, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 2149, 1665, 2142, 2144, 1859, 2158, 2159, 2157, 2153, 2160, 1837, 1839, 1838, 2150, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 2151, 1774, 1673, 2141, 1751, 1714, 2146, 2148, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 2156, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 2147, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 2152, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 2143, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 2138, 2139, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 2161, 1853, 2137, 1858, 1857, 1699, 1860, 1862, 1703, 2154, 2155, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 2162, 2163, 1876, 1870, 1871, 1872, 2193, 234: 2174, 236: 2205, 2209, 239: 2190, 2189, 2226, 2200, 247: 2165, 270: 2169, 272: 2208, 294: 2177, 303: 2196, 315: 2210, 2277, 2203, 2225, 2227, 2168, 2167, 2184, 2224, 2204, 2201, 2195, 2199, 2164, 2166, 2202, 2173, 2206, 2214, 2265, 2172, 2215, 2216, 2171, 2194, 2187, 2188, 2238, 2240, 2241, 2242, 2197, 2243, 2222, 2228, 2236, 2237, 2232, 2244, 2245, 2246, 2233, 2248, 2249, 2239, 2234, 2247, 2229, 2235, 2220, 2250, 2251, 2198, 2255, 2211, 2213, 2254, 2260, 2259, 2261, 2258, 2191, 2262, 2257, 2256, 381: 2253, 2207, 2252, 2212, 2217, 2218, 393: 2176, 1649, 1650, 1648, 452: 2192, 2264, 2183, 2178, 2170, 2181, 2179, 2180, 2219, 2231, 2230, 2223, 2221, 2175, 2186, 2263, 2185, 2182, 2586}, + {2: 1736, 1653, 1687, 1654, 7: 2140, 1741, 1680, 1738, 2145, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 2149, 1665, 2142, 2144, 1859, 2158, 2159, 2157, 2153, 2160, 1837, 1839, 1838, 2150, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 2151, 1774, 1673, 2141, 1751, 1714, 2146, 2148, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 2156, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 2147, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 2152, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 2143, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 2138, 2139, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 2161, 1853, 2137, 1858, 1857, 1699, 1860, 1862, 1703, 2154, 2155, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 2162, 2163, 1876, 1870, 1871, 1872, 2193, 234: 2174, 236: 2205, 2209, 239: 2190, 2189, 2226, 2200, 247: 2165, 270: 2169, 272: 2208, 294: 2177, 303: 2196, 315: 2210, 2277, 2203, 2225, 2227, 2168, 2167, 2184, 2224, 2204, 2201, 2195, 2199, 2164, 2166, 2202, 2173, 2206, 2214, 2265, 2172, 2215, 2216, 2171, 2194, 2187, 2188, 2238, 2240, 2241, 2242, 2197, 2243, 2222, 2228, 2236, 2237, 2232, 2244, 2245, 2246, 2233, 2248, 2249, 2239, 2234, 2247, 2229, 2235, 2220, 2250, 2251, 2198, 2255, 2211, 2213, 2254, 2260, 2259, 2261, 2258, 2191, 2262, 2257, 2256, 381: 2253, 2207, 2252, 2212, 2217, 2218, 393: 2176, 1649, 1650, 1648, 452: 2192, 2264, 2183, 2178, 2170, 2181, 2179, 2180, 2219, 2231, 2230, 2223, 2221, 2175, 2186, 2263, 2185, 2182, 2585}, + {2: 1736, 1653, 1687, 1654, 7: 2140, 1741, 1680, 1738, 2145, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 2149, 1665, 2142, 2144, 1859, 2158, 2159, 2157, 2153, 2160, 1837, 1839, 1838, 2150, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 2151, 1774, 1673, 2141, 1751, 1714, 2146, 2148, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 2156, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 2147, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 2152, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 2143, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 2138, 2139, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 2161, 1853, 2137, 1858, 1857, 1699, 1860, 1862, 1703, 2154, 2155, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 2162, 2163, 1876, 1870, 1871, 1872, 2193, 234: 2174, 236: 2205, 2209, 239: 2190, 2189, 2226, 2200, 247: 2165, 270: 2169, 272: 2208, 294: 2177, 303: 2196, 315: 2210, 2277, 2203, 2225, 2227, 2168, 2167, 2184, 2224, 2582, 2201, 2195, 2199, 2164, 2166, 2202, 2173, 2206, 2214, 2265, 2172, 2215, 2216, 2171, 2194, 2187, 2188, 2238, 2240, 2241, 2242, 2197, 2243, 2222, 2228, 2236, 2237, 2232, 2244, 2245, 2246, 2233, 2248, 2249, 2239, 2234, 2247, 2229, 2235, 2220, 2250, 2251, 2198, 2255, 2211, 2213, 2254, 2260, 2259, 2261, 2258, 2191, 2262, 2257, 2256, 381: 2253, 2207, 2252, 2212, 2217, 2218, 393: 2176, 1649, 1650, 1648, 452: 2192, 2264, 2183, 2178, 2170, 2181, 2179, 2180, 2219, 2231, 2230, 2223, 2221, 2175, 2186, 2263, 2185, 2182, 2581}, + {2: 1736, 1653, 1687, 1654, 7: 2140, 1741, 1680, 1738, 2145, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 2149, 1665, 2142, 2144, 1859, 2158, 2159, 2157, 2153, 2160, 1837, 1839, 1838, 2150, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 2151, 1774, 1673, 2141, 1751, 1714, 2146, 2148, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 2156, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 2147, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 2152, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 2143, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 2138, 2139, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 2161, 1853, 2137, 1858, 1857, 1699, 1860, 1862, 1703, 2154, 2155, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 2162, 2163, 1876, 1870, 1871, 1872, 2193, 234: 2174, 236: 2205, 2209, 239: 2190, 2189, 2226, 2200, 247: 2165, 270: 2169, 272: 2208, 294: 2177, 303: 2196, 315: 2210, 2277, 2203, 2225, 2227, 2168, 2167, 2184, 2224, 2578, 2201, 2195, 2199, 2164, 2166, 2202, 2173, 2206, 2214, 2265, 2172, 2215, 2216, 2171, 2194, 2187, 2188, 2238, 2240, 2241, 2242, 2197, 2243, 2222, 2228, 2236, 2237, 2232, 2244, 2245, 2246, 2233, 2248, 2249, 2239, 2234, 2247, 2229, 2235, 2220, 2250, 2251, 2198, 2255, 2211, 2213, 2254, 2260, 2259, 2261, 2258, 2191, 2262, 2257, 2256, 381: 2253, 2207, 2252, 2212, 2217, 2218, 393: 2176, 1649, 1650, 1648, 452: 2192, 2264, 2183, 2178, 2170, 2181, 2179, 2180, 2219, 2231, 2230, 2223, 2221, 2175, 2186, 2263, 2185, 2182, 2577}, // 1030 - {21: 2549, 246: 2253, 248: 2251, 250: 2252, 2250, 2248, 470: 2249, 2247}, - {754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 229: 754, 754, 754, 754, 754, 754, 754, 754, 754, 239: 754, 754, 754, 754, 244: 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 268: 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 291: 754, 754, 754, 754, 754, 754, 754, 754, 300: 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 382: 754}, - {861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 229: 861, 861, 861, 861, 861, 861, 861, 861, 861, 239: 861, 861, 861, 861, 244: 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 262: 861, 861, 861, 861, 268: 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 291: 861, 861, 861, 861, 861, 861, 861, 861, 300: 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861}, - {862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 229: 862, 862, 862, 862, 862, 862, 862, 862, 862, 239: 862, 862, 862, 862, 244: 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 262: 862, 862, 862, 862, 268: 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 291: 862, 862, 862, 862, 862, 862, 862, 862, 300: 862, 862, 862, 862, 2546, 862, 862, 862, 862, 862, 862}, - {863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 229: 863, 863, 863, 863, 863, 863, 863, 863, 863, 239: 863, 863, 863, 863, 244: 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 262: 863, 863, 863, 863, 268: 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 291: 863, 863, 863, 863, 863, 863, 863, 863, 300: 863, 863, 863, 863, 2546, 863, 863, 863, 863, 863, 863}, + {2: 1736, 1653, 1687, 1654, 7: 2140, 1741, 1680, 1738, 2145, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 2149, 1665, 2142, 2144, 1859, 2158, 2159, 2157, 2153, 2160, 1837, 1839, 1838, 2150, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 2151, 1774, 1673, 2141, 1751, 1714, 2146, 2148, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 2156, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 2147, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 2152, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 2143, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 2138, 2139, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 2161, 1853, 2137, 1858, 1857, 1699, 1860, 1862, 1703, 2154, 2155, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 2162, 2163, 1876, 1870, 1871, 1872, 2193, 234: 2174, 236: 2205, 2209, 239: 2190, 2189, 2226, 2200, 247: 2165, 270: 2169, 272: 2208, 294: 2177, 303: 2196, 315: 2210, 2277, 2203, 2225, 2227, 2168, 2167, 2184, 2224, 2204, 2201, 2195, 2199, 2164, 2166, 2202, 2173, 2206, 2214, 2265, 2172, 2215, 2216, 2171, 2194, 2187, 2188, 2238, 2240, 2241, 2242, 2197, 2243, 2222, 2228, 2236, 2237, 2232, 2244, 2245, 2246, 2233, 2248, 2249, 2239, 2234, 2247, 2229, 2235, 2220, 2250, 2251, 2198, 2255, 2211, 2213, 2254, 2260, 2259, 2261, 2258, 2191, 2262, 2257, 2256, 381: 2253, 2207, 2252, 2212, 2217, 2218, 393: 2176, 1649, 1650, 1648, 452: 2192, 2264, 2183, 2178, 2170, 2181, 2179, 2180, 2219, 2231, 2230, 2223, 2221, 2175, 2186, 2263, 2185, 2182, 2576}, + {2: 1736, 1653, 1687, 1654, 7: 2140, 1741, 1680, 1738, 2145, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 2149, 1665, 2142, 2144, 1859, 2158, 2159, 2157, 2153, 2160, 1837, 1839, 1838, 2150, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 2151, 1774, 1673, 2141, 1751, 1714, 2146, 2148, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 2156, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 2147, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 2152, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 2143, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 2138, 2139, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 2161, 1853, 2137, 1858, 1857, 1699, 1860, 1862, 1703, 2154, 2155, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 2162, 2163, 1876, 1870, 1871, 1872, 2193, 234: 2174, 236: 2205, 2209, 239: 2190, 2189, 2226, 2200, 247: 2165, 270: 2169, 272: 2208, 294: 2177, 303: 2196, 315: 2210, 2277, 2203, 2225, 2227, 2168, 2167, 2184, 2224, 2204, 2201, 2195, 2199, 2164, 2166, 2202, 2173, 2206, 2214, 2265, 2172, 2215, 2216, 2171, 2194, 2187, 2188, 2238, 2240, 2241, 2242, 2197, 2243, 2222, 2228, 2236, 2237, 2232, 2244, 2245, 2246, 2233, 2248, 2249, 2239, 2234, 2247, 2229, 2235, 2220, 2250, 2251, 2198, 2255, 2211, 2213, 2254, 2260, 2259, 2261, 2258, 2191, 2262, 2257, 2256, 381: 2253, 2207, 2252, 2212, 2217, 2218, 393: 2176, 1649, 1650, 1648, 452: 2192, 2264, 2183, 2178, 2170, 2181, 2179, 2180, 2219, 2231, 2230, 2223, 2221, 2175, 2186, 2263, 2185, 2182, 2575}, + {2: 1736, 1653, 1687, 1654, 7: 2140, 1741, 1680, 1738, 2145, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 2149, 1665, 2142, 2144, 1859, 2158, 2159, 2157, 2153, 2160, 1837, 1839, 1838, 2150, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 2151, 1774, 1673, 2141, 1751, 1714, 2146, 2148, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 2156, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 2147, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 2152, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 2143, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 2138, 2139, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 2161, 1853, 2137, 1858, 1857, 1699, 1860, 1862, 1703, 2154, 2155, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 2162, 2163, 1876, 1870, 1871, 1872, 2193, 234: 2174, 236: 2205, 2209, 239: 2190, 2189, 2226, 2200, 247: 2165, 270: 2169, 272: 2208, 294: 2177, 303: 2196, 315: 2210, 2277, 2203, 2225, 2227, 2168, 2167, 2184, 2224, 2204, 2201, 2195, 2199, 2164, 2166, 2202, 2173, 2206, 2214, 2265, 2172, 2215, 2216, 2171, 2194, 2187, 2188, 2238, 2240, 2241, 2242, 2197, 2243, 2222, 2228, 2236, 2237, 2232, 2244, 2245, 2246, 2233, 2248, 2249, 2239, 2234, 2247, 2229, 2235, 2220, 2250, 2251, 2198, 2255, 2211, 2213, 2254, 2260, 2259, 2261, 2258, 2191, 2262, 2257, 2256, 381: 2253, 2207, 2252, 2212, 2217, 2218, 393: 2176, 1649, 1650, 1648, 452: 2192, 2264, 2183, 2178, 2170, 2181, 2179, 2180, 2219, 2231, 2230, 2223, 2221, 2175, 2186, 2263, 2185, 2182, 2574}, + {2: 1736, 1653, 1687, 1654, 7: 2140, 1741, 1680, 1738, 2145, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 2149, 1665, 2142, 2144, 1859, 2158, 2159, 2157, 2153, 2160, 1837, 1839, 1838, 2150, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 2151, 1774, 1673, 2141, 1751, 1714, 2146, 2148, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 2156, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 2147, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 2152, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 2143, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 2138, 2139, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 2161, 1853, 2137, 1858, 1857, 1699, 1860, 1862, 1703, 2154, 2155, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 2162, 2163, 1876, 1870, 1871, 1872, 2193, 234: 2174, 236: 2205, 2209, 239: 2190, 2189, 2226, 2200, 247: 2165, 270: 2169, 272: 2208, 294: 2177, 303: 2196, 315: 2210, 2277, 2203, 2225, 2227, 2168, 2167, 2184, 2224, 2204, 2201, 2195, 2199, 2164, 2166, 2202, 2173, 2206, 2214, 2265, 2172, 2215, 2216, 2171, 2194, 2187, 2188, 2238, 2240, 2241, 2242, 2197, 2243, 2222, 2228, 2236, 2237, 2232, 2244, 2245, 2246, 2233, 2248, 2249, 2239, 2234, 2247, 2229, 2235, 2220, 2250, 2251, 2198, 2255, 2211, 2213, 2254, 2260, 2259, 2261, 2258, 2191, 2262, 2257, 2256, 381: 2253, 2207, 2252, 2212, 2217, 2218, 393: 2176, 1649, 1650, 1648, 452: 2192, 2264, 2183, 2178, 2170, 2181, 2179, 2180, 2219, 2231, 2230, 2223, 2221, 2175, 2186, 2263, 2185, 2182, 2573}, + {2: 1736, 1653, 1687, 1654, 7: 2140, 1741, 1680, 1738, 2145, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 2149, 1665, 2142, 2144, 1859, 2158, 2159, 2157, 2153, 2160, 1837, 1839, 1838, 2150, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 2151, 1774, 1673, 2141, 1751, 1714, 2146, 2148, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 2156, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 2147, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 2152, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 2143, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 2138, 2139, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 2161, 1853, 2137, 1858, 1857, 1699, 1860, 1862, 1703, 2154, 2155, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 2162, 2163, 1876, 1870, 1871, 1872, 2193, 234: 2174, 236: 2205, 2209, 239: 2190, 2189, 2226, 2200, 247: 2165, 270: 2169, 272: 2208, 294: 2177, 303: 2196, 315: 2210, 2277, 2203, 2225, 2227, 2168, 2167, 2184, 2224, 2204, 2201, 2195, 2199, 2164, 2166, 2202, 2173, 2206, 2214, 2265, 2172, 2215, 2216, 2171, 2194, 2187, 2188, 2238, 2240, 2241, 2242, 2197, 2243, 2222, 2228, 2236, 2237, 2232, 2244, 2245, 2246, 2233, 2248, 2249, 2239, 2234, 2247, 2229, 2235, 2220, 2250, 2251, 2198, 2255, 2211, 2213, 2254, 2260, 2259, 2261, 2258, 2191, 2262, 2257, 2256, 381: 2253, 2207, 2252, 2212, 2217, 2218, 393: 2176, 1649, 1650, 1648, 452: 2192, 2264, 2183, 2178, 2170, 2181, 2179, 2180, 2219, 2231, 2230, 2223, 2221, 2175, 2186, 2263, 2185, 2182, 2572}, // 1035 - {864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 229: 864, 864, 864, 864, 864, 864, 864, 864, 864, 239: 864, 864, 864, 864, 244: 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 262: 864, 864, 864, 864, 268: 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 291: 864, 864, 864, 864, 864, 864, 864, 864, 300: 864, 864, 864, 864, 2546, 864, 864, 864, 864, 864, 864}, - {865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 229: 865, 865, 865, 865, 865, 865, 865, 865, 865, 239: 865, 865, 865, 865, 244: 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 262: 865, 865, 865, 865, 268: 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 291: 865, 865, 865, 865, 865, 865, 865, 865, 300: 865, 865, 865, 865, 2546, 865, 865, 865, 865, 865, 865}, - {866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 229: 866, 866, 866, 866, 866, 866, 866, 866, 866, 239: 866, 866, 866, 866, 244: 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 262: 866, 866, 866, 866, 268: 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 291: 866, 866, 866, 866, 866, 866, 866, 866, 300: 866, 866, 866, 866, 2546, 866, 866, 866, 866, 866, 866}, - {869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 229: 869, 869, 869, 869, 869, 869, 869, 869, 2545, 239: 869, 869, 869, 869, 244: 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 262: 869, 869, 869, 869, 268: 869, 2541, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 291: 869, 869, 869, 869, 869, 869, 869, 869, 300: 869, 2543, 869, 2542, 2546, 869, 2544, 869, 869, 869, 869}, - {2: 1722, 1639, 1673, 1640, 7: 2119, 1727, 1666, 1724, 2124, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 2128, 1651, 2121, 2123, 2137, 2138, 2136, 2132, 2139, 2129, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 2130, 1760, 1659, 2120, 1737, 1683, 1700, 2125, 2127, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 2135, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 2126, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 2131, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 2122, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 2117, 2118, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 2140, 1835, 2116, 1840, 1839, 1685, 1842, 1844, 1689, 2133, 2134, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 2141, 2142, 1858, 1852, 1853, 1854, 2172, 230: 2153, 2112, 2184, 2188, 235: 2169, 2168, 2205, 2179, 243: 2144, 266: 2148, 2187, 290: 2156, 299: 2175, 311: 2189, 2110, 2182, 2204, 2206, 2147, 2146, 2163, 2203, 2183, 2180, 2174, 2178, 2143, 2145, 2181, 2152, 2185, 2193, 2244, 2151, 2194, 2195, 2150, 2173, 2166, 2167, 2217, 2219, 2220, 2221, 2176, 2222, 2201, 2207, 2215, 2216, 2211, 2223, 2224, 2225, 2212, 2227, 2228, 2218, 2213, 2226, 2208, 2214, 2199, 2229, 2230, 2177, 2234, 2190, 2192, 2233, 2239, 2238, 2240, 2237, 2170, 2241, 2236, 2235, 2232, 2186, 2231, 2191, 2196, 2197, 389: 2155, 1635, 1636, 1634, 448: 2171, 2243, 2162, 2157, 2149, 2160, 2158, 2159, 2198, 2210, 2209, 2202, 2200, 2154, 2165, 2242, 2164, 2161, 2115, 2114, 2113, 2558}, + {2: 1736, 1653, 1687, 1654, 7: 2140, 1741, 1680, 1738, 2145, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 2149, 1665, 2142, 2144, 1859, 2158, 2159, 2157, 2153, 2160, 1837, 1839, 1838, 2150, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 2151, 1774, 1673, 2141, 1751, 1714, 2146, 2148, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 2156, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 2147, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 2152, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 2143, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 2138, 2139, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 2161, 1853, 2137, 1858, 1857, 1699, 1860, 1862, 1703, 2154, 2155, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 2162, 2163, 1876, 1870, 1871, 1872, 2193, 234: 2174, 236: 2205, 2209, 239: 2190, 2189, 2226, 2200, 247: 2165, 270: 2169, 272: 2208, 294: 2177, 303: 2196, 315: 2210, 2277, 2203, 2225, 2227, 2168, 2167, 2184, 2224, 2204, 2201, 2195, 2199, 2164, 2166, 2202, 2173, 2206, 2214, 2265, 2172, 2215, 2216, 2171, 2194, 2187, 2188, 2238, 2240, 2241, 2242, 2197, 2243, 2222, 2228, 2236, 2237, 2232, 2244, 2245, 2246, 2233, 2248, 2249, 2239, 2234, 2247, 2229, 2235, 2220, 2250, 2251, 2198, 2255, 2211, 2213, 2254, 2260, 2259, 2261, 2258, 2191, 2262, 2257, 2256, 381: 2253, 2207, 2252, 2212, 2217, 2218, 393: 2176, 1649, 1650, 1648, 452: 2192, 2264, 2183, 2178, 2170, 2181, 2179, 2180, 2219, 2231, 2230, 2223, 2221, 2175, 2186, 2263, 2185, 2182, 2571}, + {2: 1736, 1653, 1687, 1654, 7: 2140, 1741, 1680, 1738, 2145, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 2149, 1665, 2142, 2144, 1859, 2158, 2159, 2157, 2153, 2160, 1837, 1839, 1838, 2150, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 2151, 1774, 1673, 2141, 1751, 1714, 2146, 2148, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 2156, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 2147, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 2152, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 2143, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 2138, 2139, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 2161, 1853, 2137, 1858, 1857, 1699, 1860, 1862, 1703, 2154, 2155, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 2162, 2163, 1876, 1870, 1871, 1872, 2193, 234: 2174, 2133, 2205, 2209, 239: 2190, 2189, 2226, 2200, 247: 2165, 270: 2169, 272: 2208, 294: 2177, 303: 2196, 315: 2210, 2131, 2203, 2225, 2227, 2168, 2167, 2184, 2224, 2204, 2201, 2195, 2199, 2164, 2166, 2202, 2173, 2206, 2214, 2265, 2172, 2215, 2216, 2171, 2194, 2187, 2188, 2238, 2240, 2241, 2242, 2197, 2243, 2222, 2228, 2236, 2237, 2232, 2244, 2245, 2246, 2233, 2248, 2249, 2239, 2234, 2247, 2229, 2235, 2220, 2250, 2251, 2198, 2255, 2211, 2213, 2254, 2260, 2259, 2261, 2258, 2191, 2262, 2257, 2256, 381: 2253, 2207, 2252, 2212, 2217, 2218, 393: 2176, 1649, 1650, 1648, 452: 2192, 2264, 2183, 2178, 2170, 2181, 2179, 2180, 2219, 2231, 2230, 2223, 2221, 2175, 2186, 2263, 2185, 2182, 2136, 2135, 2134, 2569}, + {21: 2570, 250: 2274, 252: 2272, 2273, 2271, 2269, 474: 2270, 2268}, + {762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 233: 762, 762, 762, 762, 762, 762, 762, 762, 762, 243: 762, 762, 762, 762, 248: 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 271: 762, 273: 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 295: 762, 762, 762, 762, 762, 762, 762, 762, 304: 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 380: 762}, + {869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 233: 869, 869, 869, 869, 869, 869, 869, 869, 869, 243: 869, 869, 869, 869, 248: 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 265: 869, 869, 869, 869, 869, 271: 869, 273: 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 295: 869, 869, 869, 869, 869, 869, 869, 869, 304: 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869}, // 1040 - {29: 2328, 31: 2324, 2323, 2320, 2322, 2326, 2327, 2321, 2325, 246: 2253, 248: 2251, 250: 2252, 2250, 2248, 275: 2338, 2335, 2337, 2336, 2332, 2334, 2333, 2330, 2331, 2329, 286: 2339, 470: 2249, 2247, 539: 2559}, - {867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 229: 867, 867, 867, 867, 867, 867, 867, 867, 867, 239: 867, 867, 867, 867, 244: 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 262: 867, 867, 867, 867, 268: 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 291: 867, 867, 867, 867, 867, 867, 867, 867, 300: 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867}, - {870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 229: 870, 870, 870, 870, 870, 870, 870, 870, 2545, 239: 870, 870, 870, 870, 244: 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 262: 870, 870, 870, 870, 268: 870, 2541, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 291: 870, 870, 870, 870, 870, 870, 870, 870, 300: 870, 2543, 870, 2542, 2546, 870, 2544, 870, 870, 870, 870}, - {2: 1722, 1639, 1673, 1640, 7: 2119, 1727, 1666, 1724, 2124, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 2128, 1651, 2121, 2123, 2137, 2138, 2136, 2132, 2139, 2129, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 2130, 1760, 1659, 2120, 1737, 1683, 1700, 2125, 2127, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 2135, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 2126, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 2131, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 2122, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 2117, 2118, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 2140, 1835, 2116, 1840, 1839, 1685, 1842, 1844, 1689, 2133, 2134, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 2141, 2142, 1858, 1852, 1853, 1854, 2172, 230: 2153, 2112, 2184, 2188, 235: 2169, 2168, 2205, 2179, 243: 2144, 266: 2148, 2187, 290: 2156, 299: 2175, 311: 2189, 2110, 2182, 2204, 2206, 2147, 2146, 2163, 2203, 2183, 2180, 2174, 2178, 2143, 2145, 2181, 2152, 2185, 2193, 2244, 2151, 2194, 2195, 2150, 2173, 2166, 2167, 2217, 2219, 2220, 2221, 2176, 2222, 2201, 2207, 2215, 2216, 2211, 2223, 2224, 2225, 2212, 2227, 2228, 2218, 2213, 2226, 2208, 2214, 2199, 2229, 2230, 2177, 2234, 2190, 2192, 2233, 2239, 2238, 2240, 2237, 2170, 2241, 2236, 2235, 2232, 2186, 2231, 2191, 2196, 2197, 389: 2155, 1635, 1636, 1634, 448: 2171, 2243, 2162, 2157, 2149, 2160, 2158, 2159, 2198, 2210, 2209, 2202, 2200, 2154, 2165, 2242, 2164, 2161, 2115, 2114, 2113, 2562}, - {29: 2328, 31: 2324, 2323, 2320, 2322, 2326, 2327, 2321, 2325, 246: 2253, 248: 2251, 250: 2252, 2250, 2248, 275: 2338, 2335, 2337, 2336, 2332, 2334, 2333, 2330, 2331, 2329, 286: 2339, 470: 2249, 2247, 539: 2563}, + {870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 233: 870, 870, 870, 870, 870, 870, 870, 870, 870, 243: 870, 870, 870, 870, 248: 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 265: 870, 870, 870, 870, 870, 271: 870, 273: 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 295: 870, 870, 870, 870, 870, 870, 870, 870, 304: 870, 870, 870, 870, 2567, 870, 870, 870, 870, 870, 870}, + {871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 233: 871, 871, 871, 871, 871, 871, 871, 871, 871, 243: 871, 871, 871, 871, 248: 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 265: 871, 871, 871, 871, 871, 271: 871, 273: 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 295: 871, 871, 871, 871, 871, 871, 871, 871, 304: 871, 871, 871, 871, 2567, 871, 871, 871, 871, 871, 871}, + {872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 233: 872, 872, 872, 872, 872, 872, 872, 872, 872, 243: 872, 872, 872, 872, 248: 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 265: 872, 872, 872, 872, 872, 271: 872, 273: 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 295: 872, 872, 872, 872, 872, 872, 872, 872, 304: 872, 872, 872, 872, 2567, 872, 872, 872, 872, 872, 872}, + {873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 233: 873, 873, 873, 873, 873, 873, 873, 873, 873, 243: 873, 873, 873, 873, 248: 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 265: 873, 873, 873, 873, 873, 271: 873, 273: 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 295: 873, 873, 873, 873, 873, 873, 873, 873, 304: 873, 873, 873, 873, 2567, 873, 873, 873, 873, 873, 873}, + {874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 233: 874, 874, 874, 874, 874, 874, 874, 874, 874, 243: 874, 874, 874, 874, 248: 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 265: 874, 874, 874, 874, 874, 271: 874, 273: 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 295: 874, 874, 874, 874, 874, 874, 874, 874, 304: 874, 874, 874, 874, 2567, 874, 874, 874, 874, 874, 874}, // 1045 - {868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 229: 868, 868, 868, 868, 868, 868, 868, 868, 868, 239: 868, 868, 868, 868, 244: 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 262: 868, 868, 868, 868, 268: 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 291: 868, 868, 868, 868, 868, 868, 868, 868, 300: 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868}, - {871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 229: 871, 871, 871, 871, 871, 871, 2539, 2540, 2545, 239: 871, 871, 871, 871, 244: 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 262: 871, 871, 871, 871, 268: 871, 2541, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 291: 871, 871, 871, 871, 871, 871, 871, 871, 300: 871, 2543, 871, 2542, 2546, 871, 2544, 871, 871, 871, 871}, - {872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 229: 872, 872, 872, 872, 872, 872, 2539, 2540, 2545, 239: 872, 872, 872, 872, 244: 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 262: 872, 872, 872, 872, 268: 872, 2541, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 291: 872, 872, 872, 872, 872, 872, 872, 872, 300: 872, 2543, 872, 2542, 2546, 872, 2544, 872, 872, 872, 872}, - {873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 229: 873, 873, 873, 873, 873, 873, 2539, 2540, 2545, 239: 873, 873, 873, 873, 244: 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 262: 873, 873, 873, 873, 268: 873, 2541, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 291: 873, 873, 873, 873, 873, 873, 873, 873, 300: 873, 2543, 873, 2542, 2546, 873, 2544, 2537, 2538, 873, 873}, - {874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 229: 874, 874, 874, 874, 874, 874, 2539, 2540, 2545, 239: 874, 874, 874, 874, 244: 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 262: 874, 874, 874, 874, 268: 874, 2541, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 291: 874, 874, 874, 874, 874, 874, 874, 874, 300: 874, 2543, 2536, 2542, 2546, 874, 2544, 2537, 2538, 874, 874}, + {877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 233: 877, 877, 877, 877, 877, 877, 877, 877, 2566, 243: 877, 877, 877, 877, 248: 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 265: 877, 877, 877, 877, 877, 271: 877, 273: 2562, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 295: 877, 877, 877, 877, 877, 877, 877, 877, 304: 877, 2564, 877, 2563, 2567, 877, 2565, 877, 877, 877, 877}, + {2: 1736, 1653, 1687, 1654, 7: 2140, 1741, 1680, 1738, 2145, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 2149, 1665, 2142, 2144, 1859, 2158, 2159, 2157, 2153, 2160, 1837, 1839, 1838, 2150, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 2151, 1774, 1673, 2141, 1751, 1714, 2146, 2148, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 2156, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 2147, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 2152, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 2143, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 2138, 2139, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 2161, 1853, 2137, 1858, 1857, 1699, 1860, 1862, 1703, 2154, 2155, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 2162, 2163, 1876, 1870, 1871, 1872, 2193, 234: 2174, 2133, 2205, 2209, 239: 2190, 2189, 2226, 2200, 247: 2165, 270: 2169, 272: 2208, 294: 2177, 303: 2196, 315: 2210, 2131, 2203, 2225, 2227, 2168, 2167, 2184, 2224, 2204, 2201, 2195, 2199, 2164, 2166, 2202, 2173, 2206, 2214, 2265, 2172, 2215, 2216, 2171, 2194, 2187, 2188, 2238, 2240, 2241, 2242, 2197, 2243, 2222, 2228, 2236, 2237, 2232, 2244, 2245, 2246, 2233, 2248, 2249, 2239, 2234, 2247, 2229, 2235, 2220, 2250, 2251, 2198, 2255, 2211, 2213, 2254, 2260, 2259, 2261, 2258, 2191, 2262, 2257, 2256, 381: 2253, 2207, 2252, 2212, 2217, 2218, 393: 2176, 1649, 1650, 1648, 452: 2192, 2264, 2183, 2178, 2170, 2181, 2179, 2180, 2219, 2231, 2230, 2223, 2221, 2175, 2186, 2263, 2185, 2182, 2136, 2135, 2134, 2579}, + {30: 2349, 32: 2345, 2344, 35: 2341, 2343, 2347, 2348, 2342, 43: 2346, 250: 2274, 252: 2272, 2273, 2271, 2269, 279: 2359, 2356, 2358, 2357, 2353, 2355, 2354, 2351, 2352, 2350, 290: 2360, 474: 2270, 2268, 543: 2580}, + {875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 233: 875, 875, 875, 875, 875, 875, 875, 875, 875, 243: 875, 875, 875, 875, 248: 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 265: 875, 875, 875, 875, 875, 271: 875, 273: 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 295: 875, 875, 875, 875, 875, 875, 875, 875, 304: 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875}, + {878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 233: 878, 878, 878, 878, 878, 878, 878, 878, 2566, 243: 878, 878, 878, 878, 248: 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 265: 878, 878, 878, 878, 878, 271: 878, 273: 2562, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 295: 878, 878, 878, 878, 878, 878, 878, 878, 304: 878, 2564, 878, 2563, 2567, 878, 2565, 878, 878, 878, 878}, // 1050 - {29: 2328, 31: 2324, 2323, 2320, 2322, 2326, 2327, 2321, 2325, 275: 2338, 2335, 2337, 2336, 2332, 2334, 2333, 2330, 2331, 2329, 286: 2339, 539: 2569}, - {253: 2570}, - {2: 1722, 1639, 1673, 1640, 7: 2119, 1727, 1666, 1724, 2124, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 2128, 1651, 2121, 2123, 2137, 2138, 2136, 2132, 2139, 2129, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 2130, 1760, 1659, 2120, 1737, 1683, 1700, 2125, 2127, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 2135, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 2126, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 2131, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 2122, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 2117, 2118, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 2140, 1835, 2116, 1840, 1839, 1685, 1842, 1844, 1689, 2133, 2134, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 2141, 2142, 1858, 1852, 1853, 1854, 2172, 230: 2153, 2112, 2184, 2188, 235: 2169, 2168, 2205, 2179, 243: 2144, 266: 2148, 2187, 290: 2156, 299: 2175, 311: 2189, 2110, 2182, 2204, 2206, 2147, 2146, 2163, 2203, 2183, 2180, 2174, 2178, 2143, 2145, 2181, 2152, 2185, 2193, 2244, 2151, 2194, 2195, 2150, 2173, 2166, 2167, 2217, 2219, 2220, 2221, 2176, 2222, 2201, 2207, 2215, 2216, 2211, 2223, 2224, 2225, 2212, 2227, 2228, 2218, 2213, 2226, 2208, 2214, 2199, 2229, 2230, 2177, 2234, 2190, 2192, 2233, 2239, 2238, 2240, 2237, 2170, 2241, 2236, 2235, 2232, 2186, 2231, 2191, 2196, 2197, 389: 2155, 1635, 1636, 1634, 448: 2171, 2243, 2162, 2157, 2149, 2160, 2158, 2159, 2198, 2210, 2209, 2202, 2200, 2154, 2165, 2242, 2164, 2161, 2115, 2114, 2113, 2571}, - {21: 2572, 246: 2253, 248: 2251, 250: 2252, 2250, 2248, 470: 2249, 2247}, - {756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 229: 756, 756, 756, 756, 756, 756, 756, 756, 756, 239: 756, 756, 756, 756, 244: 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 268: 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 291: 756, 756, 756, 756, 756, 756, 756, 756, 300: 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 382: 756}, + {2: 1736, 1653, 1687, 1654, 7: 2140, 1741, 1680, 1738, 2145, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 2149, 1665, 2142, 2144, 1859, 2158, 2159, 2157, 2153, 2160, 1837, 1839, 1838, 2150, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 2151, 1774, 1673, 2141, 1751, 1714, 2146, 2148, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 2156, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 2147, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 2152, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 2143, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 2138, 2139, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 2161, 1853, 2137, 1858, 1857, 1699, 1860, 1862, 1703, 2154, 2155, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 2162, 2163, 1876, 1870, 1871, 1872, 2193, 234: 2174, 2133, 2205, 2209, 239: 2190, 2189, 2226, 2200, 247: 2165, 270: 2169, 272: 2208, 294: 2177, 303: 2196, 315: 2210, 2131, 2203, 2225, 2227, 2168, 2167, 2184, 2224, 2204, 2201, 2195, 2199, 2164, 2166, 2202, 2173, 2206, 2214, 2265, 2172, 2215, 2216, 2171, 2194, 2187, 2188, 2238, 2240, 2241, 2242, 2197, 2243, 2222, 2228, 2236, 2237, 2232, 2244, 2245, 2246, 2233, 2248, 2249, 2239, 2234, 2247, 2229, 2235, 2220, 2250, 2251, 2198, 2255, 2211, 2213, 2254, 2260, 2259, 2261, 2258, 2191, 2262, 2257, 2256, 381: 2253, 2207, 2252, 2212, 2217, 2218, 393: 2176, 1649, 1650, 1648, 452: 2192, 2264, 2183, 2178, 2170, 2181, 2179, 2180, 2219, 2231, 2230, 2223, 2221, 2175, 2186, 2263, 2185, 2182, 2136, 2135, 2134, 2583}, + {30: 2349, 32: 2345, 2344, 35: 2341, 2343, 2347, 2348, 2342, 43: 2346, 250: 2274, 252: 2272, 2273, 2271, 2269, 279: 2359, 2356, 2358, 2357, 2353, 2355, 2354, 2351, 2352, 2350, 290: 2360, 474: 2270, 2268, 543: 2584}, + {876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 233: 876, 876, 876, 876, 876, 876, 876, 876, 876, 243: 876, 876, 876, 876, 248: 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 265: 876, 876, 876, 876, 876, 271: 876, 273: 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 295: 876, 876, 876, 876, 876, 876, 876, 876, 304: 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876}, + {879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 233: 879, 879, 879, 879, 879, 879, 2560, 2561, 2566, 243: 879, 879, 879, 879, 248: 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 265: 879, 879, 879, 879, 879, 271: 879, 273: 2562, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 295: 879, 879, 879, 879, 879, 879, 879, 879, 304: 879, 2564, 879, 2563, 2567, 879, 2565, 879, 879, 879, 879}, + {880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 233: 880, 880, 880, 880, 880, 880, 2560, 2561, 2566, 243: 880, 880, 880, 880, 248: 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 265: 880, 880, 880, 880, 880, 271: 880, 273: 2562, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 295: 880, 880, 880, 880, 880, 880, 880, 880, 304: 880, 2564, 880, 2563, 2567, 880, 2565, 880, 880, 880, 880}, // 1055 - {2: 1722, 1639, 1673, 1640, 7: 2119, 1727, 1666, 1724, 2124, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 2128, 1651, 2121, 2123, 2137, 2138, 2136, 2132, 2139, 2129, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 2130, 1760, 1659, 2120, 1737, 1683, 1700, 2125, 2127, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 2135, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 2126, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 2131, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 2122, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 2117, 2118, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 2140, 1835, 2116, 1840, 1839, 1685, 1842, 1844, 1689, 2133, 2134, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 2141, 2142, 1858, 1852, 1853, 1854, 2172, 230: 2153, 2112, 2184, 2188, 235: 2169, 2168, 2205, 2179, 243: 2144, 266: 2148, 2187, 290: 2156, 299: 2175, 311: 2189, 2110, 2182, 2204, 2206, 2147, 2146, 2163, 2203, 2183, 2180, 2174, 2178, 2143, 2145, 2181, 2152, 2185, 2193, 2244, 2151, 2194, 2195, 2150, 2173, 2166, 2167, 2217, 2219, 2220, 2221, 2176, 2222, 2201, 2207, 2215, 2216, 2211, 2223, 2224, 2225, 2212, 2227, 2228, 2218, 2213, 2226, 2208, 2214, 2199, 2229, 2230, 2177, 2234, 2190, 2192, 2233, 2239, 2238, 2240, 2237, 2170, 2241, 2236, 2235, 2232, 2186, 2231, 2191, 2196, 2197, 389: 2155, 1635, 1636, 1634, 448: 2171, 2243, 2162, 2157, 2149, 2160, 2158, 2159, 2198, 2210, 2209, 2202, 2200, 2154, 2165, 2242, 2164, 2161, 2115, 2114, 2113, 2574}, - {6: 2575, 246: 2253, 248: 2251, 250: 2252, 2250, 2248, 470: 2249, 2247}, - {320: 2576}, - {2: 1722, 1639, 1673, 1640, 7: 2119, 1727, 1666, 1724, 2124, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 2128, 1651, 2121, 2123, 2137, 2138, 2136, 2132, 2139, 2129, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 2130, 1760, 1659, 2120, 1737, 1683, 1700, 2125, 2127, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 2135, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 2126, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 2131, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 2122, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 2117, 2118, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 2140, 1835, 2116, 1840, 1839, 1685, 1842, 1844, 1689, 2133, 2134, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 2141, 2142, 1858, 1852, 1853, 1854, 2172, 230: 2153, 2112, 2184, 2188, 235: 2169, 2168, 2205, 2179, 243: 2144, 266: 2148, 2187, 290: 2156, 299: 2175, 311: 2189, 2110, 2182, 2204, 2206, 2147, 2146, 2163, 2203, 2183, 2180, 2174, 2178, 2143, 2145, 2181, 2152, 2185, 2193, 2244, 2151, 2194, 2195, 2150, 2173, 2166, 2167, 2217, 2219, 2220, 2221, 2176, 2222, 2201, 2207, 2215, 2216, 2211, 2223, 2224, 2225, 2212, 2227, 2228, 2218, 2213, 2226, 2208, 2214, 2199, 2229, 2230, 2177, 2234, 2190, 2192, 2233, 2239, 2238, 2240, 2237, 2170, 2241, 2236, 2235, 2232, 2186, 2231, 2191, 2196, 2197, 389: 2155, 1635, 1636, 1634, 448: 2171, 2243, 2162, 2157, 2149, 2160, 2158, 2159, 2198, 2210, 2209, 2202, 2200, 2154, 2165, 2242, 2164, 2161, 2115, 2114, 2113, 2577}, - {29: 2328, 31: 2324, 2323, 2320, 2322, 2326, 2327, 2321, 2325, 246: 2253, 248: 2251, 250: 2252, 2250, 2248, 275: 2338, 2335, 2337, 2336, 2332, 2334, 2333, 2330, 2331, 2329, 286: 2339, 470: 2249, 2247, 539: 2578}, + {881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 233: 881, 881, 881, 881, 881, 881, 2560, 2561, 2566, 243: 881, 881, 881, 881, 248: 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 265: 881, 881, 881, 881, 881, 271: 881, 273: 2562, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 295: 881, 881, 881, 881, 881, 881, 881, 881, 304: 881, 2564, 881, 2563, 2567, 881, 2565, 2558, 2559, 881, 881}, + {882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 233: 882, 882, 882, 882, 882, 882, 2560, 2561, 2566, 243: 882, 882, 882, 882, 248: 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 265: 882, 882, 882, 882, 882, 271: 882, 273: 2562, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 295: 882, 882, 882, 882, 882, 882, 882, 882, 304: 882, 2564, 2557, 2563, 2567, 882, 2565, 2558, 2559, 882, 882}, + {30: 2349, 32: 2345, 2344, 35: 2341, 2343, 2347, 2348, 2342, 43: 2346, 279: 2359, 2356, 2358, 2357, 2353, 2355, 2354, 2351, 2352, 2350, 290: 2360, 543: 2590}, + {257: 2591}, + {2: 1736, 1653, 1687, 1654, 7: 2140, 1741, 1680, 1738, 2145, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 2149, 1665, 2142, 2144, 1859, 2158, 2159, 2157, 2153, 2160, 1837, 1839, 1838, 2150, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 2151, 1774, 1673, 2141, 1751, 1714, 2146, 2148, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 2156, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 2147, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 2152, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 2143, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 2138, 2139, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 2161, 1853, 2137, 1858, 1857, 1699, 1860, 1862, 1703, 2154, 2155, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 2162, 2163, 1876, 1870, 1871, 1872, 2193, 234: 2174, 2133, 2205, 2209, 239: 2190, 2189, 2226, 2200, 247: 2165, 270: 2169, 272: 2208, 294: 2177, 303: 2196, 315: 2210, 2131, 2203, 2225, 2227, 2168, 2167, 2184, 2224, 2204, 2201, 2195, 2199, 2164, 2166, 2202, 2173, 2206, 2214, 2265, 2172, 2215, 2216, 2171, 2194, 2187, 2188, 2238, 2240, 2241, 2242, 2197, 2243, 2222, 2228, 2236, 2237, 2232, 2244, 2245, 2246, 2233, 2248, 2249, 2239, 2234, 2247, 2229, 2235, 2220, 2250, 2251, 2198, 2255, 2211, 2213, 2254, 2260, 2259, 2261, 2258, 2191, 2262, 2257, 2256, 381: 2253, 2207, 2252, 2212, 2217, 2218, 393: 2176, 1649, 1650, 1648, 452: 2192, 2264, 2183, 2178, 2170, 2181, 2179, 2180, 2219, 2231, 2230, 2223, 2221, 2175, 2186, 2263, 2185, 2182, 2136, 2135, 2134, 2592}, // 1060 - {21: 2579}, - {757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 229: 757, 757, 757, 757, 757, 757, 757, 757, 757, 239: 757, 757, 757, 757, 244: 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 268: 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 291: 757, 757, 757, 757, 757, 757, 757, 757, 300: 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 382: 757}, - {2: 1722, 1639, 1673, 1640, 7: 2119, 1727, 1666, 1724, 2124, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 2128, 1651, 2121, 2123, 2137, 2138, 2136, 2132, 2139, 2129, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 2130, 1760, 1659, 2120, 1737, 1683, 1700, 2125, 2127, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 2135, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 2126, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 2131, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 2122, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 2117, 2118, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 2140, 1835, 2116, 1840, 1839, 1685, 1842, 1844, 1689, 2133, 2134, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 2141, 2142, 1858, 1852, 1853, 1854, 2172, 230: 2153, 2112, 2184, 2188, 235: 2169, 2168, 2205, 2179, 243: 2144, 266: 2148, 2187, 290: 2156, 299: 2175, 311: 2189, 2110, 2182, 2204, 2206, 2147, 2146, 2163, 2203, 2183, 2180, 2174, 2178, 2143, 2145, 2181, 2152, 2185, 2193, 2244, 2151, 2194, 2195, 2150, 2173, 2166, 2167, 2217, 2219, 2220, 2221, 2176, 2222, 2201, 2207, 2215, 2216, 2211, 2223, 2224, 2225, 2212, 2227, 2228, 2218, 2213, 2226, 2208, 2214, 2199, 2229, 2230, 2177, 2234, 2190, 2192, 2233, 2239, 2238, 2240, 2237, 2170, 2241, 2236, 2235, 2232, 2186, 2231, 2191, 2196, 2197, 389: 2155, 1635, 1636, 1634, 448: 2171, 2243, 2162, 2157, 2149, 2160, 2158, 2159, 2198, 2210, 2209, 2202, 2200, 2154, 2165, 2242, 2164, 2161, 2115, 2114, 2113, 2581}, - {6: 2582, 246: 2253, 248: 2251, 250: 2252, 2250, 2248, 470: 2249, 2247}, - {2: 1722, 1639, 1673, 1640, 7: 2119, 1727, 1666, 1724, 2124, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 2128, 1651, 2121, 2123, 2137, 2138, 2136, 2132, 2139, 2129, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 2130, 1760, 1659, 2120, 1737, 1683, 1700, 2125, 2127, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 2135, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 2126, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 2131, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 2122, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 2117, 2118, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 2140, 1835, 2116, 1840, 1839, 1685, 1842, 1844, 1689, 2133, 2134, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 2141, 2142, 1858, 1852, 1853, 1854, 2172, 230: 2153, 2112, 2184, 2188, 235: 2169, 2168, 2205, 2179, 243: 2144, 266: 2148, 2187, 290: 2156, 299: 2175, 311: 2189, 2110, 2182, 2204, 2206, 2147, 2146, 2163, 2203, 2584, 2180, 2174, 2178, 2143, 2145, 2181, 2152, 2185, 2193, 2244, 2151, 2194, 2195, 2150, 2173, 2166, 2167, 2217, 2219, 2220, 2221, 2176, 2222, 2201, 2207, 2215, 2216, 2211, 2223, 2224, 2225, 2212, 2227, 2228, 2218, 2213, 2226, 2208, 2214, 2199, 2229, 2230, 2177, 2234, 2190, 2192, 2233, 2239, 2238, 2240, 2237, 2170, 2241, 2236, 2235, 2232, 2186, 2231, 2191, 2196, 2197, 389: 2155, 1635, 1636, 1634, 448: 2171, 2243, 2162, 2157, 2149, 2160, 2158, 2159, 2198, 2210, 2209, 2202, 2200, 2154, 2165, 2242, 2164, 2161, 2115, 2114, 2113, 2583}, + {21: 2593, 250: 2274, 252: 2272, 2273, 2271, 2269, 474: 2270, 2268}, + {764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 233: 764, 764, 764, 764, 764, 764, 764, 764, 764, 243: 764, 764, 764, 764, 248: 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 271: 764, 273: 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 295: 764, 764, 764, 764, 764, 764, 764, 764, 304: 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 380: 764}, + {2: 1736, 1653, 1687, 1654, 7: 2140, 1741, 1680, 1738, 2145, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 2149, 1665, 2142, 2144, 1859, 2158, 2159, 2157, 2153, 2160, 1837, 1839, 1838, 2150, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 2151, 1774, 1673, 2141, 1751, 1714, 2146, 2148, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 2156, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 2147, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 2152, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 2143, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 2138, 2139, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 2161, 1853, 2137, 1858, 1857, 1699, 1860, 1862, 1703, 2154, 2155, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 2162, 2163, 1876, 1870, 1871, 1872, 2193, 234: 2174, 2133, 2205, 2209, 239: 2190, 2189, 2226, 2200, 247: 2165, 270: 2169, 272: 2208, 294: 2177, 303: 2196, 315: 2210, 2131, 2203, 2225, 2227, 2168, 2167, 2184, 2224, 2204, 2201, 2195, 2199, 2164, 2166, 2202, 2173, 2206, 2214, 2265, 2172, 2215, 2216, 2171, 2194, 2187, 2188, 2238, 2240, 2241, 2242, 2197, 2243, 2222, 2228, 2236, 2237, 2232, 2244, 2245, 2246, 2233, 2248, 2249, 2239, 2234, 2247, 2229, 2235, 2220, 2250, 2251, 2198, 2255, 2211, 2213, 2254, 2260, 2259, 2261, 2258, 2191, 2262, 2257, 2256, 381: 2253, 2207, 2252, 2212, 2217, 2218, 393: 2176, 1649, 1650, 1648, 452: 2192, 2264, 2183, 2178, 2170, 2181, 2179, 2180, 2219, 2231, 2230, 2223, 2221, 2175, 2186, 2263, 2185, 2182, 2136, 2135, 2134, 2595}, + {6: 2596, 250: 2274, 252: 2272, 2273, 2271, 2269, 474: 2270, 2268}, + {324: 2597}, // 1065 - {21: 2588, 246: 2253, 248: 2251, 250: 2252, 2250, 2248, 470: 2249, 2247}, - {2: 1722, 1639, 1673, 1640, 7: 2119, 1727, 1666, 1724, 2124, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 2128, 1651, 2121, 2123, 2137, 2138, 2136, 2132, 2139, 2129, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 2130, 1760, 1659, 2120, 1737, 1683, 1700, 2125, 2127, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 2135, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 2126, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 2131, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 2122, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 2117, 2118, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 2140, 1835, 2116, 1840, 1839, 1685, 1842, 1844, 1689, 2133, 2134, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 2141, 2142, 1858, 1852, 1853, 1854, 2172, 230: 2153, 2112, 2184, 2188, 235: 2169, 2168, 2205, 2179, 243: 2144, 266: 2148, 2187, 290: 2156, 299: 2175, 311: 2189, 2110, 2182, 2204, 2206, 2147, 2146, 2163, 2203, 2183, 2180, 2174, 2178, 2143, 2145, 2181, 2152, 2185, 2193, 2244, 2151, 2194, 2195, 2150, 2173, 2166, 2167, 2217, 2219, 2220, 2221, 2176, 2222, 2201, 2207, 2215, 2216, 2211, 2223, 2224, 2225, 2212, 2227, 2228, 2218, 2213, 2226, 2208, 2214, 2199, 2229, 2230, 2177, 2234, 2190, 2192, 2233, 2239, 2238, 2240, 2237, 2170, 2241, 2236, 2235, 2232, 2186, 2231, 2191, 2196, 2197, 389: 2155, 1635, 1636, 1634, 448: 2171, 2243, 2162, 2157, 2149, 2160, 2158, 2159, 2198, 2210, 2209, 2202, 2200, 2154, 2165, 2242, 2164, 2161, 2115, 2114, 2113, 2585}, - {29: 2328, 31: 2324, 2323, 2320, 2322, 2326, 2327, 2321, 2325, 246: 2253, 248: 2251, 250: 2252, 2250, 2248, 275: 2338, 2335, 2337, 2336, 2332, 2334, 2333, 2330, 2331, 2329, 286: 2339, 470: 2249, 2247, 539: 2586}, - {21: 2587}, - {758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 229: 758, 758, 758, 758, 758, 758, 758, 758, 758, 239: 758, 758, 758, 758, 244: 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 268: 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 291: 758, 758, 758, 758, 758, 758, 758, 758, 300: 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 382: 758}, + {2: 1736, 1653, 1687, 1654, 7: 2140, 1741, 1680, 1738, 2145, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 2149, 1665, 2142, 2144, 1859, 2158, 2159, 2157, 2153, 2160, 1837, 1839, 1838, 2150, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 2151, 1774, 1673, 2141, 1751, 1714, 2146, 2148, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 2156, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 2147, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 2152, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 2143, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 2138, 2139, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 2161, 1853, 2137, 1858, 1857, 1699, 1860, 1862, 1703, 2154, 2155, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 2162, 2163, 1876, 1870, 1871, 1872, 2193, 234: 2174, 2133, 2205, 2209, 239: 2190, 2189, 2226, 2200, 247: 2165, 270: 2169, 272: 2208, 294: 2177, 303: 2196, 315: 2210, 2131, 2203, 2225, 2227, 2168, 2167, 2184, 2224, 2204, 2201, 2195, 2199, 2164, 2166, 2202, 2173, 2206, 2214, 2265, 2172, 2215, 2216, 2171, 2194, 2187, 2188, 2238, 2240, 2241, 2242, 2197, 2243, 2222, 2228, 2236, 2237, 2232, 2244, 2245, 2246, 2233, 2248, 2249, 2239, 2234, 2247, 2229, 2235, 2220, 2250, 2251, 2198, 2255, 2211, 2213, 2254, 2260, 2259, 2261, 2258, 2191, 2262, 2257, 2256, 381: 2253, 2207, 2252, 2212, 2217, 2218, 393: 2176, 1649, 1650, 1648, 452: 2192, 2264, 2183, 2178, 2170, 2181, 2179, 2180, 2219, 2231, 2230, 2223, 2221, 2175, 2186, 2263, 2185, 2182, 2136, 2135, 2134, 2598}, + {30: 2349, 32: 2345, 2344, 35: 2341, 2343, 2347, 2348, 2342, 43: 2346, 250: 2274, 252: 2272, 2273, 2271, 2269, 279: 2359, 2356, 2358, 2357, 2353, 2355, 2354, 2351, 2352, 2350, 290: 2360, 474: 2270, 2268, 543: 2599}, + {21: 2600}, + {765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 233: 765, 765, 765, 765, 765, 765, 765, 765, 765, 243: 765, 765, 765, 765, 248: 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 271: 765, 273: 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 295: 765, 765, 765, 765, 765, 765, 765, 765, 304: 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 380: 765}, + {2: 1736, 1653, 1687, 1654, 7: 2140, 1741, 1680, 1738, 2145, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 2149, 1665, 2142, 2144, 1859, 2158, 2159, 2157, 2153, 2160, 1837, 1839, 1838, 2150, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 2151, 1774, 1673, 2141, 1751, 1714, 2146, 2148, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 2156, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 2147, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 2152, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 2143, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 2138, 2139, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 2161, 1853, 2137, 1858, 1857, 1699, 1860, 1862, 1703, 2154, 2155, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 2162, 2163, 1876, 1870, 1871, 1872, 2193, 234: 2174, 2133, 2205, 2209, 239: 2190, 2189, 2226, 2200, 247: 2165, 270: 2169, 272: 2208, 294: 2177, 303: 2196, 315: 2210, 2131, 2203, 2225, 2227, 2168, 2167, 2184, 2224, 2204, 2201, 2195, 2199, 2164, 2166, 2202, 2173, 2206, 2214, 2265, 2172, 2215, 2216, 2171, 2194, 2187, 2188, 2238, 2240, 2241, 2242, 2197, 2243, 2222, 2228, 2236, 2237, 2232, 2244, 2245, 2246, 2233, 2248, 2249, 2239, 2234, 2247, 2229, 2235, 2220, 2250, 2251, 2198, 2255, 2211, 2213, 2254, 2260, 2259, 2261, 2258, 2191, 2262, 2257, 2256, 381: 2253, 2207, 2252, 2212, 2217, 2218, 393: 2176, 1649, 1650, 1648, 452: 2192, 2264, 2183, 2178, 2170, 2181, 2179, 2180, 2219, 2231, 2230, 2223, 2221, 2175, 2186, 2263, 2185, 2182, 2136, 2135, 2134, 2602}, // 1070 - {759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 229: 759, 759, 759, 759, 759, 759, 759, 759, 759, 239: 759, 759, 759, 759, 244: 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 268: 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 291: 759, 759, 759, 759, 759, 759, 759, 759, 300: 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 382: 759}, - {21: 1227, 266: 2591, 670: 2590, 2592}, - {21: 1226}, - {21: 1225}, - {21: 2593}, + {6: 2603, 250: 2274, 252: 2272, 2273, 2271, 2269, 474: 2270, 2268}, + {2: 1736, 1653, 1687, 1654, 7: 2140, 1741, 1680, 1738, 2145, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 2149, 1665, 2142, 2144, 1859, 2158, 2159, 2157, 2153, 2160, 1837, 1839, 1838, 2150, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 2151, 1774, 1673, 2141, 1751, 1714, 2146, 2148, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 2156, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 2147, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 2152, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 2143, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 2138, 2139, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 2161, 1853, 2137, 1858, 1857, 1699, 1860, 1862, 1703, 2154, 2155, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 2162, 2163, 1876, 1870, 1871, 1872, 2193, 234: 2174, 2133, 2205, 2209, 239: 2190, 2189, 2226, 2200, 247: 2165, 270: 2169, 272: 2208, 294: 2177, 303: 2196, 315: 2210, 2131, 2203, 2225, 2227, 2168, 2167, 2184, 2224, 2605, 2201, 2195, 2199, 2164, 2166, 2202, 2173, 2206, 2214, 2265, 2172, 2215, 2216, 2171, 2194, 2187, 2188, 2238, 2240, 2241, 2242, 2197, 2243, 2222, 2228, 2236, 2237, 2232, 2244, 2245, 2246, 2233, 2248, 2249, 2239, 2234, 2247, 2229, 2235, 2220, 2250, 2251, 2198, 2255, 2211, 2213, 2254, 2260, 2259, 2261, 2258, 2191, 2262, 2257, 2256, 381: 2253, 2207, 2252, 2212, 2217, 2218, 393: 2176, 1649, 1650, 1648, 452: 2192, 2264, 2183, 2178, 2170, 2181, 2179, 2180, 2219, 2231, 2230, 2223, 2221, 2175, 2186, 2263, 2185, 2182, 2136, 2135, 2134, 2604}, + {21: 2609, 250: 2274, 252: 2272, 2273, 2271, 2269, 474: 2270, 2268}, + {2: 1736, 1653, 1687, 1654, 7: 2140, 1741, 1680, 1738, 2145, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 2149, 1665, 2142, 2144, 1859, 2158, 2159, 2157, 2153, 2160, 1837, 1839, 1838, 2150, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 2151, 1774, 1673, 2141, 1751, 1714, 2146, 2148, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 2156, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 2147, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 2152, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 2143, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 2138, 2139, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 2161, 1853, 2137, 1858, 1857, 1699, 1860, 1862, 1703, 2154, 2155, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 2162, 2163, 1876, 1870, 1871, 1872, 2193, 234: 2174, 2133, 2205, 2209, 239: 2190, 2189, 2226, 2200, 247: 2165, 270: 2169, 272: 2208, 294: 2177, 303: 2196, 315: 2210, 2131, 2203, 2225, 2227, 2168, 2167, 2184, 2224, 2204, 2201, 2195, 2199, 2164, 2166, 2202, 2173, 2206, 2214, 2265, 2172, 2215, 2216, 2171, 2194, 2187, 2188, 2238, 2240, 2241, 2242, 2197, 2243, 2222, 2228, 2236, 2237, 2232, 2244, 2245, 2246, 2233, 2248, 2249, 2239, 2234, 2247, 2229, 2235, 2220, 2250, 2251, 2198, 2255, 2211, 2213, 2254, 2260, 2259, 2261, 2258, 2191, 2262, 2257, 2256, 381: 2253, 2207, 2252, 2212, 2217, 2218, 393: 2176, 1649, 1650, 1648, 452: 2192, 2264, 2183, 2178, 2170, 2181, 2179, 2180, 2219, 2231, 2230, 2223, 2221, 2175, 2186, 2263, 2185, 2182, 2136, 2135, 2134, 2606}, + {30: 2349, 32: 2345, 2344, 35: 2341, 2343, 2347, 2348, 2342, 43: 2346, 250: 2274, 252: 2272, 2273, 2271, 2269, 279: 2359, 2356, 2358, 2357, 2353, 2355, 2354, 2351, 2352, 2350, 290: 2360, 474: 2270, 2268, 543: 2607}, // 1075 - {760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 229: 760, 760, 760, 760, 760, 760, 760, 760, 760, 239: 760, 760, 760, 760, 244: 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 268: 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 291: 760, 760, 760, 760, 760, 760, 760, 760, 300: 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 382: 760}, - {21: 1227, 266: 2591, 670: 2590, 2595}, - {21: 2596}, - {761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 229: 761, 761, 761, 761, 761, 761, 761, 761, 761, 239: 761, 761, 761, 761, 244: 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 268: 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 291: 761, 761, 761, 761, 761, 761, 761, 761, 300: 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 382: 761}, - {230: 898}, + {21: 2608}, + {766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 233: 766, 766, 766, 766, 766, 766, 766, 766, 766, 243: 766, 766, 766, 766, 248: 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 271: 766, 273: 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 295: 766, 766, 766, 766, 766, 766, 766, 766, 304: 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 380: 766}, + {767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 233: 767, 767, 767, 767, 767, 767, 767, 767, 767, 243: 767, 767, 767, 767, 248: 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 271: 767, 273: 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 295: 767, 767, 767, 767, 767, 767, 767, 767, 304: 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 380: 767}, + {21: 1241, 270: 2612, 674: 2611, 2613}, + {21: 1240}, // 1080 - {230: 897}, - {230: 896}, - {230: 2601}, - {265: 2602}, - {762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 229: 762, 762, 762, 762, 762, 762, 762, 762, 762, 239: 762, 762, 762, 762, 244: 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 268: 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 291: 762, 762, 762, 762, 762, 762, 762, 762, 300: 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 382: 762}, + {21: 1239}, + {21: 2614}, + {768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 233: 768, 768, 768, 768, 768, 768, 768, 768, 768, 243: 768, 768, 768, 768, 248: 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 271: 768, 273: 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 295: 768, 768, 768, 768, 768, 768, 768, 768, 304: 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 380: 768}, + {21: 1241, 270: 2612, 674: 2611, 2616}, + {21: 2617}, // 1085 - {2: 1722, 1639, 1673, 1640, 7: 2119, 1727, 1666, 1724, 2124, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 2128, 1651, 2121, 2123, 2137, 2138, 2136, 2132, 2139, 2129, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 2130, 1760, 1659, 2120, 1737, 1683, 1700, 2125, 2127, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 2135, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 2126, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 2131, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 2122, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 2117, 2118, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 2140, 1835, 2116, 1840, 1839, 1685, 1842, 1844, 1689, 2133, 2134, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 2141, 2142, 1858, 1852, 1853, 1854, 2172, 230: 2153, 232: 2184, 2188, 235: 2169, 2168, 2205, 2179, 243: 2144, 266: 2148, 2187, 290: 2156, 299: 2175, 311: 2189, 2256, 2182, 2204, 2206, 2147, 2146, 2163, 2203, 2183, 2180, 2174, 2178, 2143, 2145, 2181, 2152, 2185, 2193, 2244, 2151, 2194, 2195, 2150, 2173, 2166, 2167, 2217, 2219, 2220, 2221, 2176, 2222, 2201, 2207, 2215, 2216, 2211, 2223, 2224, 2225, 2212, 2227, 2228, 2218, 2213, 2226, 2208, 2214, 2199, 2229, 2230, 2177, 2234, 2190, 2192, 2233, 2239, 2238, 2240, 2237, 2170, 2241, 2236, 2235, 2232, 2186, 2231, 2191, 2196, 2197, 389: 2155, 1635, 1636, 1634, 448: 2171, 2243, 2162, 2157, 2149, 2160, 2158, 2159, 2198, 2210, 2209, 2202, 2200, 2154, 2165, 2242, 2164, 2161, 2604}, - {6: 2605, 235: 2539, 2540, 2545, 269: 2541, 301: 2543, 2536, 2542, 2546, 2535, 2544, 2537, 2538}, - {2: 1722, 1639, 1673, 1640, 7: 2119, 1727, 1666, 1724, 2124, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 2128, 1651, 2121, 2123, 2137, 2138, 2136, 2132, 2139, 2129, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 2130, 1760, 1659, 2120, 1737, 1683, 1700, 2125, 2127, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 2135, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 2126, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 2131, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 2122, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 2117, 2118, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 2140, 1835, 2116, 1840, 1839, 1685, 1842, 1844, 1689, 2133, 2134, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 2141, 2142, 1858, 1852, 1853, 1854, 2172, 230: 2153, 232: 2184, 2188, 235: 2169, 2168, 2205, 2179, 243: 2144, 266: 2148, 2187, 290: 2156, 299: 2175, 311: 2189, 2256, 2182, 2204, 2206, 2147, 2146, 2163, 2203, 2183, 2180, 2174, 2178, 2143, 2145, 2181, 2152, 2185, 2193, 2244, 2151, 2194, 2195, 2150, 2173, 2166, 2167, 2217, 2219, 2220, 2221, 2176, 2222, 2201, 2207, 2215, 2216, 2211, 2223, 2224, 2225, 2212, 2227, 2228, 2218, 2213, 2226, 2208, 2214, 2199, 2229, 2230, 2177, 2234, 2190, 2192, 2233, 2239, 2238, 2240, 2237, 2170, 2241, 2236, 2235, 2232, 2186, 2231, 2191, 2196, 2197, 389: 2155, 1635, 1636, 1634, 448: 2171, 2243, 2162, 2157, 2149, 2160, 2158, 2159, 2198, 2210, 2209, 2202, 2200, 2154, 2165, 2242, 2164, 2161, 2606}, - {21: 2607, 235: 2539, 2540, 2545, 269: 2541, 301: 2543, 2536, 2542, 2546, 2535, 2544, 2537, 2538}, - {764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 229: 764, 764, 764, 764, 764, 764, 764, 764, 764, 239: 764, 764, 764, 764, 244: 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 268: 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 291: 764, 764, 764, 764, 764, 764, 764, 764, 300: 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 382: 764}, + {769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 233: 769, 769, 769, 769, 769, 769, 769, 769, 769, 243: 769, 769, 769, 769, 248: 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 271: 769, 273: 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 295: 769, 769, 769, 769, 769, 769, 769, 769, 304: 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 380: 769}, + {234: 906}, + {234: 905}, + {234: 904}, + {234: 2622}, // 1090 - {2: 1722, 1639, 1673, 1640, 7: 2119, 1727, 1666, 1724, 2124, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 1229, 1758, 1698, 1755, 1781, 1701, 1777, 1702, 2128, 1651, 2121, 2123, 2137, 2138, 2136, 2132, 2139, 2129, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 2130, 1760, 1659, 2120, 1737, 1683, 1700, 2125, 2127, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 2135, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 2126, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 2131, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 2122, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 2117, 2118, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 2140, 1835, 2116, 1840, 1839, 1685, 1842, 1844, 1689, 2133, 2134, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 2141, 2142, 1858, 1852, 1853, 1854, 2172, 230: 2153, 2112, 2184, 2188, 235: 2169, 2168, 2205, 2179, 243: 2144, 266: 2148, 2187, 290: 2156, 299: 2175, 311: 2189, 2110, 2182, 2204, 2206, 2147, 2146, 2163, 2203, 2183, 2180, 2174, 2178, 2143, 2145, 2181, 2152, 2185, 2193, 2244, 2151, 2194, 2195, 2150, 2173, 2166, 2167, 2217, 2219, 2220, 2221, 2176, 2222, 2201, 2207, 2215, 2216, 2211, 2223, 2224, 2225, 2212, 2227, 2228, 2218, 2213, 2226, 2208, 2214, 2199, 2229, 2230, 2177, 2234, 2190, 2192, 2233, 2239, 2238, 2240, 2237, 2170, 2241, 2236, 2235, 2232, 2186, 2231, 2191, 2196, 2197, 389: 2155, 1635, 1636, 1634, 448: 2171, 2243, 2162, 2157, 2149, 2160, 2158, 2159, 2198, 2210, 2209, 2202, 2200, 2154, 2165, 2242, 2164, 2161, 2115, 2114, 2113, 2451, 505: 2609, 561: 2610}, - {6: 2453, 21: 1228}, - {21: 2611}, - {765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 229: 765, 765, 765, 765, 765, 765, 765, 765, 765, 239: 765, 765, 765, 765, 244: 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 268: 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 291: 765, 765, 765, 765, 765, 765, 765, 765, 300: 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 382: 765}, - {2: 1722, 1639, 1673, 1640, 7: 2119, 1727, 1666, 1724, 2124, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 2128, 1651, 2121, 2123, 2137, 2138, 2136, 2132, 2139, 2129, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 2130, 1760, 1659, 2120, 1737, 1683, 1700, 2125, 2127, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 2135, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 2126, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 2131, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 2122, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 2117, 2118, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 2140, 1835, 2116, 1840, 1839, 1685, 1842, 1844, 1689, 2133, 2134, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 2141, 2142, 1858, 1852, 1853, 1854, 2172, 230: 2153, 2112, 2184, 2188, 235: 2169, 2168, 2205, 2179, 243: 2144, 266: 2148, 2187, 290: 2156, 299: 2175, 311: 2189, 2110, 2182, 2204, 2206, 2147, 2146, 2163, 2203, 2183, 2180, 2174, 2178, 2143, 2145, 2181, 2152, 2185, 2193, 2244, 2151, 2194, 2195, 2150, 2173, 2166, 2167, 2217, 2219, 2220, 2221, 2176, 2222, 2201, 2207, 2215, 2216, 2211, 2223, 2224, 2225, 2212, 2227, 2228, 2218, 2213, 2226, 2208, 2214, 2199, 2229, 2230, 2177, 2234, 2190, 2192, 2233, 2239, 2238, 2240, 2237, 2170, 2241, 2236, 2235, 2232, 2186, 2231, 2191, 2196, 2197, 389: 2155, 1635, 1636, 1634, 448: 2171, 2243, 2162, 2157, 2149, 2160, 2158, 2159, 2198, 2210, 2209, 2202, 2200, 2154, 2165, 2242, 2164, 2161, 2115, 2114, 2113, 2451, 505: 2613}, + {269: 2623}, + {770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 233: 770, 770, 770, 770, 770, 770, 770, 770, 770, 243: 770, 770, 770, 770, 248: 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 271: 770, 273: 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 295: 770, 770, 770, 770, 770, 770, 770, 770, 304: 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 380: 770}, + {2: 1736, 1653, 1687, 1654, 7: 2140, 1741, 1680, 1738, 2145, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 2149, 1665, 2142, 2144, 1859, 2158, 2159, 2157, 2153, 2160, 1837, 1839, 1838, 2150, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 2151, 1774, 1673, 2141, 1751, 1714, 2146, 2148, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 2156, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 2147, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 2152, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 2143, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 2138, 2139, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 2161, 1853, 2137, 1858, 1857, 1699, 1860, 1862, 1703, 2154, 2155, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 2162, 2163, 1876, 1870, 1871, 1872, 2193, 234: 2174, 236: 2205, 2209, 239: 2190, 2189, 2226, 2200, 247: 2165, 270: 2169, 272: 2208, 294: 2177, 303: 2196, 315: 2210, 2277, 2203, 2225, 2227, 2168, 2167, 2184, 2224, 2204, 2201, 2195, 2199, 2164, 2166, 2202, 2173, 2206, 2214, 2265, 2172, 2215, 2216, 2171, 2194, 2187, 2188, 2238, 2240, 2241, 2242, 2197, 2243, 2222, 2228, 2236, 2237, 2232, 2244, 2245, 2246, 2233, 2248, 2249, 2239, 2234, 2247, 2229, 2235, 2220, 2250, 2251, 2198, 2255, 2211, 2213, 2254, 2260, 2259, 2261, 2258, 2191, 2262, 2257, 2256, 381: 2253, 2207, 2252, 2212, 2217, 2218, 393: 2176, 1649, 1650, 1648, 452: 2192, 2264, 2183, 2178, 2170, 2181, 2179, 2180, 2219, 2231, 2230, 2223, 2221, 2175, 2186, 2263, 2185, 2182, 2625}, + {6: 2626, 239: 2560, 2561, 2566, 273: 2562, 305: 2564, 2557, 2563, 2567, 2556, 2565, 2558, 2559}, + {2: 1736, 1653, 1687, 1654, 7: 2140, 1741, 1680, 1738, 2145, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 2149, 1665, 2142, 2144, 1859, 2158, 2159, 2157, 2153, 2160, 1837, 1839, 1838, 2150, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 2151, 1774, 1673, 2141, 1751, 1714, 2146, 2148, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 2156, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 2147, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 2152, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 2143, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 2138, 2139, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 2161, 1853, 2137, 1858, 1857, 1699, 1860, 1862, 1703, 2154, 2155, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 2162, 2163, 1876, 1870, 1871, 1872, 2193, 234: 2174, 236: 2205, 2209, 239: 2190, 2189, 2226, 2200, 247: 2165, 270: 2169, 272: 2208, 294: 2177, 303: 2196, 315: 2210, 2277, 2203, 2225, 2227, 2168, 2167, 2184, 2224, 2204, 2201, 2195, 2199, 2164, 2166, 2202, 2173, 2206, 2214, 2265, 2172, 2215, 2216, 2171, 2194, 2187, 2188, 2238, 2240, 2241, 2242, 2197, 2243, 2222, 2228, 2236, 2237, 2232, 2244, 2245, 2246, 2233, 2248, 2249, 2239, 2234, 2247, 2229, 2235, 2220, 2250, 2251, 2198, 2255, 2211, 2213, 2254, 2260, 2259, 2261, 2258, 2191, 2262, 2257, 2256, 381: 2253, 2207, 2252, 2212, 2217, 2218, 393: 2176, 1649, 1650, 1648, 452: 2192, 2264, 2183, 2178, 2170, 2181, 2179, 2180, 2219, 2231, 2230, 2223, 2221, 2175, 2186, 2263, 2185, 2182, 2627}, // 1095 - {6: 2453, 21: 2614, 240: 2615}, - {770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 229: 770, 770, 770, 770, 770, 770, 770, 770, 770, 239: 770, 770, 770, 770, 244: 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 268: 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 291: 770, 770, 770, 770, 770, 770, 770, 770, 300: 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 382: 770}, - {2: 1722, 1639, 1673, 1640, 7: 1650, 1727, 1666, 1724, 1687, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 1714, 1651, 1660, 1681, 1774, 1775, 1771, 1733, 1780, 1716, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 1719, 1760, 1659, 1658, 1737, 1683, 1700, 1705, 1709, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 1770, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 1706, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 1721, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 1677, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 1638, 1642, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 1834, 1835, 1633, 1840, 1839, 1685, 1842, 1844, 1689, 1753, 1769, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 1855, 1856, 1858, 1852, 1853, 1854, 230: 1889, 389: 1890, 1635, 1636, 1634, 473: 2616}, - {21: 2617}, - {769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 229: 769, 769, 769, 769, 769, 769, 769, 769, 769, 239: 769, 769, 769, 769, 244: 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 268: 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 291: 769, 769, 769, 769, 769, 769, 769, 769, 300: 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 382: 769}, + {21: 2628, 239: 2560, 2561, 2566, 273: 2562, 305: 2564, 2557, 2563, 2567, 2556, 2565, 2558, 2559}, + {772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 233: 772, 772, 772, 772, 772, 772, 772, 772, 772, 243: 772, 772, 772, 772, 248: 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 271: 772, 273: 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 295: 772, 772, 772, 772, 772, 772, 772, 772, 304: 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 380: 772}, + {2: 1736, 1653, 1687, 1654, 7: 2140, 1741, 1680, 1738, 2145, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 1243, 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 2149, 1665, 2142, 2144, 1859, 2158, 2159, 2157, 2153, 2160, 1837, 1839, 1838, 2150, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 2151, 1774, 1673, 2141, 1751, 1714, 2146, 2148, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 2156, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 2147, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 2152, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 2143, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 2138, 2139, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 2161, 1853, 2137, 1858, 1857, 1699, 1860, 1862, 1703, 2154, 2155, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 2162, 2163, 1876, 1870, 1871, 1872, 2193, 234: 2174, 2133, 2205, 2209, 239: 2190, 2189, 2226, 2200, 247: 2165, 270: 2169, 272: 2208, 294: 2177, 303: 2196, 315: 2210, 2131, 2203, 2225, 2227, 2168, 2167, 2184, 2224, 2204, 2201, 2195, 2199, 2164, 2166, 2202, 2173, 2206, 2214, 2265, 2172, 2215, 2216, 2171, 2194, 2187, 2188, 2238, 2240, 2241, 2242, 2197, 2243, 2222, 2228, 2236, 2237, 2232, 2244, 2245, 2246, 2233, 2248, 2249, 2239, 2234, 2247, 2229, 2235, 2220, 2250, 2251, 2198, 2255, 2211, 2213, 2254, 2260, 2259, 2261, 2258, 2191, 2262, 2257, 2256, 381: 2253, 2207, 2252, 2212, 2217, 2218, 393: 2176, 1649, 1650, 1648, 452: 2192, 2264, 2183, 2178, 2170, 2181, 2179, 2180, 2219, 2231, 2230, 2223, 2221, 2175, 2186, 2263, 2185, 2182, 2136, 2135, 2134, 2472, 509: 2630, 565: 2631}, + {6: 2474, 21: 1242}, + {21: 2632}, // 1100 - {771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 229: 771, 771, 771, 771, 771, 771, 771, 771, 771, 239: 771, 771, 771, 771, 244: 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 268: 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 291: 771, 771, 771, 771, 771, 771, 771, 771, 300: 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 382: 771}, - {21: 2620, 266: 2621}, - {709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 229: 709, 709, 709, 709, 709, 709, 709, 709, 709, 239: 709, 709, 709, 709, 244: 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 268: 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 291: 709, 709, 709, 709, 709, 709, 709, 709, 300: 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 382: 709}, - {21: 2622}, - {708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 229: 708, 708, 708, 708, 708, 708, 708, 708, 708, 239: 708, 708, 708, 708, 244: 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 268: 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 291: 708, 708, 708, 708, 708, 708, 708, 708, 300: 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 382: 708}, + {773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 233: 773, 773, 773, 773, 773, 773, 773, 773, 773, 243: 773, 773, 773, 773, 248: 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 271: 773, 273: 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 295: 773, 773, 773, 773, 773, 773, 773, 773, 304: 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 380: 773}, + {2: 1736, 1653, 1687, 1654, 7: 2140, 1741, 1680, 1738, 2145, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 2149, 1665, 2142, 2144, 1859, 2158, 2159, 2157, 2153, 2160, 1837, 1839, 1838, 2150, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 2151, 1774, 1673, 2141, 1751, 1714, 2146, 2148, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 2156, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 2147, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 2152, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 2143, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 2138, 2139, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 2161, 1853, 2137, 1858, 1857, 1699, 1860, 1862, 1703, 2154, 2155, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 2162, 2163, 1876, 1870, 1871, 1872, 2193, 234: 2174, 2133, 2205, 2209, 239: 2190, 2189, 2226, 2200, 247: 2165, 270: 2169, 272: 2208, 294: 2177, 303: 2196, 315: 2210, 2131, 2203, 2225, 2227, 2168, 2167, 2184, 2224, 2204, 2201, 2195, 2199, 2164, 2166, 2202, 2173, 2206, 2214, 2265, 2172, 2215, 2216, 2171, 2194, 2187, 2188, 2238, 2240, 2241, 2242, 2197, 2243, 2222, 2228, 2236, 2237, 2232, 2244, 2245, 2246, 2233, 2248, 2249, 2239, 2234, 2247, 2229, 2235, 2220, 2250, 2251, 2198, 2255, 2211, 2213, 2254, 2260, 2259, 2261, 2258, 2191, 2262, 2257, 2256, 381: 2253, 2207, 2252, 2212, 2217, 2218, 393: 2176, 1649, 1650, 1648, 452: 2192, 2264, 2183, 2178, 2170, 2181, 2179, 2180, 2219, 2231, 2230, 2223, 2221, 2175, 2186, 2263, 2185, 2182, 2136, 2135, 2134, 2472, 509: 2634}, + {6: 2474, 21: 2635, 244: 2636}, + {778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 233: 778, 778, 778, 778, 778, 778, 778, 778, 778, 243: 778, 778, 778, 778, 248: 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 271: 778, 273: 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 295: 778, 778, 778, 778, 778, 778, 778, 778, 304: 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 380: 778}, + {2: 1736, 1653, 1687, 1654, 7: 1664, 1741, 1680, 1738, 1701, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 1728, 1665, 1674, 1695, 1859, 1788, 1789, 1785, 1747, 1794, 1837, 1839, 1838, 1730, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 1733, 1774, 1673, 1672, 1751, 1714, 1719, 1723, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 1784, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 1720, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 1735, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 1691, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 1652, 1656, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 1852, 1853, 1647, 1858, 1857, 1699, 1860, 1862, 1703, 1767, 1783, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 1873, 1874, 1876, 1870, 1871, 1872, 234: 1908, 393: 1909, 1649, 1650, 1648, 477: 2637}, // 1105 - {21: 2624}, - {772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 229: 772, 772, 772, 772, 772, 772, 772, 772, 772, 239: 772, 772, 772, 772, 244: 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 268: 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 291: 772, 772, 772, 772, 772, 772, 772, 772, 300: 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 382: 772}, - {773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 229: 773, 773, 773, 773, 773, 773, 773, 773, 773, 239: 773, 773, 773, 773, 244: 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 268: 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 291: 773, 773, 773, 773, 773, 773, 773, 773, 300: 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 382: 773}, - {2: 1722, 1639, 1673, 1640, 7: 2119, 1727, 1666, 1724, 2124, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 1229, 1758, 1698, 1755, 1781, 1701, 1777, 1702, 2128, 1651, 2121, 2123, 2137, 2138, 2136, 2132, 2139, 2129, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 2130, 1760, 1659, 2120, 1737, 1683, 1700, 2125, 2127, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 2135, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 2126, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 2131, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 2122, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 2117, 2118, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 2140, 1835, 2116, 1840, 1839, 1685, 1842, 1844, 1689, 2133, 2134, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 2141, 2142, 1858, 1852, 1853, 1854, 2172, 230: 2153, 2112, 2184, 2188, 235: 2169, 2168, 2205, 2179, 243: 2144, 266: 2148, 2187, 290: 2156, 299: 2175, 311: 2189, 2110, 2182, 2204, 2206, 2147, 2146, 2163, 2203, 2183, 2180, 2174, 2178, 2143, 2145, 2181, 2152, 2185, 2193, 2244, 2151, 2194, 2195, 2150, 2173, 2166, 2167, 2217, 2219, 2220, 2221, 2176, 2222, 2201, 2207, 2215, 2216, 2211, 2223, 2224, 2225, 2212, 2227, 2228, 2218, 2213, 2226, 2208, 2214, 2199, 2229, 2230, 2177, 2234, 2190, 2192, 2233, 2239, 2238, 2240, 2237, 2170, 2241, 2236, 2235, 2232, 2186, 2231, 2191, 2196, 2197, 389: 2155, 1635, 1636, 1634, 448: 2171, 2243, 2162, 2157, 2149, 2160, 2158, 2159, 2198, 2210, 2209, 2202, 2200, 2154, 2165, 2242, 2164, 2161, 2115, 2114, 2113, 2451, 505: 2609, 561: 2627}, - {21: 2628}, + {21: 2638}, + {777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 233: 777, 777, 777, 777, 777, 777, 777, 777, 777, 243: 777, 777, 777, 777, 248: 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 271: 777, 273: 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 295: 777, 777, 777, 777, 777, 777, 777, 777, 304: 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, 380: 777}, + {779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 233: 779, 779, 779, 779, 779, 779, 779, 779, 779, 243: 779, 779, 779, 779, 248: 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 271: 779, 273: 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 295: 779, 779, 779, 779, 779, 779, 779, 779, 304: 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 380: 779}, + {21: 2641, 270: 2642}, + {717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 233: 717, 717, 717, 717, 717, 717, 717, 717, 717, 243: 717, 717, 717, 717, 248: 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 271: 717, 273: 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 295: 717, 717, 717, 717, 717, 717, 717, 717, 304: 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 380: 717}, // 1110 - {774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 229: 774, 774, 774, 774, 774, 774, 774, 774, 774, 239: 774, 774, 774, 774, 244: 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 268: 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 291: 774, 774, 774, 774, 774, 774, 774, 774, 300: 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 382: 774}, - {2: 1722, 1639, 1673, 1640, 7: 2119, 1727, 1666, 1724, 2124, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 1229, 1758, 1698, 1755, 1781, 1701, 1777, 1702, 2128, 1651, 2121, 2123, 2137, 2138, 2136, 2132, 2139, 2129, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 2130, 1760, 1659, 2120, 1737, 1683, 1700, 2125, 2127, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 2135, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 2126, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 2131, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 2122, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 2117, 2118, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 2140, 1835, 2116, 1840, 1839, 1685, 1842, 1844, 1689, 2133, 2134, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 2141, 2142, 1858, 1852, 1853, 1854, 2172, 230: 2153, 2112, 2184, 2188, 235: 2169, 2168, 2205, 2179, 243: 2144, 266: 2148, 2187, 290: 2156, 299: 2175, 311: 2189, 2110, 2182, 2204, 2206, 2147, 2146, 2163, 2203, 2183, 2180, 2174, 2178, 2143, 2145, 2181, 2152, 2185, 2193, 2244, 2151, 2194, 2195, 2150, 2173, 2166, 2167, 2217, 2219, 2220, 2221, 2176, 2222, 2201, 2207, 2215, 2216, 2211, 2223, 2224, 2225, 2212, 2227, 2228, 2218, 2213, 2226, 2208, 2214, 2199, 2229, 2230, 2177, 2234, 2190, 2192, 2233, 2239, 2238, 2240, 2237, 2170, 2241, 2236, 2235, 2232, 2186, 2231, 2191, 2196, 2197, 389: 2155, 1635, 1636, 1634, 448: 2171, 2243, 2162, 2157, 2149, 2160, 2158, 2159, 2198, 2210, 2209, 2202, 2200, 2154, 2165, 2242, 2164, 2161, 2115, 2114, 2113, 2451, 505: 2609, 561: 2630}, - {21: 2631}, - {775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 229: 775, 775, 775, 775, 775, 775, 775, 775, 775, 239: 775, 775, 775, 775, 244: 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 268: 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 291: 775, 775, 775, 775, 775, 775, 775, 775, 300: 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 382: 775}, - {2: 1722, 1639, 1673, 1640, 7: 1650, 1727, 1666, 1724, 1687, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 1714, 1651, 1660, 1681, 1774, 1775, 1771, 1733, 1780, 1716, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 1719, 1760, 1659, 1658, 1737, 1683, 1700, 1705, 1709, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 1770, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 1706, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 1721, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 1677, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 1638, 1642, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 1834, 1835, 1633, 1840, 1839, 1685, 1842, 1844, 1689, 1753, 1769, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 1855, 1856, 1858, 1852, 1853, 1854, 290: 2156, 389: 2155, 1635, 1636, 1634, 451: 2633}, + {21: 2643}, + {716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 233: 716, 716, 716, 716, 716, 716, 716, 716, 716, 243: 716, 716, 716, 716, 248: 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 271: 716, 273: 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 295: 716, 716, 716, 716, 716, 716, 716, 716, 304: 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 380: 716}, + {21: 2645}, + {780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 233: 780, 780, 780, 780, 780, 780, 780, 780, 780, 243: 780, 780, 780, 780, 248: 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 271: 780, 273: 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 295: 780, 780, 780, 780, 780, 780, 780, 780, 304: 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 380: 780}, + {781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 233: 781, 781, 781, 781, 781, 781, 781, 781, 781, 243: 781, 781, 781, 781, 248: 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 271: 781, 273: 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 295: 781, 781, 781, 781, 781, 781, 781, 781, 304: 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 380: 781}, // 1115 - {21: 2634}, - {828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 229: 828, 828, 828, 828, 828, 828, 828, 828, 828, 239: 828, 828, 828, 828, 244: 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 268: 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 291: 828, 828, 828, 828, 828, 828, 828, 828, 300: 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 382: 828}, - {2: 1722, 1639, 1673, 1640, 7: 1650, 1727, 1666, 1724, 1687, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 1714, 1651, 1660, 1681, 1774, 1775, 1771, 1733, 1780, 1716, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 1719, 1760, 1659, 1658, 1737, 1683, 1700, 1705, 1709, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 1770, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 1706, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 1721, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 1677, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 1638, 1642, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 1834, 1835, 1633, 1840, 1839, 1685, 1842, 1844, 1689, 1753, 1769, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 1855, 1856, 1858, 1852, 1853, 1854, 290: 2156, 389: 2155, 1635, 1636, 1634, 451: 2636}, - {21: 2637}, - {829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 229: 829, 829, 829, 829, 829, 829, 829, 829, 829, 239: 829, 829, 829, 829, 244: 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 268: 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 291: 829, 829, 829, 829, 829, 829, 829, 829, 300: 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 382: 829}, + {2: 1736, 1653, 1687, 1654, 7: 2140, 1741, 1680, 1738, 2145, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 1243, 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 2149, 1665, 2142, 2144, 1859, 2158, 2159, 2157, 2153, 2160, 1837, 1839, 1838, 2150, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 2151, 1774, 1673, 2141, 1751, 1714, 2146, 2148, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 2156, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 2147, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 2152, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 2143, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 2138, 2139, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 2161, 1853, 2137, 1858, 1857, 1699, 1860, 1862, 1703, 2154, 2155, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 2162, 2163, 1876, 1870, 1871, 1872, 2193, 234: 2174, 2133, 2205, 2209, 239: 2190, 2189, 2226, 2200, 247: 2165, 270: 2169, 272: 2208, 294: 2177, 303: 2196, 315: 2210, 2131, 2203, 2225, 2227, 2168, 2167, 2184, 2224, 2204, 2201, 2195, 2199, 2164, 2166, 2202, 2173, 2206, 2214, 2265, 2172, 2215, 2216, 2171, 2194, 2187, 2188, 2238, 2240, 2241, 2242, 2197, 2243, 2222, 2228, 2236, 2237, 2232, 2244, 2245, 2246, 2233, 2248, 2249, 2239, 2234, 2247, 2229, 2235, 2220, 2250, 2251, 2198, 2255, 2211, 2213, 2254, 2260, 2259, 2261, 2258, 2191, 2262, 2257, 2256, 381: 2253, 2207, 2252, 2212, 2217, 2218, 393: 2176, 1649, 1650, 1648, 452: 2192, 2264, 2183, 2178, 2170, 2181, 2179, 2180, 2219, 2231, 2230, 2223, 2221, 2175, 2186, 2263, 2185, 2182, 2136, 2135, 2134, 2472, 509: 2630, 565: 2648}, + {21: 2649}, + {782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 233: 782, 782, 782, 782, 782, 782, 782, 782, 782, 243: 782, 782, 782, 782, 248: 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 271: 782, 273: 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 295: 782, 782, 782, 782, 782, 782, 782, 782, 304: 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 380: 782}, + {2: 1736, 1653, 1687, 1654, 7: 2140, 1741, 1680, 1738, 2145, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 1243, 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 2149, 1665, 2142, 2144, 1859, 2158, 2159, 2157, 2153, 2160, 1837, 1839, 1838, 2150, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 2151, 1774, 1673, 2141, 1751, 1714, 2146, 2148, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 2156, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 2147, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 2152, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 2143, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 2138, 2139, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 2161, 1853, 2137, 1858, 1857, 1699, 1860, 1862, 1703, 2154, 2155, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 2162, 2163, 1876, 1870, 1871, 1872, 2193, 234: 2174, 2133, 2205, 2209, 239: 2190, 2189, 2226, 2200, 247: 2165, 270: 2169, 272: 2208, 294: 2177, 303: 2196, 315: 2210, 2131, 2203, 2225, 2227, 2168, 2167, 2184, 2224, 2204, 2201, 2195, 2199, 2164, 2166, 2202, 2173, 2206, 2214, 2265, 2172, 2215, 2216, 2171, 2194, 2187, 2188, 2238, 2240, 2241, 2242, 2197, 2243, 2222, 2228, 2236, 2237, 2232, 2244, 2245, 2246, 2233, 2248, 2249, 2239, 2234, 2247, 2229, 2235, 2220, 2250, 2251, 2198, 2255, 2211, 2213, 2254, 2260, 2259, 2261, 2258, 2191, 2262, 2257, 2256, 381: 2253, 2207, 2252, 2212, 2217, 2218, 393: 2176, 1649, 1650, 1648, 452: 2192, 2264, 2183, 2178, 2170, 2181, 2179, 2180, 2219, 2231, 2230, 2223, 2221, 2175, 2186, 2263, 2185, 2182, 2136, 2135, 2134, 2472, 509: 2630, 565: 2651}, + {21: 2652}, // 1120 - {2: 1722, 1639, 1673, 1640, 7: 2119, 1727, 1666, 1724, 2124, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 2128, 1651, 2121, 2123, 2137, 2138, 2136, 2132, 2139, 2129, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 2130, 1760, 1659, 2120, 1737, 1683, 1700, 2125, 2127, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 2135, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 2126, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 2131, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 2122, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 2117, 2118, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 2140, 1835, 2116, 1840, 1839, 1685, 1842, 1844, 1689, 2133, 2134, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 2141, 2142, 1858, 1852, 1853, 1854, 2172, 230: 2153, 2112, 2184, 2188, 235: 2169, 2168, 2205, 2179, 243: 2144, 266: 2148, 2187, 290: 2156, 299: 2175, 311: 2189, 2110, 2182, 2204, 2206, 2147, 2146, 2163, 2203, 2183, 2180, 2174, 2178, 2143, 2145, 2181, 2152, 2185, 2193, 2244, 2151, 2194, 2195, 2150, 2173, 2166, 2167, 2217, 2219, 2220, 2221, 2176, 2222, 2201, 2207, 2215, 2216, 2211, 2223, 2224, 2225, 2212, 2227, 2228, 2218, 2213, 2226, 2208, 2214, 2199, 2229, 2230, 2177, 2234, 2190, 2192, 2233, 2239, 2238, 2240, 2237, 2170, 2241, 2236, 2235, 2232, 2186, 2231, 2191, 2196, 2197, 389: 2155, 1635, 1636, 1634, 448: 2171, 2243, 2162, 2157, 2149, 2160, 2158, 2159, 2198, 2210, 2209, 2202, 2200, 2154, 2165, 2242, 2164, 2161, 2115, 2114, 2113, 2639}, - {6: 2640, 240: 2641, 246: 2253, 248: 2251, 250: 2252, 2250, 2248, 470: 2249, 2247}, - {12: 2651, 61: 2648, 2647, 66: 2650, 72: 2653, 299: 2645, 319: 2646, 418: 2649, 475: 2652, 632: 2644}, - {2: 1722, 1639, 1673, 1640, 7: 1650, 1727, 1666, 1724, 1687, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 1714, 1651, 1660, 1681, 1774, 1775, 1771, 1733, 1780, 1716, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 1719, 1760, 1659, 1658, 1737, 1683, 1700, 1705, 1709, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 1770, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 1706, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 1721, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 1677, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 1638, 1642, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 1834, 1835, 1633, 1840, 1839, 1685, 1842, 1844, 1689, 1753, 1769, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 1855, 1856, 1858, 1852, 1853, 1854, 230: 1889, 389: 1890, 1635, 1636, 1634, 473: 2642}, - {21: 2643}, + {783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 233: 783, 783, 783, 783, 783, 783, 783, 783, 783, 243: 783, 783, 783, 783, 248: 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 271: 783, 273: 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 295: 783, 783, 783, 783, 783, 783, 783, 783, 304: 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, 380: 783}, + {2: 1736, 1653, 1687, 1654, 7: 1664, 1741, 1680, 1738, 1701, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 1728, 1665, 1674, 1695, 1859, 1788, 1789, 1785, 1747, 1794, 1837, 1839, 1838, 1730, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 1733, 1774, 1673, 1672, 1751, 1714, 1719, 1723, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 1784, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 1720, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 1735, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 1691, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 1652, 1656, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 1852, 1853, 1647, 1858, 1857, 1699, 1860, 1862, 1703, 1767, 1783, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 1873, 1874, 1876, 1870, 1871, 1872, 294: 2177, 393: 2176, 1649, 1650, 1648, 455: 2654}, + {21: 2655}, + {836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 233: 836, 836, 836, 836, 836, 836, 836, 836, 836, 243: 836, 836, 836, 836, 248: 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 271: 836, 273: 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 295: 836, 836, 836, 836, 836, 836, 836, 836, 304: 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 380: 836}, + {2: 1736, 1653, 1687, 1654, 7: 1664, 1741, 1680, 1738, 1701, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 1728, 1665, 1674, 1695, 1859, 1788, 1789, 1785, 1747, 1794, 1837, 1839, 1838, 1730, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 1733, 1774, 1673, 1672, 1751, 1714, 1719, 1723, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 1784, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 1720, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 1735, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 1691, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 1652, 1656, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 1852, 1853, 1647, 1858, 1857, 1699, 1860, 1862, 1703, 1767, 1783, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 1873, 1874, 1876, 1870, 1871, 1872, 294: 2177, 393: 2176, 1649, 1650, 1648, 455: 2657}, // 1125 - {830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 229: 830, 830, 830, 830, 830, 830, 830, 830, 830, 239: 830, 830, 830, 830, 244: 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 268: 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 291: 830, 830, 830, 830, 830, 830, 830, 830, 300: 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 382: 830}, - {21: 2687}, - {21: 145, 228: 2659, 487: 2660, 503: 2686}, - {7: 145, 21: 145, 228: 2659, 299: 145, 395: 145, 487: 2660, 503: 2673}, - {21: 669}, + {21: 2658}, + {837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 233: 837, 837, 837, 837, 837, 837, 837, 837, 837, 243: 837, 837, 837, 837, 248: 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 271: 837, 273: 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 295: 837, 837, 837, 837, 837, 837, 837, 837, 304: 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 380: 837}, + {2: 1736, 1653, 1687, 1654, 7: 2140, 1741, 1680, 1738, 2145, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 2149, 1665, 2142, 2144, 1859, 2158, 2159, 2157, 2153, 2160, 1837, 1839, 1838, 2150, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 2151, 1774, 1673, 2141, 1751, 1714, 2146, 2148, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 2156, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 2147, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 2152, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 2143, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 2138, 2139, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 2161, 1853, 2137, 1858, 1857, 1699, 1860, 1862, 1703, 2154, 2155, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 2162, 2163, 1876, 1870, 1871, 1872, 2193, 234: 2174, 2133, 2205, 2209, 239: 2190, 2189, 2226, 2200, 247: 2165, 270: 2169, 272: 2208, 294: 2177, 303: 2196, 315: 2210, 2131, 2203, 2225, 2227, 2168, 2167, 2184, 2224, 2204, 2201, 2195, 2199, 2164, 2166, 2202, 2173, 2206, 2214, 2265, 2172, 2215, 2216, 2171, 2194, 2187, 2188, 2238, 2240, 2241, 2242, 2197, 2243, 2222, 2228, 2236, 2237, 2232, 2244, 2245, 2246, 2233, 2248, 2249, 2239, 2234, 2247, 2229, 2235, 2220, 2250, 2251, 2198, 2255, 2211, 2213, 2254, 2260, 2259, 2261, 2258, 2191, 2262, 2257, 2256, 381: 2253, 2207, 2252, 2212, 2217, 2218, 393: 2176, 1649, 1650, 1648, 452: 2192, 2264, 2183, 2178, 2170, 2181, 2179, 2180, 2219, 2231, 2230, 2223, 2221, 2175, 2186, 2263, 2185, 2182, 2136, 2135, 2134, 2660}, + {6: 2661, 244: 2662, 250: 2274, 252: 2272, 2273, 2271, 2269, 474: 2270, 2268}, + {12: 2672, 63: 2669, 2668, 67: 2671, 73: 2674, 303: 2666, 323: 2667, 422: 2670, 479: 2673, 636: 2665}, // 1130 - {21: 145, 228: 2659, 487: 2660, 503: 2672}, - {21: 138, 228: 2665, 487: 2666, 599: 2664, 612: 2667}, - {21: 145, 228: 2659, 487: 2660, 503: 2658}, - {21: 186, 419: 2655, 2656, 700: 2657}, - {21: 186, 419: 2655, 2656, 700: 2654}, + {2: 1736, 1653, 1687, 1654, 7: 1664, 1741, 1680, 1738, 1701, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 1728, 1665, 1674, 1695, 1859, 1788, 1789, 1785, 1747, 1794, 1837, 1839, 1838, 1730, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 1733, 1774, 1673, 1672, 1751, 1714, 1719, 1723, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 1784, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 1720, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 1735, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 1691, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 1652, 1656, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 1852, 1853, 1647, 1858, 1857, 1699, 1860, 1862, 1703, 1767, 1783, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 1873, 1874, 1876, 1870, 1871, 1872, 234: 1908, 393: 1909, 1649, 1650, 1648, 477: 2663}, + {21: 2664}, + {838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 233: 838, 838, 838, 838, 838, 838, 838, 838, 838, 243: 838, 838, 838, 838, 248: 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 271: 838, 273: 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 295: 838, 838, 838, 838, 838, 838, 838, 838, 304: 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 380: 838}, + {21: 2708}, + {21: 146, 232: 2680, 491: 2681, 507: 2707}, // 1135 - {21: 663}, - {21: 664}, - {21: 185}, - {21: 184}, - {21: 665}, + {7: 146, 21: 146, 232: 2680, 303: 146, 399: 146, 491: 2681, 507: 2694}, + {21: 677}, + {21: 146, 232: 2680, 491: 2681, 507: 2693}, + {21: 139, 232: 2686, 491: 2687, 602: 2685, 615: 2688}, + {21: 146, 232: 2680, 491: 2681, 507: 2679}, // 1140 - {21: 666}, - {266: 1624, 474: 2661, 489: 2662}, - {144, 144, 144, 144, 144, 144, 144, 144, 12: 144, 21: 144, 229: 144, 231: 144, 234: 144, 238: 144, 243: 144, 261: 144, 273: 144, 144, 299: 144, 383: 144, 144, 144, 144, 144, 144, 395: 144, 475: 144, 144}, - {1250, 1250, 1250, 1250, 6: 1250, 1250, 1250, 1250, 1250, 1250, 13: 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 54: 1250, 228: 1250, 1250, 234: 1250, 238: 1250, 1250, 1250, 1250, 1250, 244: 1250, 261: 1250, 267: 1250, 393: 1250, 1250, 1250, 1250, 1250, 1250}, - {21: 2663}, + {21: 187, 423: 2676, 2677, 704: 2678}, + {21: 187, 423: 2676, 2677, 704: 2675}, + {21: 671}, + {21: 672}, + {21: 186}, // 1145 - {146, 146, 146, 146, 146, 146, 146, 146, 12: 146, 21: 146, 229: 146, 231: 146, 234: 146, 238: 146, 243: 146, 261: 146, 273: 146, 146, 299: 146, 383: 146, 146, 146, 146, 146, 146, 395: 146, 475: 146, 146}, - {21: 667}, - {266: 1624, 474: 2661, 489: 2668}, - {137, 137, 137, 137, 137, 137, 137, 12: 137, 21: 137, 229: 137, 231: 137, 234: 137, 238: 137, 243: 137, 383: 137, 137, 137, 137, 137, 137, 475: 137, 137}, - {136, 136, 136, 136, 136, 136, 136, 12: 136, 21: 136, 229: 136, 231: 136, 234: 136, 238: 136, 243: 136, 383: 136, 136, 136, 136, 136, 136, 475: 136, 136}, + {21: 185}, + {21: 673}, + {21: 674}, + {270: 1638, 478: 2682, 493: 2683}, + {145, 145, 145, 145, 145, 145, 145, 145, 12: 145, 21: 145, 233: 145, 235: 145, 238: 145, 242: 145, 247: 145, 264: 145, 277: 145, 145, 303: 145, 387: 145, 145, 145, 145, 145, 145, 399: 145, 479: 145, 145}, // 1150 - {6: 2669, 21: 2663}, - {266: 1624, 474: 2661, 489: 2670}, - {21: 2671}, - {135, 135, 135, 135, 135, 135, 135, 12: 135, 21: 135, 229: 135, 231: 135, 234: 135, 238: 135, 243: 135, 383: 135, 135, 135, 135, 135, 135, 475: 135, 135}, - {21: 668}, + {1264, 1264, 1264, 1264, 6: 1264, 1264, 1264, 1264, 1264, 1264, 13: 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 56: 1264, 232: 1264, 1264, 238: 1264, 242: 1264, 1264, 1264, 1264, 1264, 248: 1264, 264: 1264, 272: 1264, 397: 1264, 1264, 1264, 1264, 1264, 1264}, + {21: 2684}, + {147, 147, 147, 147, 147, 147, 147, 147, 12: 147, 21: 147, 233: 147, 235: 147, 238: 147, 242: 147, 247: 147, 264: 147, 277: 147, 147, 303: 147, 387: 147, 147, 147, 147, 147, 147, 399: 147, 479: 147, 147}, + {21: 675}, + {270: 1638, 478: 2682, 493: 2689}, // 1155 - {7: 2678, 21: 132, 299: 2675, 395: 2677, 498: 2676, 549: 2674}, - {21: 670}, - {129, 129, 129, 129, 129, 129, 129, 2678, 21: 129, 229: 129, 231: 129, 234: 129, 238: 129, 243: 129, 261: 129, 383: 129, 129, 129, 129, 129, 129, 395: 2677, 498: 2684, 610: 2683}, - {2: 1722, 1639, 1673, 1640, 7: 1650, 1727, 1666, 1724, 1687, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 1714, 1651, 1660, 1681, 1774, 1775, 1771, 1733, 1780, 1716, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 1719, 1760, 1659, 1658, 1737, 1683, 1700, 1705, 1709, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 1770, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 1706, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 1721, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 1677, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 1638, 1642, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 1834, 1835, 1633, 1840, 1839, 1685, 1842, 1844, 1689, 1753, 1769, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 1855, 1856, 1858, 1852, 1853, 1854, 230: 1889, 299: 1888, 389: 1890, 1635, 1636, 1634, 473: 1887, 522: 2680}, - {257: 2679}, + {138, 138, 138, 138, 138, 138, 138, 12: 138, 21: 138, 233: 138, 235: 138, 238: 138, 242: 138, 247: 138, 387: 138, 138, 138, 138, 138, 138, 479: 138, 138}, + {137, 137, 137, 137, 137, 137, 137, 12: 137, 21: 137, 233: 137, 235: 137, 238: 137, 242: 137, 247: 137, 387: 137, 137, 137, 137, 137, 137, 479: 137, 137}, + {6: 2690, 21: 2684}, + {270: 1638, 478: 2682, 493: 2691}, + {21: 2692}, // 1160 - {126, 126, 126, 126, 126, 126, 7: 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 22: 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 230: 126, 249: 126, 254: 126, 268: 126, 299: 126}, - {127, 127, 127, 127, 127, 127, 7: 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 22: 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 230: 127, 249: 127, 254: 127, 268: 127, 299: 127}, - {134, 134, 134, 134, 134, 134, 134, 21: 134, 229: 134, 231: 134, 234: 134, 238: 134, 243: 134, 261: 134, 299: 2681, 383: 134, 134, 134, 134, 134, 134, 825: 2682}, - {133, 133, 133, 133, 133, 133, 133, 21: 133, 229: 133, 231: 133, 234: 133, 238: 133, 243: 133, 261: 133, 383: 133, 133, 133, 133, 133, 133}, - {130, 130, 130, 130, 130, 130, 130, 21: 130, 229: 130, 231: 130, 234: 130, 238: 130, 243: 130, 261: 130, 383: 130, 130, 130, 130, 130, 130}, + {136, 136, 136, 136, 136, 136, 136, 12: 136, 21: 136, 233: 136, 235: 136, 238: 136, 242: 136, 247: 136, 387: 136, 136, 136, 136, 136, 136, 479: 136, 136}, + {21: 676}, + {7: 2699, 21: 133, 303: 2696, 399: 2698, 502: 2697, 553: 2695}, + {21: 678}, + {130, 130, 130, 130, 130, 130, 130, 2699, 21: 130, 233: 130, 235: 130, 238: 130, 242: 130, 247: 130, 264: 130, 387: 130, 130, 130, 130, 130, 130, 399: 2698, 502: 2705, 613: 2704}, // 1165 - {131, 131, 131, 131, 131, 131, 131, 21: 131, 229: 131, 231: 131, 234: 131, 238: 131, 243: 131, 261: 131, 383: 131, 131, 131, 131, 131, 131}, - {2: 1722, 1639, 1673, 1640, 7: 1650, 1727, 1666, 1724, 1687, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 1714, 1651, 1660, 1681, 1774, 1775, 1771, 1733, 1780, 1716, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 1719, 1760, 1659, 1658, 1737, 1683, 1700, 1705, 1709, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 1770, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 1706, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 1721, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 1677, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 1638, 1642, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 1834, 1835, 1633, 1840, 1839, 1685, 1842, 1844, 1689, 1753, 1769, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 1855, 1856, 1858, 1852, 1853, 1854, 230: 1889, 299: 1888, 389: 1890, 1635, 1636, 1634, 473: 1887, 522: 2685}, - {128, 128, 128, 128, 128, 128, 128, 21: 128, 229: 128, 231: 128, 234: 128, 238: 128, 243: 128, 261: 128, 383: 128, 128, 128, 128, 128, 128}, - {21: 671}, - {831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 229: 831, 831, 831, 831, 831, 831, 831, 831, 831, 239: 831, 831, 831, 831, 244: 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 268: 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 291: 831, 831, 831, 831, 831, 831, 831, 831, 300: 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 382: 831}, + {2: 1736, 1653, 1687, 1654, 7: 1664, 1741, 1680, 1738, 1701, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 1728, 1665, 1674, 1695, 1859, 1788, 1789, 1785, 1747, 1794, 1837, 1839, 1838, 1730, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 1733, 1774, 1673, 1672, 1751, 1714, 1719, 1723, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 1784, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 1720, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 1735, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 1691, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 1652, 1656, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 1852, 1853, 1647, 1858, 1857, 1699, 1860, 1862, 1703, 1767, 1783, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 1873, 1874, 1876, 1870, 1871, 1872, 234: 1908, 303: 1907, 393: 1909, 1649, 1650, 1648, 477: 1906, 527: 2701}, + {262: 2700}, + {127, 127, 127, 127, 127, 127, 7: 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 22: 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 234: 127, 256: 127, 258: 127, 271: 127, 303: 127}, + {128, 128, 128, 128, 128, 128, 7: 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 22: 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 234: 128, 256: 128, 258: 128, 271: 128, 303: 128}, + {135, 135, 135, 135, 135, 135, 135, 21: 135, 233: 135, 235: 135, 238: 135, 242: 135, 247: 135, 264: 135, 303: 2702, 387: 135, 135, 135, 135, 135, 135, 829: 2703}, // 1170 - {246: 2253, 248: 2251, 250: 2252, 2250, 2248, 285: 677, 470: 2249, 2247}, - {285: 2692, 749: 2691, 890: 2690}, - {50: 673, 285: 2692, 287: 2698, 749: 2697, 784: 2696}, - {50: 676, 285: 676, 287: 676}, - {2: 1722, 1639, 1673, 1640, 7: 2119, 1727, 1666, 1724, 2124, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 2128, 1651, 2121, 2123, 2137, 2138, 2136, 2132, 2139, 2129, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 2130, 1760, 1659, 2120, 1737, 1683, 1700, 2125, 2127, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 2135, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 2126, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 2131, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 2122, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 2117, 2118, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 2140, 1835, 2116, 1840, 1839, 1685, 1842, 1844, 1689, 2133, 2134, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 2141, 2142, 1858, 1852, 1853, 1854, 2172, 230: 2153, 2112, 2184, 2188, 235: 2169, 2168, 2205, 2179, 243: 2144, 266: 2148, 2187, 290: 2156, 299: 2175, 311: 2189, 2110, 2182, 2204, 2206, 2147, 2146, 2163, 2203, 2183, 2180, 2174, 2178, 2143, 2145, 2181, 2152, 2185, 2193, 2244, 2151, 2194, 2195, 2150, 2173, 2166, 2167, 2217, 2219, 2220, 2221, 2176, 2222, 2201, 2207, 2215, 2216, 2211, 2223, 2224, 2225, 2212, 2227, 2228, 2218, 2213, 2226, 2208, 2214, 2199, 2229, 2230, 2177, 2234, 2190, 2192, 2233, 2239, 2238, 2240, 2237, 2170, 2241, 2236, 2235, 2232, 2186, 2231, 2191, 2196, 2197, 389: 2155, 1635, 1636, 1634, 448: 2171, 2243, 2162, 2157, 2149, 2160, 2158, 2159, 2198, 2210, 2209, 2202, 2200, 2154, 2165, 2242, 2164, 2161, 2115, 2114, 2113, 2693}, + {134, 134, 134, 134, 134, 134, 134, 21: 134, 233: 134, 235: 134, 238: 134, 242: 134, 247: 134, 264: 134, 387: 134, 134, 134, 134, 134, 134}, + {131, 131, 131, 131, 131, 131, 131, 21: 131, 233: 131, 235: 131, 238: 131, 242: 131, 247: 131, 264: 131, 387: 131, 131, 131, 131, 131, 131}, + {132, 132, 132, 132, 132, 132, 132, 21: 132, 233: 132, 235: 132, 238: 132, 242: 132, 247: 132, 264: 132, 387: 132, 132, 132, 132, 132, 132}, + {2: 1736, 1653, 1687, 1654, 7: 1664, 1741, 1680, 1738, 1701, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 1728, 1665, 1674, 1695, 1859, 1788, 1789, 1785, 1747, 1794, 1837, 1839, 1838, 1730, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 1733, 1774, 1673, 1672, 1751, 1714, 1719, 1723, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 1784, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 1720, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 1735, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 1691, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 1652, 1656, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 1852, 1853, 1647, 1858, 1857, 1699, 1860, 1862, 1703, 1767, 1783, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 1873, 1874, 1876, 1870, 1871, 1872, 234: 1908, 303: 1907, 393: 1909, 1649, 1650, 1648, 477: 1906, 527: 2706}, + {129, 129, 129, 129, 129, 129, 129, 21: 129, 233: 129, 235: 129, 238: 129, 242: 129, 247: 129, 264: 129, 387: 129, 129, 129, 129, 129, 129}, // 1175 - {246: 2253, 248: 2251, 250: 2252, 2250, 2248, 289: 2694, 470: 2249, 2247}, - {2: 1722, 1639, 1673, 1640, 7: 2119, 1727, 1666, 1724, 2124, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 2128, 1651, 2121, 2123, 2137, 2138, 2136, 2132, 2139, 2129, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 2130, 1760, 1659, 2120, 1737, 1683, 1700, 2125, 2127, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 2135, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 2126, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 2131, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 2122, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 2117, 2118, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 2140, 1835, 2116, 1840, 1839, 1685, 1842, 1844, 1689, 2133, 2134, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 2141, 2142, 1858, 1852, 1853, 1854, 2172, 230: 2153, 2112, 2184, 2188, 235: 2169, 2168, 2205, 2179, 243: 2144, 266: 2148, 2187, 290: 2156, 299: 2175, 311: 2189, 2110, 2182, 2204, 2206, 2147, 2146, 2163, 2203, 2183, 2180, 2174, 2178, 2143, 2145, 2181, 2152, 2185, 2193, 2244, 2151, 2194, 2195, 2150, 2173, 2166, 2167, 2217, 2219, 2220, 2221, 2176, 2222, 2201, 2207, 2215, 2216, 2211, 2223, 2224, 2225, 2212, 2227, 2228, 2218, 2213, 2226, 2208, 2214, 2199, 2229, 2230, 2177, 2234, 2190, 2192, 2233, 2239, 2238, 2240, 2237, 2170, 2241, 2236, 2235, 2232, 2186, 2231, 2191, 2196, 2197, 389: 2155, 1635, 1636, 1634, 448: 2171, 2243, 2162, 2157, 2149, 2160, 2158, 2159, 2198, 2210, 2209, 2202, 2200, 2154, 2165, 2242, 2164, 2161, 2115, 2114, 2113, 2695}, - {50: 674, 246: 2253, 248: 2251, 250: 2252, 2250, 2248, 285: 674, 287: 674, 470: 2249, 2247}, - {50: 2700}, - {50: 675, 285: 675, 287: 675}, + {21: 679}, + {839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 233: 839, 839, 839, 839, 839, 839, 839, 839, 839, 243: 839, 839, 839, 839, 248: 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 271: 839, 273: 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 295: 839, 839, 839, 839, 839, 839, 839, 839, 304: 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 380: 839}, + {250: 2274, 252: 2272, 2273, 2271, 2269, 289: 685, 474: 2270, 2268}, + {289: 2713, 753: 2712, 894: 2711}, + {51: 681, 289: 2713, 291: 2719, 753: 2718, 788: 2717}, // 1180 - {2: 1722, 1639, 1673, 1640, 7: 2119, 1727, 1666, 1724, 2124, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 2128, 1651, 2121, 2123, 2137, 2138, 2136, 2132, 2139, 2129, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 2130, 1760, 1659, 2120, 1737, 1683, 1700, 2125, 2127, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 2135, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 2126, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 2131, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 2122, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 2117, 2118, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 2140, 1835, 2116, 1840, 1839, 1685, 1842, 1844, 1689, 2133, 2134, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 2141, 2142, 1858, 1852, 1853, 1854, 2172, 230: 2153, 2112, 2184, 2188, 235: 2169, 2168, 2205, 2179, 243: 2144, 266: 2148, 2187, 290: 2156, 299: 2175, 311: 2189, 2110, 2182, 2204, 2206, 2147, 2146, 2163, 2203, 2183, 2180, 2174, 2178, 2143, 2145, 2181, 2152, 2185, 2193, 2244, 2151, 2194, 2195, 2150, 2173, 2166, 2167, 2217, 2219, 2220, 2221, 2176, 2222, 2201, 2207, 2215, 2216, 2211, 2223, 2224, 2225, 2212, 2227, 2228, 2218, 2213, 2226, 2208, 2214, 2199, 2229, 2230, 2177, 2234, 2190, 2192, 2233, 2239, 2238, 2240, 2237, 2170, 2241, 2236, 2235, 2232, 2186, 2231, 2191, 2196, 2197, 389: 2155, 1635, 1636, 1634, 448: 2171, 2243, 2162, 2157, 2149, 2160, 2158, 2159, 2198, 2210, 2209, 2202, 2200, 2154, 2165, 2242, 2164, 2161, 2115, 2114, 2113, 2699}, - {50: 672, 246: 2253, 248: 2251, 250: 2252, 2250, 2248, 470: 2249, 2247}, - {832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 229: 832, 832, 832, 832, 832, 832, 832, 832, 832, 239: 832, 832, 832, 832, 244: 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 268: 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 291: 832, 832, 832, 832, 832, 832, 832, 832, 300: 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 382: 832}, - {2: 1722, 1639, 1673, 1640, 7: 2119, 1727, 1666, 1724, 2124, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 2128, 1651, 2121, 2123, 2137, 2138, 2136, 2132, 2139, 2129, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 2130, 1760, 1659, 2120, 1737, 1683, 1700, 2125, 2127, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 2135, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 2126, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 2131, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 2122, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 2117, 2118, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 2140, 1835, 2116, 1840, 1839, 1685, 1842, 1844, 1689, 2133, 2134, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 2141, 2142, 1858, 1852, 1853, 1854, 2172, 230: 2153, 2112, 2184, 2188, 235: 2169, 2168, 2205, 2179, 243: 2144, 266: 2148, 2187, 290: 2156, 299: 2175, 311: 2189, 2110, 2182, 2204, 2206, 2147, 2146, 2163, 2203, 2183, 2180, 2174, 2178, 2143, 2145, 2181, 2152, 2185, 2193, 2244, 2151, 2194, 2195, 2150, 2173, 2166, 2167, 2217, 2219, 2220, 2221, 2176, 2222, 2201, 2207, 2215, 2216, 2211, 2223, 2224, 2225, 2212, 2227, 2228, 2218, 2213, 2226, 2208, 2214, 2199, 2229, 2230, 2177, 2234, 2190, 2192, 2233, 2239, 2238, 2240, 2237, 2170, 2241, 2236, 2235, 2232, 2186, 2231, 2191, 2196, 2197, 389: 2155, 1635, 1636, 1634, 448: 2171, 2243, 2162, 2157, 2149, 2160, 2158, 2159, 2198, 2210, 2209, 2202, 2200, 2154, 2165, 2242, 2164, 2161, 2115, 2114, 2113, 2702}, - {234: 2703, 246: 2253, 248: 2251, 250: 2252, 2250, 2248, 470: 2249, 2247}, + {51: 684, 289: 684, 291: 684}, + {2: 1736, 1653, 1687, 1654, 7: 2140, 1741, 1680, 1738, 2145, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 2149, 1665, 2142, 2144, 1859, 2158, 2159, 2157, 2153, 2160, 1837, 1839, 1838, 2150, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 2151, 1774, 1673, 2141, 1751, 1714, 2146, 2148, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 2156, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 2147, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 2152, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 2143, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 2138, 2139, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 2161, 1853, 2137, 1858, 1857, 1699, 1860, 1862, 1703, 2154, 2155, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 2162, 2163, 1876, 1870, 1871, 1872, 2193, 234: 2174, 2133, 2205, 2209, 239: 2190, 2189, 2226, 2200, 247: 2165, 270: 2169, 272: 2208, 294: 2177, 303: 2196, 315: 2210, 2131, 2203, 2225, 2227, 2168, 2167, 2184, 2224, 2204, 2201, 2195, 2199, 2164, 2166, 2202, 2173, 2206, 2214, 2265, 2172, 2215, 2216, 2171, 2194, 2187, 2188, 2238, 2240, 2241, 2242, 2197, 2243, 2222, 2228, 2236, 2237, 2232, 2244, 2245, 2246, 2233, 2248, 2249, 2239, 2234, 2247, 2229, 2235, 2220, 2250, 2251, 2198, 2255, 2211, 2213, 2254, 2260, 2259, 2261, 2258, 2191, 2262, 2257, 2256, 381: 2253, 2207, 2252, 2212, 2217, 2218, 393: 2176, 1649, 1650, 1648, 452: 2192, 2264, 2183, 2178, 2170, 2181, 2179, 2180, 2219, 2231, 2230, 2223, 2221, 2175, 2186, 2263, 2185, 2182, 2136, 2135, 2134, 2714}, + {250: 2274, 252: 2272, 2273, 2271, 2269, 293: 2715, 474: 2270, 2268}, + {2: 1736, 1653, 1687, 1654, 7: 2140, 1741, 1680, 1738, 2145, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 2149, 1665, 2142, 2144, 1859, 2158, 2159, 2157, 2153, 2160, 1837, 1839, 1838, 2150, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 2151, 1774, 1673, 2141, 1751, 1714, 2146, 2148, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 2156, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 2147, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 2152, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 2143, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 2138, 2139, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 2161, 1853, 2137, 1858, 1857, 1699, 1860, 1862, 1703, 2154, 2155, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 2162, 2163, 1876, 1870, 1871, 1872, 2193, 234: 2174, 2133, 2205, 2209, 239: 2190, 2189, 2226, 2200, 247: 2165, 270: 2169, 272: 2208, 294: 2177, 303: 2196, 315: 2210, 2131, 2203, 2225, 2227, 2168, 2167, 2184, 2224, 2204, 2201, 2195, 2199, 2164, 2166, 2202, 2173, 2206, 2214, 2265, 2172, 2215, 2216, 2171, 2194, 2187, 2188, 2238, 2240, 2241, 2242, 2197, 2243, 2222, 2228, 2236, 2237, 2232, 2244, 2245, 2246, 2233, 2248, 2249, 2239, 2234, 2247, 2229, 2235, 2220, 2250, 2251, 2198, 2255, 2211, 2213, 2254, 2260, 2259, 2261, 2258, 2191, 2262, 2257, 2256, 381: 2253, 2207, 2252, 2212, 2217, 2218, 393: 2176, 1649, 1650, 1648, 452: 2192, 2264, 2183, 2178, 2170, 2181, 2179, 2180, 2219, 2231, 2230, 2223, 2221, 2175, 2186, 2263, 2185, 2182, 2136, 2135, 2134, 2716}, + {51: 682, 250: 2274, 252: 2272, 2273, 2271, 2269, 289: 682, 291: 682, 474: 2270, 2268}, // 1185 - {12: 2651, 61: 2648, 2647, 66: 2650, 72: 2653, 299: 2645, 319: 2646, 418: 2649, 475: 2652, 632: 2704}, - {21: 2705}, - {833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 229: 833, 833, 833, 833, 833, 833, 833, 833, 833, 239: 833, 833, 833, 833, 244: 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 268: 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 291: 833, 833, 833, 833, 833, 833, 833, 833, 300: 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 382: 833}, - {834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 229: 834, 834, 834, 834, 834, 834, 834, 834, 834, 239: 834, 834, 834, 834, 244: 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 2257, 834, 834, 834, 834, 268: 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 291: 834, 834, 834, 834, 834, 834, 834, 834, 300: 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 382: 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, 229: 835, 835, 835, 835, 835, 835, 835, 835, 835, 239: 835, 835, 835, 835, 244: 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 268: 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 291: 835, 835, 835, 835, 835, 835, 835, 835, 300: 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 382: 835}, + {51: 2721}, + {51: 683, 289: 683, 291: 683}, + {2: 1736, 1653, 1687, 1654, 7: 2140, 1741, 1680, 1738, 2145, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 2149, 1665, 2142, 2144, 1859, 2158, 2159, 2157, 2153, 2160, 1837, 1839, 1838, 2150, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 2151, 1774, 1673, 2141, 1751, 1714, 2146, 2148, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 2156, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 2147, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 2152, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 2143, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 2138, 2139, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 2161, 1853, 2137, 1858, 1857, 1699, 1860, 1862, 1703, 2154, 2155, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 2162, 2163, 1876, 1870, 1871, 1872, 2193, 234: 2174, 2133, 2205, 2209, 239: 2190, 2189, 2226, 2200, 247: 2165, 270: 2169, 272: 2208, 294: 2177, 303: 2196, 315: 2210, 2131, 2203, 2225, 2227, 2168, 2167, 2184, 2224, 2204, 2201, 2195, 2199, 2164, 2166, 2202, 2173, 2206, 2214, 2265, 2172, 2215, 2216, 2171, 2194, 2187, 2188, 2238, 2240, 2241, 2242, 2197, 2243, 2222, 2228, 2236, 2237, 2232, 2244, 2245, 2246, 2233, 2248, 2249, 2239, 2234, 2247, 2229, 2235, 2220, 2250, 2251, 2198, 2255, 2211, 2213, 2254, 2260, 2259, 2261, 2258, 2191, 2262, 2257, 2256, 381: 2253, 2207, 2252, 2212, 2217, 2218, 393: 2176, 1649, 1650, 1648, 452: 2192, 2264, 2183, 2178, 2170, 2181, 2179, 2180, 2219, 2231, 2230, 2223, 2221, 2175, 2186, 2263, 2185, 2182, 2136, 2135, 2134, 2720}, + {51: 680, 250: 2274, 252: 2272, 2273, 2271, 2269, 474: 2270, 2268}, + {840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 233: 840, 840, 840, 840, 840, 840, 840, 840, 840, 243: 840, 840, 840, 840, 248: 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 271: 840, 273: 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 295: 840, 840, 840, 840, 840, 840, 840, 840, 304: 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 380: 840}, // 1190 - {228: 2711, 394: 1546, 481: 2709, 1547, 1548, 1549, 488: 1552, 490: 1551, 2710}, - {21: 2715, 241: 477}, - {21: 2714}, - {394: 1546, 481: 2712, 1547, 1548, 1549}, - {21: 2713}, + {2: 1736, 1653, 1687, 1654, 7: 2140, 1741, 1680, 1738, 2145, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 2149, 1665, 2142, 2144, 1859, 2158, 2159, 2157, 2153, 2160, 1837, 1839, 1838, 2150, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 2151, 1774, 1673, 2141, 1751, 1714, 2146, 2148, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 2156, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 2147, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 2152, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 2143, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 2138, 2139, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 2161, 1853, 2137, 1858, 1857, 1699, 1860, 1862, 1703, 2154, 2155, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 2162, 2163, 1876, 1870, 1871, 1872, 2193, 234: 2174, 2133, 2205, 2209, 239: 2190, 2189, 2226, 2200, 247: 2165, 270: 2169, 272: 2208, 294: 2177, 303: 2196, 315: 2210, 2131, 2203, 2225, 2227, 2168, 2167, 2184, 2224, 2204, 2201, 2195, 2199, 2164, 2166, 2202, 2173, 2206, 2214, 2265, 2172, 2215, 2216, 2171, 2194, 2187, 2188, 2238, 2240, 2241, 2242, 2197, 2243, 2222, 2228, 2236, 2237, 2232, 2244, 2245, 2246, 2233, 2248, 2249, 2239, 2234, 2247, 2229, 2235, 2220, 2250, 2251, 2198, 2255, 2211, 2213, 2254, 2260, 2259, 2261, 2258, 2191, 2262, 2257, 2256, 381: 2253, 2207, 2252, 2212, 2217, 2218, 393: 2176, 1649, 1650, 1648, 452: 2192, 2264, 2183, 2178, 2170, 2181, 2179, 2180, 2219, 2231, 2230, 2223, 2221, 2175, 2186, 2263, 2185, 2182, 2136, 2135, 2134, 2723}, + {238: 2724, 250: 2274, 252: 2272, 2273, 2271, 2269, 474: 2270, 2268}, + {12: 2672, 63: 2669, 2668, 67: 2671, 73: 2674, 303: 2666, 323: 2667, 422: 2670, 479: 2673, 636: 2725}, + {21: 2726}, + {841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 233: 841, 841, 841, 841, 841, 841, 841, 841, 841, 243: 841, 841, 841, 841, 248: 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 271: 841, 273: 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 295: 841, 841, 841, 841, 841, 841, 841, 841, 304: 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 380: 841}, // 1195 - {241: 476}, - {487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 229: 487, 487, 487, 487, 487, 487, 487, 487, 487, 239: 487, 487, 487, 487, 244: 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 268: 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 291: 487, 487, 487, 487, 487, 487, 487, 487, 300: 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 382: 487}, - {488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 229: 488, 488, 488, 488, 488, 488, 488, 488, 488, 239: 488, 488, 488, 488, 244: 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 268: 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 291: 488, 488, 488, 488, 488, 488, 488, 488, 300: 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 382: 488}, - {2: 1722, 1639, 1673, 1640, 7: 2119, 1727, 1666, 1724, 2124, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 2128, 1651, 2121, 2123, 2137, 2138, 2136, 2132, 2139, 2129, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 2130, 1760, 1659, 2120, 1737, 1683, 1700, 2125, 2127, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 2135, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 2126, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 2131, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 2122, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 2117, 2118, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 2140, 1835, 2116, 1840, 1839, 1685, 1842, 1844, 1689, 2133, 2134, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 2141, 2142, 1858, 1852, 1853, 1854, 2172, 230: 2153, 2112, 2184, 2188, 235: 2169, 2168, 2205, 2179, 243: 2144, 266: 2148, 2187, 290: 2156, 299: 2175, 311: 2189, 2110, 2182, 2204, 2206, 2147, 2146, 2163, 2203, 2183, 2180, 2174, 2178, 2143, 2145, 2181, 2152, 2185, 2193, 2244, 2151, 2194, 2195, 2150, 2173, 2166, 2167, 2217, 2219, 2220, 2221, 2176, 2222, 2201, 2207, 2215, 2216, 2211, 2223, 2224, 2225, 2212, 2227, 2228, 2218, 2213, 2226, 2208, 2214, 2199, 2229, 2230, 2177, 2234, 2190, 2192, 2233, 2239, 2238, 2240, 2237, 2170, 2241, 2236, 2235, 2232, 2186, 2231, 2191, 2196, 2197, 389: 2155, 1635, 1636, 1634, 448: 2171, 2243, 2162, 2157, 2149, 2160, 2158, 2159, 2198, 2210, 2209, 2202, 2200, 2154, 2165, 2242, 2164, 2161, 2115, 2114, 2113, 2451, 505: 2717}, - {6: 2718}, + {842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 233: 842, 842, 842, 842, 842, 842, 842, 842, 842, 243: 842, 842, 842, 842, 248: 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 2278, 842, 842, 842, 842, 842, 271: 842, 273: 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 295: 842, 842, 842, 842, 842, 842, 842, 842, 304: 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 380: 842}, + {843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 233: 843, 843, 843, 843, 843, 843, 843, 843, 843, 243: 843, 843, 843, 843, 248: 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 271: 843, 273: 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 295: 843, 843, 843, 843, 843, 843, 843, 843, 304: 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 380: 843}, + {232: 1564, 398: 1560, 452: 2730, 485: 2107, 1561, 1562, 1563, 492: 1566, 494: 1565, 2108}, + {21: 2116}, + {2: 1736, 1653, 1687, 1654, 7: 2140, 1741, 1680, 1738, 2145, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 2149, 1665, 2142, 2144, 1859, 2158, 2159, 2157, 2153, 2160, 1837, 1839, 1838, 2150, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 2151, 1774, 1673, 2141, 1751, 1714, 2146, 2148, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 2156, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 2147, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 2152, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 2143, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 2138, 2139, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 2161, 1853, 2137, 1858, 1857, 1699, 1860, 1862, 1703, 2154, 2155, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 2162, 2163, 1876, 1870, 1871, 1872, 2193, 234: 2174, 2133, 2205, 2209, 239: 2190, 2189, 2226, 2200, 247: 2165, 270: 2169, 272: 2208, 294: 2177, 303: 2196, 315: 2210, 2131, 2203, 2225, 2227, 2168, 2167, 2184, 2224, 2204, 2201, 2195, 2199, 2164, 2166, 2202, 2173, 2206, 2214, 2265, 2172, 2215, 2216, 2171, 2194, 2187, 2188, 2238, 2240, 2241, 2242, 2197, 2243, 2222, 2228, 2236, 2237, 2232, 2244, 2245, 2246, 2233, 2248, 2249, 2239, 2234, 2247, 2229, 2235, 2220, 2250, 2251, 2198, 2255, 2211, 2213, 2254, 2260, 2259, 2261, 2258, 2191, 2262, 2257, 2256, 381: 2253, 2207, 2252, 2212, 2217, 2218, 393: 2176, 1649, 1650, 1648, 452: 2192, 2264, 2183, 2178, 2170, 2181, 2179, 2180, 2219, 2231, 2230, 2223, 2221, 2175, 2186, 2263, 2185, 2182, 2136, 2135, 2134, 2472, 509: 2732}, // 1200 - {2: 1722, 1639, 1673, 1640, 7: 2119, 1727, 1666, 1724, 2124, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 2128, 1651, 2121, 2123, 2137, 2138, 2136, 2132, 2139, 2129, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 2130, 1760, 1659, 2120, 1737, 1683, 1700, 2125, 2127, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 2135, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 2126, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 2131, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 2122, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 2117, 2118, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 2140, 1835, 2116, 1840, 1839, 1685, 1842, 1844, 1689, 2133, 2134, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 2141, 2142, 1858, 1852, 1853, 1854, 2172, 230: 2153, 2112, 2184, 2188, 235: 2169, 2168, 2205, 2179, 243: 2144, 266: 2148, 2187, 290: 2156, 299: 2175, 311: 2189, 2110, 2182, 2204, 2206, 2147, 2146, 2163, 2203, 2183, 2180, 2174, 2178, 2143, 2145, 2181, 2152, 2185, 2193, 2244, 2151, 2194, 2195, 2150, 2173, 2166, 2167, 2217, 2219, 2220, 2221, 2176, 2222, 2201, 2207, 2215, 2216, 2211, 2223, 2224, 2225, 2212, 2227, 2228, 2218, 2213, 2226, 2208, 2214, 2199, 2229, 2230, 2177, 2234, 2190, 2192, 2233, 2239, 2238, 2240, 2237, 2170, 2241, 2236, 2235, 2232, 2186, 2231, 2191, 2196, 2197, 389: 2155, 1635, 1636, 1634, 448: 2171, 2243, 2162, 2157, 2149, 2160, 2158, 2159, 2198, 2210, 2209, 2202, 2200, 2154, 2165, 2242, 2164, 2161, 2115, 2114, 2113, 2719}, - {6: 1232, 21: 2720, 246: 2253, 248: 2251, 250: 2252, 2250, 2248, 470: 2249, 2247}, - {836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 229: 836, 836, 836, 836, 836, 836, 836, 836, 836, 239: 836, 836, 836, 836, 244: 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 268: 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 291: 836, 836, 836, 836, 836, 836, 836, 836, 300: 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 382: 836}, - {6: 1233, 21: 2729, 246: 2253, 248: 2251, 250: 2252, 2250, 2248, 470: 2249, 2247}, - {6: 2726}, + {6: 2733}, + {2: 1736, 1653, 1687, 1654, 7: 2140, 1741, 1680, 1738, 2145, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 2149, 1665, 2142, 2144, 1859, 2158, 2159, 2157, 2153, 2160, 1837, 1839, 1838, 2150, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 2151, 1774, 1673, 2141, 1751, 1714, 2146, 2148, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 2156, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 2147, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 2152, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 2143, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 2138, 2139, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 2161, 1853, 2137, 1858, 1857, 1699, 1860, 1862, 1703, 2154, 2155, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 2162, 2163, 1876, 1870, 1871, 1872, 2193, 234: 2174, 2133, 2205, 2209, 239: 2190, 2189, 2226, 2200, 247: 2165, 270: 2169, 272: 2208, 294: 2177, 303: 2196, 315: 2210, 2131, 2203, 2225, 2227, 2168, 2167, 2184, 2224, 2204, 2201, 2195, 2199, 2164, 2166, 2202, 2173, 2206, 2214, 2265, 2172, 2215, 2216, 2171, 2194, 2187, 2188, 2238, 2240, 2241, 2242, 2197, 2243, 2222, 2228, 2236, 2237, 2232, 2244, 2245, 2246, 2233, 2248, 2249, 2239, 2234, 2247, 2229, 2235, 2220, 2250, 2251, 2198, 2255, 2211, 2213, 2254, 2260, 2259, 2261, 2258, 2191, 2262, 2257, 2256, 381: 2253, 2207, 2252, 2212, 2217, 2218, 393: 2176, 1649, 1650, 1648, 452: 2192, 2264, 2183, 2178, 2170, 2181, 2179, 2180, 2219, 2231, 2230, 2223, 2221, 2175, 2186, 2263, 2185, 2182, 2136, 2135, 2134, 2734}, + {6: 1246, 21: 2735, 250: 2274, 252: 2272, 2273, 2271, 2269, 474: 2270, 2268}, + {844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 233: 844, 844, 844, 844, 844, 844, 844, 844, 844, 243: 844, 844, 844, 844, 248: 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 271: 844, 273: 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 295: 844, 844, 844, 844, 844, 844, 844, 844, 304: 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 380: 844}, + {6: 1247, 21: 2743, 250: 2274, 252: 2272, 2273, 2271, 2269, 474: 2270, 2268}, // 1205 - {2: 1722, 1639, 1673, 1640, 7: 2119, 1727, 1666, 1724, 2124, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 2128, 1651, 2121, 2123, 2137, 2138, 2136, 2132, 2139, 2129, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 2130, 1760, 1659, 2120, 1737, 1683, 1700, 2125, 2127, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 2135, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 2126, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 2131, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 2122, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 2117, 2118, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 2140, 1835, 2116, 1840, 1839, 1685, 1842, 1844, 1689, 2133, 2134, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 2141, 2142, 1858, 1852, 1853, 1854, 2723, 230: 2153, 2112, 2184, 2188, 235: 2169, 2168, 2205, 2179, 243: 2144, 266: 2148, 2187, 290: 2156, 299: 2175, 311: 2189, 2110, 2182, 2204, 2206, 2147, 2146, 2163, 2203, 2183, 2180, 2174, 2178, 2143, 2145, 2181, 2152, 2185, 2193, 2244, 2151, 2194, 2195, 2150, 2173, 2166, 2167, 2217, 2219, 2220, 2221, 2176, 2222, 2201, 2207, 2215, 2216, 2211, 2223, 2224, 2225, 2212, 2227, 2228, 2218, 2213, 2226, 2208, 2214, 2199, 2229, 2230, 2177, 2234, 2190, 2192, 2233, 2239, 2238, 2240, 2237, 2170, 2241, 2236, 2235, 2232, 2186, 2231, 2191, 2196, 2197, 389: 2155, 1635, 1636, 1634, 394: 1546, 448: 2171, 2243, 2162, 2157, 2149, 2160, 2158, 2159, 2198, 2210, 2209, 2202, 2200, 2154, 2165, 2242, 2164, 2161, 2115, 2114, 2113, 2721, 481: 2724, 1547, 1548, 1549, 488: 1552, 490: 1551, 2710, 505: 2722}, - {21: 2725, 241: 477}, - {488, 488, 6: 488, 21: 488, 231: 488, 235: 488, 488, 488, 241: 476, 246: 488, 248: 488, 250: 488, 488, 488, 254: 488, 261: 488, 268: 488, 488, 288: 488, 291: 488, 488, 488, 488, 488, 488, 488, 488, 300: 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 382: 488}, - {2: 1722, 1639, 1673, 1640, 7: 2119, 1727, 1666, 1724, 2124, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 2128, 1651, 2121, 2123, 2137, 2138, 2136, 2132, 2139, 2129, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 2130, 1760, 1659, 2120, 1737, 1683, 1700, 2125, 2127, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 2135, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 2126, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 2131, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 2122, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 2117, 2118, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 2140, 1835, 2116, 1840, 1839, 1685, 1842, 1844, 1689, 2133, 2134, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 2141, 2142, 1858, 1852, 1853, 1854, 2172, 230: 2153, 2112, 2184, 2188, 235: 2169, 2168, 2205, 2179, 243: 2144, 266: 2148, 2187, 290: 2156, 299: 2175, 311: 2189, 2110, 2182, 2204, 2206, 2147, 2146, 2163, 2203, 2183, 2180, 2174, 2178, 2143, 2145, 2181, 2152, 2185, 2193, 2244, 2151, 2194, 2195, 2150, 2173, 2166, 2167, 2217, 2219, 2220, 2221, 2176, 2222, 2201, 2207, 2215, 2216, 2211, 2223, 2224, 2225, 2212, 2227, 2228, 2218, 2213, 2226, 2208, 2214, 2199, 2229, 2230, 2177, 2234, 2190, 2192, 2233, 2239, 2238, 2240, 2237, 2170, 2241, 2236, 2235, 2232, 2186, 2231, 2191, 2196, 2197, 389: 2155, 1635, 1636, 1634, 448: 2171, 2243, 2162, 2157, 2149, 2160, 2158, 2159, 2198, 2210, 2209, 2202, 2200, 2154, 2165, 2242, 2164, 2161, 2115, 2114, 2113, 2727}, - {6: 1232, 21: 2728, 246: 2253, 248: 2251, 250: 2252, 2250, 2248, 470: 2249, 2247}, + {6: 2740}, + {6: 847, 21: 2116, 235: 847, 239: 847, 847, 847, 250: 847, 252: 847, 847, 847, 847, 258: 847, 264: 847, 271: 847, 273: 847, 292: 847, 295: 847, 847, 847, 847, 847, 847, 847, 847, 304: 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 380: 847}, + {2: 1736, 1653, 1687, 1654, 7: 2140, 1741, 1680, 1738, 2145, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 2149, 1665, 2142, 2144, 1859, 2158, 2159, 2157, 2153, 2160, 1837, 1839, 1838, 2150, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 2151, 1774, 1673, 2141, 1751, 1714, 2146, 2148, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 2156, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 2147, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 2152, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 2143, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 2138, 2139, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 2161, 1853, 2137, 1858, 1857, 1699, 1860, 1862, 1703, 2154, 2155, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 2162, 2163, 1876, 1870, 1871, 1872, 2739, 234: 2174, 2133, 2205, 2209, 239: 2190, 2189, 2226, 2200, 247: 2165, 270: 2169, 272: 2208, 294: 2177, 303: 2196, 315: 2210, 2131, 2203, 2225, 2227, 2168, 2167, 2184, 2224, 2204, 2201, 2195, 2199, 2164, 2166, 2202, 2173, 2206, 2214, 2265, 2172, 2215, 2216, 2171, 2194, 2187, 2188, 2238, 2240, 2241, 2242, 2197, 2243, 2222, 2228, 2236, 2237, 2232, 2244, 2245, 2246, 2233, 2248, 2249, 2239, 2234, 2247, 2229, 2235, 2220, 2250, 2251, 2198, 2255, 2211, 2213, 2254, 2260, 2259, 2261, 2258, 2191, 2262, 2257, 2256, 381: 2253, 2207, 2252, 2212, 2217, 2218, 393: 2176, 1649, 1650, 1648, 398: 1560, 452: 2738, 2264, 2183, 2178, 2170, 2181, 2179, 2180, 2219, 2231, 2230, 2223, 2221, 2175, 2186, 2263, 2185, 2182, 2136, 2135, 2134, 2736, 485: 2111, 1561, 1562, 1563, 492: 1566, 494: 1565, 2108, 509: 2737}, + {2: 1736, 1653, 1687, 1654, 7: 2140, 1741, 1680, 1738, 2145, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 2149, 1665, 2142, 2144, 1859, 2158, 2159, 2157, 2153, 2160, 1837, 1839, 1838, 2150, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 2151, 1774, 1673, 2141, 1751, 1714, 2146, 2148, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 2156, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 2147, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 2152, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 2143, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 2138, 2139, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 2161, 1853, 2137, 1858, 1857, 1699, 1860, 1862, 1703, 2154, 2155, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 2162, 2163, 1876, 1870, 1871, 1872, 2193, 234: 2174, 2133, 2205, 2209, 239: 2190, 2189, 2226, 2200, 247: 2165, 270: 2169, 272: 2208, 294: 2177, 303: 2196, 315: 2210, 2131, 2203, 2225, 2227, 2168, 2167, 2184, 2224, 2204, 2201, 2195, 2199, 2164, 2166, 2202, 2173, 2206, 2214, 2265, 2172, 2215, 2216, 2171, 2194, 2187, 2188, 2238, 2240, 2241, 2242, 2197, 2243, 2222, 2228, 2236, 2237, 2232, 2244, 2245, 2246, 2233, 2248, 2249, 2239, 2234, 2247, 2229, 2235, 2220, 2250, 2251, 2198, 2255, 2211, 2213, 2254, 2260, 2259, 2261, 2258, 2191, 2262, 2257, 2256, 381: 2253, 2207, 2252, 2212, 2217, 2218, 393: 2176, 1649, 1650, 1648, 452: 2192, 2264, 2183, 2178, 2170, 2181, 2179, 2180, 2219, 2231, 2230, 2223, 2221, 2175, 2186, 2263, 2185, 2182, 2136, 2135, 2134, 2741}, + {6: 1246, 21: 2742, 250: 2274, 252: 2272, 2273, 2271, 2269, 474: 2270, 2268}, // 1210 - {837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 229: 837, 837, 837, 837, 837, 837, 837, 837, 837, 239: 837, 837, 837, 837, 244: 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 268: 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 291: 837, 837, 837, 837, 837, 837, 837, 837, 300: 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 382: 837}, - {838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 229: 838, 838, 838, 838, 838, 838, 838, 838, 838, 239: 838, 838, 838, 838, 244: 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 268: 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 291: 838, 838, 838, 838, 838, 838, 838, 838, 300: 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 382: 838}, - {840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 229: 840, 840, 840, 840, 840, 840, 840, 840, 840, 239: 840, 840, 840, 840, 244: 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 2257, 840, 840, 840, 840, 268: 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 291: 840, 840, 840, 840, 840, 840, 840, 840, 300: 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 382: 840}, - {842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 229: 842, 842, 842, 842, 842, 842, 842, 842, 842, 239: 842, 842, 842, 842, 244: 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 2257, 842, 842, 842, 842, 268: 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 291: 842, 842, 842, 842, 842, 842, 842, 842, 300: 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 382: 842}, - {843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 229: 843, 843, 843, 843, 843, 843, 843, 843, 843, 239: 843, 843, 843, 843, 244: 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 2257, 843, 843, 843, 843, 268: 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 291: 843, 843, 843, 843, 843, 843, 843, 843, 300: 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 382: 843}, + {845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 233: 845, 845, 845, 845, 845, 845, 845, 845, 845, 243: 845, 845, 845, 845, 248: 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 271: 845, 273: 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 295: 845, 845, 845, 845, 845, 845, 845, 845, 304: 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 380: 845}, + {846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 233: 846, 846, 846, 846, 846, 846, 846, 846, 846, 243: 846, 846, 846, 846, 248: 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 271: 846, 273: 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 295: 846, 846, 846, 846, 846, 846, 846, 846, 304: 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 380: 846}, + {848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 233: 848, 848, 848, 848, 848, 848, 848, 848, 848, 243: 848, 848, 848, 848, 248: 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 2278, 848, 848, 848, 848, 848, 271: 848, 273: 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 295: 848, 848, 848, 848, 848, 848, 848, 848, 304: 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 380: 848}, + {850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 233: 850, 850, 850, 850, 850, 850, 850, 850, 850, 243: 850, 850, 850, 850, 248: 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 2278, 850, 850, 850, 850, 850, 271: 850, 273: 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 295: 850, 850, 850, 850, 850, 850, 850, 850, 304: 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 380: 850}, + {851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 233: 851, 851, 851, 851, 851, 851, 851, 851, 851, 243: 851, 851, 851, 851, 248: 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 2278, 851, 851, 851, 851, 851, 271: 851, 273: 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 295: 851, 851, 851, 851, 851, 851, 851, 851, 304: 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 380: 851}, // 1215 - {844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 229: 844, 844, 844, 844, 844, 844, 844, 844, 844, 239: 844, 844, 844, 844, 244: 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 2257, 844, 844, 844, 844, 268: 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 291: 844, 844, 844, 844, 844, 844, 844, 844, 300: 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 382: 844}, - {845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 229: 845, 845, 845, 845, 845, 845, 845, 845, 845, 239: 845, 845, 845, 845, 244: 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 2257, 845, 845, 845, 845, 268: 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 291: 845, 845, 845, 845, 845, 845, 845, 845, 300: 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 382: 845}, - {230: 2738}, - {230: 2737}, - {826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 229: 826, 826, 826, 826, 826, 826, 826, 826, 826, 239: 826, 826, 826, 826, 244: 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 268: 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 291: 826, 826, 826, 826, 826, 826, 826, 826, 300: 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 382: 826}, + {852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 233: 852, 852, 852, 852, 852, 852, 852, 852, 852, 243: 852, 852, 852, 852, 248: 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 2278, 852, 852, 852, 852, 852, 271: 852, 273: 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 295: 852, 852, 852, 852, 852, 852, 852, 852, 304: 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 380: 852}, + {853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 233: 853, 853, 853, 853, 853, 853, 853, 853, 853, 243: 853, 853, 853, 853, 248: 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 2278, 853, 853, 853, 853, 853, 271: 853, 273: 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 295: 853, 853, 853, 853, 853, 853, 853, 853, 304: 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 380: 853}, + {234: 2752}, + {234: 2751}, + {834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 233: 834, 834, 834, 834, 834, 834, 834, 834, 834, 243: 834, 834, 834, 834, 248: 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 271: 834, 273: 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 295: 834, 834, 834, 834, 834, 834, 834, 834, 304: 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 380: 834}, // 1220 - {827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 229: 827, 827, 827, 827, 827, 827, 827, 827, 827, 239: 827, 827, 827, 827, 244: 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 268: 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 291: 827, 827, 827, 827, 827, 827, 827, 827, 300: 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 382: 827}, - {290: 2740}, - {2: 1722, 1639, 1673, 1640, 7: 1650, 1727, 1666, 1724, 1687, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 1714, 1651, 1660, 1681, 1774, 1775, 1771, 1733, 1780, 1716, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 1719, 1760, 1659, 1658, 1737, 1683, 1700, 1705, 1709, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 1770, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 1706, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 1721, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 1677, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 1638, 1642, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 1834, 1835, 1633, 1840, 1839, 1685, 1842, 1844, 1689, 1753, 1769, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 1855, 1856, 1858, 1852, 1853, 1854, 389: 2741, 1635, 1636, 1634}, - {857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 229: 857, 857, 857, 857, 857, 857, 857, 857, 857, 239: 857, 857, 857, 857, 244: 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 268: 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 291: 857, 857, 857, 857, 857, 857, 857, 857, 300: 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 382: 857, 399: 857, 857}, - {2: 1722, 1639, 1673, 1640, 7: 1650, 1727, 1666, 1724, 1687, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 1714, 1651, 1660, 1681, 1774, 1775, 1771, 1733, 1780, 1716, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 1719, 1760, 1659, 1658, 1737, 1683, 1700, 1705, 1709, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 1770, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 1706, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 1721, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 1677, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 1638, 1642, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 1834, 1835, 1633, 1840, 1839, 1685, 1842, 1844, 1689, 1753, 1769, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 1855, 1856, 1858, 1852, 1853, 1854, 389: 2743, 1635, 1636, 1634}, + {835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 233: 835, 835, 835, 835, 835, 835, 835, 835, 835, 243: 835, 835, 835, 835, 248: 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 271: 835, 273: 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 295: 835, 835, 835, 835, 835, 835, 835, 835, 304: 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 380: 835}, + {294: 2754}, + {2: 1736, 1653, 1687, 1654, 7: 1664, 1741, 1680, 1738, 1701, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 1728, 1665, 1674, 1695, 1859, 1788, 1789, 1785, 1747, 1794, 1837, 1839, 1838, 1730, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 1733, 1774, 1673, 1672, 1751, 1714, 1719, 1723, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 1784, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 1720, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 1735, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 1691, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 1652, 1656, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 1852, 1853, 1647, 1858, 1857, 1699, 1860, 1862, 1703, 1767, 1783, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 1873, 1874, 1876, 1870, 1871, 1872, 393: 2755, 1649, 1650, 1648}, + {865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 233: 865, 865, 865, 865, 865, 865, 865, 865, 865, 243: 865, 865, 865, 865, 248: 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 271: 865, 273: 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 295: 865, 865, 865, 865, 865, 865, 865, 865, 304: 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 380: 865, 403: 865, 865}, + {2: 1736, 1653, 1687, 1654, 7: 1664, 1741, 1680, 1738, 1701, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 1728, 1665, 1674, 1695, 1859, 1788, 1789, 1785, 1747, 1794, 1837, 1839, 1838, 1730, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 1733, 1774, 1673, 1672, 1751, 1714, 1719, 1723, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 1784, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 1720, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 1735, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 1691, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 1652, 1656, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 1852, 1853, 1647, 1858, 1857, 1699, 1860, 1862, 1703, 1767, 1783, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 1873, 1874, 1876, 1870, 1871, 1872, 393: 2757, 1649, 1650, 1648}, // 1225 - {858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 229: 858, 858, 858, 858, 858, 858, 858, 858, 858, 239: 858, 858, 858, 858, 244: 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 268: 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 2744, 858, 858, 858, 858, 858, 858, 858, 858, 300: 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 382: 858, 399: 858, 858}, - {2: 1722, 1639, 1673, 1640, 7: 1650, 1727, 1666, 1724, 1687, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 1714, 1651, 1660, 1681, 1774, 1775, 1771, 1733, 1780, 1716, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 1719, 1760, 1659, 1658, 1737, 1683, 1700, 1705, 1709, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 1770, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 1706, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 1721, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 1677, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 1638, 1642, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 1834, 1835, 1633, 1840, 1839, 1685, 1842, 1844, 1689, 1753, 1769, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 1855, 1856, 1858, 1852, 1853, 1854, 389: 2745, 1635, 1636, 1634}, - {856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 229: 856, 856, 856, 856, 856, 856, 856, 856, 856, 239: 856, 856, 856, 856, 244: 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 268: 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 291: 856, 856, 856, 856, 856, 856, 856, 856, 300: 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 382: 856, 399: 856, 856}, - {888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 229: 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 268: 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 291: 888, 888, 888, 888, 888, 888, 888, 888, 300: 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 382: 888, 888, 888, 888, 888, 888, 888}, - {884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 229: 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 268: 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 291: 884, 884, 884, 884, 884, 884, 884, 884, 300: 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 382: 884, 884, 884, 884, 884, 884, 884}, + {866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 233: 866, 866, 866, 866, 866, 866, 866, 866, 866, 243: 866, 866, 866, 866, 248: 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 271: 866, 273: 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 2758, 866, 866, 866, 866, 866, 866, 866, 866, 304: 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 380: 866, 403: 866, 866}, + {2: 1736, 1653, 1687, 1654, 7: 1664, 1741, 1680, 1738, 1701, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 1728, 1665, 1674, 1695, 1859, 1788, 1789, 1785, 1747, 1794, 1837, 1839, 1838, 1730, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 1733, 1774, 1673, 1672, 1751, 1714, 1719, 1723, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 1784, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 1720, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 1735, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 1691, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 1652, 1656, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 1852, 1853, 1647, 1858, 1857, 1699, 1860, 1862, 1703, 1767, 1783, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 1873, 1874, 1876, 1870, 1871, 1872, 393: 2759, 1649, 1650, 1648}, + {864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 233: 864, 864, 864, 864, 864, 864, 864, 864, 864, 243: 864, 864, 864, 864, 248: 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 271: 864, 273: 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 295: 864, 864, 864, 864, 864, 864, 864, 864, 304: 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 380: 864, 403: 864, 864}, + {896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 233: 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 271: 896, 273: 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 295: 896, 896, 896, 896, 896, 896, 896, 896, 304: 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 380: 896, 387: 896, 896, 896, 896, 896, 896}, + {892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 233: 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 271: 892, 273: 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 295: 892, 892, 892, 892, 892, 892, 892, 892, 304: 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 380: 892, 387: 892, 892, 892, 892, 892, 892}, // 1230 - {29: 2758, 31: 2754, 2753, 2750, 2752, 2756, 2757, 2751, 2755, 740: 2749}, - {6: 2759}, - {6: 687}, - {6: 686}, - {6: 685}, + {30: 2772, 32: 2768, 2767, 35: 2764, 2766, 2770, 2771, 2765, 43: 2769, 744: 2763}, + {6: 2773}, + {6: 695}, + {6: 694}, + {6: 693}, // 1235 - {6: 684}, - {6: 683}, - {6: 682}, - {6: 681}, - {6: 680}, + {6: 692}, + {6: 691}, + {6: 690}, + {6: 689}, + {6: 688}, // 1240 - {6: 679}, - {2: 1722, 1639, 1673, 1640, 7: 2119, 1727, 1666, 1724, 2124, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 2128, 1651, 2121, 2123, 2137, 2138, 2136, 2132, 2139, 2129, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 2130, 1760, 1659, 2120, 1737, 1683, 1700, 2125, 2127, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 2135, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 2126, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 2131, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 2122, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 2117, 2118, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 2140, 1835, 2116, 1840, 1839, 1685, 1842, 1844, 1689, 2133, 2134, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 2141, 2142, 1858, 1852, 1853, 1854, 2172, 230: 2153, 2112, 2184, 2188, 235: 2169, 2168, 2205, 2179, 243: 2144, 266: 2148, 2187, 290: 2156, 299: 2175, 311: 2189, 2110, 2182, 2204, 2206, 2147, 2146, 2163, 2203, 2183, 2180, 2174, 2178, 2143, 2145, 2181, 2152, 2185, 2193, 2244, 2151, 2194, 2195, 2150, 2173, 2166, 2167, 2217, 2219, 2220, 2221, 2176, 2222, 2201, 2207, 2215, 2216, 2211, 2223, 2224, 2225, 2212, 2227, 2228, 2218, 2213, 2226, 2208, 2214, 2199, 2229, 2230, 2177, 2234, 2190, 2192, 2233, 2239, 2238, 2240, 2237, 2170, 2241, 2236, 2235, 2232, 2186, 2231, 2191, 2196, 2197, 389: 2155, 1635, 1636, 1634, 448: 2171, 2243, 2162, 2157, 2149, 2160, 2158, 2159, 2198, 2210, 2209, 2202, 2200, 2154, 2165, 2242, 2164, 2161, 2115, 2114, 2113, 2760}, - {6: 2761, 246: 2253, 248: 2251, 250: 2252, 2250, 2248, 470: 2249, 2247}, - {2: 1722, 1639, 1673, 1640, 7: 2119, 1727, 1666, 1724, 2124, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 2128, 1651, 2121, 2123, 2137, 2138, 2136, 2132, 2139, 2129, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 2130, 1760, 1659, 2120, 1737, 1683, 1700, 2125, 2127, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 2135, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 2126, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 2131, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 2122, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 2117, 2118, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 2140, 1835, 2116, 1840, 1839, 1685, 1842, 1844, 1689, 2133, 2134, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 2141, 2142, 1858, 1852, 1853, 1854, 2172, 230: 2153, 2112, 2184, 2188, 235: 2169, 2168, 2205, 2179, 243: 2144, 266: 2148, 2187, 290: 2156, 299: 2175, 311: 2189, 2110, 2182, 2204, 2206, 2147, 2146, 2163, 2203, 2183, 2180, 2174, 2178, 2143, 2145, 2181, 2152, 2185, 2193, 2244, 2151, 2194, 2195, 2150, 2173, 2166, 2167, 2217, 2219, 2220, 2221, 2176, 2222, 2201, 2207, 2215, 2216, 2211, 2223, 2224, 2225, 2212, 2227, 2228, 2218, 2213, 2226, 2208, 2214, 2199, 2229, 2230, 2177, 2234, 2190, 2192, 2233, 2239, 2238, 2240, 2237, 2170, 2241, 2236, 2235, 2232, 2186, 2231, 2191, 2196, 2197, 389: 2155, 1635, 1636, 1634, 448: 2171, 2243, 2162, 2157, 2149, 2160, 2158, 2159, 2198, 2210, 2209, 2202, 2200, 2154, 2165, 2242, 2164, 2161, 2115, 2114, 2113, 2762}, - {21: 2763, 246: 2253, 248: 2251, 250: 2252, 2250, 2248, 470: 2249, 2247}, + {6: 687}, + {2: 1736, 1653, 1687, 1654, 7: 2140, 1741, 1680, 1738, 2145, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 2149, 1665, 2142, 2144, 1859, 2158, 2159, 2157, 2153, 2160, 1837, 1839, 1838, 2150, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 2151, 1774, 1673, 2141, 1751, 1714, 2146, 2148, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 2156, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 2147, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 2152, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 2143, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 2138, 2139, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 2161, 1853, 2137, 1858, 1857, 1699, 1860, 1862, 1703, 2154, 2155, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 2162, 2163, 1876, 1870, 1871, 1872, 2193, 234: 2174, 2133, 2205, 2209, 239: 2190, 2189, 2226, 2200, 247: 2165, 270: 2169, 272: 2208, 294: 2177, 303: 2196, 315: 2210, 2131, 2203, 2225, 2227, 2168, 2167, 2184, 2224, 2204, 2201, 2195, 2199, 2164, 2166, 2202, 2173, 2206, 2214, 2265, 2172, 2215, 2216, 2171, 2194, 2187, 2188, 2238, 2240, 2241, 2242, 2197, 2243, 2222, 2228, 2236, 2237, 2232, 2244, 2245, 2246, 2233, 2248, 2249, 2239, 2234, 2247, 2229, 2235, 2220, 2250, 2251, 2198, 2255, 2211, 2213, 2254, 2260, 2259, 2261, 2258, 2191, 2262, 2257, 2256, 381: 2253, 2207, 2252, 2212, 2217, 2218, 393: 2176, 1649, 1650, 1648, 452: 2192, 2264, 2183, 2178, 2170, 2181, 2179, 2180, 2219, 2231, 2230, 2223, 2221, 2175, 2186, 2263, 2185, 2182, 2136, 2135, 2134, 2774}, + {6: 2775, 250: 2274, 252: 2272, 2273, 2271, 2269, 474: 2270, 2268}, + {2: 1736, 1653, 1687, 1654, 7: 2140, 1741, 1680, 1738, 2145, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 2149, 1665, 2142, 2144, 1859, 2158, 2159, 2157, 2153, 2160, 1837, 1839, 1838, 2150, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 2151, 1774, 1673, 2141, 1751, 1714, 2146, 2148, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 2156, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 2147, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 2152, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 2143, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 2138, 2139, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 2161, 1853, 2137, 1858, 1857, 1699, 1860, 1862, 1703, 2154, 2155, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 2162, 2163, 1876, 1870, 1871, 1872, 2193, 234: 2174, 2133, 2205, 2209, 239: 2190, 2189, 2226, 2200, 247: 2165, 270: 2169, 272: 2208, 294: 2177, 303: 2196, 315: 2210, 2131, 2203, 2225, 2227, 2168, 2167, 2184, 2224, 2204, 2201, 2195, 2199, 2164, 2166, 2202, 2173, 2206, 2214, 2265, 2172, 2215, 2216, 2171, 2194, 2187, 2188, 2238, 2240, 2241, 2242, 2197, 2243, 2222, 2228, 2236, 2237, 2232, 2244, 2245, 2246, 2233, 2248, 2249, 2239, 2234, 2247, 2229, 2235, 2220, 2250, 2251, 2198, 2255, 2211, 2213, 2254, 2260, 2259, 2261, 2258, 2191, 2262, 2257, 2256, 381: 2253, 2207, 2252, 2212, 2217, 2218, 393: 2176, 1649, 1650, 1648, 452: 2192, 2264, 2183, 2178, 2170, 2181, 2179, 2180, 2219, 2231, 2230, 2223, 2221, 2175, 2186, 2263, 2185, 2182, 2136, 2135, 2134, 2776}, + {21: 2777, 250: 2274, 252: 2272, 2273, 2271, 2269, 474: 2270, 2268}, // 1245 - {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, 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, 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, 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, 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, 229: 748, 748, 748, 748, 748, 748, 748, 748, 748, 239: 748, 748, 748, 748, 244: 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 268: 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 291: 748, 748, 748, 748, 748, 748, 748, 748, 300: 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 382: 748}, - {29: 2758, 31: 2754, 2753, 2750, 2752, 2756, 2757, 2751, 2755, 740: 2765}, - {6: 2766}, - {2: 1722, 1639, 1673, 1640, 7: 2119, 1727, 1666, 1724, 2124, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 2128, 1651, 2121, 2123, 2137, 2138, 2136, 2132, 2139, 2129, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 2130, 1760, 1659, 2120, 1737, 1683, 1700, 2125, 2127, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 2135, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 2126, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 2131, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 2122, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 2117, 2118, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 2140, 1835, 2116, 1840, 1839, 1685, 1842, 1844, 1689, 2133, 2134, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 2141, 2142, 1858, 1852, 1853, 1854, 2172, 230: 2153, 2112, 2184, 2188, 235: 2169, 2168, 2205, 2179, 243: 2144, 266: 2148, 2187, 290: 2156, 299: 2175, 311: 2189, 2110, 2182, 2204, 2206, 2147, 2146, 2163, 2203, 2183, 2180, 2174, 2178, 2143, 2145, 2181, 2152, 2185, 2193, 2244, 2151, 2194, 2195, 2150, 2173, 2166, 2167, 2217, 2219, 2220, 2221, 2176, 2222, 2201, 2207, 2215, 2216, 2211, 2223, 2224, 2225, 2212, 2227, 2228, 2218, 2213, 2226, 2208, 2214, 2199, 2229, 2230, 2177, 2234, 2190, 2192, 2233, 2239, 2238, 2240, 2237, 2170, 2241, 2236, 2235, 2232, 2186, 2231, 2191, 2196, 2197, 389: 2155, 1635, 1636, 1634, 448: 2171, 2243, 2162, 2157, 2149, 2160, 2158, 2159, 2198, 2210, 2209, 2202, 2200, 2154, 2165, 2242, 2164, 2161, 2115, 2114, 2113, 2767}, - {6: 2768, 246: 2253, 248: 2251, 250: 2252, 2250, 2248, 470: 2249, 2247}, + {756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 233: 756, 756, 756, 756, 756, 756, 756, 756, 756, 243: 756, 756, 756, 756, 248: 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 271: 756, 273: 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 295: 756, 756, 756, 756, 756, 756, 756, 756, 304: 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 380: 756}, + {30: 2772, 32: 2768, 2767, 35: 2764, 2766, 2770, 2771, 2765, 43: 2769, 744: 2779}, + {6: 2780}, + {2: 1736, 1653, 1687, 1654, 7: 2140, 1741, 1680, 1738, 2145, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 2149, 1665, 2142, 2144, 1859, 2158, 2159, 2157, 2153, 2160, 1837, 1839, 1838, 2150, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 2151, 1774, 1673, 2141, 1751, 1714, 2146, 2148, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 2156, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 2147, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 2152, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 2143, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 2138, 2139, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 2161, 1853, 2137, 1858, 1857, 1699, 1860, 1862, 1703, 2154, 2155, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 2162, 2163, 1876, 1870, 1871, 1872, 2193, 234: 2174, 2133, 2205, 2209, 239: 2190, 2189, 2226, 2200, 247: 2165, 270: 2169, 272: 2208, 294: 2177, 303: 2196, 315: 2210, 2131, 2203, 2225, 2227, 2168, 2167, 2184, 2224, 2204, 2201, 2195, 2199, 2164, 2166, 2202, 2173, 2206, 2214, 2265, 2172, 2215, 2216, 2171, 2194, 2187, 2188, 2238, 2240, 2241, 2242, 2197, 2243, 2222, 2228, 2236, 2237, 2232, 2244, 2245, 2246, 2233, 2248, 2249, 2239, 2234, 2247, 2229, 2235, 2220, 2250, 2251, 2198, 2255, 2211, 2213, 2254, 2260, 2259, 2261, 2258, 2191, 2262, 2257, 2256, 381: 2253, 2207, 2252, 2212, 2217, 2218, 393: 2176, 1649, 1650, 1648, 452: 2192, 2264, 2183, 2178, 2170, 2181, 2179, 2180, 2219, 2231, 2230, 2223, 2221, 2175, 2186, 2263, 2185, 2182, 2136, 2135, 2134, 2781}, + {6: 2782, 250: 2274, 252: 2272, 2273, 2271, 2269, 474: 2270, 2268}, // 1250 - {2: 1722, 1639, 1673, 1640, 7: 2119, 1727, 1666, 1724, 2124, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 2128, 1651, 2121, 2123, 2137, 2138, 2136, 2132, 2139, 2129, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 2130, 1760, 1659, 2120, 1737, 1683, 1700, 2125, 2127, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 2135, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 2126, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 2131, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 2122, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 2117, 2118, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 2140, 1835, 2116, 1840, 1839, 1685, 1842, 1844, 1689, 2133, 2134, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 2141, 2142, 1858, 1852, 1853, 1854, 2172, 230: 2153, 2112, 2184, 2188, 235: 2169, 2168, 2205, 2179, 243: 2144, 266: 2148, 2187, 290: 2156, 299: 2175, 311: 2189, 2110, 2182, 2204, 2206, 2147, 2146, 2163, 2203, 2183, 2180, 2174, 2178, 2143, 2145, 2181, 2152, 2185, 2193, 2244, 2151, 2194, 2195, 2150, 2173, 2166, 2167, 2217, 2219, 2220, 2221, 2176, 2222, 2201, 2207, 2215, 2216, 2211, 2223, 2224, 2225, 2212, 2227, 2228, 2218, 2213, 2226, 2208, 2214, 2199, 2229, 2230, 2177, 2234, 2190, 2192, 2233, 2239, 2238, 2240, 2237, 2170, 2241, 2236, 2235, 2232, 2186, 2231, 2191, 2196, 2197, 389: 2155, 1635, 1636, 1634, 448: 2171, 2243, 2162, 2157, 2149, 2160, 2158, 2159, 2198, 2210, 2209, 2202, 2200, 2154, 2165, 2242, 2164, 2161, 2115, 2114, 2113, 2769}, - {21: 2770, 246: 2253, 248: 2251, 250: 2252, 2250, 2248, 470: 2249, 2247}, - {749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 229: 749, 749, 749, 749, 749, 749, 749, 749, 749, 239: 749, 749, 749, 749, 244: 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 268: 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 291: 749, 749, 749, 749, 749, 749, 749, 749, 300: 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 382: 749}, - {61: 2774, 2773, 66: 2775, 111: 2776, 798: 2772}, - {6: 2777}, + {2: 1736, 1653, 1687, 1654, 7: 2140, 1741, 1680, 1738, 2145, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 2149, 1665, 2142, 2144, 1859, 2158, 2159, 2157, 2153, 2160, 1837, 1839, 1838, 2150, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 2151, 1774, 1673, 2141, 1751, 1714, 2146, 2148, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 2156, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 2147, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 2152, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 2143, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 2138, 2139, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 2161, 1853, 2137, 1858, 1857, 1699, 1860, 1862, 1703, 2154, 2155, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 2162, 2163, 1876, 1870, 1871, 1872, 2193, 234: 2174, 2133, 2205, 2209, 239: 2190, 2189, 2226, 2200, 247: 2165, 270: 2169, 272: 2208, 294: 2177, 303: 2196, 315: 2210, 2131, 2203, 2225, 2227, 2168, 2167, 2184, 2224, 2204, 2201, 2195, 2199, 2164, 2166, 2202, 2173, 2206, 2214, 2265, 2172, 2215, 2216, 2171, 2194, 2187, 2188, 2238, 2240, 2241, 2242, 2197, 2243, 2222, 2228, 2236, 2237, 2232, 2244, 2245, 2246, 2233, 2248, 2249, 2239, 2234, 2247, 2229, 2235, 2220, 2250, 2251, 2198, 2255, 2211, 2213, 2254, 2260, 2259, 2261, 2258, 2191, 2262, 2257, 2256, 381: 2253, 2207, 2252, 2212, 2217, 2218, 393: 2176, 1649, 1650, 1648, 452: 2192, 2264, 2183, 2178, 2170, 2181, 2179, 2180, 2219, 2231, 2230, 2223, 2221, 2175, 2186, 2263, 2185, 2182, 2136, 2135, 2134, 2783}, + {21: 2784, 250: 2274, 252: 2272, 2273, 2271, 2269, 474: 2270, 2268}, + {757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 233: 757, 757, 757, 757, 757, 757, 757, 757, 757, 243: 757, 757, 757, 757, 248: 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 271: 757, 273: 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 295: 757, 757, 757, 757, 757, 757, 757, 757, 304: 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 380: 757}, + {63: 2788, 2787, 67: 2789, 116: 2790, 802: 2786}, + {6: 2791}, // 1255 - {6: 743}, - {6: 742}, - {6: 741}, - {6: 740}, - {2: 1722, 1639, 1673, 1640, 7: 2119, 1727, 1666, 1724, 2124, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 2128, 1651, 2121, 2123, 2137, 2138, 2136, 2132, 2139, 2129, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 2130, 1760, 1659, 2120, 1737, 1683, 1700, 2125, 2127, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 2135, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 2126, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 2131, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 2122, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 2117, 2118, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 2140, 1835, 2116, 1840, 1839, 1685, 1842, 1844, 1689, 2133, 2134, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 2141, 2142, 1858, 1852, 1853, 1854, 2172, 230: 2153, 2112, 2184, 2188, 235: 2169, 2168, 2205, 2179, 243: 2144, 266: 2148, 2187, 290: 2156, 299: 2175, 311: 2189, 2110, 2182, 2204, 2206, 2147, 2146, 2163, 2203, 2183, 2180, 2174, 2178, 2143, 2145, 2181, 2152, 2185, 2193, 2244, 2151, 2194, 2195, 2150, 2173, 2166, 2167, 2217, 2219, 2220, 2221, 2176, 2222, 2201, 2207, 2215, 2216, 2211, 2223, 2224, 2225, 2212, 2227, 2228, 2218, 2213, 2226, 2208, 2214, 2199, 2229, 2230, 2177, 2234, 2190, 2192, 2233, 2239, 2238, 2240, 2237, 2170, 2241, 2236, 2235, 2232, 2186, 2231, 2191, 2196, 2197, 389: 2155, 1635, 1636, 1634, 448: 2171, 2243, 2162, 2157, 2149, 2160, 2158, 2159, 2198, 2210, 2209, 2202, 2200, 2154, 2165, 2242, 2164, 2161, 2115, 2114, 2113, 2778}, + {6: 751}, + {6: 750}, + {6: 749}, + {6: 748}, + {2: 1736, 1653, 1687, 1654, 7: 2140, 1741, 1680, 1738, 2145, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 2149, 1665, 2142, 2144, 1859, 2158, 2159, 2157, 2153, 2160, 1837, 1839, 1838, 2150, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 2151, 1774, 1673, 2141, 1751, 1714, 2146, 2148, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 2156, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 2147, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 2152, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 2143, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 2138, 2139, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 2161, 1853, 2137, 1858, 1857, 1699, 1860, 1862, 1703, 2154, 2155, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 2162, 2163, 1876, 1870, 1871, 1872, 2193, 234: 2174, 2133, 2205, 2209, 239: 2190, 2189, 2226, 2200, 247: 2165, 270: 2169, 272: 2208, 294: 2177, 303: 2196, 315: 2210, 2131, 2203, 2225, 2227, 2168, 2167, 2184, 2224, 2204, 2201, 2195, 2199, 2164, 2166, 2202, 2173, 2206, 2214, 2265, 2172, 2215, 2216, 2171, 2194, 2187, 2188, 2238, 2240, 2241, 2242, 2197, 2243, 2222, 2228, 2236, 2237, 2232, 2244, 2245, 2246, 2233, 2248, 2249, 2239, 2234, 2247, 2229, 2235, 2220, 2250, 2251, 2198, 2255, 2211, 2213, 2254, 2260, 2259, 2261, 2258, 2191, 2262, 2257, 2256, 381: 2253, 2207, 2252, 2212, 2217, 2218, 393: 2176, 1649, 1650, 1648, 452: 2192, 2264, 2183, 2178, 2170, 2181, 2179, 2180, 2219, 2231, 2230, 2223, 2221, 2175, 2186, 2263, 2185, 2182, 2136, 2135, 2134, 2792}, // 1260 - {21: 2779, 246: 2253, 248: 2251, 250: 2252, 2250, 2248, 470: 2249, 2247}, - {755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 229: 755, 755, 755, 755, 755, 755, 755, 755, 755, 239: 755, 755, 755, 755, 244: 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 268: 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 291: 755, 755, 755, 755, 755, 755, 755, 755, 300: 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 382: 755}, - {766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 229: 766, 766, 766, 766, 766, 766, 766, 766, 766, 239: 766, 766, 766, 766, 244: 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 268: 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 291: 766, 766, 766, 766, 766, 766, 766, 766, 300: 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 382: 766}, - {767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 229: 767, 767, 767, 767, 767, 767, 767, 767, 767, 239: 767, 767, 767, 767, 244: 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 268: 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 291: 767, 767, 767, 767, 767, 767, 767, 767, 300: 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 382: 767}, - {2: 1722, 1639, 1673, 1640, 7: 2119, 1727, 1666, 1724, 2124, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 1229, 1758, 1698, 1755, 1781, 1701, 1777, 1702, 2128, 1651, 2121, 2123, 2137, 2138, 2136, 2132, 2139, 2129, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 2130, 1760, 1659, 2120, 1737, 1683, 1700, 2125, 2127, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 2135, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 2126, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 2131, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 2122, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 2117, 2118, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 2140, 1835, 2116, 1840, 1839, 1685, 1842, 1844, 1689, 2133, 2134, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 2141, 2142, 1858, 1852, 1853, 1854, 2172, 230: 2153, 2112, 2184, 2188, 235: 2169, 2168, 2205, 2179, 243: 2144, 266: 2148, 2187, 290: 2156, 299: 2175, 311: 2189, 2110, 2182, 2204, 2206, 2147, 2146, 2163, 2203, 2183, 2180, 2174, 2178, 2143, 2145, 2181, 2152, 2185, 2193, 2244, 2151, 2194, 2195, 2150, 2173, 2166, 2167, 2217, 2219, 2220, 2221, 2176, 2222, 2201, 2207, 2215, 2216, 2211, 2223, 2224, 2225, 2212, 2227, 2228, 2218, 2213, 2226, 2208, 2214, 2199, 2229, 2230, 2177, 2234, 2190, 2192, 2233, 2239, 2238, 2240, 2237, 2170, 2241, 2236, 2235, 2232, 2186, 2231, 2191, 2196, 2197, 389: 2155, 1635, 1636, 1634, 448: 2171, 2243, 2162, 2157, 2149, 2160, 2158, 2159, 2198, 2210, 2209, 2202, 2200, 2154, 2165, 2242, 2164, 2161, 2115, 2114, 2113, 2451, 505: 2609, 561: 2783}, + {21: 2793, 250: 2274, 252: 2272, 2273, 2271, 2269, 474: 2270, 2268}, + {763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 233: 763, 763, 763, 763, 763, 763, 763, 763, 763, 243: 763, 763, 763, 763, 248: 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 271: 763, 273: 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 295: 763, 763, 763, 763, 763, 763, 763, 763, 304: 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 380: 763}, + {774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 233: 774, 774, 774, 774, 774, 774, 774, 774, 774, 243: 774, 774, 774, 774, 248: 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 271: 774, 273: 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 295: 774, 774, 774, 774, 774, 774, 774, 774, 304: 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 380: 774}, + {775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 233: 775, 775, 775, 775, 775, 775, 775, 775, 775, 243: 775, 775, 775, 775, 248: 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 271: 775, 273: 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 295: 775, 775, 775, 775, 775, 775, 775, 775, 304: 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 380: 775}, + {2: 1736, 1653, 1687, 1654, 7: 2140, 1741, 1680, 1738, 2145, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 1243, 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 2149, 1665, 2142, 2144, 1859, 2158, 2159, 2157, 2153, 2160, 1837, 1839, 1838, 2150, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 2151, 1774, 1673, 2141, 1751, 1714, 2146, 2148, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 2156, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 2147, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 2152, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 2143, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 2138, 2139, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 2161, 1853, 2137, 1858, 1857, 1699, 1860, 1862, 1703, 2154, 2155, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 2162, 2163, 1876, 1870, 1871, 1872, 2193, 234: 2174, 2133, 2205, 2209, 239: 2190, 2189, 2226, 2200, 247: 2165, 270: 2169, 272: 2208, 294: 2177, 303: 2196, 315: 2210, 2131, 2203, 2225, 2227, 2168, 2167, 2184, 2224, 2204, 2201, 2195, 2199, 2164, 2166, 2202, 2173, 2206, 2214, 2265, 2172, 2215, 2216, 2171, 2194, 2187, 2188, 2238, 2240, 2241, 2242, 2197, 2243, 2222, 2228, 2236, 2237, 2232, 2244, 2245, 2246, 2233, 2248, 2249, 2239, 2234, 2247, 2229, 2235, 2220, 2250, 2251, 2198, 2255, 2211, 2213, 2254, 2260, 2259, 2261, 2258, 2191, 2262, 2257, 2256, 381: 2253, 2207, 2252, 2212, 2217, 2218, 393: 2176, 1649, 1650, 1648, 452: 2192, 2264, 2183, 2178, 2170, 2181, 2179, 2180, 2219, 2231, 2230, 2223, 2221, 2175, 2186, 2263, 2185, 2182, 2136, 2135, 2134, 2472, 509: 2630, 565: 2797}, // 1265 - {21: 2784}, - {763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 229: 763, 763, 763, 763, 763, 763, 763, 763, 763, 239: 763, 763, 763, 763, 244: 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 268: 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 291: 763, 763, 763, 763, 763, 763, 763, 763, 300: 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 382: 763}, - {768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 229: 768, 768, 768, 768, 768, 768, 768, 768, 768, 239: 768, 768, 768, 768, 244: 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 268: 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 291: 768, 768, 768, 768, 768, 768, 768, 768, 300: 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 382: 768}, - {2: 821, 821, 821, 821, 7: 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 22: 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 230: 821, 821, 821, 821, 235: 821, 821, 821, 821, 243: 821, 266: 821, 821, 290: 821, 299: 821, 311: 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 478: 2409, 499: 2407, 2408, 509: 2410, 2411, 2412, 519: 2787}, - {2: 1722, 1639, 1673, 1640, 7: 2119, 1727, 1666, 1724, 2124, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 2128, 1651, 2121, 2123, 2137, 2138, 2136, 2132, 2139, 2129, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 2130, 1760, 1659, 2120, 1737, 1683, 1700, 2125, 2127, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 2135, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 2126, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 2131, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 2122, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 2117, 2118, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 2140, 1835, 2116, 1840, 1839, 1685, 1842, 1844, 1689, 2133, 2134, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 2141, 2142, 1858, 1852, 1853, 1854, 2172, 230: 2153, 2112, 2184, 2188, 235: 2169, 2168, 2205, 2179, 243: 2144, 266: 2148, 2187, 290: 2156, 299: 2175, 311: 2189, 2110, 2182, 2204, 2206, 2147, 2146, 2163, 2203, 2183, 2180, 2174, 2178, 2143, 2145, 2181, 2152, 2185, 2193, 2244, 2151, 2194, 2195, 2150, 2173, 2166, 2167, 2217, 2219, 2220, 2221, 2176, 2222, 2201, 2207, 2215, 2216, 2211, 2223, 2224, 2225, 2212, 2227, 2228, 2218, 2213, 2226, 2208, 2214, 2199, 2229, 2230, 2177, 2234, 2190, 2192, 2233, 2239, 2238, 2240, 2237, 2170, 2241, 2236, 2235, 2232, 2186, 2231, 2191, 2196, 2197, 389: 2155, 1635, 1636, 1634, 448: 2171, 2243, 2162, 2157, 2149, 2160, 2158, 2159, 2198, 2210, 2209, 2202, 2200, 2154, 2165, 2242, 2164, 2161, 2115, 2114, 2113, 2788}, + {21: 2798}, + {771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 233: 771, 771, 771, 771, 771, 771, 771, 771, 771, 243: 771, 771, 771, 771, 248: 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 271: 771, 273: 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 295: 771, 771, 771, 771, 771, 771, 771, 771, 304: 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 380: 771}, + {776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 233: 776, 776, 776, 776, 776, 776, 776, 776, 776, 243: 776, 776, 776, 776, 248: 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 271: 776, 273: 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 295: 776, 776, 776, 776, 776, 776, 776, 776, 304: 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 380: 776}, + {2: 829, 829, 829, 829, 7: 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 22: 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 234: 829, 829, 829, 829, 239: 829, 829, 829, 829, 247: 829, 270: 829, 272: 829, 294: 829, 303: 829, 315: 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 381: 829, 829, 829, 829, 829, 829, 482: 2430, 503: 2428, 2429, 513: 2431, 2432, 2433, 523: 2801}, + {2: 1736, 1653, 1687, 1654, 7: 2140, 1741, 1680, 1738, 2145, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 2149, 1665, 2142, 2144, 1859, 2158, 2159, 2157, 2153, 2160, 1837, 1839, 1838, 2150, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 2151, 1774, 1673, 2141, 1751, 1714, 2146, 2148, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 2156, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 2147, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 2152, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 2143, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 2138, 2139, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 2161, 1853, 2137, 1858, 1857, 1699, 1860, 1862, 1703, 2154, 2155, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 2162, 2163, 1876, 1870, 1871, 1872, 2193, 234: 2174, 2133, 2205, 2209, 239: 2190, 2189, 2226, 2200, 247: 2165, 270: 2169, 272: 2208, 294: 2177, 303: 2196, 315: 2210, 2131, 2203, 2225, 2227, 2168, 2167, 2184, 2224, 2204, 2201, 2195, 2199, 2164, 2166, 2202, 2173, 2206, 2214, 2265, 2172, 2215, 2216, 2171, 2194, 2187, 2188, 2238, 2240, 2241, 2242, 2197, 2243, 2222, 2228, 2236, 2237, 2232, 2244, 2245, 2246, 2233, 2248, 2249, 2239, 2234, 2247, 2229, 2235, 2220, 2250, 2251, 2198, 2255, 2211, 2213, 2254, 2260, 2259, 2261, 2258, 2191, 2262, 2257, 2256, 381: 2253, 2207, 2252, 2212, 2217, 2218, 393: 2176, 1649, 1650, 1648, 452: 2192, 2264, 2183, 2178, 2170, 2181, 2179, 2180, 2219, 2231, 2230, 2223, 2221, 2175, 2186, 2263, 2185, 2182, 2136, 2135, 2134, 2802}, // 1270 - {21: 2789, 246: 2253, 248: 2251, 250: 2252, 2250, 2248, 470: 2249, 2247}, - {594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 229: 594, 594, 594, 594, 594, 594, 594, 594, 594, 239: 594, 594, 594, 594, 244: 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 268: 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 291: 594, 594, 594, 594, 594, 594, 594, 594, 300: 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 382: 594, 477: 2269, 480: 2417, 492: 2790}, - {732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 229: 732, 732, 732, 732, 732, 732, 732, 732, 732, 239: 732, 732, 732, 732, 244: 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 268: 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 291: 732, 732, 732, 732, 732, 732, 732, 732, 300: 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 382: 732}, - {2: 1722, 1639, 1673, 1640, 7: 2119, 1727, 1666, 1724, 2124, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 1229, 1758, 1698, 1755, 1781, 1701, 1777, 1702, 2128, 1651, 2121, 2123, 2137, 2138, 2136, 2132, 2139, 2129, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 2130, 1760, 1659, 2120, 1737, 1683, 1700, 2125, 2127, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 2135, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 2126, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 2131, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 2122, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 2117, 2118, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 2140, 1835, 2116, 1840, 1839, 1685, 1842, 1844, 1689, 2133, 2134, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 2141, 2142, 1858, 1852, 1853, 1854, 2172, 230: 2153, 2112, 2184, 2188, 235: 2169, 2168, 2205, 2179, 243: 2144, 266: 2148, 2187, 290: 2156, 299: 2175, 311: 2189, 2110, 2182, 2204, 2206, 2147, 2146, 2163, 2203, 2183, 2180, 2174, 2178, 2143, 2145, 2181, 2152, 2185, 2193, 2244, 2151, 2194, 2195, 2150, 2173, 2166, 2167, 2217, 2219, 2220, 2221, 2176, 2222, 2201, 2207, 2215, 2216, 2211, 2223, 2224, 2225, 2212, 2227, 2228, 2218, 2213, 2226, 2208, 2214, 2199, 2229, 2230, 2177, 2234, 2190, 2192, 2233, 2239, 2238, 2240, 2237, 2170, 2241, 2236, 2235, 2232, 2186, 2231, 2191, 2196, 2197, 389: 2155, 1635, 1636, 1634, 448: 2171, 2243, 2162, 2157, 2149, 2160, 2158, 2159, 2198, 2210, 2209, 2202, 2200, 2154, 2165, 2242, 2164, 2161, 2115, 2114, 2113, 2451, 505: 2609, 561: 2792}, - {21: 2793}, + {21: 2803, 250: 2274, 252: 2272, 2273, 2271, 2269, 474: 2270, 2268}, + {602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 233: 602, 602, 602, 602, 602, 602, 602, 602, 602, 243: 602, 602, 602, 602, 248: 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 271: 602, 273: 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 295: 602, 602, 602, 602, 602, 602, 602, 602, 304: 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 380: 602, 481: 2290, 484: 2438, 496: 2804}, + {740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 233: 740, 740, 740, 740, 740, 740, 740, 740, 740, 243: 740, 740, 740, 740, 248: 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 271: 740, 273: 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 295: 740, 740, 740, 740, 740, 740, 740, 740, 304: 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 380: 740}, + {2: 1736, 1653, 1687, 1654, 7: 2140, 1741, 1680, 1738, 2145, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 1243, 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 2149, 1665, 2142, 2144, 1859, 2158, 2159, 2157, 2153, 2160, 1837, 1839, 1838, 2150, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 2151, 1774, 1673, 2141, 1751, 1714, 2146, 2148, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 2156, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 2147, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 2152, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 2143, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 2138, 2139, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 2161, 1853, 2137, 1858, 1857, 1699, 1860, 1862, 1703, 2154, 2155, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 2162, 2163, 1876, 1870, 1871, 1872, 2193, 234: 2174, 2133, 2205, 2209, 239: 2190, 2189, 2226, 2200, 247: 2165, 270: 2169, 272: 2208, 294: 2177, 303: 2196, 315: 2210, 2131, 2203, 2225, 2227, 2168, 2167, 2184, 2224, 2204, 2201, 2195, 2199, 2164, 2166, 2202, 2173, 2206, 2214, 2265, 2172, 2215, 2216, 2171, 2194, 2187, 2188, 2238, 2240, 2241, 2242, 2197, 2243, 2222, 2228, 2236, 2237, 2232, 2244, 2245, 2246, 2233, 2248, 2249, 2239, 2234, 2247, 2229, 2235, 2220, 2250, 2251, 2198, 2255, 2211, 2213, 2254, 2260, 2259, 2261, 2258, 2191, 2262, 2257, 2256, 381: 2253, 2207, 2252, 2212, 2217, 2218, 393: 2176, 1649, 1650, 1648, 452: 2192, 2264, 2183, 2178, 2170, 2181, 2179, 2180, 2219, 2231, 2230, 2223, 2221, 2175, 2186, 2263, 2185, 2182, 2136, 2135, 2134, 2472, 509: 2630, 565: 2806}, + {21: 2807}, // 1275 - {711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 229: 711, 711, 711, 711, 711, 711, 711, 711, 711, 239: 711, 711, 711, 711, 244: 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 268: 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 291: 711, 711, 711, 711, 711, 711, 711, 711, 300: 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 382: 711}, - {2: 1211, 1211, 1211, 1211, 7: 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 22: 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 230: 1211, 232: 1211, 1211, 235: 1211, 1211, 1211, 1211, 243: 1211, 266: 1211, 1211, 290: 1211, 299: 1211, 311: 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211}, - {268: 2819, 288: 2818, 300: 2817, 309: 2803, 2804, 714: 2820}, - {228: 1207}, - {2: 1205, 1205, 1205, 1205, 7: 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 22: 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 230: 1205, 232: 1205, 1205, 235: 1205, 1205, 1205, 1205, 243: 1205, 266: 1205, 1205, 290: 1205, 299: 1205, 311: 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205}, + {719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 233: 719, 719, 719, 719, 719, 719, 719, 719, 719, 243: 719, 719, 719, 719, 248: 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 271: 719, 273: 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 295: 719, 719, 719, 719, 719, 719, 719, 719, 304: 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 380: 719}, + {2: 1225, 1225, 1225, 1225, 7: 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 22: 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 234: 1225, 236: 1225, 1225, 239: 1225, 1225, 1225, 1225, 247: 1225, 270: 1225, 272: 1225, 294: 1225, 303: 1225, 315: 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 381: 1225, 1225, 1225, 1225, 1225, 1225}, + {271: 2833, 292: 2832, 304: 2831, 313: 2817, 2818, 718: 2834}, + {232: 1221}, + {2: 1219, 1219, 1219, 1219, 7: 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 22: 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 234: 1219, 236: 1219, 1219, 239: 1219, 1219, 1219, 1219, 247: 1219, 270: 1219, 272: 1219, 294: 1219, 303: 1219, 315: 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 381: 1219, 1219, 1219, 1219, 1219, 1219}, // 1280 - {2: 1203, 1203, 1203, 1203, 7: 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 22: 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 230: 1203, 232: 1203, 1203, 235: 1203, 1203, 1203, 1203, 243: 1203, 266: 1203, 1203, 290: 1203, 299: 1203, 311: 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203}, - {228: 2813, 448: 2814}, - {2: 1722, 1639, 1673, 1640, 7: 2119, 1727, 1666, 1724, 2124, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 2128, 1651, 2121, 2123, 2137, 2138, 2136, 2132, 2139, 2129, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 2130, 1760, 1659, 2120, 1737, 1683, 1700, 2125, 2127, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 2135, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 2126, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 2131, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 2122, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 2117, 2118, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 2140, 1835, 2116, 1840, 1839, 1685, 1842, 1844, 1689, 2133, 2134, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 2141, 2142, 1858, 1852, 1853, 1854, 2172, 230: 2153, 232: 2184, 2188, 235: 2169, 2168, 2205, 2179, 243: 2144, 266: 2148, 2187, 290: 2156, 299: 2175, 311: 2189, 2256, 2182, 2204, 2206, 2147, 2146, 2163, 2203, 2183, 2180, 2174, 2178, 2143, 2145, 2181, 2152, 2185, 2193, 2244, 2151, 2194, 2195, 2150, 2173, 2166, 2167, 2217, 2219, 2220, 2221, 2176, 2222, 2201, 2207, 2215, 2216, 2211, 2223, 2224, 2225, 2212, 2227, 2228, 2218, 2213, 2226, 2208, 2214, 2199, 2229, 2230, 2177, 2234, 2190, 2192, 2233, 2239, 2238, 2240, 2237, 2170, 2241, 2236, 2235, 2232, 2186, 2231, 2191, 2196, 2197, 389: 2155, 1635, 1636, 1634, 448: 2171, 2243, 2162, 2157, 2149, 2160, 2158, 2159, 2198, 2210, 2209, 2202, 2200, 2154, 2165, 2242, 2164, 2161, 2810}, - {2: 1722, 1639, 1673, 1640, 7: 2119, 1727, 1666, 1724, 2124, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 2128, 1651, 2121, 2123, 2137, 2138, 2136, 2132, 2139, 2129, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 2130, 1760, 1659, 2120, 1737, 1683, 1700, 2125, 2127, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 2135, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 2126, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 2131, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 2122, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 2117, 2118, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 2140, 1835, 2116, 1840, 1839, 1685, 1842, 1844, 1689, 2133, 2134, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 2141, 2142, 1858, 1852, 1853, 1854, 2172, 230: 2153, 232: 2184, 2188, 235: 2169, 2168, 2205, 2179, 243: 2144, 266: 2148, 2187, 290: 2156, 299: 2175, 311: 2189, 2256, 2182, 2204, 2206, 2147, 2146, 2163, 2203, 2183, 2180, 2174, 2178, 2143, 2145, 2181, 2152, 2185, 2193, 2244, 2151, 2194, 2195, 2150, 2173, 2166, 2167, 2217, 2219, 2220, 2221, 2176, 2222, 2201, 2207, 2215, 2216, 2211, 2223, 2224, 2225, 2212, 2227, 2228, 2218, 2213, 2226, 2208, 2214, 2199, 2229, 2230, 2177, 2234, 2190, 2192, 2233, 2239, 2238, 2240, 2237, 2170, 2241, 2236, 2235, 2232, 2186, 2231, 2191, 2196, 2197, 389: 2155, 1635, 1636, 1634, 448: 2171, 2243, 2162, 2157, 2149, 2160, 2158, 2159, 2198, 2210, 2209, 2202, 2200, 2806, 2165, 2242, 2164, 2161}, - {2: 1722, 1639, 1673, 1640, 7: 2119, 1727, 1666, 1724, 2124, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 2128, 1651, 2121, 2123, 2137, 2138, 2136, 2132, 2139, 2129, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 2130, 1760, 1659, 2120, 1737, 1683, 1700, 2125, 2127, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 2135, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 2126, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 2131, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 2122, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 2117, 2118, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 2140, 1835, 2116, 1840, 1839, 1685, 1842, 1844, 1689, 2133, 2134, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 2141, 2142, 1858, 1852, 1853, 1854, 2172, 230: 2153, 232: 2184, 2188, 235: 2169, 2168, 2205, 2179, 243: 2144, 266: 2148, 2187, 290: 2156, 299: 2175, 311: 2189, 2256, 2182, 2204, 2206, 2147, 2146, 2163, 2203, 2183, 2180, 2174, 2178, 2143, 2145, 2181, 2152, 2185, 2193, 2244, 2151, 2194, 2195, 2150, 2173, 2166, 2167, 2217, 2219, 2220, 2221, 2176, 2222, 2201, 2207, 2215, 2216, 2211, 2223, 2224, 2225, 2212, 2227, 2228, 2218, 2213, 2226, 2208, 2214, 2199, 2229, 2230, 2177, 2234, 2190, 2192, 2233, 2239, 2238, 2240, 2237, 2170, 2241, 2236, 2235, 2232, 2186, 2231, 2191, 2196, 2197, 389: 2155, 1635, 1636, 1634, 448: 2171, 2243, 2162, 2157, 2149, 2160, 2158, 2159, 2198, 2210, 2209, 2202, 2200, 2805, 2165, 2242, 2164, 2161}, + {2: 1217, 1217, 1217, 1217, 7: 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 22: 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 234: 1217, 236: 1217, 1217, 239: 1217, 1217, 1217, 1217, 247: 1217, 270: 1217, 272: 1217, 294: 1217, 303: 1217, 315: 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 381: 1217, 1217, 1217, 1217, 1217, 1217}, + {232: 2827, 452: 2828}, + {2: 1736, 1653, 1687, 1654, 7: 2140, 1741, 1680, 1738, 2145, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 2149, 1665, 2142, 2144, 1859, 2158, 2159, 2157, 2153, 2160, 1837, 1839, 1838, 2150, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 2151, 1774, 1673, 2141, 1751, 1714, 2146, 2148, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 2156, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 2147, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 2152, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 2143, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 2138, 2139, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 2161, 1853, 2137, 1858, 1857, 1699, 1860, 1862, 1703, 2154, 2155, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 2162, 2163, 1876, 1870, 1871, 1872, 2193, 234: 2174, 236: 2205, 2209, 239: 2190, 2189, 2226, 2200, 247: 2165, 270: 2169, 272: 2208, 294: 2177, 303: 2196, 315: 2210, 2277, 2203, 2225, 2227, 2168, 2167, 2184, 2224, 2204, 2201, 2195, 2199, 2164, 2166, 2202, 2173, 2206, 2214, 2265, 2172, 2215, 2216, 2171, 2194, 2187, 2188, 2238, 2240, 2241, 2242, 2197, 2243, 2222, 2228, 2236, 2237, 2232, 2244, 2245, 2246, 2233, 2248, 2249, 2239, 2234, 2247, 2229, 2235, 2220, 2250, 2251, 2198, 2255, 2211, 2213, 2254, 2260, 2259, 2261, 2258, 2191, 2262, 2257, 2256, 381: 2253, 2207, 2252, 2212, 2217, 2218, 393: 2176, 1649, 1650, 1648, 452: 2192, 2264, 2183, 2178, 2170, 2181, 2179, 2180, 2219, 2231, 2230, 2223, 2221, 2175, 2186, 2263, 2185, 2182, 2824}, + {2: 1736, 1653, 1687, 1654, 7: 2140, 1741, 1680, 1738, 2145, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 2149, 1665, 2142, 2144, 1859, 2158, 2159, 2157, 2153, 2160, 1837, 1839, 1838, 2150, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 2151, 1774, 1673, 2141, 1751, 1714, 2146, 2148, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 2156, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 2147, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 2152, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 2143, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 2138, 2139, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 2161, 1853, 2137, 1858, 1857, 1699, 1860, 1862, 1703, 2154, 2155, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 2162, 2163, 1876, 1870, 1871, 1872, 2193, 234: 2174, 236: 2205, 2209, 239: 2190, 2189, 2226, 2200, 247: 2165, 270: 2169, 272: 2208, 294: 2177, 303: 2196, 315: 2210, 2277, 2203, 2225, 2227, 2168, 2167, 2184, 2224, 2204, 2201, 2195, 2199, 2164, 2166, 2202, 2173, 2206, 2214, 2265, 2172, 2215, 2216, 2171, 2194, 2187, 2188, 2238, 2240, 2241, 2242, 2197, 2243, 2222, 2228, 2236, 2237, 2232, 2244, 2245, 2246, 2233, 2248, 2249, 2239, 2234, 2247, 2229, 2235, 2220, 2250, 2251, 2198, 2255, 2211, 2213, 2254, 2260, 2259, 2261, 2258, 2191, 2262, 2257, 2256, 381: 2253, 2207, 2252, 2212, 2217, 2218, 393: 2176, 1649, 1650, 1648, 452: 2192, 2264, 2183, 2178, 2170, 2181, 2179, 2180, 2219, 2231, 2230, 2223, 2221, 2820, 2186, 2263, 2185, 2182}, + {2: 1736, 1653, 1687, 1654, 7: 2140, 1741, 1680, 1738, 2145, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 2149, 1665, 2142, 2144, 1859, 2158, 2159, 2157, 2153, 2160, 1837, 1839, 1838, 2150, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 2151, 1774, 1673, 2141, 1751, 1714, 2146, 2148, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 2156, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 2147, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 2152, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 2143, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 2138, 2139, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 2161, 1853, 2137, 1858, 1857, 1699, 1860, 1862, 1703, 2154, 2155, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 2162, 2163, 1876, 1870, 1871, 1872, 2193, 234: 2174, 236: 2205, 2209, 239: 2190, 2189, 2226, 2200, 247: 2165, 270: 2169, 272: 2208, 294: 2177, 303: 2196, 315: 2210, 2277, 2203, 2225, 2227, 2168, 2167, 2184, 2224, 2204, 2201, 2195, 2199, 2164, 2166, 2202, 2173, 2206, 2214, 2265, 2172, 2215, 2216, 2171, 2194, 2187, 2188, 2238, 2240, 2241, 2242, 2197, 2243, 2222, 2228, 2236, 2237, 2232, 2244, 2245, 2246, 2233, 2248, 2249, 2239, 2234, 2247, 2229, 2235, 2220, 2250, 2251, 2198, 2255, 2211, 2213, 2254, 2260, 2259, 2261, 2258, 2191, 2262, 2257, 2256, 381: 2253, 2207, 2252, 2212, 2217, 2218, 393: 2176, 1649, 1650, 1648, 452: 2192, 2264, 2183, 2178, 2170, 2181, 2179, 2180, 2219, 2231, 2230, 2223, 2221, 2819, 2186, 2263, 2185, 2182}, // 1285 - {2: 1192, 1192, 1192, 1192, 7: 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 22: 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 230: 1192, 232: 1192, 1192, 235: 1192, 1192, 1192, 1192, 243: 1192, 266: 1192, 1192, 290: 1192, 299: 1192, 311: 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192}, - {2: 1191, 1191, 1191, 1191, 7: 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 22: 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 230: 1191, 232: 1191, 1191, 235: 1191, 1191, 1191, 1191, 243: 1191, 266: 1191, 1191, 290: 1191, 299: 1191, 311: 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191}, - {1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 229: 1194, 1194, 232: 1194, 1194, 1194, 239: 1194, 1194, 1194, 1194, 244: 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 2257, 1194, 1194, 1194, 1194, 270: 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 289: 1194, 291: 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 382: 2258}, - {1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 2808, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 229: 1190, 1190, 232: 1190, 1190, 1190, 239: 1190, 1190, 1190, 1190, 244: 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 2257, 1190, 1190, 1190, 1190, 270: 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 289: 1190, 291: 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 382: 2258, 809: 2807}, - {1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 229: 1195, 1195, 232: 1195, 1195, 1195, 239: 1195, 1195, 1195, 1195, 244: 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 262: 1195, 1195, 1195, 1195, 270: 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 289: 1195, 291: 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195}, + {2: 1206, 1206, 1206, 1206, 7: 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 22: 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 234: 1206, 236: 1206, 1206, 239: 1206, 1206, 1206, 1206, 247: 1206, 270: 1206, 272: 1206, 294: 1206, 303: 1206, 315: 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 381: 1206, 1206, 1206, 1206, 1206, 1206}, + {2: 1205, 1205, 1205, 1205, 7: 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 22: 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 234: 1205, 236: 1205, 1205, 239: 1205, 1205, 1205, 1205, 247: 1205, 270: 1205, 272: 1205, 294: 1205, 303: 1205, 315: 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 381: 1205, 1205, 1205, 1205, 1205, 1205}, + {1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 233: 1208, 1208, 236: 1208, 1208, 1208, 243: 1208, 1208, 1208, 1208, 248: 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 2278, 1208, 1208, 1208, 1208, 1208, 274: 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 293: 1208, 295: 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 380: 2279}, + {1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 2822, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 233: 1204, 1204, 236: 1204, 1204, 1204, 243: 1204, 1204, 1204, 1204, 248: 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 2278, 1204, 1204, 1204, 1204, 1204, 274: 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 293: 1204, 295: 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 380: 2279, 813: 2821}, + {1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 233: 1209, 1209, 236: 1209, 1209, 1209, 243: 1209, 1209, 1209, 1209, 248: 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 265: 1209, 1209, 1209, 1209, 1209, 274: 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 293: 1209, 295: 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209}, // 1290 - {230: 2809}, - {1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 229: 1189, 1189, 232: 1189, 1189, 1189, 239: 1189, 1189, 1189, 1189, 244: 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 262: 1189, 1189, 1189, 1189, 270: 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 289: 1189, 291: 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189}, - {235: 2539, 2540, 2545, 246: 2811, 269: 2541, 301: 2543, 2536, 2542, 2546, 2535, 2544, 2537, 2538}, - {2: 1722, 1639, 1673, 1640, 7: 2119, 1727, 1666, 1724, 2124, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 2128, 1651, 2121, 2123, 2137, 2138, 2136, 2132, 2139, 2129, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 2130, 1760, 1659, 2120, 1737, 1683, 1700, 2125, 2127, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 2135, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 2126, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 2131, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 2122, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 2117, 2118, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 2140, 1835, 2116, 1840, 1839, 1685, 1842, 1844, 1689, 2133, 2134, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 2141, 2142, 1858, 1852, 1853, 1854, 2172, 230: 2153, 232: 2184, 2188, 235: 2169, 2168, 2205, 2179, 243: 2144, 266: 2148, 2187, 290: 2156, 299: 2175, 311: 2189, 2256, 2182, 2204, 2206, 2147, 2146, 2163, 2203, 2183, 2180, 2174, 2178, 2143, 2145, 2181, 2152, 2185, 2193, 2244, 2151, 2194, 2195, 2150, 2173, 2166, 2167, 2217, 2219, 2220, 2221, 2176, 2222, 2201, 2207, 2215, 2216, 2211, 2223, 2224, 2225, 2212, 2227, 2228, 2218, 2213, 2226, 2208, 2214, 2199, 2229, 2230, 2177, 2234, 2190, 2192, 2233, 2239, 2238, 2240, 2237, 2170, 2241, 2236, 2235, 2232, 2186, 2231, 2191, 2196, 2197, 389: 2155, 1635, 1636, 1634, 448: 2171, 2243, 2162, 2157, 2149, 2160, 2158, 2159, 2198, 2210, 2209, 2202, 2200, 2154, 2165, 2242, 2164, 2161, 2115, 2812}, - {1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 229: 1196, 1196, 232: 1196, 1196, 1196, 239: 1196, 1196, 1196, 1196, 244: 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 262: 1196, 1196, 1196, 1196, 270: 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 289: 1196, 291: 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196}, + {234: 2823}, + {1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 233: 1203, 1203, 236: 1203, 1203, 1203, 243: 1203, 1203, 1203, 1203, 248: 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 265: 1203, 1203, 1203, 1203, 1203, 274: 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 293: 1203, 295: 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203}, + {239: 2560, 2561, 2566, 250: 2825, 273: 2562, 305: 2564, 2557, 2563, 2567, 2556, 2565, 2558, 2559}, + {2: 1736, 1653, 1687, 1654, 7: 2140, 1741, 1680, 1738, 2145, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 2149, 1665, 2142, 2144, 1859, 2158, 2159, 2157, 2153, 2160, 1837, 1839, 1838, 2150, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 2151, 1774, 1673, 2141, 1751, 1714, 2146, 2148, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 2156, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 2147, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 2152, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 2143, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 2138, 2139, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 2161, 1853, 2137, 1858, 1857, 1699, 1860, 1862, 1703, 2154, 2155, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 2162, 2163, 1876, 1870, 1871, 1872, 2193, 234: 2174, 236: 2205, 2209, 239: 2190, 2189, 2226, 2200, 247: 2165, 270: 2169, 272: 2208, 294: 2177, 303: 2196, 315: 2210, 2277, 2203, 2225, 2227, 2168, 2167, 2184, 2224, 2204, 2201, 2195, 2199, 2164, 2166, 2202, 2173, 2206, 2214, 2265, 2172, 2215, 2216, 2171, 2194, 2187, 2188, 2238, 2240, 2241, 2242, 2197, 2243, 2222, 2228, 2236, 2237, 2232, 2244, 2245, 2246, 2233, 2248, 2249, 2239, 2234, 2247, 2229, 2235, 2220, 2250, 2251, 2198, 2255, 2211, 2213, 2254, 2260, 2259, 2261, 2258, 2191, 2262, 2257, 2256, 381: 2253, 2207, 2252, 2212, 2217, 2218, 393: 2176, 1649, 1650, 1648, 452: 2192, 2264, 2183, 2178, 2170, 2181, 2179, 2180, 2219, 2231, 2230, 2223, 2221, 2175, 2186, 2263, 2185, 2182, 2136, 2826}, + {1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 233: 1210, 1210, 236: 1210, 1210, 1210, 243: 1210, 1210, 1210, 1210, 248: 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 265: 1210, 1210, 1210, 1210, 1210, 274: 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 293: 1210, 295: 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210}, // 1295 - {2: 1722, 1639, 1673, 1640, 7: 2119, 1727, 1666, 1724, 2124, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 2128, 1651, 2121, 2123, 2137, 2138, 2136, 2132, 2139, 2129, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 2130, 1760, 1659, 2120, 1737, 1683, 1700, 2125, 2127, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 2135, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 2126, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 2131, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 2122, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 2117, 2118, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 2140, 1835, 2116, 1840, 1839, 1685, 1842, 1844, 1689, 2133, 2134, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 2141, 2142, 1858, 1852, 1853, 1854, 2723, 230: 2153, 2112, 2184, 2188, 235: 2169, 2168, 2205, 2179, 243: 2144, 266: 2148, 2187, 290: 2156, 299: 2175, 311: 2189, 2110, 2182, 2204, 2206, 2147, 2146, 2163, 2203, 2183, 2180, 2174, 2178, 2143, 2145, 2181, 2152, 2185, 2193, 2244, 2151, 2194, 2195, 2150, 2173, 2166, 2167, 2217, 2219, 2220, 2221, 2176, 2222, 2201, 2207, 2215, 2216, 2211, 2223, 2224, 2225, 2212, 2227, 2228, 2218, 2213, 2226, 2208, 2214, 2199, 2229, 2230, 2177, 2234, 2190, 2192, 2233, 2239, 2238, 2240, 2237, 2170, 2241, 2236, 2235, 2232, 2186, 2231, 2191, 2196, 2197, 389: 2155, 1635, 1636, 1634, 394: 1546, 448: 2171, 2243, 2162, 2157, 2149, 2160, 2158, 2159, 2198, 2210, 2209, 2202, 2200, 2154, 2165, 2242, 2164, 2161, 2115, 2114, 2113, 2451, 481: 2709, 1547, 1548, 1549, 488: 1552, 490: 1551, 2710, 505: 2815}, - {1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 229: 1197, 1197, 232: 1197, 1197, 1197, 239: 1197, 1197, 1197, 1197, 244: 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 262: 1197, 1197, 1197, 1197, 270: 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 289: 1197, 291: 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197}, - {6: 2453, 21: 2816}, - {1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 229: 1198, 1198, 232: 1198, 1198, 1198, 239: 1198, 1198, 1198, 1198, 244: 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 262: 1198, 1198, 1198, 1198, 270: 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 289: 1198, 291: 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198}, - {2: 1210, 1210, 1210, 1210, 7: 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 22: 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 230: 1210, 232: 1210, 1210, 235: 1210, 1210, 1210, 1210, 243: 1210, 266: 1210, 1210, 290: 1210, 299: 1210, 311: 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210}, + {2: 1736, 1653, 1687, 1654, 7: 2140, 1741, 1680, 1738, 2145, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 2149, 1665, 2142, 2144, 1859, 2158, 2159, 2157, 2153, 2160, 1837, 1839, 1838, 2150, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 2151, 1774, 1673, 2141, 1751, 1714, 2146, 2148, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 2156, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 2147, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 2152, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 2143, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 2138, 2139, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 2161, 1853, 2137, 1858, 1857, 1699, 1860, 1862, 1703, 2154, 2155, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 2162, 2163, 1876, 1870, 1871, 1872, 2739, 234: 2174, 2133, 2205, 2209, 239: 2190, 2189, 2226, 2200, 247: 2165, 270: 2169, 272: 2208, 294: 2177, 303: 2196, 315: 2210, 2131, 2203, 2225, 2227, 2168, 2167, 2184, 2224, 2204, 2201, 2195, 2199, 2164, 2166, 2202, 2173, 2206, 2214, 2265, 2172, 2215, 2216, 2171, 2194, 2187, 2188, 2238, 2240, 2241, 2242, 2197, 2243, 2222, 2228, 2236, 2237, 2232, 2244, 2245, 2246, 2233, 2248, 2249, 2239, 2234, 2247, 2229, 2235, 2220, 2250, 2251, 2198, 2255, 2211, 2213, 2254, 2260, 2259, 2261, 2258, 2191, 2262, 2257, 2256, 381: 2253, 2207, 2252, 2212, 2217, 2218, 393: 2176, 1649, 1650, 1648, 398: 1560, 452: 2738, 2264, 2183, 2178, 2170, 2181, 2179, 2180, 2219, 2231, 2230, 2223, 2221, 2175, 2186, 2263, 2185, 2182, 2136, 2135, 2134, 2472, 485: 2107, 1561, 1562, 1563, 492: 1566, 494: 1565, 2108, 509: 2829}, + {1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 233: 1211, 1211, 236: 1211, 1211, 1211, 243: 1211, 1211, 1211, 1211, 248: 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 265: 1211, 1211, 1211, 1211, 1211, 274: 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 293: 1211, 295: 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211}, + {6: 2474, 21: 2830}, + {1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 233: 1212, 1212, 236: 1212, 1212, 1212, 243: 1212, 1212, 1212, 1212, 248: 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 265: 1212, 1212, 1212, 1212, 1212, 274: 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 293: 1212, 295: 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212}, + {2: 1224, 1224, 1224, 1224, 7: 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 22: 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 234: 1224, 236: 1224, 1224, 239: 1224, 1224, 1224, 1224, 247: 1224, 270: 1224, 272: 1224, 294: 1224, 303: 1224, 315: 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 381: 1224, 1224, 1224, 1224, 1224, 1224}, // 1300 - {228: 1206}, - {2: 1204, 1204, 1204, 1204, 7: 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 22: 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 230: 1204, 232: 1204, 1204, 235: 1204, 1204, 1204, 1204, 243: 1204, 266: 1204, 1204, 290: 1204, 299: 1204, 311: 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204}, - {2: 1202, 1202, 1202, 1202, 7: 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 22: 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 230: 1202, 232: 1202, 1202, 235: 1202, 1202, 1202, 1202, 243: 1202, 266: 1202, 1202, 290: 1202, 299: 1202, 311: 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202}, - {78: 2844, 243: 2845, 324: 2843, 2842}, - {2: 1722, 1639, 1673, 1640, 7: 2119, 1727, 1666, 1724, 2124, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 2128, 1651, 2121, 2123, 2137, 2138, 2136, 2132, 2139, 2129, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 2130, 1760, 1659, 2120, 1737, 1683, 1700, 2125, 2127, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 2135, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 2126, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 2131, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 2122, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 2836, 2117, 2118, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 2140, 1835, 2116, 1840, 1839, 1685, 1842, 1844, 1689, 2133, 2134, 1784, 2837, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 2141, 2142, 1858, 1852, 1853, 1854, 2172, 230: 2153, 232: 2184, 2188, 235: 2169, 2168, 2205, 2179, 243: 2144, 266: 2148, 2187, 290: 2156, 299: 2175, 311: 2189, 2835, 2182, 2204, 2206, 2147, 2146, 2163, 2203, 2183, 2180, 2174, 2178, 2143, 2145, 2181, 2152, 2185, 2193, 2244, 2151, 2194, 2195, 2150, 2173, 2166, 2167, 2217, 2219, 2220, 2221, 2176, 2222, 2201, 2207, 2215, 2216, 2211, 2223, 2224, 2225, 2212, 2227, 2228, 2218, 2213, 2226, 2208, 2214, 2199, 2229, 2230, 2177, 2234, 2190, 2192, 2233, 2239, 2238, 2240, 2237, 2170, 2241, 2236, 2235, 2232, 2186, 2231, 2191, 2196, 2197, 389: 2155, 1635, 1636, 1634, 448: 2171, 2243, 2162, 2157, 2149, 2160, 2158, 2159, 2198, 2210, 2209, 2202, 2200, 2154, 2165, 2242, 2164, 2161, 2115, 2833, 478: 2838, 757: 2834}, + {232: 1220}, + {2: 1218, 1218, 1218, 1218, 7: 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 22: 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 234: 1218, 236: 1218, 1218, 239: 1218, 1218, 1218, 1218, 247: 1218, 270: 1218, 272: 1218, 294: 1218, 303: 1218, 315: 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 381: 1218, 1218, 1218, 1218, 1218, 1218}, + {2: 1216, 1216, 1216, 1216, 7: 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 22: 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 234: 1216, 236: 1216, 1216, 239: 1216, 1216, 1216, 1216, 247: 1216, 270: 1216, 272: 1216, 294: 1216, 303: 1216, 315: 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 381: 1216, 1216, 1216, 1216, 1216, 1216}, + {79: 2858, 247: 2859, 328: 2857, 2856}, + {2: 1736, 1653, 1687, 1654, 7: 2140, 1741, 1680, 1738, 2145, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 2149, 1665, 2142, 2144, 1859, 2158, 2159, 2157, 2153, 2160, 1837, 1839, 1838, 2150, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 2151, 1774, 1673, 2141, 1751, 1714, 2146, 2148, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 2156, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 2147, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 2152, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 2143, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 2850, 2138, 2139, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 2161, 1853, 2137, 1858, 1857, 1699, 1860, 1862, 1703, 2154, 2155, 1798, 2851, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 2162, 2163, 1876, 1870, 1871, 1872, 2193, 234: 2174, 236: 2205, 2209, 239: 2190, 2189, 2226, 2200, 247: 2165, 270: 2169, 272: 2208, 294: 2177, 303: 2196, 315: 2210, 2849, 2203, 2225, 2227, 2168, 2167, 2184, 2224, 2204, 2201, 2195, 2199, 2164, 2166, 2202, 2173, 2206, 2214, 2265, 2172, 2215, 2216, 2171, 2194, 2187, 2188, 2238, 2240, 2241, 2242, 2197, 2243, 2222, 2228, 2236, 2237, 2232, 2244, 2245, 2246, 2233, 2248, 2249, 2239, 2234, 2247, 2229, 2235, 2220, 2250, 2251, 2198, 2255, 2211, 2213, 2254, 2260, 2259, 2261, 2258, 2191, 2262, 2257, 2256, 381: 2253, 2207, 2252, 2212, 2217, 2218, 393: 2176, 1649, 1650, 1648, 452: 2192, 2264, 2183, 2178, 2170, 2181, 2179, 2180, 2219, 2231, 2230, 2223, 2221, 2175, 2186, 2263, 2185, 2182, 2136, 2847, 482: 2852, 761: 2848}, // 1305 - {2: 1219, 1219, 1219, 1219, 7: 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 22: 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 230: 1219, 232: 1219, 1219, 235: 1219, 1219, 1219, 1219, 243: 1219, 266: 1219, 1219, 290: 1219, 299: 1219, 311: 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 478: 1219}, - {2: 1218, 1218, 1218, 1218, 7: 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 22: 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 230: 1218, 232: 1218, 1218, 235: 1218, 1218, 1218, 1218, 243: 1218, 266: 1218, 1218, 290: 1218, 299: 1218, 311: 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 478: 1218}, - {2: 1217, 1217, 1217, 1217, 7: 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 22: 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 230: 1217, 232: 1217, 1217, 235: 1217, 1217, 1217, 1217, 243: 1217, 266: 1217, 1217, 290: 1217, 299: 1217, 311: 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 478: 1217}, - {2: 1216, 1216, 1216, 1216, 7: 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 22: 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 230: 1216, 232: 1216, 1216, 235: 1216, 1216, 1216, 1216, 243: 1216, 266: 1216, 1216, 290: 1216, 299: 1216, 311: 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 478: 1216}, - {2: 1215, 1215, 1215, 1215, 7: 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 22: 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 230: 1215, 232: 1215, 1215, 235: 1215, 1215, 1215, 1215, 243: 1215, 266: 1215, 1215, 290: 1215, 299: 1215, 311: 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 478: 1215}, + {2: 1233, 1233, 1233, 1233, 7: 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 22: 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 234: 1233, 236: 1233, 1233, 239: 1233, 1233, 1233, 1233, 247: 1233, 270: 1233, 272: 1233, 294: 1233, 303: 1233, 315: 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 381: 1233, 1233, 1233, 1233, 1233, 1233, 482: 1233}, + {2: 1232, 1232, 1232, 1232, 7: 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 22: 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 234: 1232, 236: 1232, 1232, 239: 1232, 1232, 1232, 1232, 247: 1232, 270: 1232, 272: 1232, 294: 1232, 303: 1232, 315: 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 381: 1232, 1232, 1232, 1232, 1232, 1232, 482: 1232}, + {2: 1231, 1231, 1231, 1231, 7: 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 22: 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 234: 1231, 236: 1231, 1231, 239: 1231, 1231, 1231, 1231, 247: 1231, 270: 1231, 272: 1231, 294: 1231, 303: 1231, 315: 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 381: 1231, 1231, 1231, 1231, 1231, 1231, 482: 1231}, + {2: 1230, 1230, 1230, 1230, 7: 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 22: 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 234: 1230, 236: 1230, 1230, 239: 1230, 1230, 1230, 1230, 247: 1230, 270: 1230, 272: 1230, 294: 1230, 303: 1230, 315: 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 381: 1230, 1230, 1230, 1230, 1230, 1230, 482: 1230}, + {2: 1229, 1229, 1229, 1229, 7: 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 22: 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 234: 1229, 236: 1229, 1229, 239: 1229, 1229, 1229, 1229, 247: 1229, 270: 1229, 272: 1229, 294: 1229, 303: 1229, 315: 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 381: 1229, 1229, 1229, 1229, 1229, 1229, 482: 1229}, // 1310 - {2: 1214, 1214, 1214, 1214, 7: 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 22: 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 230: 1214, 232: 1214, 1214, 235: 1214, 1214, 1214, 1214, 243: 1214, 266: 1214, 1214, 290: 1214, 299: 1214, 311: 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 478: 1214}, - {2: 1213, 1213, 1213, 1213, 7: 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 22: 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 230: 1213, 232: 1213, 1213, 235: 1213, 1213, 1213, 1213, 243: 1213, 266: 1213, 1213, 290: 1213, 299: 1213, 311: 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 478: 1213}, - {2: 1212, 1212, 1212, 1212, 7: 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 22: 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 230: 1212, 232: 1212, 1212, 235: 1212, 1212, 1212, 1212, 243: 1212, 266: 1212, 1212, 290: 1212, 299: 1212, 311: 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 478: 1212}, - {78: 1209, 231: 2832, 243: 1209, 324: 1209, 1209}, - {78: 1208, 243: 1208, 324: 1208, 1208}, + {2: 1228, 1228, 1228, 1228, 7: 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 22: 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 234: 1228, 236: 1228, 1228, 239: 1228, 1228, 1228, 1228, 247: 1228, 270: 1228, 272: 1228, 294: 1228, 303: 1228, 315: 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 381: 1228, 1228, 1228, 1228, 1228, 1228, 482: 1228}, + {2: 1227, 1227, 1227, 1227, 7: 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 22: 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 234: 1227, 236: 1227, 1227, 239: 1227, 1227, 1227, 1227, 247: 1227, 270: 1227, 272: 1227, 294: 1227, 303: 1227, 315: 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 381: 1227, 1227, 1227, 1227, 1227, 1227, 482: 1227}, + {2: 1226, 1226, 1226, 1226, 7: 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 22: 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 234: 1226, 236: 1226, 1226, 239: 1226, 1226, 1226, 1226, 247: 1226, 270: 1226, 272: 1226, 294: 1226, 303: 1226, 315: 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 381: 1226, 1226, 1226, 1226, 1226, 1226, 482: 1226}, + {79: 1223, 235: 2846, 247: 1223, 328: 1223, 1223}, + {79: 1222, 247: 1222, 328: 1222, 1222}, // 1315 - {1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 229: 1223, 1223, 232: 1223, 1223, 1223, 239: 1223, 1223, 1223, 1223, 244: 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 262: 1223, 1223, 1223, 1223, 270: 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 289: 1223, 291: 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223}, - {228: 2708, 448: 2841}, - {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, 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, 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, 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, 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, 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, 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, 229: 430, 430, 430, 430, 430, 430, 430, 430, 430, 239: 430, 430, 430, 430, 244: 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 268: 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 291: 430, 430, 430, 430, 430, 430, 430, 430, 300: 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 382: 430, 592: 2839}, - {1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1201, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 239: 1071, 1071, 1071, 1071, 244: 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 268: 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 300: 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 382: 1071, 399: 1071, 1071}, - {1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1200, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 239: 1070, 1070, 1070, 1070, 244: 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 268: 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 300: 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 382: 1070, 399: 1070, 1070}, + {1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 233: 1237, 1237, 236: 1237, 1237, 1237, 243: 1237, 1237, 1237, 1237, 248: 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 265: 1237, 1237, 1237, 1237, 1237, 274: 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 293: 1237, 295: 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237}, + {232: 2729, 452: 2855}, + {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, 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, 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, 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, 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, 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, 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, 431, 233: 431, 431, 431, 431, 431, 431, 431, 431, 431, 243: 431, 431, 431, 431, 248: 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 271: 431, 273: 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 295: 431, 431, 431, 431, 431, 431, 431, 431, 304: 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 380: 431, 595: 2853}, + {1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1215, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 243: 1083, 1083, 1083, 1083, 248: 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 271: 1083, 273: 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 304: 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 380: 1083, 403: 1083, 1083}, + {1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1214, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 243: 1082, 1082, 1082, 1082, 248: 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 271: 1082, 273: 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 304: 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 380: 1082, 403: 1082, 1082}, // 1320 - {228: 1199}, - {2: 1722, 1639, 1673, 1640, 7: 2119, 1727, 1666, 1724, 2124, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 2128, 1651, 2121, 2123, 2137, 2138, 2136, 2132, 2139, 2129, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 2130, 1760, 1659, 2120, 1737, 1683, 1700, 2125, 2127, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 2135, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 2126, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 2131, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 2122, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 2117, 2118, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 2140, 1835, 2116, 1840, 1839, 1685, 1842, 1844, 1689, 2133, 2134, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 2141, 2142, 1858, 1852, 1853, 1854, 2172, 230: 2153, 232: 2184, 2188, 235: 2169, 2168, 2205, 2179, 243: 2144, 266: 2148, 2187, 290: 2156, 299: 2175, 311: 2189, 2256, 2182, 2204, 2206, 2147, 2146, 2163, 2203, 2183, 2180, 2174, 2178, 2143, 2145, 2181, 2152, 2185, 2193, 2244, 2151, 2194, 2195, 2150, 2173, 2166, 2167, 2217, 2219, 2220, 2221, 2176, 2222, 2201, 2207, 2215, 2216, 2211, 2223, 2224, 2225, 2212, 2227, 2228, 2218, 2213, 2226, 2208, 2214, 2199, 2229, 2230, 2177, 2234, 2190, 2192, 2233, 2239, 2238, 2240, 2237, 2170, 2241, 2236, 2235, 2232, 2186, 2231, 2191, 2196, 2197, 389: 2155, 1635, 1636, 1634, 448: 2171, 2243, 2162, 2157, 2149, 2160, 2158, 2159, 2198, 2210, 2209, 2202, 2200, 2154, 2165, 2242, 2164, 2161, 2115, 2840}, - {1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 229: 1221, 1221, 232: 1221, 1221, 1221, 239: 1221, 1221, 1221, 1221, 244: 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 262: 1221, 1221, 1221, 1221, 270: 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 289: 1221, 291: 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221}, - {1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 229: 1222, 1222, 232: 1222, 1222, 1222, 239: 1222, 1222, 1222, 1222, 244: 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 262: 1222, 1222, 1222, 1222, 270: 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 289: 1222, 291: 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222}, - {1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 229: 1243, 1243, 232: 1243, 1243, 1243, 239: 1243, 1243, 1243, 1243, 244: 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 255: 1243, 1243, 1243, 1243, 1243, 1243, 262: 1243, 1243, 1243, 1243, 270: 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 289: 1243}, + {232: 1213}, + {2: 1736, 1653, 1687, 1654, 7: 2140, 1741, 1680, 1738, 2145, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 2149, 1665, 2142, 2144, 1859, 2158, 2159, 2157, 2153, 2160, 1837, 1839, 1838, 2150, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 2151, 1774, 1673, 2141, 1751, 1714, 2146, 2148, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 2156, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 2147, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 2152, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 2143, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 2138, 2139, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 2161, 1853, 2137, 1858, 1857, 1699, 1860, 1862, 1703, 2154, 2155, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 2162, 2163, 1876, 1870, 1871, 1872, 2193, 234: 2174, 236: 2205, 2209, 239: 2190, 2189, 2226, 2200, 247: 2165, 270: 2169, 272: 2208, 294: 2177, 303: 2196, 315: 2210, 2277, 2203, 2225, 2227, 2168, 2167, 2184, 2224, 2204, 2201, 2195, 2199, 2164, 2166, 2202, 2173, 2206, 2214, 2265, 2172, 2215, 2216, 2171, 2194, 2187, 2188, 2238, 2240, 2241, 2242, 2197, 2243, 2222, 2228, 2236, 2237, 2232, 2244, 2245, 2246, 2233, 2248, 2249, 2239, 2234, 2247, 2229, 2235, 2220, 2250, 2251, 2198, 2255, 2211, 2213, 2254, 2260, 2259, 2261, 2258, 2191, 2262, 2257, 2256, 381: 2253, 2207, 2252, 2212, 2217, 2218, 393: 2176, 1649, 1650, 1648, 452: 2192, 2264, 2183, 2178, 2170, 2181, 2179, 2180, 2219, 2231, 2230, 2223, 2221, 2175, 2186, 2263, 2185, 2182, 2136, 2854}, + {1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 233: 1235, 1235, 236: 1235, 1235, 1235, 243: 1235, 1235, 1235, 1235, 248: 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 265: 1235, 1235, 1235, 1235, 1235, 274: 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 293: 1235, 295: 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235}, + {1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 233: 1236, 1236, 236: 1236, 1236, 1236, 243: 1236, 1236, 1236, 1236, 248: 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 265: 1236, 1236, 1236, 1236, 1236, 274: 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 293: 1236, 295: 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236}, + {1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 233: 1257, 1257, 236: 1257, 1257, 1257, 243: 1257, 1257, 1257, 1257, 248: 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 259: 1257, 1257, 1257, 1257, 1257, 265: 1257, 1257, 1257, 1257, 1257, 274: 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 293: 1257}, // 1325 - {1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 229: 1242, 1242, 232: 1242, 1242, 1242, 239: 1242, 1242, 1242, 1242, 244: 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 255: 1242, 1242, 1242, 1242, 1242, 1242, 262: 1242, 1242, 1242, 1242, 270: 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 289: 1242}, - {1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 229: 1241, 1241, 232: 1241, 1241, 1241, 239: 1241, 1241, 1241, 1241, 244: 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 255: 1241, 1241, 1241, 1241, 1241, 1241, 262: 1241, 1241, 1241, 1241, 270: 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 289: 1241}, - {1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 229: 1224, 1224, 232: 1224, 1224, 1224, 239: 1224, 1224, 1224, 1224, 244: 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 262: 1224, 1224, 1224, 1224, 270: 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 289: 1224, 291: 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224}, - {1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 229: 1244, 1244, 232: 1244, 1244, 1244, 239: 1244, 1244, 1244, 1244, 244: 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 255: 1244, 1244, 1244, 1244, 1244, 1244, 262: 1244, 1244, 1244, 1244, 270: 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 289: 1244, 470: 2249, 2247}, - {2: 1722, 1639, 1673, 1640, 7: 2119, 1727, 1666, 1724, 2124, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 2128, 1651, 2121, 2123, 2137, 2138, 2136, 2132, 2139, 2129, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 2130, 1760, 1659, 2120, 1737, 1683, 1700, 2125, 2127, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 2135, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 2126, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 2131, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 2122, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 2117, 2118, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 2140, 1835, 2116, 1840, 1839, 1685, 1842, 1844, 1689, 2133, 2134, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 2141, 2142, 1858, 1852, 1853, 1854, 2172, 230: 2153, 2112, 2184, 2188, 235: 2169, 2168, 2205, 2179, 243: 2144, 266: 2148, 2187, 290: 2156, 299: 2175, 311: 2189, 2110, 2182, 2204, 2206, 2147, 2146, 2163, 2203, 2183, 2180, 2174, 2178, 2143, 2145, 2181, 2152, 2185, 2193, 2244, 2151, 2194, 2195, 2150, 2173, 2166, 2167, 2217, 2219, 2220, 2221, 2176, 2222, 2201, 2207, 2215, 2216, 2211, 2223, 2224, 2225, 2212, 2227, 2228, 2218, 2213, 2226, 2208, 2214, 2199, 2229, 2230, 2177, 2234, 2190, 2192, 2233, 2239, 2238, 2240, 2237, 2170, 2241, 2236, 2235, 2232, 2186, 2231, 2191, 2196, 2197, 389: 2155, 1635, 1636, 1634, 448: 2171, 2243, 2162, 2157, 2149, 2160, 2158, 2159, 2198, 2210, 2209, 2202, 2200, 2154, 2165, 2242, 2164, 2161, 2115, 2114, 2113, 2848}, + {1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 233: 1256, 1256, 236: 1256, 1256, 1256, 243: 1256, 1256, 1256, 1256, 248: 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 259: 1256, 1256, 1256, 1256, 1256, 265: 1256, 1256, 1256, 1256, 1256, 274: 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 293: 1256}, + {1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 233: 1255, 1255, 236: 1255, 1255, 1255, 243: 1255, 1255, 1255, 1255, 248: 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 259: 1255, 1255, 1255, 1255, 1255, 265: 1255, 1255, 1255, 1255, 1255, 274: 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 293: 1255}, + {1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 233: 1238, 1238, 236: 1238, 1238, 1238, 243: 1238, 1238, 1238, 1238, 248: 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 265: 1238, 1238, 1238, 1238, 1238, 274: 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 293: 1238, 295: 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238}, + {1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 233: 1258, 1258, 236: 1258, 1258, 1258, 243: 1258, 1258, 1258, 1258, 248: 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 259: 1258, 1258, 1258, 1258, 1258, 265: 1258, 1258, 1258, 1258, 1258, 274: 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 293: 1258, 474: 2270, 2268}, + {2: 1736, 1653, 1687, 1654, 7: 2140, 1741, 1680, 1738, 2145, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 2149, 1665, 2142, 2144, 1859, 2158, 2159, 2157, 2153, 2160, 1837, 1839, 1838, 2150, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 2151, 1774, 1673, 2141, 1751, 1714, 2146, 2148, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 2156, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 2147, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 2152, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 2143, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 2138, 2139, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 2161, 1853, 2137, 1858, 1857, 1699, 1860, 1862, 1703, 2154, 2155, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 2162, 2163, 1876, 1870, 1871, 1872, 2193, 234: 2174, 2133, 2205, 2209, 239: 2190, 2189, 2226, 2200, 247: 2165, 270: 2169, 272: 2208, 294: 2177, 303: 2196, 315: 2210, 2131, 2203, 2225, 2227, 2168, 2167, 2184, 2224, 2204, 2201, 2195, 2199, 2164, 2166, 2202, 2173, 2206, 2214, 2265, 2172, 2215, 2216, 2171, 2194, 2187, 2188, 2238, 2240, 2241, 2242, 2197, 2243, 2222, 2228, 2236, 2237, 2232, 2244, 2245, 2246, 2233, 2248, 2249, 2239, 2234, 2247, 2229, 2235, 2220, 2250, 2251, 2198, 2255, 2211, 2213, 2254, 2260, 2259, 2261, 2258, 2191, 2262, 2257, 2256, 381: 2253, 2207, 2252, 2212, 2217, 2218, 393: 2176, 1649, 1650, 1648, 452: 2192, 2264, 2183, 2178, 2170, 2181, 2179, 2180, 2219, 2231, 2230, 2223, 2221, 2175, 2186, 2263, 2185, 2182, 2136, 2135, 2134, 2862}, // 1330 - {1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 229: 1248, 1248, 232: 1248, 1248, 1248, 239: 1248, 1248, 1248, 1248, 244: 1248, 1248, 2253, 1248, 2251, 1248, 2252, 2250, 2248, 1248, 255: 1248, 1248, 1248, 1248, 1248, 1248, 262: 1248, 1248, 1248, 1248, 270: 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 289: 1248, 470: 2249, 2247}, - {2: 1722, 1639, 1673, 1640, 7: 1650, 1727, 1666, 1724, 1687, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 1714, 1651, 1660, 1681, 1774, 1775, 1771, 1733, 1780, 1716, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 1719, 1760, 1659, 1658, 1737, 1683, 1700, 1705, 1709, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 1770, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 1706, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 1721, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 1677, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 1638, 1642, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 1834, 1835, 1633, 1840, 1839, 1685, 1842, 1844, 1689, 1753, 1769, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 1855, 1856, 1858, 1852, 1853, 1854, 2082, 389: 1860, 1635, 1636, 1634, 472: 2081, 506: 2080, 2079, 2855}, - {259: 523, 584: 2852, 705: 2851}, - {259: 2853}, - {259: 522}, + {1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 233: 1262, 1262, 236: 1262, 1262, 1262, 243: 1262, 1262, 1262, 1262, 248: 1262, 1262, 2274, 1262, 2272, 2273, 2271, 2269, 1262, 1262, 259: 1262, 1262, 1262, 1262, 1262, 265: 1262, 1262, 1262, 1262, 1262, 274: 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 293: 1262, 474: 2270, 2268}, + {2: 1736, 1653, 1687, 1654, 7: 1664, 1741, 1680, 1738, 1701, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 1728, 1665, 1674, 1695, 1859, 1788, 1789, 1785, 1747, 1794, 1837, 1839, 1838, 1730, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 1733, 1774, 1673, 1672, 1751, 1714, 1719, 1723, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 1784, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 1720, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 1735, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 1691, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 1652, 1656, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 1852, 1853, 1647, 1858, 1857, 1699, 1860, 1862, 1703, 1767, 1783, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 1873, 1874, 1876, 1870, 1871, 1872, 2102, 393: 1878, 1649, 1650, 1648, 452: 2101, 476: 2100, 510: 2099, 2098, 2869}, + {263: 532, 588: 2866, 709: 2865}, + {263: 2867}, + {263: 531}, // 1335 - {2: 1722, 1639, 1673, 1640, 7: 1650, 1727, 1666, 1724, 1687, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 1714, 1651, 1660, 1681, 1774, 1775, 1771, 1733, 1780, 1716, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 1719, 1760, 1659, 1658, 1737, 1683, 1700, 1705, 1709, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 1770, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 1706, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 1721, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 1677, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 1638, 1642, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 1834, 1835, 1633, 1840, 1839, 1685, 1842, 1844, 1689, 1753, 1769, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 1855, 1856, 1858, 1852, 1853, 1854, 2082, 389: 1860, 1635, 1636, 1634, 472: 2081, 506: 2080, 2079, 2854}, - {528, 528, 6: 528, 21: 528, 229: 528, 232: 528, 528, 239: 528, 528, 528, 528, 244: 528, 528, 247: 528, 249: 528, 255: 528, 528, 528, 528, 528, 528, 262: 528, 528, 528, 528, 521: 2098, 524: 2097}, - {529, 529, 6: 529, 21: 529, 229: 529, 232: 529, 529, 239: 529, 529, 529, 529, 244: 529, 529, 247: 529, 249: 529, 255: 529, 529, 529, 529, 529, 529, 262: 529, 529, 529, 529, 521: 2098, 524: 2097}, - {259: 2857}, - {2: 1722, 1639, 1673, 1640, 7: 1650, 1727, 1666, 1724, 1687, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 1714, 1651, 1660, 1681, 1774, 1775, 1771, 1733, 1780, 1716, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 1719, 1760, 1659, 1658, 1737, 1683, 1700, 1705, 1709, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 1770, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 1706, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 1721, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 1677, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 1638, 1642, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 1834, 1835, 1633, 1840, 1839, 1685, 1842, 1844, 1689, 1753, 1769, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 1855, 1856, 1858, 1852, 1853, 1854, 2082, 389: 1860, 1635, 1636, 1634, 472: 2081, 506: 2080, 2079, 2858}, + {2: 1736, 1653, 1687, 1654, 7: 1664, 1741, 1680, 1738, 1701, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 1728, 1665, 1674, 1695, 1859, 1788, 1789, 1785, 1747, 1794, 1837, 1839, 1838, 1730, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 1733, 1774, 1673, 1672, 1751, 1714, 1719, 1723, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 1784, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 1720, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 1735, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 1691, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 1652, 1656, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 1852, 1853, 1647, 1858, 1857, 1699, 1860, 1862, 1703, 1767, 1783, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 1873, 1874, 1876, 1870, 1871, 1872, 2102, 393: 1878, 1649, 1650, 1648, 452: 2101, 476: 2100, 510: 2099, 2098, 2868}, + {537, 537, 6: 537, 21: 537, 233: 537, 236: 537, 537, 243: 537, 537, 537, 537, 248: 537, 537, 251: 537, 256: 537, 259: 537, 537, 537, 537, 537, 265: 537, 537, 537, 537, 537, 526: 2119, 529: 2118}, + {538, 538, 6: 538, 21: 538, 233: 538, 236: 538, 538, 243: 538, 538, 538, 538, 248: 538, 538, 251: 538, 256: 538, 259: 538, 538, 538, 538, 538, 265: 538, 538, 538, 538, 538, 526: 2119, 529: 2118}, + {263: 2871}, + {2: 1736, 1653, 1687, 1654, 7: 1664, 1741, 1680, 1738, 1701, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 1728, 1665, 1674, 1695, 1859, 1788, 1789, 1785, 1747, 1794, 1837, 1839, 1838, 1730, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 1733, 1774, 1673, 1672, 1751, 1714, 1719, 1723, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 1784, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 1720, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 1735, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 1691, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 1652, 1656, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 1852, 1853, 1647, 1858, 1857, 1699, 1860, 1862, 1703, 1767, 1783, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 1873, 1874, 1876, 1870, 1871, 1872, 2102, 393: 1878, 1649, 1650, 1648, 452: 2101, 476: 2100, 510: 2099, 2098, 2872}, // 1340 - {229: 2859, 232: 2101, 2102, 240: 2860, 255: 2100, 259: 2103, 262: 2104, 2105, 2099, 521: 2098, 524: 2097}, - {2: 1722, 1639, 1673, 1640, 7: 2119, 1727, 1666, 1724, 2124, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 2128, 1651, 2121, 2123, 2137, 2138, 2136, 2132, 2139, 2129, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 2130, 1760, 1659, 2120, 1737, 1683, 1700, 2125, 2127, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 2135, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 2126, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 2131, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 2122, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 2117, 2118, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 2140, 1835, 2116, 1840, 1839, 1685, 1842, 1844, 1689, 2133, 2134, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 2141, 2142, 1858, 1852, 1853, 1854, 2172, 230: 2153, 2112, 2184, 2188, 235: 2169, 2168, 2205, 2179, 243: 2144, 266: 2148, 2187, 290: 2156, 299: 2175, 311: 2189, 2110, 2182, 2204, 2206, 2147, 2146, 2163, 2203, 2183, 2180, 2174, 2178, 2143, 2145, 2181, 2152, 2185, 2193, 2244, 2151, 2194, 2195, 2150, 2173, 2166, 2167, 2217, 2219, 2220, 2221, 2176, 2222, 2201, 2207, 2215, 2216, 2211, 2223, 2224, 2225, 2212, 2227, 2228, 2218, 2213, 2226, 2208, 2214, 2199, 2229, 2230, 2177, 2234, 2190, 2192, 2233, 2239, 2238, 2240, 2237, 2170, 2241, 2236, 2235, 2232, 2186, 2231, 2191, 2196, 2197, 389: 2155, 1635, 1636, 1634, 448: 2171, 2243, 2162, 2157, 2149, 2160, 2158, 2159, 2198, 2210, 2209, 2202, 2200, 2154, 2165, 2242, 2164, 2161, 2115, 2114, 2113, 2864}, - {228: 2861}, - {2: 1722, 1639, 1673, 1640, 7: 1650, 1727, 1666, 1724, 1687, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 1714, 1651, 1660, 1681, 1774, 1775, 1771, 1733, 1780, 1716, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 1719, 1760, 1659, 1658, 1737, 1683, 1700, 1705, 1709, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 1770, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 1706, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 1721, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 1677, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 1638, 1642, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 1834, 1835, 1633, 1840, 1839, 1685, 1842, 1844, 1689, 1753, 1769, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 1855, 1856, 1858, 1852, 1853, 1854, 389: 1928, 1635, 1636, 1634, 479: 1929, 523: 2862}, - {6: 1933, 21: 2863}, + {233: 2873, 236: 2122, 2123, 244: 2874, 259: 2121, 263: 2124, 266: 2125, 2126, 2120, 526: 2119, 529: 2118}, + {2: 1736, 1653, 1687, 1654, 7: 2140, 1741, 1680, 1738, 2145, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 2149, 1665, 2142, 2144, 1859, 2158, 2159, 2157, 2153, 2160, 1837, 1839, 1838, 2150, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 2151, 1774, 1673, 2141, 1751, 1714, 2146, 2148, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 2156, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 2147, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 2152, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 2143, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 2138, 2139, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 2161, 1853, 2137, 1858, 1857, 1699, 1860, 1862, 1703, 2154, 2155, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 2162, 2163, 1876, 1870, 1871, 1872, 2193, 234: 2174, 2133, 2205, 2209, 239: 2190, 2189, 2226, 2200, 247: 2165, 270: 2169, 272: 2208, 294: 2177, 303: 2196, 315: 2210, 2131, 2203, 2225, 2227, 2168, 2167, 2184, 2224, 2204, 2201, 2195, 2199, 2164, 2166, 2202, 2173, 2206, 2214, 2265, 2172, 2215, 2216, 2171, 2194, 2187, 2188, 2238, 2240, 2241, 2242, 2197, 2243, 2222, 2228, 2236, 2237, 2232, 2244, 2245, 2246, 2233, 2248, 2249, 2239, 2234, 2247, 2229, 2235, 2220, 2250, 2251, 2198, 2255, 2211, 2213, 2254, 2260, 2259, 2261, 2258, 2191, 2262, 2257, 2256, 381: 2253, 2207, 2252, 2212, 2217, 2218, 393: 2176, 1649, 1650, 1648, 452: 2192, 2264, 2183, 2178, 2170, 2181, 2179, 2180, 2219, 2231, 2230, 2223, 2221, 2175, 2186, 2263, 2185, 2182, 2136, 2135, 2134, 2878}, + {232: 2875}, + {2: 1736, 1653, 1687, 1654, 7: 1664, 1741, 1680, 1738, 1701, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 1728, 1665, 1674, 1695, 1859, 1788, 1789, 1785, 1747, 1794, 1837, 1839, 1838, 1730, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 1733, 1774, 1673, 1672, 1751, 1714, 1719, 1723, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 1784, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 1720, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 1735, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 1691, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 1652, 1656, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 1852, 1853, 1647, 1858, 1857, 1699, 1860, 1862, 1703, 1767, 1783, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 1873, 1874, 1876, 1870, 1871, 1872, 393: 1947, 1649, 1650, 1648, 483: 1948, 528: 2876}, + {6: 1952, 21: 2877}, // 1345 - {530, 530, 6: 530, 21: 530, 229: 530, 232: 530, 530, 239: 530, 530, 530, 530, 244: 530, 530, 247: 530, 249: 530, 255: 530, 530, 530, 530, 530, 530, 262: 530, 530, 530, 530}, - {531, 531, 6: 531, 21: 531, 229: 531, 232: 531, 531, 239: 531, 531, 531, 531, 244: 531, 531, 2253, 531, 2251, 531, 2252, 2250, 2248, 255: 531, 531, 531, 531, 531, 531, 262: 531, 531, 531, 531, 470: 2249, 2247}, - {534, 534, 6: 534, 21: 534, 229: 2866, 232: 534, 534, 239: 534, 2867, 534, 534, 244: 534, 534, 247: 534, 249: 534, 255: 534, 534, 534, 534, 534, 534, 262: 534, 534, 534, 534, 521: 2098, 524: 2097}, - {2: 1722, 1639, 1673, 1640, 7: 2119, 1727, 1666, 1724, 2124, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 2128, 1651, 2121, 2123, 2137, 2138, 2136, 2132, 2139, 2129, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 2130, 1760, 1659, 2120, 1737, 1683, 1700, 2125, 2127, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 2135, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 2126, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 2131, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 2122, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 2117, 2118, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 2140, 1835, 2116, 1840, 1839, 1685, 1842, 1844, 1689, 2133, 2134, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 2141, 2142, 1858, 1852, 1853, 1854, 2172, 230: 2153, 2112, 2184, 2188, 235: 2169, 2168, 2205, 2179, 243: 2144, 266: 2148, 2187, 290: 2156, 299: 2175, 311: 2189, 2110, 2182, 2204, 2206, 2147, 2146, 2163, 2203, 2183, 2180, 2174, 2178, 2143, 2145, 2181, 2152, 2185, 2193, 2244, 2151, 2194, 2195, 2150, 2173, 2166, 2167, 2217, 2219, 2220, 2221, 2176, 2222, 2201, 2207, 2215, 2216, 2211, 2223, 2224, 2225, 2212, 2227, 2228, 2218, 2213, 2226, 2208, 2214, 2199, 2229, 2230, 2177, 2234, 2190, 2192, 2233, 2239, 2238, 2240, 2237, 2170, 2241, 2236, 2235, 2232, 2186, 2231, 2191, 2196, 2197, 389: 2155, 1635, 1636, 1634, 448: 2171, 2243, 2162, 2157, 2149, 2160, 2158, 2159, 2198, 2210, 2209, 2202, 2200, 2154, 2165, 2242, 2164, 2161, 2115, 2114, 2113, 2871}, - {228: 2868}, + {539, 539, 6: 539, 21: 539, 233: 539, 236: 539, 539, 243: 539, 539, 539, 539, 248: 539, 539, 251: 539, 256: 539, 259: 539, 539, 539, 539, 539, 265: 539, 539, 539, 539, 539}, + {540, 540, 6: 540, 21: 540, 233: 540, 236: 540, 540, 243: 540, 540, 540, 540, 248: 540, 540, 2274, 540, 2272, 2273, 2271, 2269, 540, 259: 540, 540, 540, 540, 540, 265: 540, 540, 540, 540, 540, 474: 2270, 2268}, + {543, 543, 6: 543, 21: 543, 233: 2880, 236: 543, 543, 243: 543, 2881, 543, 543, 248: 543, 543, 251: 543, 256: 543, 259: 543, 543, 543, 543, 543, 265: 543, 543, 543, 543, 543, 526: 2119, 529: 2118}, + {2: 1736, 1653, 1687, 1654, 7: 2140, 1741, 1680, 1738, 2145, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 2149, 1665, 2142, 2144, 1859, 2158, 2159, 2157, 2153, 2160, 1837, 1839, 1838, 2150, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 2151, 1774, 1673, 2141, 1751, 1714, 2146, 2148, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 2156, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 2147, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 2152, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 2143, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 2138, 2139, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 2161, 1853, 2137, 1858, 1857, 1699, 1860, 1862, 1703, 2154, 2155, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 2162, 2163, 1876, 1870, 1871, 1872, 2193, 234: 2174, 2133, 2205, 2209, 239: 2190, 2189, 2226, 2200, 247: 2165, 270: 2169, 272: 2208, 294: 2177, 303: 2196, 315: 2210, 2131, 2203, 2225, 2227, 2168, 2167, 2184, 2224, 2204, 2201, 2195, 2199, 2164, 2166, 2202, 2173, 2206, 2214, 2265, 2172, 2215, 2216, 2171, 2194, 2187, 2188, 2238, 2240, 2241, 2242, 2197, 2243, 2222, 2228, 2236, 2237, 2232, 2244, 2245, 2246, 2233, 2248, 2249, 2239, 2234, 2247, 2229, 2235, 2220, 2250, 2251, 2198, 2255, 2211, 2213, 2254, 2260, 2259, 2261, 2258, 2191, 2262, 2257, 2256, 381: 2253, 2207, 2252, 2212, 2217, 2218, 393: 2176, 1649, 1650, 1648, 452: 2192, 2264, 2183, 2178, 2170, 2181, 2179, 2180, 2219, 2231, 2230, 2223, 2221, 2175, 2186, 2263, 2185, 2182, 2136, 2135, 2134, 2885}, + {232: 2882}, // 1350 - {2: 1722, 1639, 1673, 1640, 7: 1650, 1727, 1666, 1724, 1687, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 1714, 1651, 1660, 1681, 1774, 1775, 1771, 1733, 1780, 1716, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 1719, 1760, 1659, 1658, 1737, 1683, 1700, 1705, 1709, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 1770, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 1706, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 1721, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 1677, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 1638, 1642, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 1834, 1835, 1633, 1840, 1839, 1685, 1842, 1844, 1689, 1753, 1769, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 1855, 1856, 1858, 1852, 1853, 1854, 389: 1928, 1635, 1636, 1634, 479: 1929, 523: 2869}, - {6: 1933, 21: 2870}, - {532, 532, 6: 532, 21: 532, 229: 532, 232: 532, 532, 239: 532, 532, 532, 532, 244: 532, 532, 247: 532, 249: 532, 255: 532, 532, 532, 532, 532, 532, 262: 532, 532, 532, 532}, - {533, 533, 6: 533, 21: 533, 229: 533, 232: 533, 533, 239: 533, 533, 533, 533, 244: 533, 533, 2253, 533, 2251, 533, 2252, 2250, 2248, 255: 533, 533, 533, 533, 533, 533, 262: 533, 533, 533, 533, 470: 2249, 2247}, - {2: 1722, 1639, 1673, 1640, 7: 1650, 1727, 1666, 1724, 1687, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 1714, 1651, 1660, 1681, 1774, 1775, 1771, 1733, 1780, 1716, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 1719, 1760, 1659, 1658, 1737, 1683, 1700, 1705, 1709, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 1770, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 1706, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 1721, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 1677, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 1638, 1642, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 1834, 1835, 1633, 1840, 1839, 1685, 1842, 1844, 1689, 1753, 1769, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 1855, 1856, 1858, 1852, 1853, 1854, 2082, 315: 2078, 389: 1860, 1635, 1636, 1634, 472: 2081, 506: 2080, 2079, 2084, 533: 2874}, + {2: 1736, 1653, 1687, 1654, 7: 1664, 1741, 1680, 1738, 1701, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 1728, 1665, 1674, 1695, 1859, 1788, 1789, 1785, 1747, 1794, 1837, 1839, 1838, 1730, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 1733, 1774, 1673, 1672, 1751, 1714, 1719, 1723, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 1784, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 1720, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 1735, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 1691, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 1652, 1656, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 1852, 1853, 1647, 1858, 1857, 1699, 1860, 1862, 1703, 1767, 1783, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 1873, 1874, 1876, 1870, 1871, 1872, 393: 1947, 1649, 1650, 1648, 483: 1948, 528: 2883}, + {6: 1952, 21: 2884}, + {541, 541, 6: 541, 21: 541, 233: 541, 236: 541, 541, 243: 541, 541, 541, 541, 248: 541, 541, 251: 541, 256: 541, 259: 541, 541, 541, 541, 541, 265: 541, 541, 541, 541, 541}, + {542, 542, 6: 542, 21: 542, 233: 542, 236: 542, 542, 243: 542, 542, 542, 542, 248: 542, 542, 2274, 542, 2272, 2273, 2271, 2269, 542, 259: 542, 542, 542, 542, 542, 265: 542, 542, 542, 542, 542, 474: 2270, 2268}, + {2: 1736, 1653, 1687, 1654, 7: 1664, 1741, 1680, 1738, 1701, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 1728, 1665, 1674, 1695, 1859, 1788, 1789, 1785, 1747, 1794, 1837, 1839, 1838, 1730, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 1733, 1774, 1673, 1672, 1751, 1714, 1719, 1723, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 1784, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 1720, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 1735, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 1691, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 1652, 1656, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 1852, 1853, 1647, 1858, 1857, 1699, 1860, 1862, 1703, 1767, 1783, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 1873, 1874, 1876, 1870, 1871, 1872, 2102, 319: 2097, 393: 1878, 1649, 1650, 1648, 452: 2101, 476: 2100, 510: 2099, 2098, 2104, 537: 2888}, // 1355 - {557, 557, 6: 557, 21: 557, 229: 557, 232: 557, 557, 239: 557, 557, 557, 557, 244: 557, 557, 247: 557, 249: 557, 255: 557, 557, 557, 557, 557, 557, 262: 557, 557, 557, 557}, - {565, 565, 6: 565, 21: 565, 229: 565, 239: 565, 565, 565, 565, 244: 565, 565, 247: 565, 249: 565, 256: 565, 565, 565, 260: 565}, - {554, 554, 1722, 1639, 1673, 1640, 554, 1650, 1727, 1666, 1724, 1687, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 554, 1758, 1698, 1755, 1781, 1701, 1777, 1702, 1714, 1651, 1660, 1681, 1774, 1775, 1771, 1733, 1780, 1716, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 1719, 1760, 1659, 1658, 1737, 1683, 1700, 1705, 1709, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 1770, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 1706, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 1721, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 1677, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 1638, 1642, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 1834, 1835, 1633, 1840, 1839, 1685, 1842, 1844, 1689, 1753, 1769, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 1855, 1856, 1858, 1852, 1853, 1854, 229: 554, 232: 554, 554, 2091, 239: 554, 554, 554, 554, 244: 554, 554, 247: 554, 249: 554, 255: 554, 554, 554, 554, 554, 554, 262: 554, 554, 554, 554, 389: 2090, 1635, 1636, 1634, 554, 405: 554, 407: 554, 588: 2884, 864: 2883}, - {228: 2877}, - {2: 1722, 1639, 1673, 1640, 7: 1650, 1727, 1666, 1724, 1687, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 1714, 1651, 1660, 1681, 1774, 1775, 1771, 1733, 1780, 1716, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 1719, 1760, 1659, 1658, 1737, 1683, 1700, 1705, 1709, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 1770, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 1706, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 1721, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 1677, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 1638, 1642, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 1834, 1835, 1633, 1840, 1839, 1685, 1842, 1844, 1689, 1753, 1769, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 1855, 1856, 1858, 1852, 1853, 1854, 389: 2878, 1635, 1636, 1634, 611: 2879}, + {566, 566, 6: 566, 21: 566, 233: 566, 236: 566, 566, 243: 566, 566, 566, 566, 248: 566, 566, 251: 566, 256: 566, 259: 566, 566, 566, 566, 566, 265: 566, 566, 566, 566, 566}, + {573, 573, 6: 573, 21: 573, 233: 573, 243: 573, 573, 573, 573, 248: 573, 573, 251: 573, 256: 573, 260: 573, 573, 573, 265: 573}, + {563, 563, 1736, 1653, 1687, 1654, 563, 1664, 1741, 1680, 1738, 1701, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 563, 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 1728, 1665, 1674, 1695, 1859, 1788, 1789, 1785, 1747, 1794, 1837, 1839, 1838, 1730, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 1733, 1774, 1673, 1672, 1751, 1714, 1719, 1723, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 1784, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 1720, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 1735, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 1691, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 1652, 1656, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 1852, 1853, 1647, 1858, 1857, 1699, 1860, 1862, 1703, 1767, 1783, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 1873, 1874, 1876, 1870, 1871, 1872, 233: 563, 236: 563, 563, 2115, 243: 563, 563, 563, 563, 248: 563, 563, 251: 563, 256: 563, 259: 563, 563, 563, 563, 563, 265: 563, 563, 563, 563, 563, 393: 2114, 1649, 1650, 1648, 563, 409: 563, 411: 563, 620: 2898, 868: 2897}, + {232: 2891}, + {2: 1736, 1653, 1687, 1654, 7: 1664, 1741, 1680, 1738, 1701, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 1728, 1665, 1674, 1695, 1859, 1788, 1789, 1785, 1747, 1794, 1837, 1839, 1838, 1730, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 1733, 1774, 1673, 1672, 1751, 1714, 1719, 1723, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 1784, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 1720, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 1735, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 1691, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 1652, 1656, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 1852, 1853, 1647, 1858, 1857, 1699, 1860, 1862, 1703, 1767, 1783, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 1873, 1874, 1876, 1870, 1871, 1872, 393: 2892, 1649, 1650, 1648, 614: 2893}, // 1360 - {1465, 1465, 6: 1465, 21: 1465, 239: 1465, 401: 1465}, - {6: 2880, 21: 2881}, - {2: 1722, 1639, 1673, 1640, 7: 1650, 1727, 1666, 1724, 1687, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 1714, 1651, 1660, 1681, 1774, 1775, 1771, 1733, 1780, 1716, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 1719, 1760, 1659, 1658, 1737, 1683, 1700, 1705, 1709, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 1770, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 1706, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 1721, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 1677, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 1638, 1642, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 1834, 1835, 1633, 1840, 1839, 1685, 1842, 1844, 1689, 1753, 1769, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 1855, 1856, 1858, 1852, 1853, 1854, 389: 2882, 1635, 1636, 1634}, - {555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 229: 555, 232: 555, 555, 555, 239: 555, 555, 555, 555, 244: 555, 555, 247: 555, 249: 555, 255: 555, 555, 555, 555, 555, 555, 262: 555, 555, 555, 555, 393: 555, 405: 555, 407: 555}, - {1464, 1464, 6: 1464, 21: 1464, 239: 1464, 401: 1464}, + {1479, 1479, 6: 1479, 21: 1479, 243: 1479, 405: 1479}, + {6: 2894, 21: 2895}, + {2: 1736, 1653, 1687, 1654, 7: 1664, 1741, 1680, 1738, 1701, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 1728, 1665, 1674, 1695, 1859, 1788, 1789, 1785, 1747, 1794, 1837, 1839, 1838, 1730, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 1733, 1774, 1673, 1672, 1751, 1714, 1719, 1723, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 1784, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 1720, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 1735, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 1691, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 1652, 1656, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 1852, 1853, 1647, 1858, 1857, 1699, 1860, 1862, 1703, 1767, 1783, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 1873, 1874, 1876, 1870, 1871, 1872, 393: 2896, 1649, 1650, 1648}, + {564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 233: 564, 236: 564, 564, 564, 243: 564, 564, 564, 564, 248: 564, 564, 251: 564, 256: 564, 259: 564, 564, 564, 564, 564, 265: 564, 564, 564, 564, 564, 397: 564, 409: 564, 411: 564}, + {1478, 1478, 6: 1478, 21: 1478, 243: 1478, 405: 1478}, // 1365 - {536, 536, 6: 536, 21: 536, 229: 536, 232: 536, 536, 239: 536, 536, 536, 536, 244: 536, 536, 247: 536, 249: 536, 255: 536, 536, 536, 536, 536, 536, 262: 536, 536, 536, 536, 393: 2887, 405: 2888, 407: 2886, 604: 2890, 2889, 677: 2891, 2885}, - {553, 553, 6: 553, 21: 553, 229: 553, 232: 553, 553, 239: 553, 553, 553, 553, 244: 553, 553, 247: 553, 249: 553, 255: 553, 553, 553, 553, 553, 553, 262: 553, 553, 553, 553, 393: 553, 405: 553, 407: 553}, - {560, 560, 6: 560, 21: 560, 229: 560, 232: 560, 560, 239: 560, 560, 560, 560, 244: 560, 560, 247: 560, 249: 560, 255: 560, 560, 560, 560, 560, 560, 262: 560, 560, 560, 560}, - {383: 2907, 401: 2908, 529: 2911}, - {383: 2907, 401: 2908, 529: 2910}, + {545, 545, 6: 545, 21: 545, 233: 545, 236: 545, 545, 243: 545, 545, 545, 545, 248: 545, 545, 251: 545, 256: 545, 259: 545, 545, 545, 545, 545, 265: 545, 545, 545, 545, 545, 397: 2901, 409: 2902, 411: 2900, 607: 2904, 2903, 681: 2905, 2899}, + {562, 562, 6: 562, 21: 562, 233: 562, 236: 562, 562, 243: 562, 562, 562, 562, 248: 562, 562, 251: 562, 256: 562, 259: 562, 562, 562, 562, 562, 265: 562, 562, 562, 562, 562, 397: 562, 409: 562, 411: 562}, + {568, 568, 6: 568, 21: 568, 233: 568, 236: 568, 568, 243: 568, 568, 568, 568, 248: 568, 568, 251: 568, 256: 568, 259: 568, 568, 568, 568, 568, 265: 568, 568, 568, 568, 568}, + {387: 2921, 405: 2922, 533: 2925}, + {387: 2921, 405: 2922, 533: 2924}, // 1370 - {383: 2907, 401: 2908, 529: 2909}, - {228: 547, 244: 2893, 803: 2894}, - {538, 538, 6: 538, 21: 538, 229: 538, 232: 538, 538, 239: 538, 538, 538, 538, 244: 538, 538, 247: 538, 249: 538, 255: 538, 538, 538, 538, 538, 538, 262: 538, 538, 538, 538, 393: 538, 405: 538, 407: 538}, - {535, 535, 6: 535, 21: 535, 229: 535, 232: 535, 535, 239: 535, 535, 535, 535, 244: 535, 535, 247: 535, 249: 535, 255: 535, 535, 535, 535, 535, 535, 262: 535, 535, 535, 535, 393: 2887, 405: 2888, 407: 2886, 604: 2892, 2889}, - {537, 537, 6: 537, 21: 537, 229: 537, 232: 537, 537, 239: 537, 537, 537, 537, 244: 537, 537, 247: 537, 249: 537, 255: 537, 537, 537, 537, 537, 537, 262: 537, 537, 537, 537, 393: 537, 405: 537, 407: 537}, + {387: 2921, 405: 2922, 533: 2923}, + {232: 556, 248: 2907, 807: 2908}, + {547, 547, 6: 547, 21: 547, 233: 547, 236: 547, 547, 243: 547, 547, 547, 547, 248: 547, 547, 251: 547, 256: 547, 259: 547, 547, 547, 547, 547, 265: 547, 547, 547, 547, 547, 397: 547, 409: 547, 411: 547}, + {544, 544, 6: 544, 21: 544, 233: 544, 236: 544, 544, 243: 544, 544, 544, 544, 248: 544, 544, 251: 544, 256: 544, 259: 544, 544, 544, 544, 544, 265: 544, 544, 544, 544, 544, 397: 2901, 409: 2902, 411: 2900, 607: 2906, 2903}, + {546, 546, 6: 546, 21: 546, 233: 546, 236: 546, 546, 243: 546, 546, 546, 546, 248: 546, 546, 251: 546, 256: 546, 259: 546, 546, 546, 546, 546, 265: 546, 546, 546, 546, 546, 397: 546, 409: 546, 411: 546}, // 1375 - {247: 2903, 259: 2902, 2904}, - {228: 2895}, - {2: 1722, 1639, 1673, 1640, 542, 1650, 1727, 1666, 1724, 1687, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 542, 1758, 1698, 1755, 1781, 1701, 1777, 1702, 1714, 1651, 1660, 1681, 1774, 1775, 1771, 1733, 1780, 1716, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 1719, 1760, 1659, 1658, 1737, 1683, 1700, 1705, 1709, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 1770, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 1706, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 1721, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 1677, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 1638, 1642, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 1834, 1835, 1633, 1840, 1839, 1685, 1842, 1844, 1689, 1753, 1769, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 1855, 1856, 1858, 1852, 1853, 1854, 384: 2898, 389: 2897, 1635, 1636, 1634, 580: 2896}, - {6: 2900, 21: 2899}, - {541, 541, 6: 541, 21: 541, 239: 541}, + {251: 2917, 263: 2916, 265: 2918}, + {232: 2909}, + {2: 1736, 1653, 1687, 1654, 551, 1664, 1741, 1680, 1738, 1701, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 551, 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 1728, 1665, 1674, 1695, 1859, 1788, 1789, 1785, 1747, 1794, 1837, 1839, 1838, 1730, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 1733, 1774, 1673, 1672, 1751, 1714, 1719, 1723, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 1784, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 1720, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 1735, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 1691, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 1652, 1656, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 1852, 1853, 1647, 1858, 1857, 1699, 1860, 1862, 1703, 1767, 1783, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 1873, 1874, 1876, 1870, 1871, 1872, 388: 2912, 393: 2911, 1649, 1650, 1648, 584: 2910}, + {6: 2914, 21: 2913}, + {550, 550, 6: 550, 21: 550, 243: 550}, // 1380 - {539, 539, 6: 539, 21: 539, 239: 539}, - {543, 543, 6: 543, 21: 543, 229: 543, 232: 543, 543, 239: 543, 543, 543, 543, 244: 543, 543, 247: 543, 249: 543, 255: 543, 543, 543, 543, 543, 543, 262: 543, 543, 543, 543, 393: 543, 405: 543, 407: 543}, - {2: 1722, 1639, 1673, 1640, 7: 1650, 1727, 1666, 1724, 1687, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 1714, 1651, 1660, 1681, 1774, 1775, 1771, 1733, 1780, 1716, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 1719, 1760, 1659, 1658, 1737, 1683, 1700, 1705, 1709, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 1770, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 1706, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 1721, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 1677, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 1638, 1642, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 1834, 1835, 1633, 1840, 1839, 1685, 1842, 1844, 1689, 1753, 1769, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 1855, 1856, 1858, 1852, 1853, 1854, 389: 2901, 1635, 1636, 1634}, - {540, 540, 6: 540, 21: 540, 239: 540}, - {228: 546}, + {548, 548, 6: 548, 21: 548, 243: 548}, + {552, 552, 6: 552, 21: 552, 233: 552, 236: 552, 552, 243: 552, 552, 552, 552, 248: 552, 552, 251: 552, 256: 552, 259: 552, 552, 552, 552, 552, 265: 552, 552, 552, 552, 552, 397: 552, 409: 552, 411: 552}, + {2: 1736, 1653, 1687, 1654, 7: 1664, 1741, 1680, 1738, 1701, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 1728, 1665, 1674, 1695, 1859, 1788, 1789, 1785, 1747, 1794, 1837, 1839, 1838, 1730, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 1733, 1774, 1673, 1672, 1751, 1714, 1719, 1723, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 1784, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 1720, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 1735, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 1691, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 1652, 1656, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 1852, 1853, 1647, 1858, 1857, 1699, 1860, 1862, 1703, 1767, 1783, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 1873, 1874, 1876, 1870, 1871, 1872, 393: 2915, 1649, 1650, 1648}, + {549, 549, 6: 549, 21: 549, 243: 549}, + {232: 555}, // 1385 - {404: 2906}, - {404: 2905}, - {228: 544}, - {228: 545}, - {2: 1476, 1476, 1476, 1476, 7: 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 22: 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 240: 1476, 244: 1476}, + {408: 2920}, + {408: 2919}, + {232: 553}, + {232: 554}, + {2: 1490, 1490, 1490, 1490, 7: 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 22: 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 244: 1490, 248: 1490}, // 1390 - {2: 1475, 1475, 1475, 1475, 7: 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 22: 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 240: 1475, 244: 1475}, - {228: 548, 244: 548}, - {228: 549, 244: 549}, - {228: 550, 244: 550}, - {2: 1722, 1639, 1673, 1640, 7: 1650, 1727, 1666, 1724, 1687, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 1714, 1651, 1660, 1681, 1774, 1775, 1771, 1733, 1780, 1716, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 1719, 1760, 1659, 1658, 1737, 1683, 1700, 1705, 1709, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 1770, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 1706, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 1721, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 1677, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 1638, 1642, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 1834, 1835, 1633, 1840, 1839, 1685, 1842, 1844, 1689, 1753, 1769, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 1855, 1856, 1858, 1852, 1853, 1854, 2082, 389: 1860, 1635, 1636, 1634, 472: 2081, 506: 2080, 2079, 2913}, + {2: 1489, 1489, 1489, 1489, 7: 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 22: 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 244: 1489, 248: 1489}, + {232: 557, 248: 557}, + {232: 558, 248: 558}, + {232: 559, 248: 559}, + {2: 1736, 1653, 1687, 1654, 7: 1664, 1741, 1680, 1738, 1701, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 1728, 1665, 1674, 1695, 1859, 1788, 1789, 1785, 1747, 1794, 1837, 1839, 1838, 1730, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 1733, 1774, 1673, 1672, 1751, 1714, 1719, 1723, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 1784, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 1720, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 1735, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 1691, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 1652, 1656, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 1852, 1853, 1647, 1858, 1857, 1699, 1860, 1862, 1703, 1767, 1783, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 1873, 1874, 1876, 1870, 1871, 1872, 2102, 393: 1878, 1649, 1650, 1648, 452: 2101, 476: 2100, 510: 2099, 2098, 2927}, // 1395 - {232: 2101, 2102, 255: 2100, 259: 2103, 262: 2104, 2105, 2099, 2914, 521: 2098, 524: 2097}, - {563, 563, 6: 563, 21: 563, 229: 563, 239: 563, 563, 563, 563, 244: 563, 563, 247: 563, 249: 563, 256: 563, 563, 563, 260: 563}, - {2: 1722, 1639, 1673, 1640, 7: 1650, 1727, 1666, 1724, 1687, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 1714, 1651, 1660, 1681, 1774, 1775, 1771, 1733, 1780, 1716, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 1719, 1760, 1659, 1658, 1737, 1683, 1700, 1705, 1709, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 1770, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 1706, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 1721, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 1677, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 1638, 1642, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 1834, 1835, 1633, 1840, 1839, 1685, 1842, 1844, 1689, 1753, 1769, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 1855, 1856, 1858, 1852, 1853, 1854, 389: 1928, 1635, 1636, 1634, 479: 2916, 575: 2917, 593: 2918}, - {254: 2931}, - {1448, 1448, 6: 1448, 245: 1448, 247: 1448, 249: 1448}, + {236: 2122, 2123, 259: 2121, 263: 2124, 266: 2125, 2126, 2120, 2928, 526: 2119, 529: 2118}, + {571, 571, 6: 571, 21: 571, 233: 571, 243: 571, 571, 571, 571, 248: 571, 571, 251: 571, 256: 571, 260: 571, 571, 571, 265: 571}, + {2: 1736, 1653, 1687, 1654, 7: 1664, 1741, 1680, 1738, 1701, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 1728, 1665, 1674, 1695, 1859, 1788, 1789, 1785, 1747, 1794, 1837, 1839, 1838, 1730, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 1733, 1774, 1673, 1672, 1751, 1714, 1719, 1723, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 1784, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 1720, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 1735, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 1691, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 1652, 1656, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 1852, 1853, 1647, 1858, 1857, 1699, 1860, 1862, 1703, 1767, 1783, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 1873, 1874, 1876, 1870, 1871, 1872, 393: 1947, 1649, 1650, 1648, 483: 2930, 579: 2931, 596: 2932}, + {258: 2945}, + {1462, 1462, 6: 1462, 249: 1462, 251: 1462, 256: 1462}, // 1400 - {115, 115, 6: 2919, 245: 115, 247: 115, 249: 2921, 541: 2922, 2920}, - {2: 1722, 1639, 1673, 1640, 7: 1650, 1727, 1666, 1724, 1687, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 1714, 1651, 1660, 1681, 1774, 1775, 1771, 1733, 1780, 1716, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 1719, 1760, 1659, 1658, 1737, 1683, 1700, 1705, 1709, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 1770, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 1706, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 1721, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 1677, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 1638, 1642, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 1834, 1835, 1633, 1840, 1839, 1685, 1842, 1844, 1689, 1753, 1769, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 1855, 1856, 1858, 1852, 1853, 1854, 389: 1928, 1635, 1636, 1634, 479: 2916, 575: 2930}, - {876, 876, 245: 876, 247: 2454, 514: 2455, 2924}, - {2: 1722, 1639, 1673, 1640, 7: 2119, 1727, 1666, 1724, 2124, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 2128, 1651, 2121, 2123, 2137, 2138, 2136, 2132, 2139, 2129, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 2130, 1760, 1659, 2120, 1737, 1683, 1700, 2125, 2127, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 2135, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 2126, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 2131, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 2122, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 2117, 2118, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 2140, 1835, 2116, 1840, 1839, 1685, 1842, 1844, 1689, 2133, 2134, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 2141, 2142, 1858, 1852, 1853, 1854, 2172, 230: 2153, 2112, 2184, 2188, 235: 2169, 2168, 2205, 2179, 243: 2144, 266: 2148, 2187, 290: 2156, 299: 2175, 311: 2189, 2110, 2182, 2204, 2206, 2147, 2146, 2163, 2203, 2183, 2180, 2174, 2178, 2143, 2145, 2181, 2152, 2185, 2193, 2244, 2151, 2194, 2195, 2150, 2173, 2166, 2167, 2217, 2219, 2220, 2221, 2176, 2222, 2201, 2207, 2215, 2216, 2211, 2223, 2224, 2225, 2212, 2227, 2228, 2218, 2213, 2226, 2208, 2214, 2199, 2229, 2230, 2177, 2234, 2190, 2192, 2233, 2239, 2238, 2240, 2237, 2170, 2241, 2236, 2235, 2232, 2186, 2231, 2191, 2196, 2197, 389: 2155, 1635, 1636, 1634, 448: 2171, 2243, 2162, 2157, 2149, 2160, 2158, 2159, 2198, 2210, 2209, 2202, 2200, 2154, 2165, 2242, 2164, 2161, 2115, 2114, 2113, 2923}, - {114, 114, 21: 114, 229: 114, 239: 114, 114, 114, 114, 244: 114, 114, 247: 114, 256: 114, 258: 114, 260: 114}, + {116, 116, 6: 2933, 249: 116, 251: 116, 256: 2935, 545: 2936, 2934}, + {2: 1736, 1653, 1687, 1654, 7: 1664, 1741, 1680, 1738, 1701, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 1728, 1665, 1674, 1695, 1859, 1788, 1789, 1785, 1747, 1794, 1837, 1839, 1838, 1730, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 1733, 1774, 1673, 1672, 1751, 1714, 1719, 1723, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 1784, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 1720, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 1735, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 1691, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 1652, 1656, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 1852, 1853, 1647, 1858, 1857, 1699, 1860, 1862, 1703, 1767, 1783, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 1873, 1874, 1876, 1870, 1871, 1872, 393: 1947, 1649, 1650, 1648, 483: 2930, 579: 2944}, + {884, 884, 249: 884, 251: 2475, 518: 2476, 2938}, + {2: 1736, 1653, 1687, 1654, 7: 2140, 1741, 1680, 1738, 2145, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 2149, 1665, 2142, 2144, 1859, 2158, 2159, 2157, 2153, 2160, 1837, 1839, 1838, 2150, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 2151, 1774, 1673, 2141, 1751, 1714, 2146, 2148, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 2156, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 2147, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 2152, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 2143, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 2138, 2139, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 2161, 1853, 2137, 1858, 1857, 1699, 1860, 1862, 1703, 2154, 2155, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 2162, 2163, 1876, 1870, 1871, 1872, 2193, 234: 2174, 2133, 2205, 2209, 239: 2190, 2189, 2226, 2200, 247: 2165, 270: 2169, 272: 2208, 294: 2177, 303: 2196, 315: 2210, 2131, 2203, 2225, 2227, 2168, 2167, 2184, 2224, 2204, 2201, 2195, 2199, 2164, 2166, 2202, 2173, 2206, 2214, 2265, 2172, 2215, 2216, 2171, 2194, 2187, 2188, 2238, 2240, 2241, 2242, 2197, 2243, 2222, 2228, 2236, 2237, 2232, 2244, 2245, 2246, 2233, 2248, 2249, 2239, 2234, 2247, 2229, 2235, 2220, 2250, 2251, 2198, 2255, 2211, 2213, 2254, 2260, 2259, 2261, 2258, 2191, 2262, 2257, 2256, 381: 2253, 2207, 2252, 2212, 2217, 2218, 393: 2176, 1649, 1650, 1648, 452: 2192, 2264, 2183, 2178, 2170, 2181, 2179, 2180, 2219, 2231, 2230, 2223, 2221, 2175, 2186, 2263, 2185, 2182, 2136, 2135, 2134, 2937}, + {115, 115, 21: 115, 233: 115, 243: 115, 115, 115, 115, 248: 115, 115, 251: 115, 260: 115, 115, 265: 115}, // 1405 - {116, 116, 21: 116, 229: 116, 239: 116, 116, 116, 116, 244: 116, 116, 2253, 116, 2251, 250: 2252, 2250, 2248, 256: 116, 258: 116, 260: 116, 470: 2249, 2247}, - {518, 518, 245: 2925, 685: 2926}, - {266: 1624, 318: 2929, 474: 2661, 489: 2928, 582: 2927}, - {119, 119}, - {517, 517}, + {117, 117, 21: 117, 233: 117, 243: 117, 117, 117, 117, 248: 117, 117, 2274, 117, 2272, 2273, 2271, 2269, 260: 117, 117, 265: 117, 474: 2270, 2268}, + {527, 527, 249: 2939, 689: 2940}, + {270: 1638, 322: 2943, 478: 2682, 493: 2942, 586: 2941}, + {120, 120}, + {526, 526}, // 1410 - {516, 516, 6: 516, 21: 516, 54: 516, 229: 516, 239: 516, 516, 516, 516, 244: 516}, - {515, 515, 6: 515, 21: 515, 54: 515, 229: 515, 239: 515, 515, 515, 515, 244: 515}, - {1447, 1447, 6: 1447, 245: 1447, 247: 1447, 249: 1447}, - {2: 1722, 1639, 1673, 1640, 7: 2119, 1727, 1666, 1724, 2124, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 2128, 1651, 2121, 2123, 2137, 2138, 2136, 2132, 2139, 2129, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 2130, 1760, 1659, 2120, 1737, 1683, 1700, 2125, 2127, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 2135, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 2126, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 2131, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 2122, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 2117, 2118, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 2140, 1835, 2116, 1840, 1839, 1685, 1842, 1844, 1689, 2133, 2134, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 2141, 2142, 1858, 1852, 1853, 1854, 2172, 230: 2153, 2112, 2184, 2188, 235: 2169, 2168, 2205, 2179, 243: 2144, 266: 2148, 2187, 290: 2156, 299: 2175, 311: 2189, 2110, 2182, 2204, 2206, 2147, 2146, 2163, 2203, 2183, 2180, 2174, 2178, 2143, 2145, 2181, 2152, 2185, 2193, 2244, 2151, 2194, 2195, 2150, 2173, 2166, 2167, 2217, 2219, 2220, 2221, 2176, 2222, 2201, 2207, 2215, 2216, 2211, 2223, 2224, 2225, 2212, 2227, 2228, 2218, 2213, 2226, 2208, 2214, 2199, 2229, 2230, 2177, 2234, 2190, 2192, 2233, 2239, 2238, 2240, 2237, 2170, 2241, 2236, 2235, 2232, 2186, 2231, 2191, 2196, 2197, 389: 2155, 1635, 1636, 1634, 448: 2171, 2243, 2162, 2157, 2149, 2160, 2158, 2159, 2198, 2210, 2209, 2202, 2200, 2154, 2165, 2242, 2164, 2161, 2115, 2114, 2113, 2932}, - {1449, 1449, 6: 1449, 245: 1449, 2253, 1449, 2251, 1449, 2252, 2250, 2248, 470: 2249, 2247}, + {525, 525, 6: 525, 21: 525, 56: 525, 233: 525, 243: 525, 525, 525, 525, 248: 525}, + {524, 524, 6: 524, 21: 524, 56: 524, 233: 524, 243: 524, 524, 524, 524, 248: 524}, + {1461, 1461, 6: 1461, 249: 1461, 251: 1461, 256: 1461}, + {2: 1736, 1653, 1687, 1654, 7: 2140, 1741, 1680, 1738, 2145, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 2149, 1665, 2142, 2144, 1859, 2158, 2159, 2157, 2153, 2160, 1837, 1839, 1838, 2150, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 2151, 1774, 1673, 2141, 1751, 1714, 2146, 2148, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 2156, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 2147, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 2152, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 2143, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 2138, 2139, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 2161, 1853, 2137, 1858, 1857, 1699, 1860, 1862, 1703, 2154, 2155, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 2162, 2163, 1876, 1870, 1871, 1872, 2193, 234: 2174, 2133, 2205, 2209, 239: 2190, 2189, 2226, 2200, 247: 2165, 270: 2169, 272: 2208, 294: 2177, 303: 2196, 315: 2210, 2131, 2203, 2225, 2227, 2168, 2167, 2184, 2224, 2204, 2201, 2195, 2199, 2164, 2166, 2202, 2173, 2206, 2214, 2265, 2172, 2215, 2216, 2171, 2194, 2187, 2188, 2238, 2240, 2241, 2242, 2197, 2243, 2222, 2228, 2236, 2237, 2232, 2244, 2245, 2246, 2233, 2248, 2249, 2239, 2234, 2247, 2229, 2235, 2220, 2250, 2251, 2198, 2255, 2211, 2213, 2254, 2260, 2259, 2261, 2258, 2191, 2262, 2257, 2256, 381: 2253, 2207, 2252, 2212, 2217, 2218, 393: 2176, 1649, 1650, 1648, 452: 2192, 2264, 2183, 2178, 2170, 2181, 2179, 2180, 2219, 2231, 2230, 2223, 2221, 2175, 2186, 2263, 2185, 2182, 2136, 2135, 2134, 2946}, + {1463, 1463, 6: 1463, 249: 1463, 2274, 1463, 2272, 2273, 2271, 2269, 1463, 474: 2270, 2268}, // 1415 - {2: 1722, 1639, 1673, 1640, 7: 1650, 1727, 1666, 1724, 1687, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 1714, 1651, 1660, 1681, 1774, 1775, 1771, 1733, 1780, 1716, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 1719, 1760, 1659, 1658, 1737, 1683, 1700, 1705, 1709, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 1770, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 1706, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 1721, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 1677, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 1638, 1642, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 1834, 1835, 1633, 1840, 1839, 1685, 1842, 1844, 1689, 1753, 1769, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 1855, 1856, 1858, 1852, 1853, 1854, 389: 1928, 1635, 1636, 1634, 479: 2916, 575: 2917, 593: 2934}, - {115, 115, 6: 2919, 249: 2921, 541: 2922, 2935}, - {118, 118}, - {42: 2942, 44: 2941, 2940, 2939, 527: 2959, 736: 2960}, - {527: 2958}, + {2: 1736, 1653, 1687, 1654, 7: 1664, 1741, 1680, 1738, 1701, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 1728, 1665, 1674, 1695, 1859, 1788, 1789, 1785, 1747, 1794, 1837, 1839, 1838, 1730, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 1733, 1774, 1673, 1672, 1751, 1714, 1719, 1723, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 1784, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 1720, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 1735, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 1691, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 1652, 1656, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 1852, 1853, 1647, 1858, 1857, 1699, 1860, 1862, 1703, 1767, 1783, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 1873, 1874, 1876, 1870, 1871, 1872, 393: 1947, 1649, 1650, 1648, 483: 2930, 579: 2931, 596: 2948}, + {116, 116, 6: 2933, 256: 2935, 545: 2936, 2949}, + {119, 119}, + {28: 2957, 34: 2956, 40: 2955, 2954, 2953, 524: 2974, 740: 2975}, + {524: 2973}, // 1420 - {42: 504, 44: 504, 504, 504, 527: 504}, - {228: 2955}, - {228: 2952}, - {228: 2946}, - {228: 2943}, + {28: 513, 34: 513, 40: 513, 513, 513, 524: 513}, + {232: 2970}, + {232: 2967}, + {232: 2961}, + {232: 2958}, // 1425 - {266: 1624, 474: 2944}, - {21: 2945}, - {42: 499, 44: 499, 499, 499, 527: 499}, - {2: 1722, 1639, 1673, 1640, 7: 1650, 1727, 1666, 1724, 1687, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 1714, 1651, 1660, 1681, 1774, 1775, 1771, 1733, 1780, 1716, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 1719, 1760, 1659, 1658, 1737, 1683, 1700, 1705, 1709, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 1770, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 1706, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 1721, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 1677, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 1638, 1642, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 1834, 1835, 1633, 1840, 1839, 1685, 1842, 1844, 1689, 1753, 1769, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 1855, 1856, 1858, 1852, 1853, 1854, 389: 2947, 1635, 1636, 1634, 602: 2948}, - {6: 506, 21: 506}, + {28: 507, 34: 507, 40: 507, 507, 507, 524: 507}, + {270: 1638, 478: 2959}, + {21: 2960}, + {28: 508, 34: 508, 40: 508, 508, 508, 524: 508}, + {2: 1736, 1653, 1687, 1654, 7: 1664, 1741, 1680, 1738, 1701, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 1728, 1665, 1674, 1695, 1859, 1788, 1789, 1785, 1747, 1794, 1837, 1839, 1838, 1730, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 1733, 1774, 1673, 1672, 1751, 1714, 1719, 1723, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 1784, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 1720, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 1735, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 1691, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 1652, 1656, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 1852, 1853, 1647, 1858, 1857, 1699, 1860, 1862, 1703, 1767, 1783, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 1873, 1874, 1876, 1870, 1871, 1872, 393: 2962, 1649, 1650, 1648, 605: 2963}, // 1430 - {6: 2949, 21: 2950}, - {2: 1722, 1639, 1673, 1640, 7: 1650, 1727, 1666, 1724, 1687, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 1714, 1651, 1660, 1681, 1774, 1775, 1771, 1733, 1780, 1716, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 1719, 1760, 1659, 1658, 1737, 1683, 1700, 1705, 1709, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 1770, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 1706, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 1721, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 1677, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 1638, 1642, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 1834, 1835, 1633, 1840, 1839, 1685, 1842, 1844, 1689, 1753, 1769, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 1855, 1856, 1858, 1852, 1853, 1854, 389: 2951, 1635, 1636, 1634}, - {42: 500, 44: 500, 500, 500, 527: 500}, - {6: 505, 21: 505}, - {2: 1722, 1639, 1673, 1640, 7: 1650, 1727, 1666, 1724, 1687, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 1714, 1651, 1660, 1681, 1774, 1775, 1771, 1733, 1780, 1716, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 1719, 1760, 1659, 1658, 1737, 1683, 1700, 1705, 1709, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 1770, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 1706, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 1721, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 1677, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 1638, 1642, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 1834, 1835, 1633, 1840, 1839, 1685, 1842, 1844, 1689, 1753, 1769, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 1855, 1856, 1858, 1852, 1853, 1854, 389: 2947, 1635, 1636, 1634, 602: 2953}, + {6: 515, 21: 515}, + {6: 2964, 21: 2965}, + {2: 1736, 1653, 1687, 1654, 7: 1664, 1741, 1680, 1738, 1701, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 1728, 1665, 1674, 1695, 1859, 1788, 1789, 1785, 1747, 1794, 1837, 1839, 1838, 1730, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 1733, 1774, 1673, 1672, 1751, 1714, 1719, 1723, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 1784, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 1720, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 1735, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 1691, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 1652, 1656, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 1852, 1853, 1647, 1858, 1857, 1699, 1860, 1862, 1703, 1767, 1783, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 1873, 1874, 1876, 1870, 1871, 1872, 393: 2966, 1649, 1650, 1648}, + {28: 509, 34: 509, 40: 509, 509, 509, 524: 509}, + {6: 514, 21: 514}, // 1435 - {6: 2949, 21: 2954}, - {42: 501, 44: 501, 501, 501, 527: 501}, - {2: 1722, 1639, 1673, 1640, 7: 1650, 1727, 1666, 1724, 1687, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 1714, 1651, 1660, 1681, 1774, 1775, 1771, 1733, 1780, 1716, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 1719, 1760, 1659, 1658, 1737, 1683, 1700, 1705, 1709, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 1770, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 1706, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 1721, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 1677, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 1638, 1642, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 1834, 1835, 1633, 1840, 1839, 1685, 1842, 1844, 1689, 1753, 1769, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 1855, 1856, 1858, 1852, 1853, 1854, 389: 2947, 1635, 1636, 1634, 602: 2956}, - {6: 2949, 21: 2957}, - {42: 502, 44: 502, 502, 502, 527: 502}, + {2: 1736, 1653, 1687, 1654, 7: 1664, 1741, 1680, 1738, 1701, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 1728, 1665, 1674, 1695, 1859, 1788, 1789, 1785, 1747, 1794, 1837, 1839, 1838, 1730, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 1733, 1774, 1673, 1672, 1751, 1714, 1719, 1723, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 1784, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 1720, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 1735, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 1691, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 1652, 1656, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 1852, 1853, 1647, 1858, 1857, 1699, 1860, 1862, 1703, 1767, 1783, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 1873, 1874, 1876, 1870, 1871, 1872, 393: 2962, 1649, 1650, 1648, 605: 2968}, + {6: 2964, 21: 2969}, + {28: 510, 34: 510, 40: 510, 510, 510, 524: 510}, + {2: 1736, 1653, 1687, 1654, 7: 1664, 1741, 1680, 1738, 1701, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 1728, 1665, 1674, 1695, 1859, 1788, 1789, 1785, 1747, 1794, 1837, 1839, 1838, 1730, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 1733, 1774, 1673, 1672, 1751, 1714, 1719, 1723, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 1784, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 1720, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 1735, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 1691, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 1652, 1656, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 1852, 1853, 1647, 1858, 1857, 1699, 1860, 1862, 1703, 1767, 1783, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 1873, 1874, 1876, 1870, 1871, 1872, 393: 2962, 1649, 1650, 1648, 605: 2971}, + {6: 2964, 21: 2972}, // 1440 - {2: 507, 507, 507, 507, 7: 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 22: 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 230: 507, 507, 507, 507, 235: 507, 507, 507, 507, 243: 507, 253: 507, 255: 507, 266: 507, 507, 269: 507, 290: 507, 299: 507, 311: 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 393: 507, 478: 507, 493: 507, 495: 507, 507, 507, 499: 507, 507}, - {2: 508, 508, 508, 508, 7: 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 22: 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 230: 508, 508, 508, 508, 235: 508, 508, 508, 508, 243: 508, 253: 508, 255: 508, 266: 508, 508, 269: 508, 290: 508, 299: 508, 311: 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 393: 508, 478: 508, 493: 508, 495: 508, 508, 508, 499: 508, 508}, - {42: 503, 44: 503, 503, 503, 527: 503}, - {2: 215, 215, 215, 215, 7: 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 22: 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215}, - {2: 1722, 1639, 1673, 1640, 7: 1650, 1727, 1666, 1724, 1687, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 1714, 1651, 1660, 1681, 1774, 1775, 1771, 1733, 1780, 1716, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 1719, 1760, 1659, 1658, 1737, 1683, 1700, 1705, 1709, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 1770, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 1706, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 1721, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 1677, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 1638, 1642, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 1834, 1835, 1633, 1840, 1839, 1685, 1842, 1844, 1689, 1753, 1769, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 1855, 1856, 1858, 1852, 1853, 1854, 389: 1860, 1635, 1636, 1634, 472: 2963}, + {28: 511, 34: 511, 40: 511, 511, 511, 524: 511}, + {2: 516, 516, 516, 516, 7: 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 22: 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 234: 516, 516, 516, 516, 239: 516, 516, 516, 516, 247: 516, 257: 516, 259: 516, 270: 516, 272: 516, 516, 294: 516, 303: 516, 315: 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 381: 516, 516, 516, 516, 516, 516, 397: 516, 482: 516, 497: 516, 499: 516, 516, 516, 503: 516, 516}, + {2: 517, 517, 517, 517, 7: 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 22: 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 234: 517, 517, 517, 517, 239: 517, 517, 517, 517, 247: 517, 257: 517, 259: 517, 270: 517, 272: 517, 517, 294: 517, 303: 517, 315: 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 381: 517, 517, 517, 517, 517, 517, 397: 517, 482: 517, 497: 517, 499: 517, 517, 517, 503: 517, 517}, + {28: 512, 34: 512, 40: 512, 512, 512, 524: 512}, + {2: 216, 216, 216, 216, 7: 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 22: 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216}, // 1445 - {214, 214}, - {23: 2971, 26: 2968, 51: 2970, 58: 2972, 486: 2967, 737: 2973, 796: 2969}, - {23: 327, 26: 327, 51: 327, 58: 327, 486: 327}, - {23: 326, 26: 326, 51: 326, 58: 326, 486: 326}, - {1265, 1265, 1265, 1265, 1265, 1265, 7: 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 22: 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 239: 1265, 313: 1265}, + {2: 1736, 1653, 1687, 1654, 7: 1664, 1741, 1680, 1738, 1701, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 1728, 1665, 1674, 1695, 1859, 1788, 1789, 1785, 1747, 1794, 1837, 1839, 1838, 1730, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 1733, 1774, 1673, 1672, 1751, 1714, 1719, 1723, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 1784, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 1720, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 1735, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 1691, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 1652, 1656, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 1852, 1853, 1647, 1858, 1857, 1699, 1860, 1862, 1703, 1767, 1783, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 1873, 1874, 1876, 1870, 1871, 1872, 393: 1878, 1649, 1650, 1648, 476: 2978}, + {215, 215}, + {23: 2986, 26: 2983, 52: 2985, 60: 2987, 490: 2982, 741: 2988, 800: 2984}, + {23: 328, 26: 328, 52: 328, 60: 328, 490: 328}, + {23: 327, 26: 327, 52: 327, 60: 327, 490: 327}, // 1450 - {1264, 1264, 1264, 1264, 1264, 1264, 7: 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 22: 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 239: 1264, 313: 1264}, - {335, 335}, + {1279, 1279, 1279, 1279, 1279, 1279, 7: 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 22: 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 243: 1279, 317: 1279}, + {1278, 1278, 1278, 1278, 1278, 1278, 7: 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 22: 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 243: 1278, 317: 1278}, + {336, 336}, + {333, 333}, {332, 332}, - {331, 331}, - {103: 2983}, // 1455 - {325, 325, 1722, 1639, 1673, 1640, 7: 1650, 1727, 1666, 1724, 1687, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 1714, 1651, 1660, 1681, 1774, 1775, 1771, 1733, 1780, 1716, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 1719, 1760, 1659, 1658, 1737, 1683, 1700, 1705, 1709, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 1770, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 1706, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 1721, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 1677, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 1638, 1642, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 1834, 1835, 1633, 1840, 1839, 1685, 1842, 1844, 1689, 1753, 1769, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 1855, 1856, 1858, 1852, 1853, 1854, 239: 325, 389: 1860, 1635, 1636, 1634, 472: 2974, 518: 2975, 868: 2976}, - {655, 655, 6: 655, 239: 655, 253: 655, 408: 655, 655}, - {324, 324, 6: 2981, 239: 324}, - {323, 323, 239: 2978, 899: 2977}, - {329, 329}, + {106: 2998}, + {326, 326, 1736, 1653, 1687, 1654, 7: 1664, 1741, 1680, 1738, 1701, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 1728, 1665, 1674, 1695, 1859, 1788, 1789, 1785, 1747, 1794, 1837, 1839, 1838, 1730, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 1733, 1774, 1673, 1672, 1751, 1714, 1719, 1723, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 1784, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 1720, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 1735, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 1691, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 1652, 1656, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 1852, 1853, 1647, 1858, 1857, 1699, 1860, 1862, 1703, 1767, 1783, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 1873, 1874, 1876, 1870, 1871, 1872, 243: 326, 393: 1878, 1649, 1650, 1648, 476: 2989, 522: 2990, 872: 2991}, + {663, 663, 6: 663, 243: 663, 257: 663, 412: 663, 663}, + {325, 325, 6: 2996, 243: 325}, + {324, 324, 243: 2993, 903: 2992}, // 1460 - {412: 2979}, - {242: 2980}, - {322, 322}, - {2: 1722, 1639, 1673, 1640, 7: 1650, 1727, 1666, 1724, 1687, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 1714, 1651, 1660, 1681, 1774, 1775, 1771, 1733, 1780, 1716, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 1719, 1760, 1659, 1658, 1737, 1683, 1700, 1705, 1709, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 1770, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 1706, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 1721, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 1677, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 1638, 1642, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 1834, 1835, 1633, 1840, 1839, 1685, 1842, 1844, 1689, 1753, 1769, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 1855, 1856, 1858, 1852, 1853, 1854, 389: 1860, 1635, 1636, 1634, 472: 2982}, - {654, 654, 6: 654, 239: 654, 654, 253: 654, 408: 654, 654}, + {330, 330}, + {416: 2994}, + {246: 2995}, + {323, 323}, + {2: 1736, 1653, 1687, 1654, 7: 1664, 1741, 1680, 1738, 1701, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 1728, 1665, 1674, 1695, 1859, 1788, 1789, 1785, 1747, 1794, 1837, 1839, 1838, 1730, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 1733, 1774, 1673, 1672, 1751, 1714, 1719, 1723, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 1784, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 1720, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 1735, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 1691, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 1652, 1656, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 1852, 1853, 1647, 1858, 1857, 1699, 1860, 1862, 1703, 1767, 1783, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 1873, 1874, 1876, 1870, 1871, 1872, 393: 1878, 1649, 1650, 1648, 476: 2997}, // 1465 - {2: 1722, 1639, 1673, 1640, 7: 1650, 1727, 1666, 1724, 1687, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 1714, 1651, 1660, 1681, 1774, 1775, 1771, 1733, 1780, 1716, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 1719, 1760, 1659, 1658, 1737, 1683, 1700, 1705, 1709, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 1770, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 1706, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 1721, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 1677, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 1638, 1642, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 1834, 1835, 1633, 1840, 1839, 1685, 1842, 1844, 1689, 1753, 1769, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 1855, 1856, 1858, 1852, 1853, 1854, 389: 2984, 1635, 1636, 1634, 841: 2985}, - {334, 334, 6: 334}, - {330, 330, 6: 2986}, - {2: 1722, 1639, 1673, 1640, 7: 1650, 1727, 1666, 1724, 1687, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 1714, 1651, 1660, 1681, 1774, 1775, 1771, 1733, 1780, 1716, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 1719, 1760, 1659, 1658, 1737, 1683, 1700, 1705, 1709, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 1770, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 1706, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 1721, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 1677, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 1638, 1642, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 1834, 1835, 1633, 1840, 1839, 1685, 1842, 1844, 1689, 1753, 1769, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 1855, 1856, 1858, 1852, 1853, 1854, 389: 2987, 1635, 1636, 1634}, - {333, 333, 6: 333}, + {662, 662, 6: 662, 243: 662, 662, 257: 662, 412: 662, 662}, + {2: 1736, 1653, 1687, 1654, 7: 1664, 1741, 1680, 1738, 1701, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 1728, 1665, 1674, 1695, 1859, 1788, 1789, 1785, 1747, 1794, 1837, 1839, 1838, 1730, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 1733, 1774, 1673, 1672, 1751, 1714, 1719, 1723, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 1784, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 1720, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 1735, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 1691, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 1652, 1656, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 1852, 1853, 1647, 1858, 1857, 1699, 1860, 1862, 1703, 1767, 1783, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 1873, 1874, 1876, 1870, 1871, 1872, 393: 2999, 1649, 1650, 1648, 845: 3000}, + {335, 335, 6: 335}, + {331, 331, 6: 3001}, + {2: 1736, 1653, 1687, 1654, 7: 1664, 1741, 1680, 1738, 1701, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 1728, 1665, 1674, 1695, 1859, 1788, 1789, 1785, 1747, 1794, 1837, 1839, 1838, 1730, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 1733, 1774, 1673, 1672, 1751, 1714, 1719, 1723, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 1784, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 1720, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 1735, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 1691, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 1652, 1656, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 1852, 1853, 1647, 1858, 1857, 1699, 1860, 1862, 1703, 1767, 1783, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 1873, 1874, 1876, 1870, 1871, 1872, 393: 3002, 1649, 1650, 1648}, // 1470 - {346, 346, 249: 3043, 268: 3042, 572: 3075}, - {22: 3064, 59: 3066, 326: 3065, 486: 3063}, - {383, 383, 244: 3061}, - {23: 3060}, - {26: 3050, 30: 3051, 40: 3052, 74: 3049}, + {334, 334, 6: 334}, + {347, 347, 256: 3058, 271: 3057, 576: 3090}, + {22: 3079, 61: 3081, 330: 3080, 490: 3078}, + {384, 384, 248: 3076}, + {23: 3075}, // 1475 - {346, 346, 249: 3043, 268: 3042, 572: 3048}, - {346, 346, 249: 3043, 268: 3042, 572: 3047}, - {346, 346, 249: 3043, 268: 3042, 572: 3046}, - {346, 346, 249: 3043, 268: 3042, 572: 3041}, - {375, 375}, + {26: 3065, 31: 3066, 45: 3067, 75: 3064}, + {347, 347, 256: 3058, 271: 3057, 576: 3063}, + {347, 347, 256: 3058, 271: 3057, 576: 3062}, + {347, 347, 256: 3058, 271: 3057, 576: 3061}, + {347, 347, 256: 3058, 271: 3057, 576: 3056}, // 1480 - {374, 374}, - {253: 373, 288: 373}, - {253: 372, 288: 372}, - {253: 371, 288: 371}, - {368, 368, 249: 368, 268: 368}, + {376, 376}, + {375, 375}, + {257: 374, 292: 374}, + {257: 373, 292: 373}, + {257: 372, 292: 372}, // 1485 - {367, 367, 249: 367, 268: 367}, - {366, 366, 249: 366, 268: 366}, - {23: 3039}, - {253: 3021, 288: 3022, 512: 3034}, - {359, 359, 249: 359, 268: 359}, + {369, 369, 256: 369, 271: 369}, + {368, 368, 256: 368, 271: 368}, + {367, 367, 256: 367, 271: 367}, + {23: 3054}, + {257: 3036, 292: 3037, 516: 3049}, // 1490 - {358, 358, 249: 358, 268: 358}, - {23: 3032, 60: 3033, 68: 3031}, - {354, 354, 249: 354, 268: 354}, - {338, 338, 249: 338, 253: 3021, 268: 338, 288: 3022, 512: 3024, 553: 3030}, - {23: 3029}, + {360, 360, 256: 360, 271: 360}, + {359, 359, 256: 359, 271: 359}, + {23: 3047, 62: 3048, 69: 3046}, + {355, 355, 256: 355, 271: 355}, + {339, 339, 256: 339, 3036, 271: 339, 292: 3037, 516: 3039, 557: 3045}, // 1495 - {23: 3028}, - {23: 3027}, - {23: 3026}, - {338, 338, 249: 338, 253: 3021, 268: 338, 288: 3022, 512: 3024, 553: 3023}, - {347, 347, 249: 347, 268: 347}, + {23: 3044}, + {23: 3043}, + {23: 3042}, + {23: 3041}, + {339, 339, 256: 339, 3036, 271: 339, 292: 3037, 516: 3039, 557: 3038}, // 1500 - {23: 342, 48: 342, 60: 342, 68: 342}, - {23: 341, 48: 341, 60: 341, 68: 341}, - {26: 339, 30: 339, 40: 339, 74: 339}, - {2: 370, 370, 370, 370, 7: 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 22: 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370}, - {2: 369, 369, 369, 369, 7: 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 22: 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369}, + {348, 348, 256: 348, 271: 348}, + {23: 343, 49: 343, 62: 343, 69: 343}, + {23: 342, 49: 342, 62: 342, 69: 342}, + {26: 340, 31: 340, 45: 340, 75: 340}, + {2: 371, 371, 371, 371, 7: 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 22: 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371}, // 1505 - {348, 348, 249: 348, 268: 348}, - {2: 1722, 1639, 1673, 1640, 7: 1650, 1727, 1666, 1724, 1687, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 1714, 1651, 1660, 1681, 1774, 1775, 1771, 1733, 1780, 1716, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 1719, 1760, 1659, 1658, 1737, 1683, 1700, 1705, 1709, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 1770, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 1706, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 1721, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 1677, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 1638, 1642, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 1834, 1835, 1633, 1840, 1839, 1685, 1842, 1844, 1689, 1753, 1769, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 1855, 1856, 1858, 1852, 1853, 1854, 389: 2065, 1635, 1636, 1634, 560: 3025}, - {337, 337, 249: 337, 268: 337}, - {349, 349, 249: 349, 268: 349}, - {350, 350, 249: 350, 268: 350}, + {2: 370, 370, 370, 370, 7: 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 22: 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370}, + {349, 349, 256: 349, 271: 349}, + {2: 1736, 1653, 1687, 1654, 7: 1664, 1741, 1680, 1738, 1701, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 1728, 1665, 1674, 1695, 1859, 1788, 1789, 1785, 1747, 1794, 1837, 1839, 1838, 1730, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 1733, 1774, 1673, 1672, 1751, 1714, 1719, 1723, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 1784, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 1720, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 1735, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 1691, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 1652, 1656, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 1852, 1853, 1647, 1858, 1857, 1699, 1860, 1862, 1703, 1767, 1783, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 1873, 1874, 1876, 1870, 1871, 1872, 393: 2084, 1649, 1650, 1648, 564: 3040}, + {338, 338, 256: 338, 271: 338}, + {350, 350, 256: 350, 271: 350}, // 1510 - {351, 351, 249: 351, 268: 351}, - {352, 352, 249: 352, 268: 352}, - {353, 353, 249: 353, 268: 353}, - {357, 357, 249: 357, 268: 357}, - {356, 356, 249: 356, 268: 356}, + {351, 351, 256: 351, 271: 351}, + {352, 352, 256: 352, 271: 352}, + {353, 353, 256: 353, 271: 353}, + {354, 354, 256: 354, 271: 354}, + {358, 358, 256: 358, 271: 358}, // 1515 - {355, 355, 249: 355, 268: 355}, - {2: 1722, 1639, 1673, 1640, 7: 1650, 1727, 1666, 1724, 1687, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 1714, 1651, 1660, 1681, 1774, 1775, 1771, 1733, 1780, 1716, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 1719, 1760, 1659, 1658, 1737, 1683, 1700, 1705, 1709, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 1770, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 1706, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 1721, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 1677, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 1638, 1642, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 1834, 1835, 1633, 1840, 1839, 1685, 1842, 1844, 1689, 1753, 1769, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 1855, 1856, 1858, 1852, 1853, 1854, 389: 3035, 1635, 1636, 1634, 472: 3036}, - {658, 658, 249: 658, 253: 3021, 268: 658, 288: 3022, 290: 1870, 512: 3037}, - {363, 363, 249: 363, 268: 363}, - {2: 1722, 1639, 1673, 1640, 7: 1650, 1727, 1666, 1724, 1687, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 1714, 1651, 1660, 1681, 1774, 1775, 1771, 1733, 1780, 1716, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 1719, 1760, 1659, 1658, 1737, 1683, 1700, 1705, 1709, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 1770, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 1706, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 1721, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 1677, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 1638, 1642, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 1834, 1835, 1633, 1840, 1839, 1685, 1842, 1844, 1689, 1753, 1769, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 1855, 1856, 1858, 1852, 1853, 1854, 389: 3038, 1635, 1636, 1634}, + {357, 357, 256: 357, 271: 357}, + {356, 356, 256: 356, 271: 356}, + {2: 1736, 1653, 1687, 1654, 7: 1664, 1741, 1680, 1738, 1701, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 1728, 1665, 1674, 1695, 1859, 1788, 1789, 1785, 1747, 1794, 1837, 1839, 1838, 1730, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 1733, 1774, 1673, 1672, 1751, 1714, 1719, 1723, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 1784, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 1720, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 1735, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 1691, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 1652, 1656, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 1852, 1853, 1647, 1858, 1857, 1699, 1860, 1862, 1703, 1767, 1783, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 1873, 1874, 1876, 1870, 1871, 1872, 393: 3050, 1649, 1650, 1648, 476: 3051}, + {666, 666, 256: 666, 3036, 271: 666, 292: 3037, 294: 1889, 516: 3052}, + {364, 364, 256: 364, 271: 364}, // 1520 - {362, 362, 249: 362, 268: 362}, - {338, 338, 249: 338, 253: 3021, 268: 338, 288: 3022, 512: 3024, 553: 3040}, - {364, 364, 249: 364, 268: 364}, - {376, 376}, - {2: 1722, 1639, 1673, 1640, 7: 2119, 1727, 1666, 1724, 2124, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 2128, 1651, 2121, 2123, 2137, 2138, 2136, 2132, 2139, 2129, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 2130, 1760, 1659, 2120, 1737, 1683, 1700, 2125, 2127, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 2135, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 2126, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 2131, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 2122, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 2117, 2118, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 2140, 1835, 2116, 1840, 1839, 1685, 1842, 1844, 1689, 2133, 2134, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 2141, 2142, 1858, 1852, 1853, 1854, 2172, 230: 2153, 232: 2184, 2188, 235: 2169, 2168, 2205, 2179, 243: 2144, 266: 2148, 2187, 290: 2156, 299: 2175, 311: 2189, 2256, 2182, 2204, 2206, 2147, 2146, 2163, 2203, 2183, 2180, 2174, 2178, 2143, 2145, 2181, 2152, 2185, 2193, 2244, 2151, 2194, 2195, 2150, 2173, 2166, 2167, 2217, 2219, 2220, 2221, 2176, 2222, 2201, 2207, 2215, 2216, 2211, 2223, 2224, 2225, 2212, 2227, 2228, 2218, 2213, 2226, 2208, 2214, 2199, 2229, 2230, 2177, 2234, 2190, 2192, 2233, 2239, 2238, 2240, 2237, 2170, 2241, 2236, 2235, 2232, 2186, 2231, 2191, 2196, 2197, 389: 2155, 1635, 1636, 1634, 448: 2171, 2243, 2162, 2157, 2149, 2160, 2158, 2159, 2198, 2210, 2209, 2202, 2200, 3045, 2165, 2242, 2164, 2161}, - // 1525 - {2: 1722, 1639, 1673, 1640, 7: 2119, 1727, 1666, 1724, 2124, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 2128, 1651, 2121, 2123, 2137, 2138, 2136, 2132, 2139, 2129, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 2130, 1760, 1659, 2120, 1737, 1683, 1700, 2125, 2127, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 2135, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 2126, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 2131, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 2122, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 2117, 2118, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 2140, 1835, 2116, 1840, 1839, 1685, 1842, 1844, 1689, 2133, 2134, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 2141, 2142, 1858, 1852, 1853, 1854, 2172, 230: 2153, 2112, 2184, 2188, 235: 2169, 2168, 2205, 2179, 243: 2144, 266: 2148, 2187, 290: 2156, 299: 2175, 311: 2189, 2110, 2182, 2204, 2206, 2147, 2146, 2163, 2203, 2183, 2180, 2174, 2178, 2143, 2145, 2181, 2152, 2185, 2193, 2244, 2151, 2194, 2195, 2150, 2173, 2166, 2167, 2217, 2219, 2220, 2221, 2176, 2222, 2201, 2207, 2215, 2216, 2211, 2223, 2224, 2225, 2212, 2227, 2228, 2218, 2213, 2226, 2208, 2214, 2199, 2229, 2230, 2177, 2234, 2190, 2192, 2233, 2239, 2238, 2240, 2237, 2170, 2241, 2236, 2235, 2232, 2186, 2231, 2191, 2196, 2197, 389: 2155, 1635, 1636, 1634, 448: 2171, 2243, 2162, 2157, 2149, 2160, 2158, 2159, 2198, 2210, 2209, 2202, 2200, 2154, 2165, 2242, 2164, 2161, 2115, 2114, 2113, 3044}, - {344, 344, 246: 2253, 248: 2251, 250: 2252, 2250, 2248, 470: 2249, 2247}, - {345, 345, 261: 2257, 382: 2258}, + {2: 1736, 1653, 1687, 1654, 7: 1664, 1741, 1680, 1738, 1701, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 1728, 1665, 1674, 1695, 1859, 1788, 1789, 1785, 1747, 1794, 1837, 1839, 1838, 1730, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 1733, 1774, 1673, 1672, 1751, 1714, 1719, 1723, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 1784, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 1720, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 1735, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 1691, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 1652, 1656, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 1852, 1853, 1647, 1858, 1857, 1699, 1860, 1862, 1703, 1767, 1783, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 1873, 1874, 1876, 1870, 1871, 1872, 393: 3053, 1649, 1650, 1648}, + {363, 363, 256: 363, 271: 363}, + {339, 339, 256: 339, 3036, 271: 339, 292: 3037, 516: 3039, 557: 3055}, + {365, 365, 256: 365, 271: 365}, {377, 377}, + // 1525 + {2: 1736, 1653, 1687, 1654, 7: 2140, 1741, 1680, 1738, 2145, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 2149, 1665, 2142, 2144, 1859, 2158, 2159, 2157, 2153, 2160, 1837, 1839, 1838, 2150, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 2151, 1774, 1673, 2141, 1751, 1714, 2146, 2148, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 2156, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 2147, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 2152, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 2143, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 2138, 2139, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 2161, 1853, 2137, 1858, 1857, 1699, 1860, 1862, 1703, 2154, 2155, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 2162, 2163, 1876, 1870, 1871, 1872, 2193, 234: 2174, 236: 2205, 2209, 239: 2190, 2189, 2226, 2200, 247: 2165, 270: 2169, 272: 2208, 294: 2177, 303: 2196, 315: 2210, 2277, 2203, 2225, 2227, 2168, 2167, 2184, 2224, 2204, 2201, 2195, 2199, 2164, 2166, 2202, 2173, 2206, 2214, 2265, 2172, 2215, 2216, 2171, 2194, 2187, 2188, 2238, 2240, 2241, 2242, 2197, 2243, 2222, 2228, 2236, 2237, 2232, 2244, 2245, 2246, 2233, 2248, 2249, 2239, 2234, 2247, 2229, 2235, 2220, 2250, 2251, 2198, 2255, 2211, 2213, 2254, 2260, 2259, 2261, 2258, 2191, 2262, 2257, 2256, 381: 2253, 2207, 2252, 2212, 2217, 2218, 393: 2176, 1649, 1650, 1648, 452: 2192, 2264, 2183, 2178, 2170, 2181, 2179, 2180, 2219, 2231, 2230, 2223, 2221, 3060, 2186, 2263, 2185, 2182}, + {2: 1736, 1653, 1687, 1654, 7: 2140, 1741, 1680, 1738, 2145, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 2149, 1665, 2142, 2144, 1859, 2158, 2159, 2157, 2153, 2160, 1837, 1839, 1838, 2150, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 2151, 1774, 1673, 2141, 1751, 1714, 2146, 2148, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 2156, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 2147, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 2152, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 2143, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 2138, 2139, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 2161, 1853, 2137, 1858, 1857, 1699, 1860, 1862, 1703, 2154, 2155, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 2162, 2163, 1876, 1870, 1871, 1872, 2193, 234: 2174, 2133, 2205, 2209, 239: 2190, 2189, 2226, 2200, 247: 2165, 270: 2169, 272: 2208, 294: 2177, 303: 2196, 315: 2210, 2131, 2203, 2225, 2227, 2168, 2167, 2184, 2224, 2204, 2201, 2195, 2199, 2164, 2166, 2202, 2173, 2206, 2214, 2265, 2172, 2215, 2216, 2171, 2194, 2187, 2188, 2238, 2240, 2241, 2242, 2197, 2243, 2222, 2228, 2236, 2237, 2232, 2244, 2245, 2246, 2233, 2248, 2249, 2239, 2234, 2247, 2229, 2235, 2220, 2250, 2251, 2198, 2255, 2211, 2213, 2254, 2260, 2259, 2261, 2258, 2191, 2262, 2257, 2256, 381: 2253, 2207, 2252, 2212, 2217, 2218, 393: 2176, 1649, 1650, 1648, 452: 2192, 2264, 2183, 2178, 2170, 2181, 2179, 2180, 2219, 2231, 2230, 2223, 2221, 2175, 2186, 2263, 2185, 2182, 2136, 2135, 2134, 3059}, + {345, 345, 250: 2274, 252: 2272, 2273, 2271, 2269, 474: 2270, 2268}, + {346, 346, 264: 2278, 380: 2279}, {378, 378}, // 1530 {379, 379}, {380, 380}, - {338, 338, 249: 338, 253: 3021, 268: 338, 288: 3022, 512: 3024, 553: 3059}, - {253: 3021, 288: 3022, 512: 3054, 727: 3057}, - {253: 3021, 288: 3022, 512: 3054, 727: 3053}, + {381, 381}, + {339, 339, 256: 339, 3036, 271: 339, 292: 3037, 516: 3039, 557: 3074}, + {257: 3036, 292: 3037, 516: 3069, 731: 3072}, // 1535 - {338, 338, 249: 338, 253: 3021, 268: 338, 288: 3022, 512: 3024, 553: 3056}, - {2: 1722, 1639, 1673, 1640, 7: 1650, 1727, 1666, 1724, 1687, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 1714, 1651, 1660, 1681, 1774, 1775, 1771, 1733, 1780, 1716, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 1719, 1760, 1659, 1658, 1737, 1683, 1700, 1705, 1709, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 1770, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 1706, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 1721, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 1677, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 1638, 1642, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 1834, 1835, 1633, 1840, 1839, 1685, 1842, 1844, 1689, 1753, 1769, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 1855, 1856, 1858, 1852, 1853, 1854, 389: 1860, 1635, 1636, 1634, 472: 3055}, - {336, 336, 249: 336, 253: 336, 268: 336, 288: 336}, - {360, 360, 249: 360, 268: 360}, - {338, 338, 249: 338, 253: 3021, 268: 338, 288: 3022, 512: 3024, 553: 3058}, + {257: 3036, 292: 3037, 516: 3069, 731: 3068}, + {339, 339, 256: 339, 3036, 271: 339, 292: 3037, 516: 3039, 557: 3071}, + {2: 1736, 1653, 1687, 1654, 7: 1664, 1741, 1680, 1738, 1701, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 1728, 1665, 1674, 1695, 1859, 1788, 1789, 1785, 1747, 1794, 1837, 1839, 1838, 1730, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 1733, 1774, 1673, 1672, 1751, 1714, 1719, 1723, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 1784, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 1720, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 1735, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 1691, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 1652, 1656, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 1852, 1853, 1647, 1858, 1857, 1699, 1860, 1862, 1703, 1767, 1783, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 1873, 1874, 1876, 1870, 1871, 1872, 393: 1878, 1649, 1650, 1648, 476: 3070}, + {337, 337, 256: 337, 337, 271: 337, 292: 337}, + {361, 361, 256: 361, 271: 361}, // 1540 - {361, 361, 249: 361, 268: 361}, - {365, 365, 249: 365, 268: 365}, - {381, 381}, - {2: 1722, 1639, 1673, 1640, 7: 1650, 1727, 1666, 1724, 1687, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 1714, 1651, 1660, 1681, 1774, 1775, 1771, 1733, 1780, 1716, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 1719, 1760, 1659, 1658, 1737, 1683, 1700, 1705, 1709, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 1770, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 1706, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 1721, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 1677, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 1638, 1642, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 1834, 1835, 1633, 1840, 1839, 1685, 1842, 1844, 1689, 1753, 1769, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 1855, 1856, 1858, 1852, 1853, 1854, 230: 1889, 311: 1991, 389: 1890, 1635, 1636, 1634, 473: 1990, 501: 3062}, + {339, 339, 256: 339, 3036, 271: 339, 292: 3037, 516: 3039, 557: 3073}, + {362, 362, 256: 362, 271: 362}, + {366, 366, 256: 366, 271: 366}, {382, 382}, + {2: 1736, 1653, 1687, 1654, 7: 1664, 1741, 1680, 1738, 1701, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 1728, 1665, 1674, 1695, 1859, 1788, 1789, 1785, 1747, 1794, 1837, 1839, 1838, 1730, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 1733, 1774, 1673, 1672, 1751, 1714, 1719, 1723, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 1784, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 1720, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 1735, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 1691, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 1652, 1656, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 1852, 1853, 1647, 1858, 1857, 1699, 1860, 1862, 1703, 1767, 1783, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 1873, 1874, 1876, 1870, 1871, 1872, 234: 1908, 315: 2010, 393: 1909, 1649, 1650, 1648, 477: 2009, 505: 3077}, // 1545 - {2: 1722, 1639, 1673, 1640, 7: 1650, 1727, 1666, 1724, 1687, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 1714, 1651, 1660, 1681, 1774, 1775, 1771, 1733, 1780, 1716, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 1719, 1760, 1659, 1658, 1737, 1683, 1700, 1705, 1709, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 1770, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 1706, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 1721, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 1677, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 1638, 1642, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 1834, 1835, 1633, 1840, 1839, 1685, 1842, 1844, 1689, 1753, 1769, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 1855, 1856, 1858, 1852, 1853, 1854, 389: 1860, 1635, 1636, 1634, 472: 3074}, - {2: 1722, 1639, 1673, 1640, 7: 1650, 1727, 1666, 1724, 1687, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 1714, 1651, 1660, 1681, 1774, 1775, 1771, 1733, 1780, 1716, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 1719, 1760, 1659, 1658, 1737, 1683, 1700, 1705, 1709, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 1770, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 1706, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 1721, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 1677, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 1638, 1642, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 1834, 1835, 1633, 1840, 1839, 1685, 1842, 1844, 1689, 1753, 1769, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 1855, 1856, 1858, 1852, 1853, 1854, 389: 1860, 1635, 1636, 1634, 472: 3073}, - {2: 1170, 1170, 1170, 1170, 7: 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 22: 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 313: 3068, 564: 3069}, - {2: 1722, 1639, 1673, 1640, 7: 1650, 1727, 1666, 1724, 1687, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 1714, 1651, 1660, 1681, 1774, 1775, 1771, 1733, 1780, 1716, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 1719, 1760, 1659, 1658, 1737, 1683, 1700, 1705, 1709, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 1770, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 1706, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 1721, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 1677, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 1638, 1642, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 1834, 1835, 1633, 1840, 1839, 1685, 1842, 1844, 1689, 1753, 1769, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 1855, 1856, 1858, 1852, 1853, 1854, 230: 1889, 311: 1991, 389: 1890, 1635, 1636, 1634, 473: 1990, 501: 3067}, - {384, 384}, + {383, 383}, + {2: 1736, 1653, 1687, 1654, 7: 1664, 1741, 1680, 1738, 1701, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 1728, 1665, 1674, 1695, 1859, 1788, 1789, 1785, 1747, 1794, 1837, 1839, 1838, 1730, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 1733, 1774, 1673, 1672, 1751, 1714, 1719, 1723, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 1784, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 1720, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 1735, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 1691, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 1652, 1656, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 1852, 1853, 1647, 1858, 1857, 1699, 1860, 1862, 1703, 1767, 1783, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 1873, 1874, 1876, 1870, 1871, 1872, 393: 1878, 1649, 1650, 1648, 476: 3089}, + {2: 1736, 1653, 1687, 1654, 7: 1664, 1741, 1680, 1738, 1701, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 1728, 1665, 1674, 1695, 1859, 1788, 1789, 1785, 1747, 1794, 1837, 1839, 1838, 1730, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 1733, 1774, 1673, 1672, 1751, 1714, 1719, 1723, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 1784, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 1720, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 1735, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 1691, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 1652, 1656, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 1852, 1853, 1647, 1858, 1857, 1699, 1860, 1862, 1703, 1767, 1783, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 1873, 1874, 1876, 1870, 1871, 1872, 393: 1878, 1649, 1650, 1648, 476: 3088}, + {2: 1182, 1182, 1182, 1182, 7: 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 22: 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 317: 3083, 568: 3084}, + {2: 1736, 1653, 1687, 1654, 7: 1664, 1741, 1680, 1738, 1701, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 1728, 1665, 1674, 1695, 1859, 1788, 1789, 1785, 1747, 1794, 1837, 1839, 1838, 1730, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 1733, 1774, 1673, 1672, 1751, 1714, 1719, 1723, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 1784, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 1720, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 1735, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 1691, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 1652, 1656, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 1852, 1853, 1647, 1858, 1857, 1699, 1860, 1862, 1703, 1767, 1783, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 1873, 1874, 1876, 1870, 1871, 1872, 234: 1908, 315: 2010, 393: 1909, 1649, 1650, 1648, 477: 2009, 505: 3082}, // 1550 - {231: 3071}, - {2: 1722, 1639, 1673, 1640, 7: 1650, 1727, 1666, 1724, 1687, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 1714, 1651, 1660, 1681, 1774, 1775, 1771, 1733, 1780, 1716, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 1719, 1760, 1659, 1658, 1737, 1683, 1700, 1705, 1709, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 1770, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 1706, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 1721, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 1677, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 1638, 1642, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 1834, 1835, 1633, 1840, 1839, 1685, 1842, 1844, 1689, 1753, 1769, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 1855, 1856, 1858, 1852, 1853, 1854, 389: 2065, 1635, 1636, 1634, 560: 3070}, {385, 385}, - {322: 3072}, - {2: 1169, 1169, 1169, 1169, 7: 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 22: 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 230: 1169, 311: 1169}, - // 1555 + {235: 3086}, + {2: 1736, 1653, 1687, 1654, 7: 1664, 1741, 1680, 1738, 1701, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 1728, 1665, 1674, 1695, 1859, 1788, 1789, 1785, 1747, 1794, 1837, 1839, 1838, 1730, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 1733, 1774, 1673, 1672, 1751, 1714, 1719, 1723, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 1784, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 1720, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 1735, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 1691, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 1652, 1656, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 1852, 1853, 1647, 1858, 1857, 1699, 1860, 1862, 1703, 1767, 1783, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 1873, 1874, 1876, 1870, 1871, 1872, 393: 2084, 1649, 1650, 1648, 564: 3085}, {386, 386}, + {326: 3087}, + // 1555 + {2: 1181, 1181, 1181, 1181, 7: 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 22: 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 234: 1181, 315: 1181}, {387, 387}, {388, 388}, - {2: 1722, 1639, 1673, 1640, 7: 1650, 1727, 1666, 1724, 1687, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 1714, 1651, 1660, 1681, 1774, 1775, 1771, 1733, 1780, 1716, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 1719, 1760, 1659, 1658, 1737, 1683, 1700, 1705, 1709, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 1770, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 1706, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 1721, 1741, 1655, 1657, 3118, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 1677, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 1638, 1642, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 1834, 1835, 1633, 1840, 1839, 1685, 1842, 1844, 1689, 1753, 1769, 3117, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 1855, 1856, 1858, 1852, 1853, 1854, 389: 1860, 1635, 1636, 1634, 472: 3119}, - {401: 3104, 486: 3103}, + {389, 389}, + {2: 1736, 1653, 1687, 1654, 7: 1664, 1741, 1680, 1738, 1701, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 1728, 1665, 1674, 1695, 1859, 1788, 1789, 1785, 1747, 1794, 1837, 1839, 1838, 1730, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 1733, 1774, 1673, 1672, 1751, 1714, 1719, 1723, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 1784, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 1720, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 1735, 1755, 1669, 1671, 3133, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 1691, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 1652, 1656, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 1852, 1853, 1647, 1858, 1857, 1699, 1860, 1862, 1703, 1767, 1783, 3132, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 1873, 1874, 1876, 1870, 1871, 1872, 393: 1878, 1649, 1650, 1648, 476: 3134}, // 1560 - {401: 3100}, - {486: 3094}, - {401: 3091}, - {486: 3089}, - {126: 3083}, + {405: 3119, 490: 3118}, + {405: 3115}, + {490: 3109}, + {405: 3106}, + {490: 3104}, // 1565 - {100: 3084}, - {266: 1624, 474: 3086, 694: 3085}, - {400, 400, 6: 3087}, - {390, 390, 6: 390}, - {266: 1624, 474: 3088}, + {131: 3098}, + {101: 3099}, + {270: 1638, 478: 3101, 698: 3100}, + {401, 401, 6: 3102}, + {391, 391, 6: 391}, // 1570 - {389, 389, 6: 389}, - {2: 1722, 1639, 1673, 1640, 7: 1650, 1727, 1666, 1724, 1687, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 1714, 1651, 1660, 1681, 1774, 1775, 1771, 1733, 1780, 1716, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 1719, 1760, 1659, 1658, 1737, 1683, 1700, 1705, 1709, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 1770, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 1706, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 1721, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 1677, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 1638, 1642, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 1834, 1835, 1633, 1840, 1839, 1685, 1842, 1844, 1689, 1753, 1769, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 1855, 1856, 1858, 1852, 1853, 1854, 389: 1860, 1635, 1636, 1634, 472: 2974, 518: 3090}, - {401, 401, 6: 2981}, - {2: 1722, 1639, 1673, 1640, 7: 1650, 1727, 1666, 1724, 1687, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 1714, 1651, 1660, 1681, 1774, 1775, 1771, 1733, 1780, 1716, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 1719, 1760, 1659, 1658, 1737, 1683, 1700, 1705, 1709, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 1770, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 1706, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 1721, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 1677, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 1638, 1642, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 1834, 1835, 1633, 1840, 1839, 1685, 1842, 1844, 1689, 1753, 1769, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 1855, 1856, 1858, 1852, 1853, 1854, 389: 1860, 1635, 1636, 1634, 472: 3092}, - {2: 1722, 1639, 1673, 1640, 7: 1650, 1727, 1666, 1724, 1687, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 1714, 1651, 1660, 1681, 1774, 1775, 1771, 1733, 1780, 1716, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 1719, 1760, 1659, 1658, 1737, 1683, 1700, 1705, 1709, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 1770, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 1706, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 1721, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 1677, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 1638, 1642, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 1834, 1835, 1633, 1840, 1839, 1685, 1842, 1844, 1689, 1753, 1769, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 1855, 1856, 1858, 1852, 1853, 1854, 389: 3093, 1635, 1636, 1634}, + {270: 1638, 478: 3103}, + {390, 390, 6: 390}, + {2: 1736, 1653, 1687, 1654, 7: 1664, 1741, 1680, 1738, 1701, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 1728, 1665, 1674, 1695, 1859, 1788, 1789, 1785, 1747, 1794, 1837, 1839, 1838, 1730, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 1733, 1774, 1673, 1672, 1751, 1714, 1719, 1723, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 1784, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 1720, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 1735, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 1691, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 1652, 1656, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 1852, 1853, 1647, 1858, 1857, 1699, 1860, 1862, 1703, 1767, 1783, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 1873, 1874, 1876, 1870, 1871, 1872, 393: 1878, 1649, 1650, 1648, 476: 2989, 522: 3105}, + {402, 402, 6: 2996}, + {2: 1736, 1653, 1687, 1654, 7: 1664, 1741, 1680, 1738, 1701, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 1728, 1665, 1674, 1695, 1859, 1788, 1789, 1785, 1747, 1794, 1837, 1839, 1838, 1730, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 1733, 1774, 1673, 1672, 1751, 1714, 1719, 1723, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 1784, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 1720, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 1735, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 1691, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 1652, 1656, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 1852, 1853, 1647, 1858, 1857, 1699, 1860, 1862, 1703, 1767, 1783, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 1873, 1874, 1876, 1870, 1871, 1872, 393: 1878, 1649, 1650, 1648, 476: 3107}, // 1575 - {403, 403}, - {2: 1722, 1639, 1673, 1640, 7: 1650, 1727, 1666, 1724, 1687, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 1714, 1651, 1660, 1681, 1774, 1775, 1771, 1733, 1780, 1716, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 1719, 1760, 1659, 1658, 1737, 1683, 1700, 1705, 1709, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 1770, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 1706, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 1721, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 1677, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 1638, 1642, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 1834, 1835, 1633, 1840, 1839, 1685, 1842, 1844, 1689, 1753, 1769, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 1855, 1856, 1858, 1852, 1853, 1854, 389: 1860, 1635, 1636, 1634, 404: 3095, 472: 3096}, - {99: 3098}, - {405, 405, 266: 1624, 474: 3097}, + {2: 1736, 1653, 1687, 1654, 7: 1664, 1741, 1680, 1738, 1701, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 1728, 1665, 1674, 1695, 1859, 1788, 1789, 1785, 1747, 1794, 1837, 1839, 1838, 1730, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 1733, 1774, 1673, 1672, 1751, 1714, 1719, 1723, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 1784, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 1720, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 1735, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 1691, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 1652, 1656, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 1852, 1853, 1647, 1858, 1857, 1699, 1860, 1862, 1703, 1767, 1783, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 1873, 1874, 1876, 1870, 1871, 1872, 393: 3108, 1649, 1650, 1648}, {404, 404}, + {2: 1736, 1653, 1687, 1654, 7: 1664, 1741, 1680, 1738, 1701, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 1728, 1665, 1674, 1695, 1859, 1788, 1789, 1785, 1747, 1794, 1837, 1839, 1838, 1730, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 1733, 1774, 1673, 1672, 1751, 1714, 1719, 1723, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 1784, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 1720, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 1735, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 1691, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 1652, 1656, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 1852, 1853, 1647, 1858, 1857, 1699, 1860, 1862, 1703, 1767, 1783, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 1873, 1874, 1876, 1870, 1871, 1872, 393: 1878, 1649, 1650, 1648, 408: 3110, 476: 3111}, + {100: 3113}, + {406, 406, 270: 1638, 478: 3112}, // 1580 - {266: 1624, 474: 3099}, - {406, 406}, - {2: 1722, 1639, 1673, 1640, 7: 1650, 1727, 1666, 1724, 1687, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 1714, 1651, 1660, 1681, 1774, 1775, 1771, 1733, 1780, 1716, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 1719, 1760, 1659, 1658, 1737, 1683, 1700, 1705, 1709, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 1770, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 1706, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 1721, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 1677, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 1638, 1642, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 1834, 1835, 1633, 1840, 1839, 1685, 1842, 1844, 1689, 1753, 1769, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 1855, 1856, 1858, 1852, 1853, 1854, 389: 1860, 1635, 1636, 1634, 472: 3101}, - {2: 1722, 1639, 1673, 1640, 7: 1650, 1727, 1666, 1724, 1687, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 1714, 1651, 1660, 1681, 1774, 1775, 1771, 1733, 1780, 1716, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 1719, 1760, 1659, 1658, 1737, 1683, 1700, 1705, 1709, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 1770, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 1706, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 1721, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 1677, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 1638, 1642, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 1834, 1835, 1633, 1840, 1839, 1685, 1842, 1844, 1689, 1753, 1769, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 1855, 1856, 1858, 1852, 1853, 1854, 389: 3102, 1635, 1636, 1634}, + {405, 405}, + {270: 1638, 478: 3114}, {407, 407}, + {2: 1736, 1653, 1687, 1654, 7: 1664, 1741, 1680, 1738, 1701, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 1728, 1665, 1674, 1695, 1859, 1788, 1789, 1785, 1747, 1794, 1837, 1839, 1838, 1730, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 1733, 1774, 1673, 1672, 1751, 1714, 1719, 1723, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 1784, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 1720, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 1735, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 1691, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 1652, 1656, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 1852, 1853, 1647, 1858, 1857, 1699, 1860, 1862, 1703, 1767, 1783, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 1873, 1874, 1876, 1870, 1871, 1872, 393: 1878, 1649, 1650, 1648, 476: 3116}, + {2: 1736, 1653, 1687, 1654, 7: 1664, 1741, 1680, 1738, 1701, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 1728, 1665, 1674, 1695, 1859, 1788, 1789, 1785, 1747, 1794, 1837, 1839, 1838, 1730, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 1733, 1774, 1673, 1672, 1751, 1714, 1719, 1723, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 1784, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 1720, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 1735, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 1691, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 1652, 1656, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 1852, 1853, 1647, 1858, 1857, 1699, 1860, 1862, 1703, 1767, 1783, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 1873, 1874, 1876, 1870, 1871, 1872, 393: 3117, 1649, 1650, 1648}, // 1585 - {2: 1722, 1639, 1673, 1640, 7: 1650, 1727, 1666, 1724, 1687, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 1714, 1651, 1660, 1681, 1774, 1775, 1771, 1733, 1780, 1716, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 1719, 1760, 1659, 1658, 1737, 1683, 1700, 1705, 1709, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 1770, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 1706, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 1721, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 1677, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 1638, 1642, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 1834, 1835, 1633, 1840, 1839, 1685, 1842, 1844, 1689, 1753, 1769, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 1855, 1856, 1858, 1852, 1853, 1854, 389: 1860, 1635, 1636, 1634, 472: 2974, 518: 3116}, - {2: 1722, 1639, 1673, 1640, 7: 1650, 1727, 1666, 1724, 1687, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 1714, 1651, 1660, 1681, 1774, 1775, 1771, 1733, 1780, 1716, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 1719, 1760, 1659, 1658, 1737, 1683, 1700, 1705, 1709, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 1770, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 1706, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 1721, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 1677, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 1638, 1642, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 1834, 1835, 1633, 1840, 1839, 1685, 1842, 1844, 1689, 1753, 1769, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 1855, 1856, 1858, 1852, 1853, 1854, 389: 1860, 1635, 1636, 1634, 472: 3105}, - {2: 1722, 1639, 1673, 1640, 7: 1650, 1727, 1666, 1724, 1687, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 1714, 1651, 1660, 1681, 1774, 1775, 1771, 1733, 1780, 1716, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 1719, 1760, 1659, 1658, 1737, 1683, 1700, 1705, 1709, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 1770, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 1706, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 1721, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 1677, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 1638, 1642, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 1834, 1835, 1633, 1840, 1839, 1685, 1842, 1844, 1689, 1753, 1769, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 1855, 1856, 1858, 1852, 1853, 1854, 389: 3106, 1635, 1636, 1634}, - {408, 408, 228: 3109, 675: 3108, 800: 3107}, - {402, 402, 6: 3114}, + {408, 408}, + {2: 1736, 1653, 1687, 1654, 7: 1664, 1741, 1680, 1738, 1701, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 1728, 1665, 1674, 1695, 1859, 1788, 1789, 1785, 1747, 1794, 1837, 1839, 1838, 1730, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 1733, 1774, 1673, 1672, 1751, 1714, 1719, 1723, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 1784, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 1720, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 1735, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 1691, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 1652, 1656, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 1852, 1853, 1647, 1858, 1857, 1699, 1860, 1862, 1703, 1767, 1783, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 1873, 1874, 1876, 1870, 1871, 1872, 393: 1878, 1649, 1650, 1648, 476: 2989, 522: 3131}, + {2: 1736, 1653, 1687, 1654, 7: 1664, 1741, 1680, 1738, 1701, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 1728, 1665, 1674, 1695, 1859, 1788, 1789, 1785, 1747, 1794, 1837, 1839, 1838, 1730, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 1733, 1774, 1673, 1672, 1751, 1714, 1719, 1723, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 1784, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 1720, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 1735, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 1691, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 1652, 1656, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 1852, 1853, 1647, 1858, 1857, 1699, 1860, 1862, 1703, 1767, 1783, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 1873, 1874, 1876, 1870, 1871, 1872, 393: 1878, 1649, 1650, 1648, 476: 3120}, + {2: 1736, 1653, 1687, 1654, 7: 1664, 1741, 1680, 1738, 1701, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 1728, 1665, 1674, 1695, 1859, 1788, 1789, 1785, 1747, 1794, 1837, 1839, 1838, 1730, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 1733, 1774, 1673, 1672, 1751, 1714, 1719, 1723, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 1784, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 1720, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 1735, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 1691, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 1652, 1656, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 1852, 1853, 1647, 1858, 1857, 1699, 1860, 1862, 1703, 1767, 1783, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 1873, 1874, 1876, 1870, 1871, 1872, 393: 3121, 1649, 1650, 1648}, + {409, 409, 232: 3124, 679: 3123, 804: 3122}, // 1590 - {393, 393, 6: 393}, - {266: 1624, 474: 3110}, - {6: 3111}, - {266: 1624, 474: 3112}, - {21: 3113}, + {403, 403, 6: 3129}, + {394, 394, 6: 394}, + {270: 1638, 478: 3125}, + {6: 3126}, + {270: 1638, 478: 3127}, // 1595 - {391, 391, 6: 391}, - {228: 3109, 675: 3115}, + {21: 3128}, {392, 392, 6: 392}, - {409, 409, 6: 2981}, - {73: 1004, 159: 3127, 179: 3128, 290: 1004, 754: 3126}, + {232: 3124, 679: 3130}, + {393, 393, 6: 393}, + {410, 410, 6: 2996}, // 1600 - {413, 413, 73: 980, 99: 3122, 3121, 290: 980}, - {73: 3120}, - {410, 410}, - {412, 412, 266: 1624, 474: 3125}, - {158: 3123}, - // 1605 - {266: 1624, 474: 3086, 694: 3124}, - {399, 399, 6: 3087}, + {74: 1016, 163: 3142, 183: 3143, 294: 1016, 758: 3141}, + {414, 414, 74: 988, 100: 3137, 3136, 294: 988}, + {74: 3135}, {411, 411}, - {398, 398}, - {266: 1624, 474: 3134}, + {413, 413, 270: 1638, 478: 3140}, + // 1605 + {162: 3138}, + {270: 1638, 478: 3101, 698: 3139}, + {400, 400, 6: 3102}, + {412, 412}, + {399, 399}, // 1610 - {140: 3130, 266: 1624, 474: 3129, 478: 3131}, - {396, 396}, - {266: 1624, 474: 3133}, - {266: 1624, 474: 3132}, - {394, 394}, + {270: 1638, 478: 3149}, + {145: 3145, 270: 1638, 478: 3144, 482: 3146}, + {397, 397}, + {270: 1638, 478: 3148}, + {270: 1638, 478: 3147}, // 1615 {395, 395}, - {397, 397}, - {2: 126, 126, 126, 126, 7: 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 22: 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 230: 126, 254: 1138, 299: 126}, - {2: 1722, 1639, 1673, 1640, 7: 1650, 1727, 1666, 1724, 1687, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 1714, 1651, 1660, 1681, 1774, 1775, 1771, 1733, 1780, 1716, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 1719, 1760, 1659, 1658, 1737, 1683, 1700, 1705, 1709, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 1770, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 1706, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 1721, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 1677, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 3222, 1735, 1742, 1801, 1713, 1823, 1717, 1638, 1642, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 1834, 1835, 1633, 1840, 1839, 1685, 1842, 1844, 1689, 1753, 1769, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 1855, 1856, 1858, 1852, 1853, 1854, 254: 1109, 389: 3177, 1635, 1636, 1634}, - {2: 1722, 1639, 1673, 1640, 7: 1650, 1727, 1666, 1724, 1687, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 1714, 1651, 1660, 1681, 1774, 1775, 1771, 1733, 1780, 1716, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 1719, 1760, 1659, 1658, 1737, 1683, 1700, 1705, 1709, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 1770, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 1706, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 1721, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 1677, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 1638, 1642, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 1834, 1835, 1633, 1840, 1839, 1685, 1842, 1844, 1689, 1753, 1769, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 1855, 1856, 1858, 1852, 1853, 1854, 254: 1105, 389: 3219, 1635, 1636, 1634}, + {396, 396}, + {398, 398}, + {2: 127, 127, 127, 127, 7: 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 22: 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 234: 127, 258: 1150, 303: 127}, + {2: 1736, 1653, 1687, 1654, 7: 1664, 1741, 1680, 1738, 1701, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 1728, 1665, 1674, 1695, 1859, 1788, 1789, 1785, 1747, 1794, 1837, 1839, 1838, 1730, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 1733, 1774, 1673, 1672, 1751, 1714, 1719, 1723, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 1784, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 1720, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 1735, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 1691, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 3238, 1749, 1756, 1815, 1727, 1841, 1731, 1652, 1656, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 1852, 1853, 1647, 1858, 1857, 1699, 1860, 1862, 1703, 1767, 1783, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 1873, 1874, 1876, 1870, 1871, 1872, 258: 1121, 393: 3193, 1649, 1650, 1648}, // 1620 - {2: 1722, 1639, 1673, 1640, 7: 1650, 1727, 1666, 1724, 1687, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 1714, 1651, 1660, 1681, 1774, 1775, 1771, 1733, 1780, 1716, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 1719, 1760, 1659, 1658, 1737, 1683, 1700, 1705, 1709, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 1770, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 1706, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 1721, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 1677, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 1638, 1642, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 1834, 1835, 1633, 1840, 1839, 1685, 1842, 1844, 1689, 1753, 1769, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 1855, 1856, 1858, 1852, 1853, 1854, 230: 1889, 254: 1103, 299: 1888, 389: 1890, 1635, 1636, 1634, 473: 1887, 522: 3215}, - {244: 3205, 254: 3204}, - {2: 1722, 1639, 1673, 1640, 7: 1650, 1727, 1666, 1724, 1687, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 1714, 1651, 1660, 1681, 1774, 1775, 1771, 1733, 1780, 1716, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 1719, 1760, 1659, 1658, 1737, 1683, 1700, 1705, 1709, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 1770, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 1706, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 1721, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 1677, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 3164, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 1638, 1642, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 1834, 1835, 1939, 1840, 1839, 1685, 1842, 1844, 1689, 1753, 1769, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 1855, 1856, 1858, 1852, 1853, 1854, 230: 1946, 238: 3201, 254: 1097, 389: 1890, 1635, 1636, 1634, 473: 1948, 478: 3199, 516: 1949, 1947, 537: 3167, 722: 3200, 854: 3198}, - {2: 1722, 1639, 1673, 1640, 7: 1650, 1727, 1666, 1724, 1687, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 1714, 1651, 1660, 1681, 1774, 1775, 1771, 1733, 1780, 1716, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 1719, 1760, 1659, 1658, 1737, 1683, 1700, 1705, 1709, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 1770, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 1706, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 1721, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 1677, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 3196, 1735, 1742, 1801, 1713, 1823, 1717, 1638, 1642, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 1834, 1835, 1633, 1840, 1839, 1685, 1842, 1844, 1689, 1753, 1769, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 1855, 1856, 1858, 1852, 1853, 1854, 254: 1094, 389: 3174, 1635, 1636, 1634}, - {63: 3182, 254: 1080, 412: 3183, 589: 3181, 619: 3180}, + {2: 1736, 1653, 1687, 1654, 7: 1664, 1741, 1680, 1738, 1701, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 1728, 1665, 1674, 1695, 1859, 1788, 1789, 1785, 1747, 1794, 1837, 1839, 1838, 1730, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 1733, 1774, 1673, 1672, 1751, 1714, 1719, 1723, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 1784, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 1720, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 1735, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 1691, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 1652, 1656, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 1852, 1853, 1647, 1858, 1857, 1699, 1860, 1862, 1703, 1767, 1783, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 1873, 1874, 1876, 1870, 1871, 1872, 258: 1117, 393: 3235, 1649, 1650, 1648}, + {2: 1736, 1653, 1687, 1654, 7: 1664, 1741, 1680, 1738, 1701, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 1728, 1665, 1674, 1695, 1859, 1788, 1789, 1785, 1747, 1794, 1837, 1839, 1838, 1730, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 1733, 1774, 1673, 1672, 1751, 1714, 1719, 1723, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 1784, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 1720, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 1735, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 1691, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 1652, 1656, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 1852, 1853, 1647, 1858, 1857, 1699, 1860, 1862, 1703, 1767, 1783, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 1873, 1874, 1876, 1870, 1871, 1872, 234: 1908, 258: 1115, 303: 1907, 393: 1909, 1649, 1650, 1648, 477: 1906, 527: 3231}, + {248: 3221, 258: 3220}, + {2: 1736, 1653, 1687, 1654, 7: 1664, 1741, 1680, 1738, 1701, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 1728, 1665, 1674, 1695, 1859, 1788, 1789, 1785, 1747, 1794, 1837, 1839, 1838, 1730, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 1733, 1774, 1673, 1672, 1751, 1714, 1719, 1723, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 1784, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 1720, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 1735, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 1691, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 3180, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 1652, 1656, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 1852, 1853, 1958, 1858, 1857, 1699, 1860, 1862, 1703, 1767, 1783, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 1873, 1874, 1876, 1870, 1871, 1872, 234: 1965, 242: 3217, 258: 1109, 393: 1909, 1649, 1650, 1648, 477: 1967, 482: 3215, 520: 1968, 1966, 541: 3183, 726: 3216, 858: 3214}, + {2: 1736, 1653, 1687, 1654, 7: 1664, 1741, 1680, 1738, 1701, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 1728, 1665, 1674, 1695, 1859, 1788, 1789, 1785, 1747, 1794, 1837, 1839, 1838, 1730, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 1733, 1774, 1673, 1672, 1751, 1714, 1719, 1723, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 1784, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 1720, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 1735, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 1691, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 3212, 1749, 1756, 1815, 1727, 1841, 1731, 1652, 1656, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 1852, 1853, 1647, 1858, 1857, 1699, 1860, 1862, 1703, 1767, 1783, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 1873, 1874, 1876, 1870, 1871, 1872, 258: 1106, 393: 3190, 1649, 1650, 1648}, // 1625 - {474, 474, 6: 3170}, - {57: 3163}, - {254: 3161}, - {254: 3155}, - {254: 3151, 592: 3152}, + {65: 3198, 258: 1092, 416: 3199, 592: 3197, 623: 3196}, + {476, 476, 6: 3186}, + {59: 3179}, + {258: 3177}, + {258: 3170}, // 1630 - {2: 1722, 1639, 1673, 1640, 7: 1650, 1727, 1666, 1724, 1687, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 1714, 1651, 1660, 1681, 1774, 1775, 1771, 1733, 1780, 1716, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 1719, 1760, 1659, 1658, 1737, 1683, 1700, 1705, 1709, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 1770, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 1706, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 1721, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 1677, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 1638, 1642, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 1834, 1835, 1633, 1840, 1839, 1685, 1842, 1844, 1689, 1753, 1769, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 1855, 1856, 1858, 1852, 1853, 1854, 230: 1889, 299: 1888, 389: 1890, 1635, 1636, 1634, 473: 1887, 522: 3150}, - {435, 435, 6: 435}, - {439, 439, 6: 439}, - {2: 1722, 1639, 1673, 1640, 7: 2119, 1727, 1666, 1724, 2124, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 2128, 1651, 2121, 2123, 2137, 2138, 2136, 2132, 2139, 2129, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 2130, 1760, 1659, 2120, 1737, 1683, 1700, 2125, 2127, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 2135, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 2126, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 2131, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 2122, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 2117, 2118, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 2140, 1835, 2116, 1840, 1839, 1685, 1842, 1844, 1689, 2133, 2134, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 2141, 2142, 1858, 1852, 1853, 1854, 2172, 230: 2153, 2112, 2184, 2188, 235: 2169, 2168, 2205, 2179, 243: 2144, 266: 2148, 2187, 290: 2156, 299: 2175, 311: 2189, 2110, 2182, 2204, 2206, 2147, 2146, 2163, 2203, 2183, 2180, 2174, 2178, 2143, 2145, 2181, 2152, 2185, 2193, 2244, 2151, 2194, 2195, 2150, 2173, 2166, 2167, 2217, 2219, 2220, 2221, 2176, 2222, 2201, 2207, 2215, 2216, 2211, 2223, 2224, 2225, 2212, 2227, 2228, 2218, 2213, 2226, 2208, 2214, 2199, 2229, 2230, 2177, 2234, 2190, 2192, 2233, 2239, 2238, 2240, 2237, 2170, 2241, 2236, 2235, 2232, 2186, 2231, 2191, 2196, 2197, 389: 2155, 1635, 1636, 1634, 448: 2171, 2243, 2162, 2157, 2149, 2160, 2158, 2159, 2198, 2210, 2209, 2202, 2200, 2154, 2165, 2242, 2164, 2161, 2115, 2114, 2113, 3154}, - {2: 1722, 1639, 1673, 1640, 7: 2119, 1727, 1666, 1724, 2124, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 2128, 1651, 2121, 2123, 2137, 2138, 2136, 2132, 2139, 2129, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 2130, 1760, 1659, 2120, 1737, 1683, 1700, 2125, 2127, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 2135, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 2126, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 2131, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 2122, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 2117, 2118, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 2140, 1835, 2116, 1840, 1839, 1685, 1842, 1844, 1689, 2133, 2134, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 2141, 2142, 1858, 1852, 1853, 1854, 2172, 230: 2153, 2112, 2184, 2188, 235: 2169, 2168, 2205, 2179, 243: 2144, 266: 2148, 2187, 290: 2156, 299: 2175, 311: 2189, 2110, 2182, 2204, 2206, 2147, 2146, 2163, 2203, 2183, 2180, 2174, 2178, 2143, 2145, 2181, 2152, 2185, 2193, 2244, 2151, 2194, 2195, 2150, 2173, 2166, 2167, 2217, 2219, 2220, 2221, 2176, 2222, 2201, 2207, 2215, 2216, 2211, 2223, 2224, 2225, 2212, 2227, 2228, 2218, 2213, 2226, 2208, 2214, 2199, 2229, 2230, 2177, 2234, 2190, 2192, 2233, 2239, 2238, 2240, 2237, 2170, 2241, 2236, 2235, 2232, 2186, 2231, 2191, 2196, 2197, 389: 2155, 1635, 1636, 1634, 448: 2171, 2243, 2162, 2157, 2149, 2160, 2158, 2159, 2198, 2210, 2209, 2202, 2200, 2154, 2165, 2242, 2164, 2161, 2115, 2114, 2113, 3153}, + {258: 3166, 595: 3167}, + {2: 1736, 1653, 1687, 1654, 7: 1664, 1741, 1680, 1738, 1701, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 1728, 1665, 1674, 1695, 1859, 1788, 1789, 1785, 1747, 1794, 1837, 1839, 1838, 1730, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 1733, 1774, 1673, 1672, 1751, 1714, 1719, 1723, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 1784, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 1720, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 1735, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 1691, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 1652, 1656, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 1852, 1853, 1647, 1858, 1857, 1699, 1860, 1862, 1703, 1767, 1783, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 1873, 1874, 1876, 1870, 1871, 1872, 234: 1908, 303: 1907, 393: 1909, 1649, 1650, 1648, 477: 1906, 527: 3165}, + {436, 436, 6: 436}, + {440, 440, 6: 440}, + {2: 1736, 1653, 1687, 1654, 7: 2140, 1741, 1680, 1738, 2145, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 2149, 1665, 2142, 2144, 1859, 2158, 2159, 2157, 2153, 2160, 1837, 1839, 1838, 2150, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 2151, 1774, 1673, 2141, 1751, 1714, 2146, 2148, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 2156, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 2147, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 2152, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 2143, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 2138, 2139, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 2161, 1853, 2137, 1858, 1857, 1699, 1860, 1862, 1703, 2154, 2155, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 2162, 2163, 1876, 1870, 1871, 1872, 2193, 234: 2174, 2133, 2205, 2209, 239: 2190, 2189, 2226, 2200, 247: 2165, 270: 2169, 272: 2208, 294: 2177, 303: 2196, 315: 2210, 2131, 2203, 2225, 2227, 2168, 2167, 2184, 2224, 2204, 2201, 2195, 2199, 2164, 2166, 2202, 2173, 2206, 2214, 2265, 2172, 2215, 2216, 2171, 2194, 2187, 2188, 2238, 2240, 2241, 2242, 2197, 2243, 2222, 2228, 2236, 2237, 2232, 2244, 2245, 2246, 2233, 2248, 2249, 2239, 2234, 2247, 2229, 2235, 2220, 2250, 2251, 2198, 2255, 2211, 2213, 2254, 2260, 2259, 2261, 2258, 2191, 2262, 2257, 2256, 381: 2253, 2207, 2252, 2212, 2217, 2218, 393: 2176, 1649, 1650, 1648, 452: 2192, 2264, 2183, 2178, 2170, 2181, 2179, 2180, 2219, 2231, 2230, 2223, 2221, 2175, 2186, 2263, 2185, 2182, 2136, 2135, 2134, 3169}, // 1635 - {443, 443, 6: 443, 246: 2253, 248: 2251, 250: 2252, 2250, 2248, 470: 2249, 2247}, - {444, 444, 6: 444, 246: 2253, 248: 2251, 250: 2252, 2250, 2248, 470: 2249, 2247}, - {2: 1722, 1639, 1673, 1640, 7: 2119, 1727, 1666, 1724, 2124, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 2128, 1651, 2121, 2123, 2137, 2138, 2136, 2132, 2139, 2129, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 2130, 1760, 1659, 2120, 1737, 1683, 1700, 2125, 2127, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 2135, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 2126, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 2131, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 2122, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 2117, 2118, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 2140, 1835, 2116, 1840, 1839, 1685, 1842, 1844, 1689, 2133, 2134, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 2141, 2142, 1858, 1852, 1853, 1854, 2172, 3158, 2153, 2112, 2184, 2188, 235: 2169, 2168, 2205, 3157, 243: 2144, 266: 2148, 2187, 290: 2156, 299: 2175, 311: 2189, 2110, 2182, 2204, 2206, 2147, 2146, 2163, 2203, 2183, 2180, 2174, 2178, 2143, 2145, 2181, 2152, 2185, 2193, 2244, 2151, 2194, 2195, 2150, 2173, 2166, 2167, 2217, 2219, 2220, 2221, 2176, 2222, 2201, 2207, 2215, 2216, 2211, 2223, 2224, 2225, 2212, 2227, 2228, 2218, 2213, 2226, 2208, 2214, 2199, 2229, 2230, 2177, 2234, 2190, 2192, 2233, 2239, 2238, 2240, 2237, 2170, 2241, 2236, 2235, 2232, 2186, 2231, 2191, 2196, 2197, 389: 2155, 1635, 1636, 1634, 448: 2171, 2243, 2162, 2157, 2149, 2160, 2158, 2159, 2198, 2210, 2209, 2202, 2200, 2154, 2165, 2242, 2164, 2161, 2115, 2114, 2113, 3156, 545: 3159, 587: 3160}, - {907, 907, 6: 907, 21: 907, 246: 2253, 248: 2251, 250: 2252, 2250, 2248, 470: 2249, 2247}, - {906, 906, 6: 906, 21: 906, 228: 2635}, + {2: 1736, 1653, 1687, 1654, 7: 2140, 1741, 1680, 1738, 2145, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 2149, 1665, 2142, 2144, 1859, 2158, 2159, 2157, 2153, 2160, 1837, 1839, 1838, 2150, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 2151, 1774, 1673, 2141, 1751, 1714, 2146, 2148, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 2156, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 2147, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 2152, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 2143, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 2138, 2139, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 2161, 1853, 2137, 1858, 1857, 1699, 1860, 1862, 1703, 2154, 2155, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 2162, 2163, 1876, 1870, 1871, 1872, 2193, 234: 2174, 2133, 2205, 2209, 239: 2190, 2189, 2226, 2200, 247: 2165, 270: 2169, 272: 2208, 294: 2177, 303: 2196, 315: 2210, 2131, 2203, 2225, 2227, 2168, 2167, 2184, 2224, 2204, 2201, 2195, 2199, 2164, 2166, 2202, 2173, 2206, 2214, 2265, 2172, 2215, 2216, 2171, 2194, 2187, 2188, 2238, 2240, 2241, 2242, 2197, 2243, 2222, 2228, 2236, 2237, 2232, 2244, 2245, 2246, 2233, 2248, 2249, 2239, 2234, 2247, 2229, 2235, 2220, 2250, 2251, 2198, 2255, 2211, 2213, 2254, 2260, 2259, 2261, 2258, 2191, 2262, 2257, 2256, 381: 2253, 2207, 2252, 2212, 2217, 2218, 393: 2176, 1649, 1650, 1648, 452: 2192, 2264, 2183, 2178, 2170, 2181, 2179, 2180, 2219, 2231, 2230, 2223, 2221, 2175, 2186, 2263, 2185, 2182, 2136, 2135, 2134, 3168}, + {444, 444, 6: 444, 250: 2274, 252: 2272, 2273, 2271, 2269, 474: 2270, 2268}, + {445, 445, 6: 445, 250: 2274, 252: 2272, 2273, 2271, 2269, 474: 2270, 2268}, + {2: 1736, 1653, 1687, 1654, 7: 2140, 1741, 1680, 1738, 2145, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 2149, 1665, 2142, 2144, 1859, 2158, 2159, 2157, 2153, 2160, 1837, 1839, 1838, 2150, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 2151, 1774, 1673, 2141, 1751, 1714, 2146, 2148, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 2156, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 2147, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 2152, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 2143, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 2138, 2139, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 2161, 1853, 2137, 1858, 1857, 1699, 1860, 1862, 1703, 2154, 2155, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 2162, 2163, 1876, 1870, 1871, 1872, 2193, 3174, 2174, 2133, 2205, 2209, 239: 2190, 2189, 2226, 3172, 247: 2165, 270: 2169, 272: 2208, 294: 2177, 303: 3173, 315: 2210, 2131, 2203, 2225, 2227, 2168, 2167, 2184, 2224, 2204, 2201, 2195, 2199, 2164, 2166, 2202, 2173, 2206, 2214, 2265, 2172, 2215, 2216, 2171, 2194, 2187, 2188, 2238, 2240, 2241, 2242, 2197, 2243, 2222, 2228, 2236, 2237, 2232, 2244, 2245, 2246, 2233, 2248, 2249, 2239, 2234, 2247, 2229, 2235, 2220, 2250, 2251, 2198, 2255, 2211, 2213, 2254, 2260, 2259, 2261, 2258, 2191, 2262, 2257, 2256, 381: 2253, 2207, 2252, 2212, 2217, 2218, 393: 2176, 1649, 1650, 1648, 452: 2192, 2264, 2183, 2178, 2170, 2181, 2179, 2180, 2219, 2231, 2230, 2223, 2221, 2175, 2186, 2263, 2185, 2182, 2136, 2135, 2134, 3171, 549: 3175, 591: 3176}, + {915, 915, 6: 915, 21: 915, 250: 2274, 252: 2272, 2273, 2271, 2269, 474: 2270, 2268}, // 1640 + {914, 914, 6: 914, 21: 914, 232: 2656}, + {452, 452, 1736, 1653, 1687, 1654, 452, 2140, 1741, 1680, 1738, 2145, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 2149, 1665, 2142, 2144, 1859, 2158, 2159, 2157, 2153, 2160, 1837, 1839, 1838, 2150, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 2151, 1774, 1673, 2141, 1751, 1714, 2146, 2148, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 2156, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 2147, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 2152, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 2143, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 2138, 2139, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 2161, 1853, 2137, 1858, 1857, 1699, 1860, 1862, 1703, 2154, 2155, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 2162, 2163, 1876, 1870, 1871, 1872, 2193, 234: 2174, 236: 2205, 2209, 239: 2190, 2189, 2226, 2200, 247: 2165, 270: 2169, 272: 2208, 294: 2177, 303: 2196, 315: 2210, 2277, 2203, 2225, 2227, 2168, 2167, 2184, 2224, 2204, 2201, 2195, 2199, 2164, 2166, 2202, 2173, 2206, 2214, 2265, 2172, 2215, 2216, 2171, 2194, 2187, 2188, 2238, 2240, 2241, 2242, 2197, 2243, 2222, 2228, 2236, 2237, 2232, 2244, 2245, 2246, 2233, 2248, 2249, 2239, 2234, 2247, 2229, 2235, 2220, 2250, 2251, 2198, 2255, 2211, 2213, 2254, 2260, 2259, 2261, 2258, 2191, 2262, 2257, 2256, 381: 2253, 2207, 2252, 2212, 2217, 2218, 393: 2176, 1649, 1650, 1648, 452: 2192, 2264, 2183, 2178, 2170, 2181, 2179, 2180, 2219, 2231, 2230, 2223, 2221, 2727, 2186, 2263, 2185, 2182}, + {453, 453, 6: 453}, {451, 451, 6: 451}, - {450, 450, 6: 450}, - {445, 445, 6: 445}, - {2: 1722, 1639, 1673, 1640, 7: 2119, 1727, 1666, 1724, 2124, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 2128, 1651, 2121, 2123, 2137, 2138, 2136, 2132, 2139, 2129, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 2130, 1760, 1659, 2120, 1737, 1683, 1700, 2125, 2127, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 2135, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 2126, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 2131, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 2122, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 2117, 2118, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 2140, 1835, 2116, 1840, 1839, 1685, 1842, 1844, 1689, 2133, 2134, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 2141, 2142, 1858, 1852, 1853, 1854, 2172, 3158, 2153, 2112, 2184, 2188, 235: 2169, 2168, 2205, 3157, 243: 2144, 266: 2148, 2187, 290: 2156, 299: 2175, 311: 2189, 2110, 2182, 2204, 2206, 2147, 2146, 2163, 2203, 2183, 2180, 2174, 2178, 2143, 2145, 2181, 2152, 2185, 2193, 2244, 2151, 2194, 2195, 2150, 2173, 2166, 2167, 2217, 2219, 2220, 2221, 2176, 2222, 2201, 2207, 2215, 2216, 2211, 2223, 2224, 2225, 2212, 2227, 2228, 2218, 2213, 2226, 2208, 2214, 2199, 2229, 2230, 2177, 2234, 2190, 2192, 2233, 2239, 2238, 2240, 2237, 2170, 2241, 2236, 2235, 2232, 2186, 2231, 2191, 2196, 2197, 389: 2155, 1635, 1636, 1634, 448: 2171, 2243, 2162, 2157, 2149, 2160, 2158, 2159, 2198, 2210, 2209, 2202, 2200, 2154, 2165, 2242, 2164, 2161, 2115, 2114, 2113, 3156, 545: 3159, 587: 3162}, - {449, 449, 6: 449}, + {446, 446, 6: 446}, // 1645 - {2: 1722, 1639, 1673, 1640, 7: 1650, 1727, 1666, 1724, 1687, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 1714, 1651, 1660, 1681, 1774, 1775, 1771, 1733, 1780, 1716, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 1719, 1760, 1659, 1658, 1737, 1683, 1700, 1705, 1709, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 1770, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 1706, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 1721, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 1677, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 3164, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 1638, 1642, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 1834, 1835, 1939, 1840, 1839, 1685, 1842, 1844, 1689, 1753, 1769, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 1855, 1856, 1858, 1852, 1853, 1854, 230: 1946, 389: 1890, 1635, 1636, 1634, 473: 1948, 478: 3166, 516: 1949, 1947, 537: 3167, 722: 3165}, - {466, 466, 312: 1024, 402: 466, 410: 1024}, - {402: 3168}, - {402: 465}, - {464, 464, 6: 2034, 402: 464}, + {2: 1736, 1653, 1687, 1654, 7: 2140, 1741, 1680, 1738, 2145, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 2149, 1665, 2142, 2144, 1859, 2158, 2159, 2157, 2153, 2160, 1837, 1839, 1838, 2150, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 2151, 1774, 1673, 2141, 1751, 1714, 2146, 2148, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 2156, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 2147, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 2152, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 2143, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 2138, 2139, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 2161, 1853, 2137, 1858, 1857, 1699, 1860, 1862, 1703, 2154, 2155, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 2162, 2163, 1876, 1870, 1871, 1872, 2193, 3174, 2174, 2133, 2205, 2209, 239: 2190, 2189, 2226, 3172, 247: 2165, 270: 2169, 272: 2208, 294: 2177, 303: 3173, 315: 2210, 2131, 2203, 2225, 2227, 2168, 2167, 2184, 2224, 2204, 2201, 2195, 2199, 2164, 2166, 2202, 2173, 2206, 2214, 2265, 2172, 2215, 2216, 2171, 2194, 2187, 2188, 2238, 2240, 2241, 2242, 2197, 2243, 2222, 2228, 2236, 2237, 2232, 2244, 2245, 2246, 2233, 2248, 2249, 2239, 2234, 2247, 2229, 2235, 2220, 2250, 2251, 2198, 2255, 2211, 2213, 2254, 2260, 2259, 2261, 2258, 2191, 2262, 2257, 2256, 381: 2253, 2207, 2252, 2212, 2217, 2218, 393: 2176, 1649, 1650, 1648, 452: 2192, 2264, 2183, 2178, 2170, 2181, 2179, 2180, 2219, 2231, 2230, 2223, 2221, 2175, 2186, 2263, 2185, 2182, 2136, 2135, 2134, 3171, 549: 3175, 591: 3178}, + {450, 450, 6: 450}, + {2: 1736, 1653, 1687, 1654, 7: 1664, 1741, 1680, 1738, 1701, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 1728, 1665, 1674, 1695, 1859, 1788, 1789, 1785, 1747, 1794, 1837, 1839, 1838, 1730, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 1733, 1774, 1673, 1672, 1751, 1714, 1719, 1723, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 1784, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 1720, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 1735, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 1691, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 3180, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 1652, 1656, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 1852, 1853, 1958, 1858, 1857, 1699, 1860, 1862, 1703, 1767, 1783, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 1873, 1874, 1876, 1870, 1871, 1872, 234: 1965, 393: 1909, 1649, 1650, 1648, 477: 1967, 482: 3182, 520: 1968, 1966, 541: 3183, 726: 3181}, + {468, 468, 316: 1036, 406: 468, 414: 1036}, + {406: 3184}, // 1650 - {2: 1722, 1639, 1673, 1640, 7: 1650, 1727, 1666, 1724, 1687, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 1714, 1651, 1660, 1681, 1774, 1775, 1771, 1733, 1780, 1716, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 1719, 1760, 1659, 1658, 1737, 1683, 1700, 1705, 1709, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 1770, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 1706, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 1721, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 1677, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 1638, 1642, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 1834, 1835, 1633, 1840, 1839, 1685, 1842, 1844, 1689, 1753, 1769, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 1855, 1856, 1858, 1852, 1853, 1854, 230: 1889, 311: 1991, 389: 1890, 1635, 1636, 1634, 473: 1990, 501: 2036, 573: 3169}, - {467, 467, 6: 2038}, - {2: 1722, 1639, 1673, 1640, 7: 3135, 1727, 1666, 1724, 1687, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 1714, 1651, 1660, 1681, 1774, 1775, 1771, 1733, 1780, 1716, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 1719, 1760, 1659, 1658, 1737, 3137, 1700, 1705, 1709, 1746, 1671, 3171, 1680, 1738, 1859, 1749, 1778, 1693, 3172, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 1770, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 1706, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 1721, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 1677, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 1638, 1642, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 1834, 1835, 1633, 1840, 1839, 3138, 1842, 1844, 1689, 1753, 1769, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 1855, 1856, 1858, 1852, 1853, 1854, 312: 3147, 330: 3146, 389: 3145, 1635, 1636, 1634, 395: 2677, 498: 3148, 748: 3173}, - {2: 1722, 1639, 1673, 1640, 7: 1650, 1727, 1666, 1724, 1687, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 1714, 1651, 1660, 1681, 1774, 1775, 1771, 1733, 1780, 1716, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 1719, 1760, 1659, 1658, 1737, 1683, 1700, 1705, 1709, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 1770, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 1706, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 1721, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 1677, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 1638, 1642, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 1834, 1835, 1633, 1840, 1839, 1685, 1842, 1844, 1689, 1753, 1769, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 1855, 1856, 1858, 1852, 1853, 1854, 254: 1109, 389: 3177, 1635, 1636, 1634}, - {2: 1722, 1639, 1673, 1640, 7: 1650, 1727, 1666, 1724, 1687, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 1714, 1651, 1660, 1681, 1774, 1775, 1771, 1733, 1780, 1716, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 1719, 1760, 1659, 1658, 1737, 1683, 1700, 1705, 1709, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 1770, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 1706, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 1721, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 1677, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 1638, 1642, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 1834, 1835, 1633, 1840, 1839, 1685, 1842, 1844, 1689, 1753, 1769, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 1855, 1856, 1858, 1852, 1853, 1854, 254: 1094, 389: 3174, 1635, 1636, 1634}, + {406: 467}, + {466, 466, 6: 2053, 406: 466}, + {2: 1736, 1653, 1687, 1654, 7: 1664, 1741, 1680, 1738, 1701, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 1728, 1665, 1674, 1695, 1859, 1788, 1789, 1785, 1747, 1794, 1837, 1839, 1838, 1730, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 1733, 1774, 1673, 1672, 1751, 1714, 1719, 1723, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 1784, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 1720, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 1735, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 1691, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 1652, 1656, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 1852, 1853, 1647, 1858, 1857, 1699, 1860, 1862, 1703, 1767, 1783, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 1873, 1874, 1876, 1870, 1871, 1872, 234: 1908, 315: 2010, 393: 1909, 1649, 1650, 1648, 477: 2009, 505: 2055, 577: 3185}, + {469, 469, 6: 2057}, + {2: 1736, 1653, 1687, 1654, 7: 3150, 1741, 1680, 1738, 1701, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 1728, 1665, 1674, 1695, 1859, 1788, 1789, 1785, 1747, 1794, 1837, 1839, 1838, 1730, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 3152, 1700, 1777, 1702, 1705, 1836, 1733, 1774, 1673, 1672, 1751, 1714, 1719, 1723, 1760, 1685, 3187, 1694, 1752, 1877, 1763, 1792, 1707, 3188, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 1784, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 1720, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 1735, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 1691, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 1652, 1656, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 1852, 1853, 1647, 1858, 1857, 3153, 1860, 1862, 1703, 1767, 1783, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 1873, 1874, 1876, 1870, 1871, 1872, 316: 3162, 334: 3161, 393: 3160, 1649, 1650, 1648, 399: 2698, 502: 3163, 752: 3189}, // 1655 - {434, 434, 6: 434}, - {254: 3175}, - {2: 1722, 1639, 1673, 1640, 7: 2119, 1727, 1666, 1724, 2124, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 2128, 1651, 2121, 2123, 2137, 2138, 2136, 2132, 2139, 2129, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 2130, 1760, 1659, 2120, 1737, 1683, 1700, 2125, 2127, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 2135, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 2126, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 2131, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 2122, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 2117, 2118, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 2140, 1835, 2116, 1840, 1839, 1685, 1842, 1844, 1689, 2133, 2134, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 2141, 2142, 1858, 1852, 1853, 1854, 2172, 3158, 2153, 2112, 2184, 2188, 235: 2169, 2168, 2205, 3157, 243: 2144, 266: 2148, 2187, 290: 2156, 299: 2175, 311: 2189, 2110, 2182, 2204, 2206, 2147, 2146, 2163, 2203, 2183, 2180, 2174, 2178, 2143, 2145, 2181, 2152, 2185, 2193, 2244, 2151, 2194, 2195, 2150, 2173, 2166, 2167, 2217, 2219, 2220, 2221, 2176, 2222, 2201, 2207, 2215, 2216, 2211, 2223, 2224, 2225, 2212, 2227, 2228, 2218, 2213, 2226, 2208, 2214, 2199, 2229, 2230, 2177, 2234, 2190, 2192, 2233, 2239, 2238, 2240, 2237, 2170, 2241, 2236, 2235, 2232, 2186, 2231, 2191, 2196, 2197, 389: 2155, 1635, 1636, 1634, 448: 2171, 2243, 2162, 2157, 2149, 2160, 2158, 2159, 2198, 2210, 2209, 2202, 2200, 2154, 2165, 2242, 2164, 2161, 2115, 2114, 2113, 3156, 545: 3159, 587: 3176}, - {447, 447, 6: 447}, - {254: 3178}, + {2: 1736, 1653, 1687, 1654, 7: 1664, 1741, 1680, 1738, 1701, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 1728, 1665, 1674, 1695, 1859, 1788, 1789, 1785, 1747, 1794, 1837, 1839, 1838, 1730, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 1733, 1774, 1673, 1672, 1751, 1714, 1719, 1723, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 1784, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 1720, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 1735, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 1691, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 1652, 1656, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 1852, 1853, 1647, 1858, 1857, 1699, 1860, 1862, 1703, 1767, 1783, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 1873, 1874, 1876, 1870, 1871, 1872, 258: 1121, 393: 3193, 1649, 1650, 1648}, + {2: 1736, 1653, 1687, 1654, 7: 1664, 1741, 1680, 1738, 1701, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 1728, 1665, 1674, 1695, 1859, 1788, 1789, 1785, 1747, 1794, 1837, 1839, 1838, 1730, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 1733, 1774, 1673, 1672, 1751, 1714, 1719, 1723, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 1784, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 1720, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 1735, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 1691, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 1652, 1656, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 1852, 1853, 1647, 1858, 1857, 1699, 1860, 1862, 1703, 1767, 1783, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 1873, 1874, 1876, 1870, 1871, 1872, 258: 1106, 393: 3190, 1649, 1650, 1648}, + {435, 435, 6: 435}, + {258: 3191}, + {2: 1736, 1653, 1687, 1654, 7: 2140, 1741, 1680, 1738, 2145, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 2149, 1665, 2142, 2144, 1859, 2158, 2159, 2157, 2153, 2160, 1837, 1839, 1838, 2150, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 2151, 1774, 1673, 2141, 1751, 1714, 2146, 2148, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 2156, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 2147, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 2152, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 2143, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 2138, 2139, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 2161, 1853, 2137, 1858, 1857, 1699, 1860, 1862, 1703, 2154, 2155, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 2162, 2163, 1876, 1870, 1871, 1872, 2193, 3174, 2174, 2133, 2205, 2209, 239: 2190, 2189, 2226, 3172, 247: 2165, 270: 2169, 272: 2208, 294: 2177, 303: 3173, 315: 2210, 2131, 2203, 2225, 2227, 2168, 2167, 2184, 2224, 2204, 2201, 2195, 2199, 2164, 2166, 2202, 2173, 2206, 2214, 2265, 2172, 2215, 2216, 2171, 2194, 2187, 2188, 2238, 2240, 2241, 2242, 2197, 2243, 2222, 2228, 2236, 2237, 2232, 2244, 2245, 2246, 2233, 2248, 2249, 2239, 2234, 2247, 2229, 2235, 2220, 2250, 2251, 2198, 2255, 2211, 2213, 2254, 2260, 2259, 2261, 2258, 2191, 2262, 2257, 2256, 381: 2253, 2207, 2252, 2212, 2217, 2218, 393: 2176, 1649, 1650, 1648, 452: 2192, 2264, 2183, 2178, 2170, 2181, 2179, 2180, 2219, 2231, 2230, 2223, 2221, 2175, 2186, 2263, 2185, 2182, 2136, 2135, 2134, 3171, 549: 3175, 591: 3192}, // 1660 - {2: 1722, 1639, 1673, 1640, 7: 2119, 1727, 1666, 1724, 2124, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 2128, 1651, 2121, 2123, 2137, 2138, 2136, 2132, 2139, 2129, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 2130, 1760, 1659, 2120, 1737, 1683, 1700, 2125, 2127, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 2135, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 2126, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 2131, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 2122, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 2117, 2118, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 2140, 1835, 2116, 1840, 1839, 1685, 1842, 1844, 1689, 2133, 2134, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 2141, 2142, 1858, 1852, 1853, 1854, 2172, 3158, 2153, 2112, 2184, 2188, 235: 2169, 2168, 2205, 3157, 243: 2144, 266: 2148, 2187, 290: 2156, 299: 2175, 311: 2189, 2110, 2182, 2204, 2206, 2147, 2146, 2163, 2203, 2183, 2180, 2174, 2178, 2143, 2145, 2181, 2152, 2185, 2193, 2244, 2151, 2194, 2195, 2150, 2173, 2166, 2167, 2217, 2219, 2220, 2221, 2176, 2222, 2201, 2207, 2215, 2216, 2211, 2223, 2224, 2225, 2212, 2227, 2228, 2218, 2213, 2226, 2208, 2214, 2199, 2229, 2230, 2177, 2234, 2190, 2192, 2233, 2239, 2238, 2240, 2237, 2170, 2241, 2236, 2235, 2232, 2186, 2231, 2191, 2196, 2197, 389: 2155, 1635, 1636, 1634, 448: 2171, 2243, 2162, 2157, 2149, 2160, 2158, 2159, 2198, 2210, 2209, 2202, 2200, 2154, 2165, 2242, 2164, 2161, 2115, 2114, 2113, 3156, 545: 3159, 587: 3179}, {448, 448, 6: 448}, - {469, 469, 6: 3194}, - {460, 460, 6: 460}, - {144: 3186}, + {258: 3194}, + {2: 1736, 1653, 1687, 1654, 7: 2140, 1741, 1680, 1738, 2145, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 2149, 1665, 2142, 2144, 1859, 2158, 2159, 2157, 2153, 2160, 1837, 1839, 1838, 2150, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 2151, 1774, 1673, 2141, 1751, 1714, 2146, 2148, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 2156, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 2147, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 2152, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 2143, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 2138, 2139, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 2161, 1853, 2137, 1858, 1857, 1699, 1860, 1862, 1703, 2154, 2155, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 2162, 2163, 1876, 1870, 1871, 1872, 2193, 3174, 2174, 2133, 2205, 2209, 239: 2190, 2189, 2226, 3172, 247: 2165, 270: 2169, 272: 2208, 294: 2177, 303: 3173, 315: 2210, 2131, 2203, 2225, 2227, 2168, 2167, 2184, 2224, 2204, 2201, 2195, 2199, 2164, 2166, 2202, 2173, 2206, 2214, 2265, 2172, 2215, 2216, 2171, 2194, 2187, 2188, 2238, 2240, 2241, 2242, 2197, 2243, 2222, 2228, 2236, 2237, 2232, 2244, 2245, 2246, 2233, 2248, 2249, 2239, 2234, 2247, 2229, 2235, 2220, 2250, 2251, 2198, 2255, 2211, 2213, 2254, 2260, 2259, 2261, 2258, 2191, 2262, 2257, 2256, 381: 2253, 2207, 2252, 2212, 2217, 2218, 393: 2176, 1649, 1650, 1648, 452: 2192, 2264, 2183, 2178, 2170, 2181, 2179, 2180, 2219, 2231, 2230, 2223, 2221, 2175, 2186, 2263, 2185, 2182, 2136, 2135, 2134, 3171, 549: 3175, 591: 3195}, + {449, 449, 6: 449}, + {471, 471, 6: 3210}, // 1665 - {154: 3185, 424: 3184}, - {457, 457, 6: 457}, - {456, 456, 6: 456}, - {162: 3188, 166: 3190, 412: 3189, 806: 3187}, + {462, 462, 6: 462}, + {149: 3202}, + {158: 3201, 428: 3200}, + {459, 459, 6: 459}, {458, 458, 6: 458}, // 1670 - {412: 3193}, - {123: 3191, 182: 3192}, - {452, 452, 6: 452}, + {166: 3204, 171: 3206, 416: 3205, 810: 3203}, + {460, 460, 6: 460}, + {416: 3209}, + {128: 3207, 186: 3208}, {454, 454, 6: 454}, - {453, 453, 6: 453}, // 1675 + {456, 456, 6: 456}, {455, 455, 6: 455}, - {63: 3182, 412: 3183, 589: 3195}, - {459, 459, 6: 459}, - {63: 3182, 254: 1080, 412: 3183, 589: 3181, 619: 3197}, - {470, 470, 6: 3194}, + {457, 457, 6: 457}, + {65: 3198, 416: 3199, 592: 3211}, + {461, 461, 6: 461}, // 1680 - {468, 468}, - {465, 465, 788: 3202}, - {462, 462}, - {461, 461}, - {2: 1722, 1639, 1673, 1640, 7: 1650, 1727, 1666, 1724, 1687, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 1714, 1651, 1660, 1681, 1774, 1775, 1771, 1733, 1780, 1716, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 1719, 1760, 1659, 1658, 1737, 1683, 1700, 1705, 1709, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 1770, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 1706, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 1721, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 1677, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 1638, 1642, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 1834, 1835, 1939, 1840, 1839, 1685, 1842, 1844, 1689, 1753, 1769, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 1855, 1856, 1858, 1852, 1853, 1854, 230: 1946, 389: 1890, 1635, 1636, 1634, 473: 1948, 516: 1949, 1947, 537: 3203}, + {65: 3198, 258: 1092, 416: 3199, 592: 3197, 623: 3213}, + {472, 472, 6: 3210}, + {470, 470}, + {467, 467, 792: 3218}, + {464, 464}, // 1685 - {463, 463, 6: 2034}, - {11: 3210, 230: 3209, 708: 3214}, - {2: 1722, 1639, 1673, 1640, 7: 1650, 1727, 1666, 1724, 1687, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 1714, 1651, 1660, 1681, 1774, 1775, 1771, 1733, 1780, 1716, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 1719, 1760, 1659, 1658, 1737, 1683, 1700, 1705, 1709, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 1770, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 1706, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 1721, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 1677, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 1638, 1642, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 1834, 1835, 1633, 1840, 1839, 1685, 1842, 1844, 1689, 1753, 1769, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 1855, 1856, 1858, 1852, 1853, 1854, 230: 1889, 311: 1991, 389: 1890, 1635, 1636, 1634, 473: 1990, 501: 3206}, - {254: 3207}, - {11: 3210, 230: 3209, 708: 3208}, + {463, 463}, + {2: 1736, 1653, 1687, 1654, 7: 1664, 1741, 1680, 1738, 1701, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 1728, 1665, 1674, 1695, 1859, 1788, 1789, 1785, 1747, 1794, 1837, 1839, 1838, 1730, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 1733, 1774, 1673, 1672, 1751, 1714, 1719, 1723, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 1784, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 1720, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 1735, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 1691, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 1652, 1656, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 1852, 1853, 1958, 1858, 1857, 1699, 1860, 1862, 1703, 1767, 1783, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 1873, 1874, 1876, 1870, 1871, 1872, 234: 1965, 393: 1909, 1649, 1650, 1648, 477: 1967, 520: 1968, 1966, 541: 3219}, + {465, 465, 6: 2053}, + {11: 3226, 234: 3225, 712: 3230}, + {2: 1736, 1653, 1687, 1654, 7: 1664, 1741, 1680, 1738, 1701, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 1728, 1665, 1674, 1695, 1859, 1788, 1789, 1785, 1747, 1794, 1837, 1839, 1838, 1730, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 1733, 1774, 1673, 1672, 1751, 1714, 1719, 1723, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 1784, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 1720, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 1735, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 1691, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 1652, 1656, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 1852, 1853, 1647, 1858, 1857, 1699, 1860, 1862, 1703, 1767, 1783, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 1873, 1874, 1876, 1870, 1871, 1872, 234: 1908, 315: 2010, 393: 1909, 1649, 1650, 1648, 477: 2009, 505: 3222}, // 1690 - {472, 472}, - {423, 423}, - {228: 3211}, - {230: 2006, 576: 3212}, - {21: 3213}, + {258: 3223}, + {11: 3226, 234: 3225, 712: 3224}, + {474, 474}, + {424, 424}, + {232: 3227}, // 1695 - {422, 422}, - {473, 473}, - {442, 442, 6: 442, 261: 3216}, - {2: 1722, 1639, 1673, 1640, 7: 1650, 1727, 1666, 1724, 1687, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 1714, 1651, 1660, 1681, 1774, 1775, 1771, 1733, 1780, 1716, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 1719, 1760, 1659, 1658, 1737, 1683, 1700, 1705, 1709, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 1770, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 1706, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 1721, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 1677, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 1638, 1642, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 1834, 1835, 1633, 1840, 1839, 1685, 1842, 1844, 1689, 1753, 1769, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 1855, 1856, 1858, 1852, 1853, 1854, 230: 1889, 238: 3217, 389: 1890, 1635, 1636, 1634, 473: 3218}, - {441, 441, 6: 441}, + {234: 2025, 580: 3228}, + {21: 3229}, + {423, 423}, + {475, 475}, + {443, 443, 6: 443, 264: 3232}, // 1700 - {440, 440, 6: 440}, - {254: 3220}, - {2: 1722, 1639, 1673, 1640, 7: 2119, 1727, 1666, 1724, 2124, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 2128, 1651, 2121, 2123, 2137, 2138, 2136, 2132, 2139, 2129, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 2130, 1760, 1659, 2120, 1737, 1683, 1700, 2125, 2127, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 2135, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 2126, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 2131, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 2122, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 2117, 2118, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 2140, 1835, 2116, 1840, 1839, 1685, 1842, 1844, 1689, 2133, 2134, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 2141, 2142, 1858, 1852, 1853, 1854, 2172, 230: 2153, 2112, 2184, 2188, 235: 2169, 2168, 2205, 2179, 243: 2144, 266: 2148, 2187, 290: 2156, 299: 2175, 311: 2189, 2110, 2182, 2204, 2206, 2147, 2146, 2163, 2203, 2183, 2180, 2174, 2178, 2143, 2145, 2181, 2152, 2185, 2193, 2244, 2151, 2194, 2195, 2150, 2173, 2166, 2167, 2217, 2219, 2220, 2221, 2176, 2222, 2201, 2207, 2215, 2216, 2211, 2223, 2224, 2225, 2212, 2227, 2228, 2218, 2213, 2226, 2208, 2214, 2199, 2229, 2230, 2177, 2234, 2190, 2192, 2233, 2239, 2238, 2240, 2237, 2170, 2241, 2236, 2235, 2232, 2186, 2231, 2191, 2196, 2197, 389: 2155, 1635, 1636, 1634, 448: 2171, 2243, 2162, 2157, 2149, 2160, 2158, 2159, 2198, 2210, 2209, 2202, 2200, 2154, 2165, 2242, 2164, 2161, 2115, 2114, 2113, 3221}, - {446, 446, 6: 446, 246: 2253, 248: 2251, 250: 2252, 2250, 2248, 470: 2249, 2247}, - {63: 3182, 254: 1080, 412: 3183, 589: 3181, 619: 3223}, + {2: 1736, 1653, 1687, 1654, 7: 1664, 1741, 1680, 1738, 1701, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 1728, 1665, 1674, 1695, 1859, 1788, 1789, 1785, 1747, 1794, 1837, 1839, 1838, 1730, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 1733, 1774, 1673, 1672, 1751, 1714, 1719, 1723, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 1784, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 1720, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 1735, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 1691, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 1652, 1656, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 1852, 1853, 1647, 1858, 1857, 1699, 1860, 1862, 1703, 1767, 1783, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 1873, 1874, 1876, 1870, 1871, 1872, 234: 1908, 242: 3233, 393: 1909, 1649, 1650, 1648, 477: 3234}, + {442, 442, 6: 442}, + {441, 441, 6: 441}, + {258: 3236}, + {2: 1736, 1653, 1687, 1654, 7: 2140, 1741, 1680, 1738, 2145, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 2149, 1665, 2142, 2144, 1859, 2158, 2159, 2157, 2153, 2160, 1837, 1839, 1838, 2150, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 2151, 1774, 1673, 2141, 1751, 1714, 2146, 2148, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 2156, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 2147, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 2152, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 2143, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 2138, 2139, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 2161, 1853, 2137, 1858, 1857, 1699, 1860, 1862, 1703, 2154, 2155, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 2162, 2163, 1876, 1870, 1871, 1872, 2193, 234: 2174, 2133, 2205, 2209, 239: 2190, 2189, 2226, 2200, 247: 2165, 270: 2169, 272: 2208, 294: 2177, 303: 2196, 315: 2210, 2131, 2203, 2225, 2227, 2168, 2167, 2184, 2224, 2204, 2201, 2195, 2199, 2164, 2166, 2202, 2173, 2206, 2214, 2265, 2172, 2215, 2216, 2171, 2194, 2187, 2188, 2238, 2240, 2241, 2242, 2197, 2243, 2222, 2228, 2236, 2237, 2232, 2244, 2245, 2246, 2233, 2248, 2249, 2239, 2234, 2247, 2229, 2235, 2220, 2250, 2251, 2198, 2255, 2211, 2213, 2254, 2260, 2259, 2261, 2258, 2191, 2262, 2257, 2256, 381: 2253, 2207, 2252, 2212, 2217, 2218, 393: 2176, 1649, 1650, 1648, 452: 2192, 2264, 2183, 2178, 2170, 2181, 2179, 2180, 2219, 2231, 2230, 2223, 2221, 2175, 2186, 2263, 2185, 2182, 2136, 2135, 2134, 3237}, // 1705 - {471, 471, 6: 3194}, - {228: 819, 394: 819, 478: 2409, 499: 2407, 2408, 509: 3225, 3226, 780: 3228, 876: 3227}, - {2: 822, 822, 822, 822, 7: 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 22: 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 230: 822, 822, 822, 822, 235: 822, 822, 822, 822, 243: 822, 255: 822, 266: 822, 822, 269: 822, 290: 822, 299: 822, 311: 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 394: 822, 493: 822, 495: 822, 822, 822}, - {228: 818, 394: 818}, - {228: 3232, 394: 1546, 481: 3234, 3229, 3230, 3231, 488: 3233}, + {447, 447, 6: 447, 250: 2274, 252: 2272, 2273, 2271, 2269, 474: 2270, 2268}, + {65: 3198, 258: 1092, 416: 3199, 592: 3197, 623: 3239}, + {473, 473, 6: 3210}, + {232: 827, 398: 827, 482: 2430, 503: 2428, 2429, 513: 3241, 3242, 784: 3244, 880: 3243}, + {2: 830, 830, 830, 830, 7: 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 22: 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 234: 830, 830, 830, 830, 239: 830, 830, 830, 830, 247: 830, 259: 830, 270: 830, 272: 830, 830, 294: 830, 303: 830, 315: 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 381: 830, 830, 830, 830, 830, 830, 398: 830, 497: 830, 499: 830, 830, 830}, // 1710 - {228: 475, 394: 475}, - {876, 876, 21: 876, 229: 876, 241: 876, 876, 244: 876, 876, 247: 2454, 253: 3258, 514: 2455, 3259, 669: 3257}, - {876, 876, 21: 876, 229: 876, 241: 876, 876, 244: 876, 876, 247: 2454, 514: 2455, 3254}, - {876, 876, 21: 876, 229: 876, 241: 876, 876, 244: 876, 876, 247: 2454, 514: 2455, 3245}, - {394: 1546, 481: 3235, 1547, 1548, 1549}, + {232: 826, 398: 826}, + {232: 3248, 398: 1560, 485: 3250, 3245, 3246, 3247, 492: 3249}, + {232: 477, 398: 477}, + {884, 884, 21: 884, 233: 884, 245: 884, 884, 248: 884, 884, 251: 2475, 257: 3281, 518: 2476, 3282, 673: 3280}, + {884, 884, 21: 884, 233: 884, 245: 884, 884, 248: 884, 884, 251: 2475, 518: 2476, 3277}, // 1715 - {241: 478}, - {241: 477}, - {21: 3236}, - {876, 876, 21: 876, 229: 876, 241: 476, 245: 876, 247: 2454, 514: 2455, 3237}, - {514, 514, 21: 514, 229: 514, 245: 3238, 538: 3239}, + {884, 884, 21: 884, 233: 884, 245: 884, 884, 248: 884, 884, 251: 2475, 518: 2476, 3261}, + {398: 1560, 485: 3251, 1561, 1562, 1563}, + {245: 480}, + {245: 479}, + {21: 3252}, // 1720 - {266: 1624, 318: 2929, 474: 2661, 489: 2928, 582: 3240}, - {480, 480, 21: 480, 229: 480}, - {513, 513, 6: 3241, 21: 513, 54: 3242, 229: 513, 239: 513, 513, 513, 513, 244: 513}, - {266: 1624, 318: 2929, 474: 2661, 489: 2928, 582: 3244}, - {266: 1624, 318: 2929, 474: 2661, 489: 2928, 582: 3243}, + {884, 884, 21: 884, 233: 884, 245: 478, 249: 884, 251: 2475, 518: 2476, 3253}, + {523, 523, 21: 523, 233: 523, 249: 3254, 542: 3255}, + {270: 1638, 322: 2943, 478: 2682, 493: 2942, 586: 3256}, + {482, 482, 21: 482, 233: 482}, + {522, 522, 6: 3257, 21: 522, 56: 3258, 233: 522, 243: 522, 522, 522, 522, 248: 522}, // 1725 - {511, 511, 21: 511, 229: 511, 239: 511, 511, 511, 511, 244: 511}, - {512, 512, 21: 512, 229: 512, 239: 512, 512, 512, 512, 244: 512}, - {514, 514, 21: 514, 229: 514, 241: 514, 514, 244: 514, 3238, 538: 3246}, - {486, 486, 21: 486, 229: 486, 241: 486, 3249, 244: 3248, 551: 3247}, - {481, 481, 21: 481, 229: 481, 241: 628}, + {270: 1638, 322: 2943, 478: 2682, 493: 2942, 586: 3260}, + {270: 1638, 322: 2943, 478: 2682, 493: 2942, 586: 3259}, + {520, 520, 21: 520, 233: 520, 243: 520, 520, 520, 520, 248: 520}, + {521, 521, 21: 521, 233: 521, 243: 521, 521, 521, 521, 248: 521}, + {523, 523, 21: 523, 233: 523, 245: 523, 523, 248: 523, 3254, 542: 3262}, // 1730 - {494: 3253}, - {288: 3250}, - {167: 3251}, - {151: 3252}, - {484, 484, 21: 484, 229: 484, 239: 484, 484, 484}, + {493, 493, 21: 493, 233: 493, 245: 493, 3265, 248: 3264, 555: 3263}, + {483, 483, 21: 483, 233: 483, 245: 636}, + {110: 3270, 498: 3269}, + {292: 3266}, + {110: 3267}, // 1735 - {485, 485, 21: 485, 229: 485, 239: 485, 485, 485}, - {514, 514, 21: 514, 229: 514, 241: 514, 514, 244: 514, 3238, 538: 3255}, - {486, 486, 21: 486, 229: 486, 241: 486, 3249, 244: 3248, 551: 3256}, - {482, 482, 21: 482, 229: 482, 241: 629}, - {115, 115, 21: 115, 229: 115, 239: 115, 115, 115, 115, 244: 115, 115, 247: 115, 249: 2921, 541: 2922, 3283}, + {155: 3268}, + {486, 486, 21: 486, 233: 486, 243: 486, 486, 486}, + {492, 492, 21: 492, 104: 3274, 111: 3275, 233: 492, 243: 492, 492, 492}, + {491, 491, 21: 491, 104: 3271, 111: 3272, 233: 491, 243: 491, 491, 491}, + {489, 489, 21: 489, 233: 489, 243: 489, 489, 489}, // 1740 - {2: 1722, 1639, 1673, 1640, 7: 1650, 1727, 1666, 1724, 1687, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 1714, 1651, 1660, 1681, 1774, 1775, 1771, 1733, 1780, 1716, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 1719, 1760, 1659, 1658, 1737, 1683, 1700, 1705, 1709, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 1770, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 1706, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 1721, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 1677, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 1638, 1642, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 1834, 1835, 1633, 1840, 1839, 1685, 1842, 1844, 1689, 1753, 1769, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 1855, 1856, 1858, 1852, 1853, 1854, 2082, 315: 2078, 389: 1860, 1635, 1636, 1634, 472: 2081, 506: 2080, 2079, 2084, 533: 2075, 555: 3264, 782: 3263, 870: 3262}, - {514, 514, 21: 514, 229: 514, 241: 514, 514, 244: 514, 3238, 538: 3260}, - {486, 486, 21: 486, 229: 486, 241: 486, 3249, 244: 3248, 551: 3261}, - {483, 483, 21: 483, 229: 483, 241: 630}, - {115, 115, 21: 115, 229: 115, 239: 115, 115, 115, 115, 244: 115, 115, 247: 115, 249: 2921, 256: 115, 258: 115, 260: 115, 541: 2922, 3265}, + {102: 3273}, + {487, 487, 21: 487, 233: 487, 243: 487, 487, 487}, + {490, 490, 21: 490, 233: 490, 243: 490, 490, 490}, + {102: 3276}, + {488, 488, 21: 488, 233: 488, 243: 488, 488, 488}, // 1745 - {627, 627, 21: 627, 229: 627, 239: 627, 627, 627, 627, 244: 627, 627, 247: 627, 249: 627}, - {567, 567, 6: 2872, 21: 567, 229: 567, 239: 567, 567, 567, 567, 244: 567, 567, 247: 567, 249: 567, 256: 567, 258: 567, 260: 567}, - {490, 490, 21: 490, 229: 490, 239: 490, 490, 490, 490, 244: 490, 490, 247: 490, 256: 490, 258: 490, 260: 3266, 799: 3268, 850: 3267}, - {404: 3281}, - {1174, 1174, 21: 1174, 229: 1174, 239: 1174, 1174, 1174, 1174, 244: 1174, 1174, 247: 1174, 256: 1174, 258: 3269, 801: 3270}, + {523, 523, 21: 523, 233: 523, 245: 523, 523, 248: 523, 3254, 542: 3278}, + {493, 493, 21: 493, 233: 493, 245: 493, 3265, 248: 3264, 555: 3279}, + {484, 484, 21: 484, 233: 484, 245: 637}, + {116, 116, 21: 116, 233: 116, 243: 116, 116, 116, 116, 248: 116, 116, 251: 116, 256: 2935, 545: 2936, 3309}, + {2: 1736, 1653, 1687, 1654, 7: 1664, 1741, 1680, 1738, 1701, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 1728, 1665, 1674, 1695, 1859, 1788, 1789, 1785, 1747, 1794, 1837, 1839, 1838, 1730, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 1733, 1774, 1673, 1672, 1751, 1714, 1719, 1723, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 1784, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 1720, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 1735, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 1691, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 1652, 1656, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 1852, 1853, 1647, 1858, 1857, 1699, 1860, 1862, 1703, 1767, 1783, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 1873, 1874, 1876, 1870, 1871, 1872, 2102, 319: 2097, 393: 1878, 1649, 1650, 1648, 452: 2101, 476: 2100, 510: 2099, 2098, 2104, 537: 2094, 559: 3287, 786: 3286, 874: 3285}, // 1750 - {489, 489, 21: 489, 229: 489, 239: 489, 489, 489, 489, 244: 489, 489, 247: 489, 256: 489, 258: 489}, - {2: 1722, 1639, 1673, 1640, 7: 2119, 1727, 1666, 1724, 2124, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 2128, 1651, 2121, 2123, 2137, 2138, 2136, 2132, 2139, 2129, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 2130, 1760, 1659, 2120, 1737, 1683, 1700, 2125, 2127, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 2135, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 2126, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 2131, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 2122, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 2117, 2118, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 2140, 1835, 2116, 1840, 1839, 1685, 1842, 1844, 1689, 2133, 2134, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 2141, 2142, 1858, 1852, 1853, 1854, 2172, 230: 2153, 2112, 2184, 2188, 235: 2169, 2168, 2205, 2179, 243: 2144, 266: 2148, 2187, 290: 2156, 299: 2175, 311: 2189, 2110, 2182, 2204, 2206, 2147, 2146, 2163, 2203, 2183, 2180, 2174, 2178, 2143, 2145, 2181, 2152, 2185, 2193, 2244, 2151, 2194, 2195, 2150, 2173, 2166, 2167, 2217, 2219, 2220, 2221, 2176, 2222, 2201, 2207, 2215, 2216, 2211, 2223, 2224, 2225, 2212, 2227, 2228, 2218, 2213, 2226, 2208, 2214, 2199, 2229, 2230, 2177, 2234, 2190, 2192, 2233, 2239, 2238, 2240, 2237, 2170, 2241, 2236, 2235, 2232, 2186, 2231, 2191, 2196, 2197, 389: 2155, 1635, 1636, 1634, 448: 2171, 2243, 2162, 2157, 2149, 2160, 2158, 2159, 2198, 2210, 2209, 2202, 2200, 2154, 2165, 2242, 2164, 2161, 2115, 2114, 2113, 3280}, - {626, 626, 21: 626, 229: 626, 239: 626, 626, 626, 626, 244: 626, 626, 247: 626, 256: 3272, 891: 3271}, - {631, 631, 21: 631, 229: 631, 239: 631, 631, 631, 631, 244: 631, 631, 247: 631}, - {2: 1722, 1639, 1673, 1640, 7: 1650, 1727, 1666, 1724, 1687, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 1714, 1651, 1660, 1681, 1774, 1775, 1771, 1733, 1780, 1716, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 1719, 1760, 1659, 1658, 1737, 1683, 1700, 1705, 1709, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 1770, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 1706, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 1721, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 1677, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 1638, 1642, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 1834, 1835, 1633, 1840, 1839, 1685, 1842, 1844, 1689, 1753, 1769, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 1855, 1856, 1858, 1852, 1853, 1854, 389: 2271, 1635, 1636, 1634, 591: 3275, 750: 3274, 892: 3273}, + {523, 523, 21: 523, 233: 523, 245: 523, 523, 248: 523, 3254, 542: 3283}, + {493, 493, 21: 493, 233: 493, 245: 493, 3265, 248: 3264, 555: 3284}, + {485, 485, 21: 485, 233: 485, 245: 638}, + {116, 116, 21: 116, 233: 116, 243: 116, 116, 116, 116, 248: 116, 116, 251: 116, 256: 2935, 260: 116, 116, 265: 116, 545: 2936, 3288}, + {635, 635, 21: 635, 233: 635, 243: 635, 635, 635, 635, 248: 635, 635, 251: 635, 256: 635}, // 1755 - {625, 625, 6: 3278, 21: 625, 229: 625, 239: 625, 625, 625, 625, 244: 625, 625, 247: 625}, - {624, 624, 6: 624, 21: 624, 229: 624, 239: 624, 624, 624, 624, 244: 624, 624, 247: 624}, - {234: 3276}, - {228: 2272, 752: 3277}, - {622, 622, 6: 622, 21: 622, 229: 622, 239: 622, 622, 622, 622, 244: 622, 622, 247: 622}, + {575, 575, 6: 2886, 21: 575, 233: 575, 243: 575, 575, 575, 575, 248: 575, 575, 251: 575, 256: 575, 260: 575, 575, 265: 575}, + {498, 498, 21: 498, 233: 498, 243: 498, 498, 498, 498, 248: 498, 498, 251: 498, 260: 498, 498, 265: 3289, 803: 3291, 854: 3290}, + {408: 3304}, + {1188, 1188, 21: 1188, 233: 1188, 243: 1188, 1188, 1188, 1188, 248: 1188, 1188, 251: 1188, 260: 1188, 3292, 805: 3293}, + {497, 497, 21: 497, 233: 497, 243: 497, 497, 497, 497, 248: 497, 497, 251: 497, 260: 497, 497}, // 1760 - {2: 1722, 1639, 1673, 1640, 7: 1650, 1727, 1666, 1724, 1687, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 1714, 1651, 1660, 1681, 1774, 1775, 1771, 1733, 1780, 1716, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 1719, 1760, 1659, 1658, 1737, 1683, 1700, 1705, 1709, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 1770, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 1706, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 1721, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 1677, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 1638, 1642, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 1834, 1835, 1633, 1840, 1839, 1685, 1842, 1844, 1689, 1753, 1769, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 1855, 1856, 1858, 1852, 1853, 1854, 389: 2271, 1635, 1636, 1634, 591: 3275, 750: 3279}, - {623, 623, 6: 623, 21: 623, 229: 623, 239: 623, 623, 623, 623, 244: 623, 623, 247: 623}, - {1173, 1173, 21: 1173, 229: 1173, 239: 1173, 1173, 1173, 1173, 244: 1173, 1173, 2253, 1173, 2251, 250: 2252, 2250, 2248, 256: 1173, 470: 2249, 2247}, - {2: 1722, 1639, 1673, 1640, 7: 2119, 1727, 1666, 1724, 2124, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 2128, 1651, 2121, 2123, 2137, 2138, 2136, 2132, 2139, 2129, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 2130, 1760, 1659, 2120, 1737, 1683, 1700, 2125, 2127, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 2135, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 2126, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 2131, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 2122, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 2117, 2118, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 2140, 1835, 2116, 1840, 1839, 1685, 1842, 1844, 1689, 2133, 2134, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 2141, 2142, 1858, 1852, 1853, 1854, 2172, 230: 2153, 2112, 2184, 2188, 235: 2169, 2168, 2205, 2179, 243: 2144, 266: 2148, 2187, 290: 2156, 299: 2175, 311: 2189, 2110, 2182, 2204, 2206, 2147, 2146, 2163, 2203, 2183, 2180, 2174, 2178, 2143, 2145, 2181, 2152, 2185, 2193, 2244, 2151, 2194, 2195, 2150, 2173, 2166, 2167, 2217, 2219, 2220, 2221, 2176, 2222, 2201, 2207, 2215, 2216, 2211, 2223, 2224, 2225, 2212, 2227, 2228, 2218, 2213, 2226, 2208, 2214, 2199, 2229, 2230, 2177, 2234, 2190, 2192, 2233, 2239, 2238, 2240, 2237, 2170, 2241, 2236, 2235, 2232, 2186, 2231, 2191, 2196, 2197, 389: 2155, 1635, 1636, 1634, 448: 2171, 2243, 2162, 2157, 2149, 2160, 2158, 2159, 2198, 2210, 2209, 2202, 2200, 2154, 2165, 2242, 2164, 2161, 2115, 2114, 2113, 2282, 557: 2283, 577: 3282}, - {1175, 1175, 6: 2285, 21: 1175, 229: 1175, 239: 1175, 1175, 1175, 1175, 244: 1175, 1175, 247: 1175, 256: 1175, 258: 1175}, + {2: 1736, 1653, 1687, 1654, 7: 2140, 1741, 1680, 1738, 2145, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 2149, 1665, 2142, 2144, 1859, 2158, 2159, 2157, 2153, 2160, 1837, 1839, 1838, 2150, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 2151, 1774, 1673, 2141, 1751, 1714, 2146, 2148, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 2156, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 2147, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 2152, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 2143, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 2138, 2139, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 2161, 1853, 2137, 1858, 1857, 1699, 1860, 1862, 1703, 2154, 2155, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 2162, 2163, 1876, 1870, 1871, 1872, 2193, 234: 2174, 2133, 2205, 2209, 239: 2190, 2189, 2226, 2200, 247: 2165, 270: 2169, 272: 2208, 294: 2177, 303: 2196, 315: 2210, 2131, 2203, 2225, 2227, 2168, 2167, 2184, 2224, 2204, 2201, 2195, 2199, 2164, 2166, 2202, 2173, 2206, 2214, 2265, 2172, 2215, 2216, 2171, 2194, 2187, 2188, 2238, 2240, 2241, 2242, 2197, 2243, 2222, 2228, 2236, 2237, 2232, 2244, 2245, 2246, 2233, 2248, 2249, 2239, 2234, 2247, 2229, 2235, 2220, 2250, 2251, 2198, 2255, 2211, 2213, 2254, 2260, 2259, 2261, 2258, 2191, 2262, 2257, 2256, 381: 2253, 2207, 2252, 2212, 2217, 2218, 393: 2176, 1649, 1650, 1648, 452: 2192, 2264, 2183, 2178, 2170, 2181, 2179, 2180, 2219, 2231, 2230, 2223, 2221, 2175, 2186, 2263, 2185, 2182, 2136, 2135, 2134, 3303}, + {634, 634, 21: 634, 233: 634, 243: 634, 634, 634, 634, 248: 634, 634, 251: 634, 260: 3295, 895: 3294}, + {639, 639, 21: 639, 233: 639, 243: 639, 639, 639, 639, 248: 639, 639, 251: 639}, + {2: 1736, 1653, 1687, 1654, 7: 1664, 1741, 1680, 1738, 1701, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 1728, 1665, 1674, 1695, 1859, 1788, 1789, 1785, 1747, 1794, 1837, 1839, 1838, 1730, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 1733, 1774, 1673, 1672, 1751, 1714, 1719, 1723, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 1784, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 1720, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 1735, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 1691, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 1652, 1656, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 1852, 1853, 1647, 1858, 1857, 1699, 1860, 1862, 1703, 1767, 1783, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 1873, 1874, 1876, 1870, 1871, 1872, 393: 2292, 1649, 1650, 1648, 594: 3298, 754: 3297, 896: 3296}, + {633, 633, 6: 3301, 21: 633, 233: 633, 243: 633, 633, 633, 633, 248: 633, 633, 251: 633}, // 1765 - {632, 632, 21: 632, 229: 632, 239: 632, 632, 632, 632, 244: 632, 632, 247: 632}, - {514, 514, 21: 514, 229: 514, 239: 514, 514, 514, 514, 244: 514, 3238, 538: 3285}, - {486, 486, 21: 486, 229: 486, 239: 486, 486, 486, 3249, 244: 3248, 551: 3286}, - {628, 628, 21: 628, 229: 628, 239: 628, 628, 628}, - {514, 514, 21: 514, 229: 514, 239: 514, 514, 514, 514, 244: 514, 3238, 538: 3288}, + {632, 632, 6: 632, 21: 632, 233: 632, 243: 632, 632, 632, 632, 248: 632, 632, 251: 632}, + {238: 3299}, + {232: 2293, 756: 3300}, + {630, 630, 6: 630, 21: 630, 233: 630, 243: 630, 630, 630, 630, 248: 630, 630, 251: 630}, + {2: 1736, 1653, 1687, 1654, 7: 1664, 1741, 1680, 1738, 1701, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 1728, 1665, 1674, 1695, 1859, 1788, 1789, 1785, 1747, 1794, 1837, 1839, 1838, 1730, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 1733, 1774, 1673, 1672, 1751, 1714, 1719, 1723, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 1784, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 1720, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 1735, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 1691, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 1652, 1656, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 1852, 1853, 1647, 1858, 1857, 1699, 1860, 1862, 1703, 1767, 1783, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 1873, 1874, 1876, 1870, 1871, 1872, 393: 2292, 1649, 1650, 1648, 594: 3298, 754: 3302}, // 1770 - {486, 486, 21: 486, 229: 486, 239: 486, 486, 486, 3249, 244: 3248, 551: 3289}, - {629, 629, 21: 629, 229: 629, 239: 629, 629, 629}, - {514, 514, 21: 514, 229: 514, 239: 514, 514, 514, 514, 244: 514, 3238, 538: 3291}, - {486, 486, 21: 486, 229: 486, 239: 486, 486, 486, 3249, 244: 3248, 551: 3292}, - {630, 630, 21: 630, 229: 630, 239: 630, 630, 630}, + {631, 631, 6: 631, 21: 631, 233: 631, 243: 631, 631, 631, 631, 248: 631, 631, 251: 631}, + {1187, 1187, 21: 1187, 233: 1187, 243: 1187, 1187, 1187, 1187, 248: 1187, 1187, 2274, 1187, 2272, 2273, 2271, 2269, 260: 1187, 474: 2270, 2268}, + {2: 1736, 1653, 1687, 1654, 7: 2140, 1741, 1680, 1738, 2145, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 2149, 1665, 2142, 2144, 1859, 2158, 2159, 2157, 2153, 2160, 1837, 1839, 1838, 2150, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 2151, 1774, 1673, 2141, 1751, 1714, 2146, 2148, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 2156, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 2147, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 2152, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 2143, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 2138, 2139, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 2161, 1853, 2137, 1858, 1857, 1699, 1860, 1862, 1703, 2154, 2155, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 2162, 2163, 1876, 1870, 1871, 1872, 2193, 234: 2174, 2133, 2205, 2209, 239: 2190, 2189, 2226, 2200, 247: 2165, 270: 2169, 272: 2208, 294: 2177, 303: 2196, 315: 2210, 2131, 2203, 2225, 2227, 2168, 2167, 2184, 2224, 2204, 2201, 2195, 2199, 2164, 2166, 2202, 2173, 2206, 2214, 2265, 2172, 2215, 2216, 2171, 2194, 2187, 2188, 2238, 2240, 2241, 2242, 2197, 2243, 2222, 2228, 2236, 2237, 2232, 2244, 2245, 2246, 2233, 2248, 2249, 2239, 2234, 2247, 2229, 2235, 2220, 2250, 2251, 2198, 2255, 2211, 2213, 2254, 2260, 2259, 2261, 2258, 2191, 2262, 2257, 2256, 381: 2253, 2207, 2252, 2212, 2217, 2218, 393: 2176, 1649, 1650, 1648, 452: 2192, 2264, 2183, 2178, 2170, 2181, 2179, 2180, 2219, 2231, 2230, 2223, 2221, 2175, 2186, 2263, 2185, 2182, 2136, 2135, 2134, 2303, 561: 2304, 581: 3305}, + {1186, 1186, 6: 2306, 21: 1186, 233: 1186, 243: 3307, 1186, 1186, 1186, 248: 1186, 1186, 251: 1186, 260: 1186, 1186, 904: 3306}, + {1189, 1189, 21: 1189, 233: 1189, 243: 1189, 1189, 1189, 1189, 248: 1189, 1189, 251: 1189, 260: 1189, 1189}, // 1775 - {2: 1722, 1639, 1673, 1640, 7: 2119, 1727, 1666, 1724, 2124, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 2128, 1651, 2121, 2123, 2137, 2138, 2136, 2132, 2139, 2129, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 2130, 1760, 1659, 2120, 1737, 1683, 1700, 2125, 2127, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 2135, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 2126, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 2131, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 2122, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 2117, 2118, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 2140, 1835, 2116, 1840, 1839, 1685, 1842, 1844, 1689, 2133, 2134, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 2141, 2142, 1858, 1852, 1853, 1854, 2172, 230: 2153, 2112, 2184, 2188, 235: 2169, 2168, 2205, 2179, 243: 2144, 266: 2148, 2187, 269: 3305, 290: 2156, 299: 2175, 311: 2189, 2110, 2182, 2204, 3307, 2147, 2146, 2163, 2203, 2183, 2180, 2174, 2178, 2143, 2145, 2181, 2152, 2185, 2193, 2244, 2151, 2194, 2195, 2150, 2173, 2166, 2167, 2217, 2219, 2220, 2221, 2176, 2222, 2201, 2207, 2215, 2216, 2211, 2223, 2224, 2225, 2212, 2227, 2228, 2218, 2213, 2226, 2208, 2214, 2199, 2229, 2230, 2177, 2234, 2190, 2192, 2233, 2239, 2238, 2240, 2237, 2170, 2241, 2236, 2235, 2232, 2186, 2231, 2191, 2196, 2197, 389: 3306, 1635, 1636, 1634, 448: 2171, 2243, 2162, 2157, 2149, 2160, 2158, 2159, 2198, 2210, 2209, 2202, 2200, 2154, 2165, 2242, 2164, 2161, 2115, 2114, 2113, 3304, 665: 3308, 790: 3309, 849: 3310}, - {2: 821, 821, 821, 821, 7: 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 22: 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 230: 821, 821, 821, 821, 235: 821, 821, 821, 821, 243: 821, 255: 821, 266: 821, 821, 269: 821, 290: 821, 299: 821, 311: 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 478: 2409, 493: 821, 495: 821, 821, 821, 499: 2407, 2408, 509: 3225, 2411, 3295}, - {2: 662, 662, 662, 662, 7: 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 22: 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 230: 662, 662, 662, 662, 235: 662, 662, 662, 662, 243: 662, 255: 662, 266: 662, 662, 269: 662, 290: 662, 299: 662, 311: 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 493: 662, 495: 2071, 2070, 2069, 570: 3296}, - {2: 496, 496, 496, 496, 7: 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 22: 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 3298, 3299, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 230: 496, 496, 496, 496, 235: 496, 496, 496, 496, 243: 496, 255: 496, 266: 496, 496, 269: 496, 290: 496, 299: 496, 311: 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 493: 496, 852: 3297}, - {2: 498, 498, 498, 498, 7: 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 22: 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 230: 498, 498, 498, 498, 235: 498, 498, 498, 498, 243: 498, 255: 498, 266: 498, 498, 269: 498, 290: 498, 299: 498, 311: 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 493: 3301, 848: 3300}, + {169: 3308}, + {1185, 1185, 21: 1185, 233: 1185, 243: 1185, 1185, 1185, 1185, 248: 1185, 1185, 251: 1185, 260: 1185, 1185}, + {640, 640, 21: 640, 233: 640, 243: 640, 640, 640, 640, 248: 640, 640, 251: 640}, + {523, 523, 21: 523, 233: 523, 243: 523, 523, 523, 523, 248: 523, 3254, 542: 3311}, + {493, 493, 21: 493, 233: 493, 243: 493, 493, 493, 3265, 248: 3264, 555: 3312}, // 1780 - {2: 495, 495, 495, 495, 7: 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 22: 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 230: 495, 495, 495, 495, 235: 495, 495, 495, 495, 243: 495, 255: 495, 266: 495, 495, 269: 495, 290: 495, 299: 495, 311: 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 493: 495}, - {2: 494, 494, 494, 494, 7: 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 22: 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 230: 494, 494, 494, 494, 235: 494, 494, 494, 494, 243: 494, 255: 494, 266: 494, 494, 269: 494, 290: 494, 299: 494, 311: 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 493: 494}, - {2: 493, 493, 493, 493, 7: 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 22: 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 230: 493, 493, 493, 493, 235: 493, 493, 493, 493, 243: 493, 255: 3303, 266: 493, 493, 269: 493, 290: 493, 299: 493, 311: 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 853: 3302}, - {2: 497, 497, 497, 497, 7: 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 22: 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 230: 497, 497, 497, 497, 235: 497, 497, 497, 497, 243: 497, 255: 497, 266: 497, 497, 269: 497, 290: 497, 299: 497, 311: 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497}, - {2: 510, 510, 510, 510, 7: 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 22: 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 230: 510, 510, 510, 510, 235: 510, 510, 510, 510, 243: 510, 266: 510, 510, 269: 510, 290: 510, 299: 510, 311: 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510}, + {636, 636, 21: 636, 233: 636, 243: 636, 636, 636}, + {523, 523, 21: 523, 233: 523, 243: 523, 523, 523, 523, 248: 523, 3254, 542: 3314}, + {493, 493, 21: 493, 233: 493, 243: 493, 493, 493, 3265, 248: 3264, 555: 3315}, + {637, 637, 21: 637, 233: 637, 243: 637, 637, 637}, + {523, 523, 21: 523, 233: 523, 243: 523, 523, 523, 523, 248: 523, 3254, 542: 3317}, // 1785 - {2: 492, 492, 492, 492, 7: 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 22: 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 230: 492, 492, 492, 492, 235: 492, 492, 492, 492, 243: 492, 266: 492, 492, 269: 492, 290: 492, 299: 492, 311: 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492}, - {1183, 1183, 1722, 1639, 1673, 1640, 1183, 1650, 1727, 1666, 1724, 1687, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 1183, 1758, 1698, 1755, 1781, 1701, 1777, 1702, 1714, 1651, 1660, 1681, 1774, 1775, 1771, 1733, 1780, 1716, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 1719, 1760, 1659, 1658, 1737, 1683, 1700, 1705, 1709, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 1770, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 1706, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 1721, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 1677, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 1638, 1642, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 1834, 1835, 1633, 1840, 1839, 1685, 1842, 1844, 1689, 1753, 1769, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 1855, 1856, 1858, 1852, 1853, 1854, 229: 1183, 3320, 234: 3319, 239: 1183, 1183, 1183, 1183, 244: 1183, 1183, 2253, 1183, 2251, 250: 2252, 2250, 2248, 1183, 389: 3318, 1635, 1636, 1634, 470: 2249, 2247, 666: 3317, 3328}, - {1188, 1188, 6: 1188, 21: 1188, 229: 1188, 239: 1188, 1188, 1188, 1188, 244: 1188, 1188, 247: 1188, 253: 1188}, - {859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 229: 859, 859, 859, 234: 859, 859, 859, 859, 239: 859, 859, 859, 859, 244: 859, 859, 859, 859, 859, 250: 859, 859, 859, 859, 859, 261: 859, 268: 859, 859, 288: 859, 290: 3323, 859, 859, 859, 859, 859, 859, 859, 859, 300: 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 382: 859, 399: 859, 859}, - {2: 1722, 1639, 1673, 1640, 7: 1650, 1727, 1666, 1724, 1687, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 1714, 1651, 1660, 1681, 1774, 1775, 1771, 1733, 1780, 1716, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 1719, 1760, 1659, 1658, 1737, 1683, 1700, 1705, 1709, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 1770, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 1706, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 1721, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 1677, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 1638, 1642, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 1834, 1835, 1633, 1840, 1839, 1685, 1842, 1844, 1689, 1753, 1769, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 1855, 1856, 1858, 1852, 1853, 1854, 389: 3313, 1635, 1636, 1634, 696: 2600, 2597, 2599, 2598}, + {493, 493, 21: 493, 233: 493, 243: 493, 493, 493, 3265, 248: 3264, 555: 3318}, + {638, 638, 21: 638, 233: 638, 243: 638, 638, 638}, + {2: 1736, 1653, 1687, 1654, 7: 2140, 1741, 1680, 1738, 2145, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 2149, 1665, 2142, 2144, 1859, 2158, 2159, 2157, 2153, 2160, 1837, 1839, 1838, 2150, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 2151, 1774, 1673, 2141, 1751, 1714, 2146, 2148, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 2156, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 2147, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 2152, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 2143, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 2138, 2139, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 2161, 1853, 2137, 1858, 1857, 1699, 1860, 1862, 1703, 2154, 2155, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 2162, 2163, 1876, 1870, 1871, 1872, 2193, 234: 2174, 2133, 2205, 2209, 239: 2190, 2189, 2226, 2200, 247: 2165, 270: 2169, 272: 2208, 3331, 294: 2177, 303: 2196, 315: 2210, 2131, 2203, 2225, 3333, 2168, 2167, 2184, 2224, 2204, 2201, 2195, 2199, 2164, 2166, 2202, 2173, 2206, 2214, 2265, 2172, 2215, 2216, 2171, 2194, 2187, 2188, 2238, 2240, 2241, 2242, 2197, 2243, 2222, 2228, 2236, 2237, 2232, 2244, 2245, 2246, 2233, 2248, 2249, 2239, 2234, 2247, 2229, 2235, 2220, 2250, 2251, 2198, 2255, 2211, 2213, 2254, 2260, 2259, 2261, 2258, 2191, 2262, 2257, 2256, 381: 2253, 2207, 2252, 2212, 2217, 2218, 393: 3332, 1649, 1650, 1648, 452: 2192, 2264, 2183, 2178, 2170, 2181, 2179, 2180, 2219, 2231, 2230, 2223, 2221, 2175, 2186, 2263, 2185, 2182, 2136, 2135, 2134, 3330, 669: 3334, 794: 3335, 853: 3336}, + {2: 829, 829, 829, 829, 7: 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 22: 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 234: 829, 829, 829, 829, 239: 829, 829, 829, 829, 247: 829, 259: 829, 270: 829, 272: 829, 829, 294: 829, 303: 829, 315: 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 381: 829, 829, 829, 829, 829, 829, 482: 2430, 497: 829, 499: 829, 829, 829, 503: 2428, 2429, 513: 3241, 2432, 3321}, + {2: 670, 670, 670, 670, 7: 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 22: 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 234: 670, 670, 670, 670, 239: 670, 670, 670, 670, 247: 670, 259: 670, 270: 670, 272: 670, 670, 294: 670, 303: 670, 315: 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 381: 670, 670, 670, 670, 670, 670, 497: 670, 499: 2090, 2089, 2088, 574: 3322}, // 1790 - {1177, 1177, 6: 1177, 21: 1177, 229: 1177, 239: 1177, 1177, 1177, 1177, 244: 1177, 1177, 247: 1177, 253: 1177}, - {491, 491, 6: 3311, 21: 491, 229: 491, 239: 491, 491, 491, 491, 244: 491, 491, 247: 491, 253: 491}, - {633, 633, 21: 633, 229: 633, 239: 633, 633, 633, 633, 244: 633, 633, 247: 633, 253: 633}, - {2: 1722, 1639, 1673, 1640, 7: 2119, 1727, 1666, 1724, 2124, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 2128, 1651, 2121, 2123, 2137, 2138, 2136, 2132, 2139, 2129, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 2130, 1760, 1659, 2120, 1737, 1683, 1700, 2125, 2127, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 2135, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 2126, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 2131, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 2122, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 2117, 2118, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 2140, 1835, 2116, 1840, 1839, 1685, 1842, 1844, 1689, 2133, 2134, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 2141, 2142, 1858, 1852, 1853, 1854, 2172, 230: 2153, 2112, 2184, 2188, 235: 2169, 2168, 2205, 2179, 243: 2144, 266: 2148, 2187, 269: 3305, 290: 2156, 299: 2175, 311: 2189, 2110, 2182, 2204, 3307, 2147, 2146, 2163, 2203, 2183, 2180, 2174, 2178, 2143, 2145, 2181, 2152, 2185, 2193, 2244, 2151, 2194, 2195, 2150, 2173, 2166, 2167, 2217, 2219, 2220, 2221, 2176, 2222, 2201, 2207, 2215, 2216, 2211, 2223, 2224, 2225, 2212, 2227, 2228, 2218, 2213, 2226, 2208, 2214, 2199, 2229, 2230, 2177, 2234, 2190, 2192, 2233, 2239, 2238, 2240, 2237, 2170, 2241, 2236, 2235, 2232, 2186, 2231, 2191, 2196, 2197, 389: 3306, 1635, 1636, 1634, 448: 2171, 2243, 2162, 2157, 2149, 2160, 2158, 2159, 2198, 2210, 2209, 2202, 2200, 2154, 2165, 2242, 2164, 2161, 2115, 2114, 2113, 3304, 665: 3312}, - {1176, 1176, 6: 1176, 21: 1176, 229: 1176, 239: 1176, 1176, 1176, 1176, 244: 1176, 1176, 247: 1176, 253: 1176}, + {2: 504, 504, 504, 504, 7: 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 22: 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 3324, 3325, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 234: 504, 504, 504, 504, 239: 504, 504, 504, 504, 247: 504, 259: 504, 270: 504, 272: 504, 504, 294: 504, 303: 504, 315: 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 381: 504, 504, 504, 504, 504, 504, 497: 504, 856: 3323}, + {2: 506, 506, 506, 506, 7: 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 22: 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 234: 506, 506, 506, 506, 239: 506, 506, 506, 506, 247: 506, 259: 506, 270: 506, 272: 506, 506, 294: 506, 303: 506, 315: 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 381: 506, 506, 506, 506, 506, 506, 497: 3327, 852: 3326}, + {2: 503, 503, 503, 503, 7: 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 22: 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 234: 503, 503, 503, 503, 239: 503, 503, 503, 503, 247: 503, 259: 503, 270: 503, 272: 503, 503, 294: 503, 303: 503, 315: 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 381: 503, 503, 503, 503, 503, 503, 497: 503}, + {2: 502, 502, 502, 502, 7: 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 22: 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 234: 502, 502, 502, 502, 239: 502, 502, 502, 502, 247: 502, 259: 502, 270: 502, 272: 502, 502, 294: 502, 303: 502, 315: 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 381: 502, 502, 502, 502, 502, 502, 497: 502}, + {2: 501, 501, 501, 501, 7: 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 22: 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 234: 501, 501, 501, 501, 239: 501, 501, 501, 501, 247: 501, 259: 3329, 270: 501, 272: 501, 501, 294: 501, 303: 501, 315: 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 381: 501, 501, 501, 501, 501, 501, 857: 3328}, // 1795 - {2: 1722, 1639, 1673, 1640, 7: 2119, 1727, 1666, 1724, 2124, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 2128, 1651, 2121, 2123, 2137, 2138, 2136, 2132, 2139, 2129, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 2130, 1760, 1659, 2120, 1737, 1683, 1700, 2125, 2127, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 2135, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 2126, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 2131, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 2122, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 2117, 2118, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 2140, 1835, 2116, 1840, 1839, 1685, 1842, 1844, 1689, 2133, 2134, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 2141, 2142, 1858, 1852, 1853, 1854, 2172, 230: 2153, 2112, 2184, 2188, 235: 2169, 2168, 2205, 2179, 243: 2144, 266: 2148, 2187, 290: 2156, 299: 2175, 311: 2189, 2110, 2182, 2204, 2206, 2147, 2146, 2163, 2203, 2183, 2180, 2174, 2178, 2143, 2145, 2181, 2152, 2185, 2193, 2244, 2151, 2194, 2195, 2150, 2173, 2166, 2167, 2217, 2219, 2220, 2221, 2176, 2222, 2201, 2207, 2215, 2216, 2211, 2223, 2224, 2225, 2212, 2227, 2228, 2218, 2213, 2226, 2208, 2214, 2199, 2229, 2230, 2177, 2234, 2190, 2192, 2233, 2239, 2238, 2240, 2237, 2170, 2241, 2236, 2235, 2232, 2186, 2231, 2191, 2196, 2197, 389: 2155, 1635, 1636, 1634, 448: 2171, 2243, 2162, 2157, 2149, 2160, 2158, 2159, 2198, 2210, 2209, 2202, 2200, 2154, 2165, 2242, 2164, 2161, 2115, 2114, 2113, 3314}, - {246: 2253, 248: 2251, 250: 2252, 2250, 2248, 265: 3315, 470: 2249, 2247}, - {1183, 1183, 1722, 1639, 1673, 1640, 1183, 1650, 1727, 1666, 1724, 1687, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 1183, 1758, 1698, 1755, 1781, 1701, 1777, 1702, 1714, 1651, 1660, 1681, 1774, 1775, 1771, 1733, 1780, 1716, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 1719, 1760, 1659, 1658, 1737, 1683, 1700, 1705, 1709, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 1770, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 1706, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 1721, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 1677, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 1638, 1642, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 1834, 1835, 1633, 1840, 1839, 1685, 1842, 1844, 1689, 1753, 1769, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 1855, 1856, 1858, 1852, 1853, 1854, 229: 1183, 3320, 234: 3319, 239: 1183, 1183, 1183, 1183, 244: 1183, 1183, 247: 1183, 253: 1183, 389: 3318, 1635, 1636, 1634, 666: 3317, 3316}, - {1184, 1184, 6: 1184, 21: 1184, 229: 1184, 239: 1184, 1184, 1184, 1184, 244: 1184, 1184, 247: 1184, 253: 1184}, - {1182, 1182, 6: 1182, 21: 1182, 229: 1182, 239: 1182, 1182, 1182, 1182, 244: 1182, 1182, 247: 1182, 253: 1182}, + {2: 505, 505, 505, 505, 7: 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 22: 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 234: 505, 505, 505, 505, 239: 505, 505, 505, 505, 247: 505, 259: 505, 270: 505, 272: 505, 505, 294: 505, 303: 505, 315: 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 381: 505, 505, 505, 505, 505, 505}, + {2: 519, 519, 519, 519, 7: 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 22: 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 234: 519, 519, 519, 519, 239: 519, 519, 519, 519, 247: 519, 270: 519, 272: 519, 519, 294: 519, 303: 519, 315: 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 381: 519, 519, 519, 519, 519, 519}, + {2: 500, 500, 500, 500, 7: 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 22: 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 234: 500, 500, 500, 500, 239: 500, 500, 500, 500, 247: 500, 270: 500, 272: 500, 500, 294: 500, 303: 500, 315: 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 381: 500, 500, 500, 500, 500, 500}, + {1197, 1197, 1736, 1653, 1687, 1654, 1197, 1664, 1741, 1680, 1738, 1701, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 1197, 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 1728, 1665, 1674, 1695, 1859, 1788, 1789, 1785, 1747, 1794, 1837, 1839, 1838, 1730, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 1733, 1774, 1673, 1672, 1751, 1714, 1719, 1723, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 1784, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 1720, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 1735, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 1691, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 1652, 1656, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 1852, 1853, 1647, 1858, 1857, 1699, 1860, 1862, 1703, 1767, 1783, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 1873, 1874, 1876, 1870, 1871, 1872, 233: 1197, 3346, 238: 3345, 243: 1197, 1197, 1197, 1197, 248: 1197, 1197, 2274, 1197, 2272, 2273, 2271, 2269, 257: 1197, 393: 3344, 1649, 1650, 1648, 474: 2270, 2268, 670: 3343, 3354}, + {1202, 1202, 6: 1202, 21: 1202, 233: 1202, 243: 1202, 1202, 1202, 1202, 248: 1202, 1202, 251: 1202, 257: 1202}, // 1800 - {1181, 1181, 6: 1181, 21: 1181, 229: 1181, 239: 1181, 1181, 1181, 1181, 244: 1181, 1181, 247: 1181, 253: 1181}, - {2: 1722, 1639, 1673, 1640, 7: 1650, 1727, 1666, 1724, 1687, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 1714, 1651, 1660, 1681, 1774, 1775, 1771, 1733, 1780, 1716, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 1719, 1760, 1659, 1658, 1737, 1683, 1700, 1705, 1709, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 1770, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 1706, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 1721, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 1677, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 1638, 1642, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 1834, 1835, 1633, 1840, 1839, 1685, 1842, 1844, 1689, 1753, 1769, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 1855, 1856, 1858, 1852, 1853, 1854, 230: 3322, 389: 3321, 1635, 1636, 1634}, - {1179, 1179, 6: 1179, 21: 1179, 229: 1179, 239: 1179, 1179, 1179, 1179, 244: 1179, 1179, 247: 1179, 253: 1179}, - {1180, 1180, 6: 1180, 21: 1180, 229: 1180, 239: 1180, 1180, 1180, 1180, 244: 1180, 1180, 247: 1180, 253: 1180}, - {1178, 1178, 6: 1178, 21: 1178, 229: 1178, 239: 1178, 1178, 1178, 1178, 244: 1178, 1178, 247: 1178, 253: 1178}, + {867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 233: 867, 867, 867, 238: 867, 867, 867, 867, 243: 867, 867, 867, 867, 248: 867, 867, 867, 867, 867, 867, 867, 867, 257: 867, 867, 264: 867, 271: 867, 273: 867, 292: 867, 294: 3349, 867, 867, 867, 867, 867, 867, 867, 867, 304: 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 380: 867, 403: 867, 867}, + {2: 1736, 1653, 1687, 1654, 7: 1664, 1741, 1680, 1738, 1701, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 1728, 1665, 1674, 1695, 1859, 1788, 1789, 1785, 1747, 1794, 1837, 1839, 1838, 1730, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 1733, 1774, 1673, 1672, 1751, 1714, 1719, 1723, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 1784, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 1720, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 1735, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 1691, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 1652, 1656, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 1852, 1853, 1647, 1858, 1857, 1699, 1860, 1862, 1703, 1767, 1783, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 1873, 1874, 1876, 1870, 1871, 1872, 393: 3339, 1649, 1650, 1648, 700: 2621, 2618, 2620, 2619}, + {1191, 1191, 6: 1191, 21: 1191, 233: 1191, 243: 1191, 1191, 1191, 1191, 248: 1191, 1191, 251: 1191, 257: 1191}, + {499, 499, 6: 3337, 21: 499, 233: 499, 243: 499, 499, 499, 499, 248: 499, 499, 251: 499, 257: 499}, + {641, 641, 21: 641, 233: 641, 243: 641, 641, 641, 641, 248: 641, 641, 251: 641, 257: 641}, // 1805 - {2: 1722, 1639, 1673, 1640, 7: 1650, 1727, 1666, 1724, 1687, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 1714, 1651, 1660, 1681, 1774, 1775, 1771, 1733, 1780, 1716, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 1719, 1760, 1659, 1658, 1737, 1683, 1700, 1705, 1709, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 1770, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 1706, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 1721, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 1677, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 1638, 1642, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 1834, 1835, 1633, 1840, 1839, 1685, 1842, 1844, 1689, 1753, 1769, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 1855, 1856, 1858, 1852, 1853, 1854, 269: 3324, 389: 3325, 1635, 1636, 1634}, - {1187, 1187, 6: 1187, 21: 1187, 229: 1187, 239: 1187, 1187, 1187, 1187, 244: 1187, 1187, 247: 1187, 253: 1187}, - {858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 229: 858, 858, 858, 234: 858, 858, 858, 858, 239: 858, 858, 858, 858, 244: 858, 858, 858, 858, 858, 250: 858, 858, 858, 858, 858, 261: 858, 268: 858, 858, 288: 858, 290: 3326, 858, 858, 858, 858, 858, 858, 858, 858, 300: 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 382: 858, 399: 858, 858}, - {2: 1722, 1639, 1673, 1640, 7: 1650, 1727, 1666, 1724, 1687, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 1714, 1651, 1660, 1681, 1774, 1775, 1771, 1733, 1780, 1716, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 1719, 1760, 1659, 1658, 1737, 1683, 1700, 1705, 1709, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 1770, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 1706, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 1721, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 1677, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 1638, 1642, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 1834, 1835, 1633, 1840, 1839, 1685, 1842, 1844, 1689, 1753, 1769, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 1855, 1856, 1858, 1852, 1853, 1854, 269: 3327, 389: 2745, 1635, 1636, 1634}, - {1186, 1186, 6: 1186, 21: 1186, 229: 1186, 239: 1186, 1186, 1186, 1186, 244: 1186, 1186, 247: 1186, 253: 1186}, + {2: 1736, 1653, 1687, 1654, 7: 2140, 1741, 1680, 1738, 2145, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 2149, 1665, 2142, 2144, 1859, 2158, 2159, 2157, 2153, 2160, 1837, 1839, 1838, 2150, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 2151, 1774, 1673, 2141, 1751, 1714, 2146, 2148, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 2156, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 2147, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 2152, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 2143, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 2138, 2139, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 2161, 1853, 2137, 1858, 1857, 1699, 1860, 1862, 1703, 2154, 2155, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 2162, 2163, 1876, 1870, 1871, 1872, 2193, 234: 2174, 2133, 2205, 2209, 239: 2190, 2189, 2226, 2200, 247: 2165, 270: 2169, 272: 2208, 3331, 294: 2177, 303: 2196, 315: 2210, 2131, 2203, 2225, 3333, 2168, 2167, 2184, 2224, 2204, 2201, 2195, 2199, 2164, 2166, 2202, 2173, 2206, 2214, 2265, 2172, 2215, 2216, 2171, 2194, 2187, 2188, 2238, 2240, 2241, 2242, 2197, 2243, 2222, 2228, 2236, 2237, 2232, 2244, 2245, 2246, 2233, 2248, 2249, 2239, 2234, 2247, 2229, 2235, 2220, 2250, 2251, 2198, 2255, 2211, 2213, 2254, 2260, 2259, 2261, 2258, 2191, 2262, 2257, 2256, 381: 2253, 2207, 2252, 2212, 2217, 2218, 393: 3332, 1649, 1650, 1648, 452: 2192, 2264, 2183, 2178, 2170, 2181, 2179, 2180, 2219, 2231, 2230, 2223, 2221, 2175, 2186, 2263, 2185, 2182, 2136, 2135, 2134, 3330, 669: 3338}, + {1190, 1190, 6: 1190, 21: 1190, 233: 1190, 243: 1190, 1190, 1190, 1190, 248: 1190, 1190, 251: 1190, 257: 1190}, + {2: 1736, 1653, 1687, 1654, 7: 2140, 1741, 1680, 1738, 2145, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 2149, 1665, 2142, 2144, 1859, 2158, 2159, 2157, 2153, 2160, 1837, 1839, 1838, 2150, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 2151, 1774, 1673, 2141, 1751, 1714, 2146, 2148, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 2156, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 2147, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 2152, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 2143, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 2138, 2139, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 2161, 1853, 2137, 1858, 1857, 1699, 1860, 1862, 1703, 2154, 2155, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 2162, 2163, 1876, 1870, 1871, 1872, 2193, 234: 2174, 2133, 2205, 2209, 239: 2190, 2189, 2226, 2200, 247: 2165, 270: 2169, 272: 2208, 294: 2177, 303: 2196, 315: 2210, 2131, 2203, 2225, 2227, 2168, 2167, 2184, 2224, 2204, 2201, 2195, 2199, 2164, 2166, 2202, 2173, 2206, 2214, 2265, 2172, 2215, 2216, 2171, 2194, 2187, 2188, 2238, 2240, 2241, 2242, 2197, 2243, 2222, 2228, 2236, 2237, 2232, 2244, 2245, 2246, 2233, 2248, 2249, 2239, 2234, 2247, 2229, 2235, 2220, 2250, 2251, 2198, 2255, 2211, 2213, 2254, 2260, 2259, 2261, 2258, 2191, 2262, 2257, 2256, 381: 2253, 2207, 2252, 2212, 2217, 2218, 393: 2176, 1649, 1650, 1648, 452: 2192, 2264, 2183, 2178, 2170, 2181, 2179, 2180, 2219, 2231, 2230, 2223, 2221, 2175, 2186, 2263, 2185, 2182, 2136, 2135, 2134, 3340}, + {250: 2274, 252: 2272, 2273, 2271, 2269, 269: 3341, 474: 2270, 2268}, + {1197, 1197, 1736, 1653, 1687, 1654, 1197, 1664, 1741, 1680, 1738, 1701, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 1197, 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 1728, 1665, 1674, 1695, 1859, 1788, 1789, 1785, 1747, 1794, 1837, 1839, 1838, 1730, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 1733, 1774, 1673, 1672, 1751, 1714, 1719, 1723, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 1784, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 1720, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 1735, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 1691, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 1652, 1656, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 1852, 1853, 1647, 1858, 1857, 1699, 1860, 1862, 1703, 1767, 1783, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 1873, 1874, 1876, 1870, 1871, 1872, 233: 1197, 3346, 238: 3345, 243: 1197, 1197, 1197, 1197, 248: 1197, 1197, 251: 1197, 257: 1197, 393: 3344, 1649, 1650, 1648, 670: 3343, 3342}, // 1810 - {1185, 1185, 6: 1185, 21: 1185, 229: 1185, 239: 1185, 1185, 1185, 1185, 244: 1185, 1185, 247: 1185, 253: 1185}, - {2: 1722, 1639, 1673, 1640, 7: 1650, 1727, 1666, 1724, 1687, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 1714, 1651, 1660, 1681, 1774, 1775, 1771, 1733, 1780, 1716, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 1719, 1760, 1659, 1658, 1737, 1683, 1700, 1705, 1709, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 1770, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 1706, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 1721, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 1677, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 1638, 1642, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 1834, 1835, 1633, 1840, 1839, 1685, 1842, 1844, 1689, 1753, 1769, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 1855, 1856, 1858, 1852, 1853, 1854, 230: 1889, 389: 1890, 1635, 1636, 1634, 473: 3330}, - {634, 634}, - {635, 635}, - {1428, 1428, 24: 3351, 246: 3350, 402: 3353, 504: 3352}, + {1198, 1198, 6: 1198, 21: 1198, 233: 1198, 243: 1198, 1198, 1198, 1198, 248: 1198, 1198, 251: 1198, 257: 1198}, + {1196, 1196, 6: 1196, 21: 1196, 233: 1196, 243: 1196, 1196, 1196, 1196, 248: 1196, 1196, 251: 1196, 257: 1196}, + {1195, 1195, 6: 1195, 21: 1195, 233: 1195, 243: 1195, 1195, 1195, 1195, 248: 1195, 1195, 251: 1195, 257: 1195}, + {2: 1736, 1653, 1687, 1654, 7: 1664, 1741, 1680, 1738, 1701, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 1728, 1665, 1674, 1695, 1859, 1788, 1789, 1785, 1747, 1794, 1837, 1839, 1838, 1730, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 1733, 1774, 1673, 1672, 1751, 1714, 1719, 1723, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 1784, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 1720, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 1735, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 1691, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 1652, 1656, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 1852, 1853, 1647, 1858, 1857, 1699, 1860, 1862, 1703, 1767, 1783, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 1873, 1874, 1876, 1870, 1871, 1872, 234: 3348, 393: 3347, 1649, 1650, 1648}, + {1193, 1193, 6: 1193, 21: 1193, 233: 1193, 243: 1193, 1193, 1193, 1193, 248: 1193, 1193, 251: 1193, 257: 1193}, // 1815 - {24: 3342, 578: 3343}, - {504: 3341}, - {1418, 1418}, - {640, 640}, - {2: 1722, 1639, 1673, 1640, 7: 1650, 1727, 1666, 1724, 1687, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 1714, 1651, 1660, 1681, 1774, 1775, 1771, 1733, 1780, 1716, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 1719, 1760, 1659, 1658, 1737, 1683, 1700, 1705, 1709, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 3338, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 1770, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 1706, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 1721, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 1677, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 1638, 1642, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 1834, 1835, 1633, 1840, 1839, 1685, 1842, 1844, 1689, 1753, 1769, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 1855, 1856, 1858, 1852, 1853, 1854, 230: 1889, 389: 1890, 1635, 1636, 1634, 473: 3339}, + {1194, 1194, 6: 1194, 21: 1194, 233: 1194, 243: 1194, 1194, 1194, 1194, 248: 1194, 1194, 251: 1194, 257: 1194}, + {1192, 1192, 6: 1192, 21: 1192, 233: 1192, 243: 1192, 1192, 1192, 1192, 248: 1192, 1192, 251: 1192, 257: 1192}, + {2: 1736, 1653, 1687, 1654, 7: 1664, 1741, 1680, 1738, 1701, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 1728, 1665, 1674, 1695, 1859, 1788, 1789, 1785, 1747, 1794, 1837, 1839, 1838, 1730, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 1733, 1774, 1673, 1672, 1751, 1714, 1719, 1723, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 1784, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 1720, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 1735, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 1691, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 1652, 1656, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 1852, 1853, 1647, 1858, 1857, 1699, 1860, 1862, 1703, 1767, 1783, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 1873, 1874, 1876, 1870, 1871, 1872, 273: 3350, 393: 3351, 1649, 1650, 1648}, + {1201, 1201, 6: 1201, 21: 1201, 233: 1201, 243: 1201, 1201, 1201, 1201, 248: 1201, 1201, 251: 1201, 257: 1201}, + {866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 233: 866, 866, 866, 238: 866, 866, 866, 866, 243: 866, 866, 866, 866, 248: 866, 866, 866, 866, 866, 866, 866, 866, 257: 866, 866, 264: 866, 271: 866, 273: 866, 292: 866, 294: 3352, 866, 866, 866, 866, 866, 866, 866, 866, 304: 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 380: 866, 403: 866, 866}, // 1820 - {1095, 1095, 1722, 1639, 1673, 1640, 7: 1650, 1727, 1666, 1724, 1687, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 1714, 1651, 1660, 1681, 1774, 1775, 1771, 1733, 1780, 1716, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 1719, 1760, 1659, 1658, 1737, 1683, 1700, 1705, 1709, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 1770, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 1706, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 1721, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 1677, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 1638, 1642, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 1834, 1835, 1633, 1840, 1839, 1685, 1842, 1844, 1689, 1753, 1769, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 1855, 1856, 1858, 1852, 1853, 1854, 230: 1889, 389: 1890, 1635, 1636, 1634, 473: 3340}, - {636, 636}, - {637, 637}, - {1419, 1419}, - {578: 3346}, + {2: 1736, 1653, 1687, 1654, 7: 1664, 1741, 1680, 1738, 1701, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 1728, 1665, 1674, 1695, 1859, 1788, 1789, 1785, 1747, 1794, 1837, 1839, 1838, 1730, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 1733, 1774, 1673, 1672, 1751, 1714, 1719, 1723, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 1784, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 1720, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 1735, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 1691, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 1652, 1656, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 1852, 1853, 1647, 1858, 1857, 1699, 1860, 1862, 1703, 1767, 1783, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 1873, 1874, 1876, 1870, 1871, 1872, 273: 3353, 393: 2759, 1649, 1650, 1648}, + {1200, 1200, 6: 1200, 21: 1200, 233: 1200, 243: 1200, 1200, 1200, 1200, 248: 1200, 1200, 251: 1200, 257: 1200}, + {1199, 1199, 6: 1199, 21: 1199, 233: 1199, 243: 1199, 1199, 1199, 1199, 248: 1199, 1199, 251: 1199, 257: 1199}, + {2: 1736, 1653, 1687, 1654, 7: 1664, 1741, 1680, 1738, 1701, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 1728, 1665, 1674, 1695, 1859, 1788, 1789, 1785, 1747, 1794, 1837, 1839, 1838, 1730, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 1733, 1774, 1673, 1672, 1751, 1714, 1719, 1723, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 1784, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 1720, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 1735, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 1691, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 1652, 1656, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 1852, 1853, 1647, 1858, 1857, 1699, 1860, 1862, 1703, 1767, 1783, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 1873, 1874, 1876, 1870, 1871, 1872, 234: 1908, 393: 1909, 1649, 1650, 1648, 477: 3356}, + {642, 642}, // 1825 - {24: 3344}, - {504: 3345}, - {1421, 1421}, - {24: 3347, 504: 3348}, - {504: 3349}, + {643, 643}, + {1442, 1442, 24: 3377, 250: 3376, 406: 3379, 508: 3378}, + {24: 3368, 582: 3369}, + {508: 3367}, + {1432, 1432}, // 1830 - {1420, 1420}, - {1422, 1422}, - {24: 3358, 578: 3359}, - {504: 3357}, - {1423, 1423}, + {648, 648}, + {2: 1736, 1653, 1687, 1654, 7: 1664, 1741, 1680, 1738, 1701, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 1728, 1665, 1674, 1695, 1859, 1788, 1789, 1785, 1747, 1794, 1837, 1839, 1838, 1730, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 1733, 1774, 1673, 1672, 1751, 1714, 1719, 1723, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 3364, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 1784, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 1720, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 1735, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 1691, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 1652, 1656, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 1852, 1853, 1647, 1858, 1857, 1699, 1860, 1862, 1703, 1767, 1783, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 1873, 1874, 1876, 1870, 1871, 1872, 234: 1908, 393: 1909, 1649, 1650, 1648, 477: 3365}, + {1107, 1107, 1736, 1653, 1687, 1654, 7: 1664, 1741, 1680, 1738, 1701, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 1728, 1665, 1674, 1695, 1859, 1788, 1789, 1785, 1747, 1794, 1837, 1839, 1838, 1730, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 1733, 1774, 1673, 1672, 1751, 1714, 1719, 1723, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 1784, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 1720, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 1735, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 1691, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 1652, 1656, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 1852, 1853, 1647, 1858, 1857, 1699, 1860, 1862, 1703, 1767, 1783, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 1873, 1874, 1876, 1870, 1871, 1872, 234: 1908, 393: 1909, 1649, 1650, 1648, 477: 3366}, + {644, 644}, + {645, 645}, // 1835 - {2: 1722, 1639, 1673, 1640, 7: 1650, 1727, 1666, 1724, 1687, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 1714, 1651, 1660, 1681, 1774, 1775, 1771, 1733, 1780, 1716, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 1719, 1760, 1659, 1658, 1737, 1683, 1700, 1705, 1709, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 3354, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 1770, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 1706, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 1721, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 1677, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 1638, 1642, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 1834, 1835, 1633, 1840, 1839, 1685, 1842, 1844, 1689, 1753, 1769, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 1855, 1856, 1858, 1852, 1853, 1854, 230: 1889, 389: 1890, 1635, 1636, 1634, 473: 3355}, - {1095, 1095, 1722, 1639, 1673, 1640, 7: 1650, 1727, 1666, 1724, 1687, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 1714, 1651, 1660, 1681, 1774, 1775, 1771, 1733, 1780, 1716, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 1719, 1760, 1659, 1658, 1737, 1683, 1700, 1705, 1709, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 1770, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 1706, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 1721, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 1677, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 1638, 1642, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 1834, 1835, 1633, 1840, 1839, 1685, 1842, 1844, 1689, 1753, 1769, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 1855, 1856, 1858, 1852, 1853, 1854, 230: 1889, 389: 1890, 1635, 1636, 1634, 473: 3356}, - {638, 638}, - {639, 639}, - {1424, 1424}, + {1433, 1433}, + {582: 3372}, + {24: 3370}, + {508: 3371}, + {1435, 1435}, // 1840 - {578: 3362}, - {24: 3360}, - {504: 3361}, - {1426, 1426}, - {24: 3363, 504: 3364}, + {24: 3373, 508: 3374}, + {508: 3375}, + {1434, 1434}, + {1436, 1436}, + {24: 3384, 582: 3385}, // 1845 - {504: 3365}, - {1425, 1425}, - {1427, 1427}, - {2: 1722, 1639, 1673, 1640, 7: 1650, 1727, 1666, 1724, 1687, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 1714, 1651, 1660, 1681, 1774, 1775, 1771, 1733, 1780, 1716, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 1719, 1760, 1659, 1658, 1737, 1683, 1700, 1705, 1709, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 1770, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 1706, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 1721, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 1677, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 1638, 1642, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 1834, 1835, 1633, 1840, 1839, 1685, 1842, 1844, 1689, 1753, 1769, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 1855, 1856, 1858, 1852, 1853, 1854, 389: 3367, 1635, 1636, 1634}, - {644, 644}, + {508: 3383}, + {1437, 1437}, + {2: 1736, 1653, 1687, 1654, 7: 1664, 1741, 1680, 1738, 1701, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 1728, 1665, 1674, 1695, 1859, 1788, 1789, 1785, 1747, 1794, 1837, 1839, 1838, 1730, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 1733, 1774, 1673, 1672, 1751, 1714, 1719, 1723, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 3380, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 1784, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 1720, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 1735, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 1691, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 1652, 1656, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 1852, 1853, 1647, 1858, 1857, 1699, 1860, 1862, 1703, 1767, 1783, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 1873, 1874, 1876, 1870, 1871, 1872, 234: 1908, 393: 1909, 1649, 1650, 1648, 477: 3381}, + {1107, 1107, 1736, 1653, 1687, 1654, 7: 1664, 1741, 1680, 1738, 1701, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 1728, 1665, 1674, 1695, 1859, 1788, 1789, 1785, 1747, 1794, 1837, 1839, 1838, 1730, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 1733, 1774, 1673, 1672, 1751, 1714, 1719, 1723, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 1784, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 1720, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 1735, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 1691, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 1652, 1656, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 1852, 1853, 1647, 1858, 1857, 1699, 1860, 1862, 1703, 1767, 1783, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 1873, 1874, 1876, 1870, 1871, 1872, 234: 1908, 393: 1909, 1649, 1650, 1648, 477: 3382}, + {646, 646}, // 1850 - {648, 648, 240: 3369}, - {312: 2256, 449: 3371, 877: 3370}, - {647, 647, 6: 3372}, - {646, 646, 6: 646}, - {312: 2256, 449: 3373}, + {647, 647}, + {1438, 1438}, + {582: 3388}, + {24: 3386}, + {508: 3387}, // 1855 - {645, 645, 6: 645}, - {253: 3375}, - {230: 3377, 312: 2256, 449: 3378, 843: 3376}, - {651, 651}, - {650, 650}, + {1440, 1440}, + {24: 3389, 508: 3390}, + {508: 3391}, + {1439, 1439}, + {1441, 1441}, // 1860 - {649, 649}, - {2: 927, 927, 927, 927, 7: 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 22: 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 513: 3380, 680: 3381}, - {2: 926, 926, 926, 926, 7: 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 22: 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926}, - {2: 1722, 1639, 1673, 1640, 7: 1650, 1727, 1666, 1724, 1687, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 1714, 1651, 1660, 1681, 1774, 1775, 1771, 1733, 1780, 1716, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 1719, 1760, 1659, 1658, 1737, 1683, 1700, 1705, 1709, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 1770, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 1706, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 1721, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 1677, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 1638, 1642, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 1834, 1835, 1633, 1840, 1839, 1685, 1842, 1844, 1689, 1753, 1769, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 1855, 1856, 1858, 1852, 1853, 1854, 389: 1860, 1635, 1636, 1634, 472: 3382}, - {79: 3388, 228: 3383, 257: 3387, 321: 3389, 394: 1546, 481: 3385, 1547, 1548, 1549, 488: 1552, 490: 1551, 3386, 622: 3384, 679: 3390}, + {2: 1736, 1653, 1687, 1654, 7: 1664, 1741, 1680, 1738, 1701, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 1728, 1665, 1674, 1695, 1859, 1788, 1789, 1785, 1747, 1794, 1837, 1839, 1838, 1730, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 1733, 1774, 1673, 1672, 1751, 1714, 1719, 1723, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 1784, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 1720, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 1735, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 1691, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 1652, 1656, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 1852, 1853, 1647, 1858, 1857, 1699, 1860, 1862, 1703, 1767, 1783, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 1873, 1874, 1876, 1870, 1871, 1872, 393: 3393, 1649, 1650, 1648}, + {652, 652}, + {656, 656, 244: 3395}, + {316: 2277, 453: 3397, 881: 3396}, + {655, 655, 6: 3398}, // 1865 - {2: 1722, 1639, 1673, 1640, 7: 1650, 1727, 1666, 1724, 1687, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 1432, 1758, 1698, 1755, 1781, 1701, 1777, 1702, 1714, 1651, 1660, 1681, 1774, 1775, 1771, 1733, 1780, 1716, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 1719, 1760, 1659, 1658, 1737, 1683, 1700, 1705, 1709, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 1770, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 1706, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 1721, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 1677, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 1638, 1642, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 1834, 1835, 1633, 1840, 1839, 1685, 1842, 1844, 1689, 1753, 1769, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 1855, 1856, 1858, 1852, 1853, 1854, 389: 1928, 1635, 1636, 1634, 394: 1546, 479: 1929, 481: 3410, 1547, 1548, 1549, 523: 1930, 633: 3409}, - {228: 3400, 616: 3399, 747: 3398}, - {919, 919, 229: 919, 241: 477}, - {918, 918, 229: 918}, - {904, 904, 1722, 1639, 1673, 1640, 904, 1650, 1727, 1666, 1724, 1687, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 1714, 1651, 1660, 1681, 1774, 1775, 1771, 1733, 1780, 1716, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 1719, 1760, 1659, 1658, 1737, 1683, 1700, 1705, 1709, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 1770, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 1706, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 1721, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 1677, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 1638, 1642, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 1834, 1835, 1633, 1840, 1839, 1685, 1842, 1844, 1689, 1753, 1769, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 1855, 1856, 1858, 1852, 1853, 1854, 229: 904, 389: 1928, 1635, 1636, 1634, 479: 3392, 635: 3393, 771: 3391}, + {654, 654, 6: 654}, + {316: 2277, 453: 3399}, + {653, 653, 6: 653}, + {257: 3401}, + {234: 3403, 316: 2277, 453: 3404, 847: 3402}, // 1870 - {228: 916}, - {228: 915}, - {899, 899}, - {917, 917, 6: 3396, 229: 917}, - {254: 3394}, + {659, 659}, + {658, 658}, + {657, 657}, + {2: 935, 935, 935, 935, 7: 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 22: 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 517: 3406, 684: 3407}, + {2: 934, 934, 934, 934, 7: 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 22: 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934}, // 1875 - {903, 903, 6: 903, 229: 903}, - {2: 1722, 1639, 1673, 1640, 7: 2119, 1727, 1666, 1724, 2124, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 2128, 1651, 2121, 2123, 2137, 2138, 2136, 2132, 2139, 2129, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 2130, 1760, 1659, 2120, 1737, 1683, 1700, 2125, 2127, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 2135, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 2126, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 2131, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 2122, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 2117, 2118, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 2140, 1835, 2116, 1840, 1839, 1685, 1842, 1844, 1689, 2133, 2134, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 2141, 2142, 1858, 1852, 1853, 1854, 2172, 230: 2153, 2112, 2184, 2188, 235: 2169, 2168, 2205, 2179, 243: 2144, 266: 2148, 2187, 290: 2156, 299: 2175, 311: 2189, 2110, 2182, 2204, 2206, 2147, 2146, 2163, 2203, 2183, 2180, 2174, 2178, 2143, 2145, 2181, 2152, 2185, 2193, 2244, 2151, 2194, 2195, 2150, 2173, 2166, 2167, 2217, 2219, 2220, 2221, 2176, 2222, 2201, 2207, 2215, 2216, 2211, 2223, 2224, 2225, 2212, 2227, 2228, 2218, 2213, 2226, 2208, 2214, 2199, 2229, 2230, 2177, 2234, 2190, 2192, 2233, 2239, 2238, 2240, 2237, 2170, 2241, 2236, 2235, 2232, 2186, 2231, 2191, 2196, 2197, 389: 2155, 1635, 1636, 1634, 448: 2171, 2243, 2162, 2157, 2149, 2160, 2158, 2159, 2198, 2210, 2209, 2202, 2200, 2154, 2165, 2242, 2164, 2161, 2115, 2114, 2113, 3395}, - {905, 905, 6: 905, 229: 905, 246: 2253, 248: 2251, 250: 2252, 2250, 2248, 470: 2249, 2247}, - {2: 1722, 1639, 1673, 1640, 7: 1650, 1727, 1666, 1724, 1687, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 1714, 1651, 1660, 1681, 1774, 1775, 1771, 1733, 1780, 1716, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 1719, 1760, 1659, 1658, 1737, 1683, 1700, 1705, 1709, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 1770, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 1706, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 1721, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 1677, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 1638, 1642, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 1834, 1835, 1633, 1840, 1839, 1685, 1842, 1844, 1689, 1753, 1769, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 1855, 1856, 1858, 1852, 1853, 1854, 389: 1928, 1635, 1636, 1634, 479: 3392, 635: 3397}, - {902, 902, 6: 902, 229: 902}, + {2: 1736, 1653, 1687, 1654, 7: 1664, 1741, 1680, 1738, 1701, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 1728, 1665, 1674, 1695, 1859, 1788, 1789, 1785, 1747, 1794, 1837, 1839, 1838, 1730, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 1733, 1774, 1673, 1672, 1751, 1714, 1719, 1723, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 1784, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 1720, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 1735, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 1691, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 1652, 1656, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 1852, 1853, 1647, 1858, 1857, 1699, 1860, 1862, 1703, 1767, 1783, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 1873, 1874, 1876, 1870, 1871, 1872, 393: 1878, 1649, 1650, 1648, 476: 3408}, + {80: 3414, 232: 3409, 262: 3413, 325: 3415, 398: 1560, 485: 3411, 1561, 1562, 1563, 492: 1566, 494: 1565, 3412, 626: 3410, 683: 3416}, + {2: 1736, 1653, 1687, 1654, 7: 1664, 1741, 1680, 1738, 1701, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 1446, 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 1728, 1665, 1674, 1695, 1859, 1788, 1789, 1785, 1747, 1794, 1837, 1839, 1838, 1730, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 1733, 1774, 1673, 1672, 1751, 1714, 1719, 1723, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 1784, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 1720, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 1735, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 1691, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 1652, 1656, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 1852, 1853, 1647, 1858, 1857, 1699, 1860, 1862, 1703, 1767, 1783, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 1873, 1874, 1876, 1870, 1871, 1872, 393: 1947, 1649, 1650, 1648, 398: 1560, 483: 1948, 485: 3436, 1561, 1562, 1563, 528: 1949, 637: 3435}, + {232: 3426, 619: 3425, 751: 3424}, + {927, 927, 233: 927, 245: 479}, // 1880 - {921, 921, 6: 3407, 229: 921}, - {914, 914, 6: 914, 229: 914}, - {2: 1722, 1639, 1673, 1640, 7: 2119, 1727, 1666, 1724, 2124, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 911, 1758, 1698, 1755, 1781, 1701, 1777, 1702, 2128, 1651, 2121, 2123, 2137, 2138, 2136, 2132, 2139, 2129, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 2130, 1760, 1659, 2120, 1737, 1683, 1700, 2125, 2127, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 2135, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 2126, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 2131, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 2122, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 2117, 2118, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 2140, 1835, 2116, 1840, 1839, 1685, 1842, 1844, 1689, 2133, 2134, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 2141, 2142, 1858, 1852, 1853, 1854, 2172, 230: 2153, 2112, 2184, 2188, 235: 2169, 2168, 2205, 3157, 243: 2144, 266: 2148, 2187, 290: 2156, 299: 2175, 311: 2189, 2110, 2182, 2204, 2206, 2147, 2146, 2163, 2203, 2183, 2180, 2174, 2178, 2143, 2145, 2181, 2152, 2185, 2193, 2244, 2151, 2194, 2195, 2150, 2173, 2166, 2167, 2217, 2219, 2220, 2221, 2176, 2222, 2201, 2207, 2215, 2216, 2211, 2223, 2224, 2225, 2212, 2227, 2228, 2218, 2213, 2226, 2208, 2214, 2199, 2229, 2230, 2177, 2234, 2190, 2192, 2233, 2239, 2238, 2240, 2237, 2170, 2241, 2236, 2235, 2232, 2186, 2231, 2191, 2196, 2197, 389: 2155, 1635, 1636, 1634, 448: 2171, 2243, 2162, 2157, 2149, 2160, 2158, 2159, 2198, 2210, 2209, 2202, 2200, 2154, 2165, 2242, 2164, 2161, 2115, 2114, 2113, 3156, 545: 3403, 878: 3402, 3401}, - {21: 3406}, - {6: 3404, 21: 910}, + {926, 926, 233: 926}, + {912, 912, 1736, 1653, 1687, 1654, 912, 1664, 1741, 1680, 1738, 1701, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 1728, 1665, 1674, 1695, 1859, 1788, 1789, 1785, 1747, 1794, 1837, 1839, 1838, 1730, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 1733, 1774, 1673, 1672, 1751, 1714, 1719, 1723, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 1784, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 1720, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 1735, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 1691, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 1652, 1656, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 1852, 1853, 1647, 1858, 1857, 1699, 1860, 1862, 1703, 1767, 1783, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 1873, 1874, 1876, 1870, 1871, 1872, 233: 912, 393: 1947, 1649, 1650, 1648, 483: 3418, 639: 3419, 775: 3417}, + {232: 924}, + {232: 923}, + {907, 907}, // 1885 - {6: 908, 21: 908}, - {2: 1722, 1639, 1673, 1640, 7: 2119, 1727, 1666, 1724, 2124, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 2128, 1651, 2121, 2123, 2137, 2138, 2136, 2132, 2139, 2129, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 2130, 1760, 1659, 2120, 1737, 1683, 1700, 2125, 2127, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 2135, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 2126, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 2131, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 2122, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 2117, 2118, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 2140, 1835, 2116, 1840, 1839, 1685, 1842, 1844, 1689, 2133, 2134, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 2141, 2142, 1858, 1852, 1853, 1854, 2172, 230: 2153, 2112, 2184, 2188, 235: 2169, 2168, 2205, 3157, 243: 2144, 266: 2148, 2187, 290: 2156, 299: 2175, 311: 2189, 2110, 2182, 2204, 2206, 2147, 2146, 2163, 2203, 2183, 2180, 2174, 2178, 2143, 2145, 2181, 2152, 2185, 2193, 2244, 2151, 2194, 2195, 2150, 2173, 2166, 2167, 2217, 2219, 2220, 2221, 2176, 2222, 2201, 2207, 2215, 2216, 2211, 2223, 2224, 2225, 2212, 2227, 2228, 2218, 2213, 2226, 2208, 2214, 2199, 2229, 2230, 2177, 2234, 2190, 2192, 2233, 2239, 2238, 2240, 2237, 2170, 2241, 2236, 2235, 2232, 2186, 2231, 2191, 2196, 2197, 389: 2155, 1635, 1636, 1634, 448: 2171, 2243, 2162, 2157, 2149, 2160, 2158, 2159, 2198, 2210, 2209, 2202, 2200, 2154, 2165, 2242, 2164, 2161, 2115, 2114, 2113, 3156, 545: 3405}, - {6: 909, 21: 909}, - {912, 912, 6: 912, 229: 912}, - {228: 3400, 616: 3408}, + {925, 925, 6: 3422, 233: 925}, + {258: 3420}, + {911, 911, 6: 911, 233: 911}, + {2: 1736, 1653, 1687, 1654, 7: 2140, 1741, 1680, 1738, 2145, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 2149, 1665, 2142, 2144, 1859, 2158, 2159, 2157, 2153, 2160, 1837, 1839, 1838, 2150, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 2151, 1774, 1673, 2141, 1751, 1714, 2146, 2148, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 2156, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 2147, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 2152, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 2143, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 2138, 2139, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 2161, 1853, 2137, 1858, 1857, 1699, 1860, 1862, 1703, 2154, 2155, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 2162, 2163, 1876, 1870, 1871, 1872, 2193, 234: 2174, 2133, 2205, 2209, 239: 2190, 2189, 2226, 2200, 247: 2165, 270: 2169, 272: 2208, 294: 2177, 303: 2196, 315: 2210, 2131, 2203, 2225, 2227, 2168, 2167, 2184, 2224, 2204, 2201, 2195, 2199, 2164, 2166, 2202, 2173, 2206, 2214, 2265, 2172, 2215, 2216, 2171, 2194, 2187, 2188, 2238, 2240, 2241, 2242, 2197, 2243, 2222, 2228, 2236, 2237, 2232, 2244, 2245, 2246, 2233, 2248, 2249, 2239, 2234, 2247, 2229, 2235, 2220, 2250, 2251, 2198, 2255, 2211, 2213, 2254, 2260, 2259, 2261, 2258, 2191, 2262, 2257, 2256, 381: 2253, 2207, 2252, 2212, 2217, 2218, 393: 2176, 1649, 1650, 1648, 452: 2192, 2264, 2183, 2178, 2170, 2181, 2179, 2180, 2219, 2231, 2230, 2223, 2221, 2175, 2186, 2263, 2185, 2182, 2136, 2135, 2134, 3421}, + {913, 913, 6: 913, 233: 913, 250: 2274, 252: 2272, 2273, 2271, 2269, 474: 2270, 2268}, // 1890 - {913, 913, 6: 913, 229: 913}, - {21: 3412}, - {21: 3411}, - {920, 920, 229: 920, 241: 476}, - {79: 3388, 228: 3415, 321: 3389, 394: 1546, 481: 3414, 1547, 1548, 1549, 488: 1552, 490: 1551, 3416, 622: 3413}, + {2: 1736, 1653, 1687, 1654, 7: 1664, 1741, 1680, 1738, 1701, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 1728, 1665, 1674, 1695, 1859, 1788, 1789, 1785, 1747, 1794, 1837, 1839, 1838, 1730, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 1733, 1774, 1673, 1672, 1751, 1714, 1719, 1723, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 1784, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 1720, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 1735, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 1691, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 1652, 1656, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 1852, 1853, 1647, 1858, 1857, 1699, 1860, 1862, 1703, 1767, 1783, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 1873, 1874, 1876, 1870, 1871, 1872, 393: 1947, 1649, 1650, 1648, 483: 3418, 639: 3423}, + {910, 910, 6: 910, 233: 910}, + {929, 929, 6: 3433, 233: 929}, + {922, 922, 6: 922, 233: 922}, + {2: 1736, 1653, 1687, 1654, 7: 2140, 1741, 1680, 1738, 2145, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 919, 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 2149, 1665, 2142, 2144, 1859, 2158, 2159, 2157, 2153, 2160, 1837, 1839, 1838, 2150, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 2151, 1774, 1673, 2141, 1751, 1714, 2146, 2148, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 2156, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 2147, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 2152, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 2143, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 2138, 2139, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 2161, 1853, 2137, 1858, 1857, 1699, 1860, 1862, 1703, 2154, 2155, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 2162, 2163, 1876, 1870, 1871, 1872, 2193, 234: 2174, 2133, 2205, 2209, 239: 2190, 2189, 2226, 3172, 247: 2165, 270: 2169, 272: 2208, 294: 2177, 303: 2196, 315: 2210, 2131, 2203, 2225, 2227, 2168, 2167, 2184, 2224, 2204, 2201, 2195, 2199, 2164, 2166, 2202, 2173, 2206, 2214, 2265, 2172, 2215, 2216, 2171, 2194, 2187, 2188, 2238, 2240, 2241, 2242, 2197, 2243, 2222, 2228, 2236, 2237, 2232, 2244, 2245, 2246, 2233, 2248, 2249, 2239, 2234, 2247, 2229, 2235, 2220, 2250, 2251, 2198, 2255, 2211, 2213, 2254, 2260, 2259, 2261, 2258, 2191, 2262, 2257, 2256, 381: 2253, 2207, 2252, 2212, 2217, 2218, 393: 2176, 1649, 1650, 1648, 452: 2192, 2264, 2183, 2178, 2170, 2181, 2179, 2180, 2219, 2231, 2230, 2223, 2221, 2175, 2186, 2263, 2185, 2182, 2136, 2135, 2134, 3171, 549: 3429, 882: 3428, 3427}, // 1895 - {228: 3400, 616: 3399, 747: 3419}, - {924, 924, 229: 924, 241: 477}, - {394: 1546, 481: 3417, 1547, 1548, 1549}, - {922, 922, 229: 922}, - {21: 3418}, + {21: 3432}, + {6: 3430, 21: 918}, + {6: 916, 21: 916}, + {2: 1736, 1653, 1687, 1654, 7: 2140, 1741, 1680, 1738, 2145, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 2149, 1665, 2142, 2144, 1859, 2158, 2159, 2157, 2153, 2160, 1837, 1839, 1838, 2150, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 2151, 1774, 1673, 2141, 1751, 1714, 2146, 2148, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 2156, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 2147, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 2152, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 2143, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 2138, 2139, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 2161, 1853, 2137, 1858, 1857, 1699, 1860, 1862, 1703, 2154, 2155, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 2162, 2163, 1876, 1870, 1871, 1872, 2193, 234: 2174, 2133, 2205, 2209, 239: 2190, 2189, 2226, 3172, 247: 2165, 270: 2169, 272: 2208, 294: 2177, 303: 2196, 315: 2210, 2131, 2203, 2225, 2227, 2168, 2167, 2184, 2224, 2204, 2201, 2195, 2199, 2164, 2166, 2202, 2173, 2206, 2214, 2265, 2172, 2215, 2216, 2171, 2194, 2187, 2188, 2238, 2240, 2241, 2242, 2197, 2243, 2222, 2228, 2236, 2237, 2232, 2244, 2245, 2246, 2233, 2248, 2249, 2239, 2234, 2247, 2229, 2235, 2220, 2250, 2251, 2198, 2255, 2211, 2213, 2254, 2260, 2259, 2261, 2258, 2191, 2262, 2257, 2256, 381: 2253, 2207, 2252, 2212, 2217, 2218, 393: 2176, 1649, 1650, 1648, 452: 2192, 2264, 2183, 2178, 2170, 2181, 2179, 2180, 2219, 2231, 2230, 2223, 2221, 2175, 2186, 2263, 2185, 2182, 2136, 2135, 2134, 3171, 549: 3431}, + {6: 917, 21: 917}, // 1900 - {923, 923, 229: 923, 241: 476}, - {925, 925, 6: 3407, 229: 925}, - {2: 1168, 1168, 1168, 1168, 7: 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 22: 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 393: 2073, 513: 1168, 579: 3421}, - {2: 927, 927, 927, 927, 7: 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 22: 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 513: 3380, 680: 3422}, - {2: 1722, 1639, 1673, 1640, 7: 1650, 1727, 1666, 1724, 1687, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 1714, 1651, 1660, 1681, 1774, 1775, 1771, 1733, 1780, 1716, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 1719, 1760, 1659, 1658, 1737, 1683, 1700, 1705, 1709, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 1770, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 1706, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 1721, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 1677, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 1638, 1642, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 1834, 1835, 1633, 1840, 1839, 1685, 1842, 1844, 1689, 1753, 1769, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 1855, 1856, 1858, 1852, 1853, 1854, 389: 1860, 1635, 1636, 1634, 472: 3423}, + {920, 920, 6: 920, 233: 920}, + {232: 3426, 619: 3434}, + {921, 921, 6: 921, 233: 921}, + {21: 3438}, + {21: 3437}, // 1905 - {79: 3388, 228: 3383, 257: 3387, 321: 3389, 394: 1546, 481: 3385, 1547, 1548, 1549, 488: 1552, 490: 1551, 3386, 622: 3384, 679: 3424}, - {901, 901, 229: 3426, 823: 3425}, - {928, 928}, - {128: 3427}, - {383: 3428}, + {928, 928, 233: 928, 245: 478}, + {80: 3414, 232: 3441, 325: 3415, 398: 1560, 485: 3440, 1561, 1562, 1563, 492: 1566, 494: 1565, 3442, 626: 3439}, + {232: 3426, 619: 3425, 751: 3445}, + {932, 932, 233: 932, 245: 479}, + {398: 1560, 485: 3443, 1561, 1562, 1563}, // 1910 - {494: 3429}, - {2: 1722, 1639, 1673, 1640, 7: 1650, 1727, 1666, 1724, 1687, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 1714, 1651, 1660, 1681, 1774, 1775, 1771, 1733, 1780, 1716, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 1719, 1760, 1659, 1658, 1737, 1683, 1700, 1705, 1709, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 1770, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 1706, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 1721, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 1677, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 1638, 1642, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 1834, 1835, 1633, 1840, 1839, 1685, 1842, 1844, 1689, 1753, 1769, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 1855, 1856, 1858, 1852, 1853, 1854, 389: 1928, 1635, 1636, 1634, 479: 2916, 575: 2917, 593: 3430}, - {900, 900, 6: 2919}, - {1255, 1255, 1722, 1639, 1673, 1640, 7: 1650, 1727, 1666, 1724, 1687, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 1714, 1651, 1660, 1681, 1774, 1775, 1771, 1733, 1780, 1716, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 1719, 1760, 1659, 1658, 1737, 1683, 1700, 1705, 1709, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 1770, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 1706, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 1721, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 1677, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 1638, 1642, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 1834, 1835, 1633, 1840, 1839, 1685, 1842, 1844, 1689, 1753, 1769, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 1855, 1856, 1858, 1852, 1853, 1854, 389: 1928, 1635, 1636, 1634, 479: 3445}, - {1253, 1253}, + {930, 930, 233: 930}, + {21: 3444}, + {931, 931, 233: 931, 245: 478}, + {933, 933, 6: 3433, 233: 933}, + {2: 1180, 1180, 1180, 1180, 7: 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 22: 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 397: 2092, 517: 1180, 583: 3447}, // 1915 - {1111, 1111, 1111, 1111, 1111, 1111, 7: 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 22: 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 254: 3442, 290: 1111}, - {228: 2711, 267: 1538, 314: 1537, 394: 1546, 481: 3435, 1547, 1548, 1549, 488: 1552, 490: 1551, 3440, 494: 1614, 502: 1530, 532: 3436, 535: 3438, 3439, 540: 3437, 598: 3441}, - {260, 260, 241: 477}, + {2: 935, 935, 935, 935, 7: 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 22: 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 517: 3406, 684: 3448}, + {2: 1736, 1653, 1687, 1654, 7: 1664, 1741, 1680, 1738, 1701, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 1728, 1665, 1674, 1695, 1859, 1788, 1789, 1785, 1747, 1794, 1837, 1839, 1838, 1730, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 1733, 1774, 1673, 1672, 1751, 1714, 1719, 1723, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 1784, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 1720, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 1735, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 1691, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 1652, 1656, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 1852, 1853, 1647, 1858, 1857, 1699, 1860, 1862, 1703, 1767, 1783, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 1873, 1874, 1876, 1870, 1871, 1872, 393: 1878, 1649, 1650, 1648, 476: 3449}, + {80: 3414, 232: 3409, 262: 3413, 325: 3415, 398: 1560, 485: 3411, 1561, 1562, 1563, 492: 1566, 494: 1565, 3412, 626: 3410, 683: 3450}, + {909, 909, 233: 3452, 827: 3451}, + {936, 936}, + // 1920 + {133: 3453}, + {387: 3454}, + {498: 3455}, + {2: 1736, 1653, 1687, 1654, 7: 1664, 1741, 1680, 1738, 1701, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 1728, 1665, 1674, 1695, 1859, 1788, 1789, 1785, 1747, 1794, 1837, 1839, 1838, 1730, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 1733, 1774, 1673, 1672, 1751, 1714, 1719, 1723, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 1784, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 1720, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 1735, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 1691, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 1652, 1656, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 1852, 1853, 1647, 1858, 1857, 1699, 1860, 1862, 1703, 1767, 1783, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 1873, 1874, 1876, 1870, 1871, 1872, 393: 1947, 1649, 1650, 1648, 483: 2930, 579: 2931, 596: 3456}, + {908, 908, 6: 2933}, + // 1925 + {1269, 1269, 1736, 1653, 1687, 1654, 7: 1664, 1741, 1680, 1738, 1701, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 1728, 1665, 1674, 1695, 1859, 1788, 1789, 1785, 1747, 1794, 1837, 1839, 1838, 1730, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 1733, 1774, 1673, 1672, 1751, 1714, 1719, 1723, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 1784, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 1720, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 1735, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 1691, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 1652, 1656, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 1852, 1853, 1647, 1858, 1857, 1699, 1860, 1862, 1703, 1767, 1783, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 1873, 1874, 1876, 1870, 1871, 1872, 393: 1947, 1649, 1650, 1648, 483: 3474}, + {1267, 1267}, + {1123, 1123, 1123, 1123, 1123, 1123, 7: 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 22: 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 258: 3471, 294: 1123}, + {232: 3462, 272: 1552, 318: 1551, 398: 1560, 485: 3461, 1561, 1562, 1563, 492: 1566, 494: 1565, 3467, 498: 1628, 506: 1544, 536: 3463, 539: 3465, 3466, 544: 3464, 601: 3470}, + {261, 261, 245: 479}, + // 1930 + {398: 1560, 485: 3468, 1561, 1562, 1563}, + {260, 260}, {259, 259}, {258, 258}, - // 1920 {257, 257}, + // 1935 {256, 256}, - {255, 255}, - {1251, 1251}, - {230: 3443}, - // 1925 - {228: 2711, 267: 1538, 314: 1537, 394: 1546, 481: 3435, 1547, 1548, 1549, 488: 1552, 490: 1551, 3440, 494: 1614, 502: 1530, 532: 3436, 535: 3438, 3439, 540: 3437, 598: 3444}, - {1252, 1252}, - {1254, 1254}, - {1260, 1260}, - {254: 3454}, - // 1930 - {266, 266, 241: 477}, + {21: 3469}, + {245: 478}, + {1265, 1265}, + {234: 3472}, + // 1940 + {232: 3462, 272: 1552, 318: 1551, 398: 1560, 485: 3461, 1561, 1562, 1563, 492: 1566, 494: 1565, 3467, 498: 1628, 506: 1544, 536: 3463, 539: 3465, 3466, 544: 3464, 601: 3473}, + {1266, 1266}, + {1268, 1268}, + {1274, 1274}, + {258: 3483}, + // 1945 + {267, 267, 245: 479}, + {266, 266}, {265, 265}, {264, 264}, {263, 263}, - {262, 262}, - // 1935 - {261, 261}, - {230: 3455}, - {228: 2711, 267: 1538, 314: 1537, 394: 1546, 481: 3448, 1547, 1548, 1549, 488: 1552, 490: 1551, 3453, 494: 1614, 502: 1530, 532: 3449, 535: 3451, 3452, 540: 3450, 741: 3456}, - {1259, 1259}, - {2: 1280, 1280, 1280, 1280, 7: 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 22: 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 313: 1280}, - // 1940 - {2: 1172, 1172, 1172, 1172, 7: 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 22: 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 313: 3493, 603: 3498}, - {2: 1172, 1172, 1172, 1172, 7: 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 22: 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 313: 3493, 603: 3492}, - {2: 1722, 1639, 1673, 1640, 7: 1650, 1727, 1666, 1724, 1687, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 1714, 1651, 1660, 1681, 1774, 1775, 1771, 1733, 1780, 1716, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 1719, 1760, 1659, 1658, 1737, 1683, 1700, 1705, 1709, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 1770, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 1706, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 1721, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 1677, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 1638, 1642, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 1834, 1835, 1633, 1840, 1839, 1685, 1842, 1844, 1689, 1753, 1769, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 1855, 1856, 1858, 1852, 1853, 1854, 313: 3487, 389: 1860, 1635, 1636, 1634, 472: 2974, 518: 3486}, - {2: 1722, 1639, 1673, 1640, 7: 1650, 1727, 1666, 1724, 1687, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 1714, 1651, 1660, 1681, 1774, 1775, 1771, 1733, 1780, 1716, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 1719, 1760, 1659, 1658, 1737, 1683, 1700, 1705, 1709, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 1770, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 1706, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 1721, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 1677, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 1638, 1642, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 1834, 1835, 1633, 1840, 1839, 1685, 1842, 1844, 1689, 1753, 1769, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 1855, 1856, 1858, 1852, 1853, 1854, 313: 3479, 389: 1860, 1635, 1636, 1634, 472: 2974, 518: 3478}, - {2: 1722, 1639, 1673, 1640, 7: 1650, 1727, 1666, 1724, 1687, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 1714, 1651, 1660, 1681, 1774, 1775, 1771, 1733, 1780, 1716, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 1719, 1760, 1659, 1658, 1737, 1683, 1700, 1705, 1709, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 1770, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 1706, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 1721, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 1677, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 1638, 1642, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 1834, 1835, 1633, 1840, 1839, 1685, 1842, 1844, 1689, 1753, 1769, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 1855, 1856, 1858, 1852, 1853, 1854, 230: 1889, 311: 1991, 313: 3475, 389: 1890, 1635, 1636, 1634, 473: 1990, 501: 2036, 573: 3474}, - // 1945 - {2: 1722, 1639, 1673, 1640, 7: 1650, 1727, 1666, 1724, 1687, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 1714, 1651, 1660, 1681, 1774, 1775, 1771, 1733, 1780, 1716, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 1719, 1760, 1659, 1658, 1737, 1683, 1700, 1705, 1709, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 1770, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 1706, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 1721, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 1677, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 1638, 1642, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 1834, 1835, 1939, 1840, 1839, 1685, 1842, 1844, 1689, 1753, 1769, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 1855, 1856, 1858, 1852, 1853, 1854, 230: 1946, 313: 3471, 389: 1890, 1635, 1636, 1634, 473: 1948, 516: 1949, 1947, 537: 3470}, - {2: 1722, 1639, 1673, 1640, 7: 1650, 1727, 1666, 1724, 1687, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 1714, 1651, 1660, 1681, 1774, 1775, 1771, 1733, 1780, 1716, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 1719, 1760, 1659, 1658, 1737, 1683, 1700, 1705, 1709, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 1770, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 1706, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 1721, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 1677, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 1638, 1642, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 1834, 1835, 1633, 1840, 1839, 1685, 1842, 1844, 1689, 1753, 1769, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 1855, 1856, 1858, 1852, 1853, 1854, 389: 1860, 1635, 1636, 1634, 472: 3469}, - {48: 3466}, - {244: 3467}, - {394: 1546, 481: 3468, 1547, 1548, 1549}, // 1950 - {93, 93}, - {1269, 1269}, - {1271, 1271, 6: 2034}, - {322: 3472}, - {2: 1722, 1639, 1673, 1640, 7: 1650, 1727, 1666, 1724, 1687, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 1714, 1651, 1660, 1681, 1774, 1775, 1771, 1733, 1780, 1716, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 1719, 1760, 1659, 1658, 1737, 1683, 1700, 1705, 1709, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 1770, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 1706, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 1721, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 1677, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 1638, 1642, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 1834, 1835, 1939, 1840, 1839, 1685, 1842, 1844, 1689, 1753, 1769, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 1855, 1856, 1858, 1852, 1853, 1854, 230: 1946, 389: 1890, 1635, 1636, 1634, 473: 1948, 516: 1949, 1947, 537: 3473}, + {262, 262}, + {234: 3484}, + {232: 3462, 272: 1552, 318: 1551, 398: 1560, 485: 3477, 1561, 1562, 1563, 492: 1566, 494: 1565, 3482, 498: 1628, 506: 1544, 536: 3478, 539: 3480, 3481, 544: 3479, 745: 3485}, + {1273, 1273}, + {2: 1294, 1294, 1294, 1294, 7: 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 22: 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 317: 1294}, // 1955 - {1270, 1270, 6: 2034}, - {1273, 1273, 6: 2038}, - {322: 3476}, - {2: 1722, 1639, 1673, 1640, 7: 1650, 1727, 1666, 1724, 1687, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 1714, 1651, 1660, 1681, 1774, 1775, 1771, 1733, 1780, 1716, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 1719, 1760, 1659, 1658, 1737, 1683, 1700, 1705, 1709, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 1770, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 1706, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 1721, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 1677, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 1638, 1642, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 1834, 1835, 1633, 1840, 1839, 1685, 1842, 1844, 1689, 1753, 1769, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 1855, 1856, 1858, 1852, 1853, 1854, 230: 1889, 311: 1991, 389: 1890, 1635, 1636, 1634, 473: 1990, 501: 2036, 573: 3477}, - {1272, 1272, 6: 2038}, + {2: 1184, 1184, 1184, 1184, 7: 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 22: 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 317: 3522, 606: 3527}, + {2: 1184, 1184, 1184, 1184, 7: 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 22: 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 317: 3522, 606: 3521}, + {2: 1736, 1653, 1687, 1654, 7: 1664, 1741, 1680, 1738, 1701, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 1728, 1665, 1674, 1695, 1859, 1788, 1789, 1785, 1747, 1794, 1837, 1839, 1838, 1730, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 1733, 1774, 1673, 1672, 1751, 1714, 1719, 1723, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 1784, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 1720, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 1735, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 1691, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 1652, 1656, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 1852, 1853, 1647, 1858, 1857, 1699, 1860, 1862, 1703, 1767, 1783, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 1873, 1874, 1876, 1870, 1871, 1872, 317: 3516, 393: 1878, 1649, 1650, 1648, 476: 2989, 522: 3515}, + {2: 1736, 1653, 1687, 1654, 7: 1664, 1741, 1680, 1738, 1701, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 1728, 1665, 1674, 1695, 1859, 1788, 1789, 1785, 1747, 1794, 1837, 1839, 1838, 1730, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 1733, 1774, 1673, 1672, 1751, 1714, 1719, 1723, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 1784, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 1720, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 1735, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 1691, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 1652, 1656, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 1852, 1853, 1647, 1858, 1857, 1699, 1860, 1862, 1703, 1767, 1783, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 1873, 1874, 1876, 1870, 1871, 1872, 317: 3508, 393: 1878, 1649, 1650, 1648, 476: 2989, 522: 3507}, + {2: 1736, 1653, 1687, 1654, 7: 1664, 1741, 1680, 1738, 1701, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 1728, 1665, 1674, 1695, 1859, 1788, 1789, 1785, 1747, 1794, 1837, 1839, 1838, 1730, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 1733, 1774, 1673, 1672, 1751, 1714, 1719, 1723, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 1784, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 1720, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 1735, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 1691, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 1652, 1656, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 1852, 1853, 1647, 1858, 1857, 1699, 1860, 1862, 1703, 1767, 1783, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 1873, 1874, 1876, 1870, 1871, 1872, 234: 1908, 315: 2010, 317: 3504, 393: 1909, 1649, 1650, 1648, 477: 2009, 505: 2055, 577: 3503}, // 1960 - {1268, 1268, 6: 2981, 408: 3484, 3483, 571: 3485}, - {322: 3480}, - {2: 1722, 1639, 1673, 1640, 7: 1650, 1727, 1666, 1724, 1687, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 1714, 1651, 1660, 1681, 1774, 1775, 1771, 1733, 1780, 1716, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 1719, 1760, 1659, 1658, 1737, 1683, 1700, 1705, 1709, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 1770, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 1706, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 1721, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 1677, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 1638, 1642, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 1834, 1835, 1633, 1840, 1839, 1685, 1842, 1844, 1689, 1753, 1769, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 1855, 1856, 1858, 1852, 1853, 1854, 389: 1860, 1635, 1636, 1634, 472: 2974, 518: 3481}, - {1268, 1268, 6: 2981, 408: 3484, 3483, 571: 3482}, - {1274, 1274}, + {2: 1736, 1653, 1687, 1654, 7: 1664, 1741, 1680, 1738, 1701, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 1728, 1665, 1674, 1695, 1859, 1788, 1789, 1785, 1747, 1794, 1837, 1839, 1838, 1730, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 1733, 1774, 1673, 1672, 1751, 1714, 1719, 1723, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 1784, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 1720, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 1735, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 1691, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 1652, 1656, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 1852, 1853, 1958, 1858, 1857, 1699, 1860, 1862, 1703, 1767, 1783, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 1873, 1874, 1876, 1870, 1871, 1872, 234: 1965, 317: 3500, 393: 1909, 1649, 1650, 1648, 477: 1967, 520: 1968, 1966, 541: 3499}, + {2: 1736, 1653, 1687, 1654, 7: 1664, 1741, 1680, 1738, 1701, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 1728, 1665, 1674, 1695, 1859, 1788, 1789, 1785, 1747, 1794, 1837, 1839, 1838, 1730, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 1733, 1774, 1673, 1672, 1751, 1714, 1719, 1723, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 1784, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 1720, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 1735, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 1691, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 1652, 1656, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 1852, 1853, 1647, 1858, 1857, 1699, 1860, 1862, 1703, 1767, 1783, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 1873, 1874, 1876, 1870, 1871, 1872, 393: 1878, 1649, 1650, 1648, 476: 3498}, + {49: 3495}, + {248: 3496}, + {398: 1560, 485: 3497, 1561, 1562, 1563}, // 1965 - {1267, 1267, 6: 1267}, - {1266, 1266, 6: 1266}, - {1275, 1275}, - {1268, 1268, 6: 2981, 408: 3484, 3483, 571: 3491}, - {322: 3488}, + {94, 94}, + {1283, 1283}, + {1285, 1285, 6: 2053}, + {326: 3501}, + {2: 1736, 1653, 1687, 1654, 7: 1664, 1741, 1680, 1738, 1701, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 1728, 1665, 1674, 1695, 1859, 1788, 1789, 1785, 1747, 1794, 1837, 1839, 1838, 1730, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 1733, 1774, 1673, 1672, 1751, 1714, 1719, 1723, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 1784, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 1720, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 1735, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 1691, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 1652, 1656, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 1852, 1853, 1958, 1858, 1857, 1699, 1860, 1862, 1703, 1767, 1783, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 1873, 1874, 1876, 1870, 1871, 1872, 234: 1965, 393: 1909, 1649, 1650, 1648, 477: 1967, 520: 1968, 1966, 541: 3502}, // 1970 - {2: 1722, 1639, 1673, 1640, 7: 1650, 1727, 1666, 1724, 1687, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 1714, 1651, 1660, 1681, 1774, 1775, 1771, 1733, 1780, 1716, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 1719, 1760, 1659, 1658, 1737, 1683, 1700, 1705, 1709, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 1770, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 1706, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 1721, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 1677, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 1638, 1642, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 1834, 1835, 1633, 1840, 1839, 1685, 1842, 1844, 1689, 1753, 1769, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 1855, 1856, 1858, 1852, 1853, 1854, 389: 1860, 1635, 1636, 1634, 472: 2974, 518: 3489}, - {1268, 1268, 6: 2981, 408: 3484, 3483, 571: 3490}, - {1276, 1276}, - {1277, 1277}, - {2: 1722, 1639, 1673, 1640, 7: 1650, 1727, 1666, 1724, 1687, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 1714, 1651, 1660, 1681, 1774, 1775, 1771, 1733, 1780, 1716, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 1719, 1760, 1659, 1658, 1737, 1683, 1700, 1705, 1709, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 1770, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 1706, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 1721, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 1677, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 1638, 1642, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 1834, 1835, 1633, 1840, 1839, 1685, 1842, 1844, 1689, 1753, 1769, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 1855, 1856, 1858, 1852, 1853, 1854, 389: 3495, 1635, 1636, 1634}, + {1284, 1284, 6: 2053}, + {1287, 1287, 6: 2057}, + {326: 3505}, + {2: 1736, 1653, 1687, 1654, 7: 1664, 1741, 1680, 1738, 1701, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 1728, 1665, 1674, 1695, 1859, 1788, 1789, 1785, 1747, 1794, 1837, 1839, 1838, 1730, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 1733, 1774, 1673, 1672, 1751, 1714, 1719, 1723, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 1784, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 1720, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 1735, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 1691, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 1652, 1656, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 1852, 1853, 1647, 1858, 1857, 1699, 1860, 1862, 1703, 1767, 1783, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 1873, 1874, 1876, 1870, 1871, 1872, 234: 1908, 315: 2010, 393: 1909, 1649, 1650, 1648, 477: 2009, 505: 2055, 577: 3506}, + {1286, 1286, 6: 2057}, // 1975 - {322: 3494}, - {2: 1171, 1171, 1171, 1171, 7: 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 22: 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 230: 1171, 311: 1171}, - {229: 3496}, - {2: 1722, 1639, 1673, 1640, 7: 1650, 1727, 1666, 1724, 1687, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 1714, 1651, 1660, 1681, 1774, 1775, 1771, 1733, 1780, 1716, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 1719, 1760, 1659, 1658, 1737, 1683, 1700, 1705, 1709, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 1770, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 1706, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 1721, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 1677, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 1638, 1642, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 1834, 1835, 1633, 1840, 1839, 1685, 1842, 1844, 1689, 1753, 1769, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 1855, 1856, 1858, 1852, 1853, 1854, 389: 1860, 1635, 1636, 1634, 472: 3497}, - {1278, 1278}, + {1282, 1282, 6: 2996, 412: 3513, 3512, 575: 3514}, + {326: 3509}, + {2: 1736, 1653, 1687, 1654, 7: 1664, 1741, 1680, 1738, 1701, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 1728, 1665, 1674, 1695, 1859, 1788, 1789, 1785, 1747, 1794, 1837, 1839, 1838, 1730, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 1733, 1774, 1673, 1672, 1751, 1714, 1719, 1723, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 1784, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 1720, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 1735, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 1691, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 1652, 1656, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 1852, 1853, 1647, 1858, 1857, 1699, 1860, 1862, 1703, 1767, 1783, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 1873, 1874, 1876, 1870, 1871, 1872, 393: 1878, 1649, 1650, 1648, 476: 2989, 522: 3510}, + {1282, 1282, 6: 2996, 412: 3513, 3512, 575: 3511}, + {1288, 1288}, // 1980 - {2: 1722, 1639, 1673, 1640, 7: 1650, 1727, 1666, 1724, 1687, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 1714, 1651, 1660, 1681, 1774, 1775, 1771, 1733, 1780, 1716, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 1719, 1760, 1659, 1658, 1737, 1683, 1700, 1705, 1709, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 1770, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 1706, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 1721, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 1677, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 1638, 1642, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 1834, 1835, 1633, 1840, 1839, 1685, 1842, 1844, 1689, 1753, 1769, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 1855, 1856, 1858, 1852, 1853, 1854, 389: 2065, 1635, 1636, 1634, 560: 3499}, - {1279, 1279}, - {2: 662, 662, 662, 662, 7: 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 22: 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 253: 662, 393: 662, 495: 2071, 2070, 2069, 570: 3501}, - {2: 653, 653, 653, 653, 7: 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 22: 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 3503, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 253: 653, 393: 653, 845: 3502}, - {2: 1168, 1168, 1168, 1168, 7: 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 22: 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 253: 1168, 393: 2073, 579: 3504}, + {1281, 1281, 6: 1281}, + {1280, 1280, 6: 1280}, + {1289, 1289}, + {1282, 1282, 6: 2996, 412: 3513, 3512, 575: 3520}, + {326: 3517}, // 1985 - {2: 652, 652, 652, 652, 7: 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 22: 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 253: 652, 393: 652}, - {2: 1722, 1639, 1673, 1640, 7: 1650, 1727, 1666, 1724, 1687, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 1714, 1651, 1660, 1681, 1774, 1775, 1771, 1733, 1780, 1716, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 1719, 1760, 1659, 1658, 1737, 1683, 1700, 1705, 1709, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 1770, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 1706, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 1721, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 1677, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 1638, 1642, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 1834, 1835, 1633, 1840, 1839, 1685, 1842, 1844, 1689, 1753, 1769, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 1855, 1856, 1858, 1852, 1853, 1854, 253: 3505, 389: 1860, 1635, 1636, 1634, 472: 2974, 518: 3506}, - {2: 1722, 1639, 1673, 1640, 7: 1650, 1727, 1666, 1724, 1687, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 1714, 1651, 1660, 1681, 1774, 1775, 1771, 1733, 1780, 1716, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 1719, 1760, 1659, 1658, 1737, 1683, 1700, 1705, 1709, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 1770, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 1706, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 1721, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 1677, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 1638, 1642, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 1834, 1835, 1633, 1840, 1839, 1685, 1842, 1844, 1689, 1753, 1769, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 1855, 1856, 1858, 1852, 1853, 1854, 389: 1860, 1635, 1636, 1634, 472: 3510, 518: 3511}, - {6: 2981, 253: 3507}, - {2: 1722, 1639, 1673, 1640, 7: 1650, 1727, 1666, 1724, 1687, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 1714, 1651, 1660, 1681, 1774, 1775, 1771, 1733, 1780, 1716, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 1719, 1760, 1659, 1658, 1737, 1683, 1700, 1705, 1709, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 1770, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 1706, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 1721, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 1677, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 1638, 1642, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 1834, 1835, 1633, 1840, 1839, 1685, 1842, 1844, 1689, 1753, 1769, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 1855, 1856, 1858, 1852, 1853, 1854, 2082, 315: 2078, 389: 1860, 1635, 1636, 1634, 472: 2081, 506: 2080, 2079, 2084, 533: 2075, 555: 3508}, + {2: 1736, 1653, 1687, 1654, 7: 1664, 1741, 1680, 1738, 1701, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 1728, 1665, 1674, 1695, 1859, 1788, 1789, 1785, 1747, 1794, 1837, 1839, 1838, 1730, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 1733, 1774, 1673, 1672, 1751, 1714, 1719, 1723, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 1784, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 1720, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 1735, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 1691, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 1652, 1656, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 1852, 1853, 1647, 1858, 1857, 1699, 1860, 1862, 1703, 1767, 1783, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 1873, 1874, 1876, 1870, 1871, 1872, 393: 1878, 1649, 1650, 1648, 476: 2989, 522: 3518}, + {1282, 1282, 6: 2996, 412: 3513, 3512, 575: 3519}, + {1290, 1290}, + {1291, 1291}, + {2: 1736, 1653, 1687, 1654, 7: 1664, 1741, 1680, 1738, 1701, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 1728, 1665, 1674, 1695, 1859, 1788, 1789, 1785, 1747, 1794, 1837, 1839, 1838, 1730, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 1733, 1774, 1673, 1672, 1751, 1714, 1719, 1723, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 1784, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 1720, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 1735, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 1691, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 1652, 1656, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 1852, 1853, 1647, 1858, 1857, 1699, 1860, 1862, 1703, 1767, 1783, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 1873, 1874, 1876, 1870, 1871, 1872, 393: 3524, 1649, 1650, 1648}, // 1990 - {115, 115, 6: 2872, 249: 2921, 541: 2922, 3509}, - {1282, 1282}, - {536, 536, 6: 655, 240: 655, 245: 536, 247: 536, 249: 536, 393: 2887, 405: 2888, 407: 2886, 604: 2890, 2889, 677: 2891, 3515}, - {6: 2981, 240: 3512}, - {2: 1722, 1639, 1673, 1640, 7: 1650, 1727, 1666, 1724, 1687, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 1714, 1651, 1660, 1681, 1774, 1775, 1771, 1733, 1780, 1716, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 1719, 1760, 1659, 1658, 1737, 1683, 1700, 1705, 1709, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 1770, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 1706, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 1721, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 1677, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 1638, 1642, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 1834, 1835, 1633, 1840, 1839, 1685, 1842, 1844, 1689, 1753, 1769, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 1855, 1856, 1858, 1852, 1853, 1854, 2082, 315: 2078, 389: 1860, 1635, 1636, 1634, 472: 2081, 506: 2080, 2079, 2084, 533: 2075, 555: 3513}, + {326: 3523}, + {2: 1183, 1183, 1183, 1183, 7: 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 22: 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 234: 1183, 315: 1183}, + {233: 3525}, + {2: 1736, 1653, 1687, 1654, 7: 1664, 1741, 1680, 1738, 1701, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 1728, 1665, 1674, 1695, 1859, 1788, 1789, 1785, 1747, 1794, 1837, 1839, 1838, 1730, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 1733, 1774, 1673, 1672, 1751, 1714, 1719, 1723, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 1784, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 1720, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 1735, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 1691, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 1652, 1656, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 1852, 1853, 1647, 1858, 1857, 1699, 1860, 1862, 1703, 1767, 1783, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 1873, 1874, 1876, 1870, 1871, 1872, 393: 1878, 1649, 1650, 1648, 476: 3526}, + {1292, 1292}, // 1995 - {115, 115, 6: 2872, 249: 2921, 541: 2922, 3514}, - {1281, 1281}, - {115, 115, 245: 115, 247: 115, 249: 2921, 541: 2922, 3516}, - {876, 876, 245: 876, 247: 2454, 514: 2455, 3517}, - {518, 518, 245: 2925, 685: 3518}, + {2: 1736, 1653, 1687, 1654, 7: 1664, 1741, 1680, 1738, 1701, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 1728, 1665, 1674, 1695, 1859, 1788, 1789, 1785, 1747, 1794, 1837, 1839, 1838, 1730, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 1733, 1774, 1673, 1672, 1751, 1714, 1719, 1723, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 1784, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 1720, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 1735, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 1691, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 1652, 1656, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 1852, 1853, 1647, 1858, 1857, 1699, 1860, 1862, 1703, 1767, 1783, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 1873, 1874, 1876, 1870, 1871, 1872, 393: 2084, 1649, 1650, 1648, 564: 3528}, + {1293, 1293}, + {2: 670, 670, 670, 670, 7: 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 22: 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 257: 670, 397: 670, 499: 2090, 2089, 2088, 574: 3530}, + {2: 661, 661, 661, 661, 7: 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 22: 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 3532, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 257: 661, 397: 661, 849: 3531}, + {2: 1180, 1180, 1180, 1180, 7: 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 22: 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 257: 1180, 397: 2092, 583: 3533}, // 2000 - {1283, 1283}, - {1284, 1284, 6: 2453}, - {401: 4011}, - {401: 1358}, - {2: 1170, 1170, 1170, 1170, 7: 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 22: 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 313: 3068, 564: 3998}, + {2: 660, 660, 660, 660, 7: 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 22: 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 257: 660, 397: 660}, + {2: 1736, 1653, 1687, 1654, 7: 1664, 1741, 1680, 1738, 1701, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 1728, 1665, 1674, 1695, 1859, 1788, 1789, 1785, 1747, 1794, 1837, 1839, 1838, 1730, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 1733, 1774, 1673, 1672, 1751, 1714, 1719, 1723, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 1784, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 1720, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 1735, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 1691, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 1652, 1656, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 1852, 1853, 1647, 1858, 1857, 1699, 1860, 1862, 1703, 1767, 1783, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 1873, 1874, 1876, 1870, 1871, 1872, 257: 3534, 393: 1878, 1649, 1650, 1648, 476: 2989, 522: 3535}, + {2: 1736, 1653, 1687, 1654, 7: 1664, 1741, 1680, 1738, 1701, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 1728, 1665, 1674, 1695, 1859, 1788, 1789, 1785, 1747, 1794, 1837, 1839, 1838, 1730, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 1733, 1774, 1673, 1672, 1751, 1714, 1719, 1723, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 1784, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 1720, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 1735, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 1691, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 1652, 1656, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 1852, 1853, 1647, 1858, 1857, 1699, 1860, 1862, 1703, 1767, 1783, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 1873, 1874, 1876, 1870, 1871, 1872, 393: 1878, 1649, 1650, 1648, 476: 3539, 522: 3540}, + {6: 2996, 257: 3536}, + {2: 1736, 1653, 1687, 1654, 7: 1664, 1741, 1680, 1738, 1701, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 1728, 1665, 1674, 1695, 1859, 1788, 1789, 1785, 1747, 1794, 1837, 1839, 1838, 1730, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 1733, 1774, 1673, 1672, 1751, 1714, 1719, 1723, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 1784, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 1720, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 1735, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 1691, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 1652, 1656, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 1852, 1853, 1647, 1858, 1857, 1699, 1860, 1862, 1703, 1767, 1783, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 1873, 1874, 1876, 1870, 1871, 1872, 2102, 319: 2097, 393: 1878, 1649, 1650, 1648, 452: 2101, 476: 2100, 510: 2099, 2098, 2104, 537: 2094, 559: 3537}, // 2005 - {2: 1170, 1170, 1170, 1170, 7: 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 22: 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 313: 3068, 564: 3578}, - {22: 1301, 39: 1301, 53: 3544, 406: 1301, 882: 3543}, - {267: 3542}, - {2: 1170, 1170, 1170, 1170, 7: 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 22: 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 230: 1170, 311: 1170, 313: 3068, 564: 3540}, - {2: 1170, 1170, 1170, 1170, 7: 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 22: 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 230: 1170, 313: 3068, 564: 3534}, + {116, 116, 6: 2886, 256: 2935, 545: 2936, 3538}, + {1296, 1296}, + {545, 545, 6: 663, 244: 663, 249: 545, 251: 545, 256: 545, 397: 2901, 409: 2902, 411: 2900, 607: 2904, 2903, 681: 2905, 3544}, + {6: 2996, 244: 3541}, + {2: 1736, 1653, 1687, 1654, 7: 1664, 1741, 1680, 1738, 1701, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 1728, 1665, 1674, 1695, 1859, 1788, 1789, 1785, 1747, 1794, 1837, 1839, 1838, 1730, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 1733, 1774, 1673, 1672, 1751, 1714, 1719, 1723, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 1784, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 1720, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 1735, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 1691, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 1652, 1656, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 1852, 1853, 1647, 1858, 1857, 1699, 1860, 1862, 1703, 1767, 1783, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 1873, 1874, 1876, 1870, 1871, 1872, 2102, 319: 2097, 393: 1878, 1649, 1650, 1648, 452: 2101, 476: 2100, 510: 2099, 2098, 2104, 537: 2094, 559: 3542}, // 2010 - {48: 3529}, - {244: 3530}, - {394: 1546, 481: 3531, 1547, 1548, 1549}, - {240: 3532}, - {394: 1546, 481: 3533, 1547, 1548, 1549}, + {116, 116, 6: 2886, 256: 2935, 545: 2936, 3543}, + {1295, 1295}, + {116, 116, 249: 116, 251: 116, 256: 2935, 545: 2936, 3545}, + {884, 884, 249: 884, 251: 2475, 518: 2476, 3546}, + {527, 527, 249: 2939, 689: 3547}, // 2015 - {94, 94}, - {2: 1722, 1639, 1673, 1640, 7: 1650, 1727, 1666, 1724, 1687, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 1714, 1651, 1660, 1681, 1774, 1775, 1771, 1733, 1780, 1716, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 1719, 1760, 1659, 1658, 1737, 1683, 1700, 1705, 1709, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 1770, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 1706, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 1721, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 1677, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 1638, 1642, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 1834, 1835, 1939, 1840, 1839, 1685, 1842, 1844, 1689, 1753, 1769, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 1855, 1856, 1858, 1852, 1853, 1854, 230: 1946, 389: 1890, 1635, 1636, 1634, 473: 1948, 516: 3536, 1947, 719: 3537, 847: 3535}, - {110, 110, 6: 3538}, - {97, 97, 6: 97}, - {96, 96, 6: 96}, + {1297, 1297}, + {1298, 1298, 6: 2474}, + {405: 4040}, + {405: 1372}, + {2: 1182, 1182, 1182, 1182, 7: 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 22: 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 317: 3083, 568: 4027}, // 2020 - {2: 1722, 1639, 1673, 1640, 7: 1650, 1727, 1666, 1724, 1687, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 1714, 1651, 1660, 1681, 1774, 1775, 1771, 1733, 1780, 1716, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 1719, 1760, 1659, 1658, 1737, 1683, 1700, 1705, 1709, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 1770, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 1706, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 1721, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 1677, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 1638, 1642, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 1834, 1835, 1939, 1840, 1839, 1685, 1842, 1844, 1689, 1753, 1769, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 1855, 1856, 1858, 1852, 1853, 1854, 230: 1946, 389: 1890, 1635, 1636, 1634, 473: 1948, 516: 3536, 1947, 719: 3539}, - {95, 95, 6: 95}, - {2: 1722, 1639, 1673, 1640, 7: 1650, 1727, 1666, 1724, 1687, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 1714, 1651, 1660, 1681, 1774, 1775, 1771, 1733, 1780, 1716, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 1719, 1760, 1659, 1658, 1737, 1683, 1700, 1705, 1709, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 1770, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 1706, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 1721, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 1677, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 1638, 1642, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 1834, 1835, 1633, 1840, 1839, 1685, 1842, 1844, 1689, 1753, 1769, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 1855, 1856, 1858, 1852, 1853, 1854, 230: 1889, 311: 1991, 389: 1890, 1635, 1636, 1634, 473: 1990, 501: 1992, 574: 1993, 590: 3541}, - {111, 111, 6: 1995}, - {22: 1302, 39: 1302, 53: 1302, 406: 1302}, + {2: 1182, 1182, 1182, 1182, 7: 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 22: 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 317: 3083, 568: 3607}, + {22: 1315, 44: 1315, 54: 3573, 410: 1315, 886: 3572}, + {272: 3571}, + {2: 1182, 1182, 1182, 1182, 7: 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 22: 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 234: 1182, 315: 1182, 317: 3083, 568: 3569}, + {2: 1182, 1182, 1182, 1182, 7: 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 22: 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 234: 1182, 317: 3083, 568: 3563}, // 2025 - {22: 1297, 39: 3550, 406: 1297, 884: 3549}, - {254: 3545}, - {150: 3547, 176: 3548, 183: 3546}, - {22: 1300, 39: 1300, 406: 1300}, - {22: 1299, 39: 1299, 406: 1299}, + {49: 3558}, + {248: 3559}, + {398: 1560, 485: 3560, 1561, 1562, 1563}, + {244: 3561}, + {398: 1560, 485: 3562, 1561, 1562, 1563}, // 2030 - {22: 1298, 39: 1298, 406: 1298}, - {22: 1295, 406: 3554, 887: 3553}, - {254: 3551}, - {2: 1722, 1639, 1673, 1640, 7: 1650, 1727, 1666, 1724, 1687, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 1714, 1651, 1660, 1681, 1774, 1775, 1771, 1733, 1780, 1716, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 1719, 1760, 1659, 1658, 1737, 1683, 1700, 1705, 1709, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 1770, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 1706, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 1721, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 1677, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 1638, 1642, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 1834, 1835, 1633, 1840, 1839, 1685, 1842, 1844, 1689, 1753, 1769, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 1855, 1856, 1858, 1852, 1853, 1854, 230: 1889, 311: 1991, 389: 1890, 1635, 1636, 1634, 473: 1990, 501: 3552}, - {22: 1296, 406: 1296}, + {95, 95}, + {2: 1736, 1653, 1687, 1654, 7: 1664, 1741, 1680, 1738, 1701, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 1728, 1665, 1674, 1695, 1859, 1788, 1789, 1785, 1747, 1794, 1837, 1839, 1838, 1730, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 1733, 1774, 1673, 1672, 1751, 1714, 1719, 1723, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 1784, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 1720, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 1735, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 1691, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 1652, 1656, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 1852, 1853, 1958, 1858, 1857, 1699, 1860, 1862, 1703, 1767, 1783, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 1873, 1874, 1876, 1870, 1871, 1872, 234: 1965, 393: 1909, 1649, 1650, 1648, 477: 1967, 520: 3565, 1966, 723: 3566, 851: 3564}, + {111, 111, 6: 3567}, + {98, 98, 6: 98}, + {97, 97, 6: 97}, // 2035 - {22: 3558}, - {165: 3555}, - {39: 3556, 141: 3557}, - {22: 1294}, - {22: 1293}, + {2: 1736, 1653, 1687, 1654, 7: 1664, 1741, 1680, 1738, 1701, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 1728, 1665, 1674, 1695, 1859, 1788, 1789, 1785, 1747, 1794, 1837, 1839, 1838, 1730, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 1733, 1774, 1673, 1672, 1751, 1714, 1719, 1723, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 1784, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 1720, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 1735, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 1691, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 1652, 1656, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 1852, 1853, 1958, 1858, 1857, 1699, 1860, 1862, 1703, 1767, 1783, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 1873, 1874, 1876, 1870, 1871, 1872, 234: 1965, 393: 1909, 1649, 1650, 1648, 477: 1967, 520: 3565, 1966, 723: 3568}, + {96, 96, 6: 96}, + {2: 1736, 1653, 1687, 1654, 7: 1664, 1741, 1680, 1738, 1701, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 1728, 1665, 1674, 1695, 1859, 1788, 1789, 1785, 1747, 1794, 1837, 1839, 1838, 1730, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 1733, 1774, 1673, 1672, 1751, 1714, 1719, 1723, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 1784, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 1720, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 1735, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 1691, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 1652, 1656, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 1852, 1853, 1647, 1858, 1857, 1699, 1860, 1862, 1703, 1767, 1783, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 1873, 1874, 1876, 1870, 1871, 1872, 234: 1908, 315: 2010, 393: 1909, 1649, 1650, 1648, 477: 2009, 505: 2011, 578: 2012, 593: 3570}, + {112, 112, 6: 2014}, + {22: 1316, 44: 1316, 54: 1316, 410: 1316}, // 2040 - {2: 1722, 1639, 1673, 1640, 7: 1650, 1727, 1666, 1724, 1687, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 1714, 1651, 1660, 1681, 1774, 1775, 1771, 1733, 1780, 1716, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 1719, 1760, 1659, 1658, 1737, 1683, 1700, 1705, 1709, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 1770, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 1706, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 1721, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 1677, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 1638, 1642, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 1834, 1835, 1633, 1840, 1839, 1685, 1842, 1844, 1689, 1753, 1769, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 1855, 1856, 1858, 1852, 1853, 1854, 389: 1860, 1635, 1636, 1634, 472: 3560, 886: 3559}, - {228: 3562, 234: 1291, 885: 3561}, - {228: 1292, 234: 1292}, - {234: 3568}, - {2: 1722, 1639, 1673, 1640, 7: 1650, 1727, 1666, 1724, 1687, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 1714, 1651, 1660, 1681, 1774, 1775, 1771, 1733, 1780, 1716, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 1719, 1760, 1659, 1658, 1737, 1683, 1700, 1705, 1709, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 1770, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 1706, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 1721, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 1677, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 1638, 1642, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 1834, 1835, 1633, 1840, 1839, 1685, 1842, 1844, 1689, 1753, 1769, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 1855, 1856, 1858, 1852, 1853, 1854, 389: 3564, 1635, 1636, 1634, 767: 3563}, + {22: 1311, 44: 3579, 410: 1311, 888: 3578}, + {258: 3574}, + {154: 3576, 180: 3577, 187: 3575}, + {22: 1314, 44: 1314, 410: 1314}, + {22: 1313, 44: 1313, 410: 1313}, // 2045 - {6: 3566, 21: 3565}, - {6: 1289, 21: 1289}, - {234: 1290}, - {2: 1722, 1639, 1673, 1640, 7: 1650, 1727, 1666, 1724, 1687, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 1714, 1651, 1660, 1681, 1774, 1775, 1771, 1733, 1780, 1716, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 1719, 1760, 1659, 1658, 1737, 1683, 1700, 1705, 1709, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 1770, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 1706, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 1721, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 1677, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 1638, 1642, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 1834, 1835, 1633, 1840, 1839, 1685, 1842, 1844, 1689, 1753, 1769, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 1855, 1856, 1858, 1852, 1853, 1854, 389: 3567, 1635, 1636, 1634}, - {6: 1288, 21: 1288}, + {22: 1312, 44: 1312, 410: 1312}, + {22: 1309, 410: 3583, 891: 3582}, + {258: 3580}, + {2: 1736, 1653, 1687, 1654, 7: 1664, 1741, 1680, 1738, 1701, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 1728, 1665, 1674, 1695, 1859, 1788, 1789, 1785, 1747, 1794, 1837, 1839, 1838, 1730, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 1733, 1774, 1673, 1672, 1751, 1714, 1719, 1723, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 1784, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 1720, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 1735, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 1691, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 1652, 1656, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 1852, 1853, 1647, 1858, 1857, 1699, 1860, 1862, 1703, 1767, 1783, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 1873, 1874, 1876, 1870, 1871, 1872, 234: 1908, 315: 2010, 393: 1909, 1649, 1650, 1648, 477: 2009, 505: 3581}, + {22: 1310, 410: 1310}, // 2050 - {394: 1546, 481: 3569, 1547, 1548, 1549}, - {1287, 1287, 239: 3571, 883: 3570}, - {1304, 1304}, - {64: 3573, 120: 3572}, - {386: 3576}, + {22: 3587}, + {170: 3584}, + {44: 3585, 146: 3586}, + {22: 1308}, + {22: 1307}, // 2055 - {386: 3574}, - {583: 3575}, - {1285, 1285}, - {583: 3577}, - {1286, 1286}, + {2: 1736, 1653, 1687, 1654, 7: 1664, 1741, 1680, 1738, 1701, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 1728, 1665, 1674, 1695, 1859, 1788, 1789, 1785, 1747, 1794, 1837, 1839, 1838, 1730, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 1733, 1774, 1673, 1672, 1751, 1714, 1719, 1723, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 1784, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 1720, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 1735, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 1691, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 1652, 1656, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 1852, 1853, 1647, 1858, 1857, 1699, 1860, 1862, 1703, 1767, 1783, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 1873, 1874, 1876, 1870, 1871, 1872, 393: 1878, 1649, 1650, 1648, 476: 3589, 890: 3588}, + {232: 3591, 238: 1305, 889: 3590}, + {232: 1306, 238: 1306}, + {238: 3597}, + {2: 1736, 1653, 1687, 1654, 7: 1664, 1741, 1680, 1738, 1701, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 1728, 1665, 1674, 1695, 1859, 1788, 1789, 1785, 1747, 1794, 1837, 1839, 1838, 1730, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 1733, 1774, 1673, 1672, 1751, 1714, 1719, 1723, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 1784, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 1720, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 1735, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 1691, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 1652, 1656, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 1852, 1853, 1647, 1858, 1857, 1699, 1860, 1862, 1703, 1767, 1783, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 1873, 1874, 1876, 1870, 1871, 1872, 393: 3593, 1649, 1650, 1648, 771: 3592}, // 2060 - {2: 1722, 1639, 1673, 1640, 7: 1650, 1727, 1666, 1724, 1687, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 1714, 1651, 1660, 1681, 1774, 1775, 1771, 1733, 1780, 1716, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 1719, 1760, 1659, 1658, 1737, 1683, 1700, 1705, 1709, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 1770, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 1706, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 1721, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 1677, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 1638, 1642, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 1834, 1835, 1633, 1840, 1839, 1685, 1842, 1844, 1689, 1753, 1769, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 1855, 1856, 1858, 1852, 1853, 1854, 389: 1860, 1635, 1636, 1634, 472: 3579}, - {246, 246, 246, 246, 7: 246, 246, 246, 246, 246, 13: 246, 246, 246, 246, 246, 246, 246, 246, 228: 3583, 234: 246, 238: 246, 261: 246, 267: 246, 3582, 393: 246, 246, 246, 246, 246, 246, 811: 3581, 866: 3580}, - {221, 221, 3846, 3845, 7: 1344, 3852, 3843, 3848, 3850, 13: 3849, 3847, 3851, 3855, 3853, 3854, 3862, 3857, 228: 221, 234: 221, 238: 3842, 261: 1344, 267: 221, 393: 221, 221, 1344, 221, 3859, 3858, 525: 3844, 550: 3856, 554: 3861, 618: 3860, 775: 3841}, - {1345, 1345}, - {2: 1722, 1639, 1673, 1640, 7: 1650, 1727, 1666, 1724, 1687, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 1714, 1651, 1660, 1681, 1774, 1775, 1771, 1733, 1780, 1716, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 1719, 1760, 1659, 1658, 1737, 1683, 1700, 1705, 1709, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 1770, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 1706, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 1721, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 1677, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 1638, 1642, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 1834, 1835, 1633, 1840, 1839, 1685, 1842, 1844, 1689, 1753, 1769, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 1855, 1856, 1858, 1852, 1853, 1854, 389: 1860, 1635, 1636, 1634, 472: 3840}, + {6: 3595, 21: 3594}, + {6: 1303, 21: 1303}, + {238: 1304}, + {2: 1736, 1653, 1687, 1654, 7: 1664, 1741, 1680, 1738, 1701, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 1728, 1665, 1674, 1695, 1859, 1788, 1789, 1785, 1747, 1794, 1837, 1839, 1838, 1730, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 1733, 1774, 1673, 1672, 1751, 1714, 1719, 1723, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 1784, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 1720, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 1735, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 1691, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 1652, 1656, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 1852, 1853, 1647, 1858, 1857, 1699, 1860, 1862, 1703, 1767, 1783, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 1873, 1874, 1876, 1870, 1871, 1872, 393: 3596, 1649, 1650, 1648}, + {6: 1302, 21: 1302}, // 2065 - {2: 1722, 1639, 1673, 1640, 7: 1650, 1727, 1666, 1724, 1687, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 1714, 1651, 1660, 1681, 1774, 1775, 1771, 1733, 1780, 1716, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 1719, 1760, 1659, 1658, 1737, 1683, 1700, 1705, 1709, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 1770, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 1706, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 1721, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 1677, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 1638, 1642, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 1834, 1835, 1633, 1840, 1839, 1685, 1842, 1844, 1689, 1753, 1769, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 1855, 1856, 1858, 1852, 1853, 1854, 268: 3586, 383: 1463, 1463, 1463, 3590, 389: 1928, 1635, 1636, 1634, 401: 1463, 415: 1463, 1463, 479: 3585, 531: 3588, 595: 3589, 3584, 3587, 734: 3591, 865: 3592}, - {2: 1722, 1639, 1673, 1640, 7: 1650, 1727, 1666, 1724, 1687, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 1714, 1651, 1660, 1681, 1774, 1775, 1771, 1733, 1780, 1716, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 1719, 1760, 1659, 1658, 1737, 1683, 1700, 1705, 1709, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 1770, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 1706, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 1721, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 1677, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 1638, 1642, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 1834, 1835, 1633, 1840, 1839, 1685, 1842, 1844, 1689, 1753, 1769, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 1855, 1856, 1858, 1852, 1853, 1854, 383: 1462, 1462, 1462, 389: 3839, 1635, 1636, 1634, 401: 1462, 415: 1462, 1462, 733: 3838}, - {29: 3731, 61: 3728, 3727, 66: 3730, 72: 3715, 111: 3729, 115: 3705, 3699, 3698, 130: 3713, 152: 3707, 177: 3723, 257: 3714, 299: 3709, 319: 165, 418: 3700, 3696, 3690, 3716, 425: 3697, 3719, 3704, 3702, 3691, 3692, 3693, 3694, 3695, 3726, 3721, 3725, 3720, 3689, 3724, 3701, 3717, 3703, 3688, 3718, 3687, 3722, 3710, 761: 3686, 3711, 3683, 779: 3681, 794: 3684, 3685, 805: 3682, 818: 3706, 821: 3679, 862: 3680, 872: 3712, 875: 3678, 880: 3708}, - {2: 1722, 1639, 1673, 1640, 7: 1650, 1727, 1666, 1724, 1687, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 1714, 1651, 1660, 1681, 1774, 1775, 1771, 1733, 1780, 1716, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 1719, 1760, 1659, 1658, 1737, 1683, 1700, 1705, 1709, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 1770, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 1706, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 1721, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 1677, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 1638, 1642, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 1834, 1835, 1633, 1840, 1839, 1685, 1842, 1844, 1689, 1753, 1769, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 1855, 1856, 1858, 1852, 1853, 1854, 389: 1860, 1635, 1636, 1634, 472: 3676}, - {383: 2907, 3599, 3602, 401: 2908, 415: 3603, 3600, 529: 3601, 773: 3604}, + {398: 1560, 485: 3598, 1561, 1562, 1563}, + {1301, 1301, 243: 3600, 887: 3599}, + {1318, 1318}, + {55: 3602, 125: 3601}, + {390: 3605}, // 2070 - {6: 251, 21: 251}, - {6: 250, 21: 250}, - {228: 3596}, - {6: 248, 21: 248}, - {6: 3593, 21: 3594}, + {390: 3603}, + {587: 3604}, + {1299, 1299}, + {587: 3606}, + {1300, 1300}, // 2075 - {2: 1722, 1639, 1673, 1640, 7: 1650, 1727, 1666, 1724, 1687, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 1714, 1651, 1660, 1681, 1774, 1775, 1771, 1733, 1780, 1716, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 1719, 1760, 1659, 1658, 1737, 1683, 1700, 1705, 1709, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 1770, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 1706, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 1721, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 1677, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 1638, 1642, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 1834, 1835, 1633, 1840, 1839, 1685, 1842, 1844, 1689, 1753, 1769, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 1855, 1856, 1858, 1852, 1853, 1854, 383: 1463, 1463, 1463, 3590, 389: 1928, 1635, 1636, 1634, 401: 1463, 415: 1463, 1463, 479: 3585, 531: 3588, 595: 3589, 3584, 3587, 734: 3595}, - {245, 245, 245, 245, 7: 245, 245, 245, 245, 245, 13: 245, 245, 245, 245, 245, 245, 245, 245, 228: 245, 234: 245, 238: 245, 261: 245, 267: 245, 393: 245, 245, 245, 245, 245, 245}, - {6: 247, 21: 247}, - {2: 1722, 1639, 1673, 1640, 7: 2119, 1727, 1666, 1724, 2124, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 2128, 1651, 2121, 2123, 2137, 2138, 2136, 2132, 2139, 2129, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 2130, 1760, 1659, 2120, 1737, 1683, 1700, 2125, 2127, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 2135, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 2126, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 2131, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 2122, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 2117, 2118, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 2140, 1835, 2116, 1840, 1839, 1685, 1842, 1844, 1689, 2133, 2134, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 2141, 2142, 1858, 1852, 1853, 1854, 2172, 230: 2153, 2112, 2184, 2188, 235: 2169, 2168, 2205, 2179, 243: 2144, 266: 2148, 2187, 290: 2156, 299: 2175, 311: 2189, 2110, 2182, 2204, 2206, 2147, 2146, 2163, 2203, 2183, 2180, 2174, 2178, 2143, 2145, 2181, 2152, 2185, 2193, 2244, 2151, 2194, 2195, 2150, 2173, 2166, 2167, 2217, 2219, 2220, 2221, 2176, 2222, 2201, 2207, 2215, 2216, 2211, 2223, 2224, 2225, 2212, 2227, 2228, 2218, 2213, 2226, 2208, 2214, 2199, 2229, 2230, 2177, 2234, 2190, 2192, 2233, 2239, 2238, 2240, 2237, 2170, 2241, 2236, 2235, 2232, 2186, 2231, 2191, 2196, 2197, 389: 2155, 1635, 1636, 1634, 448: 2171, 2243, 2162, 2157, 2149, 2160, 2158, 2159, 2198, 2210, 2209, 2202, 2200, 2154, 2165, 2242, 2164, 2161, 2115, 2114, 2113, 3597}, - {21: 3598, 246: 2253, 248: 2251, 250: 2252, 2250, 2248, 470: 2249, 2247}, + {2: 1736, 1653, 1687, 1654, 7: 1664, 1741, 1680, 1738, 1701, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 1728, 1665, 1674, 1695, 1859, 1788, 1789, 1785, 1747, 1794, 1837, 1839, 1838, 1730, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 1733, 1774, 1673, 1672, 1751, 1714, 1719, 1723, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 1784, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 1720, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 1735, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 1691, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 1652, 1656, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 1852, 1853, 1647, 1858, 1857, 1699, 1860, 1862, 1703, 1767, 1783, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 1873, 1874, 1876, 1870, 1871, 1872, 393: 1878, 1649, 1650, 1648, 476: 3608}, + {247, 247, 247, 247, 7: 247, 247, 247, 247, 247, 13: 247, 247, 247, 247, 247, 247, 247, 247, 232: 3612, 238: 247, 242: 247, 264: 247, 271: 3611, 247, 397: 247, 247, 247, 247, 247, 247, 815: 3610, 870: 3609}, + {222, 222, 3875, 3874, 7: 1358, 3881, 3872, 3877, 3879, 13: 3878, 3876, 3880, 3884, 3882, 3883, 3891, 3886, 232: 222, 238: 222, 242: 3871, 264: 1358, 272: 222, 397: 222, 222, 1358, 222, 3888, 3887, 530: 3873, 554: 3885, 558: 3890, 622: 3889, 779: 3870}, + {1359, 1359}, + {2: 1736, 1653, 1687, 1654, 7: 1664, 1741, 1680, 1738, 1701, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 1728, 1665, 1674, 1695, 1859, 1788, 1789, 1785, 1747, 1794, 1837, 1839, 1838, 1730, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 1733, 1774, 1673, 1672, 1751, 1714, 1719, 1723, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 1784, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 1720, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 1735, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 1691, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 1652, 1656, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 1852, 1853, 1647, 1858, 1857, 1699, 1860, 1862, 1703, 1767, 1783, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 1873, 1874, 1876, 1870, 1871, 1872, 393: 1878, 1649, 1650, 1648, 476: 3869}, // 2080 - {6: 249, 21: 249}, - {383: 3669}, - {2: 1474, 1474, 1474, 1474, 7: 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 22: 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 383: 2907, 401: 2908, 529: 3637, 681: 3663}, - {2: 1722, 1639, 1673, 1640, 7: 1650, 1727, 1666, 1724, 1687, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 1714, 1651, 1660, 1681, 1774, 1775, 1771, 1733, 1780, 1716, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 1719, 1760, 1659, 1658, 1737, 1683, 1700, 1705, 1709, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 1770, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 1706, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 1721, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 1677, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 1638, 1642, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 1834, 1835, 1633, 1840, 1839, 1685, 1842, 1844, 1689, 1753, 1769, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 1855, 1856, 1858, 1852, 1853, 1854, 1166, 240: 1166, 389: 3607, 1635, 1636, 1634, 565: 3657}, - {2: 1474, 1474, 1474, 1474, 7: 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 22: 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 240: 1474, 383: 2907, 401: 2908, 529: 3637, 681: 3638}, + {2: 1736, 1653, 1687, 1654, 7: 1664, 1741, 1680, 1738, 1701, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 1728, 1665, 1674, 1695, 1859, 1788, 1789, 1785, 1747, 1794, 1837, 1839, 1838, 1730, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 1733, 1774, 1673, 1672, 1751, 1714, 1719, 1723, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 1784, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 1720, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 1735, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 1691, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 1652, 1656, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 1852, 1853, 1647, 1858, 1857, 1699, 1860, 1862, 1703, 1767, 1783, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 1873, 1874, 1876, 1870, 1871, 1872, 271: 3615, 387: 1477, 1477, 1477, 3619, 393: 1947, 1649, 1650, 1648, 405: 1477, 419: 1477, 1477, 483: 3614, 535: 3617, 598: 3618, 3613, 3616, 738: 3620, 869: 3621}, + {2: 1736, 1653, 1687, 1654, 7: 1664, 1741, 1680, 1738, 1701, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 1728, 1665, 1674, 1695, 1859, 1788, 1789, 1785, 1747, 1794, 1837, 1839, 1838, 1730, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 1733, 1774, 1673, 1672, 1751, 1714, 1719, 1723, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 1784, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 1720, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 1735, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 1691, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 1652, 1656, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 1852, 1853, 1647, 1858, 1857, 1699, 1860, 1862, 1703, 1767, 1783, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 1873, 1874, 1876, 1870, 1871, 1872, 387: 1476, 1476, 1476, 393: 3868, 1649, 1650, 1648, 405: 1476, 419: 1476, 1476, 737: 3867}, + {30: 3760, 63: 3757, 3756, 67: 3759, 73: 3744, 116: 3758, 120: 3734, 3728, 3727, 135: 3742, 156: 3736, 181: 3752, 262: 3743, 303: 3738, 323: 166, 422: 3729, 3725, 3719, 3745, 429: 3726, 3748, 3733, 3731, 3720, 3721, 3722, 3723, 3724, 3755, 3750, 3754, 3749, 3718, 3753, 3730, 3746, 3732, 3717, 3747, 3716, 3751, 3739, 765: 3715, 3740, 3712, 783: 3710, 798: 3713, 3714, 809: 3711, 822: 3735, 825: 3708, 866: 3709, 876: 3741, 879: 3707, 884: 3737}, + {2: 1736, 1653, 1687, 1654, 7: 1664, 1741, 1680, 1738, 1701, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 1728, 1665, 1674, 1695, 1859, 1788, 1789, 1785, 1747, 1794, 1837, 1839, 1838, 1730, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 1733, 1774, 1673, 1672, 1751, 1714, 1719, 1723, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 1784, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 1720, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 1735, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 1691, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 1652, 1656, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 1852, 1853, 1647, 1858, 1857, 1699, 1860, 1862, 1703, 1767, 1783, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 1873, 1874, 1876, 1870, 1871, 1872, 393: 1878, 1649, 1650, 1648, 476: 3705}, + {387: 2921, 3628, 3631, 405: 2922, 419: 3632, 3629, 533: 3630, 777: 3633}, // 2085 - {383: 3605}, - {252, 252, 6: 252, 21: 252}, - {2: 1722, 1639, 1673, 1640, 7: 1650, 1727, 1666, 1724, 1687, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 1714, 1651, 1660, 1681, 1774, 1775, 1771, 1733, 1780, 1716, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 1719, 1760, 1659, 1658, 1737, 1683, 1700, 1705, 1709, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 1770, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 1706, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 1721, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 1677, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 1638, 1642, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 1834, 1835, 1633, 1840, 1839, 1685, 1842, 1844, 1689, 1753, 1769, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 1855, 1856, 1858, 1852, 1853, 1854, 1166, 389: 3607, 1635, 1636, 1634, 565: 3606}, - {228: 3608}, - {228: 1165, 240: 1165}, + {6: 252, 21: 252}, + {6: 251, 21: 251}, + {232: 3625}, + {6: 249, 21: 249}, + {6: 3622, 21: 3623}, // 2090 - {2: 1722, 1639, 1673, 1640, 7: 1650, 1727, 1666, 1724, 1687, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 1714, 1651, 1660, 1681, 1774, 1775, 1771, 1733, 1780, 1716, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 1719, 1760, 1659, 1658, 1737, 1683, 1700, 1705, 1709, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 1770, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 1706, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 1721, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 1677, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 1638, 1642, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 1834, 1835, 1633, 1840, 1839, 1685, 1842, 1844, 1689, 1753, 1769, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 1855, 1856, 1858, 1852, 1853, 1854, 389: 1928, 1635, 1636, 1634, 479: 3610, 528: 3611, 534: 3609}, - {6: 3615, 21: 3614}, - {6: 145, 21: 145, 228: 2659, 273: 145, 145, 487: 2660, 503: 3612}, - {6: 1356, 21: 1356}, - {6: 879, 21: 879, 273: 2289, 2288, 704: 3613}, + {2: 1736, 1653, 1687, 1654, 7: 1664, 1741, 1680, 1738, 1701, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 1728, 1665, 1674, 1695, 1859, 1788, 1789, 1785, 1747, 1794, 1837, 1839, 1838, 1730, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 1733, 1774, 1673, 1672, 1751, 1714, 1719, 1723, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 1784, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 1720, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 1735, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 1691, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 1652, 1656, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 1852, 1853, 1647, 1858, 1857, 1699, 1860, 1862, 1703, 1767, 1783, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 1873, 1874, 1876, 1870, 1871, 1872, 387: 1477, 1477, 1477, 3619, 393: 1947, 1649, 1650, 1648, 405: 1477, 419: 1477, 1477, 483: 3614, 535: 3617, 598: 3618, 3613, 3616, 738: 3624}, + {246, 246, 246, 246, 7: 246, 246, 246, 246, 246, 13: 246, 246, 246, 246, 246, 246, 246, 246, 232: 246, 238: 246, 242: 246, 264: 246, 272: 246, 397: 246, 246, 246, 246, 246, 246}, + {6: 248, 21: 248}, + {2: 1736, 1653, 1687, 1654, 7: 2140, 1741, 1680, 1738, 2145, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 2149, 1665, 2142, 2144, 1859, 2158, 2159, 2157, 2153, 2160, 1837, 1839, 1838, 2150, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 2151, 1774, 1673, 2141, 1751, 1714, 2146, 2148, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 2156, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 2147, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 2152, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 2143, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 2138, 2139, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 2161, 1853, 2137, 1858, 1857, 1699, 1860, 1862, 1703, 2154, 2155, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 2162, 2163, 1876, 1870, 1871, 1872, 2193, 234: 2174, 2133, 2205, 2209, 239: 2190, 2189, 2226, 2200, 247: 2165, 270: 2169, 272: 2208, 294: 2177, 303: 2196, 315: 2210, 2131, 2203, 2225, 2227, 2168, 2167, 2184, 2224, 2204, 2201, 2195, 2199, 2164, 2166, 2202, 2173, 2206, 2214, 2265, 2172, 2215, 2216, 2171, 2194, 2187, 2188, 2238, 2240, 2241, 2242, 2197, 2243, 2222, 2228, 2236, 2237, 2232, 2244, 2245, 2246, 2233, 2248, 2249, 2239, 2234, 2247, 2229, 2235, 2220, 2250, 2251, 2198, 2255, 2211, 2213, 2254, 2260, 2259, 2261, 2258, 2191, 2262, 2257, 2256, 381: 2253, 2207, 2252, 2212, 2217, 2218, 393: 2176, 1649, 1650, 1648, 452: 2192, 2264, 2183, 2178, 2170, 2181, 2179, 2180, 2219, 2231, 2230, 2223, 2221, 2175, 2186, 2263, 2185, 2182, 2136, 2135, 2134, 3626}, + {21: 3627, 250: 2274, 252: 2272, 2273, 2271, 2269, 474: 2270, 2268}, // 2095 - {6: 1357, 21: 1357}, - {387: 3618, 615: 3617}, - {2: 1722, 1639, 1673, 1640, 7: 1650, 1727, 1666, 1724, 1687, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 1714, 1651, 1660, 1681, 1774, 1775, 1771, 1733, 1780, 1716, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 1719, 1760, 1659, 1658, 1737, 1683, 1700, 1705, 1709, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 1770, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 1706, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 1721, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 1677, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 1638, 1642, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 1834, 1835, 1633, 1840, 1839, 1685, 1842, 1844, 1689, 1753, 1769, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 1855, 1856, 1858, 1852, 1853, 1854, 389: 1928, 1635, 1636, 1634, 479: 3610, 528: 3616}, - {6: 1355, 21: 1355}, - {1388, 1388, 6: 1388, 21: 1388}, + {6: 250, 21: 250}, + {387: 3698}, + {2: 1488, 1488, 1488, 1488, 7: 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 22: 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 387: 2921, 405: 2922, 533: 3666, 685: 3692}, + {2: 1736, 1653, 1687, 1654, 7: 1664, 1741, 1680, 1738, 1701, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 1728, 1665, 1674, 1695, 1859, 1788, 1789, 1785, 1747, 1794, 1837, 1839, 1838, 1730, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 1733, 1774, 1673, 1672, 1751, 1714, 1719, 1723, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 1784, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 1720, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 1735, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 1691, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 1652, 1656, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 1852, 1853, 1647, 1858, 1857, 1699, 1860, 1862, 1703, 1767, 1783, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 1873, 1874, 1876, 1870, 1871, 1872, 1178, 244: 1178, 393: 3636, 1649, 1650, 1648, 569: 3686}, + {2: 1488, 1488, 1488, 1488, 7: 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 22: 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 244: 1488, 387: 2921, 405: 2922, 533: 3666, 685: 3667}, // 2100 - {2: 1722, 1639, 1673, 1640, 7: 1650, 1727, 1666, 1724, 1687, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 1714, 1651, 1660, 1681, 1774, 1775, 1771, 1733, 1780, 1716, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 1719, 1760, 1659, 1658, 1737, 1683, 1700, 1705, 1709, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 1770, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 1706, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 1721, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 1677, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 1638, 1642, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 1834, 1835, 1633, 1840, 1839, 1685, 1842, 1844, 1689, 1753, 1769, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 1855, 1856, 1858, 1852, 1853, 1854, 389: 1860, 1635, 1636, 1634, 472: 3619}, - {228: 3620}, - {2: 1722, 1639, 1673, 1640, 7: 1650, 1727, 1666, 1724, 1687, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 1714, 1651, 1660, 1681, 1774, 1775, 1771, 1733, 1780, 1716, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 1719, 1760, 1659, 1658, 1737, 1683, 1700, 1705, 1709, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 1770, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 1706, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 1721, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 1677, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 1638, 1642, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 1834, 1835, 1633, 1840, 1839, 1685, 1842, 1844, 1689, 1753, 1769, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 1855, 1856, 1858, 1852, 1853, 1854, 389: 1928, 1635, 1636, 1634, 479: 3610, 528: 3611, 534: 3621}, - {6: 3615, 21: 3622}, - {1386, 1386, 1386, 1386, 1386, 1386, 1386, 21: 1386, 229: 3624, 231: 1386, 234: 1386, 238: 1386, 243: 1386, 383: 1386, 1386, 1386, 1386, 1386, 1386, 822: 3623}, + {387: 3634}, + {253, 253, 6: 253, 21: 253}, + {2: 1736, 1653, 1687, 1654, 7: 1664, 1741, 1680, 1738, 1701, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 1728, 1665, 1674, 1695, 1859, 1788, 1789, 1785, 1747, 1794, 1837, 1839, 1838, 1730, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 1733, 1774, 1673, 1672, 1751, 1714, 1719, 1723, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 1784, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 1720, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 1735, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 1691, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 1652, 1656, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 1852, 1853, 1647, 1858, 1857, 1699, 1860, 1862, 1703, 1767, 1783, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 1873, 1874, 1876, 1870, 1871, 1872, 1178, 393: 3636, 1649, 1650, 1648, 569: 3635}, + {232: 3637}, + {232: 1177, 244: 1177}, // 2105 - {1384, 1384, 1384, 1384, 1384, 1384, 1384, 21: 1384, 229: 3634, 231: 1384, 234: 1384, 238: 1384, 243: 1384, 383: 1384, 1384, 1384, 1384, 1384, 1384, 824: 3633}, - {502: 3625}, - {24: 3630, 257: 3629, 408: 3628, 3627, 713: 3626}, - {1385, 1385, 1385, 1385, 1385, 1385, 1385, 21: 1385, 229: 1385, 231: 1385, 234: 1385, 238: 1385, 243: 1385, 383: 1385, 1385, 1385, 1385, 1385, 1385}, - {1382, 1382, 1382, 1382, 1382, 1382, 1382, 21: 1382, 229: 1382, 231: 1382, 234: 1382, 238: 1382, 243: 1382, 383: 1382, 1382, 1382, 1382, 1382, 1382}, + {2: 1736, 1653, 1687, 1654, 7: 1664, 1741, 1680, 1738, 1701, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 1728, 1665, 1674, 1695, 1859, 1788, 1789, 1785, 1747, 1794, 1837, 1839, 1838, 1730, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 1733, 1774, 1673, 1672, 1751, 1714, 1719, 1723, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 1784, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 1720, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 1735, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 1691, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 1652, 1656, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 1852, 1853, 1647, 1858, 1857, 1699, 1860, 1862, 1703, 1767, 1783, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 1873, 1874, 1876, 1870, 1871, 1872, 393: 1947, 1649, 1650, 1648, 483: 3639, 532: 3640, 538: 3638}, + {6: 3644, 21: 3643}, + {6: 146, 21: 146, 232: 2680, 277: 146, 146, 491: 2681, 507: 3641}, + {6: 1370, 21: 1370}, + {6: 887, 21: 887, 277: 2310, 2309, 708: 3642}, // 2110 - {1381, 1381, 1381, 1381, 1381, 1381, 1381, 21: 1381, 229: 1381, 231: 1381, 234: 1381, 238: 1381, 243: 1381, 383: 1381, 1381, 1381, 1381, 1381, 1381}, - {243: 3632}, - {113: 3631}, - {1379, 1379, 1379, 1379, 1379, 1379, 1379, 21: 1379, 229: 1379, 231: 1379, 234: 1379, 238: 1379, 243: 1379, 383: 1379, 1379, 1379, 1379, 1379, 1379}, - {1380, 1380, 1380, 1380, 1380, 1380, 1380, 21: 1380, 229: 1380, 231: 1380, 234: 1380, 238: 1380, 243: 1380, 383: 1380, 1380, 1380, 1380, 1380, 1380}, + {6: 1371, 21: 1371}, + {391: 3647, 618: 3646}, + {2: 1736, 1653, 1687, 1654, 7: 1664, 1741, 1680, 1738, 1701, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 1728, 1665, 1674, 1695, 1859, 1788, 1789, 1785, 1747, 1794, 1837, 1839, 1838, 1730, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 1733, 1774, 1673, 1672, 1751, 1714, 1719, 1723, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 1784, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 1720, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 1735, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 1691, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 1652, 1656, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 1852, 1853, 1647, 1858, 1857, 1699, 1860, 1862, 1703, 1767, 1783, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 1873, 1874, 1876, 1870, 1871, 1872, 393: 1947, 1649, 1650, 1648, 483: 3639, 532: 3645}, + {6: 1369, 21: 1369}, + {1402, 1402, 6: 1402, 21: 1402}, // 2115 - {1387, 1387, 1387, 1387, 1387, 1387, 1387, 21: 1387, 229: 1387, 231: 1387, 234: 1387, 238: 1387, 243: 1387, 383: 1387, 1387, 1387, 1387, 1387, 1387}, - {494: 3635}, - {24: 3630, 257: 3629, 408: 3628, 3627, 713: 3636}, - {1383, 1383, 1383, 1383, 1383, 1383, 1383, 21: 1383, 229: 1383, 231: 1383, 234: 1383, 238: 1383, 243: 1383, 383: 1383, 1383, 1383, 1383, 1383, 1383}, - {2: 1473, 1473, 1473, 1473, 7: 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 22: 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 240: 1473}, + {2: 1736, 1653, 1687, 1654, 7: 1664, 1741, 1680, 1738, 1701, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 1728, 1665, 1674, 1695, 1859, 1788, 1789, 1785, 1747, 1794, 1837, 1839, 1838, 1730, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 1733, 1774, 1673, 1672, 1751, 1714, 1719, 1723, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 1784, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 1720, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 1735, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 1691, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 1652, 1656, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 1852, 1853, 1647, 1858, 1857, 1699, 1860, 1862, 1703, 1767, 1783, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 1873, 1874, 1876, 1870, 1871, 1872, 393: 1878, 1649, 1650, 1648, 476: 3648}, + {232: 3649}, + {2: 1736, 1653, 1687, 1654, 7: 1664, 1741, 1680, 1738, 1701, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 1728, 1665, 1674, 1695, 1859, 1788, 1789, 1785, 1747, 1794, 1837, 1839, 1838, 1730, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 1733, 1774, 1673, 1672, 1751, 1714, 1719, 1723, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 1784, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 1720, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 1735, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 1691, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 1652, 1656, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 1852, 1853, 1647, 1858, 1857, 1699, 1860, 1862, 1703, 1767, 1783, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 1873, 1874, 1876, 1870, 1871, 1872, 393: 1947, 1649, 1650, 1648, 483: 3639, 532: 3640, 538: 3650}, + {6: 3644, 21: 3651}, + {1400, 1400, 1400, 1400, 1400, 1400, 1400, 21: 1400, 233: 3653, 235: 1400, 238: 1400, 242: 1400, 247: 1400, 387: 1400, 1400, 1400, 1400, 1400, 1400, 826: 3652}, // 2120 - {2: 1722, 1639, 1673, 1640, 7: 1650, 1727, 1666, 1724, 1687, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 1714, 1651, 1660, 1681, 1774, 1775, 1771, 1733, 1780, 1716, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 1719, 1760, 1659, 1658, 1737, 1683, 1700, 1705, 1709, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 1770, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 1706, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 1721, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 1677, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 1638, 1642, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 1834, 1835, 1633, 1840, 1839, 1685, 1842, 1844, 1689, 1753, 1769, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 1855, 1856, 1858, 1852, 1853, 1854, 1166, 240: 1166, 389: 3607, 1635, 1636, 1634, 565: 3639}, - {228: 1157, 240: 3641, 520: 3642, 581: 3640}, - {228: 3645}, - {71: 3644, 118: 3643}, - {228: 1156, 1156}, + {1398, 1398, 1398, 1398, 1398, 1398, 1398, 21: 1398, 233: 3663, 235: 1398, 238: 1398, 242: 1398, 247: 1398, 387: 1398, 1398, 1398, 1398, 1398, 1398, 828: 3662}, + {506: 3654}, + {24: 3659, 262: 3658, 412: 3657, 3656, 717: 3655}, + {1399, 1399, 1399, 1399, 1399, 1399, 1399, 21: 1399, 233: 1399, 235: 1399, 238: 1399, 242: 1399, 247: 1399, 387: 1399, 1399, 1399, 1399, 1399, 1399}, + {1396, 1396, 1396, 1396, 1396, 1396, 1396, 21: 1396, 233: 1396, 235: 1396, 238: 1396, 242: 1396, 247: 1396, 387: 1396, 1396, 1396, 1396, 1396, 1396}, // 2125 - {1159, 1159, 1159, 6: 1159, 8: 1159, 21: 1159, 228: 1159, 1159, 240: 1159, 242: 1159}, - {1158, 1158, 1158, 6: 1158, 8: 1158, 21: 1158, 228: 1158, 1158, 240: 1158, 242: 1158}, - {2: 1722, 1639, 1673, 1640, 7: 1650, 1727, 1666, 1724, 1687, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 1714, 1651, 1660, 1681, 1774, 1775, 1771, 1733, 1780, 1716, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 1719, 1760, 1659, 1658, 1737, 1683, 1700, 1705, 1709, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 1770, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 1706, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 1721, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 1677, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 1638, 1642, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 1834, 1835, 1633, 1840, 1839, 1685, 1842, 1844, 1689, 1753, 1769, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 1855, 1856, 1858, 1852, 1853, 1854, 389: 1928, 1635, 1636, 1634, 479: 3610, 528: 3611, 534: 3646}, - {6: 3615, 21: 3647}, - {1164, 1164, 1164, 6: 1164, 8: 1164, 21: 1164, 240: 1164, 567: 3648}, + {1395, 1395, 1395, 1395, 1395, 1395, 1395, 21: 1395, 233: 1395, 235: 1395, 238: 1395, 242: 1395, 247: 1395, 387: 1395, 1395, 1395, 1395, 1395, 1395}, + {247: 3661}, + {118: 3660}, + {1393, 1393, 1393, 1393, 1393, 1393, 1393, 21: 1393, 233: 1393, 235: 1393, 238: 1393, 242: 1393, 247: 1393, 387: 1393, 1393, 1393, 1393, 1393, 1393}, + {1394, 1394, 1394, 1394, 1394, 1394, 1394, 21: 1394, 233: 1394, 235: 1394, 238: 1394, 242: 1394, 247: 1394, 387: 1394, 1394, 1394, 1394, 1394, 1394}, // 2130 - {1389, 1389, 3652, 6: 1389, 8: 3650, 21: 1389, 240: 3641, 520: 3651, 566: 3649}, - {1163, 1163, 1163, 6: 1163, 8: 1163, 21: 1163, 240: 1163, 242: 1163}, - {254: 3654, 266: 1263, 485: 3655}, - {1161, 1161, 1161, 6: 1161, 8: 1161, 21: 1161, 240: 1161, 242: 1161}, - {230: 3653}, + {1401, 1401, 1401, 1401, 1401, 1401, 1401, 21: 1401, 233: 1401, 235: 1401, 238: 1401, 242: 1401, 247: 1401, 387: 1401, 1401, 1401, 1401, 1401, 1401}, + {498: 3664}, + {24: 3659, 262: 3658, 412: 3657, 3656, 717: 3665}, + {1397, 1397, 1397, 1397, 1397, 1397, 1397, 21: 1397, 233: 1397, 235: 1397, 238: 1397, 242: 1397, 247: 1397, 387: 1397, 1397, 1397, 1397, 1397, 1397}, + {2: 1487, 1487, 1487, 1487, 7: 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 22: 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 244: 1487}, // 2135 - {1160, 1160, 1160, 6: 1160, 8: 1160, 21: 1160, 240: 1160, 242: 1160}, - {2: 1262, 1262, 1262, 1262, 7: 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 22: 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 230: 1262, 238: 1262, 266: 1262, 299: 1262}, - {266: 1624, 474: 2661, 489: 3656}, - {1162, 1162, 1162, 6: 1162, 8: 1162, 21: 1162, 240: 1162, 242: 1162}, - {228: 1157, 240: 3641, 520: 3642, 581: 3658}, + {2: 1736, 1653, 1687, 1654, 7: 1664, 1741, 1680, 1738, 1701, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 1728, 1665, 1674, 1695, 1859, 1788, 1789, 1785, 1747, 1794, 1837, 1839, 1838, 1730, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 1733, 1774, 1673, 1672, 1751, 1714, 1719, 1723, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 1784, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 1720, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 1735, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 1691, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 1652, 1656, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 1852, 1853, 1647, 1858, 1857, 1699, 1860, 1862, 1703, 1767, 1783, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 1873, 1874, 1876, 1870, 1871, 1872, 1178, 244: 1178, 393: 3636, 1649, 1650, 1648, 569: 3668}, + {232: 1169, 244: 3670, 525: 3671, 585: 3669}, + {232: 3674}, + {72: 3673, 123: 3672}, + {232: 1168, 1168}, // 2140 - {228: 3659}, - {2: 1722, 1639, 1673, 1640, 7: 1650, 1727, 1666, 1724, 1687, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 1714, 1651, 1660, 1681, 1774, 1775, 1771, 1733, 1780, 1716, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 1719, 1760, 1659, 1658, 1737, 1683, 1700, 1705, 1709, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 1770, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 1706, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 1721, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 1677, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 1638, 1642, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 1834, 1835, 1633, 1840, 1839, 1685, 1842, 1844, 1689, 1753, 1769, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 1855, 1856, 1858, 1852, 1853, 1854, 389: 1928, 1635, 1636, 1634, 479: 3610, 528: 3611, 534: 3660}, - {6: 3615, 21: 3661}, - {1164, 1164, 1164, 6: 1164, 8: 1164, 21: 1164, 240: 1164, 567: 3662}, - {1390, 1390, 3652, 6: 1390, 8: 3650, 21: 1390, 240: 3641, 520: 3651, 566: 3649}, + {1171, 1171, 1171, 6: 1171, 8: 1171, 21: 1171, 232: 1171, 1171, 244: 1171, 246: 1171}, + {1170, 1170, 1170, 6: 1170, 8: 1170, 21: 1170, 232: 1170, 1170, 244: 1170, 246: 1170}, + {2: 1736, 1653, 1687, 1654, 7: 1664, 1741, 1680, 1738, 1701, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 1728, 1665, 1674, 1695, 1859, 1788, 1789, 1785, 1747, 1794, 1837, 1839, 1838, 1730, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 1733, 1774, 1673, 1672, 1751, 1714, 1719, 1723, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 1784, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 1720, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 1735, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 1691, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 1652, 1656, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 1852, 1853, 1647, 1858, 1857, 1699, 1860, 1862, 1703, 1767, 1783, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 1873, 1874, 1876, 1870, 1871, 1872, 393: 1947, 1649, 1650, 1648, 483: 3639, 532: 3640, 538: 3675}, + {6: 3644, 21: 3676}, + {1176, 1176, 1176, 6: 1176, 8: 1176, 21: 1176, 244: 1176, 571: 3677}, // 2145 - {2: 1722, 1639, 1673, 1640, 7: 1650, 1727, 1666, 1724, 1687, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 1714, 1651, 1660, 1681, 1774, 1775, 1771, 1733, 1780, 1716, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 1719, 1760, 1659, 1658, 1737, 1683, 1700, 1705, 1709, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 1770, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 1706, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 1721, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 1677, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 1638, 1642, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 1834, 1835, 1633, 1840, 1839, 1685, 1842, 1844, 1689, 1753, 1769, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 1855, 1856, 1858, 1852, 1853, 1854, 1166, 389: 3607, 1635, 1636, 1634, 565: 3664}, - {228: 3665}, - {2: 1722, 1639, 1673, 1640, 7: 1650, 1727, 1666, 1724, 1687, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 1714, 1651, 1660, 1681, 1774, 1775, 1771, 1733, 1780, 1716, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 1719, 1760, 1659, 1658, 1737, 1683, 1700, 1705, 1709, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 1770, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 1706, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 1721, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 1677, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 1638, 1642, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 1834, 1835, 1633, 1840, 1839, 1685, 1842, 1844, 1689, 1753, 1769, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 1855, 1856, 1858, 1852, 1853, 1854, 389: 1928, 1635, 1636, 1634, 479: 3610, 528: 3611, 534: 3666}, - {6: 3615, 21: 3667}, - {1164, 1164, 1164, 6: 1164, 8: 1164, 21: 1164, 240: 1164, 567: 3668}, + {1403, 1403, 3681, 6: 1403, 8: 3679, 21: 1403, 244: 3670, 525: 3680, 570: 3678}, + {1175, 1175, 1175, 6: 1175, 8: 1175, 21: 1175, 244: 1175, 246: 1175}, + {258: 3683, 270: 1277, 489: 3684}, + {1173, 1173, 1173, 6: 1173, 8: 1173, 21: 1173, 244: 1173, 246: 1173}, + {234: 3682}, // 2150 - {1391, 1391, 3652, 6: 1391, 8: 3650, 21: 1391, 240: 3641, 520: 3651, 566: 3649}, - {2: 1722, 1639, 1673, 1640, 7: 1650, 1727, 1666, 1724, 1687, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 1714, 1651, 1660, 1681, 1774, 1775, 1771, 1733, 1780, 1716, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 1719, 1760, 1659, 1658, 1737, 1683, 1700, 1705, 1709, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 1770, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 1706, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 1721, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 1677, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 1638, 1642, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 1834, 1835, 1633, 1840, 1839, 1685, 1842, 1844, 1689, 1753, 1769, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 1855, 1856, 1858, 1852, 1853, 1854, 1166, 240: 1166, 389: 3607, 1635, 1636, 1634, 565: 3670}, - {228: 1157, 240: 3641, 520: 3642, 581: 3671}, - {228: 3672}, - {2: 1722, 1639, 1673, 1640, 7: 1650, 1727, 1666, 1724, 1687, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 1714, 1651, 1660, 1681, 1774, 1775, 1771, 1733, 1780, 1716, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 1719, 1760, 1659, 1658, 1737, 1683, 1700, 1705, 1709, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 1770, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 1706, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 1721, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 1677, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 1638, 1642, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 1834, 1835, 1633, 1840, 1839, 1685, 1842, 1844, 1689, 1753, 1769, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 1855, 1856, 1858, 1852, 1853, 1854, 389: 1928, 1635, 1636, 1634, 479: 3610, 528: 3611, 534: 3673}, + {1172, 1172, 1172, 6: 1172, 8: 1172, 21: 1172, 244: 1172, 246: 1172}, + {2: 1276, 1276, 1276, 1276, 7: 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 22: 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 234: 1276, 242: 1276, 270: 1276, 303: 1276}, + {270: 1638, 478: 2682, 493: 3685}, + {1174, 1174, 1174, 6: 1174, 8: 1174, 21: 1174, 244: 1174, 246: 1174}, + {232: 1169, 244: 3670, 525: 3671, 585: 3687}, // 2155 - {6: 3615, 21: 3674}, - {1164, 1164, 1164, 6: 1164, 8: 1164, 21: 1164, 240: 1164, 567: 3675}, - {1392, 1392, 3652, 6: 1392, 8: 3650, 21: 1392, 240: 3641, 520: 3651, 566: 3649}, - {21: 3677}, - {1305, 1305}, + {232: 3688}, + {2: 1736, 1653, 1687, 1654, 7: 1664, 1741, 1680, 1738, 1701, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 1728, 1665, 1674, 1695, 1859, 1788, 1789, 1785, 1747, 1794, 1837, 1839, 1838, 1730, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 1733, 1774, 1673, 1672, 1751, 1714, 1719, 1723, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 1784, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 1720, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 1735, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 1691, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 1652, 1656, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 1852, 1853, 1647, 1858, 1857, 1699, 1860, 1862, 1703, 1767, 1783, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 1873, 1874, 1876, 1870, 1871, 1872, 393: 1947, 1649, 1650, 1648, 483: 3639, 532: 3640, 538: 3689}, + {6: 3644, 21: 3690}, + {1176, 1176, 1176, 6: 1176, 8: 1176, 21: 1176, 244: 1176, 571: 3691}, + {1404, 1404, 3681, 6: 1404, 8: 3679, 21: 1404, 244: 3670, 525: 3680, 570: 3678}, // 2160 - {1394, 1394, 3795, 3790, 1394, 1394, 1394, 21: 1394, 229: 3794, 231: 3788, 234: 1401, 238: 3793, 243: 3789, 383: 1415, 3787, 3792, 3796, 3618, 3799, 615: 3798, 634: 3800, 672: 3797, 710: 3791, 769: 3801, 3786}, - {207, 207, 207, 207, 207, 207, 207, 21: 207, 229: 207, 231: 207, 234: 207, 238: 207, 243: 207, 383: 207, 207, 207, 207, 207, 207}, - {206, 206, 206, 206, 206, 206, 206, 21: 206, 229: 206, 231: 206, 234: 206, 238: 206, 243: 206, 383: 206, 206, 206, 206, 206, 206}, - {205, 205, 205, 205, 205, 205, 205, 21: 205, 229: 205, 231: 205, 234: 205, 238: 205, 243: 205, 383: 205, 205, 205, 205, 205, 205}, - {145, 145, 145, 145, 145, 145, 145, 12: 145, 21: 145, 228: 2659, 145, 231: 145, 234: 145, 238: 145, 243: 145, 383: 145, 145, 145, 145, 145, 145, 475: 145, 145, 487: 2660, 503: 3784}, + {2: 1736, 1653, 1687, 1654, 7: 1664, 1741, 1680, 1738, 1701, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 1728, 1665, 1674, 1695, 1859, 1788, 1789, 1785, 1747, 1794, 1837, 1839, 1838, 1730, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 1733, 1774, 1673, 1672, 1751, 1714, 1719, 1723, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 1784, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 1720, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 1735, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 1691, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 1652, 1656, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 1852, 1853, 1647, 1858, 1857, 1699, 1860, 1862, 1703, 1767, 1783, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 1873, 1874, 1876, 1870, 1871, 1872, 1178, 393: 3636, 1649, 1650, 1648, 569: 3693}, + {232: 3694}, + {2: 1736, 1653, 1687, 1654, 7: 1664, 1741, 1680, 1738, 1701, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 1728, 1665, 1674, 1695, 1859, 1788, 1789, 1785, 1747, 1794, 1837, 1839, 1838, 1730, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 1733, 1774, 1673, 1672, 1751, 1714, 1719, 1723, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 1784, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 1720, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 1735, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 1691, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 1652, 1656, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 1852, 1853, 1647, 1858, 1857, 1699, 1860, 1862, 1703, 1767, 1783, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 1873, 1874, 1876, 1870, 1871, 1872, 393: 1947, 1649, 1650, 1648, 483: 3639, 532: 3640, 538: 3695}, + {6: 3644, 21: 3696}, + {1176, 1176, 1176, 6: 1176, 8: 1176, 21: 1176, 244: 1176, 571: 3697}, // 2165 - {140, 140, 140, 140, 140, 140, 140, 12: 140, 21: 140, 229: 140, 231: 140, 234: 140, 238: 140, 243: 140, 383: 140, 140, 140, 140, 140, 140, 475: 140, 140, 563: 3783}, - {138, 138, 138, 138, 138, 138, 138, 12: 138, 21: 138, 228: 2665, 138, 231: 138, 234: 138, 238: 138, 243: 138, 383: 138, 138, 138, 138, 138, 138, 475: 138, 138, 487: 2666, 599: 3781, 612: 2667}, - {138, 138, 138, 138, 138, 138, 138, 12: 138, 21: 138, 228: 2665, 138, 231: 138, 234: 138, 238: 138, 243: 138, 383: 138, 138, 138, 138, 138, 138, 475: 138, 138, 487: 2666, 599: 3779, 612: 2667}, - {145, 145, 145, 145, 145, 145, 145, 21: 145, 228: 2659, 145, 231: 145, 234: 145, 238: 145, 243: 145, 383: 145, 145, 145, 145, 145, 145, 487: 2660, 503: 3778}, - {199, 199, 199, 199, 199, 199, 199, 12: 199, 21: 199, 228: 199, 199, 231: 199, 234: 199, 238: 199, 243: 199, 383: 199, 199, 199, 199, 199, 199, 475: 199, 199}, + {1405, 1405, 3681, 6: 1405, 8: 3679, 21: 1405, 244: 3670, 525: 3680, 570: 3678}, + {2: 1736, 1653, 1687, 1654, 7: 1664, 1741, 1680, 1738, 1701, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 1728, 1665, 1674, 1695, 1859, 1788, 1789, 1785, 1747, 1794, 1837, 1839, 1838, 1730, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 1733, 1774, 1673, 1672, 1751, 1714, 1719, 1723, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 1784, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 1720, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 1735, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 1691, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 1652, 1656, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 1852, 1853, 1647, 1858, 1857, 1699, 1860, 1862, 1703, 1767, 1783, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 1873, 1874, 1876, 1870, 1871, 1872, 1178, 244: 1178, 393: 3636, 1649, 1650, 1648, 569: 3699}, + {232: 1169, 244: 3670, 525: 3671, 585: 3700}, + {232: 3701}, + {2: 1736, 1653, 1687, 1654, 7: 1664, 1741, 1680, 1738, 1701, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 1728, 1665, 1674, 1695, 1859, 1788, 1789, 1785, 1747, 1794, 1837, 1839, 1838, 1730, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 1733, 1774, 1673, 1672, 1751, 1714, 1719, 1723, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 1784, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 1720, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 1735, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 1691, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 1652, 1656, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 1852, 1853, 1647, 1858, 1857, 1699, 1860, 1862, 1703, 1767, 1783, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 1873, 1874, 1876, 1870, 1871, 1872, 393: 1947, 1649, 1650, 1648, 483: 3639, 532: 3640, 538: 3702}, // 2170 - {198, 198, 198, 198, 198, 198, 198, 12: 198, 21: 198, 228: 198, 198, 231: 198, 234: 198, 238: 198, 243: 198, 383: 198, 198, 198, 198, 198, 198, 475: 198, 198}, - {197, 197, 197, 197, 197, 197, 197, 12: 197, 21: 197, 228: 197, 197, 231: 197, 234: 197, 238: 197, 243: 197, 383: 197, 197, 197, 197, 197, 197, 475: 197, 197}, - {196, 196, 196, 196, 196, 196, 196, 12: 196, 21: 196, 228: 196, 196, 231: 196, 234: 196, 238: 196, 243: 196, 383: 196, 196, 196, 196, 196, 196, 475: 196, 196}, - {195, 195, 195, 195, 195, 195, 195, 12: 195, 21: 195, 228: 195, 195, 231: 195, 234: 195, 238: 195, 243: 195, 383: 195, 195, 195, 195, 195, 195, 475: 195, 195}, - {194, 194, 194, 194, 194, 194, 194, 12: 194, 21: 194, 228: 194, 194, 231: 194, 234: 194, 238: 194, 243: 194, 383: 194, 194, 194, 194, 194, 194, 475: 194, 194}, + {6: 3644, 21: 3703}, + {1176, 1176, 1176, 6: 1176, 8: 1176, 21: 1176, 244: 1176, 571: 3704}, + {1406, 1406, 3681, 6: 1406, 8: 3679, 21: 1406, 244: 3670, 525: 3680, 570: 3678}, + {21: 3706}, + {1319, 1319}, // 2175 - {193, 193, 193, 193, 193, 193, 193, 12: 193, 21: 193, 228: 193, 193, 231: 193, 234: 193, 238: 193, 243: 193, 383: 193, 193, 193, 193, 193, 193, 475: 193, 193}, - {192, 192, 192, 192, 192, 192, 192, 12: 192, 21: 192, 228: 192, 192, 231: 192, 234: 192, 238: 192, 243: 192, 383: 192, 192, 192, 192, 192, 192, 475: 192, 192}, - {191, 191, 191, 191, 191, 191, 191, 12: 191, 21: 191, 228: 191, 191, 231: 191, 234: 191, 238: 191, 243: 191, 383: 191, 191, 191, 191, 191, 191, 475: 191, 191}, - {190, 190, 190, 190, 190, 190, 190, 12: 190, 21: 190, 228: 190, 190, 231: 190, 234: 190, 238: 190, 243: 190, 383: 190, 190, 190, 190, 190, 190, 475: 190, 190}, - {189, 189, 189, 189, 189, 189, 189, 12: 189, 21: 189, 228: 189, 189, 231: 189, 234: 189, 238: 189, 243: 189, 383: 189, 189, 189, 189, 189, 189, 475: 189, 189}, + {1408, 1408, 3824, 3819, 1408, 1408, 1408, 21: 1408, 233: 3823, 235: 3817, 238: 1415, 242: 3822, 247: 3818, 387: 1429, 3816, 3821, 3825, 3647, 3828, 618: 3827, 638: 3829, 676: 3826, 714: 3820, 773: 3830, 3815}, + {208, 208, 208, 208, 208, 208, 208, 21: 208, 233: 208, 235: 208, 238: 208, 242: 208, 247: 208, 387: 208, 208, 208, 208, 208, 208}, + {207, 207, 207, 207, 207, 207, 207, 21: 207, 233: 207, 235: 207, 238: 207, 242: 207, 247: 207, 387: 207, 207, 207, 207, 207, 207}, + {206, 206, 206, 206, 206, 206, 206, 21: 206, 233: 206, 235: 206, 238: 206, 242: 206, 247: 206, 387: 206, 206, 206, 206, 206, 206}, + {146, 146, 146, 146, 146, 146, 146, 12: 146, 21: 146, 232: 2680, 146, 235: 146, 238: 146, 242: 146, 247: 146, 387: 146, 146, 146, 146, 146, 146, 479: 146, 146, 491: 2681, 507: 3813}, // 2180 - {188, 188, 188, 188, 188, 188, 188, 12: 188, 21: 188, 229: 188, 231: 188, 234: 188, 238: 188, 243: 188, 383: 188, 188, 188, 188, 188, 188, 475: 188, 188}, - {187, 187, 187, 187, 187, 187, 187, 12: 187, 21: 187, 229: 187, 231: 187, 234: 187, 238: 187, 243: 187, 383: 187, 187, 187, 187, 187, 187, 475: 187, 187}, - {183, 183, 183, 183, 183, 183, 183, 12: 183, 21: 183, 228: 183, 183, 231: 183, 234: 183, 238: 183, 243: 183, 383: 183, 183, 183, 183, 183, 183, 475: 183, 183}, - {182, 182, 182, 182, 182, 182, 182, 12: 182, 21: 182, 228: 182, 182, 231: 182, 234: 182, 238: 182, 243: 182, 383: 182, 182, 182, 182, 182, 182, 475: 182, 182}, - {181, 181, 181, 181, 181, 181, 181, 12: 181, 21: 181, 228: 181, 181, 231: 181, 234: 181, 238: 181, 243: 181, 383: 181, 181, 181, 181, 181, 181, 475: 181, 181}, + {141, 141, 141, 141, 141, 141, 141, 12: 141, 21: 141, 233: 141, 235: 141, 238: 141, 242: 141, 247: 141, 387: 141, 141, 141, 141, 141, 141, 479: 141, 141, 567: 3812}, + {139, 139, 139, 139, 139, 139, 139, 12: 139, 21: 139, 232: 2686, 139, 235: 139, 238: 139, 242: 139, 247: 139, 387: 139, 139, 139, 139, 139, 139, 479: 139, 139, 491: 2687, 602: 3810, 615: 2688}, + {139, 139, 139, 139, 139, 139, 139, 12: 139, 21: 139, 232: 2686, 139, 235: 139, 238: 139, 242: 139, 247: 139, 387: 139, 139, 139, 139, 139, 139, 479: 139, 139, 491: 2687, 602: 3808, 615: 2688}, + {146, 146, 146, 146, 146, 146, 146, 21: 146, 232: 2680, 146, 235: 146, 238: 146, 242: 146, 247: 146, 387: 146, 146, 146, 146, 146, 146, 491: 2681, 507: 3807}, + {200, 200, 200, 200, 200, 200, 200, 12: 200, 21: 200, 232: 200, 200, 235: 200, 238: 200, 242: 200, 247: 200, 387: 200, 200, 200, 200, 200, 200, 479: 200, 200}, // 2185 - {180, 180, 180, 180, 180, 180, 180, 12: 180, 21: 180, 228: 180, 180, 231: 180, 234: 180, 238: 180, 243: 180, 383: 180, 180, 180, 180, 180, 180, 475: 180, 180}, - {179, 179, 179, 179, 179, 179, 179, 12: 179, 21: 179, 228: 179, 179, 231: 179, 234: 179, 238: 179, 243: 179, 383: 179, 179, 179, 179, 179, 179, 475: 179, 179, 842: 3777}, - {177, 177, 177, 177, 177, 177, 177, 21: 177, 228: 177, 177, 231: 177, 234: 177, 238: 177, 243: 177, 383: 177, 177, 177, 177, 177, 177}, - {319: 3771}, - {319: 164, 395: 3766, 421: 3767}, + {199, 199, 199, 199, 199, 199, 199, 12: 199, 21: 199, 232: 199, 199, 235: 199, 238: 199, 242: 199, 247: 199, 387: 199, 199, 199, 199, 199, 199, 479: 199, 199}, + {198, 198, 198, 198, 198, 198, 198, 12: 198, 21: 198, 232: 198, 198, 235: 198, 238: 198, 242: 198, 247: 198, 387: 198, 198, 198, 198, 198, 198, 479: 198, 198}, + {197, 197, 197, 197, 197, 197, 197, 12: 197, 21: 197, 232: 197, 197, 235: 197, 238: 197, 242: 197, 247: 197, 387: 197, 197, 197, 197, 197, 197, 479: 197, 197}, + {196, 196, 196, 196, 196, 196, 196, 12: 196, 21: 196, 232: 196, 196, 235: 196, 238: 196, 242: 196, 247: 196, 387: 196, 196, 196, 196, 196, 196, 479: 196, 196}, + {195, 195, 195, 195, 195, 195, 195, 12: 195, 21: 195, 232: 195, 195, 235: 195, 238: 195, 242: 195, 247: 195, 387: 195, 195, 195, 195, 195, 195, 479: 195, 195}, // 2190 - {228: 2659, 487: 3763}, - {145, 145, 145, 145, 145, 145, 145, 21: 145, 228: 2659, 145, 231: 145, 234: 145, 238: 145, 243: 145, 383: 145, 145, 145, 145, 145, 145, 487: 2660, 503: 3762}, - {228: 2659, 487: 3761}, - {170, 170, 170, 170, 170, 170, 170, 21: 170, 229: 170, 231: 170, 234: 170, 238: 170, 243: 170, 383: 170, 170, 170, 170, 170, 170}, - {132, 132, 132, 132, 132, 132, 132, 2678, 21: 132, 229: 132, 231: 132, 234: 132, 238: 132, 243: 132, 261: 132, 299: 2675, 383: 132, 132, 132, 132, 132, 132, 395: 2677, 498: 2676, 549: 3759}, + {194, 194, 194, 194, 194, 194, 194, 12: 194, 21: 194, 232: 194, 194, 235: 194, 238: 194, 242: 194, 247: 194, 387: 194, 194, 194, 194, 194, 194, 479: 194, 194}, + {193, 193, 193, 193, 193, 193, 193, 12: 193, 21: 193, 232: 193, 193, 235: 193, 238: 193, 242: 193, 247: 193, 387: 193, 193, 193, 193, 193, 193, 479: 193, 193}, + {192, 192, 192, 192, 192, 192, 192, 12: 192, 21: 192, 232: 192, 192, 235: 192, 238: 192, 242: 192, 247: 192, 387: 192, 192, 192, 192, 192, 192, 479: 192, 192}, + {191, 191, 191, 191, 191, 191, 191, 12: 191, 21: 191, 232: 191, 191, 235: 191, 238: 191, 242: 191, 247: 191, 387: 191, 191, 191, 191, 191, 191, 479: 191, 191}, + {190, 190, 190, 190, 190, 190, 190, 12: 190, 21: 190, 232: 190, 190, 235: 190, 238: 190, 242: 190, 247: 190, 387: 190, 190, 190, 190, 190, 190, 479: 190, 190}, // 2195 - {228: 3754}, - {228: 3744}, - {166, 166, 166, 166, 166, 166, 166, 21: 166, 229: 166, 231: 166, 234: 166, 238: 166, 243: 166, 383: 166, 166, 166, 166, 166, 166}, - {228: 162}, - {228: 161}, + {189, 189, 189, 189, 189, 189, 189, 12: 189, 21: 189, 233: 189, 235: 189, 238: 189, 242: 189, 247: 189, 387: 189, 189, 189, 189, 189, 189, 479: 189, 189}, + {188, 188, 188, 188, 188, 188, 188, 12: 188, 21: 188, 233: 188, 235: 188, 238: 188, 242: 188, 247: 188, 387: 188, 188, 188, 188, 188, 188, 479: 188, 188}, + {184, 184, 184, 184, 184, 184, 184, 12: 184, 21: 184, 232: 184, 184, 235: 184, 238: 184, 242: 184, 247: 184, 387: 184, 184, 184, 184, 184, 184, 479: 184, 184}, + {183, 183, 183, 183, 183, 183, 183, 12: 183, 21: 183, 232: 183, 183, 235: 183, 238: 183, 242: 183, 247: 183, 387: 183, 183, 183, 183, 183, 183, 479: 183, 183}, + {182, 182, 182, 182, 182, 182, 182, 12: 182, 21: 182, 232: 182, 182, 235: 182, 238: 182, 242: 182, 247: 182, 387: 182, 182, 182, 182, 182, 182, 479: 182, 182}, // 2200 - {160, 160, 160, 160, 160, 160, 160, 21: 160, 229: 160, 231: 160, 234: 160, 238: 160, 243: 160, 383: 160, 160, 160, 160, 160, 160}, - {145, 145, 145, 145, 145, 145, 145, 21: 145, 228: 2659, 145, 231: 145, 234: 145, 238: 145, 243: 145, 383: 145, 145, 145, 145, 145, 145, 487: 2660, 503: 3743}, - {158, 158, 158, 158, 158, 158, 158, 21: 158, 229: 158, 231: 158, 234: 158, 238: 158, 243: 158, 383: 158, 158, 158, 158, 158, 158}, - {157, 157, 157, 157, 157, 157, 157, 21: 157, 229: 157, 231: 157, 234: 157, 238: 157, 243: 157, 383: 157, 157, 157, 157, 157, 157}, - {156, 156, 156, 156, 156, 156, 156, 156, 21: 156, 229: 156, 231: 156, 234: 156, 238: 156, 243: 156, 261: 156, 299: 156, 383: 156, 156, 156, 156, 156, 156, 395: 156}, + {181, 181, 181, 181, 181, 181, 181, 12: 181, 21: 181, 232: 181, 181, 235: 181, 238: 181, 242: 181, 247: 181, 387: 181, 181, 181, 181, 181, 181, 479: 181, 181}, + {180, 180, 180, 180, 180, 180, 180, 12: 180, 21: 180, 232: 180, 180, 235: 180, 238: 180, 242: 180, 247: 180, 387: 180, 180, 180, 180, 180, 180, 479: 180, 180, 846: 3806}, + {178, 178, 178, 178, 178, 178, 178, 21: 178, 232: 178, 178, 235: 178, 238: 178, 242: 178, 247: 178, 387: 178, 178, 178, 178, 178, 178}, + {323: 3800}, + {323: 165, 399: 3795, 425: 3796}, // 2205 - {145, 145, 145, 145, 145, 145, 145, 145, 21: 145, 228: 2659, 145, 231: 145, 234: 145, 238: 145, 243: 145, 261: 145, 299: 145, 383: 145, 145, 145, 145, 145, 145, 395: 145, 487: 2660, 503: 3742}, - {154, 154, 154, 154, 154, 154, 154, 154, 21: 154, 229: 154, 231: 154, 234: 154, 238: 154, 243: 154, 261: 154, 299: 154, 383: 154, 154, 154, 154, 154, 154, 395: 154}, - {153, 153, 153, 153, 153, 153, 153, 153, 21: 153, 229: 153, 231: 153, 234: 153, 238: 153, 243: 153, 261: 153, 299: 153, 383: 153, 153, 153, 153, 153, 153, 395: 153}, - {421: 3741}, - {151, 151, 151, 151, 151, 151, 151, 21: 151, 229: 151, 231: 151, 234: 151, 238: 151, 243: 151, 383: 151, 151, 151, 151, 151, 151}, + {232: 2680, 491: 3792}, + {146, 146, 146, 146, 146, 146, 146, 21: 146, 232: 2680, 146, 235: 146, 238: 146, 242: 146, 247: 146, 387: 146, 146, 146, 146, 146, 146, 491: 2681, 507: 3791}, + {232: 2680, 491: 3790}, + {171, 171, 171, 171, 171, 171, 171, 21: 171, 233: 171, 235: 171, 238: 171, 242: 171, 247: 171, 387: 171, 171, 171, 171, 171, 171}, + {133, 133, 133, 133, 133, 133, 133, 2699, 21: 133, 233: 133, 235: 133, 238: 133, 242: 133, 247: 133, 264: 133, 303: 2696, 387: 133, 133, 133, 133, 133, 133, 399: 2698, 502: 2697, 553: 3788}, // 2210 - {145, 145, 145, 145, 145, 145, 145, 21: 145, 228: 2659, 145, 231: 145, 234: 145, 238: 145, 243: 145, 383: 145, 145, 145, 145, 145, 145, 487: 2660, 503: 3740}, - {145, 145, 145, 145, 145, 145, 145, 21: 145, 228: 2659, 145, 231: 145, 234: 145, 238: 145, 243: 145, 383: 145, 145, 145, 145, 145, 145, 487: 2660, 503: 3739}, - {145, 145, 145, 145, 145, 145, 145, 21: 145, 228: 2659, 145, 231: 145, 234: 145, 238: 145, 243: 145, 383: 145, 145, 145, 145, 145, 145, 487: 2660, 503: 3738}, - {145, 145, 145, 145, 145, 145, 145, 12: 145, 21: 145, 228: 2659, 145, 231: 145, 234: 145, 238: 145, 243: 145, 383: 145, 145, 145, 145, 145, 145, 475: 145, 145, 487: 2660, 503: 3732}, - {140, 140, 140, 140, 140, 140, 140, 12: 140, 21: 140, 229: 140, 231: 140, 234: 140, 238: 140, 243: 140, 383: 140, 140, 140, 140, 140, 140, 475: 140, 140, 563: 3733}, + {232: 3783}, + {232: 3773}, + {167, 167, 167, 167, 167, 167, 167, 21: 167, 233: 167, 235: 167, 238: 167, 242: 167, 247: 167, 387: 167, 167, 167, 167, 167, 167}, + {232: 163}, + {232: 162}, // 2215 - {147, 147, 147, 147, 147, 147, 147, 12: 3735, 21: 147, 229: 147, 231: 147, 234: 147, 238: 147, 243: 147, 383: 147, 147, 147, 147, 147, 147, 475: 3734, 3736, 562: 3737}, - {143, 143, 143, 143, 143, 143, 143, 12: 143, 21: 143, 229: 143, 231: 143, 234: 143, 238: 143, 243: 143, 383: 143, 143, 143, 143, 143, 143, 475: 143, 143}, - {142, 142, 142, 142, 142, 142, 142, 12: 142, 21: 142, 229: 142, 231: 142, 234: 142, 238: 142, 243: 142, 383: 142, 142, 142, 142, 142, 142, 475: 142, 142}, - {141, 141, 141, 141, 141, 141, 141, 12: 141, 21: 141, 229: 141, 231: 141, 234: 141, 238: 141, 243: 141, 383: 141, 141, 141, 141, 141, 141, 475: 141, 141}, - {139, 139, 139, 139, 139, 139, 139, 12: 139, 21: 139, 229: 139, 231: 139, 234: 139, 238: 139, 243: 139, 383: 139, 139, 139, 139, 139, 139, 475: 139, 139}, + {161, 161, 161, 161, 161, 161, 161, 21: 161, 233: 161, 235: 161, 238: 161, 242: 161, 247: 161, 387: 161, 161, 161, 161, 161, 161}, + {146, 146, 146, 146, 146, 146, 146, 21: 146, 232: 2680, 146, 235: 146, 238: 146, 242: 146, 247: 146, 387: 146, 146, 146, 146, 146, 146, 491: 2681, 507: 3772}, + {159, 159, 159, 159, 159, 159, 159, 21: 159, 233: 159, 235: 159, 238: 159, 242: 159, 247: 159, 387: 159, 159, 159, 159, 159, 159}, + {158, 158, 158, 158, 158, 158, 158, 21: 158, 233: 158, 235: 158, 238: 158, 242: 158, 247: 158, 387: 158, 158, 158, 158, 158, 158}, + {157, 157, 157, 157, 157, 157, 157, 157, 21: 157, 233: 157, 235: 157, 238: 157, 242: 157, 247: 157, 264: 157, 303: 157, 387: 157, 157, 157, 157, 157, 157, 399: 157}, // 2220 - {148, 148, 148, 148, 148, 148, 148, 21: 148, 229: 148, 231: 148, 234: 148, 238: 148, 243: 148, 383: 148, 148, 148, 148, 148, 148}, - {149, 149, 149, 149, 149, 149, 149, 21: 149, 229: 149, 231: 149, 234: 149, 238: 149, 243: 149, 383: 149, 149, 149, 149, 149, 149}, - {150, 150, 150, 150, 150, 150, 150, 21: 150, 229: 150, 231: 150, 234: 150, 238: 150, 243: 150, 383: 150, 150, 150, 150, 150, 150}, - {152, 152, 152, 152, 152, 152, 152, 152, 21: 152, 229: 152, 231: 152, 234: 152, 238: 152, 243: 152, 261: 152, 299: 152, 383: 152, 152, 152, 152, 152, 152, 395: 152}, - {155, 155, 155, 155, 155, 155, 155, 155, 21: 155, 229: 155, 231: 155, 234: 155, 238: 155, 243: 155, 261: 155, 299: 155, 383: 155, 155, 155, 155, 155, 155, 395: 155}, + {146, 146, 146, 146, 146, 146, 146, 146, 21: 146, 232: 2680, 146, 235: 146, 238: 146, 242: 146, 247: 146, 264: 146, 303: 146, 387: 146, 146, 146, 146, 146, 146, 399: 146, 491: 2681, 507: 3771}, + {155, 155, 155, 155, 155, 155, 155, 155, 21: 155, 233: 155, 235: 155, 238: 155, 242: 155, 247: 155, 264: 155, 303: 155, 387: 155, 155, 155, 155, 155, 155, 399: 155}, + {154, 154, 154, 154, 154, 154, 154, 154, 21: 154, 233: 154, 235: 154, 238: 154, 242: 154, 247: 154, 264: 154, 303: 154, 387: 154, 154, 154, 154, 154, 154, 399: 154}, + {425: 3770}, + {152, 152, 152, 152, 152, 152, 152, 21: 152, 233: 152, 235: 152, 238: 152, 242: 152, 247: 152, 387: 152, 152, 152, 152, 152, 152}, // 2225 - {159, 159, 159, 159, 159, 159, 159, 21: 159, 229: 159, 231: 159, 234: 159, 238: 159, 243: 159, 383: 159, 159, 159, 159, 159, 159}, - {230: 3746, 731: 3745}, - {6: 3748, 21: 3747}, - {6: 123, 21: 123}, - {129, 129, 129, 129, 129, 129, 129, 2678, 21: 129, 229: 129, 231: 129, 234: 129, 238: 129, 243: 129, 261: 129, 383: 129, 129, 129, 129, 129, 129, 395: 2677, 498: 2684, 610: 3750}, + {146, 146, 146, 146, 146, 146, 146, 21: 146, 232: 2680, 146, 235: 146, 238: 146, 242: 146, 247: 146, 387: 146, 146, 146, 146, 146, 146, 491: 2681, 507: 3769}, + {146, 146, 146, 146, 146, 146, 146, 21: 146, 232: 2680, 146, 235: 146, 238: 146, 242: 146, 247: 146, 387: 146, 146, 146, 146, 146, 146, 491: 2681, 507: 3768}, + {146, 146, 146, 146, 146, 146, 146, 21: 146, 232: 2680, 146, 235: 146, 238: 146, 242: 146, 247: 146, 387: 146, 146, 146, 146, 146, 146, 491: 2681, 507: 3767}, + {146, 146, 146, 146, 146, 146, 146, 12: 146, 21: 146, 232: 2680, 146, 235: 146, 238: 146, 242: 146, 247: 146, 387: 146, 146, 146, 146, 146, 146, 479: 146, 146, 491: 2681, 507: 3761}, + {141, 141, 141, 141, 141, 141, 141, 12: 141, 21: 141, 233: 141, 235: 141, 238: 141, 242: 141, 247: 141, 387: 141, 141, 141, 141, 141, 141, 479: 141, 141, 567: 3762}, // 2230 - {230: 3749}, - {6: 122, 21: 122}, - {125, 125, 125, 125, 125, 125, 125, 21: 125, 229: 125, 231: 125, 234: 125, 238: 125, 243: 125, 261: 3752, 383: 125, 125, 125, 125, 125, 125, 530: 3751}, - {167, 167, 167, 167, 167, 167, 167, 21: 167, 229: 167, 231: 167, 234: 167, 238: 167, 243: 167, 383: 167, 167, 167, 167, 167, 167}, - {2: 1722, 1639, 1673, 1640, 7: 1650, 1727, 1666, 1724, 1687, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 1714, 1651, 1660, 1681, 1774, 1775, 1771, 1733, 1780, 1716, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 1719, 1760, 1659, 1658, 1737, 1683, 1700, 1705, 1709, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 1770, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 1706, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 1721, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 1677, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 1638, 1642, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 1834, 1835, 1633, 1840, 1839, 1685, 1842, 1844, 1689, 1753, 1769, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 1855, 1856, 1858, 1852, 1853, 1854, 230: 1889, 389: 1890, 1635, 1636, 1634, 473: 3753}, + {148, 148, 148, 148, 148, 148, 148, 12: 3764, 21: 148, 233: 148, 235: 148, 238: 148, 242: 148, 247: 148, 387: 148, 148, 148, 148, 148, 148, 479: 3763, 3765, 566: 3766}, + {144, 144, 144, 144, 144, 144, 144, 12: 144, 21: 144, 233: 144, 235: 144, 238: 144, 242: 144, 247: 144, 387: 144, 144, 144, 144, 144, 144, 479: 144, 144}, + {143, 143, 143, 143, 143, 143, 143, 12: 143, 21: 143, 233: 143, 235: 143, 238: 143, 242: 143, 247: 143, 387: 143, 143, 143, 143, 143, 143, 479: 143, 143}, + {142, 142, 142, 142, 142, 142, 142, 12: 142, 21: 142, 233: 142, 235: 142, 238: 142, 242: 142, 247: 142, 387: 142, 142, 142, 142, 142, 142, 479: 142, 142}, + {140, 140, 140, 140, 140, 140, 140, 12: 140, 21: 140, 233: 140, 235: 140, 238: 140, 242: 140, 247: 140, 387: 140, 140, 140, 140, 140, 140, 479: 140, 140}, // 2235 - {124, 124, 124, 124, 124, 124, 124, 21: 124, 229: 124, 231: 124, 234: 124, 238: 124, 243: 124, 383: 124, 124, 124, 124, 124, 124}, - {230: 3746, 731: 3755}, - {6: 3748, 21: 3756}, - {129, 129, 129, 129, 129, 129, 129, 2678, 21: 129, 229: 129, 231: 129, 234: 129, 238: 129, 243: 129, 261: 129, 383: 129, 129, 129, 129, 129, 129, 395: 2677, 498: 2684, 610: 3757}, - {125, 125, 125, 125, 125, 125, 125, 21: 125, 229: 125, 231: 125, 234: 125, 238: 125, 243: 125, 261: 3752, 383: 125, 125, 125, 125, 125, 125, 530: 3758}, + {149, 149, 149, 149, 149, 149, 149, 21: 149, 233: 149, 235: 149, 238: 149, 242: 149, 247: 149, 387: 149, 149, 149, 149, 149, 149}, + {150, 150, 150, 150, 150, 150, 150, 21: 150, 233: 150, 235: 150, 238: 150, 242: 150, 247: 150, 387: 150, 150, 150, 150, 150, 150}, + {151, 151, 151, 151, 151, 151, 151, 21: 151, 233: 151, 235: 151, 238: 151, 242: 151, 247: 151, 387: 151, 151, 151, 151, 151, 151}, + {153, 153, 153, 153, 153, 153, 153, 153, 21: 153, 233: 153, 235: 153, 238: 153, 242: 153, 247: 153, 264: 153, 303: 153, 387: 153, 153, 153, 153, 153, 153, 399: 153}, + {156, 156, 156, 156, 156, 156, 156, 156, 21: 156, 233: 156, 235: 156, 238: 156, 242: 156, 247: 156, 264: 156, 303: 156, 387: 156, 156, 156, 156, 156, 156, 399: 156}, // 2240 - {168, 168, 168, 168, 168, 168, 168, 21: 168, 229: 168, 231: 168, 234: 168, 238: 168, 243: 168, 383: 168, 168, 168, 168, 168, 168}, - {125, 125, 125, 125, 125, 125, 125, 21: 125, 229: 125, 231: 125, 234: 125, 238: 125, 243: 125, 261: 3752, 383: 125, 125, 125, 125, 125, 125, 530: 3760}, - {169, 169, 169, 169, 169, 169, 169, 21: 169, 229: 169, 231: 169, 234: 169, 238: 169, 243: 169, 383: 169, 169, 169, 169, 169, 169}, - {171, 171, 171, 171, 171, 171, 171, 21: 171, 229: 171, 231: 171, 234: 171, 238: 171, 243: 171, 383: 171, 171, 171, 171, 171, 171}, - {172, 172, 172, 172, 172, 172, 172, 21: 172, 229: 172, 231: 172, 234: 172, 238: 172, 243: 172, 383: 172, 172, 172, 172, 172, 172}, + {160, 160, 160, 160, 160, 160, 160, 21: 160, 233: 160, 235: 160, 238: 160, 242: 160, 247: 160, 387: 160, 160, 160, 160, 160, 160}, + {234: 3775, 735: 3774}, + {6: 3777, 21: 3776}, + {6: 124, 21: 124}, + {130, 130, 130, 130, 130, 130, 130, 2699, 21: 130, 233: 130, 235: 130, 238: 130, 242: 130, 247: 130, 264: 130, 387: 130, 130, 130, 130, 130, 130, 399: 2698, 502: 2705, 613: 3779}, // 2245 - {132, 132, 132, 132, 132, 132, 132, 2678, 21: 132, 229: 132, 231: 132, 234: 132, 238: 132, 243: 132, 261: 132, 299: 2675, 383: 132, 132, 132, 132, 132, 132, 395: 2677, 498: 2676, 549: 3764}, - {125, 125, 125, 125, 125, 125, 125, 21: 125, 229: 125, 231: 125, 234: 125, 238: 125, 243: 125, 261: 3752, 383: 125, 125, 125, 125, 125, 125, 530: 3765}, - {173, 173, 173, 173, 173, 173, 173, 21: 173, 229: 173, 231: 173, 234: 173, 238: 173, 243: 173, 383: 173, 173, 173, 173, 173, 173}, - {228: 2659, 487: 3768}, - {228: 163}, + {234: 3778}, + {6: 123, 21: 123}, + {126, 126, 126, 126, 126, 126, 126, 21: 126, 233: 126, 235: 126, 238: 126, 242: 126, 247: 126, 264: 3781, 387: 126, 126, 126, 126, 126, 126, 534: 3780}, + {168, 168, 168, 168, 168, 168, 168, 21: 168, 233: 168, 235: 168, 238: 168, 242: 168, 247: 168, 387: 168, 168, 168, 168, 168, 168}, + {2: 1736, 1653, 1687, 1654, 7: 1664, 1741, 1680, 1738, 1701, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 1728, 1665, 1674, 1695, 1859, 1788, 1789, 1785, 1747, 1794, 1837, 1839, 1838, 1730, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 1733, 1774, 1673, 1672, 1751, 1714, 1719, 1723, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 1784, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 1720, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 1735, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 1691, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 1652, 1656, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 1852, 1853, 1647, 1858, 1857, 1699, 1860, 1862, 1703, 1767, 1783, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 1873, 1874, 1876, 1870, 1871, 1872, 234: 1908, 393: 1909, 1649, 1650, 1648, 477: 3782}, // 2250 - {132, 132, 132, 132, 132, 132, 132, 2678, 21: 132, 229: 132, 231: 132, 234: 132, 238: 132, 243: 132, 261: 132, 299: 2675, 383: 132, 132, 132, 132, 132, 132, 395: 2677, 498: 2676, 549: 3769}, - {125, 125, 125, 125, 125, 125, 125, 21: 125, 229: 125, 231: 125, 234: 125, 238: 125, 243: 125, 261: 3752, 383: 125, 125, 125, 125, 125, 125, 530: 3770}, - {174, 174, 174, 174, 174, 174, 174, 21: 174, 229: 174, 231: 174, 234: 174, 238: 174, 243: 174, 383: 174, 174, 174, 174, 174, 174}, - {132, 132, 132, 132, 132, 132, 132, 2678, 21: 132, 228: 2659, 132, 231: 132, 234: 132, 238: 132, 243: 132, 261: 132, 299: 2675, 383: 132, 132, 132, 132, 132, 132, 395: 2677, 487: 3772, 498: 2676, 549: 3773}, - {132, 132, 132, 132, 132, 132, 132, 2678, 21: 132, 229: 132, 231: 132, 234: 132, 238: 132, 243: 132, 261: 132, 299: 2675, 383: 132, 132, 132, 132, 132, 132, 395: 2677, 498: 2676, 549: 3775}, + {125, 125, 125, 125, 125, 125, 125, 21: 125, 233: 125, 235: 125, 238: 125, 242: 125, 247: 125, 387: 125, 125, 125, 125, 125, 125}, + {234: 3775, 735: 3784}, + {6: 3777, 21: 3785}, + {130, 130, 130, 130, 130, 130, 130, 2699, 21: 130, 233: 130, 235: 130, 238: 130, 242: 130, 247: 130, 264: 130, 387: 130, 130, 130, 130, 130, 130, 399: 2698, 502: 2705, 613: 3786}, + {126, 126, 126, 126, 126, 126, 126, 21: 126, 233: 126, 235: 126, 238: 126, 242: 126, 247: 126, 264: 3781, 387: 126, 126, 126, 126, 126, 126, 534: 3787}, // 2255 - {125, 125, 125, 125, 125, 125, 125, 21: 125, 229: 125, 231: 125, 234: 125, 238: 125, 243: 125, 261: 3752, 383: 125, 125, 125, 125, 125, 125, 530: 3774}, - {175, 175, 175, 175, 175, 175, 175, 21: 175, 229: 175, 231: 175, 234: 175, 238: 175, 243: 175, 383: 175, 175, 175, 175, 175, 175}, - {125, 125, 125, 125, 125, 125, 125, 21: 125, 229: 125, 231: 125, 234: 125, 238: 125, 243: 125, 261: 3752, 383: 125, 125, 125, 125, 125, 125, 530: 3776}, - {176, 176, 176, 176, 176, 176, 176, 21: 176, 229: 176, 231: 176, 234: 176, 238: 176, 243: 176, 383: 176, 176, 176, 176, 176, 176}, - {178, 178, 178, 178, 178, 178, 178, 12: 178, 21: 178, 228: 178, 178, 231: 178, 234: 178, 238: 178, 243: 178, 383: 178, 178, 178, 178, 178, 178, 475: 178, 178}, + {169, 169, 169, 169, 169, 169, 169, 21: 169, 233: 169, 235: 169, 238: 169, 242: 169, 247: 169, 387: 169, 169, 169, 169, 169, 169}, + {126, 126, 126, 126, 126, 126, 126, 21: 126, 233: 126, 235: 126, 238: 126, 242: 126, 247: 126, 264: 3781, 387: 126, 126, 126, 126, 126, 126, 534: 3789}, + {170, 170, 170, 170, 170, 170, 170, 21: 170, 233: 170, 235: 170, 238: 170, 242: 170, 247: 170, 387: 170, 170, 170, 170, 170, 170}, + {172, 172, 172, 172, 172, 172, 172, 21: 172, 233: 172, 235: 172, 238: 172, 242: 172, 247: 172, 387: 172, 172, 172, 172, 172, 172}, + {173, 173, 173, 173, 173, 173, 173, 21: 173, 233: 173, 235: 173, 238: 173, 242: 173, 247: 173, 387: 173, 173, 173, 173, 173, 173}, // 2260 - {200, 200, 200, 200, 200, 200, 200, 21: 200, 229: 200, 231: 200, 234: 200, 238: 200, 243: 200, 383: 200, 200, 200, 200, 200, 200}, - {140, 140, 140, 140, 140, 140, 140, 12: 140, 21: 140, 229: 140, 231: 140, 234: 140, 238: 140, 243: 140, 383: 140, 140, 140, 140, 140, 140, 475: 140, 140, 563: 3780}, - {201, 201, 201, 201, 201, 201, 201, 12: 3735, 21: 201, 229: 201, 231: 201, 234: 201, 238: 201, 243: 201, 383: 201, 201, 201, 201, 201, 201, 475: 3734, 3736, 562: 3737}, - {140, 140, 140, 140, 140, 140, 140, 12: 140, 21: 140, 229: 140, 231: 140, 234: 140, 238: 140, 243: 140, 383: 140, 140, 140, 140, 140, 140, 475: 140, 140, 563: 3782}, - {202, 202, 202, 202, 202, 202, 202, 12: 3735, 21: 202, 229: 202, 231: 202, 234: 202, 238: 202, 243: 202, 383: 202, 202, 202, 202, 202, 202, 475: 3734, 3736, 562: 3737}, + {133, 133, 133, 133, 133, 133, 133, 2699, 21: 133, 233: 133, 235: 133, 238: 133, 242: 133, 247: 133, 264: 133, 303: 2696, 387: 133, 133, 133, 133, 133, 133, 399: 2698, 502: 2697, 553: 3793}, + {126, 126, 126, 126, 126, 126, 126, 21: 126, 233: 126, 235: 126, 238: 126, 242: 126, 247: 126, 264: 3781, 387: 126, 126, 126, 126, 126, 126, 534: 3794}, + {174, 174, 174, 174, 174, 174, 174, 21: 174, 233: 174, 235: 174, 238: 174, 242: 174, 247: 174, 387: 174, 174, 174, 174, 174, 174}, + {232: 2680, 491: 3797}, + {232: 164}, // 2265 - {203, 203, 203, 203, 203, 203, 203, 12: 3735, 21: 203, 229: 203, 231: 203, 234: 203, 238: 203, 243: 203, 383: 203, 203, 203, 203, 203, 203, 475: 3734, 3736, 562: 3737}, - {140, 140, 140, 140, 140, 140, 140, 12: 140, 21: 140, 229: 140, 231: 140, 234: 140, 238: 140, 243: 140, 383: 140, 140, 140, 140, 140, 140, 475: 140, 140, 563: 3785}, - {204, 204, 204, 204, 204, 204, 204, 12: 3735, 21: 204, 229: 204, 231: 204, 234: 204, 238: 204, 243: 204, 383: 204, 204, 204, 204, 204, 204, 475: 3734, 3736, 562: 3737}, - {1438, 1438, 4: 1438, 1438, 1438, 21: 1438}, - {383: 1414}, + {133, 133, 133, 133, 133, 133, 133, 2699, 21: 133, 233: 133, 235: 133, 238: 133, 242: 133, 247: 133, 264: 133, 303: 2696, 387: 133, 133, 133, 133, 133, 133, 399: 2698, 502: 2697, 553: 3798}, + {126, 126, 126, 126, 126, 126, 126, 21: 126, 233: 126, 235: 126, 238: 126, 242: 126, 247: 126, 264: 3781, 387: 126, 126, 126, 126, 126, 126, 534: 3799}, + {175, 175, 175, 175, 175, 175, 175, 21: 175, 233: 175, 235: 175, 238: 175, 242: 175, 247: 175, 387: 175, 175, 175, 175, 175, 175}, + {133, 133, 133, 133, 133, 133, 133, 2699, 21: 133, 232: 2680, 133, 235: 133, 238: 133, 242: 133, 247: 133, 264: 133, 303: 2696, 387: 133, 133, 133, 133, 133, 133, 399: 2698, 491: 3801, 502: 2697, 553: 3802}, + {133, 133, 133, 133, 133, 133, 133, 2699, 21: 133, 233: 133, 235: 133, 238: 133, 242: 133, 247: 133, 264: 133, 303: 2696, 387: 133, 133, 133, 133, 133, 133, 399: 2698, 502: 2697, 553: 3804}, // 2270 - {243: 3837}, - {1412, 1412, 1412, 1412, 1412, 1412, 1412, 21: 1412, 229: 1412, 231: 1412, 234: 1412, 238: 1412, 243: 1412, 383: 1412, 1412, 1412, 1412, 1412, 1412}, - {1411, 1411, 1411, 1411, 1411, 1411, 1411, 21: 1411, 229: 1411, 231: 1411, 234: 1411, 238: 1411, 243: 1411, 383: 1411, 1411, 1411, 1411, 1411, 1411}, - {383: 3836}, - {1409, 1409, 1409, 1409, 1409, 1409, 1409, 21: 1409, 229: 1409, 231: 1409, 234: 1409, 238: 1409, 243: 1409, 383: 3835, 1409, 1409, 1409, 1409, 1409}, + {126, 126, 126, 126, 126, 126, 126, 21: 126, 233: 126, 235: 126, 238: 126, 242: 126, 247: 126, 264: 3781, 387: 126, 126, 126, 126, 126, 126, 534: 3803}, + {176, 176, 176, 176, 176, 176, 176, 21: 176, 233: 176, 235: 176, 238: 176, 242: 176, 247: 176, 387: 176, 176, 176, 176, 176, 176}, + {126, 126, 126, 126, 126, 126, 126, 21: 126, 233: 126, 235: 126, 238: 126, 242: 126, 247: 126, 264: 3781, 387: 126, 126, 126, 126, 126, 126, 534: 3805}, + {177, 177, 177, 177, 177, 177, 177, 21: 177, 233: 177, 235: 177, 238: 177, 242: 177, 247: 177, 387: 177, 177, 177, 177, 177, 177}, + {179, 179, 179, 179, 179, 179, 179, 12: 179, 21: 179, 232: 179, 179, 235: 179, 238: 179, 242: 179, 247: 179, 387: 179, 179, 179, 179, 179, 179, 479: 179, 179}, // 2275 - {230: 2153, 235: 3831, 3832, 243: 2144, 266: 2148, 316: 2147, 2146, 324: 2143, 2145, 327: 2152, 3822, 3819, 331: 2151, 3820, 3821, 2150, 450: 3830, 452: 2149, 691: 3817, 3818, 3828, 728: 3829, 781: 3827}, - {494: 3815}, - {230: 3814}, - {228: 3811}, - {234: 3804}, + {201, 201, 201, 201, 201, 201, 201, 21: 201, 233: 201, 235: 201, 238: 201, 242: 201, 247: 201, 387: 201, 201, 201, 201, 201, 201}, + {141, 141, 141, 141, 141, 141, 141, 12: 141, 21: 141, 233: 141, 235: 141, 238: 141, 242: 141, 247: 141, 387: 141, 141, 141, 141, 141, 141, 479: 141, 141, 567: 3809}, + {202, 202, 202, 202, 202, 202, 202, 12: 3764, 21: 202, 233: 202, 235: 202, 238: 202, 242: 202, 247: 202, 387: 202, 202, 202, 202, 202, 202, 479: 3763, 3765, 566: 3766}, + {141, 141, 141, 141, 141, 141, 141, 12: 141, 21: 141, 233: 141, 235: 141, 238: 141, 242: 141, 247: 141, 387: 141, 141, 141, 141, 141, 141, 479: 141, 141, 567: 3811}, + {203, 203, 203, 203, 203, 203, 203, 12: 3764, 21: 203, 233: 203, 235: 203, 238: 203, 242: 203, 247: 203, 387: 203, 203, 203, 203, 203, 203, 479: 3763, 3765, 566: 3766}, // 2280 - {1402, 1402, 1402, 1402, 1402, 1402, 1402, 21: 1402, 229: 1402, 231: 1402, 234: 1402, 238: 1402, 243: 1402, 383: 1402, 1402, 1402, 1402, 1402, 1402}, - {114: 3803}, - {1396, 1396, 1396, 1396, 1396, 1396, 1396, 21: 1396, 229: 1396, 231: 1396, 234: 1396, 238: 1396, 243: 1396, 383: 1396, 1396, 1396, 1396, 1396, 1396}, - {1393, 1393, 3795, 3790, 1393, 1393, 1393, 21: 1393, 229: 3794, 231: 3788, 234: 1401, 238: 3793, 243: 3789, 383: 1415, 3787, 3792, 3796, 3618, 3799, 615: 3798, 634: 3802, 672: 3797, 710: 3791}, - {1395, 1395, 1395, 1395, 1395, 1395, 1395, 21: 1395, 229: 1395, 231: 1395, 234: 1395, 238: 1395, 243: 1395, 383: 1395, 1395, 1395, 1395, 1395, 1395}, + {204, 204, 204, 204, 204, 204, 204, 12: 3764, 21: 204, 233: 204, 235: 204, 238: 204, 242: 204, 247: 204, 387: 204, 204, 204, 204, 204, 204, 479: 3763, 3765, 566: 3766}, + {141, 141, 141, 141, 141, 141, 141, 12: 141, 21: 141, 233: 141, 235: 141, 238: 141, 242: 141, 247: 141, 387: 141, 141, 141, 141, 141, 141, 479: 141, 141, 567: 3814}, + {205, 205, 205, 205, 205, 205, 205, 12: 3764, 21: 205, 233: 205, 235: 205, 238: 205, 242: 205, 247: 205, 387: 205, 205, 205, 205, 205, 205, 479: 3763, 3765, 566: 3766}, + {1452, 1452, 4: 1452, 1452, 1452, 21: 1452}, + {387: 1428}, // 2285 - {234: 1400}, - {228: 3805}, - {2: 1722, 1639, 1673, 1640, 7: 2119, 1727, 1666, 1724, 2124, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 2128, 1651, 2121, 2123, 2137, 2138, 2136, 2132, 2139, 2129, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 2130, 1760, 1659, 2120, 1737, 1683, 1700, 2125, 2127, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 2135, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 2126, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 2131, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 2122, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 2117, 2118, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 2140, 1835, 2116, 1840, 1839, 1685, 1842, 1844, 1689, 2133, 2134, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 2141, 2142, 1858, 1852, 1853, 1854, 2172, 230: 2153, 2112, 2184, 2188, 235: 2169, 2168, 2205, 2179, 243: 2144, 266: 2148, 2187, 290: 2156, 299: 2175, 311: 2189, 2110, 2182, 2204, 2206, 2147, 2146, 2163, 2203, 2183, 2180, 2174, 2178, 2143, 2145, 2181, 2152, 2185, 2193, 2244, 2151, 2194, 2195, 2150, 2173, 2166, 2167, 2217, 2219, 2220, 2221, 2176, 2222, 2201, 2207, 2215, 2216, 2211, 2223, 2224, 2225, 2212, 2227, 2228, 2218, 2213, 2226, 2208, 2214, 2199, 2229, 2230, 2177, 2234, 2190, 2192, 2233, 2239, 2238, 2240, 2237, 2170, 2241, 2236, 2235, 2232, 2186, 2231, 2191, 2196, 2197, 389: 2155, 1635, 1636, 1634, 448: 2171, 2243, 2162, 2157, 2149, 2160, 2158, 2159, 2198, 2210, 2209, 2202, 2200, 2154, 2165, 2242, 2164, 2161, 2115, 2114, 2113, 3806}, - {21: 3807, 246: 2253, 248: 2251, 250: 2252, 2250, 2248, 470: 2249, 2247}, - {1399, 1399, 1399, 1399, 1399, 1399, 1399, 21: 1399, 229: 1399, 231: 1399, 234: 1399, 238: 1399, 243: 1399, 383: 1399, 1399, 1399, 1399, 1399, 1399, 861: 3810, 888: 3809, 3808}, + {247: 3866}, + {1426, 1426, 1426, 1426, 1426, 1426, 1426, 21: 1426, 233: 1426, 235: 1426, 238: 1426, 242: 1426, 247: 1426, 387: 1426, 1426, 1426, 1426, 1426, 1426}, + {1425, 1425, 1425, 1425, 1425, 1425, 1425, 21: 1425, 233: 1425, 235: 1425, 238: 1425, 242: 1425, 247: 1425, 387: 1425, 1425, 1425, 1425, 1425, 1425}, + {387: 3865}, + {1423, 1423, 1423, 1423, 1423, 1423, 1423, 21: 1423, 233: 1423, 235: 1423, 238: 1423, 242: 1423, 247: 1423, 387: 3864, 1423, 1423, 1423, 1423, 1423}, // 2290 - {1403, 1403, 1403, 1403, 1403, 1403, 1403, 21: 1403, 229: 1403, 231: 1403, 234: 1403, 238: 1403, 243: 1403, 383: 1403, 1403, 1403, 1403, 1403, 1403}, - {1398, 1398, 1398, 1398, 1398, 1398, 1398, 21: 1398, 229: 1398, 231: 1398, 234: 1398, 238: 1398, 243: 1398, 383: 1398, 1398, 1398, 1398, 1398, 1398}, - {1397, 1397, 1397, 1397, 1397, 1397, 1397, 21: 1397, 229: 1397, 231: 1397, 234: 1397, 238: 1397, 243: 1397, 383: 1397, 1397, 1397, 1397, 1397, 1397}, - {2: 1722, 1639, 1673, 1640, 7: 2119, 1727, 1666, 1724, 2124, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 2128, 1651, 2121, 2123, 2137, 2138, 2136, 2132, 2139, 2129, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 2130, 1760, 1659, 2120, 1737, 1683, 1700, 2125, 2127, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 2135, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 2126, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 2131, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 2122, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 2117, 2118, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 2140, 1835, 2116, 1840, 1839, 1685, 1842, 1844, 1689, 2133, 2134, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 2141, 2142, 1858, 1852, 1853, 1854, 2172, 230: 2153, 2112, 2184, 2188, 235: 2169, 2168, 2205, 2179, 243: 2144, 266: 2148, 2187, 290: 2156, 299: 2175, 311: 2189, 2110, 2182, 2204, 2206, 2147, 2146, 2163, 2203, 2183, 2180, 2174, 2178, 2143, 2145, 2181, 2152, 2185, 2193, 2244, 2151, 2194, 2195, 2150, 2173, 2166, 2167, 2217, 2219, 2220, 2221, 2176, 2222, 2201, 2207, 2215, 2216, 2211, 2223, 2224, 2225, 2212, 2227, 2228, 2218, 2213, 2226, 2208, 2214, 2199, 2229, 2230, 2177, 2234, 2190, 2192, 2233, 2239, 2238, 2240, 2237, 2170, 2241, 2236, 2235, 2232, 2186, 2231, 2191, 2196, 2197, 389: 2155, 1635, 1636, 1634, 448: 2171, 2243, 2162, 2157, 2149, 2160, 2158, 2159, 2198, 2210, 2209, 2202, 2200, 2154, 2165, 2242, 2164, 2161, 2115, 2114, 2113, 3812}, - {21: 3813, 246: 2253, 248: 2251, 250: 2252, 2250, 2248, 470: 2249, 2247}, + {234: 2174, 239: 3860, 3861, 247: 2165, 270: 2169, 320: 2168, 2167, 328: 2164, 2166, 331: 2173, 3851, 3848, 335: 2172, 3849, 3850, 2171, 454: 3859, 456: 2170, 695: 3846, 3847, 3857, 732: 3858, 785: 3856}, + {498: 3844}, + {234: 3843}, + {232: 3840}, + {238: 3833}, // 2295 - {1404, 1404, 1404, 1404, 1404, 1404, 1404, 21: 1404, 229: 1404, 231: 1404, 234: 1404, 238: 1404, 243: 1404, 383: 1404, 1404, 1404, 1404, 1404, 1404}, - {1405, 1405, 1405, 1405, 1405, 1405, 1405, 21: 1405, 229: 1405, 231: 1405, 234: 1405, 238: 1405, 243: 1405, 383: 1405, 1405, 1405, 1405, 1405, 1405}, - {328: 3822, 3819, 332: 3820, 3821, 691: 3817, 3818, 3816}, - {1406, 1406, 1406, 1406, 1406, 1406, 1406, 21: 1406, 229: 1406, 231: 1406, 234: 1406, 238: 1406, 243: 1406, 383: 1406, 1406, 1406, 1406, 1406, 1406}, - {1376, 1376, 1376, 1376, 1376, 1376, 1376, 21: 1376, 229: 1376, 231: 1376, 234: 1376, 238: 1376, 243: 1376, 383: 1376, 1376, 1376, 1376, 1376, 1376}, + {1416, 1416, 1416, 1416, 1416, 1416, 1416, 21: 1416, 233: 1416, 235: 1416, 238: 1416, 242: 1416, 247: 1416, 387: 1416, 1416, 1416, 1416, 1416, 1416}, + {119: 3832}, + {1410, 1410, 1410, 1410, 1410, 1410, 1410, 21: 1410, 233: 1410, 235: 1410, 238: 1410, 242: 1410, 247: 1410, 387: 1410, 1410, 1410, 1410, 1410, 1410}, + {1407, 1407, 3824, 3819, 1407, 1407, 1407, 21: 1407, 233: 3823, 235: 3817, 238: 1415, 242: 3822, 247: 3818, 387: 1429, 3816, 3821, 3825, 3647, 3828, 618: 3827, 638: 3831, 676: 3826, 714: 3820}, + {1409, 1409, 1409, 1409, 1409, 1409, 1409, 21: 1409, 233: 1409, 235: 1409, 238: 1409, 242: 1409, 247: 1409, 387: 1409, 1409, 1409, 1409, 1409, 1409}, // 2300 - {228: 3823}, - {1369, 1369, 1369, 1369, 1369, 1369, 1369, 21: 1369, 228: 1373, 1369, 231: 1369, 234: 1369, 238: 1369, 243: 1369, 383: 1369, 1369, 1369, 1369, 1369, 1369}, - {1368, 1368, 1368, 1368, 1368, 1368, 1368, 21: 1368, 228: 1372, 1368, 231: 1368, 234: 1368, 238: 1368, 243: 1368, 383: 1368, 1368, 1368, 1368, 1368, 1368}, - {1367, 1367, 1367, 1367, 1367, 1367, 1367, 21: 1367, 228: 1371, 1367, 231: 1367, 234: 1367, 238: 1367, 243: 1367, 383: 1367, 1367, 1367, 1367, 1367, 1367}, - {228: 1370}, + {238: 1414}, + {232: 3834}, + {2: 1736, 1653, 1687, 1654, 7: 2140, 1741, 1680, 1738, 2145, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 2149, 1665, 2142, 2144, 1859, 2158, 2159, 2157, 2153, 2160, 1837, 1839, 1838, 2150, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 2151, 1774, 1673, 2141, 1751, 1714, 2146, 2148, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 2156, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 2147, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 2152, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 2143, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 2138, 2139, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 2161, 1853, 2137, 1858, 1857, 1699, 1860, 1862, 1703, 2154, 2155, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 2162, 2163, 1876, 1870, 1871, 1872, 2193, 234: 2174, 2133, 2205, 2209, 239: 2190, 2189, 2226, 2200, 247: 2165, 270: 2169, 272: 2208, 294: 2177, 303: 2196, 315: 2210, 2131, 2203, 2225, 2227, 2168, 2167, 2184, 2224, 2204, 2201, 2195, 2199, 2164, 2166, 2202, 2173, 2206, 2214, 2265, 2172, 2215, 2216, 2171, 2194, 2187, 2188, 2238, 2240, 2241, 2242, 2197, 2243, 2222, 2228, 2236, 2237, 2232, 2244, 2245, 2246, 2233, 2248, 2249, 2239, 2234, 2247, 2229, 2235, 2220, 2250, 2251, 2198, 2255, 2211, 2213, 2254, 2260, 2259, 2261, 2258, 2191, 2262, 2257, 2256, 381: 2253, 2207, 2252, 2212, 2217, 2218, 393: 2176, 1649, 1650, 1648, 452: 2192, 2264, 2183, 2178, 2170, 2181, 2179, 2180, 2219, 2231, 2230, 2223, 2221, 2175, 2186, 2263, 2185, 2182, 2136, 2135, 2134, 3835}, + {21: 3836, 250: 2274, 252: 2272, 2273, 2271, 2269, 474: 2270, 2268}, + {1413, 1413, 1413, 1413, 1413, 1413, 1413, 21: 1413, 233: 1413, 235: 1413, 238: 1413, 242: 1413, 247: 1413, 387: 1413, 1413, 1413, 1413, 1413, 1413, 865: 3839, 892: 3838, 3837}, // 2305 - {21: 3824, 266: 1624, 474: 3825}, - {1375, 1375, 1375, 1375, 1375, 1375, 1375, 21: 1375, 229: 1375, 231: 1375, 234: 1375, 238: 1375, 243: 1375, 383: 1375, 1375, 1375, 1375, 1375, 1375}, - {21: 3826}, - {1374, 1374, 1374, 1374, 1374, 1374, 1374, 21: 1374, 229: 1374, 231: 1374, 234: 1374, 238: 1374, 243: 1374, 383: 1374, 1374, 1374, 1374, 1374, 1374}, - {1407, 1407, 1407, 1407, 1407, 1407, 1407, 21: 1407, 229: 1407, 231: 1407, 234: 1407, 238: 1407, 243: 1407, 383: 1407, 1407, 1407, 1407, 1407, 1407}, + {1417, 1417, 1417, 1417, 1417, 1417, 1417, 21: 1417, 233: 1417, 235: 1417, 238: 1417, 242: 1417, 247: 1417, 387: 1417, 1417, 1417, 1417, 1417, 1417}, + {1412, 1412, 1412, 1412, 1412, 1412, 1412, 21: 1412, 233: 1412, 235: 1412, 238: 1412, 242: 1412, 247: 1412, 387: 1412, 1412, 1412, 1412, 1412, 1412}, + {1411, 1411, 1411, 1411, 1411, 1411, 1411, 21: 1411, 233: 1411, 235: 1411, 238: 1411, 242: 1411, 247: 1411, 387: 1411, 1411, 1411, 1411, 1411, 1411}, + {2: 1736, 1653, 1687, 1654, 7: 2140, 1741, 1680, 1738, 2145, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 2149, 1665, 2142, 2144, 1859, 2158, 2159, 2157, 2153, 2160, 1837, 1839, 1838, 2150, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 2151, 1774, 1673, 2141, 1751, 1714, 2146, 2148, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 2156, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 2147, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 2152, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 2143, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 2138, 2139, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 2161, 1853, 2137, 1858, 1857, 1699, 1860, 1862, 1703, 2154, 2155, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 2162, 2163, 1876, 1870, 1871, 1872, 2193, 234: 2174, 2133, 2205, 2209, 239: 2190, 2189, 2226, 2200, 247: 2165, 270: 2169, 272: 2208, 294: 2177, 303: 2196, 315: 2210, 2131, 2203, 2225, 2227, 2168, 2167, 2184, 2224, 2204, 2201, 2195, 2199, 2164, 2166, 2202, 2173, 2206, 2214, 2265, 2172, 2215, 2216, 2171, 2194, 2187, 2188, 2238, 2240, 2241, 2242, 2197, 2243, 2222, 2228, 2236, 2237, 2232, 2244, 2245, 2246, 2233, 2248, 2249, 2239, 2234, 2247, 2229, 2235, 2220, 2250, 2251, 2198, 2255, 2211, 2213, 2254, 2260, 2259, 2261, 2258, 2191, 2262, 2257, 2256, 381: 2253, 2207, 2252, 2212, 2217, 2218, 393: 2176, 1649, 1650, 1648, 452: 2192, 2264, 2183, 2178, 2170, 2181, 2179, 2180, 2219, 2231, 2230, 2223, 2221, 2175, 2186, 2263, 2185, 2182, 2136, 2135, 2134, 3841}, + {21: 3842, 250: 2274, 252: 2272, 2273, 2271, 2269, 474: 2270, 2268}, // 2310 - {1378, 1378, 1378, 1378, 1378, 1378, 1378, 21: 1378, 229: 1378, 231: 1378, 234: 1378, 238: 1378, 243: 1378, 383: 1378, 1378, 1378, 1378, 1378, 1378}, - {1377, 1377, 1377, 1377, 1377, 1377, 1377, 21: 1377, 229: 1377, 231: 1377, 234: 1377, 238: 1377, 243: 1377, 383: 1377, 1377, 1377, 1377, 1377, 1377}, - {1366, 1366, 1366, 1366, 1366, 1366, 1366, 21: 1366, 229: 1366, 231: 1366, 234: 1366, 238: 1366, 243: 1366, 383: 1366, 1366, 1366, 1366, 1366, 1366}, - {266: 2299, 316: 2301, 2300, 548: 3834}, - {266: 2299, 316: 2301, 2300, 548: 3833}, + {1418, 1418, 1418, 1418, 1418, 1418, 1418, 21: 1418, 233: 1418, 235: 1418, 238: 1418, 242: 1418, 247: 1418, 387: 1418, 1418, 1418, 1418, 1418, 1418}, + {1419, 1419, 1419, 1419, 1419, 1419, 1419, 21: 1419, 233: 1419, 235: 1419, 238: 1419, 242: 1419, 247: 1419, 387: 1419, 1419, 1419, 1419, 1419, 1419}, + {332: 3851, 3848, 336: 3849, 3850, 695: 3846, 3847, 3845}, + {1420, 1420, 1420, 1420, 1420, 1420, 1420, 21: 1420, 233: 1420, 235: 1420, 238: 1420, 242: 1420, 247: 1420, 387: 1420, 1420, 1420, 1420, 1420, 1420}, + {1390, 1390, 1390, 1390, 1390, 1390, 1390, 21: 1390, 233: 1390, 235: 1390, 238: 1390, 242: 1390, 247: 1390, 387: 1390, 1390, 1390, 1390, 1390, 1390}, // 2315 - {1364, 1364, 1364, 1364, 1364, 1364, 1364, 21: 1364, 229: 1364, 231: 1364, 234: 1364, 238: 1364, 243: 1364, 383: 1364, 1364, 1364, 1364, 1364, 1364}, - {1365, 1365, 1365, 1365, 1365, 1365, 1365, 21: 1365, 229: 1365, 231: 1365, 234: 1365, 238: 1365, 243: 1365, 383: 1365, 1365, 1365, 1365, 1365, 1365}, - {1408, 1408, 1408, 1408, 1408, 1408, 1408, 21: 1408, 229: 1408, 231: 1408, 234: 1408, 238: 1408, 243: 1408, 383: 1408, 1408, 1408, 1408, 1408, 1408}, - {1410, 1410, 1410, 1410, 1410, 1410, 1410, 21: 1410, 229: 1410, 231: 1410, 234: 1410, 238: 1410, 243: 1410, 383: 1410, 1410, 1410, 1410, 1410, 1410}, - {1413, 1413, 1413, 1413, 1413, 1413, 1413, 21: 1413, 229: 1413, 231: 1413, 234: 1413, 238: 1413, 243: 1413, 383: 1413, 1413, 1413, 1413, 1413, 1413}, + {232: 3852}, + {1383, 1383, 1383, 1383, 1383, 1383, 1383, 21: 1383, 232: 1387, 1383, 235: 1383, 238: 1383, 242: 1383, 247: 1383, 387: 1383, 1383, 1383, 1383, 1383, 1383}, + {1382, 1382, 1382, 1382, 1382, 1382, 1382, 21: 1382, 232: 1386, 1382, 235: 1382, 238: 1382, 242: 1382, 247: 1382, 387: 1382, 1382, 1382, 1382, 1382, 1382}, + {1381, 1381, 1381, 1381, 1381, 1381, 1381, 21: 1381, 232: 1385, 1381, 235: 1381, 238: 1381, 242: 1381, 247: 1381, 387: 1381, 1381, 1381, 1381, 1381, 1381}, + {232: 1384}, // 2320 - {383: 1461, 1461, 1461, 401: 1461, 415: 1461, 1461}, - {1460, 1460, 6: 1460, 383: 1460, 1460, 1460, 401: 1460, 415: 1460, 1460}, - {1306, 1306}, - {1342, 1342, 228: 1342, 234: 1342, 267: 1342, 393: 1342, 1342, 396: 3913, 840: 3912}, - {7: 1343, 261: 1343, 395: 1343}, + {21: 3853, 270: 1638, 478: 3854}, + {1389, 1389, 1389, 1389, 1389, 1389, 1389, 21: 1389, 233: 1389, 235: 1389, 238: 1389, 242: 1389, 247: 1389, 387: 1389, 1389, 1389, 1389, 1389, 1389}, + {21: 3855}, + {1388, 1388, 1388, 1388, 1388, 1388, 1388, 21: 1388, 233: 1388, 235: 1388, 238: 1388, 242: 1388, 247: 1388, 387: 1388, 1388, 1388, 1388, 1388, 1388}, + {1421, 1421, 1421, 1421, 1421, 1421, 1421, 21: 1421, 233: 1421, 235: 1421, 238: 1421, 242: 1421, 247: 1421, 387: 1421, 1421, 1421, 1421, 1421, 1421}, // 2325 - {2: 1722, 1639, 1673, 1640, 7: 1650, 1727, 1666, 1724, 1687, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 1714, 1651, 1660, 1681, 1774, 1775, 1771, 1733, 1780, 1716, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 1719, 1760, 1659, 1658, 1737, 1683, 1700, 1705, 1709, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 1770, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 1706, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 1721, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 1677, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 1638, 1642, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 1834, 1835, 1633, 1840, 1839, 1685, 1842, 1844, 1689, 1753, 1769, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 1855, 1856, 1858, 1852, 1853, 1854, 230: 1889, 254: 3910, 389: 1890, 1635, 1636, 1634, 473: 3909}, - {7: 2678, 261: 3904, 395: 2677, 498: 3903}, - {254: 3654, 266: 1263, 485: 3901}, - {230: 1263, 254: 3654, 485: 3899}, - {254: 3654, 266: 1263, 485: 3897}, + {1392, 1392, 1392, 1392, 1392, 1392, 1392, 21: 1392, 233: 1392, 235: 1392, 238: 1392, 242: 1392, 247: 1392, 387: 1392, 1392, 1392, 1392, 1392, 1392}, + {1391, 1391, 1391, 1391, 1391, 1391, 1391, 21: 1391, 233: 1391, 235: 1391, 238: 1391, 242: 1391, 247: 1391, 387: 1391, 1391, 1391, 1391, 1391, 1391}, + {1380, 1380, 1380, 1380, 1380, 1380, 1380, 21: 1380, 233: 1380, 235: 1380, 238: 1380, 242: 1380, 247: 1380, 387: 1380, 1380, 1380, 1380, 1380, 1380}, + {270: 2320, 320: 2322, 2321, 552: 3863}, + {270: 2320, 320: 2322, 2321, 552: 3862}, // 2330 - {230: 1263, 254: 3654, 485: 3895}, - {254: 3654, 266: 1263, 485: 3893}, - {230: 1263, 254: 3654, 485: 3891}, - {230: 1263, 254: 3654, 485: 3889}, - {254: 3654, 266: 1263, 485: 3887}, + {1378, 1378, 1378, 1378, 1378, 1378, 1378, 21: 1378, 233: 1378, 235: 1378, 238: 1378, 242: 1378, 247: 1378, 387: 1378, 1378, 1378, 1378, 1378, 1378}, + {1379, 1379, 1379, 1379, 1379, 1379, 1379, 21: 1379, 233: 1379, 235: 1379, 238: 1379, 242: 1379, 247: 1379, 387: 1379, 1379, 1379, 1379, 1379, 1379}, + {1422, 1422, 1422, 1422, 1422, 1422, 1422, 21: 1422, 233: 1422, 235: 1422, 238: 1422, 242: 1422, 247: 1422, 387: 1422, 1422, 1422, 1422, 1422, 1422}, + {1424, 1424, 1424, 1424, 1424, 1424, 1424, 21: 1424, 233: 1424, 235: 1424, 238: 1424, 242: 1424, 247: 1424, 387: 1424, 1424, 1424, 1424, 1424, 1424}, + {1427, 1427, 1427, 1427, 1427, 1427, 1427, 21: 1427, 233: 1427, 235: 1427, 238: 1427, 242: 1427, 247: 1427, 387: 1427, 1427, 1427, 1427, 1427, 1427}, // 2335 - {254: 3654, 266: 1263, 485: 3885}, - {254: 3654, 266: 1263, 485: 3883}, - {254: 3654, 266: 1263, 485: 3881}, - {229, 229, 229, 229, 6: 229, 229, 229, 229, 229, 229, 13: 229, 229, 229, 229, 229, 229, 229, 229, 228: 229, 234: 229, 238: 229, 261: 229, 267: 229, 393: 229, 229, 229, 229, 229, 229}, - {238: 1263, 254: 3654, 266: 1263, 485: 3879}, + {387: 1475, 1475, 1475, 405: 1475, 419: 1475, 1475}, + {1474, 1474, 6: 1474, 387: 1474, 1474, 1474, 405: 1474, 419: 1474, 1474}, + {1320, 1320}, + {1356, 1356, 232: 1356, 238: 1356, 272: 1356, 397: 1356, 1356, 400: 3942, 844: 3941}, + {7: 1357, 264: 1357, 399: 1357}, // 2340 - {254: 3654, 266: 1263, 485: 3877}, - {238: 1263, 254: 3654, 266: 1263, 485: 3873}, - {220, 220, 3846, 3845, 6: 3871, 1344, 3852, 3843, 3848, 3850, 13: 3849, 3847, 3851, 3855, 3853, 3854, 3862, 3857, 228: 220, 234: 220, 238: 3842, 261: 1344, 267: 220, 393: 220, 220, 1344, 220, 3859, 3858, 525: 3844, 550: 3856, 554: 3870}, - {219, 219, 219, 219, 6: 219, 219, 219, 219, 219, 219, 13: 219, 219, 219, 219, 219, 219, 219, 219, 228: 219, 234: 219, 238: 219, 261: 219, 267: 219, 393: 219, 219, 219, 219, 219, 219}, - {87: 1263, 1263, 93: 1263, 95: 1263, 104: 1263, 238: 1263, 254: 3654, 485: 3863}, + {2: 1736, 1653, 1687, 1654, 7: 1664, 1741, 1680, 1738, 1701, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 1728, 1665, 1674, 1695, 1859, 1788, 1789, 1785, 1747, 1794, 1837, 1839, 1838, 1730, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 1733, 1774, 1673, 1672, 1751, 1714, 1719, 1723, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 1784, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 1720, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 1735, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 1691, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 1652, 1656, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 1852, 1853, 1647, 1858, 1857, 1699, 1860, 1862, 1703, 1767, 1783, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 1873, 1874, 1876, 1870, 1871, 1872, 234: 1908, 258: 3939, 393: 1909, 1649, 1650, 1648, 477: 3938}, + {7: 2699, 264: 3933, 399: 2698, 502: 3932}, + {258: 3683, 270: 1277, 489: 3930}, + {234: 1277, 258: 3683, 489: 3928}, + {258: 3683, 270: 1277, 489: 3926}, // 2345 - {87: 3869, 3867, 93: 3865, 95: 3866, 104: 3868, 238: 3864}, - {213, 213, 213, 213, 6: 213, 213, 213, 213, 213, 213, 13: 213, 213, 213, 213, 213, 213, 213, 213, 228: 213, 234: 213, 238: 213, 261: 213, 267: 213, 393: 213, 213, 213, 213, 213, 213}, - {212, 212, 212, 212, 6: 212, 212, 212, 212, 212, 212, 13: 212, 212, 212, 212, 212, 212, 212, 212, 228: 212, 234: 212, 238: 212, 261: 212, 267: 212, 393: 212, 212, 212, 212, 212, 212}, - {211, 211, 211, 211, 6: 211, 211, 211, 211, 211, 211, 13: 211, 211, 211, 211, 211, 211, 211, 211, 228: 211, 234: 211, 238: 211, 261: 211, 267: 211, 393: 211, 211, 211, 211, 211, 211}, - {210, 210, 210, 210, 6: 210, 210, 210, 210, 210, 210, 13: 210, 210, 210, 210, 210, 210, 210, 210, 228: 210, 234: 210, 238: 210, 261: 210, 267: 210, 393: 210, 210, 210, 210, 210, 210}, + {234: 1277, 258: 3683, 489: 3924}, + {258: 3683, 270: 1277, 489: 3922}, + {234: 1277, 258: 3683, 489: 3920}, + {234: 1277, 258: 3683, 489: 3918}, + {258: 3683, 270: 1277, 489: 3916}, // 2350 - {209, 209, 209, 209, 6: 209, 209, 209, 209, 209, 209, 13: 209, 209, 209, 209, 209, 209, 209, 209, 228: 209, 234: 209, 238: 209, 261: 209, 267: 209, 393: 209, 209, 209, 209, 209, 209}, - {208, 208, 208, 208, 6: 208, 208, 208, 208, 208, 208, 13: 208, 208, 208, 208, 208, 208, 208, 208, 228: 208, 234: 208, 238: 208, 261: 208, 267: 208, 393: 208, 208, 208, 208, 208, 208}, - {218, 218, 218, 218, 6: 218, 218, 218, 218, 218, 218, 13: 218, 218, 218, 218, 218, 218, 218, 218, 228: 218, 234: 218, 238: 218, 261: 218, 267: 218, 393: 218, 218, 218, 218, 218, 218}, - {2: 3846, 3845, 7: 1344, 3852, 3843, 3848, 3850, 13: 3849, 3847, 3851, 3855, 3853, 3854, 3862, 3857, 238: 3842, 261: 1344, 395: 1344, 397: 3859, 3858, 525: 3844, 550: 3856, 554: 3872}, - {217, 217, 217, 217, 6: 217, 217, 217, 217, 217, 217, 13: 217, 217, 217, 217, 217, 217, 217, 217, 228: 217, 234: 217, 238: 217, 261: 217, 267: 217, 393: 217, 217, 217, 217, 217, 217}, + {258: 3683, 270: 1277, 489: 3914}, + {258: 3683, 270: 1277, 489: 3912}, + {258: 3683, 270: 1277, 489: 3910}, + {230, 230, 230, 230, 6: 230, 230, 230, 230, 230, 230, 13: 230, 230, 230, 230, 230, 230, 230, 230, 232: 230, 238: 230, 242: 230, 264: 230, 272: 230, 397: 230, 230, 230, 230, 230, 230}, + {242: 1277, 258: 3683, 270: 1277, 489: 3908}, // 2355 - {238: 3875, 266: 1624, 474: 2661, 489: 3876, 730: 3874}, - {226, 226, 226, 226, 6: 226, 226, 226, 226, 226, 226, 13: 226, 226, 226, 226, 226, 226, 226, 226, 228: 226, 234: 226, 238: 226, 261: 226, 267: 226, 393: 226, 226, 226, 226, 226, 226}, - {225, 225, 225, 225, 6: 225, 225, 225, 225, 225, 225, 13: 225, 225, 225, 225, 225, 225, 225, 225, 228: 225, 234: 225, 238: 225, 261: 225, 267: 225, 393: 225, 225, 225, 225, 225, 225}, - {224, 224, 224, 224, 6: 224, 224, 224, 224, 224, 224, 13: 224, 224, 224, 224, 224, 224, 224, 224, 228: 224, 234: 224, 238: 224, 261: 224, 267: 224, 393: 224, 224, 224, 224, 224, 224}, - {266: 1624, 474: 2661, 489: 3878}, + {258: 3683, 270: 1277, 489: 3906}, + {242: 1277, 258: 3683, 270: 1277, 489: 3902}, + {221, 221, 3875, 3874, 6: 3900, 1358, 3881, 3872, 3877, 3879, 13: 3878, 3876, 3880, 3884, 3882, 3883, 3891, 3886, 232: 221, 238: 221, 242: 3871, 264: 1358, 272: 221, 397: 221, 221, 1358, 221, 3888, 3887, 530: 3873, 554: 3885, 558: 3899}, + {220, 220, 220, 220, 6: 220, 220, 220, 220, 220, 220, 13: 220, 220, 220, 220, 220, 220, 220, 220, 232: 220, 238: 220, 242: 220, 264: 220, 272: 220, 397: 220, 220, 220, 220, 220, 220}, + {88: 1277, 1277, 94: 1277, 96: 1277, 107: 1277, 242: 1277, 258: 3683, 489: 3892}, // 2360 - {227, 227, 227, 227, 6: 227, 227, 227, 227, 227, 227, 13: 227, 227, 227, 227, 227, 227, 227, 227, 228: 227, 234: 227, 238: 227, 261: 227, 267: 227, 393: 227, 227, 227, 227, 227, 227}, - {238: 3875, 266: 1624, 474: 2661, 489: 3876, 730: 3880}, - {228, 228, 228, 228, 6: 228, 228, 228, 228, 228, 228, 13: 228, 228, 228, 228, 228, 228, 228, 228, 228: 228, 234: 228, 238: 228, 261: 228, 267: 228, 393: 228, 228, 228, 228, 228, 228}, - {266: 1624, 474: 2661, 489: 3882}, - {230, 230, 230, 230, 6: 230, 230, 230, 230, 230, 230, 13: 230, 230, 230, 230, 230, 230, 230, 230, 228: 230, 234: 230, 238: 230, 261: 230, 267: 230, 393: 230, 230, 230, 230, 230, 230}, + {88: 3898, 3896, 94: 3894, 96: 3895, 107: 3897, 242: 3893}, + {214, 214, 214, 214, 6: 214, 214, 214, 214, 214, 214, 13: 214, 214, 214, 214, 214, 214, 214, 214, 232: 214, 238: 214, 242: 214, 264: 214, 272: 214, 397: 214, 214, 214, 214, 214, 214}, + {213, 213, 213, 213, 6: 213, 213, 213, 213, 213, 213, 13: 213, 213, 213, 213, 213, 213, 213, 213, 232: 213, 238: 213, 242: 213, 264: 213, 272: 213, 397: 213, 213, 213, 213, 213, 213}, + {212, 212, 212, 212, 6: 212, 212, 212, 212, 212, 212, 13: 212, 212, 212, 212, 212, 212, 212, 212, 232: 212, 238: 212, 242: 212, 264: 212, 272: 212, 397: 212, 212, 212, 212, 212, 212}, + {211, 211, 211, 211, 6: 211, 211, 211, 211, 211, 211, 13: 211, 211, 211, 211, 211, 211, 211, 211, 232: 211, 238: 211, 242: 211, 264: 211, 272: 211, 397: 211, 211, 211, 211, 211, 211}, // 2365 - {266: 1624, 474: 2661, 489: 3884}, - {231, 231, 231, 231, 6: 231, 231, 231, 231, 231, 231, 13: 231, 231, 231, 231, 231, 231, 231, 231, 228: 231, 234: 231, 238: 231, 261: 231, 267: 231, 393: 231, 231, 231, 231, 231, 231}, - {266: 1624, 474: 2661, 489: 3886}, - {232, 232, 232, 232, 6: 232, 232, 232, 232, 232, 232, 13: 232, 232, 232, 232, 232, 232, 232, 232, 228: 232, 234: 232, 238: 232, 261: 232, 267: 232, 393: 232, 232, 232, 232, 232, 232}, - {266: 1624, 474: 2661, 489: 3888}, + {210, 210, 210, 210, 6: 210, 210, 210, 210, 210, 210, 13: 210, 210, 210, 210, 210, 210, 210, 210, 232: 210, 238: 210, 242: 210, 264: 210, 272: 210, 397: 210, 210, 210, 210, 210, 210}, + {209, 209, 209, 209, 6: 209, 209, 209, 209, 209, 209, 13: 209, 209, 209, 209, 209, 209, 209, 209, 232: 209, 238: 209, 242: 209, 264: 209, 272: 209, 397: 209, 209, 209, 209, 209, 209}, + {219, 219, 219, 219, 6: 219, 219, 219, 219, 219, 219, 13: 219, 219, 219, 219, 219, 219, 219, 219, 232: 219, 238: 219, 242: 219, 264: 219, 272: 219, 397: 219, 219, 219, 219, 219, 219}, + {2: 3875, 3874, 7: 1358, 3881, 3872, 3877, 3879, 13: 3878, 3876, 3880, 3884, 3882, 3883, 3891, 3886, 242: 3871, 264: 1358, 399: 1358, 401: 3888, 3887, 530: 3873, 554: 3885, 558: 3901}, + {218, 218, 218, 218, 6: 218, 218, 218, 218, 218, 218, 13: 218, 218, 218, 218, 218, 218, 218, 218, 232: 218, 238: 218, 242: 218, 264: 218, 272: 218, 397: 218, 218, 218, 218, 218, 218}, // 2370 - {233, 233, 233, 233, 6: 233, 233, 233, 233, 233, 233, 13: 233, 233, 233, 233, 233, 233, 233, 233, 228: 233, 234: 233, 238: 233, 261: 233, 267: 233, 393: 233, 233, 233, 233, 233, 233}, - {230: 3890}, - {234, 234, 234, 234, 6: 234, 234, 234, 234, 234, 234, 13: 234, 234, 234, 234, 234, 234, 234, 234, 228: 234, 234: 234, 238: 234, 261: 234, 267: 234, 393: 234, 234, 234, 234, 234, 234}, - {230: 3892}, - {235, 235, 235, 235, 6: 235, 235, 235, 235, 235, 235, 13: 235, 235, 235, 235, 235, 235, 235, 235, 228: 235, 234: 235, 238: 235, 261: 235, 267: 235, 393: 235, 235, 235, 235, 235, 235}, + {242: 3904, 270: 1638, 478: 2682, 493: 3905, 734: 3903}, + {227, 227, 227, 227, 6: 227, 227, 227, 227, 227, 227, 13: 227, 227, 227, 227, 227, 227, 227, 227, 232: 227, 238: 227, 242: 227, 264: 227, 272: 227, 397: 227, 227, 227, 227, 227, 227}, + {226, 226, 226, 226, 6: 226, 226, 226, 226, 226, 226, 13: 226, 226, 226, 226, 226, 226, 226, 226, 232: 226, 238: 226, 242: 226, 264: 226, 272: 226, 397: 226, 226, 226, 226, 226, 226}, + {225, 225, 225, 225, 6: 225, 225, 225, 225, 225, 225, 13: 225, 225, 225, 225, 225, 225, 225, 225, 232: 225, 238: 225, 242: 225, 264: 225, 272: 225, 397: 225, 225, 225, 225, 225, 225}, + {270: 1638, 478: 2682, 493: 3907}, // 2375 - {266: 1624, 474: 2661, 489: 3894}, - {236, 236, 236, 236, 6: 236, 236, 236, 236, 236, 236, 13: 236, 236, 236, 236, 236, 236, 236, 236, 228: 236, 234: 236, 238: 236, 261: 236, 267: 236, 393: 236, 236, 236, 236, 236, 236}, - {230: 3896}, - {237, 237, 237, 237, 6: 237, 237, 237, 237, 237, 237, 13: 237, 237, 237, 237, 237, 237, 237, 237, 228: 237, 234: 237, 238: 237, 261: 237, 267: 237, 393: 237, 237, 237, 237, 237, 237}, - {266: 1624, 474: 2661, 489: 3898}, + {228, 228, 228, 228, 6: 228, 228, 228, 228, 228, 228, 13: 228, 228, 228, 228, 228, 228, 228, 228, 232: 228, 238: 228, 242: 228, 264: 228, 272: 228, 397: 228, 228, 228, 228, 228, 228}, + {242: 3904, 270: 1638, 478: 2682, 493: 3905, 734: 3909}, + {229, 229, 229, 229, 6: 229, 229, 229, 229, 229, 229, 13: 229, 229, 229, 229, 229, 229, 229, 229, 232: 229, 238: 229, 242: 229, 264: 229, 272: 229, 397: 229, 229, 229, 229, 229, 229}, + {270: 1638, 478: 2682, 493: 3911}, + {231, 231, 231, 231, 6: 231, 231, 231, 231, 231, 231, 13: 231, 231, 231, 231, 231, 231, 231, 231, 232: 231, 238: 231, 242: 231, 264: 231, 272: 231, 397: 231, 231, 231, 231, 231, 231}, // 2380 - {238, 238, 238, 238, 6: 238, 238, 238, 238, 238, 238, 13: 238, 238, 238, 238, 238, 238, 238, 238, 228: 238, 234: 238, 238: 238, 261: 238, 267: 238, 393: 238, 238, 238, 238, 238, 238}, - {230: 3900}, - {239, 239, 239, 239, 6: 239, 239, 239, 239, 239, 239, 13: 239, 239, 239, 239, 239, 239, 239, 239, 228: 239, 234: 239, 238: 239, 261: 239, 267: 239, 393: 239, 239, 239, 239, 239, 239}, - {266: 1624, 474: 2661, 489: 3902}, - {240, 240, 240, 240, 6: 240, 240, 240, 240, 240, 240, 13: 240, 240, 240, 240, 240, 240, 240, 240, 228: 240, 234: 240, 238: 240, 261: 240, 267: 240, 393: 240, 240, 240, 240, 240, 240}, + {270: 1638, 478: 2682, 493: 3913}, + {232, 232, 232, 232, 6: 232, 232, 232, 232, 232, 232, 13: 232, 232, 232, 232, 232, 232, 232, 232, 232: 232, 238: 232, 242: 232, 264: 232, 272: 232, 397: 232, 232, 232, 232, 232, 232}, + {270: 1638, 478: 2682, 493: 3915}, + {233, 233, 233, 233, 6: 233, 233, 233, 233, 233, 233, 13: 233, 233, 233, 233, 233, 233, 233, 233, 232: 233, 238: 233, 242: 233, 264: 233, 272: 233, 397: 233, 233, 233, 233, 233, 233}, + {270: 1638, 478: 2682, 493: 3917}, // 2385 - {2: 1263, 1263, 1263, 1263, 7: 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 22: 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 230: 1263, 254: 3654, 299: 1263, 485: 3907}, - {2: 1263, 1263, 1263, 1263, 7: 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 22: 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 230: 1263, 254: 3654, 485: 3905}, - {2: 1722, 1639, 1673, 1640, 7: 1650, 1727, 1666, 1724, 1687, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 1714, 1651, 1660, 1681, 1774, 1775, 1771, 1733, 1780, 1716, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 1719, 1760, 1659, 1658, 1737, 1683, 1700, 1705, 1709, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 1770, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 1706, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 1721, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 1677, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 1638, 1642, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 1834, 1835, 1633, 1840, 1839, 1685, 1842, 1844, 1689, 1753, 1769, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 1855, 1856, 1858, 1852, 1853, 1854, 230: 1889, 389: 1890, 1635, 1636, 1634, 473: 3906}, - {241, 241, 241, 241, 6: 241, 241, 241, 241, 241, 241, 13: 241, 241, 241, 241, 241, 241, 241, 241, 228: 241, 234: 241, 238: 241, 261: 241, 267: 241, 393: 241, 241, 241, 241, 241, 241}, - {2: 1722, 1639, 1673, 1640, 7: 1650, 1727, 1666, 1724, 1687, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 1714, 1651, 1660, 1681, 1774, 1775, 1771, 1733, 1780, 1716, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 1719, 1760, 1659, 1658, 1737, 1683, 1700, 1705, 1709, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 1770, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 1706, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 1721, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 1677, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 1638, 1642, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 1834, 1835, 1633, 1840, 1839, 1685, 1842, 1844, 1689, 1753, 1769, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 1855, 1856, 1858, 1852, 1853, 1854, 230: 1889, 299: 1888, 389: 1890, 1635, 1636, 1634, 473: 1887, 522: 3908}, + {234, 234, 234, 234, 6: 234, 234, 234, 234, 234, 234, 13: 234, 234, 234, 234, 234, 234, 234, 234, 232: 234, 238: 234, 242: 234, 264: 234, 272: 234, 397: 234, 234, 234, 234, 234, 234}, + {234: 3919}, + {235, 235, 235, 235, 6: 235, 235, 235, 235, 235, 235, 13: 235, 235, 235, 235, 235, 235, 235, 235, 232: 235, 238: 235, 242: 235, 264: 235, 272: 235, 397: 235, 235, 235, 235, 235, 235}, + {234: 3921}, + {236, 236, 236, 236, 6: 236, 236, 236, 236, 236, 236, 13: 236, 236, 236, 236, 236, 236, 236, 236, 232: 236, 238: 236, 242: 236, 264: 236, 272: 236, 397: 236, 236, 236, 236, 236, 236}, // 2390 - {242, 242, 242, 242, 6: 242, 242, 242, 242, 242, 242, 13: 242, 242, 242, 242, 242, 242, 242, 242, 228: 242, 234: 242, 238: 242, 261: 242, 267: 242, 393: 242, 242, 242, 242, 242, 242}, - {244, 244, 244, 244, 6: 244, 244, 244, 244, 244, 244, 13: 244, 244, 244, 244, 244, 244, 244, 244, 228: 244, 234: 244, 238: 244, 261: 244, 267: 244, 393: 244, 244, 244, 244, 244, 244}, - {2: 1722, 1639, 1673, 1640, 7: 1650, 1727, 1666, 1724, 1687, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 1714, 1651, 1660, 1681, 1774, 1775, 1771, 1733, 1780, 1716, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 1719, 1760, 1659, 1658, 1737, 1683, 1700, 1705, 1709, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 1770, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 1706, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 1721, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 1677, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 1638, 1642, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 1834, 1835, 1633, 1840, 1839, 1685, 1842, 1844, 1689, 1753, 1769, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 1855, 1856, 1858, 1852, 1853, 1854, 230: 1889, 389: 1890, 1635, 1636, 1634, 473: 3911}, - {243, 243, 243, 243, 6: 243, 243, 243, 243, 243, 243, 13: 243, 243, 243, 243, 243, 243, 243, 243, 228: 243, 234: 243, 238: 243, 261: 243, 267: 243, 393: 243, 243, 243, 243, 243, 243}, - {1315, 1315, 228: 1315, 234: 1315, 267: 3991, 393: 3990, 1315, 783: 3989}, + {270: 1638, 478: 2682, 493: 3923}, + {237, 237, 237, 237, 6: 237, 237, 237, 237, 237, 237, 13: 237, 237, 237, 237, 237, 237, 237, 237, 232: 237, 238: 237, 242: 237, 264: 237, 272: 237, 397: 237, 237, 237, 237, 237, 237}, + {234: 3925}, + {238, 238, 238, 238, 6: 238, 238, 238, 238, 238, 238, 13: 238, 238, 238, 238, 238, 238, 238, 238, 232: 238, 238: 238, 242: 238, 264: 238, 272: 238, 397: 238, 238, 238, 238, 238, 238}, + {270: 1638, 478: 2682, 493: 3927}, // 2395 - {404: 3914}, - {71: 3916, 270: 3917, 383: 3915}, - {228: 3984}, - {228: 3980}, - {30: 3919, 228: 3918}, + {239, 239, 239, 239, 6: 239, 239, 239, 239, 239, 239, 13: 239, 239, 239, 239, 239, 239, 239, 239, 232: 239, 238: 239, 242: 239, 264: 239, 272: 239, 397: 239, 239, 239, 239, 239, 239}, + {234: 3929}, + {240, 240, 240, 240, 6: 240, 240, 240, 240, 240, 240, 13: 240, 240, 240, 240, 240, 240, 240, 240, 232: 240, 238: 240, 242: 240, 264: 240, 272: 240, 397: 240, 240, 240, 240, 240, 240}, + {270: 1638, 478: 2682, 493: 3931}, + {241, 241, 241, 241, 6: 241, 241, 241, 241, 241, 241, 13: 241, 241, 241, 241, 241, 241, 241, 241, 232: 241, 238: 241, 242: 241, 264: 241, 272: 241, 397: 241, 241, 241, 241, 241, 241}, // 2400 - {2: 1722, 1639, 1673, 1640, 7: 2119, 1727, 1666, 1724, 2124, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 2128, 1651, 2121, 2123, 2137, 2138, 2136, 2132, 2139, 2129, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 2130, 1760, 1659, 2120, 1737, 1683, 1700, 2125, 2127, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 2135, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 2126, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 2131, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 2122, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 2117, 2118, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 2140, 1835, 2116, 1840, 1839, 1685, 1842, 1844, 1689, 2133, 2134, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 2141, 2142, 1858, 1852, 1853, 1854, 2172, 230: 2153, 2112, 2184, 2188, 235: 2169, 2168, 2205, 2179, 243: 2144, 266: 2148, 2187, 290: 2156, 299: 2175, 311: 2189, 2110, 2182, 2204, 2206, 2147, 2146, 2163, 2203, 2183, 2180, 2174, 2178, 2143, 2145, 2181, 2152, 2185, 2193, 2244, 2151, 2194, 2195, 2150, 2173, 2166, 2167, 2217, 2219, 2220, 2221, 2176, 2222, 2201, 2207, 2215, 2216, 2211, 2223, 2224, 2225, 2212, 2227, 2228, 2218, 2213, 2226, 2208, 2214, 2199, 2229, 2230, 2177, 2234, 2190, 2192, 2233, 2239, 2238, 2240, 2237, 2170, 2241, 2236, 2235, 2232, 2186, 2231, 2191, 2196, 2197, 389: 2155, 1635, 1636, 1634, 448: 2171, 2243, 2162, 2157, 2149, 2160, 2158, 2159, 2198, 2210, 2209, 2202, 2200, 2154, 2165, 2242, 2164, 2161, 2115, 2114, 2113, 3961}, - {228: 3920}, - {2: 1722, 1639, 1673, 1640, 7: 1650, 1727, 1666, 1724, 1687, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 1714, 1651, 1660, 1681, 1774, 1775, 1771, 1733, 1780, 1716, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 1719, 1760, 1659, 1658, 1737, 1683, 1700, 1705, 1709, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 1770, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 1706, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 1721, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 1677, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 1638, 1642, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 1834, 1835, 1633, 1840, 1839, 1685, 1842, 1844, 1689, 1753, 1769, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 1855, 1856, 1858, 1852, 1853, 1854, 389: 1928, 1635, 1636, 1634, 479: 1929, 523: 3921}, - {6: 1933, 21: 3922}, - {1332, 1332, 55: 3924, 228: 1332, 234: 1332, 267: 1332, 393: 1332, 1332, 586: 3923}, + {2: 1277, 1277, 1277, 1277, 7: 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 22: 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 234: 1277, 258: 3683, 303: 1277, 489: 3936}, + {2: 1277, 1277, 1277, 1277, 7: 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 22: 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 234: 1277, 258: 3683, 489: 3934}, + {2: 1736, 1653, 1687, 1654, 7: 1664, 1741, 1680, 1738, 1701, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 1728, 1665, 1674, 1695, 1859, 1788, 1789, 1785, 1747, 1794, 1837, 1839, 1838, 1730, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 1733, 1774, 1673, 1672, 1751, 1714, 1719, 1723, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 1784, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 1720, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 1735, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 1691, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 1652, 1656, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 1852, 1853, 1647, 1858, 1857, 1699, 1860, 1862, 1703, 1767, 1783, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 1873, 1874, 1876, 1870, 1871, 1872, 234: 1908, 393: 1909, 1649, 1650, 1648, 477: 3935}, + {242, 242, 242, 242, 6: 242, 242, 242, 242, 242, 242, 13: 242, 242, 242, 242, 242, 242, 242, 242, 232: 242, 238: 242, 242: 242, 264: 242, 272: 242, 397: 242, 242, 242, 242, 242, 242}, + {2: 1736, 1653, 1687, 1654, 7: 1664, 1741, 1680, 1738, 1701, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 1728, 1665, 1674, 1695, 1859, 1788, 1789, 1785, 1747, 1794, 1837, 1839, 1838, 1730, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 1733, 1774, 1673, 1672, 1751, 1714, 1719, 1723, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 1784, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 1720, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 1735, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 1691, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 1652, 1656, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 1852, 1853, 1647, 1858, 1857, 1699, 1860, 1862, 1703, 1767, 1783, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 1873, 1874, 1876, 1870, 1871, 1872, 234: 1908, 303: 1907, 393: 1909, 1649, 1650, 1648, 477: 1906, 527: 3937}, // 2405 - {1330, 1330, 228: 3927, 234: 1330, 267: 1330, 393: 1330, 1330, 585: 3926}, - {266: 1624, 474: 3925}, - {1331, 1331, 65: 1331, 228: 1331, 234: 1331, 267: 1331, 393: 1331, 1331}, - {1338, 1338, 228: 1338, 234: 1338, 267: 1338, 393: 1338, 1338}, - {396: 3930, 707: 3929, 838: 3928}, + {243, 243, 243, 243, 6: 243, 243, 243, 243, 243, 243, 13: 243, 243, 243, 243, 243, 243, 243, 243, 232: 243, 238: 243, 242: 243, 264: 243, 272: 243, 397: 243, 243, 243, 243, 243, 243}, + {245, 245, 245, 245, 6: 245, 245, 245, 245, 245, 245, 13: 245, 245, 245, 245, 245, 245, 245, 245, 232: 245, 238: 245, 242: 245, 264: 245, 272: 245, 397: 245, 245, 245, 245, 245, 245}, + {2: 1736, 1653, 1687, 1654, 7: 1664, 1741, 1680, 1738, 1701, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 1728, 1665, 1674, 1695, 1859, 1788, 1789, 1785, 1747, 1794, 1837, 1839, 1838, 1730, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 1733, 1774, 1673, 1672, 1751, 1714, 1719, 1723, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 1784, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 1720, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 1735, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 1691, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 1652, 1656, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 1852, 1853, 1647, 1858, 1857, 1699, 1860, 1862, 1703, 1767, 1783, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 1873, 1874, 1876, 1870, 1871, 1872, 234: 1908, 393: 1909, 1649, 1650, 1648, 477: 3940}, + {244, 244, 244, 244, 6: 244, 244, 244, 244, 244, 244, 13: 244, 244, 244, 244, 244, 244, 244, 244, 232: 244, 238: 244, 242: 244, 264: 244, 272: 244, 397: 244, 244, 244, 244, 244, 244}, + {1329, 1329, 232: 1329, 238: 1329, 272: 4020, 397: 4019, 1329, 787: 4018}, // 2410 - {6: 3959, 21: 3958}, - {6: 1328, 21: 1328}, - {2: 1722, 1639, 1673, 1640, 7: 1650, 1727, 1666, 1724, 1687, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 1714, 1651, 1660, 1681, 1774, 1775, 1771, 1733, 1780, 1716, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 1719, 1760, 1659, 1658, 1737, 1683, 1700, 1705, 1709, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 1770, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 1706, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 1721, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 1677, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 1638, 1642, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 1834, 1835, 1633, 1840, 1839, 1685, 1842, 1844, 1689, 1753, 1769, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 1855, 1856, 1858, 1852, 1853, 1854, 389: 3931, 1635, 1636, 1634}, - {2: 1318, 6: 1318, 9: 1318, 21: 1318, 28: 1318, 321: 3933, 837: 3932}, - {2: 3948, 6: 1325, 9: 3949, 21: 1325, 28: 3950, 706: 3947, 835: 3946, 3945}, + {408: 3943}, + {72: 3945, 274: 3946, 387: 3944}, + {232: 4013}, + {232: 4009}, + {31: 3948, 232: 3947}, // 2415 - {143: 3934}, - {178: 3935}, - {228: 3937, 609: 3936}, - {2: 1317, 6: 1317, 9: 1317, 21: 1317, 28: 1317}, - {2: 1722, 1639, 1673, 1640, 7: 2119, 1727, 1666, 1724, 2124, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 2128, 1651, 2121, 2123, 2137, 2138, 2136, 2132, 2139, 2129, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 2130, 1760, 1659, 2120, 1737, 1683, 1700, 2125, 2127, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 2135, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 2126, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 2131, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 2122, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 2117, 2118, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 2140, 1835, 2116, 1840, 1839, 1685, 1842, 1844, 1689, 2133, 2134, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 2141, 2142, 1858, 1852, 1853, 1854, 2172, 230: 2153, 2112, 2184, 2188, 235: 2169, 2168, 2205, 2179, 243: 2144, 266: 2148, 2187, 290: 2156, 299: 2175, 311: 2189, 2110, 2182, 2204, 2206, 2147, 2146, 2163, 2203, 2183, 2180, 2174, 2178, 2143, 2145, 2181, 2152, 2185, 2193, 2244, 2151, 2194, 2195, 2150, 2173, 2166, 2167, 2217, 2219, 2220, 2221, 2176, 2222, 2201, 2207, 2215, 2216, 2211, 2223, 2224, 2225, 2212, 2227, 2228, 2218, 2213, 2226, 2208, 2214, 2199, 2229, 2230, 2177, 2234, 2190, 2192, 2233, 2239, 2238, 2240, 2237, 2170, 2241, 2236, 2235, 2232, 2186, 2231, 2191, 2196, 2197, 389: 2155, 1635, 1636, 1634, 448: 2171, 2243, 2162, 2157, 2149, 2160, 2158, 2159, 2198, 2210, 2209, 2202, 2200, 2154, 2165, 2242, 2164, 2161, 2115, 2114, 2113, 3939, 609: 3940, 690: 3941, 817: 3938}, + {2: 1736, 1653, 1687, 1654, 7: 2140, 1741, 1680, 1738, 2145, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 2149, 1665, 2142, 2144, 1859, 2158, 2159, 2157, 2153, 2160, 1837, 1839, 1838, 2150, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 2151, 1774, 1673, 2141, 1751, 1714, 2146, 2148, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 2156, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 2147, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 2152, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 2143, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 2138, 2139, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 2161, 1853, 2137, 1858, 1857, 1699, 1860, 1862, 1703, 2154, 2155, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 2162, 2163, 1876, 1870, 1871, 1872, 2193, 234: 2174, 2133, 2205, 2209, 239: 2190, 2189, 2226, 2200, 247: 2165, 270: 2169, 272: 2208, 294: 2177, 303: 2196, 315: 2210, 2131, 2203, 2225, 2227, 2168, 2167, 2184, 2224, 2204, 2201, 2195, 2199, 2164, 2166, 2202, 2173, 2206, 2214, 2265, 2172, 2215, 2216, 2171, 2194, 2187, 2188, 2238, 2240, 2241, 2242, 2197, 2243, 2222, 2228, 2236, 2237, 2232, 2244, 2245, 2246, 2233, 2248, 2249, 2239, 2234, 2247, 2229, 2235, 2220, 2250, 2251, 2198, 2255, 2211, 2213, 2254, 2260, 2259, 2261, 2258, 2191, 2262, 2257, 2256, 381: 2253, 2207, 2252, 2212, 2217, 2218, 393: 2176, 1649, 1650, 1648, 452: 2192, 2264, 2183, 2178, 2170, 2181, 2179, 2180, 2219, 2231, 2230, 2223, 2221, 2175, 2186, 2263, 2185, 2182, 2136, 2135, 2134, 3990}, + {232: 3949}, + {2: 1736, 1653, 1687, 1654, 7: 1664, 1741, 1680, 1738, 1701, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 1728, 1665, 1674, 1695, 1859, 1788, 1789, 1785, 1747, 1794, 1837, 1839, 1838, 1730, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 1733, 1774, 1673, 1672, 1751, 1714, 1719, 1723, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 1784, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 1720, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 1735, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 1691, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 1652, 1656, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 1852, 1853, 1647, 1858, 1857, 1699, 1860, 1862, 1703, 1767, 1783, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 1873, 1874, 1876, 1870, 1871, 1872, 393: 1947, 1649, 1650, 1648, 483: 1948, 528: 3950}, + {6: 1952, 21: 3951}, + {1346, 1346, 57: 3953, 232: 1346, 238: 1346, 272: 1346, 397: 1346, 1346, 590: 3952}, // 2420 - {6: 3943, 21: 3942}, - {6: 1238, 21: 1238, 246: 2253, 248: 2251, 250: 2252, 2250, 2248, 470: 2249, 2247}, - {6: 1239, 21: 1239}, - {6: 1231, 21: 1231}, - {2: 1316, 6: 1316, 9: 1316, 21: 1316, 28: 1316}, + {1344, 1344, 232: 3956, 238: 1344, 272: 1344, 397: 1344, 1344, 589: 3955}, + {270: 1638, 478: 3954}, + {1345, 1345, 66: 1345, 232: 1345, 238: 1345, 272: 1345, 397: 1345, 1345}, + {1352, 1352, 232: 1352, 238: 1352, 272: 1352, 397: 1352, 1352}, + {400: 3959, 711: 3958, 842: 3957}, // 2425 - {2: 1722, 1639, 1673, 1640, 7: 2119, 1727, 1666, 1724, 2124, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 2128, 1651, 2121, 2123, 2137, 2138, 2136, 2132, 2139, 2129, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 2130, 1760, 1659, 2120, 1737, 1683, 1700, 2125, 2127, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 2135, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 2126, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 2131, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 2122, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 2117, 2118, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 2140, 1835, 2116, 1840, 1839, 1685, 1842, 1844, 1689, 2133, 2134, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 2141, 2142, 1858, 1852, 1853, 1854, 2172, 230: 2153, 2112, 2184, 2188, 235: 2169, 2168, 2205, 2179, 243: 2144, 266: 2148, 2187, 290: 2156, 299: 2175, 311: 2189, 2110, 2182, 2204, 2206, 2147, 2146, 2163, 2203, 2183, 2180, 2174, 2178, 2143, 2145, 2181, 2152, 2185, 2193, 2244, 2151, 2194, 2195, 2150, 2173, 2166, 2167, 2217, 2219, 2220, 2221, 2176, 2222, 2201, 2207, 2215, 2216, 2211, 2223, 2224, 2225, 2212, 2227, 2228, 2218, 2213, 2226, 2208, 2214, 2199, 2229, 2230, 2177, 2234, 2190, 2192, 2233, 2239, 2238, 2240, 2237, 2170, 2241, 2236, 2235, 2232, 2186, 2231, 2191, 2196, 2197, 389: 2155, 1635, 1636, 1634, 448: 2171, 2243, 2162, 2157, 2149, 2160, 2158, 2159, 2198, 2210, 2209, 2202, 2200, 2154, 2165, 2242, 2164, 2161, 2115, 2114, 2113, 3939, 609: 3940, 690: 3944}, - {6: 1230, 21: 1230}, - {6: 1326, 21: 1326}, - {2: 3948, 6: 1324, 9: 3949, 21: 1324, 28: 3950, 706: 3957}, - {2: 1323, 6: 1323, 9: 1323, 21: 1323, 28: 1323}, + {6: 3988, 21: 3987}, + {6: 1342, 21: 1342}, + {2: 1736, 1653, 1687, 1654, 7: 1664, 1741, 1680, 1738, 1701, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 1728, 1665, 1674, 1695, 1859, 1788, 1789, 1785, 1747, 1794, 1837, 1839, 1838, 1730, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 1733, 1774, 1673, 1672, 1751, 1714, 1719, 1723, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 1784, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 1720, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 1735, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 1691, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 1652, 1656, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 1852, 1853, 1647, 1858, 1857, 1699, 1860, 1862, 1703, 1767, 1783, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 1873, 1874, 1876, 1870, 1871, 1872, 393: 3960, 1649, 1650, 1648}, + {2: 1332, 6: 1332, 9: 1332, 21: 1332, 29: 1332, 325: 3962, 841: 3961}, + {2: 3977, 6: 1339, 9: 3978, 21: 1339, 29: 3979, 710: 3976, 839: 3975, 3974}, // 2430 - {230: 1263, 254: 3654, 485: 3955}, - {2: 1263, 1263, 1263, 1263, 7: 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 22: 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 254: 3654, 485: 3953}, - {2: 1263, 1263, 1263, 1263, 7: 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 22: 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 254: 3654, 485: 3951}, - {2: 1722, 1639, 1673, 1640, 7: 1650, 1727, 1666, 1724, 1687, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 1714, 1651, 1660, 1681, 1774, 1775, 1771, 1733, 1780, 1716, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 1719, 1760, 1659, 1658, 1737, 1683, 1700, 1705, 1709, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 1770, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 1706, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 1721, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 1677, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 1638, 1642, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 1834, 1835, 1633, 1840, 1839, 1685, 1842, 1844, 1689, 1753, 1769, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 1855, 1856, 1858, 1852, 1853, 1854, 389: 3952, 1635, 1636, 1634}, - {2: 1319, 6: 1319, 9: 1319, 21: 1319, 28: 1319}, + {148: 3963}, + {182: 3964}, + {232: 3966, 612: 3965}, + {2: 1331, 6: 1331, 9: 1331, 21: 1331, 29: 1331}, + {2: 1736, 1653, 1687, 1654, 7: 2140, 1741, 1680, 1738, 2145, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 2149, 1665, 2142, 2144, 1859, 2158, 2159, 2157, 2153, 2160, 1837, 1839, 1838, 2150, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 2151, 1774, 1673, 2141, 1751, 1714, 2146, 2148, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 2156, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 2147, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 2152, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 2143, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 2138, 2139, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 2161, 1853, 2137, 1858, 1857, 1699, 1860, 1862, 1703, 2154, 2155, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 2162, 2163, 1876, 1870, 1871, 1872, 2193, 234: 2174, 2133, 2205, 2209, 239: 2190, 2189, 2226, 2200, 247: 2165, 270: 2169, 272: 2208, 294: 2177, 303: 2196, 315: 2210, 2131, 2203, 2225, 2227, 2168, 2167, 2184, 2224, 2204, 2201, 2195, 2199, 2164, 2166, 2202, 2173, 2206, 2214, 2265, 2172, 2215, 2216, 2171, 2194, 2187, 2188, 2238, 2240, 2241, 2242, 2197, 2243, 2222, 2228, 2236, 2237, 2232, 2244, 2245, 2246, 2233, 2248, 2249, 2239, 2234, 2247, 2229, 2235, 2220, 2250, 2251, 2198, 2255, 2211, 2213, 2254, 2260, 2259, 2261, 2258, 2191, 2262, 2257, 2256, 381: 2253, 2207, 2252, 2212, 2217, 2218, 393: 2176, 1649, 1650, 1648, 452: 2192, 2264, 2183, 2178, 2170, 2181, 2179, 2180, 2219, 2231, 2230, 2223, 2221, 2175, 2186, 2263, 2185, 2182, 2136, 2135, 2134, 3968, 612: 3969, 694: 3970, 821: 3967}, // 2435 - {2: 1722, 1639, 1673, 1640, 7: 1650, 1727, 1666, 1724, 1687, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 1714, 1651, 1660, 1681, 1774, 1775, 1771, 1733, 1780, 1716, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 1719, 1760, 1659, 1658, 1737, 1683, 1700, 1705, 1709, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 1770, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 1706, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 1721, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 1677, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 1638, 1642, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 1834, 1835, 1633, 1840, 1839, 1685, 1842, 1844, 1689, 1753, 1769, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 1855, 1856, 1858, 1852, 1853, 1854, 389: 3954, 1635, 1636, 1634}, - {2: 1320, 6: 1320, 9: 1320, 21: 1320, 28: 1320}, - {230: 3956}, - {2: 1321, 6: 1321, 9: 1321, 21: 1321, 28: 1321}, - {2: 1322, 6: 1322, 9: 1322, 21: 1322, 28: 1322}, + {6: 3972, 21: 3971}, + {6: 1252, 21: 1252, 250: 2274, 252: 2272, 2273, 2271, 2269, 474: 2270, 2268}, + {6: 1253, 21: 1253}, + {6: 1245, 21: 1245}, + {2: 1330, 6: 1330, 9: 1330, 21: 1330, 29: 1330}, // 2440 - {1329, 1329, 6: 1329, 228: 1329, 234: 1329, 267: 1329, 393: 1329, 1329}, - {396: 3930, 707: 3960}, - {6: 1327, 21: 1327}, - {21: 3962, 246: 2253, 248: 2251, 250: 2252, 2250, 2248, 470: 2249, 2247}, - {1332, 1332, 55: 3924, 65: 1332, 228: 1332, 234: 1332, 267: 1332, 393: 1332, 1332, 586: 3963}, + {2: 1736, 1653, 1687, 1654, 7: 2140, 1741, 1680, 1738, 2145, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 2149, 1665, 2142, 2144, 1859, 2158, 2159, 2157, 2153, 2160, 1837, 1839, 1838, 2150, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 2151, 1774, 1673, 2141, 1751, 1714, 2146, 2148, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 2156, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 2147, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 2152, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 2143, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 2138, 2139, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 2161, 1853, 2137, 1858, 1857, 1699, 1860, 1862, 1703, 2154, 2155, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 2162, 2163, 1876, 1870, 1871, 1872, 2193, 234: 2174, 2133, 2205, 2209, 239: 2190, 2189, 2226, 2200, 247: 2165, 270: 2169, 272: 2208, 294: 2177, 303: 2196, 315: 2210, 2131, 2203, 2225, 2227, 2168, 2167, 2184, 2224, 2204, 2201, 2195, 2199, 2164, 2166, 2202, 2173, 2206, 2214, 2265, 2172, 2215, 2216, 2171, 2194, 2187, 2188, 2238, 2240, 2241, 2242, 2197, 2243, 2222, 2228, 2236, 2237, 2232, 2244, 2245, 2246, 2233, 2248, 2249, 2239, 2234, 2247, 2229, 2235, 2220, 2250, 2251, 2198, 2255, 2211, 2213, 2254, 2260, 2259, 2261, 2258, 2191, 2262, 2257, 2256, 381: 2253, 2207, 2252, 2212, 2217, 2218, 393: 2176, 1649, 1650, 1648, 452: 2192, 2264, 2183, 2178, 2170, 2181, 2179, 2180, 2219, 2231, 2230, 2223, 2221, 2175, 2186, 2263, 2185, 2182, 2136, 2135, 2134, 3968, 612: 3969, 694: 3973}, + {6: 1244, 21: 1244}, + {6: 1340, 21: 1340}, + {2: 3977, 6: 1338, 9: 3978, 21: 1338, 29: 3979, 710: 3986}, + {2: 1337, 6: 1337, 9: 1337, 21: 1337, 29: 1337}, // 2445 - {1337, 1337, 65: 3965, 228: 1337, 234: 1337, 267: 1337, 393: 1337, 1337, 863: 3964}, - {1330, 1330, 228: 3927, 234: 1330, 267: 1330, 393: 1330, 1330, 585: 3979}, - {404: 3966}, - {71: 3967, 383: 3968}, - {228: 3975}, + {234: 1277, 258: 3683, 489: 3984}, + {2: 1277, 1277, 1277, 1277, 7: 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 22: 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 258: 3683, 489: 3982}, + {2: 1277, 1277, 1277, 1277, 7: 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 22: 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 258: 3683, 489: 3980}, + {2: 1736, 1653, 1687, 1654, 7: 1664, 1741, 1680, 1738, 1701, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 1728, 1665, 1674, 1695, 1859, 1788, 1789, 1785, 1747, 1794, 1837, 1839, 1838, 1730, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 1733, 1774, 1673, 1672, 1751, 1714, 1719, 1723, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 1784, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 1720, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 1735, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 1691, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 1652, 1656, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 1852, 1853, 1647, 1858, 1857, 1699, 1860, 1862, 1703, 1767, 1783, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 1873, 1874, 1876, 1870, 1871, 1872, 393: 3981, 1649, 1650, 1648}, + {2: 1333, 6: 1333, 9: 1333, 21: 1333, 29: 1333}, // 2450 - {228: 3969}, - {2: 1722, 1639, 1673, 1640, 7: 1650, 1727, 1666, 1724, 1687, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 1714, 1651, 1660, 1681, 1774, 1775, 1771, 1733, 1780, 1716, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 1719, 1760, 1659, 1658, 1737, 1683, 1700, 1705, 1709, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 1770, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 1706, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 1721, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 1677, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 1638, 1642, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 1834, 1835, 1633, 1840, 1839, 1685, 1842, 1844, 1689, 1753, 1769, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 1855, 1856, 1858, 1852, 1853, 1854, 389: 1928, 1635, 1636, 1634, 479: 1929, 523: 3970}, - {6: 1933, 21: 3971}, - {1334, 1334, 110: 3973, 228: 1334, 234: 1334, 267: 1334, 393: 1334, 1334, 732: 3972}, - {1335, 1335, 228: 1335, 234: 1335, 267: 1335, 393: 1335, 1335}, + {2: 1736, 1653, 1687, 1654, 7: 1664, 1741, 1680, 1738, 1701, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 1728, 1665, 1674, 1695, 1859, 1788, 1789, 1785, 1747, 1794, 1837, 1839, 1838, 1730, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 1733, 1774, 1673, 1672, 1751, 1714, 1719, 1723, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 1784, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 1720, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 1735, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 1691, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 1652, 1656, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 1852, 1853, 1647, 1858, 1857, 1699, 1860, 1862, 1703, 1767, 1783, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 1873, 1874, 1876, 1870, 1871, 1872, 393: 3983, 1649, 1650, 1648}, + {2: 1334, 6: 1334, 9: 1334, 21: 1334, 29: 1334}, + {234: 3985}, + {2: 1335, 6: 1335, 9: 1335, 21: 1335, 29: 1335}, + {2: 1336, 6: 1336, 9: 1336, 21: 1336, 29: 1336}, // 2455 - {266: 1624, 474: 3974}, - {1333, 1333, 228: 1333, 234: 1333, 267: 1333, 393: 1333, 1333}, - {2: 1722, 1639, 1673, 1640, 7: 2119, 1727, 1666, 1724, 2124, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 2128, 1651, 2121, 2123, 2137, 2138, 2136, 2132, 2139, 2129, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 2130, 1760, 1659, 2120, 1737, 1683, 1700, 2125, 2127, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 2135, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 2126, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 2131, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 2122, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 2117, 2118, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 2140, 1835, 2116, 1840, 1839, 1685, 1842, 1844, 1689, 2133, 2134, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 2141, 2142, 1858, 1852, 1853, 1854, 2172, 230: 2153, 2112, 2184, 2188, 235: 2169, 2168, 2205, 2179, 243: 2144, 266: 2148, 2187, 290: 2156, 299: 2175, 311: 2189, 2110, 2182, 2204, 2206, 2147, 2146, 2163, 2203, 2183, 2180, 2174, 2178, 2143, 2145, 2181, 2152, 2185, 2193, 2244, 2151, 2194, 2195, 2150, 2173, 2166, 2167, 2217, 2219, 2220, 2221, 2176, 2222, 2201, 2207, 2215, 2216, 2211, 2223, 2224, 2225, 2212, 2227, 2228, 2218, 2213, 2226, 2208, 2214, 2199, 2229, 2230, 2177, 2234, 2190, 2192, 2233, 2239, 2238, 2240, 2237, 2170, 2241, 2236, 2235, 2232, 2186, 2231, 2191, 2196, 2197, 389: 2155, 1635, 1636, 1634, 448: 2171, 2243, 2162, 2157, 2149, 2160, 2158, 2159, 2198, 2210, 2209, 2202, 2200, 2154, 2165, 2242, 2164, 2161, 2115, 2114, 2113, 3976}, - {21: 3977, 246: 2253, 248: 2251, 250: 2252, 2250, 2248, 470: 2249, 2247}, - {1334, 1334, 110: 3973, 228: 1334, 234: 1334, 267: 1334, 393: 1334, 1334, 732: 3978}, + {1343, 1343, 6: 1343, 232: 1343, 238: 1343, 272: 1343, 397: 1343, 1343}, + {400: 3959, 711: 3989}, + {6: 1341, 21: 1341}, + {21: 3991, 250: 2274, 252: 2272, 2273, 2271, 2269, 474: 2270, 2268}, + {1346, 1346, 57: 3953, 66: 1346, 232: 1346, 238: 1346, 272: 1346, 397: 1346, 1346, 590: 3992}, // 2460 - {1336, 1336, 228: 1336, 234: 1336, 267: 1336, 393: 1336, 1336}, - {1339, 1339, 228: 1339, 234: 1339, 267: 1339, 393: 1339, 1339}, - {2: 1722, 1639, 1673, 1640, 7: 2119, 1727, 1666, 1724, 2124, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 2128, 1651, 2121, 2123, 2137, 2138, 2136, 2132, 2139, 2129, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 2130, 1760, 1659, 2120, 1737, 1683, 1700, 2125, 2127, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 2135, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 2126, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 2131, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 2122, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 2117, 2118, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 2140, 1835, 2116, 1840, 1839, 1685, 1842, 1844, 1689, 2133, 2134, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 2141, 2142, 1858, 1852, 1853, 1854, 2172, 230: 2153, 2112, 2184, 2188, 235: 2169, 2168, 2205, 2179, 243: 2144, 266: 2148, 2187, 290: 2156, 299: 2175, 311: 2189, 2110, 2182, 2204, 2206, 2147, 2146, 2163, 2203, 2183, 2180, 2174, 2178, 2143, 2145, 2181, 2152, 2185, 2193, 2244, 2151, 2194, 2195, 2150, 2173, 2166, 2167, 2217, 2219, 2220, 2221, 2176, 2222, 2201, 2207, 2215, 2216, 2211, 2223, 2224, 2225, 2212, 2227, 2228, 2218, 2213, 2226, 2208, 2214, 2199, 2229, 2230, 2177, 2234, 2190, 2192, 2233, 2239, 2238, 2240, 2237, 2170, 2241, 2236, 2235, 2232, 2186, 2231, 2191, 2196, 2197, 389: 2155, 1635, 1636, 1634, 448: 2171, 2243, 2162, 2157, 2149, 2160, 2158, 2159, 2198, 2210, 2209, 2202, 2200, 2154, 2165, 2242, 2164, 2161, 2115, 2114, 2113, 3981}, - {21: 3982, 246: 2253, 248: 2251, 250: 2252, 2250, 2248, 470: 2249, 2247}, - {1332, 1332, 55: 3924, 228: 1332, 234: 1332, 267: 1332, 393: 1332, 1332, 586: 3983}, + {1351, 1351, 66: 3994, 232: 1351, 238: 1351, 272: 1351, 397: 1351, 1351, 867: 3993}, + {1344, 1344, 232: 3956, 238: 1344, 272: 1344, 397: 1344, 1344, 589: 4008}, + {408: 3995}, + {72: 3996, 387: 3997}, + {232: 4004}, // 2465 - {1340, 1340, 228: 1340, 234: 1340, 267: 1340, 393: 1340, 1340}, - {2: 1722, 1639, 1673, 1640, 7: 1650, 1727, 1666, 1724, 1687, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 1714, 1651, 1660, 1681, 1774, 1775, 1771, 1733, 1780, 1716, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 1719, 1760, 1659, 1658, 1737, 1683, 1700, 1705, 1709, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 1770, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 1706, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 1721, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 1677, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 1638, 1642, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 1834, 1835, 1633, 1840, 1839, 1685, 1842, 1844, 1689, 1753, 1769, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 1855, 1856, 1858, 1852, 1853, 1854, 389: 1928, 1635, 1636, 1634, 479: 1929, 523: 3985}, - {6: 1933, 21: 3986}, - {1332, 1332, 55: 3924, 228: 1332, 234: 1332, 267: 1332, 393: 1332, 1332, 586: 3987}, - {1330, 1330, 228: 3927, 234: 1330, 267: 1330, 393: 1330, 1330, 585: 3988}, + {232: 3998}, + {2: 1736, 1653, 1687, 1654, 7: 1664, 1741, 1680, 1738, 1701, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 1728, 1665, 1674, 1695, 1859, 1788, 1789, 1785, 1747, 1794, 1837, 1839, 1838, 1730, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 1733, 1774, 1673, 1672, 1751, 1714, 1719, 1723, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 1784, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 1720, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 1735, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 1691, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 1652, 1656, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 1852, 1853, 1647, 1858, 1857, 1699, 1860, 1862, 1703, 1767, 1783, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 1873, 1874, 1876, 1870, 1871, 1872, 393: 1947, 1649, 1650, 1648, 483: 1948, 528: 3999}, + {6: 1952, 21: 4000}, + {1348, 1348, 115: 4002, 232: 1348, 238: 1348, 272: 1348, 397: 1348, 1348, 736: 4001}, + {1349, 1349, 232: 1349, 238: 1349, 272: 1349, 397: 1349, 1349}, // 2470 - {1341, 1341, 228: 1341, 234: 1341, 267: 1341, 393: 1341, 1341}, - {1312, 1312, 228: 1312, 234: 3993, 394: 1312, 758: 3992}, - {1314, 1314, 228: 1314, 234: 1314, 394: 1314}, - {1313, 1313, 228: 1313, 234: 1313, 394: 1313}, - {1310, 1310, 228: 1550, 394: 1546, 448: 3997, 481: 3995, 1547, 1548, 1549, 488: 1552, 490: 1551, 3996, 776: 3994}, + {270: 1638, 478: 4003}, + {1347, 1347, 232: 1347, 238: 1347, 272: 1347, 397: 1347, 1347}, + {2: 1736, 1653, 1687, 1654, 7: 2140, 1741, 1680, 1738, 2145, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 2149, 1665, 2142, 2144, 1859, 2158, 2159, 2157, 2153, 2160, 1837, 1839, 1838, 2150, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 2151, 1774, 1673, 2141, 1751, 1714, 2146, 2148, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 2156, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 2147, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 2152, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 2143, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 2138, 2139, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 2161, 1853, 2137, 1858, 1857, 1699, 1860, 1862, 1703, 2154, 2155, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 2162, 2163, 1876, 1870, 1871, 1872, 2193, 234: 2174, 2133, 2205, 2209, 239: 2190, 2189, 2226, 2200, 247: 2165, 270: 2169, 272: 2208, 294: 2177, 303: 2196, 315: 2210, 2131, 2203, 2225, 2227, 2168, 2167, 2184, 2224, 2204, 2201, 2195, 2199, 2164, 2166, 2202, 2173, 2206, 2214, 2265, 2172, 2215, 2216, 2171, 2194, 2187, 2188, 2238, 2240, 2241, 2242, 2197, 2243, 2222, 2228, 2236, 2237, 2232, 2244, 2245, 2246, 2233, 2248, 2249, 2239, 2234, 2247, 2229, 2235, 2220, 2250, 2251, 2198, 2255, 2211, 2213, 2254, 2260, 2259, 2261, 2258, 2191, 2262, 2257, 2256, 381: 2253, 2207, 2252, 2212, 2217, 2218, 393: 2176, 1649, 1650, 1648, 452: 2192, 2264, 2183, 2178, 2170, 2181, 2179, 2180, 2219, 2231, 2230, 2223, 2221, 2175, 2186, 2263, 2185, 2182, 2136, 2135, 2134, 4005}, + {21: 4006, 250: 2274, 252: 2272, 2273, 2271, 2269, 474: 2270, 2268}, + {1348, 1348, 115: 4002, 232: 1348, 238: 1348, 272: 1348, 397: 1348, 1348, 736: 4007}, // 2475 - {1311, 1311, 228: 1311, 394: 1311}, - {1346, 1346}, - {1309, 1309, 241: 477}, - {1308, 1308}, - {1307, 1307}, + {1350, 1350, 232: 1350, 238: 1350, 272: 1350, 397: 1350, 1350}, + {1353, 1353, 232: 1353, 238: 1353, 272: 1353, 397: 1353, 1353}, + {2: 1736, 1653, 1687, 1654, 7: 2140, 1741, 1680, 1738, 2145, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 2149, 1665, 2142, 2144, 1859, 2158, 2159, 2157, 2153, 2160, 1837, 1839, 1838, 2150, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 2151, 1774, 1673, 2141, 1751, 1714, 2146, 2148, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 2156, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 2147, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 2152, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 2143, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 2138, 2139, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 2161, 1853, 2137, 1858, 1857, 1699, 1860, 1862, 1703, 2154, 2155, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 2162, 2163, 1876, 1870, 1871, 1872, 2193, 234: 2174, 2133, 2205, 2209, 239: 2190, 2189, 2226, 2200, 247: 2165, 270: 2169, 272: 2208, 294: 2177, 303: 2196, 315: 2210, 2131, 2203, 2225, 2227, 2168, 2167, 2184, 2224, 2204, 2201, 2195, 2199, 2164, 2166, 2202, 2173, 2206, 2214, 2265, 2172, 2215, 2216, 2171, 2194, 2187, 2188, 2238, 2240, 2241, 2242, 2197, 2243, 2222, 2228, 2236, 2237, 2232, 2244, 2245, 2246, 2233, 2248, 2249, 2239, 2234, 2247, 2229, 2235, 2220, 2250, 2251, 2198, 2255, 2211, 2213, 2254, 2260, 2259, 2261, 2258, 2191, 2262, 2257, 2256, 381: 2253, 2207, 2252, 2212, 2217, 2218, 393: 2176, 1649, 1650, 1648, 452: 2192, 2264, 2183, 2178, 2170, 2181, 2179, 2180, 2219, 2231, 2230, 2223, 2221, 2175, 2186, 2263, 2185, 2182, 2136, 2135, 2134, 4010}, + {21: 4011, 250: 2274, 252: 2272, 2273, 2271, 2269, 474: 2270, 2268}, + {1346, 1346, 57: 3953, 232: 1346, 238: 1346, 272: 1346, 397: 1346, 1346, 590: 4012}, // 2480 - {2: 1722, 1639, 1673, 1640, 7: 1650, 1727, 1666, 1724, 1687, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 1714, 1651, 1660, 1681, 1774, 1775, 1771, 1733, 1780, 1716, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 1719, 1760, 1659, 1658, 1737, 1683, 1700, 1705, 1709, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 1770, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 1706, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 1721, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 1677, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 1638, 1642, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 1834, 1835, 1633, 1840, 1839, 1685, 1842, 1844, 1689, 1753, 1769, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 1855, 1856, 1858, 1852, 1853, 1854, 389: 2065, 1635, 1636, 1634, 560: 3999}, - {1350, 1350, 7: 1344, 238: 3842, 261: 1344, 395: 1344, 525: 4001, 645: 4003, 777: 4002, 4000}, - {1354, 1354}, - {7: 2678, 261: 4006, 395: 2677, 498: 4005}, - {1349, 1349, 7: 1344, 238: 3842, 261: 1344, 395: 1344, 525: 4001, 645: 4004}, + {1354, 1354, 232: 1354, 238: 1354, 272: 1354, 397: 1354, 1354}, + {2: 1736, 1653, 1687, 1654, 7: 1664, 1741, 1680, 1738, 1701, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 1728, 1665, 1674, 1695, 1859, 1788, 1789, 1785, 1747, 1794, 1837, 1839, 1838, 1730, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 1733, 1774, 1673, 1672, 1751, 1714, 1719, 1723, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 1784, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 1720, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 1735, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 1691, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 1652, 1656, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 1852, 1853, 1647, 1858, 1857, 1699, 1860, 1862, 1703, 1767, 1783, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 1873, 1874, 1876, 1870, 1871, 1872, 393: 1947, 1649, 1650, 1648, 483: 1948, 528: 4014}, + {6: 1952, 21: 4015}, + {1346, 1346, 57: 3953, 232: 1346, 238: 1346, 272: 1346, 397: 1346, 1346, 590: 4016}, + {1344, 1344, 232: 3956, 238: 1344, 272: 1344, 397: 1344, 1344, 589: 4017}, // 2485 - {1348, 1348, 7: 1348, 238: 1348, 261: 1348, 395: 1348}, - {1347, 1347, 7: 1347, 238: 1347, 261: 1347, 395: 1347}, - {2: 1263, 1263, 1263, 1263, 7: 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 22: 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 230: 1263, 254: 3654, 299: 1263, 485: 4009}, - {2: 1263, 1263, 1263, 1263, 7: 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 22: 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 230: 1263, 254: 3654, 485: 4007}, - {2: 1722, 1639, 1673, 1640, 7: 1650, 1727, 1666, 1724, 1687, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 1714, 1651, 1660, 1681, 1774, 1775, 1771, 1733, 1780, 1716, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 1719, 1760, 1659, 1658, 1737, 1683, 1700, 1705, 1709, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 1770, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 1706, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 1721, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 1677, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 1638, 1642, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 1834, 1835, 1633, 1840, 1839, 1685, 1842, 1844, 1689, 1753, 1769, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 1855, 1856, 1858, 1852, 1853, 1854, 230: 1889, 389: 1890, 1635, 1636, 1634, 473: 4008}, + {1355, 1355, 232: 1355, 238: 1355, 272: 1355, 397: 1355, 1355}, + {1326, 1326, 232: 1326, 238: 4022, 398: 1326, 762: 4021}, + {1328, 1328, 232: 1328, 238: 1328, 398: 1328}, + {1327, 1327, 232: 1327, 238: 1327, 398: 1327}, + {1324, 1324, 232: 1564, 398: 1560, 452: 4026, 485: 4024, 1561, 1562, 1563, 492: 1566, 494: 1565, 4025, 780: 4023}, // 2490 - {1351, 1351, 7: 1351, 238: 1351, 261: 1351, 395: 1351}, - {2: 1722, 1639, 1673, 1640, 7: 1650, 1727, 1666, 1724, 1687, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 1714, 1651, 1660, 1681, 1774, 1775, 1771, 1733, 1780, 1716, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 1719, 1760, 1659, 1658, 1737, 1683, 1700, 1705, 1709, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 1770, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 1706, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 1721, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 1677, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 1638, 1642, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 1834, 1835, 1633, 1840, 1839, 1685, 1842, 1844, 1689, 1753, 1769, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 1855, 1856, 1858, 1852, 1853, 1854, 230: 1889, 299: 1888, 389: 1890, 1635, 1636, 1634, 473: 1887, 522: 4010}, - {1352, 1352, 7: 1352, 238: 1352, 261: 1352, 395: 1352}, - {2: 1722, 1639, 1673, 1640, 7: 1650, 1727, 1666, 1724, 1687, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 1714, 1651, 1660, 1681, 1774, 1775, 1771, 1733, 1780, 1716, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 1719, 1760, 1659, 1658, 1737, 1683, 1700, 1705, 1709, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 1770, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 1706, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 1721, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 1677, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 1638, 1642, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 1834, 1835, 1633, 1840, 1839, 1685, 1842, 1844, 1689, 1753, 1769, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 1855, 1856, 1858, 1852, 1853, 1854, 389: 4012, 1635, 1636, 1634}, - {229: 1157, 240: 3641, 520: 3642, 581: 4013}, + {1325, 1325, 232: 1325, 398: 1325}, + {1360, 1360}, + {1323, 1323, 245: 479}, + {1322, 1322}, + {1321, 1321}, // 2495 - {229: 4014}, - {2: 1722, 1639, 1673, 1640, 7: 1650, 1727, 1666, 1724, 1687, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 1714, 1651, 1660, 1681, 1774, 1775, 1771, 1733, 1780, 1716, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 1719, 1760, 1659, 1658, 1737, 1683, 1700, 1705, 1709, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 1770, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 1706, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 1721, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 1677, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 1638, 1642, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 1834, 1835, 1633, 1840, 1839, 1685, 1842, 1844, 1689, 1753, 1769, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 1855, 1856, 1858, 1852, 1853, 1854, 389: 1860, 1635, 1636, 1634, 472: 4015}, - {228: 4016}, - {2: 1722, 1639, 1673, 1640, 7: 1650, 1727, 1666, 1724, 1687, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 1714, 1651, 1660, 1681, 1774, 1775, 1771, 1733, 1780, 1716, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 1719, 1760, 1659, 1658, 1737, 1683, 1700, 1705, 1709, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 1770, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 1706, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 1721, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 1677, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 1638, 1642, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 1834, 1835, 1633, 1840, 1839, 1685, 1842, 1844, 1689, 1753, 1769, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 1855, 1856, 1858, 1852, 1853, 1854, 389: 1928, 1635, 1636, 1634, 479: 3610, 528: 3611, 534: 4017}, - {6: 3615, 21: 4018}, + {2: 1736, 1653, 1687, 1654, 7: 1664, 1741, 1680, 1738, 1701, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 1728, 1665, 1674, 1695, 1859, 1788, 1789, 1785, 1747, 1794, 1837, 1839, 1838, 1730, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 1733, 1774, 1673, 1672, 1751, 1714, 1719, 1723, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 1784, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 1720, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 1735, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 1691, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 1652, 1656, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 1852, 1853, 1647, 1858, 1857, 1699, 1860, 1862, 1703, 1767, 1783, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 1873, 1874, 1876, 1870, 1871, 1872, 393: 2084, 1649, 1650, 1648, 564: 4028}, + {1364, 1364, 7: 1358, 242: 3871, 264: 1358, 399: 1358, 530: 4030, 649: 4032, 781: 4031, 4029}, + {1368, 1368}, + {7: 2699, 264: 4035, 399: 2698, 502: 4034}, + {1363, 1363, 7: 1358, 242: 3871, 264: 1358, 399: 1358, 530: 4030, 649: 4033}, // 2500 - {1164, 1164, 1164, 8: 1164, 240: 1164, 242: 1164, 567: 4019}, - {1482, 1482, 3652, 8: 3650, 240: 3641, 242: 4021, 520: 3651, 566: 3649, 608: 4020, 815: 4022}, - {1481, 1481}, - {254: 4023}, - {1360, 1360}, + {1362, 1362, 7: 1362, 242: 1362, 264: 1362, 399: 1362}, + {1361, 1361, 7: 1361, 242: 1361, 264: 1361, 399: 1361}, + {2: 1277, 1277, 1277, 1277, 7: 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 22: 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 234: 1277, 258: 3683, 303: 1277, 489: 4038}, + {2: 1277, 1277, 1277, 1277, 7: 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 22: 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 234: 1277, 258: 3683, 489: 4036}, + {2: 1736, 1653, 1687, 1654, 7: 1664, 1741, 1680, 1738, 1701, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 1728, 1665, 1674, 1695, 1859, 1788, 1789, 1785, 1747, 1794, 1837, 1839, 1838, 1730, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 1733, 1774, 1673, 1672, 1751, 1714, 1719, 1723, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 1784, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 1720, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 1735, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 1691, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 1652, 1656, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 1852, 1853, 1647, 1858, 1857, 1699, 1860, 1862, 1703, 1767, 1783, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 1873, 1874, 1876, 1870, 1871, 1872, 234: 1908, 393: 1909, 1649, 1650, 1648, 477: 4037}, // 2505 - {133: 4027, 153: 4024, 168: 4026, 238: 4025}, - {1480, 1480, 6: 1480}, - {1479, 1479, 6: 1479}, - {1478, 1478, 6: 1478}, - {1477, 1477, 6: 1477}, + {1365, 1365, 7: 1365, 242: 1365, 264: 1365, 399: 1365}, + {2: 1736, 1653, 1687, 1654, 7: 1664, 1741, 1680, 1738, 1701, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 1728, 1665, 1674, 1695, 1859, 1788, 1789, 1785, 1747, 1794, 1837, 1839, 1838, 1730, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 1733, 1774, 1673, 1672, 1751, 1714, 1719, 1723, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 1784, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 1720, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 1735, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 1691, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 1652, 1656, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 1852, 1853, 1647, 1858, 1857, 1699, 1860, 1862, 1703, 1767, 1783, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 1873, 1874, 1876, 1870, 1871, 1872, 234: 1908, 303: 1907, 393: 1909, 1649, 1650, 1648, 477: 1906, 527: 4039}, + {1366, 1366, 7: 1366, 242: 1366, 264: 1366, 399: 1366}, + {2: 1736, 1653, 1687, 1654, 7: 1664, 1741, 1680, 1738, 1701, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 1728, 1665, 1674, 1695, 1859, 1788, 1789, 1785, 1747, 1794, 1837, 1839, 1838, 1730, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 1733, 1774, 1673, 1672, 1751, 1714, 1719, 1723, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 1784, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 1720, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 1735, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 1691, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 1652, 1656, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 1852, 1853, 1647, 1858, 1857, 1699, 1860, 1862, 1703, 1767, 1783, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 1873, 1874, 1876, 1870, 1871, 1872, 393: 4041, 1649, 1650, 1648}, + {233: 1169, 244: 3670, 525: 3671, 585: 4042}, // 2510 - {1428, 1428, 24: 3351, 246: 3350, 504: 3352}, - {1416, 1416}, - {1441, 1441}, - {1443, 1443, 239: 4032}, - {124: 4033}, + {233: 4043}, + {2: 1736, 1653, 1687, 1654, 7: 1664, 1741, 1680, 1738, 1701, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 1728, 1665, 1674, 1695, 1859, 1788, 1789, 1785, 1747, 1794, 1837, 1839, 1838, 1730, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 1733, 1774, 1673, 1672, 1751, 1714, 1719, 1723, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 1784, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 1720, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 1735, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 1691, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 1652, 1656, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 1852, 1853, 1647, 1858, 1857, 1699, 1860, 1862, 1703, 1767, 1783, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 1873, 1874, 1876, 1870, 1871, 1872, 393: 1878, 1649, 1650, 1648, 476: 4044}, + {232: 4045}, + {2: 1736, 1653, 1687, 1654, 7: 1664, 1741, 1680, 1738, 1701, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 1728, 1665, 1674, 1695, 1859, 1788, 1789, 1785, 1747, 1794, 1837, 1839, 1838, 1730, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 1733, 1774, 1673, 1672, 1751, 1714, 1719, 1723, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 1784, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 1720, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 1735, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 1691, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 1652, 1656, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 1852, 1853, 1647, 1858, 1857, 1699, 1860, 1862, 1703, 1767, 1783, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 1873, 1874, 1876, 1870, 1871, 1872, 393: 1947, 1649, 1650, 1648, 483: 3639, 532: 3640, 538: 4046}, + {6: 3644, 21: 4047}, // 2515 - {169: 4034}, - {1442, 1442}, - {2: 1722, 1639, 1673, 1640, 7: 1650, 1727, 1666, 1724, 1687, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 1714, 1651, 1660, 1681, 1774, 1775, 1771, 1733, 1780, 1716, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 1719, 1760, 1659, 1658, 1737, 1683, 1700, 1705, 1709, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 1770, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 1706, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 1721, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 1677, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 1638, 1642, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 1834, 1835, 1633, 1840, 1839, 1685, 1842, 1844, 1689, 1753, 1769, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 1855, 1856, 1858, 1852, 1853, 1854, 389: 1860, 1635, 1636, 1634, 472: 4037, 518: 4036}, - {1451, 1451, 6: 2981, 239: 4043, 547: 4050}, - {655, 655, 6: 655, 239: 655, 396: 4039, 401: 4038}, + {1176, 1176, 1176, 8: 1176, 244: 1176, 246: 1176, 571: 4048}, + {1496, 1496, 3681, 8: 3679, 244: 3670, 246: 4050, 525: 3680, 570: 3678, 611: 4049, 819: 4051}, + {1495, 1495}, + {258: 4052}, + {1374, 1374}, // 2520 - {542, 542, 1722, 1639, 1673, 1640, 542, 1650, 1727, 1666, 1724, 1687, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 1714, 1651, 1660, 1681, 1774, 1775, 1771, 1733, 1780, 1716, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 1719, 1760, 1659, 1658, 1737, 1683, 1700, 1705, 1709, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 1770, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 1706, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 1721, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 1677, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 1638, 1642, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 1834, 1835, 1633, 1840, 1839, 1685, 1842, 1844, 1689, 1753, 1769, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 1855, 1856, 1858, 1852, 1853, 1854, 239: 542, 384: 2898, 389: 2897, 1635, 1636, 1634, 580: 4048}, - {2: 1722, 1639, 1673, 1640, 7: 1650, 1727, 1666, 1724, 1687, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 1714, 1651, 1660, 1681, 1774, 1775, 1771, 1733, 1780, 1716, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 1719, 1760, 1659, 1658, 1737, 1683, 1700, 1705, 1709, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 1770, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 1706, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 1721, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 1677, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 1638, 1642, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 1834, 1835, 1633, 1840, 1839, 1685, 1842, 1844, 1689, 1753, 1769, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 1855, 1856, 1858, 1852, 1853, 1854, 389: 2878, 1635, 1636, 1634, 611: 4040}, - {1451, 1451, 6: 2880, 239: 4043, 401: 4042, 547: 4041}, - {1453, 1453}, - {542, 542, 1722, 1639, 1673, 1640, 542, 1650, 1727, 1666, 1724, 1687, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 1714, 1651, 1660, 1681, 1774, 1775, 1771, 1733, 1780, 1716, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 1719, 1760, 1659, 1658, 1737, 1683, 1700, 1705, 1709, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 1770, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 1706, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 1721, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 1677, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 1638, 1642, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 1834, 1835, 1633, 1840, 1839, 1685, 1842, 1844, 1689, 1753, 1769, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 1855, 1856, 1858, 1852, 1853, 1854, 239: 542, 384: 2898, 389: 2897, 1635, 1636, 1634, 580: 4046}, + {138: 4056, 157: 4053, 172: 4055, 242: 4054}, + {1494, 1494, 6: 1494}, + {1493, 1493, 6: 1493}, + {1492, 1492, 6: 1492}, + {1491, 1491, 6: 1491}, // 2525 - {266: 1624, 474: 4044}, - {83: 4045}, - {1450, 1450}, - {1451, 1451, 6: 2900, 239: 4043, 547: 4047}, - {1452, 1452}, - // 2530 - {1451, 1451, 6: 2900, 239: 4043, 547: 4049}, - {1454, 1454}, + {1442, 1442, 24: 3377, 250: 3376, 508: 3378}, + {1430, 1430}, {1455, 1455}, - {2: 1722, 1639, 1673, 1640, 7: 1650, 1727, 1666, 1724, 1687, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 1714, 1651, 1660, 1681, 1774, 1775, 1771, 1733, 1780, 1716, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 1719, 1760, 1659, 1658, 1737, 1683, 1700, 1705, 1709, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 1770, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 1706, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 1721, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 1677, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 1638, 1642, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 1834, 1835, 1633, 1840, 1839, 1685, 1842, 1844, 1689, 1753, 1769, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 1855, 1856, 1858, 1852, 1853, 1854, 389: 1860, 1635, 1636, 1634, 472: 4054, 739: 4053, 871: 4052}, - {1459, 1459, 6: 4057}, + {1457, 1457, 243: 4061}, + {129: 4062}, + // 2530 + {173: 4063}, + {1456, 1456}, + {2: 1736, 1653, 1687, 1654, 7: 1664, 1741, 1680, 1738, 1701, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 1728, 1665, 1674, 1695, 1859, 1788, 1789, 1785, 1747, 1794, 1837, 1839, 1838, 1730, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 1733, 1774, 1673, 1672, 1751, 1714, 1719, 1723, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 1784, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 1720, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 1735, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 1691, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 1652, 1656, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 1852, 1853, 1647, 1858, 1857, 1699, 1860, 1862, 1703, 1767, 1783, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 1873, 1874, 1876, 1870, 1871, 1872, 393: 1878, 1649, 1650, 1648, 476: 4066, 522: 4065}, + {1465, 1465, 6: 2996, 243: 4072, 551: 4079}, + {663, 663, 6: 663, 243: 663, 400: 4068, 405: 4067}, // 2535 - {1458, 1458, 6: 1458}, - {402: 4055}, - {2: 1722, 1639, 1673, 1640, 7: 1650, 1727, 1666, 1724, 1687, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 1714, 1651, 1660, 1681, 1774, 1775, 1771, 1733, 1780, 1716, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 1719, 1760, 1659, 1658, 1737, 1683, 1700, 1705, 1709, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 1770, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 1706, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 1721, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 1677, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 1638, 1642, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 1834, 1835, 1633, 1840, 1839, 1685, 1842, 1844, 1689, 1753, 1769, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 1855, 1856, 1858, 1852, 1853, 1854, 389: 1860, 1635, 1636, 1634, 472: 4056}, - {1456, 1456, 6: 1456}, - {2: 1722, 1639, 1673, 1640, 7: 1650, 1727, 1666, 1724, 1687, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 1714, 1651, 1660, 1681, 1774, 1775, 1771, 1733, 1780, 1716, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 1719, 1760, 1659, 1658, 1737, 1683, 1700, 1705, 1709, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 1770, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 1706, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 1721, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 1677, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 1638, 1642, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 1834, 1835, 1633, 1840, 1839, 1685, 1842, 1844, 1689, 1753, 1769, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 1855, 1856, 1858, 1852, 1853, 1854, 389: 1860, 1635, 1636, 1634, 472: 4054, 739: 4058}, + {551, 551, 1736, 1653, 1687, 1654, 551, 1664, 1741, 1680, 1738, 1701, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 1728, 1665, 1674, 1695, 1859, 1788, 1789, 1785, 1747, 1794, 1837, 1839, 1838, 1730, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 1733, 1774, 1673, 1672, 1751, 1714, 1719, 1723, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 1784, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 1720, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 1735, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 1691, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 1652, 1656, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 1852, 1853, 1647, 1858, 1857, 1699, 1860, 1862, 1703, 1767, 1783, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 1873, 1874, 1876, 1870, 1871, 1872, 243: 551, 388: 2912, 393: 2911, 1649, 1650, 1648, 584: 4077}, + {2: 1736, 1653, 1687, 1654, 7: 1664, 1741, 1680, 1738, 1701, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 1728, 1665, 1674, 1695, 1859, 1788, 1789, 1785, 1747, 1794, 1837, 1839, 1838, 1730, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 1733, 1774, 1673, 1672, 1751, 1714, 1719, 1723, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 1784, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 1720, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 1735, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 1691, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 1652, 1656, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 1852, 1853, 1647, 1858, 1857, 1699, 1860, 1862, 1703, 1767, 1783, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 1873, 1874, 1876, 1870, 1871, 1872, 393: 2892, 1649, 1650, 1648, 614: 4069}, + {1465, 1465, 6: 2894, 243: 4072, 405: 4071, 551: 4070}, + {1467, 1467}, + {551, 551, 1736, 1653, 1687, 1654, 551, 1664, 1741, 1680, 1738, 1701, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 1728, 1665, 1674, 1695, 1859, 1788, 1789, 1785, 1747, 1794, 1837, 1839, 1838, 1730, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 1733, 1774, 1673, 1672, 1751, 1714, 1719, 1723, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 1784, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 1720, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 1735, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 1691, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 1652, 1656, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 1852, 1853, 1647, 1858, 1857, 1699, 1860, 1862, 1703, 1767, 1783, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 1873, 1874, 1876, 1870, 1871, 1872, 243: 551, 388: 2912, 393: 2911, 1649, 1650, 1648, 584: 4075}, // 2540 - {1457, 1457, 6: 1457}, - {486: 4069}, - {2: 1172, 1172, 1172, 1172, 7: 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 22: 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 230: 1172, 311: 1172, 313: 3493, 603: 4061}, - {2: 1722, 1639, 1673, 1640, 7: 1650, 1727, 1666, 1724, 1687, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 1714, 1651, 1660, 1681, 1774, 1775, 1771, 1733, 1780, 1716, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 4062, 1760, 1659, 1658, 1737, 1683, 1700, 1705, 1709, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 1770, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 1706, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 1721, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 1677, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 1638, 1642, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 1834, 1835, 1633, 1840, 1839, 1685, 1842, 1844, 1689, 1753, 1769, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 1855, 1856, 1858, 1852, 1853, 1854, 230: 1889, 311: 1991, 389: 1890, 1635, 1636, 1634, 473: 1990, 501: 1992, 574: 1993, 590: 4063}, - {1069, 1069, 6: 1069, 41: 1069, 228: 4064, 312: 1069, 410: 1069}, + {270: 1638, 478: 4073}, + {84: 4074}, + {1464, 1464}, + {1465, 1465, 6: 2914, 243: 4072, 551: 4076}, + {1466, 1466}, // 2545 - {109, 109, 6: 1995}, - {21: 4065}, - {41: 4066}, - {404: 4067}, - {230: 2006, 576: 4068}, + {1465, 1465, 6: 2914, 243: 4072, 551: 4078}, + {1468, 1468}, + {1469, 1469}, + {2: 1736, 1653, 1687, 1654, 7: 1664, 1741, 1680, 1738, 1701, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 1728, 1665, 1674, 1695, 1859, 1788, 1789, 1785, 1747, 1794, 1837, 1839, 1838, 1730, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 1733, 1774, 1673, 1672, 1751, 1714, 1719, 1723, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 1784, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 1720, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 1735, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 1691, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 1652, 1656, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 1852, 1853, 1647, 1858, 1857, 1699, 1860, 1862, 1703, 1767, 1783, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 1873, 1874, 1876, 1870, 1871, 1872, 393: 1878, 1649, 1650, 1648, 476: 4083, 743: 4082, 875: 4081}, + {1473, 1473, 6: 4086}, // 2550 - {108, 108}, - {2: 1722, 1639, 1673, 1640, 7: 1650, 1727, 1666, 1724, 1687, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 1714, 1651, 1660, 1681, 1774, 1775, 1771, 1733, 1780, 1716, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 1719, 1760, 1659, 1658, 1737, 1683, 1700, 1705, 1709, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 1770, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 1706, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 1721, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 1677, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 1638, 1642, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 1834, 1835, 1633, 1840, 1839, 1685, 1842, 1844, 1689, 1753, 1769, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 1855, 1856, 1858, 1852, 1853, 1854, 389: 1860, 1635, 1636, 1634, 472: 4070}, - {223, 223, 3846, 3845, 6: 223, 1344, 3852, 3843, 3848, 3850, 13: 3849, 3847, 3851, 3855, 3853, 3854, 3862, 3857, 53: 4086, 67: 4078, 85: 4076, 91: 4079, 94: 4080, 101: 4081, 238: 3842, 242: 4021, 261: 1344, 323: 4074, 395: 1344, 397: 3859, 3858, 405: 4087, 411: 4077, 413: 4083, 4072, 417: 4084, 422: 4075, 4082, 525: 3844, 550: 3856, 554: 3861, 608: 4085, 618: 4089, 625: 4073, 4088, 756: 4071}, - {1516, 1516, 6: 4165}, - {396: 4159}, + {1472, 1472, 6: 1472}, + {406: 4084}, + {2: 1736, 1653, 1687, 1654, 7: 1664, 1741, 1680, 1738, 1701, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 1728, 1665, 1674, 1695, 1859, 1788, 1789, 1785, 1747, 1794, 1837, 1839, 1838, 1730, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 1733, 1774, 1673, 1672, 1751, 1714, 1719, 1723, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 1784, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 1720, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 1735, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 1691, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 1652, 1656, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 1852, 1853, 1647, 1858, 1857, 1699, 1860, 1862, 1703, 1767, 1783, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 1873, 1874, 1876, 1870, 1871, 1872, 393: 1878, 1649, 1650, 1648, 476: 4085}, + {1470, 1470, 6: 1470}, + {2: 1736, 1653, 1687, 1654, 7: 1664, 1741, 1680, 1738, 1701, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 1728, 1665, 1674, 1695, 1859, 1788, 1789, 1785, 1747, 1794, 1837, 1839, 1838, 1730, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 1733, 1774, 1673, 1672, 1751, 1714, 1719, 1723, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 1784, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 1720, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 1735, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 1691, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 1652, 1656, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 1852, 1853, 1647, 1858, 1857, 1699, 1860, 1862, 1703, 1767, 1783, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 1873, 1874, 1876, 1870, 1871, 1872, 393: 1878, 1649, 1650, 1648, 476: 4083, 743: 4087}, // 2555 - {1513, 1513, 6: 1513}, - {402: 4155}, - {2: 1472, 1472, 1472, 1472, 7: 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 22: 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 383: 1463, 1463, 1463, 396: 4143, 401: 1463, 415: 1463, 1463, 558: 4106, 4141, 595: 4142, 3584, 3587}, - {396: 4139}, - {2: 1472, 1472, 1472, 1472, 7: 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 22: 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 383: 2907, 4128, 396: 4129, 401: 2908, 415: 4131, 529: 4130, 558: 4106, 4127}, + {1471, 1471, 6: 1471}, + {490: 4098}, + {2: 1184, 1184, 1184, 1184, 7: 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 22: 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 234: 1184, 315: 1184, 317: 3522, 606: 4090}, + {2: 1736, 1653, 1687, 1654, 7: 1664, 1741, 1680, 1738, 1701, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 1728, 1665, 1674, 1695, 1859, 1788, 1789, 1785, 1747, 1794, 1837, 1839, 1838, 1730, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 4091, 1774, 1673, 1672, 1751, 1714, 1719, 1723, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 1784, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 1720, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 1735, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 1691, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 1652, 1656, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 1852, 1853, 1647, 1858, 1857, 1699, 1860, 1862, 1703, 1767, 1783, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 1873, 1874, 1876, 1870, 1871, 1872, 234: 1908, 315: 2010, 393: 1909, 1649, 1650, 1648, 477: 2009, 505: 2011, 578: 2012, 593: 4092}, + {1081, 1081, 6: 1081, 46: 1081, 232: 4093, 316: 1081, 414: 1081}, // 2560 - {396: 4125}, - {607: 4124}, - {607: 4123}, - {2: 1472, 1472, 1472, 1472, 7: 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 22: 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 558: 4106, 4120}, - {2: 1472, 1472, 1472, 1472, 7: 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 22: 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 558: 4106, 4113}, + {110, 110, 6: 2014}, + {21: 4094}, + {46: 4095}, + {408: 4096}, + {234: 2025, 580: 4097}, // 2565 - {2: 1472, 1472, 1472, 1472, 7: 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 22: 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 558: 4106, 4105}, - {2: 1722, 1639, 1673, 1640, 7: 1650, 1727, 1666, 1724, 1687, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 1714, 1651, 1660, 1681, 1774, 1775, 1771, 1733, 1780, 1716, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 1719, 1760, 1659, 1658, 1737, 1683, 1700, 1705, 1709, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 1770, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 1706, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 1721, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 1677, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 1638, 1642, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 1834, 1835, 1633, 1840, 1839, 1685, 1842, 1844, 1689, 1753, 1769, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 1855, 1856, 1858, 1852, 1853, 1854, 234: 4098, 383: 2907, 389: 1860, 1635, 1636, 1634, 401: 2908, 4096, 472: 4097, 529: 4099}, - {1489, 1489, 6: 1489}, - {89: 1263, 97: 1263, 1263, 238: 1263, 254: 3654, 485: 4090}, - {1487, 1487, 6: 1487}, + {109, 109}, + {2: 1736, 1653, 1687, 1654, 7: 1664, 1741, 1680, 1738, 1701, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 1728, 1665, 1674, 1695, 1859, 1788, 1789, 1785, 1747, 1794, 1837, 1839, 1838, 1730, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 1733, 1774, 1673, 1672, 1751, 1714, 1719, 1723, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 1784, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 1720, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 1735, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 1691, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 1652, 1656, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 1852, 1853, 1647, 1858, 1857, 1699, 1860, 1862, 1703, 1767, 1783, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 1873, 1874, 1876, 1870, 1871, 1872, 393: 1878, 1649, 1650, 1648, 476: 4099}, + {224, 224, 3875, 3874, 6: 224, 1358, 3881, 3872, 3877, 3879, 13: 3878, 3876, 3880, 3884, 3882, 3883, 3891, 3886, 54: 4115, 68: 4107, 86: 4105, 92: 4108, 95: 4109, 103: 4110, 242: 3871, 246: 4050, 264: 1358, 327: 4103, 399: 1358, 401: 3888, 3887, 409: 4116, 415: 4106, 417: 4112, 4101, 421: 4113, 426: 4104, 4111, 530: 3873, 554: 3885, 558: 3890, 611: 4114, 622: 4118, 629: 4102, 4117, 760: 4100}, + {1530, 1530, 6: 4194}, + {400: 4188}, // 2570 - {1467, 1467, 6: 1467}, - {222, 222, 3846, 3845, 6: 222, 1344, 3852, 3843, 3848, 3850, 13: 3849, 3847, 3851, 3855, 3853, 3854, 3862, 3857, 238: 3842, 261: 1344, 395: 1344, 397: 3859, 3858, 525: 3844, 550: 3856, 554: 3870}, - {89: 4093, 97: 4094, 4095, 238: 4092, 755: 4091}, - {1488, 1488, 6: 1488}, - {1486, 1486, 6: 1486}, + {1527, 1527, 6: 1527}, + {406: 4184}, + {2: 1486, 1486, 1486, 1486, 7: 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 22: 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 387: 1477, 1477, 1477, 400: 4172, 405: 1477, 419: 1477, 1477, 562: 4135, 4170, 598: 4171, 3613, 3616}, + {400: 4168}, + {2: 1486, 1486, 1486, 1486, 7: 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 22: 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 387: 2921, 4157, 400: 4158, 405: 2922, 419: 4160, 533: 4159, 562: 4135, 4156}, // 2575 - {1485, 1485, 6: 1485}, - {1484, 1484, 6: 1484}, - {1483, 1483, 6: 1483}, - {2: 1722, 1639, 1673, 1640, 7: 1650, 1727, 1666, 1724, 1687, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 1714, 1651, 1660, 1681, 1774, 1775, 1771, 1733, 1780, 1716, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 1719, 1760, 1659, 1658, 1737, 1683, 1700, 1705, 1709, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 1770, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 1706, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 1721, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 1677, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 1638, 1642, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 1834, 1835, 1633, 1840, 1839, 1685, 1842, 1844, 1689, 1753, 1769, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 1855, 1856, 1858, 1852, 1853, 1854, 389: 1860, 1635, 1636, 1634, 472: 4104}, - {1492, 1492, 6: 1492}, + {400: 4154}, + {610: 4153}, + {610: 4152}, + {2: 1486, 1486, 1486, 1486, 7: 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 22: 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 562: 4135, 4149}, + {2: 1486, 1486, 1486, 1486, 7: 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 22: 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 562: 4135, 4142}, // 2580 - {2: 1722, 1639, 1673, 1640, 7: 1650, 1727, 1666, 1724, 1687, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 1714, 1651, 1660, 1681, 1774, 1775, 1771, 1733, 1780, 1716, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 1719, 1760, 1659, 1658, 1737, 1683, 1700, 1705, 1709, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 1770, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 1706, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 1721, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 1677, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 1638, 1642, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 1834, 1835, 1633, 1840, 1839, 1685, 1842, 1844, 1689, 1753, 1769, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 1855, 1856, 1858, 1852, 1853, 1854, 389: 1860, 1635, 1636, 1634, 472: 4103}, - {2: 1722, 1639, 1673, 1640, 7: 1650, 1727, 1666, 1724, 1687, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 1714, 1651, 1660, 1681, 1774, 1775, 1771, 1733, 1780, 1716, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 1719, 1760, 1659, 1658, 1737, 1683, 1700, 1705, 1709, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 1770, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 1706, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 1721, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 1677, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 1638, 1642, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 1834, 1835, 1633, 1840, 1839, 1685, 1842, 1844, 1689, 1753, 1769, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 1855, 1856, 1858, 1852, 1853, 1854, 389: 4100, 1635, 1636, 1634}, - {402: 4101}, - {2: 1722, 1639, 1673, 1640, 7: 1650, 1727, 1666, 1724, 1687, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 1714, 1651, 1660, 1681, 1774, 1775, 1771, 1733, 1780, 1716, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 1719, 1760, 1659, 1658, 1737, 1683, 1700, 1705, 1709, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 1770, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 1706, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 1721, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 1677, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 1638, 1642, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 1834, 1835, 1633, 1840, 1839, 1685, 1842, 1844, 1689, 1753, 1769, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 1855, 1856, 1858, 1852, 1853, 1854, 389: 4102, 1635, 1636, 1634}, - {1490, 1490, 6: 1490}, + {2: 1486, 1486, 1486, 1486, 7: 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 22: 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 562: 4135, 4134}, + {2: 1736, 1653, 1687, 1654, 7: 1664, 1741, 1680, 1738, 1701, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 1728, 1665, 1674, 1695, 1859, 1788, 1789, 1785, 1747, 1794, 1837, 1839, 1838, 1730, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 1733, 1774, 1673, 1672, 1751, 1714, 1719, 1723, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 1784, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 1720, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 1735, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 1691, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 1652, 1656, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 1852, 1853, 1647, 1858, 1857, 1699, 1860, 1862, 1703, 1767, 1783, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 1873, 1874, 1876, 1870, 1871, 1872, 238: 4127, 387: 2921, 393: 1878, 1649, 1650, 1648, 405: 2922, 4125, 476: 4126, 533: 4128}, + {1503, 1503, 6: 1503}, + {90: 1277, 98: 1277, 1277, 242: 1277, 258: 3683, 489: 4119}, + {1501, 1501, 6: 1501}, // 2585 - {1491, 1491, 6: 1491}, - {1493, 1493, 6: 1493}, - {2: 1722, 1639, 1673, 1640, 7: 1650, 1727, 1666, 1724, 1687, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 1714, 1651, 1660, 1681, 1774, 1775, 1771, 1733, 1780, 1716, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 1719, 1760, 1659, 1658, 1737, 1683, 1700, 1705, 1709, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 1770, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 1706, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 1721, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 1677, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 1638, 1642, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 1834, 1835, 1633, 1840, 1839, 1685, 1842, 1844, 1689, 1753, 1769, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 1855, 1856, 1858, 1852, 1853, 1854, 389: 1928, 1635, 1636, 1634, 479: 4107}, - {2: 1471, 1471, 1471, 1471, 7: 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 22: 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471}, - {257: 4108, 411: 4109}, + {1481, 1481, 6: 1481}, + {223, 223, 3875, 3874, 6: 223, 1358, 3881, 3872, 3877, 3879, 13: 3878, 3876, 3880, 3884, 3882, 3883, 3891, 3886, 242: 3871, 264: 1358, 399: 1358, 401: 3888, 3887, 530: 3873, 554: 3885, 558: 3899}, + {90: 4122, 98: 4123, 4124, 242: 4121, 759: 4120}, + {1502, 1502, 6: 1502}, + {1500, 1500, 6: 1500}, // 2590 - {238: 4111}, - {238: 4110}, - {1494, 1494, 6: 1494}, - {230: 2153, 235: 3831, 3832, 243: 2144, 266: 2148, 316: 2147, 2146, 324: 2143, 2145, 327: 2152, 331: 2151, 334: 2150, 450: 3830, 452: 2149, 728: 4112}, - {1495, 1495, 6: 1495}, + {1499, 1499, 6: 1499}, + {1498, 1498, 6: 1498}, + {1497, 1497, 6: 1497}, + {2: 1736, 1653, 1687, 1654, 7: 1664, 1741, 1680, 1738, 1701, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 1728, 1665, 1674, 1695, 1859, 1788, 1789, 1785, 1747, 1794, 1837, 1839, 1838, 1730, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 1733, 1774, 1673, 1672, 1751, 1714, 1719, 1723, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 1784, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 1720, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 1735, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 1691, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 1652, 1656, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 1852, 1853, 1647, 1858, 1857, 1699, 1860, 1862, 1703, 1767, 1783, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 1873, 1874, 1876, 1870, 1871, 1872, 393: 1878, 1649, 1650, 1648, 476: 4133}, + {1506, 1506, 6: 1506}, // 2595 - {2: 1722, 1639, 1673, 1640, 7: 1650, 1727, 1666, 1724, 1687, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 1714, 1651, 1660, 1681, 1774, 1775, 1771, 1733, 1780, 1716, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 1719, 1760, 1659, 1658, 1737, 1683, 1700, 1705, 1709, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 1770, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 1706, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 1721, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 1677, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 1638, 1642, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 1834, 1835, 1633, 1840, 1839, 1685, 1842, 1844, 1689, 1753, 1769, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 1855, 1856, 1858, 1852, 1853, 1854, 389: 1928, 1635, 1636, 1634, 479: 4114}, - {2: 1722, 1639, 1673, 1640, 7: 1650, 1727, 1666, 1724, 1687, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 1714, 1651, 1660, 1681, 1774, 1775, 1771, 1733, 1780, 1716, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 1719, 1760, 1659, 1658, 1737, 1683, 1700, 1705, 1709, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 1770, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 1706, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 1721, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 1677, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 1638, 1642, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 1834, 1835, 1633, 1840, 1839, 1685, 1842, 1844, 1689, 1753, 1769, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 1855, 1856, 1858, 1852, 1853, 1854, 389: 1928, 1635, 1636, 1634, 479: 3585, 531: 4115}, - {1470, 1470, 4: 4117, 4118, 1470, 594: 4116}, - {1496, 1496, 6: 1496}, - {1469, 1469, 6: 1469}, + {2: 1736, 1653, 1687, 1654, 7: 1664, 1741, 1680, 1738, 1701, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 1728, 1665, 1674, 1695, 1859, 1788, 1789, 1785, 1747, 1794, 1837, 1839, 1838, 1730, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 1733, 1774, 1673, 1672, 1751, 1714, 1719, 1723, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 1784, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 1720, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 1735, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 1691, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 1652, 1656, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 1852, 1853, 1647, 1858, 1857, 1699, 1860, 1862, 1703, 1767, 1783, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 1873, 1874, 1876, 1870, 1871, 1872, 393: 1878, 1649, 1650, 1648, 476: 4132}, + {2: 1736, 1653, 1687, 1654, 7: 1664, 1741, 1680, 1738, 1701, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 1728, 1665, 1674, 1695, 1859, 1788, 1789, 1785, 1747, 1794, 1837, 1839, 1838, 1730, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 1733, 1774, 1673, 1672, 1751, 1714, 1719, 1723, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 1784, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 1720, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 1735, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 1691, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 1652, 1656, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 1852, 1853, 1647, 1858, 1857, 1699, 1860, 1862, 1703, 1767, 1783, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 1873, 1874, 1876, 1870, 1871, 1872, 393: 4129, 1649, 1650, 1648}, + {406: 4130}, + {2: 1736, 1653, 1687, 1654, 7: 1664, 1741, 1680, 1738, 1701, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 1728, 1665, 1674, 1695, 1859, 1788, 1789, 1785, 1747, 1794, 1837, 1839, 1838, 1730, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 1733, 1774, 1673, 1672, 1751, 1714, 1719, 1723, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 1784, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 1720, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 1735, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 1691, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 1652, 1656, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 1852, 1853, 1647, 1858, 1857, 1699, 1860, 1862, 1703, 1767, 1783, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 1873, 1874, 1876, 1870, 1871, 1872, 393: 4131, 1649, 1650, 1648}, + {1504, 1504, 6: 1504}, // 2600 - {2: 1722, 1639, 1673, 1640, 7: 1650, 1727, 1666, 1724, 1687, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 1714, 1651, 1660, 1681, 1774, 1775, 1771, 1733, 1780, 1716, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 1719, 1760, 1659, 1658, 1737, 1683, 1700, 1705, 1709, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 1770, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 1706, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 1721, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 1677, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 1638, 1642, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 1834, 1835, 1633, 1840, 1839, 1685, 1842, 1844, 1689, 1753, 1769, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 1855, 1856, 1858, 1852, 1853, 1854, 389: 1928, 1635, 1636, 1634, 479: 4119}, - {1468, 1468, 6: 1468}, - {2: 1722, 1639, 1673, 1640, 7: 1650, 1727, 1666, 1724, 1687, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 1714, 1651, 1660, 1681, 1774, 1775, 1771, 1733, 1780, 1716, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 1719, 1760, 1659, 1658, 1737, 1683, 1700, 1705, 1709, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 1770, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 1706, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 1721, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 1677, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 1638, 1642, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 1834, 1835, 1633, 1840, 1839, 1685, 1842, 1844, 1689, 1753, 1769, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 1855, 1856, 1858, 1852, 1853, 1854, 389: 1928, 1635, 1636, 1634, 479: 3585, 531: 4121}, - {1470, 1470, 4: 4117, 4118, 1470, 594: 4122}, - {1497, 1497, 6: 1497}, + {1505, 1505, 6: 1505}, + {1507, 1507, 6: 1507}, + {2: 1736, 1653, 1687, 1654, 7: 1664, 1741, 1680, 1738, 1701, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 1728, 1665, 1674, 1695, 1859, 1788, 1789, 1785, 1747, 1794, 1837, 1839, 1838, 1730, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 1733, 1774, 1673, 1672, 1751, 1714, 1719, 1723, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 1784, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 1720, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 1735, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 1691, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 1652, 1656, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 1852, 1853, 1647, 1858, 1857, 1699, 1860, 1862, 1703, 1767, 1783, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 1873, 1874, 1876, 1870, 1871, 1872, 393: 1947, 1649, 1650, 1648, 483: 4136}, + {2: 1485, 1485, 1485, 1485, 7: 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 22: 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485}, + {262: 4137, 415: 4138}, // 2605 - {1498, 1498, 6: 1498}, - {1499, 1499, 6: 1499}, - {2: 1722, 1639, 1673, 1640, 7: 1650, 1727, 1666, 1724, 1687, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 1714, 1651, 1660, 1681, 1774, 1775, 1771, 1733, 1780, 1716, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 1719, 1760, 1659, 1658, 1737, 1683, 1700, 1705, 1709, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 1770, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 1706, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 1721, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 1677, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 1638, 1642, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 1834, 1835, 1633, 1840, 1839, 1685, 1842, 1844, 1689, 1753, 1769, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 1855, 1856, 1858, 1852, 1853, 1854, 389: 4126, 1635, 1636, 1634}, - {1502, 1502, 6: 1502}, - {2: 1722, 1639, 1673, 1640, 7: 1650, 1727, 1666, 1724, 1687, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 1714, 1651, 1660, 1681, 1774, 1775, 1771, 1733, 1780, 1716, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 1719, 1760, 1659, 1658, 1737, 1683, 1700, 1705, 1709, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 1770, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 1706, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 1721, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 1677, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 1638, 1642, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 1834, 1835, 1633, 1840, 1839, 1685, 1842, 1844, 1689, 1753, 1769, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 1855, 1856, 1858, 1852, 1853, 1854, 389: 1928, 1635, 1636, 1634, 479: 4137}, + {242: 4140}, + {242: 4139}, + {1508, 1508, 6: 1508}, + {234: 2174, 239: 3860, 3861, 247: 2165, 270: 2169, 320: 2168, 2167, 328: 2164, 2166, 331: 2173, 335: 2172, 338: 2171, 454: 3859, 456: 2170, 732: 4141}, + {1509, 1509, 6: 1509}, // 2610 - {383: 4136}, - {2: 1722, 1639, 1673, 1640, 7: 1650, 1727, 1666, 1724, 1687, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 1714, 1651, 1660, 1681, 1774, 1775, 1771, 1733, 1780, 1716, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 1719, 1760, 1659, 1658, 1737, 1683, 1700, 1705, 1709, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 1770, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 1706, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 1721, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 1677, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 1638, 1642, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 1834, 1835, 1633, 1840, 1839, 1685, 1842, 1844, 1689, 1753, 1769, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 1855, 1856, 1858, 1852, 1853, 1854, 389: 4135, 1635, 1636, 1634}, - {2: 1722, 1639, 1673, 1640, 7: 1650, 1727, 1666, 1724, 1687, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 1714, 1651, 1660, 1681, 1774, 1775, 1771, 1733, 1780, 1716, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 1719, 1760, 1659, 1658, 1737, 1683, 1700, 1705, 1709, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 1770, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 1706, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 1721, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 1677, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 1638, 1642, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 1834, 1835, 1633, 1840, 1839, 1685, 1842, 1844, 1689, 1753, 1769, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 1855, 1856, 1858, 1852, 1853, 1854, 389: 4134, 1635, 1636, 1634}, - {383: 4132}, - {2: 1722, 1639, 1673, 1640, 7: 1650, 1727, 1666, 1724, 1687, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 1714, 1651, 1660, 1681, 1774, 1775, 1771, 1733, 1780, 1716, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 1719, 1760, 1659, 1658, 1737, 1683, 1700, 1705, 1709, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 1770, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 1706, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 1721, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 1677, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 1638, 1642, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 1834, 1835, 1633, 1840, 1839, 1685, 1842, 1844, 1689, 1753, 1769, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 1855, 1856, 1858, 1852, 1853, 1854, 389: 3839, 1635, 1636, 1634, 733: 4133}, + {2: 1736, 1653, 1687, 1654, 7: 1664, 1741, 1680, 1738, 1701, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 1728, 1665, 1674, 1695, 1859, 1788, 1789, 1785, 1747, 1794, 1837, 1839, 1838, 1730, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 1733, 1774, 1673, 1672, 1751, 1714, 1719, 1723, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 1784, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 1720, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 1735, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 1691, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 1652, 1656, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 1852, 1853, 1647, 1858, 1857, 1699, 1860, 1862, 1703, 1767, 1783, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 1873, 1874, 1876, 1870, 1871, 1872, 393: 1947, 1649, 1650, 1648, 483: 4143}, + {2: 1736, 1653, 1687, 1654, 7: 1664, 1741, 1680, 1738, 1701, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 1728, 1665, 1674, 1695, 1859, 1788, 1789, 1785, 1747, 1794, 1837, 1839, 1838, 1730, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 1733, 1774, 1673, 1672, 1751, 1714, 1719, 1723, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 1784, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 1720, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 1735, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 1691, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 1652, 1656, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 1852, 1853, 1647, 1858, 1857, 1699, 1860, 1862, 1703, 1767, 1783, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 1873, 1874, 1876, 1870, 1871, 1872, 393: 1947, 1649, 1650, 1648, 483: 3614, 535: 4144}, + {1484, 1484, 4: 4146, 4147, 1484, 597: 4145}, + {1510, 1510, 6: 1510}, + {1483, 1483, 6: 1483}, // 2615 - {1500, 1500, 6: 1500}, - {1501, 1501, 6: 1501}, - {1503, 1503, 6: 1503}, - {1504, 1504, 6: 1504}, - {1268, 1268, 6: 1268, 408: 3484, 3483, 571: 4138}, + {2: 1736, 1653, 1687, 1654, 7: 1664, 1741, 1680, 1738, 1701, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 1728, 1665, 1674, 1695, 1859, 1788, 1789, 1785, 1747, 1794, 1837, 1839, 1838, 1730, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 1733, 1774, 1673, 1672, 1751, 1714, 1719, 1723, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 1784, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 1720, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 1735, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 1691, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 1652, 1656, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 1852, 1853, 1647, 1858, 1857, 1699, 1860, 1862, 1703, 1767, 1783, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 1873, 1874, 1876, 1870, 1871, 1872, 393: 1947, 1649, 1650, 1648, 483: 4148}, + {1482, 1482, 6: 1482}, + {2: 1736, 1653, 1687, 1654, 7: 1664, 1741, 1680, 1738, 1701, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 1728, 1665, 1674, 1695, 1859, 1788, 1789, 1785, 1747, 1794, 1837, 1839, 1838, 1730, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 1733, 1774, 1673, 1672, 1751, 1714, 1719, 1723, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 1784, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 1720, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 1735, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 1691, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 1652, 1656, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 1852, 1853, 1647, 1858, 1857, 1699, 1860, 1862, 1703, 1767, 1783, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 1873, 1874, 1876, 1870, 1871, 1872, 393: 1947, 1649, 1650, 1648, 483: 3614, 535: 4150}, + {1484, 1484, 4: 4146, 4147, 1484, 597: 4151}, + {1511, 1511, 6: 1511}, // 2620 - {1505, 1505, 6: 1505}, - {266: 1624, 474: 4140}, - {1506, 1506, 6: 1506}, - {2: 1722, 1639, 1673, 1640, 7: 1650, 1727, 1666, 1724, 1687, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 1714, 1651, 1660, 1681, 1774, 1775, 1771, 1733, 1780, 1716, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 1719, 1760, 1659, 1658, 1737, 1683, 1700, 1705, 1709, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 1770, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 1706, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 1721, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 1677, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 1638, 1642, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 1834, 1835, 1633, 1840, 1839, 1685, 1842, 1844, 1689, 1753, 1769, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 1855, 1856, 1858, 1852, 1853, 1854, 4148, 389: 1928, 1635, 1636, 1634, 479: 3585, 531: 4147}, - {1509, 1509, 6: 1509}, + {1512, 1512, 6: 1512}, + {1513, 1513, 6: 1513}, + {2: 1736, 1653, 1687, 1654, 7: 1664, 1741, 1680, 1738, 1701, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 1728, 1665, 1674, 1695, 1859, 1788, 1789, 1785, 1747, 1794, 1837, 1839, 1838, 1730, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 1733, 1774, 1673, 1672, 1751, 1714, 1719, 1723, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 1784, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 1720, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 1735, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 1691, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 1652, 1656, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 1852, 1853, 1647, 1858, 1857, 1699, 1860, 1862, 1703, 1767, 1783, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 1873, 1874, 1876, 1870, 1871, 1872, 393: 4155, 1649, 1650, 1648}, + {1516, 1516, 6: 1516}, + {2: 1736, 1653, 1687, 1654, 7: 1664, 1741, 1680, 1738, 1701, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 1728, 1665, 1674, 1695, 1859, 1788, 1789, 1785, 1747, 1794, 1837, 1839, 1838, 1730, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 1733, 1774, 1673, 1672, 1751, 1714, 1719, 1723, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 1784, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 1720, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 1735, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 1691, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 1652, 1656, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 1852, 1853, 1647, 1858, 1857, 1699, 1860, 1862, 1703, 1767, 1783, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 1873, 1874, 1876, 1870, 1871, 1872, 393: 1947, 1649, 1650, 1648, 483: 4166}, // 2625 - {1330, 1330, 6: 1330, 55: 4145, 228: 3927, 585: 4144}, - {1508, 1508, 6: 1508}, - {266: 1624, 474: 4146}, - {1507, 1507, 6: 1507}, - {1470, 1470, 4: 4117, 4118, 1470, 594: 4154}, + {387: 4165}, + {2: 1736, 1653, 1687, 1654, 7: 1664, 1741, 1680, 1738, 1701, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 1728, 1665, 1674, 1695, 1859, 1788, 1789, 1785, 1747, 1794, 1837, 1839, 1838, 1730, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 1733, 1774, 1673, 1672, 1751, 1714, 1719, 1723, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 1784, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 1720, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 1735, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 1691, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 1652, 1656, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 1852, 1853, 1647, 1858, 1857, 1699, 1860, 1862, 1703, 1767, 1783, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 1873, 1874, 1876, 1870, 1871, 1872, 393: 4164, 1649, 1650, 1648}, + {2: 1736, 1653, 1687, 1654, 7: 1664, 1741, 1680, 1738, 1701, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 1728, 1665, 1674, 1695, 1859, 1788, 1789, 1785, 1747, 1794, 1837, 1839, 1838, 1730, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 1733, 1774, 1673, 1672, 1751, 1714, 1719, 1723, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 1784, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 1720, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 1735, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 1691, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 1652, 1656, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 1852, 1853, 1647, 1858, 1857, 1699, 1860, 1862, 1703, 1767, 1783, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 1873, 1874, 1876, 1870, 1871, 1872, 393: 4163, 1649, 1650, 1648}, + {387: 4161}, + {2: 1736, 1653, 1687, 1654, 7: 1664, 1741, 1680, 1738, 1701, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 1728, 1665, 1674, 1695, 1859, 1788, 1789, 1785, 1747, 1794, 1837, 1839, 1838, 1730, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 1733, 1774, 1673, 1672, 1751, 1714, 1719, 1723, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 1784, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 1720, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 1735, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 1691, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 1652, 1656, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 1852, 1853, 1647, 1858, 1857, 1699, 1860, 1862, 1703, 1767, 1783, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 1873, 1874, 1876, 1870, 1871, 1872, 393: 3868, 1649, 1650, 1648, 737: 4162}, // 2630 - {2: 1722, 1639, 1673, 1640, 7: 1650, 1727, 1666, 1724, 1687, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 1714, 1651, 1660, 1681, 1774, 1775, 1771, 1733, 1780, 1716, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 1719, 1760, 1659, 1658, 1737, 1683, 1700, 1705, 1709, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 1770, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 1706, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 1721, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 1677, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 1638, 1642, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 1834, 1835, 1633, 1840, 1839, 1685, 1842, 1844, 1689, 1753, 1769, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 1855, 1856, 1858, 1852, 1853, 1854, 389: 1928, 1635, 1636, 1634, 479: 3585, 531: 4150, 766: 4149}, - {6: 4152, 21: 4151}, - {6: 1440, 21: 1440}, - {1510, 1510, 6: 1510}, - {2: 1722, 1639, 1673, 1640, 7: 1650, 1727, 1666, 1724, 1687, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 1714, 1651, 1660, 1681, 1774, 1775, 1771, 1733, 1780, 1716, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 1719, 1760, 1659, 1658, 1737, 1683, 1700, 1705, 1709, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 1770, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 1706, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 1721, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 1677, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 1638, 1642, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 1834, 1835, 1633, 1840, 1839, 1685, 1842, 1844, 1689, 1753, 1769, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 1855, 1856, 1858, 1852, 1853, 1854, 389: 1928, 1635, 1636, 1634, 479: 3585, 531: 4153}, + {1514, 1514, 6: 1514}, + {1515, 1515, 6: 1515}, + {1517, 1517, 6: 1517}, + {1518, 1518, 6: 1518}, + {1282, 1282, 6: 1282, 412: 3513, 3512, 575: 4167}, // 2635 - {6: 1439, 21: 1439}, - {1511, 1511, 6: 1511}, - {7: 2678, 395: 2677, 498: 4156}, - {2: 1722, 1639, 1673, 1640, 7: 1650, 1727, 1666, 1724, 1687, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 1714, 1651, 1660, 1681, 1774, 1775, 1771, 1733, 1780, 1716, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 1719, 1760, 1659, 1658, 1737, 1683, 1700, 1705, 1709, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 1770, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 1706, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 1721, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 1677, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 1638, 1642, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 1834, 1835, 1633, 1840, 1839, 1685, 1842, 1844, 1689, 1753, 1769, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 1855, 1856, 1858, 1852, 1853, 1854, 230: 1889, 299: 1888, 389: 1890, 1635, 1636, 1634, 473: 1887, 522: 4157}, - {125, 125, 6: 125, 261: 3752, 530: 4158}, + {1519, 1519, 6: 1519}, + {270: 1638, 478: 4169}, + {1520, 1520, 6: 1520}, + {2: 1736, 1653, 1687, 1654, 7: 1664, 1741, 1680, 1738, 1701, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 1728, 1665, 1674, 1695, 1859, 1788, 1789, 1785, 1747, 1794, 1837, 1839, 1838, 1730, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 1733, 1774, 1673, 1672, 1751, 1714, 1719, 1723, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 1784, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 1720, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 1735, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 1691, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 1652, 1656, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 1852, 1853, 1647, 1858, 1857, 1699, 1860, 1862, 1703, 1767, 1783, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 1873, 1874, 1876, 1870, 1871, 1872, 4177, 393: 1947, 1649, 1650, 1648, 483: 3614, 535: 4176}, + {1523, 1523, 6: 1523}, // 2640 - {1512, 1512, 6: 1512}, - {2: 1722, 1639, 1673, 1640, 7: 1650, 1727, 1666, 1724, 1687, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 1714, 1651, 1660, 1681, 1774, 1775, 1771, 1733, 1780, 1716, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 1719, 1760, 1659, 1658, 1737, 1683, 1700, 1705, 1709, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 1770, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 1706, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 1721, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 1677, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 1638, 1642, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 1834, 1835, 1633, 1840, 1839, 1685, 1842, 1844, 1689, 1753, 1769, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 1855, 1856, 1858, 1852, 1853, 1854, 389: 2878, 1635, 1636, 1634, 611: 4160}, - {1451, 1451, 6: 2880, 239: 4043, 401: 4162, 547: 4161}, - {1515, 1515}, - {542, 542, 1722, 1639, 1673, 1640, 542, 1650, 1727, 1666, 1724, 1687, 1695, 1725, 1723, 1726, 1736, 1729, 1730, 1732, 1768, 22: 1758, 1698, 1755, 1781, 1701, 1777, 1702, 1714, 1651, 1660, 1681, 1774, 1775, 1771, 1733, 1780, 1716, 1797, 1672, 1720, 1841, 1740, 1819, 1821, 1820, 1676, 1759, 1656, 1665, 1754, 1710, 1796, 1686, 1763, 1688, 1691, 1818, 1719, 1760, 1659, 1658, 1737, 1683, 1700, 1705, 1709, 1746, 1671, 1679, 1680, 1738, 1859, 1749, 1778, 1693, 1694, 1711, 1712, 1805, 1643, 1756, 1806, 1790, 1770, 1652, 1653, 1654, 1828, 1661, 1751, 1662, 1664, 1752, 1674, 1675, 1836, 1837, 1811, 1810, 1761, 1765, 1776, 1690, 1692, 1794, 1791, 1697, 1813, 1699, 1706, 1707, 1637, 1641, 1644, 1646, 1645, 1647, 1807, 1803, 1649, 1721, 1741, 1655, 1657, 1808, 1809, 1663, 1667, 1668, 1795, 1762, 1767, 1677, 1678, 1757, 1734, 1669, 1748, 1838, 1798, 1684, 1682, 1745, 1728, 1785, 1786, 1787, 1788, 1799, 1715, 1731, 1764, 1743, 1772, 1773, 1812, 1779, 1843, 1804, 1792, 1739, 1789, 1822, 1802, 1744, 1782, 1783, 1696, 1816, 1817, 1815, 1814, 1766, 1793, 1800, 1703, 1704, 1857, 1708, 1735, 1742, 1801, 1713, 1823, 1717, 1638, 1642, 1824, 1825, 1826, 1648, 1827, 1829, 1830, 1831, 1832, 1670, 1833, 1834, 1835, 1633, 1840, 1839, 1685, 1842, 1844, 1689, 1753, 1769, 1784, 1718, 1747, 1750, 1848, 1849, 1850, 1851, 1845, 1846, 1847, 1855, 1856, 1858, 1852, 1853, 1854, 239: 542, 384: 2898, 389: 2897, 1635, 1636, 1634, 580: 4163}, + {1344, 1344, 6: 1344, 57: 4174, 232: 3956, 589: 4173}, + {1522, 1522, 6: 1522}, + {270: 1638, 478: 4175}, + {1521, 1521, 6: 1521}, + {1484, 1484, 4: 4146, 4147, 1484, 597: 4183}, // 2645 - {1451, 1451, 6: 2900, 239: 4043, 547: 4164}, - {1514, 1514}, - {223, 223, 3846, 3845, 6: 223, 1344, 3852, 3843, 3848, 3850, 13: 3849, 3847, 3851, 3855, 3853, 3854, 3862, 3857, 53: 4086, 67: 4078, 85: 4076, 91: 4079, 94: 4080, 101: 4081, 238: 3842, 242: 4021, 261: 1344, 323: 4074, 395: 1344, 397: 3859, 3858, 405: 4087, 411: 4077, 413: 4083, 417: 4084, 422: 4075, 4082, 525: 3844, 550: 3856, 554: 3861, 608: 4085, 618: 4089, 625: 4073, 4166}, - {1466, 1466, 6: 1466}, - {1261, 1261, 56: 1539, 67: 1613, 69: 1540, 76: 1544, 80: 1555, 1524, 1526, 86: 1527, 90: 1542, 92: 1529, 96: 1557, 105: 1543, 108: 1525, 112: 1532, 228: 1550, 242: 1620, 257: 1554, 267: 1538, 273: 1535, 314: 1537, 394: 1546, 407: 1615, 411: 1531, 413: 1521, 1523, 417: 1522, 448: 1605, 481: 1553, 1547, 1548, 1549, 488: 1552, 490: 1551, 1600, 494: 1614, 502: 1530, 504: 1545, 532: 1567, 535: 1589, 1596, 540: 1608, 543: 1528, 546: 1616, 552: 1556, 624: 1559, 627: 1560, 1561, 1562, 1563, 1564, 637: 1565, 1576, 1570, 1571, 1575, 1572, 1574, 1573, 648: 1566, 1541, 1534, 1577, 1585, 1578, 1579, 1583, 1584, 1580, 1582, 1581, 1558, 1568, 1533, 1569, 1536, 668: 1586, 673: 1588, 1587, 682: 1622, 1621, 1590, 686: 1618, 1591, 1592, 1611, 709: 1593, 715: 1595, 1617, 1598, 1597, 720: 1594, 1599, 723: 1603, 1602, 1601, 1604, 729: 4168, 742: 1606, 1607, 1619, 1610, 1609}, + {2: 1736, 1653, 1687, 1654, 7: 1664, 1741, 1680, 1738, 1701, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 1728, 1665, 1674, 1695, 1859, 1788, 1789, 1785, 1747, 1794, 1837, 1839, 1838, 1730, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 1733, 1774, 1673, 1672, 1751, 1714, 1719, 1723, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 1784, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 1720, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 1735, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 1691, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 1652, 1656, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 1852, 1853, 1647, 1858, 1857, 1699, 1860, 1862, 1703, 1767, 1783, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 1873, 1874, 1876, 1870, 1871, 1872, 393: 1947, 1649, 1650, 1648, 483: 3614, 535: 4179, 770: 4178}, + {6: 4181, 21: 4180}, + {6: 1454, 21: 1454}, + {1524, 1524, 6: 1524}, + {2: 1736, 1653, 1687, 1654, 7: 1664, 1741, 1680, 1738, 1701, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 1728, 1665, 1674, 1695, 1859, 1788, 1789, 1785, 1747, 1794, 1837, 1839, 1838, 1730, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 1733, 1774, 1673, 1672, 1751, 1714, 1719, 1723, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 1784, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 1720, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 1735, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 1691, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 1652, 1656, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 1852, 1853, 1647, 1858, 1857, 1699, 1860, 1862, 1703, 1767, 1783, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 1873, 1874, 1876, 1870, 1871, 1872, 393: 1947, 1649, 1650, 1648, 483: 3614, 535: 4182}, // 2650 - {253, 253}, + {6: 1453, 21: 1453}, + {1525, 1525, 6: 1525}, + {7: 2699, 399: 2698, 502: 4185}, + {2: 1736, 1653, 1687, 1654, 7: 1664, 1741, 1680, 1738, 1701, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 1728, 1665, 1674, 1695, 1859, 1788, 1789, 1785, 1747, 1794, 1837, 1839, 1838, 1730, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 1733, 1774, 1673, 1672, 1751, 1714, 1719, 1723, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 1784, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 1720, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 1735, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 1691, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 1652, 1656, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 1852, 1853, 1647, 1858, 1857, 1699, 1860, 1862, 1703, 1767, 1783, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 1873, 1874, 1876, 1870, 1871, 1872, 234: 1908, 303: 1907, 393: 1909, 1649, 1650, 1648, 477: 1906, 527: 4186}, + {126, 126, 6: 126, 264: 3781, 534: 4187}, + // 2655 + {1526, 1526, 6: 1526}, + {2: 1736, 1653, 1687, 1654, 7: 1664, 1741, 1680, 1738, 1701, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 1728, 1665, 1674, 1695, 1859, 1788, 1789, 1785, 1747, 1794, 1837, 1839, 1838, 1730, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 1733, 1774, 1673, 1672, 1751, 1714, 1719, 1723, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 1784, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 1720, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 1735, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 1691, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 1652, 1656, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 1852, 1853, 1647, 1858, 1857, 1699, 1860, 1862, 1703, 1767, 1783, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 1873, 1874, 1876, 1870, 1871, 1872, 393: 2892, 1649, 1650, 1648, 614: 4189}, + {1465, 1465, 6: 2894, 243: 4072, 405: 4191, 551: 4190}, + {1529, 1529}, + {551, 551, 1736, 1653, 1687, 1654, 551, 1664, 1741, 1680, 1738, 1701, 1709, 1739, 1737, 1740, 1750, 1743, 1744, 1746, 1782, 22: 1772, 1712, 1769, 1795, 1715, 1791, 1742, 1716, 1728, 1665, 1674, 1695, 1859, 1788, 1789, 1785, 1747, 1794, 1837, 1839, 1838, 1730, 1811, 1686, 1734, 1754, 1690, 1773, 1670, 1679, 1768, 1724, 1810, 1697, 1700, 1777, 1702, 1705, 1836, 1733, 1774, 1673, 1672, 1751, 1714, 1719, 1723, 1760, 1685, 1693, 1694, 1752, 1877, 1763, 1792, 1707, 1708, 1725, 1726, 1823, 1657, 1770, 1824, 1804, 1784, 1666, 1667, 1668, 1846, 1675, 1765, 1676, 1678, 1766, 1688, 1689, 1854, 1855, 1829, 1828, 1822, 1775, 1820, 1779, 1790, 1704, 1706, 1808, 1796, 1821, 1805, 1711, 1831, 1713, 1720, 1721, 1651, 1655, 1658, 1660, 1659, 1661, 1825, 1817, 1663, 1735, 1755, 1669, 1671, 1826, 1827, 1677, 1681, 1682, 1809, 1776, 1781, 1691, 1692, 1771, 1748, 1683, 1762, 1856, 1812, 1698, 1696, 1759, 1799, 1800, 1801, 1802, 1813, 1729, 1745, 1778, 1757, 1786, 1787, 1830, 1793, 1861, 1818, 1806, 1753, 1803, 1840, 1819, 1816, 1758, 1797, 1710, 1834, 1835, 1833, 1832, 1780, 1807, 1814, 1717, 1718, 1875, 1722, 1749, 1756, 1815, 1727, 1841, 1731, 1652, 1656, 1842, 1843, 1844, 1662, 1845, 1847, 1848, 1849, 1850, 1684, 1851, 1852, 1853, 1647, 1858, 1857, 1699, 1860, 1862, 1703, 1767, 1783, 1798, 1732, 1761, 1764, 1866, 1867, 1868, 1869, 1863, 1864, 1865, 1873, 1874, 1876, 1870, 1871, 1872, 243: 551, 388: 2912, 393: 2911, 1649, 1650, 1648, 584: 4192}, + // 2660 + {1465, 1465, 6: 2914, 243: 4072, 551: 4193}, + {1528, 1528}, + {224, 224, 3875, 3874, 6: 224, 1358, 3881, 3872, 3877, 3879, 13: 3878, 3876, 3880, 3884, 3882, 3883, 3891, 3886, 54: 4115, 68: 4107, 86: 4105, 92: 4108, 95: 4109, 103: 4110, 242: 3871, 246: 4050, 264: 1358, 327: 4103, 399: 1358, 401: 3888, 3887, 409: 4116, 415: 4106, 417: 4112, 421: 4113, 426: 4104, 4111, 530: 3873, 554: 3885, 558: 3890, 611: 4114, 622: 4118, 629: 4102, 4195}, + {1480, 1480, 6: 1480}, + {1275, 1275, 58: 1553, 68: 1627, 70: 1554, 77: 1558, 81: 1569, 1538, 1540, 87: 1541, 91: 1556, 93: 1543, 97: 1571, 108: 1557, 113: 1539, 117: 1546, 232: 1564, 246: 1634, 262: 1568, 272: 1552, 277: 1549, 318: 1551, 398: 1560, 411: 1629, 415: 1545, 417: 1535, 1537, 421: 1536, 452: 1619, 485: 1567, 1561, 1562, 1563, 492: 1566, 494: 1565, 1614, 498: 1628, 506: 1544, 508: 1559, 536: 1581, 539: 1603, 1610, 544: 1622, 547: 1542, 550: 1630, 556: 1570, 628: 1573, 631: 1574, 1575, 1576, 1577, 1578, 641: 1579, 1590, 1584, 1585, 1589, 1586, 1588, 1587, 652: 1580, 1555, 1548, 1591, 1599, 1592, 1593, 1597, 1598, 1594, 1596, 1595, 1572, 1582, 1547, 1583, 1550, 672: 1600, 677: 1602, 1601, 686: 1636, 1635, 1604, 690: 1632, 1605, 1606, 1625, 713: 1607, 719: 1609, 1631, 1612, 1611, 724: 1608, 1613, 727: 1617, 1616, 1615, 1618, 733: 4197, 746: 1620, 1621, 1633, 1624, 1623}, + // 2665 + {254, 254}, } ) @@ -7149,7 +7198,7 @@ func yylex1(yylex yyLexer, lval *yySymType) (n int) { } func yyParse(yylex yyLexer, parser *Parser) int { - const yyError = 786 + const yyError = 790 yyEx, _ := yylex.(yyLexerEx) var yyn int @@ -7846,8 +7895,7 @@ yynewstate: } case 112: { - nowFunc := &ast.FuncCallExpr{FnName: model.NewCIStr("CURRENT_TIMESTAMP")} - parser.yyVAL.item = &ast.ColumnOption{Tp: ast.ColumnOptionOnUpdate, Expr: nowFunc} + parser.yyVAL.item = &ast.ColumnOption{Tp: ast.ColumnOptionOnUpdate, Expr: yyS[yypt-0].expr} } case 113: { @@ -8911,7 +8959,7 @@ yynewstate: } case 343: { - parser.yyVAL.item = &ast.GroupByClause{Items: yyS[yypt-0].item.([]*ast.ByItem)} + parser.yyVAL.item = &ast.GroupByClause{Items: yyS[yypt-1].item.([]*ast.ByItem), WithRollup: yyS[yypt-0].item.(bool)} } case 344: { @@ -8947,18 +8995,26 @@ yynewstate: } case 352: { - parser.yyVAL.item = "" + parser.yyVAL.item = false } case 353: + { + parser.yyVAL.item = true + } + case 354: + { + parser.yyVAL.item = "" + } + case 355: { //"index name" parser.yyVAL.item = yyS[yypt-0].ident } - case 354: + case 356: { parser.yyVAL.item = nil } - case 355: + case 357: { // Merge the options if yyS[yypt-1].item == nil { @@ -8976,41 +9032,41 @@ yynewstate: parser.yyVAL.item = opt1 } } - case 356: + case 358: { parser.yyVAL.item = &ast.IndexOption{ KeyBlockSize: yyS[yypt-0].item.(uint64), } } - case 357: + case 359: { parser.yyVAL.item = &ast.IndexOption{ Tp: yyS[yypt-0].item.(model.IndexType), } } - case 358: + case 360: { parser.yyVAL.item = &ast.IndexOption{ Comment: yyS[yypt-0].ident, } } - case 359: + case 361: { parser.yyVAL.item = model.IndexTypeBtree } - case 360: + case 362: { parser.yyVAL.item = model.IndexTypeHash } - case 361: + case 363: { parser.yyVAL.item = nil } - case 362: + case 364: { parser.yyVAL.item = yyS[yypt-0].item } - case 590: + case 596: { x := yyS[yypt-1].item.(*ast.InsertStmt) x.Priority = yyS[yypt-5].item.(mysql.PriorityEnum) @@ -9023,101 +9079,101 @@ yynewstate: } parser.yyVAL.statement = x } - case 593: + case 599: { parser.yyVAL.item = &ast.InsertStmt{ Columns: yyS[yypt-3].item.([]*ast.ColumnName), Lists: yyS[yypt-0].item.([][]ast.ExprNode), } } - case 594: + case 600: { parser.yyVAL.item = &ast.InsertStmt{Columns: yyS[yypt-2].item.([]*ast.ColumnName), Select: yyS[yypt-0].statement.(*ast.SelectStmt)} } - case 595: + case 601: { parser.yyVAL.item = &ast.InsertStmt{Columns: yyS[yypt-4].item.([]*ast.ColumnName), Select: yyS[yypt-1].statement.(*ast.SelectStmt)} } - case 596: + case 602: { parser.yyVAL.item = &ast.InsertStmt{Columns: yyS[yypt-2].item.([]*ast.ColumnName), Select: yyS[yypt-0].statement.(*ast.UnionStmt)} } - case 597: + case 603: { parser.yyVAL.item = &ast.InsertStmt{Lists: yyS[yypt-0].item.([][]ast.ExprNode)} } - case 598: + case 604: { parser.yyVAL.item = &ast.InsertStmt{Select: yyS[yypt-1].statement.(*ast.SelectStmt)} } - case 599: + case 605: { parser.yyVAL.item = &ast.InsertStmt{Select: yyS[yypt-0].statement.(*ast.SelectStmt)} } - case 600: + case 606: { parser.yyVAL.item = &ast.InsertStmt{Select: yyS[yypt-0].statement.(*ast.UnionStmt)} } - case 601: + case 607: { parser.yyVAL.item = &ast.InsertStmt{Setlist: yyS[yypt-0].item.([]*ast.Assignment)} } - case 604: + case 610: { parser.yyVAL.item = [][]ast.ExprNode{yyS[yypt-0].item.([]ast.ExprNode)} } - case 605: + case 611: { parser.yyVAL.item = append(yyS[yypt-2].item.([][]ast.ExprNode), yyS[yypt-0].item.([]ast.ExprNode)) } - case 606: + case 612: { parser.yyVAL.item = yyS[yypt-1].item } - case 607: + case 613: { parser.yyVAL.item = []ast.ExprNode{} } - case 609: + case 615: { parser.yyVAL.item = append(yyS[yypt-2].item.([]ast.ExprNode), yyS[yypt-0].expr) } - case 610: + case 616: { parser.yyVAL.item = []ast.ExprNode{yyS[yypt-0].expr} } - case 612: + case 618: { parser.yyVAL.expr = &ast.DefaultExpr{} } - case 613: + case 619: { parser.yyVAL.item = &ast.Assignment{ Column: yyS[yypt-2].item.(*ast.ColumnName), Expr: yyS[yypt-0].expr, } } - case 614: + case 620: { parser.yyVAL.item = []*ast.Assignment{} } - case 615: + case 621: { parser.yyVAL.item = []*ast.Assignment{yyS[yypt-0].item.(*ast.Assignment)} } - case 616: + case 622: { parser.yyVAL.item = append(yyS[yypt-2].item.([]*ast.Assignment), yyS[yypt-0].item.(*ast.Assignment)) } - case 617: + case 623: { parser.yyVAL.item = nil } - case 618: + case 624: { parser.yyVAL.item = yyS[yypt-0].item } - case 619: + case 625: { x := yyS[yypt-0].item.(*ast.InsertStmt) x.IsReplace = true @@ -9126,47 +9182,47 @@ yynewstate: x.Table = &ast.TableRefsClause{TableRefs: &ast.Join{Left: ts}} parser.yyVAL.statement = x } - case 620: + case 626: { parser.yyVAL.ident = ast.DateLiteral } - case 621: + case 627: { parser.yyVAL.ident = ast.TimeLiteral } - case 622: + case 628: { parser.yyVAL.ident = ast.TimestampLiteral } - case 623: + case 629: { parser.yyVAL.expr = ast.NewValueExpr(false) } - case 624: + case 630: { parser.yyVAL.expr = ast.NewValueExpr(nil) } - case 625: + case 631: { parser.yyVAL.expr = ast.NewValueExpr(true) } - case 626: + case 632: { parser.yyVAL.expr = ast.NewValueExpr(yyS[yypt-0].item) } - case 627: + case 633: { parser.yyVAL.expr = ast.NewValueExpr(yyS[yypt-0].item) } - case 628: + case 634: { parser.yyVAL.expr = ast.NewValueExpr(yyS[yypt-0].item) } - case 629: + case 635: { parser.yyVAL.expr = yyS[yypt-0].expr } - case 630: + case 636: { // See https://dev.mysql.com/doc/refman/5.7/en/charset-literal.html co, err := mysql.GetDefaultCollation(yyS[yypt-1].ident) @@ -9183,20 +9239,20 @@ yynewstate: } parser.yyVAL.expr = expr } - case 631: + case 637: { parser.yyVAL.expr = ast.NewValueExpr(yyS[yypt-0].item) } - case 632: + case 638: { parser.yyVAL.expr = ast.NewValueExpr(yyS[yypt-0].item) } - case 633: + case 639: { expr := ast.NewValueExpr(yyS[yypt-0].ident) parser.yyVAL.expr = expr } - case 634: + case 640: { valExpr := yyS[yypt-1].expr.(ast.ValueExpr) strLit := valExpr.GetString() @@ -9209,19 +9265,19 @@ yynewstate: } parser.yyVAL.expr = expr } - case 635: + case 641: { parser.yyVAL.item = &ast.OrderByClause{Items: yyS[yypt-0].item.([]*ast.ByItem)} } - case 636: + case 642: { parser.yyVAL.item = []*ast.ByItem{yyS[yypt-0].item.(*ast.ByItem)} } - case 637: + case 643: { parser.yyVAL.item = append(yyS[yypt-2].item.([]*ast.ByItem), yyS[yypt-0].item.(*ast.ByItem)) } - case 638: + case 644: { expr := yyS[yypt-1].expr valueExpr, ok := expr.(ast.ValueExpr) @@ -9233,51 +9289,51 @@ yynewstate: } parser.yyVAL.item = &ast.ByItem{Expr: expr, Desc: yyS[yypt-0].item.(bool)} } - case 639: + case 645: { parser.yyVAL.item = false // ASC by default } - case 640: + case 646: { parser.yyVAL.item = false } - case 641: + case 647: { parser.yyVAL.item = true } - case 642: + case 648: { parser.yyVAL.item = nil } - case 643: + case 649: { parser.yyVAL.item = yyS[yypt-0].item } - case 644: + case 650: { parser.yyVAL.expr = &ast.BinaryOperationExpr{Op: opcode.Or, L: yyS[yypt-2].expr, R: yyS[yypt-0].expr} } - case 645: + case 651: { parser.yyVAL.expr = &ast.BinaryOperationExpr{Op: opcode.And, L: yyS[yypt-2].expr, R: yyS[yypt-0].expr} } - case 646: + case 652: { parser.yyVAL.expr = &ast.BinaryOperationExpr{Op: opcode.LeftShift, L: yyS[yypt-2].expr, R: yyS[yypt-0].expr} } - case 647: + case 653: { parser.yyVAL.expr = &ast.BinaryOperationExpr{Op: opcode.RightShift, L: yyS[yypt-2].expr, R: yyS[yypt-0].expr} } - case 648: + case 654: { parser.yyVAL.expr = &ast.BinaryOperationExpr{Op: opcode.Plus, L: yyS[yypt-2].expr, R: yyS[yypt-0].expr} } - case 649: + case 655: { parser.yyVAL.expr = &ast.BinaryOperationExpr{Op: opcode.Minus, L: yyS[yypt-2].expr, R: yyS[yypt-0].expr} } - case 650: + case 656: { parser.yyVAL.expr = &ast.FuncCallExpr{ FnName: model.NewCIStr("DATE_ADD"), @@ -9288,7 +9344,7 @@ yynewstate: }, } } - case 651: + case 657: { parser.yyVAL.expr = &ast.FuncCallExpr{ FnName: model.NewCIStr("DATE_SUB"), @@ -9299,51 +9355,51 @@ yynewstate: }, } } - case 652: + case 658: { parser.yyVAL.expr = &ast.BinaryOperationExpr{Op: opcode.Mul, L: yyS[yypt-2].expr, R: yyS[yypt-0].expr} } - case 653: + case 659: { parser.yyVAL.expr = &ast.BinaryOperationExpr{Op: opcode.Div, L: yyS[yypt-2].expr, R: yyS[yypt-0].expr} } - case 654: + case 660: { parser.yyVAL.expr = &ast.BinaryOperationExpr{Op: opcode.Mod, L: yyS[yypt-2].expr, R: yyS[yypt-0].expr} } - case 655: + case 661: { parser.yyVAL.expr = &ast.BinaryOperationExpr{Op: opcode.IntDiv, L: yyS[yypt-2].expr, R: yyS[yypt-0].expr} } - case 656: + case 662: { parser.yyVAL.expr = &ast.BinaryOperationExpr{Op: opcode.Mod, L: yyS[yypt-2].expr, R: yyS[yypt-0].expr} } - case 657: + case 663: { parser.yyVAL.expr = &ast.BinaryOperationExpr{Op: opcode.Xor, L: yyS[yypt-2].expr, R: yyS[yypt-0].expr} } - case 659: + case 665: { parser.yyVAL.expr = &ast.ColumnNameExpr{Name: &ast.ColumnName{ Name: model.NewCIStr(yyS[yypt-0].ident), }} } - case 660: + case 666: { parser.yyVAL.expr = &ast.ColumnNameExpr{Name: &ast.ColumnName{ Table: model.NewCIStr(yyS[yypt-2].ident), Name: model.NewCIStr(yyS[yypt-0].ident), }} } - case 661: + case 667: { parser.yyVAL.expr = &ast.ColumnNameExpr{Name: &ast.ColumnName{ Table: model.NewCIStr(yyS[yypt-2].ident), Name: model.NewCIStr(yyS[yypt-0].ident), }} } - case 662: + case 668: { parser.yyVAL.expr = &ast.ColumnNameExpr{Name: &ast.ColumnName{ Schema: model.NewCIStr(yyS[yypt-4].ident), @@ -9351,44 +9407,44 @@ yynewstate: Name: model.NewCIStr(yyS[yypt-0].ident), }} } - case 667: + case 673: { // TODO: Create a builtin function hold expr and collation. When do evaluation, convert expr result using the collation. parser.yyVAL.expr = yyS[yypt-2].expr } - case 668: + case 674: { parser.yyVAL.expr = yyS[yypt-0].item.(*ast.WindowFuncExpr) } - case 670: + case 676: { parser.yyVAL.expr = ast.NewParamMarkerExpr(yyS[yypt].offset) } - case 673: + case 679: { parser.yyVAL.expr = &ast.UnaryOperationExpr{Op: opcode.Not, V: yyS[yypt-0].expr} } - case 674: + case 680: { parser.yyVAL.expr = &ast.UnaryOperationExpr{Op: opcode.BitNeg, V: yyS[yypt-0].expr} } - case 675: + case 681: { parser.yyVAL.expr = &ast.UnaryOperationExpr{Op: opcode.Minus, V: yyS[yypt-0].expr} } - case 676: + case 682: { parser.yyVAL.expr = &ast.UnaryOperationExpr{Op: opcode.Plus, V: yyS[yypt-0].expr} } - case 677: + case 683: { parser.yyVAL.expr = &ast.FuncCallExpr{FnName: model.NewCIStr(ast.Concat), Args: []ast.ExprNode{yyS[yypt-2].expr, yyS[yypt-0].expr}} } - case 678: + case 684: { parser.yyVAL.expr = &ast.UnaryOperationExpr{Op: opcode.Not, V: yyS[yypt-0].expr} } - case 680: + case 686: { startOffset := parser.startOffset(&yyS[yypt-1]) endOffset := parser.endOffset(&yyS[yypt]) @@ -9396,23 +9452,23 @@ yynewstate: expr.SetText(parser.src[startOffset:endOffset]) parser.yyVAL.expr = &ast.ParenthesesExpr{Expr: expr} } - case 681: + case 687: { values := append(yyS[yypt-3].item.([]ast.ExprNode), yyS[yypt-1].expr) parser.yyVAL.expr = &ast.RowExpr{Values: values} } - case 682: + case 688: { values := append(yyS[yypt-3].item.([]ast.ExprNode), yyS[yypt-1].expr) parser.yyVAL.expr = &ast.RowExpr{Values: values} } - case 683: + case 689: { sq := yyS[yypt-0].expr.(*ast.SubqueryExpr) sq.Exists = true parser.yyVAL.expr = &ast.ExistsSubqueryExpr{Sel: sq} } - case 684: + case 690: { // See https://dev.mysql.com/doc/refman/5.7/en/cast-functions.html#operator_binary x := types.NewFieldType(mysql.TypeString) @@ -9424,7 +9480,7 @@ yynewstate: FunctionType: ast.CastBinaryOperator, } } - case 685: + case 691: { /* See https://dev.mysql.com/doc/refman/5.7/en/cast-functions.html#function_cast */ tp := yyS[yypt-1].item.(*types.FieldType) @@ -9441,7 +9497,7 @@ yynewstate: FunctionType: ast.CastFunction, } } - case 686: + case 692: { x := &ast.CaseExpr{WhenClauses: yyS[yypt-2].item.([]*ast.WhenClause)} if yyS[yypt-3].expr != nil { @@ -9452,7 +9508,7 @@ yynewstate: } parser.yyVAL.expr = x } - case 687: + case 693: { // See https://dev.mysql.com/doc/refman/5.7/en/cast-functions.html#function_convert tp := yyS[yypt-1].item.(*types.FieldType) @@ -9469,7 +9525,7 @@ yynewstate: FunctionType: ast.CastConvertFunction, } } - case 688: + case 694: { // See https://dev.mysql.com/doc/refman/5.7/en/cast-functions.html#function_convert charset1 := ast.NewValueExpr(yyS[yypt-1].item) @@ -9478,62 +9534,62 @@ yynewstate: Args: []ast.ExprNode{yyS[yypt-3].expr, charset1}, } } - case 689: + case 695: { parser.yyVAL.expr = &ast.DefaultExpr{Name: yyS[yypt-1].expr.(*ast.ColumnNameExpr).Name} } - case 690: + case 696: { parser.yyVAL.expr = &ast.ValuesExpr{Column: yyS[yypt-1].expr.(*ast.ColumnNameExpr)} } - case 691: + case 697: { expr := ast.NewValueExpr(yyS[yypt-0].ident) parser.yyVAL.expr = &ast.FuncCallExpr{FnName: model.NewCIStr(ast.JSONExtract), Args: []ast.ExprNode{yyS[yypt-2].expr, expr}} } - case 692: + case 698: { expr := ast.NewValueExpr(yyS[yypt-0].ident) 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 695: + case 701: { parser.yyVAL.item = false } - case 696: + case 702: { parser.yyVAL.item = true } - case 697: + case 703: { parser.yyVAL.item = false } - case 699: + case 705: { parser.yyVAL.item = true } - case 702: + case 708: { parser.yyVAL.item = true } - case 743: + case 749: { parser.yyVAL.expr = &ast.FuncCallExpr{FnName: model.NewCIStr(yyS[yypt-3].ident), Args: yyS[yypt-1].item.([]ast.ExprNode)} } - case 744: + case 750: { parser.yyVAL.expr = &ast.FuncCallExpr{FnName: model.NewCIStr(yyS[yypt-3].ident), Args: yyS[yypt-1].item.([]ast.ExprNode)} } - case 745: + case 751: { parser.yyVAL.expr = &ast.FuncCallExpr{FnName: model.NewCIStr(yyS[yypt-1].ident)} } - case 746: + case 752: { parser.yyVAL.expr = &ast.FuncCallExpr{FnName: model.NewCIStr(yyS[yypt-2].ident)} } - case 747: + case 753: { args := []ast.ExprNode{} if yyS[yypt-0].item != nil { @@ -9541,67 +9597,67 @@ yynewstate: } parser.yyVAL.expr = &ast.FuncCallExpr{FnName: model.NewCIStr(yyS[yypt-1].ident), Args: args} } - case 748: + case 754: { - nilVal := ast.NewValueExpr(nil) args := yyS[yypt-1].item.([]ast.ExprNode) parser.yyVAL.expr = &ast.FuncCallExpr{ - FnName: model.NewCIStr(ast.CharFunc), - Args: append(args, nilVal), + FnName: model.NewCIStr(yyS[yypt-3].ident), + Args: append(args), } } - case 749: + case 755: { + using := ast.NewValueExpr("USING") charset1 := ast.NewValueExpr(yyS[yypt-1].item) args := yyS[yypt-3].item.([]ast.ExprNode) parser.yyVAL.expr = &ast.FuncCallExpr{ - FnName: model.NewCIStr(ast.CharFunc), - Args: append(args, charset1), + FnName: model.NewCIStr(yyS[yypt-5].ident), + Args: append(args, using, charset1), } } - case 750: + case 756: { expr := ast.NewValueExpr(yyS[yypt-0].ident) parser.yyVAL.expr = &ast.FuncCallExpr{FnName: model.NewCIStr(ast.DateLiteral), Args: []ast.ExprNode{expr}} } - case 751: + case 757: { expr := ast.NewValueExpr(yyS[yypt-0].ident) parser.yyVAL.expr = &ast.FuncCallExpr{FnName: model.NewCIStr(ast.TimeLiteral), Args: []ast.ExprNode{expr}} } - case 752: + case 758: { expr := ast.NewValueExpr(yyS[yypt-0].ident) parser.yyVAL.expr = &ast.FuncCallExpr{FnName: model.NewCIStr(ast.TimestampLiteral), Args: []ast.ExprNode{expr}} } - case 753: + case 759: { parser.yyVAL.expr = &ast.FuncCallExpr{FnName: model.NewCIStr(ast.InsertFunc), Args: yyS[yypt-1].item.([]ast.ExprNode)} } - case 754: + case 760: { parser.yyVAL.expr = &ast.BinaryOperationExpr{Op: opcode.Mod, L: yyS[yypt-3].expr, R: yyS[yypt-1].expr} } - case 755: + case 761: { - parser.yyVAL.expr = &ast.FuncCallExpr{FnName: model.NewCIStr(ast.PasswordFunc), Args: yyS[yypt-1].item.([]ast.ExprNode)} + parser.yyVAL.expr = &ast.FuncCallExpr{FnName: model.NewCIStr(yyS[yypt-3].ident), Args: yyS[yypt-1].item.([]ast.ExprNode)} } - case 756: + case 762: { // This is ODBC syntax for date and time literals. // See: https://dev.mysql.com/doc/refman/5.7/en/date-and-time-literals.html expr := ast.NewValueExpr(yyS[yypt-1].ident) parser.yyVAL.expr = &ast.FuncCallExpr{FnName: model.NewCIStr(yyS[yypt-2].ident), Args: []ast.ExprNode{expr}} } - case 757: + case 763: { parser.yyVAL.expr = &ast.FuncCallExpr{FnName: model.NewCIStr(yyS[yypt-3].ident), Args: yyS[yypt-1].item.([]ast.ExprNode)} } - case 758: + case 764: { parser.yyVAL.expr = &ast.FuncCallExpr{FnName: model.NewCIStr(yyS[yypt-3].ident), Args: yyS[yypt-1].item.([]ast.ExprNode)} } - case 759: + case 765: { parser.yyVAL.expr = &ast.FuncCallExpr{ FnName: model.NewCIStr(yyS[yypt-5].ident), @@ -9612,7 +9668,7 @@ yynewstate: }, } } - case 760: + case 766: { parser.yyVAL.expr = &ast.FuncCallExpr{ FnName: model.NewCIStr(yyS[yypt-7].ident), @@ -9623,7 +9679,7 @@ yynewstate: }, } } - case 761: + case 767: { parser.yyVAL.expr = &ast.FuncCallExpr{ FnName: model.NewCIStr(yyS[yypt-7].ident), @@ -9634,7 +9690,7 @@ yynewstate: }, } } - case 762: + case 768: { timeUnit := ast.NewValueExpr(yyS[yypt-3].ident) parser.yyVAL.expr = &ast.FuncCallExpr{ @@ -9642,74 +9698,74 @@ yynewstate: Args: []ast.ExprNode{timeUnit, yyS[yypt-1].expr}, } } - case 763: + case 769: { parser.yyVAL.expr = &ast.FuncCallExpr{ FnName: model.NewCIStr(yyS[yypt-5].ident), Args: []ast.ExprNode{ast.NewValueExpr(yyS[yypt-3].ident), yyS[yypt-1].expr}, } } - case 764: + case 770: { parser.yyVAL.expr = &ast.FuncCallExpr{FnName: model.NewCIStr(yyS[yypt-5].ident), Args: []ast.ExprNode{yyS[yypt-3].expr, yyS[yypt-1].expr}} } - case 765: + case 771: { parser.yyVAL.expr = &ast.FuncCallExpr{ FnName: model.NewCIStr(yyS[yypt-5].ident), Args: []ast.ExprNode{yyS[yypt-3].expr, yyS[yypt-1].expr}, } } - case 766: + case 772: { parser.yyVAL.expr = &ast.FuncCallExpr{ FnName: model.NewCIStr(yyS[yypt-5].ident), Args: []ast.ExprNode{yyS[yypt-3].expr, yyS[yypt-1].expr}, } } - case 767: + case 773: { 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 768: + case 774: { 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 769: + case 775: { parser.yyVAL.expr = &ast.FuncCallExpr{ FnName: model.NewCIStr(yyS[yypt-7].ident), Args: []ast.ExprNode{ast.NewValueExpr(yyS[yypt-5].ident), yyS[yypt-3].expr, yyS[yypt-1].expr}, } } - case 770: + case 776: { parser.yyVAL.expr = &ast.FuncCallExpr{ FnName: model.NewCIStr(yyS[yypt-7].ident), Args: []ast.ExprNode{ast.NewValueExpr(yyS[yypt-5].ident), yyS[yypt-3].expr, yyS[yypt-1].expr}, } } - case 771: + case 777: { parser.yyVAL.expr = &ast.FuncCallExpr{ FnName: model.NewCIStr(yyS[yypt-3].ident), Args: []ast.ExprNode{yyS[yypt-1].expr}, } } - case 772: + case 778: { parser.yyVAL.expr = &ast.FuncCallExpr{ FnName: model.NewCIStr(yyS[yypt-5].ident), Args: []ast.ExprNode{yyS[yypt-1].expr, yyS[yypt-3].expr}, } } - case 773: + case 779: { nilVal := ast.NewValueExpr(nil) direction := ast.NewValueExpr(int(yyS[yypt-3].item.(ast.TrimDirectionType))) @@ -9718,7 +9774,7 @@ yynewstate: Args: []ast.ExprNode{yyS[yypt-1].expr, nilVal, direction}, } } - case 774: + case 780: { direction := ast.NewValueExpr(int(yyS[yypt-4].item.(ast.TrimDirectionType))) parser.yyVAL.expr = &ast.FuncCallExpr{ @@ -9726,35 +9782,35 @@ yynewstate: Args: []ast.ExprNode{yyS[yypt-1].expr, yyS[yypt-3].expr, direction}, } } - case 775: + case 781: { parser.yyVAL.ident = strings.ToUpper(yyS[yypt-0].ident) } - case 776: + case 782: { parser.yyVAL.ident = strings.ToUpper(yyS[yypt-0].ident) } - case 777: + case 783: { parser.yyVAL.ident = strings.ToUpper(yyS[yypt-0].ident) } - case 778: + case 784: { parser.yyVAL.ident = strings.ToUpper(yyS[yypt-0].ident) } - case 783: + case 789: { parser.yyVAL.item = ast.TrimBoth } - case 784: + case 790: { parser.yyVAL.item = ast.TrimLeading } - case 785: + case 791: { parser.yyVAL.item = ast.TrimTrailing } - case 786: + case 792: { 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))} @@ -9762,7 +9818,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 787: + case 793: { 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))} @@ -9770,7 +9826,7 @@ yynewstate: parser.yyVAL.expr = &ast.AggregateFuncExpr{F: yyS[yypt-4].ident, Args: []ast.ExprNode{yyS[yypt-2].expr}} } } - case 788: + case 794: { 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))} @@ -9778,7 +9834,7 @@ yynewstate: parser.yyVAL.expr = &ast.AggregateFuncExpr{F: yyS[yypt-5].ident, Args: []ast.ExprNode{yyS[yypt-2].expr}} } } - case 789: + case 795: { 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))} @@ -9786,7 +9842,7 @@ yynewstate: parser.yyVAL.expr = &ast.AggregateFuncExpr{F: yyS[yypt-4].ident, Args: []ast.ExprNode{yyS[yypt-2].expr}} } } - case 790: + case 796: { 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))} @@ -9794,7 +9850,7 @@ yynewstate: parser.yyVAL.expr = &ast.AggregateFuncExpr{F: yyS[yypt-5].ident, Args: []ast.ExprNode{yyS[yypt-2].expr}} } } - case 791: + case 797: { 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))} @@ -9802,7 +9858,7 @@ yynewstate: parser.yyVAL.expr = &ast.AggregateFuncExpr{F: yyS[yypt-4].ident, Args: []ast.ExprNode{yyS[yypt-2].expr}} } } - case 792: + case 798: { 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))} @@ -9810,11 +9866,11 @@ yynewstate: parser.yyVAL.expr = &ast.AggregateFuncExpr{F: yyS[yypt-5].ident, Args: []ast.ExprNode{yyS[yypt-2].expr}} } } - case 793: + case 799: { parser.yyVAL.expr = &ast.AggregateFuncExpr{F: yyS[yypt-4].ident, Args: yyS[yypt-1].item.([]ast.ExprNode), Distinct: true} } - case 794: + case 800: { 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))} @@ -9822,7 +9878,7 @@ yynewstate: parser.yyVAL.expr = &ast.AggregateFuncExpr{F: yyS[yypt-5].ident, Args: []ast.ExprNode{yyS[yypt-2].expr}} } } - case 795: + case 801: { 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))} @@ -9830,7 +9886,7 @@ yynewstate: parser.yyVAL.expr = &ast.AggregateFuncExpr{F: yyS[yypt-4].ident, Args: []ast.ExprNode{yyS[yypt-2].expr}} } } - case 796: + case 802: { args := []ast.ExprNode{ast.NewValueExpr(1)} if yyS[yypt-0].item != nil { @@ -9839,13 +9895,13 @@ yynewstate: parser.yyVAL.expr = &ast.AggregateFuncExpr{F: yyS[yypt-4].ident, Args: args} } } - case 797: + case 803: { args := yyS[yypt-3].item.([]ast.ExprNode) args = append(args, yyS[yypt-1].item.(ast.ExprNode)) parser.yyVAL.expr = &ast.AggregateFuncExpr{F: yyS[yypt-6].ident, Args: args, Distinct: yyS[yypt-4].item.(bool)} } - case 798: + case 804: { 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))} @@ -9853,7 +9909,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 799: + case 805: { 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))} @@ -9861,7 +9917,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 800: + case 806: { 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))} @@ -9869,7 +9925,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 801: + case 807: { 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))} @@ -9877,7 +9933,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 802: + case 808: { 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))} @@ -9885,63 +9941,39 @@ 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 803: + case 809: { parser.yyVAL.expr = &ast.AggregateFuncExpr{F: ast.AggFuncVarPop, Args: []ast.ExprNode{yyS[yypt-2].expr}, Distinct: yyS[yypt-3].item.(bool)} } - case 804: + case 810: { parser.yyVAL.expr = &ast.AggregateFuncExpr{F: yyS[yypt-5].ident, Args: []ast.ExprNode{yyS[yypt-2].expr}, Distinct: yyS[yypt-3].item.(bool)} } - case 805: + case 811: { parser.yyVAL.item = ast.NewValueExpr(",") } - case 806: + case 812: { parser.yyVAL.item = ast.NewValueExpr(yyS[yypt-0].ident) } - case 807: + case 813: { parser.yyVAL.expr = &ast.FuncCallExpr{FnName: model.NewCIStr(yyS[yypt-3].ident), Args: yyS[yypt-1].item.([]ast.ExprNode)} } - case 808: + case 814: { parser.yyVAL.item = nil } - case 809: + case 815: { parser.yyVAL.item = nil } - case 810: + case 816: { expr := ast.NewValueExpr(yyS[yypt-1].item) parser.yyVAL.item = expr } - case 811: - { - parser.yyVAL.ident = strings.ToUpper(yyS[yypt-0].ident) - } - case 812: - { - parser.yyVAL.ident = strings.ToUpper(yyS[yypt-0].ident) - } - case 813: - { - parser.yyVAL.ident = strings.ToUpper(yyS[yypt-0].ident) - } - case 814: - { - parser.yyVAL.ident = strings.ToUpper(yyS[yypt-0].ident) - } - case 815: - { - parser.yyVAL.ident = strings.ToUpper(yyS[yypt-0].ident) - } - case 816: - { - parser.yyVAL.ident = strings.ToUpper(yyS[yypt-0].ident) - } case 817: { parser.yyVAL.ident = strings.ToUpper(yyS[yypt-0].ident) @@ -10030,42 +10062,66 @@ yynewstate: { parser.yyVAL.ident = strings.ToUpper(yyS[yypt-0].ident) } - case 839: + case 839: + { + parser.yyVAL.ident = strings.ToUpper(yyS[yypt-0].ident) + } + case 840: + { + parser.yyVAL.ident = strings.ToUpper(yyS[yypt-0].ident) + } + case 841: + { + parser.yyVAL.ident = strings.ToUpper(yyS[yypt-0].ident) + } + case 842: + { + parser.yyVAL.ident = strings.ToUpper(yyS[yypt-0].ident) + } + case 843: + { + parser.yyVAL.ident = strings.ToUpper(yyS[yypt-0].ident) + } + case 844: + { + parser.yyVAL.ident = strings.ToUpper(yyS[yypt-0].ident) + } + case 845: { parser.yyVAL.ident = strings.ToUpper(yyS[yypt-0].ident) } - case 840: + case 846: { parser.yyVAL.expr = nil } - case 841: + case 847: { parser.yyVAL.expr = yyS[yypt-0].expr } - case 842: + case 848: { parser.yyVAL.item = []*ast.WhenClause{yyS[yypt-0].item.(*ast.WhenClause)} } - case 843: + case 849: { parser.yyVAL.item = append(yyS[yypt-1].item.([]*ast.WhenClause), yyS[yypt-0].item.(*ast.WhenClause)) } - case 844: + case 850: { parser.yyVAL.item = &ast.WhenClause{ Expr: yyS[yypt-2].expr, Result: yyS[yypt-0].expr, } } - case 845: + case 851: { parser.yyVAL.item = nil } - case 846: + case 852: { parser.yyVAL.item = yyS[yypt-0].expr } - case 847: + case 853: { x := types.NewFieldType(mysql.TypeVarString) x.Flen = yyS[yypt-0].item.(int) // TODO: Flen should be the flen of expression @@ -10077,7 +10133,7 @@ yynewstate: x.Flag |= mysql.BinaryFlag parser.yyVAL.item = x } - case 848: + case 854: { x := types.NewFieldType(mysql.TypeVarString) x.Flen = yyS[yypt-1].item.(int) // TODO: Flen should be the flen of expression @@ -10091,7 +10147,7 @@ yynewstate: } parser.yyVAL.item = x } - case 849: + case 855: { x := types.NewFieldType(mysql.TypeDate) x.Charset = mysql.CharsetBin @@ -10099,7 +10155,7 @@ yynewstate: x.Flag |= mysql.BinaryFlag parser.yyVAL.item = x } - case 850: + case 856: { x := types.NewFieldType(mysql.TypeDatetime) x.Flen, _ = mysql.GetDefaultFieldLengthAndDecimalForCast(mysql.TypeDatetime) @@ -10112,7 +10168,7 @@ yynewstate: x.Flag |= mysql.BinaryFlag parser.yyVAL.item = x } - case 851: + case 857: { fopt := yyS[yypt-0].item.(*ast.FloatOpt) x := types.NewFieldType(mysql.TypeNewDecimal) @@ -10123,7 +10179,7 @@ yynewstate: x.Flag |= mysql.BinaryFlag parser.yyVAL.item = x } - case 852: + case 858: { x := types.NewFieldType(mysql.TypeDuration) x.Flen, _ = mysql.GetDefaultFieldLengthAndDecimalForCast(mysql.TypeDuration) @@ -10136,7 +10192,7 @@ yynewstate: x.Flag |= mysql.BinaryFlag parser.yyVAL.item = x } - case 853: + case 859: { x := types.NewFieldType(mysql.TypeLonglong) x.Charset = mysql.CharsetBin @@ -10144,7 +10200,7 @@ yynewstate: x.Flag |= mysql.BinaryFlag parser.yyVAL.item = x } - case 854: + case 860: { x := types.NewFieldType(mysql.TypeLonglong) x.Flag |= mysql.UnsignedFlag | mysql.BinaryFlag @@ -10152,7 +10208,7 @@ yynewstate: x.Collate = mysql.CollationBin parser.yyVAL.item = x } - case 855: + case 861: { x := types.NewFieldType(mysql.TypeJSON) x.Flag |= mysql.BinaryFlag | (mysql.ParseToJSONFlag) @@ -10160,52 +10216,52 @@ yynewstate: x.Collate = mysql.DefaultCollationName parser.yyVAL.item = x } - case 856: + case 862: { parser.yyVAL.item = mysql.NoPriority } - case 857: + case 863: { parser.yyVAL.item = mysql.LowPriority } - case 858: + case 864: { parser.yyVAL.item = mysql.HighPriority } - case 859: + case 865: { parser.yyVAL.item = mysql.DelayedPriority } - case 860: + case 866: { parser.yyVAL.item = &ast.TableName{Name: model.NewCIStr(yyS[yypt-0].ident)} } - case 861: + case 867: { parser.yyVAL.item = &ast.TableName{Schema: model.NewCIStr(yyS[yypt-2].ident), Name: model.NewCIStr(yyS[yypt-0].ident)} } - case 862: + case 868: { parser.yyVAL.item = &ast.TableName{Name: model.NewCIStr(yyS[yypt-2].ident)} } - case 863: + case 869: { tbl := []*ast.TableName{yyS[yypt-0].item.(*ast.TableName)} parser.yyVAL.item = tbl } - case 864: + case 870: { parser.yyVAL.item = append(yyS[yypt-2].item.([]*ast.TableName), yyS[yypt-0].item.(*ast.TableName)) } - case 865: + case 871: { parser.yyVAL.item = false } - case 866: + case 872: { parser.yyVAL.item = true } - case 867: + case 873: { var sqlText string var sqlVar *ast.VariableExpr @@ -10221,79 +10277,80 @@ yynewstate: SQLVar: sqlVar, } } - case 868: + case 874: { parser.yyVAL.item = yyS[yypt-0].ident } - case 869: + case 875: { parser.yyVAL.item = yyS[yypt-0].expr.(interface{}) } - case 870: + case 876: { parser.yyVAL.statement = &ast.ExecuteStmt{Name: yyS[yypt-0].ident} } - case 871: + case 877: { parser.yyVAL.statement = &ast.ExecuteStmt{ Name: yyS[yypt-2].ident, UsingVars: yyS[yypt-0].item.([]ast.ExprNode), } } - case 872: + case 878: { parser.yyVAL.item = []ast.ExprNode{yyS[yypt-0].expr} } - case 873: + case 879: { parser.yyVAL.item = append(yyS[yypt-2].item.([]ast.ExprNode), yyS[yypt-0].expr) } - case 874: + case 880: { parser.yyVAL.statement = &ast.DeallocateStmt{Name: yyS[yypt-0].ident} } - case 877: + case 883: { parser.yyVAL.statement = &ast.RollbackStmt{} } - case 878: + case 884: { parser.yyVAL.statement = &ast.RollbackStmt{} } - case 879: + case 885: { parser.yyVAL.statement = &ast.RollbackStmt{Savepoint: yyS[yypt-0].item.(string)} } - case 880: + case 886: { parser.yyVAL.statement = &ast.RollbackStmt{Savepoint: yyS[yypt-0].item.(string)} } - case 881: + case 887: { parser.yyVAL.statement = &ast.RollbackStmt{Savepoint: yyS[yypt-0].item.(string)} } - case 882: + case 888: { parser.yyVAL.statement = &ast.RollbackStmt{Savepoint: yyS[yypt-0].item.(string)} } - case 883: + case 889: { parser.yyVAL.statement = &ast.SavepointStmt{Savepoint: yyS[yypt-0].item.(string)} } - case 884: + case 890: { parser.yyVAL.statement = &ast.SavepointStmt{Savepoint: yyS[yypt-0].item.(string), Release: true} } - case 885: + case 891: { st := &ast.SelectStmt{ SelectStmtOpts: yyS[yypt-1].item.(*ast.SelectStmtOpts), Distinct: yyS[yypt-1].item.(*ast.SelectStmtOpts).Distinct, Fields: yyS[yypt-0].item.(*ast.FieldList), } + parser.yyVAL.item = st } - case 886: + case 892: { st := yyS[yypt-2].item.(*ast.SelectStmt) lastField := st.Fields.Fields[len(st.Fields.Fields)-1] @@ -10305,7 +10362,7 @@ yynewstate: st.Where = yyS[yypt-0].item.(ast.ExprNode) } } - case 887: + case 893: { st := yyS[yypt-6].item.(*ast.SelectStmt) st.From = yyS[yypt-4].item.(*ast.TableRefsClause) @@ -10331,7 +10388,7 @@ yynewstate: } parser.yyVAL.item = st } - case 888: + case 894: { st := yyS[yypt-3].item.(*ast.SelectStmt) st.LockTp = yyS[yypt-0].item.(ast.SelectLockType) @@ -10361,7 +10418,7 @@ yynewstate: } parser.yyVAL.statement = st } - case 889: + case 895: { st := yyS[yypt-3].item.(*ast.SelectStmt) if yyS[yypt-2].item != nil { @@ -10373,7 +10430,7 @@ yynewstate: st.LockTp = yyS[yypt-0].item.(ast.SelectLockType) parser.yyVAL.statement = st } - case 890: + case 896: { st := yyS[yypt-3].item.(*ast.SelectStmt) st.LockTp = yyS[yypt-0].item.(ast.SelectLockType) @@ -10385,37 +10442,37 @@ yynewstate: } parser.yyVAL.statement = st } - case 892: + case 898: { parser.yyVAL.item = nil } - case 893: + case 899: { parser.yyVAL.item = yyS[yypt-0].item.([]ast.WindowSpec) } - case 894: + case 900: { parser.yyVAL.item = []ast.WindowSpec{yyS[yypt-0].item.(ast.WindowSpec)} } - case 895: + case 901: { parser.yyVAL.item = append(yyS[yypt-2].item.([]ast.WindowSpec), yyS[yypt-0].item.(ast.WindowSpec)) } - case 896: + case 902: { var spec = yyS[yypt-0].item.(ast.WindowSpec) spec.Name = yyS[yypt-2].item.(model.CIStr) parser.yyVAL.item = spec } - case 897: + case 903: { parser.yyVAL.item = model.NewCIStr(yyS[yypt-0].ident) } - case 898: + case 904: { parser.yyVAL.item = yyS[yypt-1].item.(ast.WindowSpec) } - case 899: + case 905: { spec := ast.WindowSpec{Ref: yyS[yypt-3].item.(model.CIStr)} if yyS[yypt-2].item != nil { @@ -10429,154 +10486,154 @@ yynewstate: } parser.yyVAL.item = spec } - case 900: + case 906: { parser.yyVAL.item = model.CIStr{} } - case 901: + case 907: { parser.yyVAL.item = yyS[yypt-0].item.(model.CIStr) } - case 902: + case 908: { parser.yyVAL.item = nil } - case 903: + case 909: { parser.yyVAL.item = &ast.PartitionByClause{Items: yyS[yypt-0].item.([]*ast.ByItem)} } - case 904: + case 910: { parser.yyVAL.item = nil } - case 905: + case 911: { parser.yyVAL.item = &ast.OrderByClause{Items: yyS[yypt-0].item.([]*ast.ByItem)} } - case 906: + case 912: { parser.yyVAL.item = nil } - case 907: + case 913: { parser.yyVAL.item = &ast.FrameClause{ Type: yyS[yypt-1].item.(ast.FrameType), Extent: yyS[yypt-0].item.(ast.FrameExtent), } } - case 908: + case 914: { parser.yyVAL.item = ast.FrameType(ast.Rows) } - case 909: + case 915: { parser.yyVAL.item = ast.FrameType(ast.Ranges) } - case 910: + case 916: { parser.yyVAL.item = ast.FrameType(ast.Groups) } - case 911: + case 917: { parser.yyVAL.item = ast.FrameExtent{ Start: yyS[yypt-0].item.(ast.FrameBound), End: ast.FrameBound{Type: ast.CurrentRow}, } } - case 912: + case 918: { parser.yyVAL.item = yyS[yypt-0].item.(ast.FrameExtent) } - case 913: + case 919: { parser.yyVAL.item = ast.FrameBound{Type: ast.Preceding, UnBounded: true} } - case 914: + case 920: { parser.yyVAL.item = ast.FrameBound{Type: ast.Preceding, Expr: ast.NewValueExpr(yyS[yypt-1].item)} } - case 915: + case 921: { parser.yyVAL.item = ast.FrameBound{Type: ast.Preceding, Expr: ast.NewParamMarkerExpr(yyS[yypt].offset)} } - case 916: + case 922: { parser.yyVAL.item = ast.FrameBound{Type: ast.Preceding, Expr: yyS[yypt-2].expr, Unit: ast.NewValueExpr(yyS[yypt-1].ident)} } - case 917: + case 923: { parser.yyVAL.item = ast.FrameBound{Type: ast.CurrentRow} } - case 918: + case 924: { parser.yyVAL.item = ast.FrameExtent{Start: yyS[yypt-2].item.(ast.FrameBound), End: yyS[yypt-0].item.(ast.FrameBound)} } - case 919: + case 925: { parser.yyVAL.item = yyS[yypt-0].item.(ast.FrameBound) } - case 920: + case 926: { parser.yyVAL.item = ast.FrameBound{Type: ast.Following, UnBounded: true} } - case 921: + case 927: { parser.yyVAL.item = ast.FrameBound{Type: ast.Following, Expr: ast.NewValueExpr(yyS[yypt-1].item)} } - case 922: + case 928: { parser.yyVAL.item = ast.FrameBound{Type: ast.Following, Expr: ast.NewParamMarkerExpr(yyS[yypt].offset)} } - case 923: + case 929: { parser.yyVAL.item = ast.FrameBound{Type: ast.Following, Expr: yyS[yypt-2].expr, Unit: ast.NewValueExpr(yyS[yypt-1].ident)} } - case 924: + case 930: { parser.yyVAL.item = nil } - case 925: + case 931: { spec := yyS[yypt-0].item.(ast.WindowSpec) parser.yyVAL.item = &spec } - case 926: + case 932: { parser.yyVAL.item = yyS[yypt-0].item.(ast.WindowSpec) } - case 927: + case 933: { parser.yyVAL.item = ast.WindowSpec{Ref: yyS[yypt-0].item.(model.CIStr)} } - case 928: + case 934: { parser.yyVAL.item = yyS[yypt-0].item.(ast.WindowSpec) } - case 929: + case 935: { parser.yyVAL.item = &ast.WindowFuncExpr{F: yyS[yypt-3].ident, Spec: yyS[yypt-0].item.(ast.WindowSpec)} } - case 930: + case 936: { parser.yyVAL.item = &ast.WindowFuncExpr{F: yyS[yypt-3].ident, Spec: yyS[yypt-0].item.(ast.WindowSpec)} } - case 931: + case 937: { parser.yyVAL.item = &ast.WindowFuncExpr{F: yyS[yypt-3].ident, Spec: yyS[yypt-0].item.(ast.WindowSpec)} } - case 932: + case 938: { parser.yyVAL.item = &ast.WindowFuncExpr{F: yyS[yypt-3].ident, Spec: yyS[yypt-0].item.(ast.WindowSpec)} } - case 933: + case 939: { parser.yyVAL.item = &ast.WindowFuncExpr{F: yyS[yypt-3].ident, Spec: yyS[yypt-0].item.(ast.WindowSpec)} } - case 934: + case 940: { parser.yyVAL.item = &ast.WindowFuncExpr{F: yyS[yypt-4].ident, Args: []ast.ExprNode{yyS[yypt-2].expr}, Spec: yyS[yypt-0].item.(ast.WindowSpec)} } - case 935: + case 941: { args := []ast.ExprNode{yyS[yypt-4].expr} if yyS[yypt-3].item != nil { @@ -10584,7 +10641,7 @@ yynewstate: } parser.yyVAL.item = &ast.WindowFuncExpr{F: yyS[yypt-6].ident, Args: args, IgnoreNull: yyS[yypt-1].item.(bool), Spec: yyS[yypt-0].item.(ast.WindowSpec)} } - case 936: + case 942: { args := []ast.ExprNode{yyS[yypt-4].expr} if yyS[yypt-3].item != nil { @@ -10592,23 +10649,23 @@ yynewstate: } parser.yyVAL.item = &ast.WindowFuncExpr{F: yyS[yypt-6].ident, Args: args, IgnoreNull: yyS[yypt-1].item.(bool), Spec: yyS[yypt-0].item.(ast.WindowSpec)} } - case 937: + case 943: { parser.yyVAL.item = &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 938: + case 944: { parser.yyVAL.item = &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 939: + case 945: { parser.yyVAL.item = &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 940: + case 946: { parser.yyVAL.item = nil } - case 941: + case 947: { args := []ast.ExprNode{ast.NewValueExpr(yyS[yypt-1].item)} if yyS[yypt-0].item != nil { @@ -10616,7 +10673,7 @@ yynewstate: } parser.yyVAL.item = args } - case 942: + case 948: { args := []ast.ExprNode{ast.NewValueExpr(yyS[yypt-1].item)} if yyS[yypt-0].item != nil { @@ -10624,43 +10681,43 @@ yynewstate: } parser.yyVAL.item = args } - case 943: + case 949: { parser.yyVAL.item = nil } - case 944: + case 950: { parser.yyVAL.item = yyS[yypt-0].expr } - case 945: + case 951: { parser.yyVAL.item = false } - case 946: + case 952: { parser.yyVAL.item = false } - case 947: + case 953: { parser.yyVAL.item = true } - case 948: + case 954: { parser.yyVAL.item = false } - case 949: + case 955: { parser.yyVAL.item = false } - case 950: + case 956: { parser.yyVAL.item = true } - case 951: + case 957: { parser.yyVAL.item = &ast.TableRefsClause{TableRefs: yyS[yypt-0].item.(*ast.Join)} } - case 952: + case 958: { if j, ok := yyS[yypt-0].item.(*ast.Join); ok { // if $1 is Join, use it directly @@ -10669,16 +10726,16 @@ yynewstate: parser.yyVAL.item = &ast.Join{Left: yyS[yypt-0].item.(ast.ResultSetNode), Right: nil} } } - case 953: + case 959: { /* 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 954: + case 960: { parser.yyVAL.item = yyS[yypt-0].item } - case 955: + case 961: { /* * ODBC escape syntax for outer join is { OJ join_table } @@ -10686,89 +10743,83 @@ yynewstate: */ parser.yyVAL.item = yyS[yypt-1].item } - case 956: + case 962: { parser.yyVAL.item = yyS[yypt-0].item } - case 957: + case 963: { parser.yyVAL.item = yyS[yypt-0].item } - case 958: + case 964: { tn := yyS[yypt-3].item.(*ast.TableName) tn.PartitionNames = yyS[yypt-2].item.([]model.CIStr) tn.IndexHints = yyS[yypt-0].item.([]*ast.IndexHint) parser.yyVAL.item = &ast.TableSource{Source: tn, AsName: yyS[yypt-1].item.(model.CIStr)} } - case 959: - { - st := yyS[yypt-2].statement.(*ast.SelectStmt) - endOffset := parser.endOffset(&yyS[yypt-1]) - parser.setLastSelectFieldText(st, endOffset) - parser.yyVAL.item = &ast.TableSource{Source: yyS[yypt-2].statement.(*ast.SelectStmt), AsName: yyS[yypt-0].item.(model.CIStr)} - } - case 960: + case 965: { - parser.yyVAL.item = &ast.TableSource{Source: yyS[yypt-2].statement.(*ast.UnionStmt), AsName: yyS[yypt-0].item.(model.CIStr)} + resultNode := yyS[yypt-1].expr.(*ast.SubqueryExpr).Query + parser.yyVAL.item = &ast.TableSource{Source: resultNode, AsName: yyS[yypt-0].item.(model.CIStr)} } - case 961: + case 966: { parser.yyVAL.item = yyS[yypt-1].item } - case 962: + case 967: { parser.yyVAL.item = []model.CIStr{} } - case 963: + case 968: { parser.yyVAL.item = yyS[yypt-1].item } - case 964: + case 969: { parser.yyVAL.item = model.CIStr{} } - case 965: + case 970: { parser.yyVAL.item = yyS[yypt-0].item } - case 966: + case 971: { parser.yyVAL.item = model.NewCIStr(yyS[yypt-0].ident) } - case 967: + case 972: { parser.yyVAL.item = model.NewCIStr(yyS[yypt-0].ident) } - case 968: + case 973: { parser.yyVAL.item = ast.HintUse } - case 969: + case 974: { parser.yyVAL.item = ast.HintIgnore } - case 970: + case 975: { parser.yyVAL.item = ast.HintForce } - case 971: + case 976: { parser.yyVAL.item = ast.HintForScan } - case 972: + case 977: { parser.yyVAL.item = ast.HintForJoin } - case 973: + case 978: { parser.yyVAL.item = ast.HintForOrderBy } - case 974: + case 979: { parser.yyVAL.item = ast.HintForGroupBy } - case 975: + case 980: { parser.yyVAL.item = &ast.IndexHint{ IndexNames: yyS[yypt-1].item.([]model.CIStr), @@ -10776,120 +10827,120 @@ yynewstate: HintScope: yyS[yypt-3].item.(ast.IndexHintScope), } } - case 976: + case 981: { var nameList []model.CIStr parser.yyVAL.item = nameList } - case 977: + case 982: { parser.yyVAL.item = []model.CIStr{model.NewCIStr(yyS[yypt-0].ident)} } - case 978: + case 983: { parser.yyVAL.item = append(yyS[yypt-2].item.([]model.CIStr), model.NewCIStr(yyS[yypt-0].ident)) } - case 979: + case 984: { parser.yyVAL.item = []model.CIStr{model.NewCIStr(yyS[yypt-0].ident)} } - case 980: + case 985: { parser.yyVAL.item = []*ast.IndexHint{yyS[yypt-0].item.(*ast.IndexHint)} } - case 981: + case 986: { parser.yyVAL.item = append(yyS[yypt-1].item.([]*ast.IndexHint), yyS[yypt-0].item.(*ast.IndexHint)) } - case 982: + case 987: { var hintList []*ast.IndexHint parser.yyVAL.item = hintList } - case 983: + case 988: { parser.yyVAL.item = yyS[yypt-0].item } - case 984: + case 989: { parser.yyVAL.item = &ast.Join{Left: yyS[yypt-2].item.(ast.ResultSetNode), Right: yyS[yypt-0].item.(ast.ResultSetNode), Tp: ast.CrossJoin} } - case 985: + case 990: { 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 986: + case 991: { 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 987: + case 992: { 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 988: + case 993: { 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 989: + case 994: { parser.yyVAL.item = &ast.Join{Left: yyS[yypt-3].item.(ast.ResultSetNode), Right: yyS[yypt-0].item.(ast.ResultSetNode), NaturalJoin: true} } - case 990: + case 995: { 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 991: + case 996: { parser.yyVAL.item = &ast.Join{Left: yyS[yypt-2].item.(ast.ResultSetNode), Right: yyS[yypt-0].item.(ast.ResultSetNode), StraightJoin: true} } - case 992: + case 997: { 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 993: + case 998: { parser.yyVAL.item = ast.LeftJoin } - case 994: + case 999: { parser.yyVAL.item = ast.RightJoin } - case 1000: + case 1005: { parser.yyVAL.item = nil } - case 1001: + case 1006: { parser.yyVAL.item = &ast.Limit{Count: yyS[yypt-0].item.(ast.ValueExpr)} } - case 1002: + case 1007: { parser.yyVAL.item = ast.NewValueExpr(yyS[yypt-0].item) } - case 1003: + case 1008: { parser.yyVAL.item = ast.NewParamMarkerExpr(yyS[yypt].offset) } - case 1004: + case 1009: { parser.yyVAL.item = nil } - case 1005: + case 1010: { parser.yyVAL.item = &ast.Limit{Count: yyS[yypt-0].item.(ast.ExprNode)} } - case 1006: + case 1011: { parser.yyVAL.item = &ast.Limit{Offset: yyS[yypt-2].item.(ast.ExprNode), Count: yyS[yypt-0].item.(ast.ExprNode)} } - case 1007: + case 1012: { parser.yyVAL.item = &ast.Limit{Offset: yyS[yypt-0].item.(ast.ExprNode), Count: yyS[yypt-2].item.(ast.ExprNode)} } - case 1008: + case 1013: { opt := &ast.SelectStmtOpts{} if yyS[yypt-5].item != nil { @@ -10913,89 +10964,93 @@ yynewstate: parser.yyVAL.item = opt } - case 1009: + case 1014: { parser.yyVAL.item = nil } - case 1010: + case 1015: { parser.yyVAL.item = yyS[yypt-1].item } - case 1011: + case 1016: { yyerrok() parser.lastErrorAsWarn() parser.yyVAL.item = nil } - case 1012: + case 1017: { parser.yyVAL.item = []model.CIStr{model.NewCIStr(yyS[yypt-0].ident)} } - case 1013: + case 1018: { parser.yyVAL.item = append(yyS[yypt-2].item.([]model.CIStr), model.NewCIStr(yyS[yypt-0].ident)) } - case 1014: + case 1019: { parser.yyVAL.item = []*ast.TableOptimizerHint{yyS[yypt-0].item.(*ast.TableOptimizerHint)} } - case 1015: + case 1020: { parser.yyVAL.item = append(yyS[yypt-1].item.([]*ast.TableOptimizerHint), yyS[yypt-0].item.(*ast.TableOptimizerHint)) } - case 1016: + case 1021: { parser.yyVAL.item = &ast.TableOptimizerHint{HintName: model.NewCIStr(yyS[yypt-3].ident), Tables: yyS[yypt-1].item.([]model.CIStr)} } - case 1017: + case 1022: { parser.yyVAL.item = &ast.TableOptimizerHint{HintName: model.NewCIStr(yyS[yypt-3].ident), Tables: yyS[yypt-1].item.([]model.CIStr)} } - case 1018: + case 1023: { parser.yyVAL.item = &ast.TableOptimizerHint{HintName: model.NewCIStr(yyS[yypt-3].ident), Tables: yyS[yypt-1].item.([]model.CIStr)} } - case 1019: + case 1024: { parser.yyVAL.item = &ast.TableOptimizerHint{HintName: model.NewCIStr(yyS[yypt-3].ident), MaxExecutionTime: getUint64FromNUM(yyS[yypt-1].item)} } - case 1020: + case 1025: + { + parser.yyVAL.item = &ast.TableOptimizerHint{HintName: model.NewCIStr(yyS[yypt-0].ident)} + } + case 1026: { parser.yyVAL.item = false } - case 1021: + case 1027: { parser.yyVAL.item = true } - case 1022: + case 1028: { parser.yyVAL.item = true } - case 1023: + case 1029: { parser.yyVAL.item = true } - case 1024: + case 1030: { parser.yyVAL.item = false } - case 1025: + case 1031: { parser.yyVAL.item = false } - case 1026: + case 1032: { parser.yyVAL.item = true } - case 1027: + case 1033: { parser.yyVAL.item = &ast.FieldList{Fields: yyS[yypt-0].item.([]*ast.SelectField)} } - case 1028: + case 1034: { parser.yyVAL.item = nil } - case 1030: + case 1036: { s := yyS[yypt-1].statement.(*ast.SelectStmt) endOffset := parser.endOffset(&yyS[yypt]) @@ -11005,7 +11060,7 @@ yynewstate: s.SetText(src[yyS[yypt-1].offset:yyS[yypt].offset]) parser.yyVAL.expr = &ast.SubqueryExpr{Query: s} } - case 1031: + case 1037: { s := yyS[yypt-1].statement.(*ast.UnionStmt) src := parser.src @@ -11013,19 +11068,62 @@ yynewstate: s.SetText(src[yyS[yypt-1].offset:yyS[yypt].offset]) parser.yyVAL.expr = &ast.SubqueryExpr{Query: s} } - case 1032: + case 1038: + { + subQuery := yyS[yypt-1].expr.(*ast.SubqueryExpr).Query + isRecursive := true + // remove redundant brackets like '((select 1))' + for isRecursive { + if _, isRecursive = subQuery.(*ast.SubqueryExpr); isRecursive { + subQuery = subQuery.(*ast.SubqueryExpr).Query + } + } + switch rs := subQuery.(type) { + case *ast.SelectStmt: + endOffset := parser.endOffset(&yyS[yypt]) + parser.setLastSelectFieldText(rs, endOffset) + src := parser.src + rs.SetText(src[yyS[yypt-1].offset:yyS[yypt].offset]) + parser.yyVAL.expr = &ast.SubqueryExpr{Query: rs} + case *ast.UnionStmt: + src := parser.src + rs.SetText(src[yyS[yypt-1].offset:yyS[yypt].offset]) + parser.yyVAL.expr = &ast.SubqueryExpr{Query: rs} + } + } + case 1039: { parser.yyVAL.item = ast.SelectLockNone } - case 1033: + case 1040: { parser.yyVAL.item = ast.SelectLockForUpdate } - case 1034: + case 1041: + { + parser.yyVAL.item = ast.SelectLockForShare + } + case 1042: + { + parser.yyVAL.item = ast.SelectLockForUpdateNoWait + } + case 1043: + { + parser.yyVAL.item = ast.SelectLockForShareNoWait + } + case 1044: + { + parser.yyVAL.item = ast.SelectLockForUpdateSkipLocked + } + case 1045: + { + parser.yyVAL.item = ast.SelectLockForShareSkipLocked + } + case 1046: { parser.yyVAL.item = ast.SelectLockInShareMode } - case 1035: + case 1047: { st := yyS[yypt-3].item.(*ast.SelectStmt) union := yyS[yypt-6].item.(*ast.UnionStmt) @@ -11045,7 +11143,7 @@ yynewstate: } parser.yyVAL.statement = union } - case 1036: + case 1048: { st := yyS[yypt-3].item.(*ast.SelectStmt) union := yyS[yypt-6].item.(*ast.UnionStmt) @@ -11065,7 +11163,7 @@ yynewstate: } parser.yyVAL.statement = union } - case 1037: + case 1049: { st := yyS[yypt-3].item.(*ast.SelectStmt) union := yyS[yypt-6].item.(*ast.UnionStmt) @@ -11085,7 +11183,7 @@ yynewstate: } parser.yyVAL.statement = union } - case 1038: + case 1050: { union := yyS[yypt-7].item.(*ast.UnionStmt) lastSelect := union.SelectList.Selects[len(union.SelectList.Selects)-1] @@ -11105,14 +11203,14 @@ yynewstate: } parser.yyVAL.statement = union } - case 1039: + case 1051: { selectList := &ast.UnionSelectList{Selects: []*ast.SelectStmt{yyS[yypt-0].item.(*ast.SelectStmt)}} parser.yyVAL.item = &ast.UnionStmt{ SelectList: selectList, } } - case 1040: + case 1052: { union := yyS[yypt-3].item.(*ast.UnionStmt) st := yyS[yypt-0].item.(*ast.SelectStmt) @@ -11123,11 +11221,11 @@ yynewstate: union.SelectList.Selects = append(union.SelectList.Selects, st) parser.yyVAL.item = union } - case 1041: + case 1053: { parser.yyVAL.item = yyS[yypt-0].statement.(interface{}) } - case 1042: + case 1054: { st := yyS[yypt-1].statement.(*ast.SelectStmt) st.IsInBraces = true @@ -11135,19 +11233,19 @@ yynewstate: parser.setLastSelectFieldText(st, endOffset) parser.yyVAL.item = yyS[yypt-1].statement } - case 1044: + case 1056: { parser.yyVAL.statement = &ast.SetStmt{Variables: yyS[yypt-0].item.([]*ast.VariableAssignment)} } - case 1045: + case 1057: { parser.yyVAL.statement = &ast.SetPwdStmt{Password: yyS[yypt-0].item.(string)} } - case 1046: + case 1058: { parser.yyVAL.statement = &ast.SetPwdStmt{User: yyS[yypt-2].item.(*auth.UserIdentity), Password: yyS[yypt-0].item.(string)} } - case 1047: + case 1059: { vars := yyS[yypt-0].item.([]*ast.VariableAssignment) for _, v := range vars { @@ -11155,11 +11253,11 @@ yynewstate: } parser.yyVAL.statement = &ast.SetStmt{Variables: vars} } - case 1048: + case 1060: { parser.yyVAL.statement = &ast.SetStmt{Variables: yyS[yypt-0].item.([]*ast.VariableAssignment)} } - case 1049: + case 1061: { assigns := yyS[yypt-0].item.([]*ast.VariableAssignment) for i := 0; i < len(assigns); i++ { @@ -11170,7 +11268,7 @@ yynewstate: } parser.yyVAL.statement = &ast.SetStmt{Variables: assigns} } - case 1058: + case 1070: { if yyS[yypt-0].item != nil { parser.yyVAL.item = yyS[yypt-0].item @@ -11178,7 +11276,7 @@ yynewstate: parser.yyVAL.item = []*ast.VariableAssignment{} } } - case 1059: + case 1071: { if yyS[yypt-0].item != nil { varAssigns := yyS[yypt-0].item.([]*ast.VariableAssignment) @@ -11187,64 +11285,68 @@ yynewstate: parser.yyVAL.item = yyS[yypt-2].item } } - case 1060: + case 1072: { varAssigns := []*ast.VariableAssignment{} expr := ast.NewValueExpr(yyS[yypt-0].ident) varAssigns = append(varAssigns, &ast.VariableAssignment{Name: "tx_isolation", Value: expr, IsSystem: true}) parser.yyVAL.item = varAssigns } - case 1061: + case 1073: { varAssigns := []*ast.VariableAssignment{} expr := ast.NewValueExpr("0") varAssigns = append(varAssigns, &ast.VariableAssignment{Name: "tx_read_only", Value: expr, IsSystem: true}) parser.yyVAL.item = varAssigns } - case 1062: + case 1074: { varAssigns := []*ast.VariableAssignment{} expr := ast.NewValueExpr("1") varAssigns = append(varAssigns, &ast.VariableAssignment{Name: "tx_read_only", Value: expr, IsSystem: true}) parser.yyVAL.item = varAssigns } - case 1063: + case 1075: { parser.yyVAL.ident = ast.RepeatableRead } - case 1064: + case 1076: { parser.yyVAL.ident = ast.ReadCommitted } - case 1065: + case 1077: { parser.yyVAL.ident = ast.ReadUncommitted } - case 1066: + case 1078: { parser.yyVAL.ident = ast.Serializable } - case 1067: + case 1079: { parser.yyVAL.expr = ast.NewValueExpr("ON") } - case 1069: + case 1080: + { + parser.yyVAL.expr = ast.NewValueExpr("BINARY") + } + case 1082: { parser.yyVAL.item = &ast.VariableAssignment{Name: yyS[yypt-2].ident, Value: yyS[yypt-0].expr, IsSystem: true} } - case 1070: + case 1083: { parser.yyVAL.item = &ast.VariableAssignment{Name: yyS[yypt-2].ident, Value: yyS[yypt-0].expr, IsGlobal: true, IsSystem: true} } - case 1071: + case 1084: { parser.yyVAL.item = &ast.VariableAssignment{Name: yyS[yypt-2].ident, Value: yyS[yypt-0].expr, IsSystem: true} } - case 1072: + case 1085: { parser.yyVAL.item = &ast.VariableAssignment{Name: yyS[yypt-2].ident, Value: yyS[yypt-0].expr, IsSystem: true} } - case 1073: + case 1086: { v := strings.ToLower(yyS[yypt-2].ident) var isGlobal bool @@ -11260,33 +11362,33 @@ yynewstate: } parser.yyVAL.item = &ast.VariableAssignment{Name: v, Value: yyS[yypt-0].expr, IsGlobal: isGlobal, IsSystem: true} } - case 1074: + case 1087: { v := yyS[yypt-2].ident v = strings.TrimPrefix(v, "@") parser.yyVAL.item = &ast.VariableAssignment{Name: v, Value: yyS[yypt-0].expr} } - case 1075: + case 1088: { v := yyS[yypt-2].ident v = strings.TrimPrefix(v, "@") parser.yyVAL.item = &ast.VariableAssignment{Name: v, Value: yyS[yypt-0].expr} } - case 1076: + case 1089: { parser.yyVAL.item = &ast.VariableAssignment{ Name: ast.SetNames, Value: ast.NewValueExpr(yyS[yypt-0].item.(string)), } } - case 1077: + case 1090: { parser.yyVAL.item = &ast.VariableAssignment{ Name: ast.SetNames, Value: ast.NewValueExpr(yyS[yypt-2].item.(string)), } } - case 1078: + case 1091: { parser.yyVAL.item = &ast.VariableAssignment{ Name: ast.SetNames, @@ -11294,34 +11396,34 @@ yynewstate: ExtendValue: ast.NewValueExpr(yyS[yypt-0].item.(string)), } } - case 1079: + case 1092: { parser.yyVAL.item = &ast.VariableAssignment{ Name: ast.SetNames, Value: ast.NewValueExpr(yyS[yypt-0].item.(string)), } } - case 1080: + case 1093: { parser.yyVAL.item = yyS[yypt-0].item } - case 1081: + case 1094: { parser.yyVAL.item = mysql.CharsetBin } - case 1082: + case 1095: { parser.yyVAL.item = []*ast.VariableAssignment{} } - case 1083: + case 1096: { parser.yyVAL.item = []*ast.VariableAssignment{yyS[yypt-0].item.(*ast.VariableAssignment)} } - case 1084: + case 1097: { parser.yyVAL.item = append(yyS[yypt-2].item.([]*ast.VariableAssignment), yyS[yypt-0].item.(*ast.VariableAssignment)) } - case 1087: + case 1100: { v := strings.ToLower(yyS[yypt-0].ident) var isGlobal bool @@ -11338,106 +11440,106 @@ yynewstate: } parser.yyVAL.expr = &ast.VariableExpr{Name: v, IsGlobal: isGlobal, IsSystem: true, ExplicitScope: explicitScope} } - case 1088: + case 1101: { v := yyS[yypt-0].ident v = strings.TrimPrefix(v, "@") parser.yyVAL.expr = &ast.VariableExpr{Name: v, IsGlobal: false, IsSystem: false} } - case 1089: + case 1102: { parser.yyVAL.item = &auth.UserIdentity{Username: yyS[yypt-0].item.(string), Hostname: "%"} } - case 1090: + case 1103: { parser.yyVAL.item = &auth.UserIdentity{Username: yyS[yypt-2].item.(string), Hostname: yyS[yypt-0].item.(string)} } - case 1091: + case 1104: { parser.yyVAL.item = &auth.UserIdentity{Username: yyS[yypt-1].item.(string), Hostname: strings.TrimPrefix(yyS[yypt-0].ident, "@")} } - case 1092: + case 1105: { parser.yyVAL.item = &auth.UserIdentity{CurrentUser: true} } - case 1093: + case 1106: { parser.yyVAL.item = []*auth.UserIdentity{yyS[yypt-0].item.(*auth.UserIdentity)} } - case 1094: + case 1107: { parser.yyVAL.item = append(yyS[yypt-2].item.([]*auth.UserIdentity), yyS[yypt-0].item.(*auth.UserIdentity)) } - case 1095: + case 1108: { parser.yyVAL.item = yyS[yypt-0].ident } - case 1096: + case 1109: { parser.yyVAL.item = yyS[yypt-1].item.(string) } - case 1097: + case 1110: { parser.yyVAL.item = yyS[yypt-0].ident } - case 1098: + case 1111: { parser.yyVAL.item = yyS[yypt-0].ident } - case 1099: + case 1112: { parser.yyVAL.item = yyS[yypt-0].ident } - case 1100: + case 1113: { parser.yyVAL.item = &auth.RoleIdentity{Username: yyS[yypt-0].item.(string), Hostname: "%"} } - case 1101: + case 1114: { parser.yyVAL.item = &auth.RoleIdentity{Username: yyS[yypt-2].item.(string), Hostname: yyS[yypt-0].item.(string)} } - case 1102: + case 1115: { parser.yyVAL.item = &auth.RoleIdentity{Username: yyS[yypt-1].item.(string), Hostname: strings.TrimPrefix(yyS[yypt-0].ident, "@")} } - case 1103: + case 1116: { parser.yyVAL.item = []*auth.RoleIdentity{yyS[yypt-0].item.(*auth.RoleIdentity)} } - case 1104: + case 1117: { parser.yyVAL.item = append(yyS[yypt-2].item.([]*auth.RoleIdentity), yyS[yypt-0].item.(*auth.RoleIdentity)) } - case 1105: + case 1118: { parser.yyVAL.statement = &ast.AdminStmt{Tp: ast.AdminShowDDL} } - case 1106: + case 1119: { parser.yyVAL.statement = &ast.AdminStmt{Tp: ast.AdminShowDDLJobs} } - case 1107: + case 1120: { parser.yyVAL.statement = &ast.AdminStmt{ Tp: ast.AdminShowDDLJobs, JobNumber: yyS[yypt-0].item.(int64), } } - case 1108: + case 1121: { parser.yyVAL.statement = &ast.AdminStmt{ Tp: ast.AdminShowNextRowID, Tables: []*ast.TableName{yyS[yypt-1].item.(*ast.TableName)}, } } - case 1109: + case 1122: { parser.yyVAL.statement = &ast.AdminStmt{ Tp: ast.AdminCheckTable, Tables: yyS[yypt-0].item.([]*ast.TableName), } } - case 1110: + case 1123: { parser.yyVAL.statement = &ast.AdminStmt{ Tp: ast.AdminCheckIndex, @@ -11445,7 +11547,7 @@ yynewstate: Index: string(yyS[yypt-0].ident), } } - case 1111: + case 1124: { parser.yyVAL.statement = &ast.AdminStmt{ Tp: ast.AdminRecoverIndex, @@ -11453,21 +11555,21 @@ yynewstate: Index: string(yyS[yypt-0].ident), } } - case 1112: + case 1125: { parser.yyVAL.statement = &ast.AdminStmt{ Tp: ast.AdminRestoreTable, JobIDs: []int64{yyS[yypt-0].item.(int64)}, } } - case 1113: + case 1126: { parser.yyVAL.statement = &ast.AdminStmt{ Tp: ast.AdminRestoreTable, Tables: []*ast.TableName{yyS[yypt-0].item.(*ast.TableName)}, } } - case 1114: + case 1127: { parser.yyVAL.statement = &ast.AdminStmt{ Tp: ast.AdminRestoreTable, @@ -11475,7 +11577,7 @@ yynewstate: JobNumber: yyS[yypt-0].item.(int64), } } - case 1115: + case 1128: { parser.yyVAL.statement = &ast.AdminStmt{ Tp: ast.AdminCleanupIndex, @@ -11483,7 +11585,7 @@ yynewstate: Index: string(yyS[yypt-0].ident), } } - case 1116: + case 1129: { parser.yyVAL.statement = &ast.AdminStmt{ Tp: ast.AdminCheckIndexRange, @@ -11492,42 +11594,42 @@ yynewstate: HandleRanges: yyS[yypt-0].item.([]ast.HandleRange), } } - case 1117: + case 1130: { parser.yyVAL.statement = &ast.AdminStmt{ Tp: ast.AdminChecksumTable, Tables: yyS[yypt-0].item.([]*ast.TableName), } } - case 1118: + case 1131: { parser.yyVAL.statement = &ast.AdminStmt{ Tp: ast.AdminCancelDDLJobs, JobIDs: yyS[yypt-0].item.([]int64), } } - case 1119: + case 1132: { parser.yyVAL.statement = &ast.AdminStmt{ Tp: ast.AdminShowDDLJobQueries, JobIDs: yyS[yypt-0].item.([]int64), } } - case 1120: + case 1133: { parser.yyVAL.statement = &ast.AdminStmt{ Tp: ast.AdminShowSlow, ShowSlow: yyS[yypt-0].item.(*ast.ShowSlow), } } - case 1121: + case 1134: { parser.yyVAL.item = &ast.ShowSlow{ Tp: ast.ShowSlowRecent, Count: getUint64FromNUM(yyS[yypt-0].item), } } - case 1122: + case 1135: { parser.yyVAL.item = &ast.ShowSlow{ Tp: ast.ShowSlowTop, @@ -11535,7 +11637,7 @@ yynewstate: Count: getUint64FromNUM(yyS[yypt-0].item), } } - case 1123: + case 1136: { parser.yyVAL.item = &ast.ShowSlow{ Tp: ast.ShowSlowTop, @@ -11543,7 +11645,7 @@ yynewstate: Count: getUint64FromNUM(yyS[yypt-0].item), } } - case 1124: + case 1137: { parser.yyVAL.item = &ast.ShowSlow{ Tp: ast.ShowSlowTop, @@ -11551,27 +11653,27 @@ yynewstate: Count: getUint64FromNUM(yyS[yypt-0].item), } } - case 1125: + case 1138: { parser.yyVAL.item = []ast.HandleRange{yyS[yypt-0].item.(ast.HandleRange)} } - case 1126: + case 1139: { parser.yyVAL.item = append(yyS[yypt-2].item.([]ast.HandleRange), yyS[yypt-0].item.(ast.HandleRange)) } - case 1127: + case 1140: { parser.yyVAL.item = ast.HandleRange{Begin: yyS[yypt-3].item.(int64), End: yyS[yypt-1].item.(int64)} } - case 1128: + case 1141: { parser.yyVAL.item = []int64{yyS[yypt-0].item.(int64)} } - case 1129: + case 1142: { parser.yyVAL.item = append(yyS[yypt-2].item.([]int64), yyS[yypt-0].item.(int64)) } - case 1130: + case 1143: { stmt := yyS[yypt-1].item.(*ast.ShowStmt) if yyS[yypt-0].item != nil { @@ -11583,21 +11685,21 @@ yynewstate: } parser.yyVAL.statement = stmt } - case 1131: + case 1144: { parser.yyVAL.statement = &ast.ShowStmt{ Tp: ast.ShowCreateTable, Table: yyS[yypt-0].item.(*ast.TableName), } } - case 1132: + case 1145: { parser.yyVAL.statement = &ast.ShowStmt{ Tp: ast.ShowCreateView, Table: yyS[yypt-0].item.(*ast.TableName), } } - case 1133: + case 1146: { parser.yyVAL.statement = &ast.ShowStmt{ Tp: ast.ShowCreateDatabase, @@ -11605,7 +11707,7 @@ yynewstate: DBName: yyS[yypt-0].item.(string), } } - case 1134: + case 1147: { // See https://dev.mysql.com/doc/refman/5.7/en/show-create-user.html parser.yyVAL.statement = &ast.ShowStmt{ @@ -11613,12 +11715,12 @@ yynewstate: User: yyS[yypt-0].item.(*auth.UserIdentity), } } - case 1135: + case 1148: { // See https://dev.mysql.com/doc/refman/5.7/en/show-grants.html parser.yyVAL.statement = &ast.ShowStmt{Tp: ast.ShowGrants} } - case 1136: + case 1149: { // See https://dev.mysql.com/doc/refman/5.7/en/show-grants.html parser.yyVAL.statement = &ast.ShowStmt{ @@ -11626,20 +11728,20 @@ yynewstate: User: yyS[yypt-0].item.(*auth.UserIdentity), } } - case 1137: + case 1150: { parser.yyVAL.statement = &ast.ShowStmt{ Tp: ast.ShowMasterStatus, } } - case 1138: + case 1151: { parser.yyVAL.statement = &ast.ShowStmt{ Tp: ast.ShowProcessList, Full: yyS[yypt-1].item.(bool), } } - case 1139: + case 1152: { stmt := &ast.ShowStmt{ Tp: ast.ShowStatsMeta, @@ -11653,7 +11755,7 @@ yynewstate: } parser.yyVAL.statement = stmt } - case 1140: + case 1153: { stmt := &ast.ShowStmt{ Tp: ast.ShowStatsHistograms, @@ -11667,7 +11769,7 @@ yynewstate: } parser.yyVAL.statement = stmt } - case 1141: + case 1154: { stmt := &ast.ShowStmt{ Tp: ast.ShowStatsBuckets, @@ -11681,7 +11783,7 @@ yynewstate: } parser.yyVAL.statement = stmt } - case 1142: + case 1155: { stmt := &ast.ShowStmt{ Tp: ast.ShowStatsHealthy, @@ -11695,31 +11797,31 @@ yynewstate: } parser.yyVAL.statement = stmt } - case 1143: + case 1156: { parser.yyVAL.statement = &ast.ShowStmt{ Tp: ast.ShowProfiles, } } - case 1144: + case 1157: { parser.yyVAL.statement = &ast.ShowStmt{ Tp: ast.ShowPrivileges, } } - case 1150: + case 1163: { parser.yyVAL.item = &ast.ShowStmt{Tp: ast.ShowEngines} } - case 1151: + case 1164: { parser.yyVAL.item = &ast.ShowStmt{Tp: ast.ShowDatabases} } - case 1152: + case 1165: { parser.yyVAL.item = &ast.ShowStmt{Tp: ast.ShowCharset} } - case 1153: + case 1166: { parser.yyVAL.item = &ast.ShowStmt{ Tp: ast.ShowTables, @@ -11727,21 +11829,21 @@ yynewstate: Full: yyS[yypt-2].item.(bool), } } - case 1154: + case 1167: { parser.yyVAL.item = &ast.ShowStmt{ Tp: ast.ShowTableStatus, DBName: yyS[yypt-0].item.(string), } } - case 1155: + case 1168: { parser.yyVAL.item = &ast.ShowStmt{ Tp: ast.ShowIndex, Table: yyS[yypt-0].item.(*ast.TableName), } } - case 1156: + case 1169: { show := &ast.ShowStmt{ Tp: ast.ShowIndex, @@ -11749,7 +11851,7 @@ yynewstate: } parser.yyVAL.item = show } - case 1157: + case 1170: { parser.yyVAL.item = &ast.ShowStmt{ Tp: ast.ShowColumns, @@ -11758,7 +11860,7 @@ yynewstate: Full: yyS[yypt-3].item.(bool), } } - case 1158: + case 1171: { // SHOW FIELDS is a synonym for SHOW COLUMNS. parser.yyVAL.item = &ast.ShowStmt{ @@ -11768,67 +11870,67 @@ yynewstate: Full: yyS[yypt-3].item.(bool), } } - case 1159: + case 1172: { parser.yyVAL.item = &ast.ShowStmt{Tp: ast.ShowWarnings} } - case 1160: + case 1173: { parser.yyVAL.item = &ast.ShowStmt{Tp: ast.ShowErrors} } - case 1161: + case 1174: { parser.yyVAL.item = &ast.ShowStmt{ Tp: ast.ShowVariables, GlobalScope: yyS[yypt-1].item.(bool), } } - case 1162: + case 1175: { parser.yyVAL.item = &ast.ShowStmt{ Tp: ast.ShowStatus, GlobalScope: yyS[yypt-1].item.(bool), } } - case 1163: + case 1176: { parser.yyVAL.item = &ast.ShowStmt{ Tp: ast.ShowBindings, GlobalScope: yyS[yypt-1].item.(bool), } } - case 1164: + case 1177: { parser.yyVAL.item = &ast.ShowStmt{ Tp: ast.ShowCollation, } } - case 1165: + case 1178: { parser.yyVAL.item = &ast.ShowStmt{ Tp: ast.ShowTriggers, DBName: yyS[yypt-0].item.(string), } } - case 1166: + case 1179: { parser.yyVAL.item = &ast.ShowStmt{ Tp: ast.ShowProcedureStatus, } } - case 1167: + case 1180: { parser.yyVAL.item = &ast.ShowStmt{ Tp: ast.ShowPumpStatus, } } - case 1168: + case 1181: { parser.yyVAL.item = &ast.ShowStmt{ Tp: ast.ShowDrainerStatus, } } - case 1169: + case 1182: { // 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 @@ -11838,100 +11940,100 @@ yynewstate: Tp: ast.ShowProcedureStatus, } } - case 1170: + case 1183: { parser.yyVAL.item = &ast.ShowStmt{ Tp: ast.ShowEvents, DBName: yyS[yypt-0].item.(string), } } - case 1171: + case 1184: { parser.yyVAL.item = &ast.ShowStmt{ Tp: ast.ShowPlugins, } } - case 1172: + case 1185: { parser.yyVAL.item = nil } - case 1173: + case 1186: { parser.yyVAL.item = &ast.PatternLikeExpr{ Pattern: yyS[yypt-0].expr, Escape: '\\', } } - case 1174: + case 1187: { parser.yyVAL.item = yyS[yypt-0].expr } - case 1175: + case 1188: { parser.yyVAL.item = false } - case 1176: + case 1189: { parser.yyVAL.item = true } - case 1177: + case 1190: { parser.yyVAL.item = false } - case 1178: + case 1191: { parser.yyVAL.item = false } - case 1179: + case 1192: { parser.yyVAL.item = true } - case 1180: + case 1193: { parser.yyVAL.item = "" } - case 1181: + case 1194: { parser.yyVAL.item = yyS[yypt-0].item.(string) } - case 1182: + case 1195: { parser.yyVAL.item = yyS[yypt-0].item.(*ast.TableName) } - case 1183: + case 1196: { tmp := yyS[yypt-0].item.(*ast.FlushStmt) tmp.NoWriteToBinLog = yyS[yypt-1].item.(bool) parser.yyVAL.statement = tmp } - case 1184: + case 1197: { parser.yyVAL.item = []string{yyS[yypt-0].ident} } - case 1185: + case 1198: { parser.yyVAL.item = append(yyS[yypt-2].item.([]string), yyS[yypt-0].ident) } - case 1186: + case 1199: { parser.yyVAL.item = &ast.FlushStmt{ Tp: ast.FlushPrivileges, } } - case 1187: + case 1200: { parser.yyVAL.item = &ast.FlushStmt{ Tp: ast.FlushStatus, } } - case 1188: + case 1201: { parser.yyVAL.item = &ast.FlushStmt{ Tp: ast.FlushTiDBPlugin, Plugins: yyS[yypt-0].item.([]string), } } - case 1189: + case 1202: { parser.yyVAL.item = &ast.FlushStmt{ Tp: ast.FlushTables, @@ -11939,41 +12041,41 @@ yynewstate: ReadLock: yyS[yypt-0].item.(bool), } } - case 1190: + case 1203: { parser.yyVAL.item = false } - case 1191: + case 1204: { parser.yyVAL.item = true } - case 1192: + case 1205: { parser.yyVAL.item = true } - case 1193: + case 1206: { parser.yyVAL.item = []*ast.TableName{} } - case 1194: + case 1207: { parser.yyVAL.item = yyS[yypt-0].item } - case 1195: + case 1208: { parser.yyVAL.item = false } - case 1196: + case 1209: { parser.yyVAL.item = true } - case 1245: + case 1258: { // `(select 1)`; is a valid select statement // TODO: This is used to fix issue #320. There may be a better solution. parser.yyVAL.statement = yyS[yypt-0].expr.(*ast.SubqueryExpr).Query.(ast.StmtNode) } - case 1264: + case 1277: { if yyS[yypt-0].statement != nil { s := yyS[yypt-0].statement @@ -11983,7 +12085,7 @@ yynewstate: parser.result = append(parser.result, s) } } - case 1265: + case 1278: { if yyS[yypt-0].statement != nil { s := yyS[yypt-0].statement @@ -11993,7 +12095,7 @@ yynewstate: parser.result = append(parser.result, s) } } - case 1266: + case 1279: { cst := yyS[yypt-0].item.(*ast.Constraint) if yyS[yypt-1].item != nil { @@ -12001,20 +12103,20 @@ yynewstate: } parser.yyVAL.item = cst } - case 1267: + case 1280: { parser.yyVAL.item = yyS[yypt-0].item.(*ast.ColumnDef) } - case 1268: + case 1281: { parser.yyVAL.item = yyS[yypt-0].item.(*ast.Constraint) } - case 1269: + case 1282: { /* Nothing to do now */ parser.yyVAL.item = nil } - case 1270: + case 1283: { if yyS[yypt-0].item != nil { parser.yyVAL.item = []interface{}{yyS[yypt-0].item.(interface{})} @@ -12022,7 +12124,7 @@ yynewstate: parser.yyVAL.item = []interface{}{} } } - case 1271: + case 1284: { if yyS[yypt-0].item != nil { parser.yyVAL.item = append(yyS[yypt-2].item.([]interface{}), yyS[yypt-0].item) @@ -12030,7 +12132,7 @@ yynewstate: parser.yyVAL.item = yyS[yypt-2].item } } - case 1272: + case 1285: { var columnDefs []*ast.ColumnDef var constraints []*ast.Constraint @@ -12039,7 +12141,7 @@ yynewstate: Constraints: constraints, } } - case 1273: + case 1286: { tes := yyS[yypt-1].item.([]interface{}) var columnDefs []*ast.ColumnDef @@ -12057,144 +12159,144 @@ yynewstate: Constraints: constraints, } } - case 1274: + case 1287: { parser.yyVAL.item = &ast.TableOption{Tp: ast.TableOptionEngine, StrValue: yyS[yypt-0].item.(string)} } - case 1275: + case 1288: { parser.yyVAL.item = &ast.TableOption{Tp: ast.TableOptionEngine, StrValue: yyS[yypt-0].item.(string)} } - case 1276: + case 1289: { parser.yyVAL.item = &ast.TableOption{Tp: ast.TableOptionCharset, StrValue: yyS[yypt-0].item.(string)} } - case 1277: + case 1290: { parser.yyVAL.item = &ast.TableOption{Tp: ast.TableOptionCollate, StrValue: yyS[yypt-0].item.(string)} } - case 1278: + case 1291: { parser.yyVAL.item = &ast.TableOption{Tp: ast.TableOptionAutoIncrement, UintValue: yyS[yypt-0].item.(uint64)} } - case 1279: + case 1292: { parser.yyVAL.item = &ast.TableOption{Tp: ast.TableOptionComment, StrValue: yyS[yypt-0].ident} } - case 1280: + case 1293: { parser.yyVAL.item = &ast.TableOption{Tp: ast.TableOptionAvgRowLength, UintValue: yyS[yypt-0].item.(uint64)} } - case 1281: + case 1294: { parser.yyVAL.item = &ast.TableOption{Tp: ast.TableOptionConnection, StrValue: yyS[yypt-0].ident} } - case 1282: + case 1295: { parser.yyVAL.item = &ast.TableOption{Tp: ast.TableOptionCheckSum, UintValue: yyS[yypt-0].item.(uint64)} } - case 1283: + case 1296: { parser.yyVAL.item = &ast.TableOption{Tp: ast.TableOptionPassword, StrValue: yyS[yypt-0].ident} } - case 1284: + case 1297: { parser.yyVAL.item = &ast.TableOption{Tp: ast.TableOptionCompression, StrValue: yyS[yypt-0].ident} } - case 1285: + case 1298: { parser.yyVAL.item = &ast.TableOption{Tp: ast.TableOptionKeyBlockSize, UintValue: yyS[yypt-0].item.(uint64)} } - case 1286: + case 1299: { parser.yyVAL.item = &ast.TableOption{Tp: ast.TableOptionMaxRows, UintValue: yyS[yypt-0].item.(uint64)} } - case 1287: + case 1300: { parser.yyVAL.item = &ast.TableOption{Tp: ast.TableOptionMinRows, UintValue: yyS[yypt-0].item.(uint64)} } - case 1288: + case 1301: { parser.yyVAL.item = &ast.TableOption{Tp: ast.TableOptionDelayKeyWrite, UintValue: yyS[yypt-0].item.(uint64)} } - case 1289: + case 1302: { parser.yyVAL.item = &ast.TableOption{Tp: ast.TableOptionRowFormat, UintValue: yyS[yypt-0].item.(uint64)} } - case 1290: + case 1303: { parser.yyVAL.item = &ast.TableOption{Tp: ast.TableOptionStatsPersistent} } - case 1291: + case 1304: { parser.yyVAL.item = &ast.TableOption{Tp: ast.TableOptionShardRowID, UintValue: yyS[yypt-0].item.(uint64)} } - case 1292: + case 1305: { // Parse it but will ignore it. parser.yyVAL.item = &ast.TableOption{Tp: ast.TableOptionPackKeys} } - case 1295: + case 1308: { parser.yyVAL.item = []*ast.TableOption{} } - case 1297: + case 1310: { parser.yyVAL.item = []*ast.TableOption{} } - case 1299: + case 1312: { parser.yyVAL.item = []*ast.TableOption{yyS[yypt-0].item.(*ast.TableOption)} } - case 1300: + case 1313: { parser.yyVAL.item = append(yyS[yypt-1].item.([]*ast.TableOption), yyS[yypt-0].item.(*ast.TableOption)) } - case 1301: + case 1314: { parser.yyVAL.item = append(yyS[yypt-2].item.([]*ast.TableOption), yyS[yypt-0].item.(*ast.TableOption)) } - case 1304: + case 1317: { parser.yyVAL.statement = &ast.TruncateTableStmt{Table: yyS[yypt-0].item.(*ast.TableName)} } - case 1305: + case 1318: { parser.yyVAL.item = ast.RowFormatDefault } - case 1306: + case 1319: { parser.yyVAL.item = ast.RowFormatDynamic } - case 1307: + case 1320: { parser.yyVAL.item = ast.RowFormatFixed } - case 1308: + case 1321: { parser.yyVAL.item = ast.RowFormatCompressed } - case 1309: + case 1322: { parser.yyVAL.item = ast.RowFormatRedundant } - case 1310: + case 1323: { parser.yyVAL.item = ast.RowFormatCompact } - case 1311: + case 1324: { parser.yyVAL.item = yyS[yypt-0].item } - case 1312: + case 1325: { parser.yyVAL.item = yyS[yypt-0].item } - case 1313: + case 1326: { parser.yyVAL.item = yyS[yypt-0].item } - case 1314: + case 1327: { // TODO: check flen 0 x := types.NewFieldType(yyS[yypt-2].item.(byte)) @@ -12209,7 +12311,7 @@ yynewstate: } parser.yyVAL.item = x } - case 1315: + case 1328: { // TODO: check flen 0 x := types.NewFieldType(yyS[yypt-1].item.(byte)) @@ -12224,7 +12326,7 @@ yynewstate: } parser.yyVAL.item = x } - case 1316: + case 1329: { fopt := yyS[yypt-1].item.(*ast.FloatOpt) x := types.NewFieldType(yyS[yypt-2].item.(byte)) @@ -12240,7 +12342,7 @@ yynewstate: } parser.yyVAL.item = x } - case 1317: + case 1330: { fopt := yyS[yypt-1].item.(*ast.FloatOpt) x := types.NewFieldType(yyS[yypt-2].item.(byte)) @@ -12261,7 +12363,7 @@ yynewstate: } parser.yyVAL.item = x } - case 1318: + case 1331: { x := types.NewFieldType(yyS[yypt-1].item.(byte)) x.Flen = yyS[yypt-0].item.(int) @@ -12272,71 +12374,71 @@ yynewstate: } parser.yyVAL.item = x } - case 1319: + case 1332: { parser.yyVAL.item = mysql.TypeTiny } - case 1320: + case 1333: { parser.yyVAL.item = mysql.TypeShort } - case 1321: + case 1334: { parser.yyVAL.item = mysql.TypeInt24 } - case 1322: + case 1335: { parser.yyVAL.item = mysql.TypeLong } - case 1323: + case 1336: { parser.yyVAL.item = mysql.TypeTiny } - case 1324: + case 1337: { parser.yyVAL.item = mysql.TypeShort } - case 1325: + case 1338: { parser.yyVAL.item = mysql.TypeInt24 } - case 1326: + case 1339: { parser.yyVAL.item = mysql.TypeLong } - case 1327: + case 1340: { parser.yyVAL.item = mysql.TypeLonglong } - case 1328: + case 1341: { parser.yyVAL.item = mysql.TypeLong } - case 1329: + case 1342: { parser.yyVAL.item = mysql.TypeLonglong } - case 1330: + case 1343: { parser.yyVAL.item = mysql.TypeTiny } - case 1331: + case 1344: { parser.yyVAL.item = mysql.TypeTiny } - case 1335: + case 1348: { parser.yyVAL.item = mysql.TypeNewDecimal } - case 1336: + case 1349: { parser.yyVAL.item = mysql.TypeNewDecimal } - case 1337: + case 1350: { parser.yyVAL.item = mysql.TypeFloat } - case 1338: + case 1351: { if parser.lexer.GetSQLMode().HasRealAsFloatMode() { parser.yyVAL.item = mysql.TypeFloat @@ -12344,19 +12446,19 @@ yynewstate: parser.yyVAL.item = mysql.TypeDouble } } - case 1339: + case 1352: { parser.yyVAL.item = mysql.TypeDouble } - case 1340: + case 1353: { parser.yyVAL.item = mysql.TypeDouble } - case 1341: + case 1354: { parser.yyVAL.item = mysql.TypeBit } - case 1342: + case 1355: { x := types.NewFieldType(mysql.TypeString) x.Flen = yyS[yypt-2].item.(int) @@ -12367,7 +12469,7 @@ yynewstate: } parser.yyVAL.item = x } - case 1343: + case 1356: { x := types.NewFieldType(mysql.TypeString) x.Charset = yyS[yypt-1].item.(*ast.OptBinary).Charset @@ -12377,7 +12479,7 @@ yynewstate: } parser.yyVAL.item = x } - case 1344: + case 1357: { x := types.NewFieldType(mysql.TypeString) x.Flen = yyS[yypt-2].item.(int) @@ -12388,7 +12490,7 @@ yynewstate: } parser.yyVAL.item = x } - case 1345: + case 1358: { x := types.NewFieldType(mysql.TypeVarchar) x.Flen = yyS[yypt-2].item.(int) @@ -12399,7 +12501,7 @@ yynewstate: } parser.yyVAL.item = x } - case 1346: + case 1359: { x := types.NewFieldType(mysql.TypeString) x.Flen = yyS[yypt-0].item.(int) @@ -12408,7 +12510,7 @@ yynewstate: x.Flag |= mysql.BinaryFlag parser.yyVAL.item = x } - case 1347: + case 1360: { x := types.NewFieldType(mysql.TypeVarchar) x.Flen = yyS[yypt-0].item.(int) @@ -12417,7 +12519,7 @@ yynewstate: x.Flag |= mysql.BinaryFlag parser.yyVAL.item = x } - case 1348: + case 1361: { x := yyS[yypt-0].item.(*types.FieldType) x.Charset = mysql.CharsetBin @@ -12425,7 +12527,7 @@ yynewstate: x.Flag |= mysql.BinaryFlag parser.yyVAL.item = yyS[yypt-0].item.(*types.FieldType) } - case 1349: + case 1362: { x := yyS[yypt-2].item.(*types.FieldType) x.Charset = yyS[yypt-1].item.(*ast.OptBinary).Charset @@ -12435,7 +12537,7 @@ yynewstate: } parser.yyVAL.item = x } - case 1350: + case 1363: { x := types.NewFieldType(mysql.TypeEnum) x.Elems = yyS[yypt-3].item.([]string) @@ -12443,7 +12545,7 @@ yynewstate: x.Collate = yyS[yypt-0].item.(string) parser.yyVAL.item = x } - case 1351: + case 1364: { x := types.NewFieldType(mysql.TypeSet) x.Elems = yyS[yypt-3].item.([]string) @@ -12451,7 +12553,7 @@ yynewstate: x.Collate = yyS[yypt-0].item.(string) parser.yyVAL.item = x } - case 1352: + case 1365: { x := types.NewFieldType(mysql.TypeJSON) x.Decimal = 0 @@ -12459,60 +12561,60 @@ yynewstate: x.Collate = mysql.CollationBin parser.yyVAL.item = x } - case 1358: + case 1371: { x := types.NewFieldType(mysql.TypeTinyBlob) parser.yyVAL.item = x } - case 1359: + case 1372: { x := types.NewFieldType(mysql.TypeBlob) x.Flen = yyS[yypt-0].item.(int) parser.yyVAL.item = x } - case 1360: + case 1373: { x := types.NewFieldType(mysql.TypeMediumBlob) parser.yyVAL.item = x } - case 1361: + case 1374: { x := types.NewFieldType(mysql.TypeLongBlob) parser.yyVAL.item = x } - case 1362: + case 1375: { x := types.NewFieldType(mysql.TypeTinyBlob) parser.yyVAL.item = x } - case 1363: + case 1376: { x := types.NewFieldType(mysql.TypeBlob) x.Flen = yyS[yypt-0].item.(int) parser.yyVAL.item = x } - case 1364: + case 1377: { x := types.NewFieldType(mysql.TypeMediumBlob) parser.yyVAL.item = x } - case 1365: + case 1378: { x := types.NewFieldType(mysql.TypeLongBlob) parser.yyVAL.item = x } - case 1366: + case 1379: { x := types.NewFieldType(mysql.TypeMediumBlob) parser.yyVAL.item = x } - case 1367: + case 1380: { x := types.NewFieldType(mysql.TypeDate) parser.yyVAL.item = x } - case 1368: + case 1381: { x := types.NewFieldType(mysql.TypeDatetime) x.Flen = mysql.MaxDatetimeWidthNoFsp @@ -12522,7 +12624,7 @@ yynewstate: } parser.yyVAL.item = x } - case 1369: + case 1382: { x := types.NewFieldType(mysql.TypeTimestamp) x.Flen = mysql.MaxDatetimeWidthNoFsp @@ -12532,7 +12634,7 @@ yynewstate: } parser.yyVAL.item = x } - case 1370: + case 1383: { x := types.NewFieldType(mysql.TypeDuration) x.Flen = mysql.MaxDurationWidthNoFsp @@ -12542,7 +12644,7 @@ yynewstate: } parser.yyVAL.item = x } - case 1371: + case 1384: { x := types.NewFieldType(mysql.TypeYear) x.Flen = yyS[yypt-1].item.(int) @@ -12552,116 +12654,116 @@ yynewstate: } parser.yyVAL.item = x } - case 1372: + case 1385: { parser.yyVAL.item = int(yyS[yypt-1].item.(uint64)) } - case 1373: + case 1386: { parser.yyVAL.item = types.UnspecifiedLength } - case 1374: + case 1387: { parser.yyVAL.item = yyS[yypt-0].item.(int) } - case 1375: + case 1388: { parser.yyVAL.item = &ast.TypeOpt{IsUnsigned: true} } - case 1376: + case 1389: { parser.yyVAL.item = &ast.TypeOpt{IsUnsigned: false} } - case 1377: + case 1390: { parser.yyVAL.item = &ast.TypeOpt{IsZerofill: true, IsUnsigned: true} } - case 1378: + case 1391: { parser.yyVAL.item = []*ast.TypeOpt{} } - case 1379: + case 1392: { parser.yyVAL.item = append(yyS[yypt-1].item.([]*ast.TypeOpt), yyS[yypt-0].item.(*ast.TypeOpt)) } - case 1380: + case 1393: { parser.yyVAL.item = &ast.FloatOpt{Flen: types.UnspecifiedLength, Decimal: types.UnspecifiedLength} } - case 1381: + case 1394: { parser.yyVAL.item = &ast.FloatOpt{Flen: yyS[yypt-0].item.(int), Decimal: types.UnspecifiedLength} } - case 1382: + case 1395: { parser.yyVAL.item = yyS[yypt-0].item.(*ast.FloatOpt) } - case 1383: + case 1396: { parser.yyVAL.item = &ast.FloatOpt{Flen: int(yyS[yypt-3].item.(uint64)), Decimal: int(yyS[yypt-1].item.(uint64))} } - case 1384: + case 1397: { parser.yyVAL.item = false } - case 1385: + case 1398: { parser.yyVAL.item = true } - case 1386: + case 1399: { parser.yyVAL.item = &ast.OptBinary{ IsBinary: false, Charset: "", } } - case 1387: + case 1400: { parser.yyVAL.item = &ast.OptBinary{ IsBinary: true, Charset: yyS[yypt-0].item.(string), } } - case 1388: + case 1401: { parser.yyVAL.item = &ast.OptBinary{ IsBinary: yyS[yypt-0].item.(bool), Charset: yyS[yypt-1].item.(string), } } - case 1389: + case 1402: { parser.yyVAL.item = "" } - case 1390: + case 1403: { parser.yyVAL.item = yyS[yypt-0].item.(string) } - case 1393: + case 1406: { parser.yyVAL.item = "" } - case 1394: + case 1407: { parser.yyVAL.item = yyS[yypt-0].item.(string) } - case 1395: + case 1408: { parser.yyVAL.item = []string{yyS[yypt-0].ident} } - case 1396: + case 1409: { parser.yyVAL.item = append(yyS[yypt-2].item.([]string), yyS[yypt-0].ident) } - case 1397: + case 1410: { parser.yyVAL.item = yyS[yypt-0].ident } - case 1398: + case 1411: { parser.yyVAL.item = yyS[yypt-0].ident } - case 1399: + case 1412: { var refs *ast.Join if x, ok := yyS[yypt-5].item.(*ast.Join); ok { @@ -12689,7 +12791,7 @@ yynewstate: } parser.yyVAL.statement = st } - case 1400: + case 1413: { st := &ast.UpdateStmt{ Priority: yyS[yypt-5].item.(mysql.PriorityEnum), @@ -12705,23 +12807,23 @@ yynewstate: } parser.yyVAL.statement = st } - case 1401: + case 1414: { parser.yyVAL.statement = &ast.UseStmt{DBName: yyS[yypt-0].item.(string)} } - case 1402: + case 1415: { parser.yyVAL.item = yyS[yypt-0].expr } - case 1403: + case 1416: { parser.yyVAL.item = nil } - case 1404: + case 1417: { parser.yyVAL.item = yyS[yypt-0].item } - case 1407: + case 1420: { // See https://dev.mysql.com/doc/refman/5.7/en/create-user.html parser.yyVAL.statement = &ast.CreateUserStmt{ @@ -12730,7 +12832,7 @@ yynewstate: Specs: yyS[yypt-0].item.([]*ast.UserSpec), } } - case 1408: + case 1421: { // See https://dev.mysql.com/doc/refman/8.0/en/create-role.html parser.yyVAL.statement = &ast.CreateUserStmt{ @@ -12739,14 +12841,14 @@ yynewstate: Specs: yyS[yypt-0].item.([]*ast.UserSpec), } } - case 1409: + case 1422: { parser.yyVAL.statement = &ast.AlterUserStmt{ IfExists: yyS[yypt-1].item.(bool), Specs: yyS[yypt-0].item.([]*ast.UserSpec), } } - case 1410: + case 1423: { auth := &ast.AuthOption{ AuthString: yyS[yypt-0].item.(string), @@ -12757,7 +12859,7 @@ yynewstate: CurrentAuth: auth, } } - case 1411: + case 1424: { userSpec := &ast.UserSpec{ User: yyS[yypt-1].item.(*auth.UserIdentity), @@ -12767,53 +12869,53 @@ yynewstate: } parser.yyVAL.item = userSpec } - case 1412: + case 1425: { parser.yyVAL.item = []*ast.UserSpec{yyS[yypt-0].item.(*ast.UserSpec)} } - case 1413: + case 1426: { parser.yyVAL.item = append(yyS[yypt-2].item.([]*ast.UserSpec), yyS[yypt-0].item.(*ast.UserSpec)) } - case 1414: + case 1427: { parser.yyVAL.item = nil } - case 1415: + case 1428: { parser.yyVAL.item = &ast.AuthOption{ AuthString: yyS[yypt-0].item.(string), ByAuthString: true, } } - case 1416: + case 1429: { parser.yyVAL.item = nil } - case 1417: + case 1430: { parser.yyVAL.item = &ast.AuthOption{ AuthString: yyS[yypt-0].item.(string), ByAuthString: true, } } - case 1418: + case 1431: { parser.yyVAL.item = &ast.AuthOption{ HashString: yyS[yypt-0].item.(string), } } - case 1419: + case 1432: { parser.yyVAL.item = &ast.AuthOption{ HashString: yyS[yypt-0].item.(string), } } - case 1420: + case 1433: { parser.yyVAL.item = yyS[yypt-0].ident } - case 1421: + case 1434: { role := yyS[yypt-0].item.(*auth.RoleIdentity) roleSpec := &ast.UserSpec{ @@ -12825,15 +12927,15 @@ yynewstate: } parser.yyVAL.item = roleSpec } - case 1422: + case 1435: { parser.yyVAL.item = []*ast.UserSpec{yyS[yypt-0].item.(*ast.UserSpec)} } - case 1423: + case 1436: { parser.yyVAL.item = append(yyS[yypt-2].item.([]*ast.UserSpec), yyS[yypt-0].item.(*ast.UserSpec)) } - case 1424: + case 1437: { startOffset := parser.startOffset(&yyS[yypt-2]) endOffset := parser.startOffset(&yyS[yypt-1]) @@ -12852,7 +12954,7 @@ yynewstate: parser.yyVAL.statement = x } - case 1425: + case 1438: { startOffset := parser.startOffset(&yyS[yypt]) selStmt := yyS[yypt-0].statement.(*ast.SelectStmt) @@ -12865,7 +12967,7 @@ yynewstate: parser.yyVAL.statement = x } - case 1426: + case 1439: { parser.yyVAL.statement = &ast.GrantStmt{ Privs: yyS[yypt-6].item.([]*ast.PrivElem), @@ -12875,203 +12977,203 @@ yynewstate: WithGrant: yyS[yypt-0].item.(bool), } } - case 1428: + case 1441: { parser.yyVAL.item = false } - case 1429: + case 1442: { parser.yyVAL.item = true } - case 1430: + case 1443: { parser.yyVAL.item = false } - case 1431: + case 1444: { parser.yyVAL.item = false } - case 1432: + case 1445: { parser.yyVAL.item = false } - case 1433: + case 1446: { parser.yyVAL.item = false } - case 1434: + case 1447: { parser.yyVAL.item = &ast.PrivElem{ Priv: yyS[yypt-0].item.(mysql.PrivilegeType), } } - case 1435: + case 1448: { parser.yyVAL.item = &ast.PrivElem{ Priv: yyS[yypt-3].item.(mysql.PrivilegeType), Cols: yyS[yypt-1].item.([]*ast.ColumnName), } } - case 1436: + case 1449: { parser.yyVAL.item = []*ast.PrivElem{yyS[yypt-0].item.(*ast.PrivElem)} } - case 1437: + case 1450: { parser.yyVAL.item = append(yyS[yypt-2].item.([]*ast.PrivElem), yyS[yypt-0].item.(*ast.PrivElem)) } - case 1438: + case 1451: { parser.yyVAL.item = mysql.AllPriv } - case 1439: + case 1452: { parser.yyVAL.item = mysql.AllPriv } - case 1440: + case 1453: { parser.yyVAL.item = mysql.AlterPriv } - case 1441: + case 1454: { parser.yyVAL.item = mysql.CreatePriv } - case 1442: + case 1455: { parser.yyVAL.item = mysql.CreateUserPriv } - case 1443: + case 1456: { parser.yyVAL.item = mysql.TriggerPriv } - case 1444: + case 1457: { parser.yyVAL.item = mysql.DeletePriv } - case 1445: + case 1458: { parser.yyVAL.item = mysql.DropPriv } - case 1446: + case 1459: { parser.yyVAL.item = mysql.ProcessPriv } - case 1447: + case 1460: { parser.yyVAL.item = mysql.ExecutePriv } - case 1448: + case 1461: { parser.yyVAL.item = mysql.IndexPriv } - case 1449: + case 1462: { parser.yyVAL.item = mysql.InsertPriv } - case 1450: + case 1463: { parser.yyVAL.item = mysql.SelectPriv } - case 1451: + case 1464: { parser.yyVAL.item = mysql.SuperPriv } - case 1452: + case 1465: { parser.yyVAL.item = mysql.ShowDBPriv } - case 1453: + case 1466: { parser.yyVAL.item = mysql.UpdatePriv } - case 1454: + case 1467: { parser.yyVAL.item = mysql.GrantPriv } - case 1455: + case 1468: { parser.yyVAL.item = mysql.ReferencesPriv } - case 1456: + case 1469: { parser.yyVAL.item = mysql.PrivilegeType(0) } - case 1457: + case 1470: { parser.yyVAL.item = mysql.PrivilegeType(0) } - case 1458: + case 1471: { parser.yyVAL.item = mysql.PrivilegeType(0) } - case 1459: + case 1472: { parser.yyVAL.item = mysql.PrivilegeType(0) } - case 1460: + case 1473: { parser.yyVAL.item = mysql.PrivilegeType(0) } - case 1461: + case 1474: { parser.yyVAL.item = mysql.PrivilegeType(0) } - case 1462: + case 1475: { parser.yyVAL.item = mysql.CreateViewPriv } - case 1463: + case 1476: { parser.yyVAL.item = mysql.ShowViewPriv } - case 1464: + case 1477: { parser.yyVAL.item = mysql.CreateRolePriv } - case 1465: + case 1478: { parser.yyVAL.item = mysql.DropRolePriv } - case 1466: + case 1479: { parser.yyVAL.item = mysql.PrivilegeType(0) } - case 1467: + case 1480: { parser.yyVAL.item = mysql.PrivilegeType(0) } - case 1468: + case 1481: { parser.yyVAL.item = mysql.PrivilegeType(0) } - case 1469: + case 1482: { parser.yyVAL.item = ast.ObjectTypeNone } - case 1470: + case 1483: { parser.yyVAL.item = ast.ObjectTypeTable } - case 1471: + case 1484: { parser.yyVAL.item = &ast.GrantLevel{ Level: ast.GrantLevelDB, } } - case 1472: + case 1485: { parser.yyVAL.item = &ast.GrantLevel{ Level: ast.GrantLevelGlobal, } } - case 1473: + case 1486: { parser.yyVAL.item = &ast.GrantLevel{ Level: ast.GrantLevelDB, DBName: yyS[yypt-2].ident, } } - case 1474: + case 1487: { parser.yyVAL.item = &ast.GrantLevel{ Level: ast.GrantLevelTable, @@ -13079,14 +13181,14 @@ yynewstate: TableName: yyS[yypt-0].ident, } } - case 1475: + case 1488: { parser.yyVAL.item = &ast.GrantLevel{ Level: ast.GrantLevelTable, TableName: yyS[yypt-0].ident, } } - case 1476: + case 1489: { parser.yyVAL.statement = &ast.RevokeStmt{ Privs: yyS[yypt-5].item.([]*ast.PrivElem), @@ -13095,7 +13197,7 @@ yynewstate: Users: yyS[yypt-0].item.([]*ast.UserSpec), } } - case 1478: + case 1491: { x := &ast.LoadDataStmt{ Path: yyS[yypt-8].ident, @@ -13114,23 +13216,23 @@ yynewstate: } parser.yyVAL.statement = x } - case 1479: + case 1492: { parser.yyVAL.item = uint64(0) } - case 1480: + case 1493: { parser.yyVAL.item = getUint64FromNUM(yyS[yypt-1].item) } - case 1483: + case 1496: { parser.yyVAL.item = nil } - case 1484: + case 1497: { parser.yyVAL.item = yyS[yypt-0].ident } - case 1485: + case 1498: { escape := "\\" parser.yyVAL.item = &ast.FieldsClause{ @@ -13138,7 +13240,7 @@ yynewstate: Escaped: escape[0], } } - case 1486: + case 1499: { escape := yyS[yypt-0].item.(string) if escape != "\\" && len(escape) > 1 { @@ -13163,73 +13265,114 @@ yynewstate: Escaped: escaped, } } - case 1489: + case 1502: { parser.yyVAL.item = "\t" } - case 1490: + case 1503: { parser.yyVAL.item = yyS[yypt-0].ident } - case 1491: + case 1504: { parser.yyVAL.item = "" } - case 1492: + case 1505: { parser.yyVAL.item = yyS[yypt-0].ident } - case 1493: + case 1506: { parser.yyVAL.item = yyS[yypt-0].ident } - case 1494: + case 1507: { parser.yyVAL.item = "\\" } - case 1495: + case 1508: { parser.yyVAL.item = yyS[yypt-0].ident } - case 1496: + case 1509: { parser.yyVAL.item = &ast.LinesClause{Terminated: "\n"} } - case 1497: + case 1510: { parser.yyVAL.item = &ast.LinesClause{Starting: yyS[yypt-1].item.(string), Terminated: yyS[yypt-0].item.(string)} } - case 1498: + case 1511: { parser.yyVAL.item = "" } - case 1499: + case 1512: { parser.yyVAL.item = yyS[yypt-0].ident } - case 1500: + case 1513: { parser.yyVAL.item = "\n" } - case 1501: + case 1514: { parser.yyVAL.item = yyS[yypt-0].ident } - case 1512: + case 1515: + { + parser.yyVAL.statement = &ast.UnlockTablesStmt{} + } + case 1516: + { + parser.yyVAL.statement = &ast.LockTablesStmt{ + TableLocks: yyS[yypt-0].item.([]ast.TableLock), + } + } + case 1519: + { + parser.yyVAL.item = ast.TableLock{ + Table: yyS[yypt-1].item.(*ast.TableName), + Type: yyS[yypt-0].item.(model.TableLockType), + } + } + case 1520: + { + parser.yyVAL.item = model.TableLockRead + } + case 1521: + { + parser.yyVAL.item = model.TableLockReadLocal + } + case 1522: + { + parser.yyVAL.item = model.TableLockWrite + } + case 1523: + { + parser.yyVAL.item = model.TableLockWriteLocal + } + case 1524: + { + parser.yyVAL.item = []ast.TableLock{yyS[yypt-0].item.(ast.TableLock)} + } + case 1525: + { + parser.yyVAL.item = append(yyS[yypt-2].item.([]ast.TableLock), yyS[yypt-0].item.(ast.TableLock)) + } + case 1526: { parser.yyVAL.statement = &ast.KillStmt{ ConnectionID: getUint64FromNUM(yyS[yypt-0].item), TiDBExtension: yyS[yypt-1].item.(bool), } } - case 1513: + case 1527: { parser.yyVAL.statement = &ast.KillStmt{ ConnectionID: getUint64FromNUM(yyS[yypt-0].item), TiDBExtension: yyS[yypt-2].item.(bool), } } - case 1514: + case 1528: { parser.yyVAL.statement = &ast.KillStmt{ ConnectionID: getUint64FromNUM(yyS[yypt-0].item), @@ -13237,15 +13380,15 @@ yynewstate: TiDBExtension: yyS[yypt-2].item.(bool), } } - case 1515: + case 1529: { parser.yyVAL.item = false } - case 1516: + case 1530: { parser.yyVAL.item = true } - case 1517: + case 1531: { parser.yyVAL.statement = &ast.LoadStatsStmt{ Path: yyS[yypt-0].ident, diff --git a/parser/parser.y b/parser/parser.y index 5858cd8c..4b508f50 100644 --- a/parser/parser.y +++ b/parser/parser.y @@ -335,6 +335,7 @@ import ( jsonType "JSON" keyBlockSize "KEY_BLOCK_SIZE" local "LOCAL" + locked "LOCKED" last "LAST" less "LESS" level "LEVEL" @@ -381,6 +382,7 @@ import ( reverse "REVERSE" role "ROLE" rollback "ROLLBACK" + rollup "ROLLUP" routine "ROUTINE" rowCount "ROW_COUNT" rowFormat "ROW_FORMAT" @@ -392,7 +394,9 @@ import ( session "SESSION" share "SHARE" shared "SHARED" + nowait "NOWAIT" signed "SIGNED" + skip "SKIP" slave "SLAVE" slow "SLOW" snapshot "SNAPSHOT" @@ -623,7 +627,7 @@ import ( ShowStmt "Show engines/databases/tables/user/columns/warnings/status statement" Statement "statement" TraceStmt "TRACE statement" - TraceableStmt "traceable statment" + TraceableStmt "traceable statement" TruncateTableStmt "TRUNCATE TABLE statement" UnlockTablesStmt "Unlock tables statement" UpdateStmt "UPDATE statement" @@ -814,6 +818,7 @@ import ( TableRefs "table references" TableToTable "rename table to table" TableToTableList "rename table to table by list" + LockType "Table locks type" TransactionChar "Transaction characteristic" TransactionChars "Transaction characteristic list" @@ -842,6 +847,7 @@ import ( WhenClause "When clause" WhenClauseList "When clause list" WithReadLockOpt "With Read Lock opt" + WithRollUpOpt "WITH ROLLUP or empty" WithGrantOptionOpt "With Grant Option opt" ElseOpt "Optional else clause" Type "Types" @@ -935,7 +941,6 @@ import ( NationalOpt "National option" CharsetKw "charset or charater set" CommaOpt "optional comma" - LockType "Table locks type" logAnd "logical and operator" logOr "logical or operator" FieldsOrColumns "Fields or columns" @@ -954,7 +959,8 @@ import ( FunctionNameDateArithMultiForms "Date arith function call names (adddate or subdate)" %precedence empty - +%precedence lowerThanWith +%precedence with %precedence sqlCache sqlNoCache %precedence lowerThanIntervalKeyword %precedence interval @@ -992,6 +998,7 @@ import ( %right collate %precedence '(' +%precedence ')' %precedence quick %precedence escape %precedence lowerThanComma @@ -1613,8 +1620,7 @@ ColumnOption: } | "ON" "UPDATE" NowSymOptionFraction { - nowFunc := &ast.FuncCallExpr{FnName: model.NewCIStr("CURRENT_TIMESTAMP")} - $$ = &ast.ColumnOption{Tp: ast.ColumnOptionOnUpdate, Expr: nowFunc} + $$ = &ast.ColumnOption{Tp: ast.ColumnOptionOnUpdate, Expr: $3} } | "COMMENT" stringLit { @@ -2965,9 +2971,9 @@ FieldList: } GroupByClause: - "GROUP" "BY" ByList + "GROUP" "BY" ByList WithRollUpOpt { - $$ = &ast.GroupByClause{Items: $3.([]*ast.ByItem)} + $$ = &ast.GroupByClause{Items: $3.([]*ast.ByItem), WithRollup: $4.(bool)} } HavingClause: @@ -2979,6 +2985,15 @@ HavingClause: $$ = &ast.HavingClause{Expr: $2} } +WithRollUpOpt: + { + $$ = false + } %prec lowerThanWith +| "WITH" "ROLLUP" + { + $$ = true + } + IfExists: { $$ = false @@ -3098,6 +3113,7 @@ UnReservedKeyword: | "NONE" | "NULLS" | "SUPER" | "EXCLUSIVE" | "STATS_PERSISTENT" | "ROW_COUNT" | "COALESCE" | "MONTH" | "PROCESS" | "PROFILES" | "MICROSECOND" | "MINUTE" | "PLUGINS" | "PRECEDING" | "QUERY" | "QUERIES" | "SECOND" | "SEPARATOR" | "SHARE" | "SHARED" | "SLOW" | "MAX_CONNECTIONS_PER_HOUR" | "MAX_QUERIES_PER_HOUR" | "MAX_UPDATES_PER_HOUR" | "MAX_USER_CONNECTIONS" | "REPLICATION" | "CLIENT" | "SLAVE" | "RELOAD" | "TEMPORARY" | "ROUTINE" | "EVENT" | "ALGORITHM" | "DEFINER" | "INVOKER" | "MERGE" | "TEMPTABLE" | "UNDEFINED" | "SECURITY" | "CASCADED" | "RECOVER" +| "ROLLUP" | "NOWAIT" | "SKIP" | "LOCKED" @@ -3565,7 +3581,7 @@ SimpleExpr: { $$ = &ast.UnaryOperationExpr{Op: opcode.Not, V: $2} } -| SubSelect +| SubSelect %prec neg | '(' Expression ')' { startOffset := parser.startOffset(&yyS[yypt-1]) endOffset := parser.endOffset(&yyS[yypt]) @@ -3783,20 +3799,20 @@ FunctionCallKeyword: } | "CHAR" '(' ExpressionList ')' { - nilVal := ast.NewValueExpr(nil) args := $3.([]ast.ExprNode) $$ = &ast.FuncCallExpr{ - FnName: model.NewCIStr(ast.CharFunc), - Args: append(args, nilVal), + FnName: model.NewCIStr($1), + Args: append(args), } } | "CHAR" '(' ExpressionList "USING" StringName ')' { + using := ast.NewValueExpr("USING") charset1 := ast.NewValueExpr($5) args := $3.([]ast.ExprNode) $$ = &ast.FuncCallExpr{ - FnName: model.NewCIStr(ast.CharFunc), - Args: append(args, charset1), + FnName: model.NewCIStr($1), + Args: append(args,using,charset1), } } | "DATE" stringLit @@ -3824,7 +3840,7 @@ FunctionCallKeyword: } | "PASSWORD" '(' ExpressionListOpt ')' { - $$ = &ast.FuncCallExpr{FnName:model.NewCIStr(ast.PasswordFunc), Args: $3.([]ast.ExprNode)} + $$ = &ast.FuncCallExpr{FnName:model.NewCIStr($1), Args: $3.([]ast.ExprNode)} } | '{' ODBCDateTimeType stringLit '}' { @@ -4617,6 +4633,7 @@ SelectStmtBasic: Distinct: $2.(*ast.SelectStmtOpts).Distinct, Fields: $3.(*ast.FieldList), } + $$ = st } @@ -5083,16 +5100,10 @@ TableFactor: tn.IndexHints = $4.([]*ast.IndexHint) $$ = &ast.TableSource{Source: tn, AsName: $3.(model.CIStr)} } -| '(' SelectStmt ')' TableAsName +| SubSelect TableAsName { - st := $2.(*ast.SelectStmt) - endOffset := parser.endOffset(&yyS[yypt-1]) - parser.setLastSelectFieldText(st, endOffset) - $$ = &ast.TableSource{Source: $2.(*ast.SelectStmt), AsName: $4.(model.CIStr)} - } -| '(' UnionStmt ')' TableAsName - { - $$ = &ast.TableSource{Source: $2.(*ast.UnionStmt), AsName: $4.(model.CIStr)} + resultNode := $1.(*ast.SubqueryExpr).Query + $$ = &ast.TableSource{Source: resultNode, AsName: $2.(model.CIStr)} } | '(' TableRefs ')' { @@ -5386,6 +5397,10 @@ TableOptimizerHintOpt: { $$ = &ast.TableOptimizerHint{HintName: model.NewCIStr($1), MaxExecutionTime: getUint64FromNUM($3)} } +| master + { + $$ = &ast.TableOptimizerHint{HintName: model.NewCIStr($1)} + } SelectStmtCalcFoundRows: { @@ -5451,6 +5466,29 @@ SubSelect: s.SetText(src[yyS[yypt-1].offset:yyS[yypt].offset]) $$ = &ast.SubqueryExpr{Query: s} } +| '(' SubSelect ')' + { + subQuery := $2.(*ast.SubqueryExpr).Query + isRecursive := true + // remove redundant brackets like '((select 1))' + for isRecursive { + if _, isRecursive = subQuery.(*ast.SubqueryExpr); isRecursive { + subQuery = subQuery.(*ast.SubqueryExpr).Query + } + } + switch rs := subQuery.(type) { + case *ast.SelectStmt: + endOffset := parser.endOffset(&yyS[yypt]) + parser.setLastSelectFieldText(rs, endOffset) + src := parser.src + rs.SetText(src[yyS[yypt-1].offset:yyS[yypt].offset]) + $$ = &ast.SubqueryExpr{Query: rs} + case *ast.UnionStmt: + src := parser.src + rs.SetText(src[yyS[yypt-1].offset:yyS[yypt].offset]) + $$ = &ast.SubqueryExpr{Query: rs} + } + } // See https://dev.mysql.com/doc/refman/5.7/en/innodb-locking-reads.html SelectLockOpt: @@ -5459,9 +5497,29 @@ SelectLockOpt: $$ = ast.SelectLockNone } | "FOR" "UPDATE" - { - $$ = ast.SelectLockForUpdate - } + { + $$ = ast.SelectLockForUpdate + } +| "FOR" "SHARE" + { + $$ = ast.SelectLockForShare + } +| "FOR" "UPDATE" "NOWAIT" + { + $$ = ast.SelectLockForUpdateNoWait + } +| "FOR" "SHARE" "NOWAIT" + { + $$ = ast.SelectLockForShareNoWait + } +| "FOR" "UPDATE" "SKIP" "LOCKED" + { + $$ = ast.SelectLockForUpdateSkipLocked + } +| "FOR" "SHARE" "SKIP" "LOCKED" + { + $$ = ast.SelectLockForShareSkipLocked + } | "LOCK" "IN" "SHARE" "MODE" { $$ = ast.SelectLockInShareMode @@ -5726,6 +5784,10 @@ SetExpr: { $$ = ast.NewValueExpr("ON") } +| "BINARY" + { + $$ = ast.NewValueExpr("BINARY") + } | ExprOrDefault VariableAssignment: @@ -8065,11 +8127,18 @@ LinesTerminated: *********************************************************************/ UnlockTablesStmt: - "UNLOCK" TablesTerminalSym {} + "UNLOCK" TablesTerminalSym + { + $$ = &ast.UnlockTablesStmt{} + } LockTablesStmt: "LOCK" TablesTerminalSym TableLockList - {} + { + $$ = &ast.LockTablesStmt{ + TableLocks: $3.([]ast.TableLock), + } + } TablesTerminalSym: "TABLES" @@ -8077,15 +8146,40 @@ TablesTerminalSym: TableLock: TableName LockType + { + $$ = ast.TableLock{ + Table: $1.(*ast.TableName), + Type: $2.(model.TableLockType), + } + } LockType: "READ" + { + $$ = model.TableLockRead + } | "READ" "LOCAL" + { + $$ = model.TableLockReadLocal + } | "WRITE" + { + $$ = model.TableLockWrite + } +| "WRITE" "LOCAL" + { + $$ = model.TableLockWriteLocal + } TableLockList: TableLock + { + $$ = []ast.TableLock{$1.(ast.TableLock)} + } | TableLockList ',' TableLock + { + $$ = append($1.([]ast.TableLock), $3.(ast.TableLock)) + } /******************************************************************** diff --git a/parser/parser_test.go b/parser/parser_test.go index 85b6e542..3aa7b2e0 100755 --- a/parser/parser_test.go +++ b/parser/parser_test.go @@ -11,7 +11,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -package parser +package parser_test import ( "fmt" @@ -21,8 +21,10 @@ import ( . "github.com/pingcap/check" "github.com/pingcap/errors" + "github.com/stretchr/testify/require" "github.com/XiaoMi/Gaea/mysql" + "github.com/XiaoMi/Gaea/parser" "github.com/XiaoMi/Gaea/parser/ast" . "github.com/XiaoMi/Gaea/parser/format" "github.com/XiaoMi/Gaea/parser/model" @@ -36,14 +38,8 @@ func TestT(t *testing.T) { TestingT(t) } -var _ = Suite(&testParserSuite{}) - -type testParserSuite struct { - enableWindowFunc bool -} - -func (s *testParserSuite) TestSimple(c *C) { - parser := New() +func TestSimple(t *testing.T) { + parser := parser.New() reservedKws := []string{ "add", "all", "alter", "analyze", "and", "as", "asc", "between", "bigint", @@ -75,15 +71,15 @@ func (s *testParserSuite) TestSimple(c *C) { for _, kw := range reservedKws { src := fmt.Sprintf("SELECT * FROM db.%s;", kw) _, err := parser.ParseOneStmt(src, "", "") - c.Assert(err, IsNil, Commentf("source %s", src)) + require.NoErrorf(t, err, "source %s", src) src = fmt.Sprintf("SELECT * FROM %s.desc", kw) _, err = parser.ParseOneStmt(src, "", "") - c.Assert(err, IsNil, Commentf("source %s", src)) + require.NoErrorf(t, err, "source %s", src) src = fmt.Sprintf("SELECT t.%s FROM t", kw) _, err = parser.ParseOneStmt(src, "", "") - c.Assert(err, IsNil, Commentf("source %s", src)) + require.NoErrorf(t, err, "source %s", src) } // Testcase for unreserved keywords @@ -108,51 +104,51 @@ func (s *testParserSuite) TestSimple(c *C) { for _, kw := range unreservedKws { src := fmt.Sprintf("SELECT %s FROM tbl;", kw) _, err := parser.ParseOneStmt(src, "", "") - c.Assert(err, IsNil, Commentf("source %s", src)) + require.NoErrorf(t, err, "source %s", src) } // Testcase for prepared statement src := "SELECT id+?, id+? from t;" _, err := parser.ParseOneStmt(src, "", "") - c.Assert(err, IsNil) + require.NoError(t, err) // Testcase for -- Comment and unary -- operator src = "CREATE TABLE foo (a SMALLINT UNSIGNED, b INT UNSIGNED); -- foo\nSelect --1 from foo;" stmts, _, err := parser.Parse(src, "", "") - c.Assert(err, IsNil) - c.Assert(stmts, HasLen, 2) + require.NoError(t, err) + require.Len(t, stmts, 2) // Testcase for /*! xx */ // See http://dev.mysql.com/doc/refman/5.7/en/comments.html // Fix: https://github.com/pingcap/tidb/issues/971 src = "/*!40101 SET character_set_client = utf8 */;" stmts, _, err = parser.Parse(src, "", "") - c.Assert(err, IsNil) - c.Assert(stmts, HasLen, 1) + require.NoError(t, err) + require.Len(t, stmts, 1) stmt := stmts[0] _, ok := stmt.(*ast.SetStmt) - c.Assert(ok, IsTrue) + require.True(t, ok) // for issue #2017 src = "insert into blobtable (a) values ('/*! truncated */');" stmt, err = parser.ParseOneStmt(src, "", "") - c.Assert(err, IsNil) + require.NoError(t, err) is, ok := stmt.(*ast.InsertStmt) - c.Assert(ok, IsTrue) - c.Assert(is.Lists, HasLen, 1) - c.Assert(is.Lists[0], HasLen, 1) - c.Assert(is.Lists[0][0].(ast.ValueExpr).GetDatumString(), Equals, "/*! truncated */") + require.True(t, ok) + require.Len(t, is.Lists, 1) + require.Len(t, is.Lists[0], 1) + require.Equal(t, "/*! truncated */", is.Lists[0][0].(ast.ValueExpr).GetDatumString()) // Testcase for CONVERT(expr,type) src = "SELECT CONVERT('111', SIGNED);" st, err := parser.ParseOneStmt(src, "", "") - c.Assert(err, IsNil) + require.NoError(t, err) ss, ok := st.(*ast.SelectStmt) - c.Assert(ok, IsTrue) - c.Assert(len(ss.Fields.Fields), Equals, 1) + require.True(t, ok) + require.Len(t, ss.Fields.Fields, 1) cv, ok := ss.Fields.Fields[0].Expr.(*ast.FuncCastExpr) - c.Assert(ok, IsTrue) - c.Assert(cv.FunctionType, Equals, ast.CastConvertFunction) + require.True(t, ok) + require.Equal(t, ast.CastConvertFunction, cv.FunctionType) // for query start with comment srcs := []string{ @@ -164,39 +160,39 @@ func (s *testParserSuite) TestSimple(c *C) { } for _, src := range srcs { st, err = parser.ParseOneStmt(src, "", "") - c.Assert(err, IsNil) + require.NoError(t, err) ss, ok = st.(*ast.SelectStmt) - c.Assert(ok, IsTrue) + require.True(t, ok) } // for issue #961 src = "create table t (c int key);" st, err = parser.ParseOneStmt(src, "", "") - c.Assert(err, IsNil) + require.NoError(t, err) cs, ok := st.(*ast.CreateTableStmt) - c.Assert(ok, IsTrue) - c.Assert(cs.Cols, HasLen, 1) - c.Assert(cs.Cols[0].Options, HasLen, 1) - c.Assert(cs.Cols[0].Options[0].Tp, Equals, ast.ColumnOptionPrimaryKey) + require.True(t, ok) + require.Len(t, cs.Cols, 1) + require.Len(t, cs.Cols[0].Options, 1) + require.Equal(t, ast.ColumnOptionPrimaryKey, cs.Cols[0].Options[0].Tp) // for issue #4497 src = "create table t1(a NVARCHAR(100));" _, err = parser.ParseOneStmt(src, "", "") - c.Assert(err, IsNil) + require.NoError(t, err) // for issue 2803 src = "use quote;" _, err = parser.ParseOneStmt(src, "", "") - c.Assert(err, IsNil) + require.NoError(t, err) // issue #4354 src = "select b'';" _, err = parser.ParseOneStmt(src, "", "") - c.Assert(err, IsNil) + require.NoError(t, err) src = "select B'';" _, err = parser.ParseOneStmt(src, "", "") - c.Assert(err, IsNil) + require.NoError(t, err) // src = "select 0b'';" // _, err = parser.ParseOneStmt(src, "", "") @@ -205,13 +201,13 @@ func (s *testParserSuite) TestSimple(c *C) { // for #4909, support numericType `signed` filedOpt. src = "CREATE TABLE t(_sms smallint signed, _smu smallint unsigned);" _, err = parser.ParseOneStmt(src, "", "") - c.Assert(err, IsNil) + require.NoError(t, err) // for #7371, support NATIONAL CHARACTER // reference link: https://dev.mysql.com/doc/refman/5.7/en/charset-national.html src = "CREATE TABLE t(c1 NATIONAL CHARACTER(10));" _, err = parser.ParseOneStmt(src, "", "") - c.Assert(err, IsNil) + require.NoError(t, err) src = `CREATE TABLE t(a tinyint signed, b smallint signed, @@ -229,17 +225,17 @@ func (s *testParserSuite) TestSimple(c *C) { );` st, err = parser.ParseOneStmt(src, "", "") - c.Assert(err, IsNil) + require.NoError(t, err) ct, ok := st.(*ast.CreateTableStmt) - c.Assert(ok, IsTrue) + require.True(t, ok) for _, col := range ct.Cols { - c.Assert(col.Tp.Flag&mysql.UnsignedFlag, Equals, uint(0)) + require.Equal(t, uint(0), col.Tp.Flag&mysql.UnsignedFlag) } // for issue #4006 src = `insert into tb(v) (select v from tb);` _, err = parser.ParseOneStmt(src, "", "") - c.Assert(err, IsNil) + require.NoError(t, err) } type testCase struct { @@ -254,66 +250,64 @@ type testErrMsgCase struct { err error } -func (s *testParserSuite) RunTest(c *C, table []testCase) { - parser := New() - parser.EnableWindowFunc(s.enableWindowFunc) - for _, t := range table { - _, _, err := parser.Parse(t.src, "", "") - comment := Commentf("source %v", t.src) - if !t.ok { - c.Assert(err, NotNil, comment) +func RunTest(t *testing.T, table []testCase, enableWindowFunc bool) { + parser := parser.New() + parser.EnableWindowFunc(enableWindowFunc) + for _, tbl := range table { + _, _, err := parser.Parse(tbl.src, "", "") + if !tbl.ok { + require.Errorf(t, err, "source %v", tbl.src, errors.Trace(err)) continue } - c.Assert(err, IsNil, comment) + require.NoErrorf(t, err, "source %v", tbl.src, errors.Trace(err)) // restore correctness test - if t.ok { - s.RunRestoreTest(c, t.src, t.restore) + if tbl.ok { + RunRestoreTest(t, tbl.src, tbl.restore, enableWindowFunc) } } } -func (s *testParserSuite) RunRestoreTest(c *C, sourceSQLs, expectSQLs string) { +func RunRestoreTest(t *testing.T, sourceSQLs, expectSQLs string, enableWindowFunc bool) { var sb strings.Builder - parser := New() - parser.EnableWindowFunc(s.enableWindowFunc) + parser := parser.New() + parser.EnableWindowFunc(enableWindowFunc) comment := Commentf("source %v", sourceSQLs) stmts, _, err := parser.Parse(sourceSQLs, "", "") - c.Assert(err, IsNil, comment) + require.NoErrorf(t, err, "source %v", sourceSQLs) restoreSQLs := "" for _, stmt := range stmts { sb.Reset() err = stmt.Restore(NewRestoreCtx(DefaultRestoreFlags, &sb)) - c.Assert(err, IsNil, comment) + require.NoError(t, err, comment) restoreSQL := sb.String() comment = Commentf("source %v; restore %v", sourceSQLs, restoreSQL) restoreStmt, err := parser.ParseOneStmt(restoreSQL, "", "") - c.Assert(err, IsNil, comment) + require.NoError(t, err, comment) CleanNodeText(stmt) CleanNodeText(restoreStmt) - c.Assert(restoreStmt, DeepEquals, stmt, comment) + require.Equal(t, stmt, restoreStmt, comment) if restoreSQLs != "" { restoreSQLs += "; " } restoreSQLs += restoreSQL } - comment = Commentf("restore %v; expect %v", restoreSQLs, expectSQLs) - c.Assert(restoreSQLs, Equals, expectSQLs, comment) + require.Equalf(t, expectSQLs, restoreSQLs, "restore %v; expect %v", restoreSQLs, expectSQLs) } -func (s *testParserSuite) RunErrMsgTest(c *C, table []testErrMsgCase) { - parser := New() - for _, t := range table { - _, _, err := parser.Parse(t.src, "", "") - comment := Commentf("source %v", t.src) - if t.err != nil { - c.Assert(terror.ErrorEqual(err, t.err), IsTrue, comment) +func RunErrMsgTest(t *testing.T, table []testErrMsgCase) { + parser := parser.New() + for _, tbl := range table { + _, _, err := parser.Parse(tbl.src, "", "") + comment := Commentf("source %v", tbl.src) + if tbl.err != nil { + require.True(t, terror.ErrorEqual(err, tbl.err), comment) } else { - c.Assert(err, IsNil, comment) + require.NoError(t, err, comment) } } } -func (s *testParserSuite) TestDMLStmt(c *C) { +func TestDMLStmt(t *testing.T) { table := []testCase{ {"", true, ""}, {";", true, ""}, @@ -439,7 +433,14 @@ func (s *testParserSuite) TestDMLStmt(c *C) { // select for update {"SELECT * from t for update", true, "SELECT * FROM `t` FOR UPDATE"}, - {"SELECT * from t lock in share mode", true, "SELECT * FROM `t` LOCK IN SHARE MODE"}, + {"select * from t for share", true, "SELECT * FROM `t` FOR SHARE"}, + {"select * from t for update nowait", true, "SELECT * FROM `t` FOR UPDATE NOWAIT"}, + {"select * from t for share nowait", true, "SELECT * FROM `t` FOR SHARE NOWAIT"}, + {"select * from t for update skip locked", true, "SELECT * FROM `t` FOR UPDATE SKIP LOCKED"}, + {"select * from t for share skip locked", true, "SELECT * FROM `t` FOR SHARE SKIP LOCKED"}, + {"select * from t lock in share mode", true, "SELECT * FROM `t` LOCK IN SHARE MODE"}, + {"select * from t lock in share mode nowait", false, ""}, + {"select * from t lock in share mode skip locked", false, ""}, // from join {"SELECT * from t1, t2, t3", true, "SELECT * FROM ((`t1`) JOIN `t2`) JOIN `t3`"}, @@ -622,10 +623,10 @@ AAAAAAAAAAAA5gm5Mg== {"select * from t1 partition (`p1`, p2, p3)", true, "SELECT * FROM `t1` PARTITION(`p1`, `p2`, `p3`)"}, {`select * from t1 partition ()`, false, ""}, } - s.RunTest(c, table) + RunTest(t, table, false) } -func (s *testParserSuite) TestDBAStmt(c *C) { +func TestDBAStmt(t *testing.T) { table := []testCase{ // for SHOW statement {"SHOW VARIABLES LIKE 'character_set_results'", true, "SHOW SESSION VARIABLES LIKE 'character_set_results'"}, @@ -729,6 +730,8 @@ func (s *testParserSuite) TestDBAStmt(c *C) { // set default value {"SET @@global.autocommit = default", true, "SET @@GLOBAL.`autocommit`=DEFAULT"}, {"SET @@session.autocommit = default", true, "SET @@SESSION.`autocommit`=DEFAULT"}, + // set binary value + {"SET @@character_set_client = binary", true, "SET @@SESSION.`character_set_client`='BINARY'"}, // SET CHARACTER SET {"SET CHARACTER SET utf8mb4;", true, "SET NAMES 'utf8mb4'"}, {"SET CHARACTER SET 'utf8mb4';", true, "SET NAMES 'utf8mb4'"}, @@ -777,30 +780,30 @@ func (s *testParserSuite) TestDBAStmt(c *C) { {"flush tidb plugins plugin1", true, "FLUSH TIDB PLUGINS plugin1"}, {"flush tidb plugins plugin1, plugin2", true, "FLUSH TIDB PLUGINS plugin1, plugin2"}, } - s.RunTest(c, table) + RunTest(t, table, false) } -func (s *testParserSuite) TestFlushTable(c *C) { - parser := New() +func TestFlushTable(t *testing.T) { + parser := parser.New() stmt, _, err := parser.Parse("flush local tables tbl1,tbl2 with read lock", "", "") - c.Assert(err, IsNil) + require.NoError(t, err) flushTable := stmt[0].(*ast.FlushStmt) - c.Assert(flushTable.Tp, Equals, ast.FlushTables) - c.Assert(flushTable.Tables[0].Name.L, Equals, "tbl1") - c.Assert(flushTable.Tables[1].Name.L, Equals, "tbl2") - c.Assert(flushTable.NoWriteToBinLog, IsTrue) - c.Assert(flushTable.ReadLock, IsTrue) + require.Equal(t, ast.FlushTables, flushTable.Tp) + require.Equal(t, "tbl1", flushTable.Tables[0].Name.L) + require.Equal(t, "tbl2", flushTable.Tables[1].Name.L) + require.True(t, flushTable.NoWriteToBinLog) + require.True(t, flushTable.ReadLock) } -func (s *testParserSuite) TestFlushPrivileges(c *C) { - parser := New() +func TestFlushPrivileges(t *testing.T) { + parser := parser.New() stmt, _, err := parser.Parse("flush privileges", "", "") - c.Assert(err, IsNil) + require.NoError(t, err) flushPrivilege := stmt[0].(*ast.FlushStmt) - c.Assert(flushPrivilege.Tp, Equals, ast.FlushPrivileges) + require.Equal(t, ast.FlushPrivileges, flushPrivilege.Tp) } -func (s *testParserSuite) TestExpression(c *C) { +func TestExpression(t *testing.T) { table := []testCase{ // sign expression {"SELECT ++1", true, "SELECT ++1"}, @@ -844,10 +847,10 @@ func (s *testParserSuite) TestExpression(c *C) { {"select {ts123 123}", true, "SELECT 123"}, {"select {ts123 1 xor 1}", true, "SELECT 1 XOR 1"}, } - s.RunTest(c, table) + RunTest(t, table, false) } -func (s *testParserSuite) TestBuiltin(c *C) { +func TestBuiltin(t *testing.T) { table := []testCase{ // for builtin functions {"SELECT POW(1, 2)", true, "SELECT POW(1, 2)"}, @@ -1048,6 +1051,12 @@ func (s *testParserSuite) TestBuiltin(c *C) { {"select utc_time('1')", false, ""}, {"select utc_time(null)", false, ""}, + {"select char(65)", true, "SELECT CHAR(65)"}, + {"SELECT CHAR(65, 66, 67)", true, "SELECT CHAR(65, 66, 67)"}, + {"SELECT HEX(CHAR(1, 0)), HEX(CHAR(256)), HEX(CHAR(1, 1)), HEX(CHAR(257))", true, "SELECT HEX(CHAR(1, 0)),HEX(CHAR(256)),HEX(CHAR(1, 1)),HEX(CHAR(257))"}, + {"SELECT CHAR(0x027FA USING ucs2)", true, "SELECT CHAR(x'0027fa' USING 'ucs2')"}, + {" SELECT CHAR(0xc2a7 USING utf8)", true, "SELECT CHAR(x'c2a7' USING 'utf8')"}, + // for microsecond, second, minute, hour {"SELECT MICROSECOND('2009-12-31 23:59:59.000010');", true, "SELECT MICROSECOND('2009-12-31 23:59:59.000010')"}, {"SELECT SECOND('10:05:03');", true, "SELECT SECOND('10:05:03')"}, @@ -1186,7 +1195,7 @@ func (s *testParserSuite) TestBuiltin(c *C) { {`SELECT RPAD('hi', 6, 'c');`, true, "SELECT RPAD('hi', 6, 'c')"}, {`SELECT BIT_LENGTH('hi');`, true, "SELECT BIT_LENGTH('hi')"}, - {`SELECT CHAR(65);`, true, "SELECT CHAR_FUNC(65, NULL)"}, + //{`SELECT CHAR(65);`, true, "SELECT CHAR_FUNC(65, NULL)"}, {`SELECT CHAR_LENGTH('abc');`, true, "SELECT CHAR_LENGTH('abc')"}, {`SELECT CHARACTER_LENGTH('abc');`, true, "SELECT CHARACTER_LENGTH('abc')"}, {`SELECT FIELD('ej', 'Hej', 'ej', 'Heja', 'hej', 'foo');`, true, "SELECT FIELD('ej', 'Hej', 'ej', 'Heja', 'hej', 'foo')"}, @@ -1461,7 +1470,7 @@ func (s *testParserSuite) TestBuiltin(c *C) { {`SELECT ENCRYPT('hello'), ENCRYPT('hello', @salt);`, true, "SELECT ENCRYPT('hello'),ENCRYPT('hello', @`salt`)"}, {`SELECT MD5('testing');`, true, "SELECT MD5('testing')"}, {`SELECT OLD_PASSWORD(@str);`, true, "SELECT OLD_PASSWORD(@`str`)"}, - {`SELECT PASSWORD(@str);`, true, "SELECT PASSWORD_FUNC(@`str`)"}, + {`SELECT PASSWORD(@str);`, true, "SELECT PASSWORD(@`str`)"}, {`SELECT RANDOM_BYTES(@len);`, true, "SELECT RANDOM_BYTES(@`len`)"}, {`SELECT SHA1('abc');`, true, "SELECT SHA1('abc')"}, {`SELECT SHA('abc');`, true, "SELECT SHA('abc')"}, @@ -1487,10 +1496,10 @@ func (s *testParserSuite) TestBuiltin(c *C) { // Test that quoted identifier can be a function name. {"SELECT `uuid`()", true, "SELECT UUID()"}, } - s.RunTest(c, table) + RunTest(t, table, false) } -func (s *testParserSuite) TestIdentifier(c *C) { +func TestIdentifier(t *testing.T) { table := []testCase{ // for quote identifier {"select `a`, `a.b`, `a b` from t", true, "SELECT `a`,`a.b`,`a b` FROM `t`"}, @@ -1541,10 +1550,10 @@ func (s *testParserSuite) TestIdentifier(c *C) { {"select .78`123`", true, "SELECT 0.78 AS `123`"}, {`select .78"123"`, true, "SELECT 0.78 AS `123`"}, } - s.RunTest(c, table) + RunTest(t, table, false) } -func (s *testParserSuite) TestDDL(c *C) { +func TestDDL(t *testing.T) { table := []testCase{ {"CREATE", false, ""}, {"CREATE TABLE", false, ""}, @@ -1635,6 +1644,9 @@ func (s *testParserSuite) TestDDL(c *C) { {"create table t (c1 bool, c2 bool, check (c1 in (0, 1)), check (c2 in (0, 1)))", true, "CREATE TABLE `t` (`c1` TINYINT(1),`c2` TINYINT(1))"}, //TODO: Check in ColumnOption, yacc is not implemented {"CREATE TABLE Customer (SD integer CHECK (SD > 0), First_Name varchar(30));", true, "CREATE TABLE `Customer` (`SD` INT ,`First_Name` VARCHAR(30))"}, //TODO: Check in ColumnOption, yacc is not implemented + // fix `ON UPDATE CURRENT_TIMESTAMP(6)` + {"CREATE TABLE t (ts TIMESTAMP(6) DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6));", true, "CREATE TABLE `t` (`ts` TIMESTAMP(6) DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6))"}, // + {"create database xxx", true, "CREATE DATABASE `xxx`"}, {"create database if exists xxx", false, ""}, {"create database if not exists xxx", true, "CREATE DATABASE IF NOT EXISTS `xxx`"}, @@ -1788,7 +1800,7 @@ func (s *testParserSuite) TestDDL(c *C) { {"CREATE TABLE t (c TEXT) default CHARACTER SET utf8, default COLLATE utf8_general_ci;", true, "CREATE TABLE `t` (`c` TEXT) DEFAULT CHARACTER SET = UTF8 DEFAULT COLLATE = UTF8_GENERAL_CI"}, {"CREATE TABLE t (c TEXT) shard_row_id_bits = 1;", true, "CREATE TABLE `t` (`c` TEXT) SHARD_ROW_ID_BITS = 1"}, // Create table with ON UPDATE CURRENT_TIMESTAMP(6), specify fraction part. - {"CREATE TABLE IF NOT EXISTS `general_log` (`event_time` timestamp(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6),`user_host` mediumtext NOT NULL,`thread_id` bigint(20) unsigned NOT NULL,`server_id` int(10) unsigned NOT NULL,`command_type` varchar(64) NOT NULL,`argument` mediumblob NOT NULL) ENGINE=CSV DEFAULT CHARSET=utf8 COMMENT='General log'", true, "CREATE TABLE IF NOT EXISTS `general_log` (`event_time` TIMESTAMP(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(),`user_host` MEDIUMTEXT NOT NULL,`thread_id` BIGINT(20) UNSIGNED NOT NULL,`server_id` INT(10) UNSIGNED NOT NULL,`command_type` VARCHAR(64) NOT NULL,`argument` MEDIUMBLOB NOT NULL) ENGINE = CSV DEFAULT CHARACTER SET = UTF8 COMMENT = 'General log'"}, //TODO: The number yacc in parentheses has not been implemented yet. + {"CREATE TABLE IF NOT EXISTS `general_log` (`event_time` timestamp(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6),`user_host` mediumtext NOT NULL,`thread_id` bigint(20) unsigned NOT NULL,`server_id` int(10) unsigned NOT NULL,`command_type` varchar(64) NOT NULL,`argument` mediumblob NOT NULL) ENGINE=CSV DEFAULT CHARSET=utf8 COMMENT='General log'", true, "CREATE TABLE IF NOT EXISTS `general_log` (`event_time` TIMESTAMP(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6),`user_host` MEDIUMTEXT NOT NULL,`thread_id` BIGINT(20) UNSIGNED NOT NULL,`server_id` INT(10) UNSIGNED NOT NULL,`command_type` VARCHAR(64) NOT NULL,`argument` MEDIUMBLOB NOT NULL) ENGINE = CSV DEFAULT CHARACTER SET = UTF8 COMMENT = 'General log'"}, // For reference_definition in column_definition. {"CREATE TABLE followers ( f1 int NOT NULL REFERENCES user_profiles (uid) );", true, "CREATE TABLE `followers` (`f1` INT NOT NULL REFERENCES `user_profiles`(`uid`))"}, @@ -1935,106 +1947,108 @@ func (s *testParserSuite) TestDDL(c *C) { {"CREATE TABLE bar (m INT) IGNORE SELECT n FROM foo;", true, "CREATE TABLE `bar` (`m` INT) IGNORE AS SELECT `n` FROM `foo`"}, {"CREATE TABLE bar (m INT) REPLACE SELECT n FROM foo;", true, "CREATE TABLE `bar` (`m` INT) REPLACE AS SELECT `n` FROM `foo`"}, } - s.RunTest(c, table) + RunTest(t, table, false) } -func (s *testParserSuite) TestHintError(c *C) { - parser := New() +func TestHintError(t *testing.T) { + parser := parser.New() + stmt, warns, err := parser.Parse("select /*+ tidb_unknow(T1,t2) */ c1, c2 from t1, t2 where t1.c1 = t2.c1", "", "") - c.Assert(err, IsNil) - c.Assert(len(warns), Equals, 1) - c.Assert(warns[0].Error(), Equals, "line 1 column 32 near \"tidb_unknow(T1,t2) */ c1, c2 from t1, t2 where t1.c1 = t2.c1\" ") - c.Assert(len(stmt[0].(*ast.SelectStmt).TableHints), Equals, 0) + require.NoError(t, err) + require.Len(t, warns, 1) + require.Equal(t, "line 1 column 32 near \"tidb_unknow(T1,t2) */ c1, c2 from t1, t2 where t1.c1 = t2.c1\" ", warns[0].Error()) + require.Len(t, stmt[0].(*ast.SelectStmt).TableHints, 0) + stmt, warns, err = parser.Parse("select /*+ tidb_unknow(T1,t2, 1) TIDB_INLJ(t1, T2) */ c1, c2 from t1, t2 where t1.c1 = t2.c1", "", "") - c.Assert(len(stmt[0].(*ast.SelectStmt).TableHints), Equals, 0) - c.Assert(err, IsNil) - c.Assert(len(warns), Equals, 1) - c.Assert(warns[0].Error(), Equals, "line 1 column 53 near \"tidb_unknow(T1,t2, 1) TIDB_INLJ(t1, T2) */ c1, c2 from t1, t2 where t1.c1 = t2.c1\" ") + require.NoError(t, err) + require.Len(t, stmt[0].(*ast.SelectStmt).TableHints, 0) + require.Len(t, warns, 1) + require.Equal(t, "line 1 column 53 near \"tidb_unknow(T1,t2, 1) TIDB_INLJ(t1, T2) */ c1, c2 from t1, t2 where t1.c1 = t2.c1\" ", warns[0].Error()) + stmt, _, err = parser.Parse("select c1, c2 from /*+ tidb_unknow(T1,t2) */ t1, t2 where t1.c1 = t2.c1", "", "") - c.Assert(err, NotNil) + require.NotNil(t, err) + stmt, _, err = parser.Parse("select1 /*+ TIDB_INLJ(t1, T2) */ c1, c2 from t1, t2 where t1.c1 = t2.c1", "", "") - c.Assert(err, NotNil) - c.Assert(err.Error(), Equals, "line 1 column 7 near \"select1 /*+ TIDB_INLJ(t1, T2) */ c1, c2 from t1, t2 where t1.c1 = t2.c1\" ") + require.NotNil(t, err) + require.EqualError(t, err, "line 1 column 7 near \"select1 /*+ TIDB_INLJ(t1, T2) */ c1, c2 from t1, t2 where t1.c1 = t2.c1\" ") + stmt, _, err = parser.Parse("select /*+ TIDB_INLJ(t1, T2) */ c1, c2 fromt t1, t2 where t1.c1 = t2.c1", "", "") - c.Assert(err, NotNil) - c.Assert(err.Error(), Equals, "line 1 column 47 near \"t1, t2 where t1.c1 = t2.c1\" ") + require.NotNil(t, err) + require.EqualError(t, err, "line 1 column 47 near \"t1, t2 where t1.c1 = t2.c1\" ") + _, _, err = parser.Parse("SELECT 1 FROM DUAL WHERE 1 IN (SELECT /*+ DEBUG_HINT3 */ 1)", "", "") - c.Assert(err, IsNil) + require.NoError(t, err) } -func (s *testParserSuite) TestErrorMsg(c *C) { - parser := New() +func TestErrorMsg(t *testing.T) { + parser := parser.New() _, _, err := parser.Parse("select1 1", "", "") - c.Assert(err.Error(), Equals, "line 1 column 7 near \"select1 1\" ") + require.EqualError(t, err, "line 1 column 7 near \"select1 1\" ") _, _, err = parser.Parse("select 1 from1 dual", "", "") - c.Assert(err.Error(), Equals, "line 1 column 19 near \"dual\" ") + require.EqualError(t, err, "line 1 column 19 near \"dual\" ") _, _, err = parser.Parse("select * from t1 join t2 from t1.a = t2.a;", "", "") - c.Assert(err.Error(), Equals, "line 1 column 29 near \"from t1.a = t2.a;\" ") + require.EqualError(t, err, "line 1 column 29 near \"from t1.a = t2.a;\" ") _, _, err = parser.Parse("select * from t1 join t2 one t1.a = t2.a;", "", "") - c.Assert(err.Error(), Equals, "line 1 column 31 near \"t1.a = t2.a;\" ") + require.EqualError(t, err, "line 1 column 31 near \"t1.a = t2.a;\" ") _, _, err = parser.Parse("select * from t1 join t2 on t1.a >>> t2.a;", "", "") - c.Assert(err.Error(), Equals, "line 1 column 36 near \"> t2.a;\" ") + require.EqualError(t, err, "line 1 column 36 near \"> t2.a;\" ") } -func (s *testParserSuite) TestOptimizerHints(c *C) { - parser := New() +func TestOptimizerHints(t *testing.T) { + parser := parser.New() stmt, _, err := parser.Parse("select /*+ tidb_SMJ(T1,t2) tidb_smj(T3,t4) */ c1, c2 from t1, t2 where t1.c1 = t2.c1", "", "") - c.Assert(err, IsNil) + require.NoError(t, err) selectStmt := stmt[0].(*ast.SelectStmt) hints := selectStmt.TableHints - c.Assert(len(hints), Equals, 2) - c.Assert(hints[0].HintName.L, Equals, "tidb_smj") - c.Assert(len(hints[0].Tables), Equals, 2) - c.Assert(hints[0].Tables[0].L, Equals, "t1") - c.Assert(hints[0].Tables[1].L, Equals, "t2") - - c.Assert(hints[1].HintName.L, Equals, "tidb_smj") - c.Assert(hints[1].Tables[0].L, Equals, "t3") - c.Assert(hints[1].Tables[1].L, Equals, "t4") - - c.Assert(len(selectStmt.TableHints), Equals, 2) + require.Len(t, hints, 2) + require.Len(t, hints[0].Tables, 2) + require.Equal(t, "tidb_smj", hints[0].HintName.L) + require.Equal(t, "t1", hints[0].Tables[0].L) + require.Equal(t, "t2", hints[0].Tables[1].L) + require.Equal(t, "tidb_smj", hints[1].HintName.L) + require.Equal(t, "t3", hints[1].Tables[0].L) + require.Equal(t, "t4", hints[1].Tables[1].L) + require.Len(t, selectStmt.TableHints, 2) stmt, _, err = parser.Parse("select /*+ TIDB_INLJ(t1, T2) tidb_inlj(t3, t4) */ c1, c2 from t1, t2 where t1.c1 = t2.c1", "", "") - c.Assert(err, IsNil) + require.NoError(t, err) selectStmt = stmt[0].(*ast.SelectStmt) hints = selectStmt.TableHints - c.Assert(len(hints), Equals, 2) - c.Assert(hints[0].HintName.L, Equals, "tidb_inlj") - c.Assert(len(hints[0].Tables), Equals, 2) - c.Assert(hints[0].Tables[0].L, Equals, "t1") - c.Assert(hints[0].Tables[1].L, Equals, "t2") - - c.Assert(hints[1].HintName.L, Equals, "tidb_inlj") - c.Assert(hints[1].Tables[0].L, Equals, "t3") - c.Assert(hints[1].Tables[1].L, Equals, "t4") + require.Len(t, hints, 2) + require.Len(t, hints[0].Tables, 2) + require.Equal(t, "tidb_inlj", hints[0].HintName.L) + require.Equal(t, "t1", hints[0].Tables[0].L) + require.Equal(t, "t2", hints[0].Tables[1].L) + require.Equal(t, "tidb_inlj", hints[1].HintName.L) + require.Equal(t, "t3", hints[1].Tables[0].L) + require.Equal(t, "t4", hints[1].Tables[1].L) stmt, _, err = parser.Parse("select /*+ TIDB_HJ(t1, T2) tidb_hj(t3, t4) */ c1, c2 from t1, t2 where t1.c1 = t2.c1", "", "") - c.Assert(err, IsNil) + require.NoError(t, err) selectStmt = stmt[0].(*ast.SelectStmt) hints = selectStmt.TableHints - c.Assert(len(hints), Equals, 2) - c.Assert(hints[0].HintName.L, Equals, "tidb_hj") - c.Assert(len(hints[0].Tables), Equals, 2) - c.Assert(hints[0].Tables[0].L, Equals, "t1") - c.Assert(hints[0].Tables[1].L, Equals, "t2") - - c.Assert(hints[1].HintName.L, Equals, "tidb_hj") - c.Assert(hints[1].Tables[0].L, Equals, "t3") - c.Assert(hints[1].Tables[1].L, Equals, "t4") + require.Len(t, hints, 2) + require.Len(t, hints[0].Tables, 2) + require.Equal(t, "tidb_hj", hints[0].HintName.L) + require.Equal(t, "t1", hints[0].Tables[0].L) + require.Equal(t, "t2", hints[0].Tables[1].L) + require.Equal(t, "tidb_hj", hints[1].HintName.L) + require.Equal(t, "t3", hints[1].Tables[0].L) + require.Equal(t, "t4", hints[1].Tables[1].L) stmt, _, err = parser.Parse("SELECT /*+ MAX_EXECUTION_TIME(1000) */ * FROM t1 INNER JOIN t2 where t1.c1 = t2.c1", "", "") - c.Assert(err, IsNil) + require.NoError(t, err) selectStmt = stmt[0].(*ast.SelectStmt) hints = selectStmt.TableHints - c.Assert(len(hints), Equals, 1) - c.Assert(hints[0].HintName.L, Equals, "max_execution_time") - c.Assert(hints[0].MaxExecutionTime, Equals, uint64(1000)) + require.Len(t, hints, 1) + require.Equal(t, "max_execution_time", hints[0].HintName.L) + require.Equal(t, uint64(1000), hints[0].MaxExecutionTime) } -func (s *testParserSuite) TestType(c *C) { +func TestType(t *testing.T) { table := []testCase{ // for time fsp {"CREATE TABLE t( c1 TIME(2), c2 DATETIME(2), c3 TIMESTAMP(2) );", true, "CREATE TABLE `t` (`c1` TIME(2),`c2` DATETIME(2),`c3` TIMESTAMP(2))"}, @@ -2070,10 +2084,10 @@ func (s *testParserSuite) TestType(c *C) { // for json type {`create table t (a JSON);`, true, "CREATE TABLE `t` (`a` JSON)"}, } - s.RunTest(c, table) + RunTest(t, table, false) } -func (s *testParserSuite) TestPrivilege(c *C) { +func TestPrivilege(t *testing.T) { table := []testCase{ // for create user {`CREATE USER 'test'`, true, "CREATE USER `test`@`%`"}, @@ -2151,10 +2165,10 @@ func (s *testParserSuite) TestPrivilege(c *C) { {"REVOKE all privileges on zabbix.* FROM 'zabbix'@'localhost' identified by 'password';", true, "REVOKE ALL ON `zabbix`.* FROM `zabbix`@`localhost` IDENTIFIED BY 'password'"}, {"REVOKE 'role1', 'role2' FROM 'user1'@'localhost', 'user2'@'localhost';", true, ""}, } - s.RunTest(c, table) + RunTest(t, table, false) } -func (s *testParserSuite) TestComment(c *C) { +func TestComment(t *testing.T) { table := []testCase{ {"create table t (c int comment 'comment')", true, "CREATE TABLE `t` (`c` INT COMMENT 'comment')"}, {"create table t (c int) comment = 'comment'", true, "CREATE TABLE `t` (`c` INT) COMMENT = 'comment'"}, @@ -2167,28 +2181,28 @@ func (s *testParserSuite) TestComment(c *C) { // for unclosed comment {"delete from t where a = 7 or 1=1/*' and b = 'p'", false, ""}, } - s.RunTest(c, table) + RunTest(t, table, false) } -func (s *testParserSuite) TestCommentErrMsg(c *C) { +func TestCommentErrMsg(t *testing.T) { table := []testErrMsgCase{ {"delete from t where a = 7 or 1=1/*' and b = 'p'", false, errors.New("near '/*' and b = 'p'' at line 1")}, {"delete from t where a = 7 or\n 1=1/*' and b = 'p'", false, errors.New("near '/*' and b = 'p'' at line 2")}, {"select 1/*", false, errors.New("near '/*' at line 1")}, {"select 1/* comment */", false, nil}, } - s.RunErrMsgTest(c, table) + RunErrMsgTest(t, table) } type subqueryChecker struct { text string - c *C + t *testing.T } // Enter implements ast.Visitor interface. func (sc *subqueryChecker) Enter(inNode ast.Node) (outNode ast.Node, skipChildren bool) { if expr, ok := inNode.(*ast.SubqueryExpr); ok { - sc.c.Assert(expr.Query.Text(), Equals, sc.text) + require.Equal(sc.t, sc.text, expr.Query.Text()) return inNode, true } return inNode, false @@ -2199,7 +2213,7 @@ func (sc *subqueryChecker) Leave(inNode ast.Node) (node ast.Node, ok bool) { return inNode, true } -func (s *testParserSuite) TestSubquery(c *C) { +func TestSubquery(t *testing.T) { table := []testCase{ // for compare subquery {"SELECT 1 > (select 1)", true, "SELECT 1>(SELECT 1)"}, @@ -2215,8 +2229,12 @@ func (s *testParserSuite) TestSubquery(c *C) { {"SELECT NOT EXISTS (select 1)", true, "SELECT NOT EXISTS (SELECT 1)"}, {"SELECT + NOT EXISTS (select 1)", false, ""}, {"SELECT - NOT EXISTS (select 1)", false, ""}, + {"select exists((select 1));", true, "SELECT EXISTS (SELECT 1)"}, + {"select a.* from (select * from t1 where id>1000) as a where a.id<2000;", true, "SELECT `a`.* FROM (SELECT * FROM (`t1`) WHERE `id`>1000) AS `a` WHERE `a`.`id`<2000"}, + {"select a.* from ((select * from t1 where id>1000)) as a where a.id<2000;", true, "SELECT `a`.* FROM (SELECT * FROM (`t1`) WHERE `id`>1000) AS `a` WHERE `a`.`id`<2000"}, + {"select a.* from (((select * from t1 where id>1000))) as a where a.id<2000;", true, "SELECT `a`.* FROM (SELECT * FROM (`t1`) WHERE `id`>1000) AS `a` WHERE `a`.`id`<2000"}, } - s.RunTest(c, table) + RunTest(t, table, false) tests := []struct { input string @@ -2225,17 +2243,17 @@ func (s *testParserSuite) TestSubquery(c *C) { {"SELECT 1 > (select 1)", "select 1"}, {"SELECT 1 > (select 1 union select 2)", "select 1 union select 2"}, } - parser := New() - for _, t := range tests { - stmt, err := parser.ParseOneStmt(t.input, "", "") - c.Assert(err, IsNil) + parser := parser.New() + for _, tbl := range tests { + stmt, err := parser.ParseOneStmt(tbl.input, "", "") + require.NoError(t, err) stmt.Accept(&subqueryChecker{ - text: t.text, - c: c, + text: tbl.text, + t: t, }) } } -func (s *testParserSuite) TestUnion(c *C) { +func TestUnion(t *testing.T) { table := []testCase{ {"select c1 from t1 union select c2 from t2", true, "SELECT `c1` FROM `t1` UNION SELECT `c2` FROM `t2`"}, {"select c1 from t1 union (select c2 from t2)", true, "SELECT `c1` FROM `t1` UNION (SELECT `c2` FROM `t2`)"}, @@ -2258,12 +2276,21 @@ func (s *testParserSuite) TestUnion(c *C) { {"insert into t (c) select c1 from t1 union select c2 from t2", true, "INSERT INTO `t` (`c`) SELECT `c1` FROM `t1` UNION SELECT `c2` FROM `t2`"}, {"select 2 as a from dual union select 1 as b from dual order by a", true, "SELECT 2 AS `a` UNION SELECT 1 AS `b` ORDER BY `a`"}, } - s.RunTest(c, table) + RunTest(t, table, false) } -func (s *testParserSuite) TestUnionOrderBy(c *C) { - parser := New() - parser.EnableWindowFunc(s.enableWindowFunc) +func checkOrderBy(t *testing.T, s ast.Node, hasOrderBy []bool, i int) int { + switch x := s.(type) { + case *ast.SelectStmt: + require.Equal(t, hasOrderBy[i], x.OrderBy != nil) + return i + 1 + } + return i +} + +func TestUnionOrderBy(t *testing.T) { + parser := parser.New() + parser.EnableWindowFunc(false) tests := []struct { src string @@ -2276,26 +2303,25 @@ func (s *testParserSuite) TestUnionOrderBy(c *C) { {"select 1 a, 2 b from dual", []bool{false}}, } - for _, t := range tests { - stmt, _, err := parser.Parse(t.src, "", "") - c.Assert(err, IsNil) + for _, tt := range tests { + stmt, _, err := parser.Parse(tt.src, "", "") + require.NoError(t, err) us, ok := stmt[0].(*ast.UnionStmt) if ok { var i int for _, s := range us.SelectList.Selects { - c.Assert(s.OrderBy != nil, Equals, t.hasOrderBy[i]) - i++ + i = checkOrderBy(t, s, tt.hasOrderBy, i) } - c.Assert(us.OrderBy != nil, Equals, t.hasOrderBy[i]) + require.Equal(t, tt.hasOrderBy[i], us.OrderBy != nil) } ss, ok := stmt[0].(*ast.SelectStmt) if ok { - c.Assert(ss.OrderBy != nil, Equals, t.hasOrderBy[0]) + require.Equal(t, tt.hasOrderBy[0], ss.OrderBy != nil) } } } -func (s *testParserSuite) TestLikeEscape(c *C) { +func TestLikeEscape(t *testing.T) { table := []testCase{ // for like escape {`select "abc_" like "abc\\_" escape ''`, true, "SELECT 'abc_' LIKE 'abc\\_'"}, @@ -2305,28 +2331,32 @@ func (s *testParserSuite) TestLikeEscape(c *C) { {"select '''_' like '''_' escape ''''", true, "SELECT '''_' LIKE '''_' ESCAPE ''''"}, } - s.RunTest(c, table) + RunTest(t, table, false) } -func (s *testParserSuite) TestMysqlDump(c *C) { - // Statements used by mysqldump. +func TestLockUnlockTables(t *testing.T) { table := []testCase{ - {`UNLOCK TABLES;`, true, ""}, - {`LOCK TABLES t1 READ;`, true, ""}, - {`show table status like 't'`, true, "SHOW TABLE STATUS LIKE 't'"}, - {`LOCK TABLES t2 WRITE`, true, ""}, + {`UNLOCK TABLES;`, true, "UNLOCK TABLES"}, + {`LOCK TABLES t1 READ;`, true, "LOCK TABLES `t1` READ"}, + {`LOCK TABLES t1 READ LOCAL;`, true, "LOCK TABLES `t1` READ LOCAL"}, + {`LOCK TABLES t2 WRITE`, true, "LOCK TABLES `t2` WRITE"}, + {`LOCK TABLES t2 WRITE LOCAL;`, true, "LOCK TABLES `t2` WRITE LOCAL"}, + {`LOCK TABLES t1 WRITE, t2 READ;`, true, "LOCK TABLES `t1` WRITE, `t2` READ"}, + {`LOCK TABLES t1 WRITE LOCAL, t2 READ LOCAL;`, true, "LOCK TABLES `t1` WRITE LOCAL, `t2` READ LOCAL"}, // for unlock table and lock table - {`UNLOCK TABLE;`, true, ""}, - {`LOCK TABLE t1 READ;`, true, ""}, - {`show table status like 't'`, true, "SHOW TABLE STATUS LIKE 't'"}, - {`LOCK TABLE t2 WRITE`, true, ""}, - {`LOCK TABLE t1 WRITE, t3 READ`, true, ""}, + {`UNLOCK TABLE;`, true, "UNLOCK TABLES"}, + {`LOCK TABLE t1 READ;`, true, "LOCK TABLES `t1` READ"}, + {`LOCK TABLE t1 READ LOCAL;`, true, "LOCK TABLES `t1` READ LOCAL"}, + {`LOCK TABLE t2 WRITE`, true, "LOCK TABLES `t2` WRITE"}, + {`LOCK TABLE t2 WRITE LOCAL;`, true, "LOCK TABLES `t2` WRITE LOCAL"}, + {`LOCK TABLE t1 WRITE, t2 READ;`, true, "LOCK TABLES `t1` WRITE, `t2` READ"}, } - s.RunTest(c, table) + + RunTest(t, table, false) } -func (s *testParserSuite) TestIndexHint(c *C) { +func TestIndexHint(t *testing.T) { table := []testCase{ {`select * from t use index (primary)`, true, "SELECT * FROM `t` USE INDEX (`primary`)"}, {"select * from t use index (`primary`)", true, "SELECT * FROM `t` USE INDEX (`primary`)"}, @@ -2339,10 +2369,10 @@ func (s *testParserSuite) TestIndexHint(c *C) { {`select * from t force index for group by (idx1)`, true, "SELECT * FROM `t` FORCE INDEX FOR GROUP BY (`idx1`)"}, {`select * from t use index for group by (idx1) use index for order by (idx2), t2`, true, "SELECT * FROM (`t` USE INDEX FOR GROUP BY (`idx1`) USE INDEX FOR ORDER BY (`idx2`)) JOIN `t2`"}, } - s.RunTest(c, table) + RunTest(t, table, false) } -func (s *testParserSuite) TestPriority(c *C) { +func TestPriority(t *testing.T) { table := []testCase{ {`select high_priority * from t`, true, "SELECT HIGH_PRIORITY * FROM `t`"}, {`select low_priority * from t`, true, "SELECT LOW_PRIORITY * FROM `t`"}, @@ -2360,33 +2390,33 @@ func (s *testParserSuite) TestPriority(c *C) { {`replace LOW_PRIORITY into t values (1)`, true, "REPLACE LOW_PRIORITY INTO `t` VALUES (1)"}, {`replace delayed into t values (1)`, true, "REPLACE DELAYED INTO `t` VALUES (1)"}, } - s.RunTest(c, table) + RunTest(t, table, false) - parser := New() + parser := parser.New() stmt, _, err := parser.Parse("select HIGH_PRIORITY * from t", "", "") - c.Assert(err, IsNil) + require.NoError(t, err) sel := stmt[0].(*ast.SelectStmt) - c.Assert(sel.SelectStmtOpts.Priority, Equals, mysql.HighPriority) + require.Equal(t, mysql.HighPriority, sel.SelectStmtOpts.Priority) } -func (s *testParserSuite) TestSQLNoCache(c *C) { +func TestSQLNoCache(t *testing.T) { table := []testCase{ {`select SQL_NO_CACHE * from t`, false, ""}, {`select SQL_CACHE * from t`, true, "SELECT * FROM `t`"}, {`select * from t`, true, "SELECT * FROM `t`"}, } - parser := New() + parser := parser.New() for _, tt := range table { stmt, _, err := parser.Parse(tt.src, "", "") - c.Assert(err, IsNil) + require.NoError(t, err) sel := stmt[0].(*ast.SelectStmt) - c.Assert(sel.SelectStmtOpts.SQLCache, Equals, tt.ok) + require.Equal(t, tt.ok, sel.SelectStmtOpts.SQLCache) } } -func (s *testParserSuite) TestEscape(c *C) { +func TestEscape(t *testing.T) { table := []testCase{ {`select """;`, false, ""}, {`select """";`, true, "SELECT '\"'"}, @@ -2396,20 +2426,20 @@ func (s *testParserSuite) TestEscape(c *C) { {`select "\a\r\n"`, true, "SELECT 'a\r\n'"}, {`select "\xFF"`, true, "SELECT 'xFF'"}, } - s.RunTest(c, table) + RunTest(t, table, false) } -func (s *testParserSuite) TestInsertStatementMemoryAllocation(c *C) { +func TestInsertStatementMemoryAllocation(t *testing.T) { sql := "insert t values (1)" + strings.Repeat(",(1)", 1000) var oldStats, newStats runtime.MemStats runtime.ReadMemStats(&oldStats) - _, err := New().ParseOneStmt(sql, "", "") - c.Assert(err, IsNil) + _, err := parser.New().ParseOneStmt(sql, "", "") + require.NoError(t, err) runtime.ReadMemStats(&newStats) - c.Assert(int(newStats.TotalAlloc-oldStats.TotalAlloc), Less, 1024*500) + require.Less(t, int(newStats.TotalAlloc-oldStats.TotalAlloc), 1024*500) } -func (s *testParserSuite) TestExplain(c *C) { +func TestExplain(t *testing.T) { table := []testCase{ {"explain select c1 from t1", true, "EXPLAIN FORMAT = 'row' SELECT `c1` FROM `t1`"}, {"explain delete t1, t2 from t1 inner join t2 inner join t3 where t1.id=t2.id and t2.id=t3.id;", true, "EXPLAIN FORMAT = 'row' DELETE `t1`,`t2` FROM (`t1` JOIN `t2`) JOIN `t3` WHERE `t1`.`id`=`t2`.`id` AND `t2`.`id`=`t3`.`id`"}, @@ -2427,46 +2457,62 @@ func (s *testParserSuite) TestExplain(c *C) { {"EXPLAIN FORMAT = 'ROW' SELECT 1", true, "EXPLAIN FORMAT = 'ROW' SELECT 1"}, {"EXPLAIN SELECT 1", true, "EXPLAIN FORMAT = 'row' SELECT 1"}, } - s.RunTest(c, table) + RunTest(t, table, false) } -func (s *testParserSuite) TestPrepare(c *C) { +func TestPrepare(t *testing.T) { table := []testCase{ {"PREPARE pname FROM 'SELECT ?'", true, "PREPARE `pname` FROM 'SELECT ?'"}, {"PREPARE pname FROM @test", true, "PREPARE `pname` FROM @`test`"}, {"PREPARE `` FROM @test", true, "PREPARE `` FROM @`test`"}, } - s.RunTest(c, table) + RunTest(t, table, false) } -func (s *testParserSuite) TestSavePoint(c *C) { +func TestSavePoint(t *testing.T) { table := []testCase{ {"SAVEPOINT id1", true, "SAVEPOINT id1"}, {"ROLLBACK TO SAVEPOINT id1", true, "ROLLBACK TO SAVEPOINT id1"}, {"RELEASE SAVEPOINT id1", true, "RELEASE SAVEPOINT id1"}, {"RELEASE SAVEPOINT id1", true, "RELEASE SAVEPOINT id1"}, } - s.RunTest(c, table) + RunTest(t, table, false) +} + +func TestRollUp(t *testing.T) { + table := []testCase{ + {"select c2,c1 from t group by c1 with rollup", true, "SELECT `c2`,`c1` FROM `t` GROUP BY `c1` WITH ROLLUP"}, + {"select coalesce(c1,'ALL'),c2,c1 from t group by c1 with rollup", true, "SELECT COALESCE(`c1`, 'ALL'),`c2`,`c1` FROM `t` GROUP BY `c1` WITH ROLLUP"}, + } + RunTest(t, table, false) } -func (s *testParserSuite) TestDeallocate(c *C) { +func TestDeallocate(t *testing.T) { table := []testCase{ {"DEALLOCATE PREPARE test", true, "DEALLOCATE PREPARE `test`"}, {"DEALLOCATE PREPARE ``", true, "DEALLOCATE PREPARE ``"}, } - s.RunTest(c, table) + RunTest(t, table, false) } -func (s *testParserSuite) TestExecute(c *C) { +func TestExecute(t *testing.T) { table := []testCase{ {"EXECUTE test", true, "EXECUTE `test`"}, {"EXECUTE test USING @var1,@var2", true, "EXECUTE `test` USING @`var1`,@`var2`"}, {"EXECUTE `` USING @var1,@var2", true, "EXECUTE `` USING @`var1`,@`var2`"}, } - s.RunTest(c, table) + RunTest(t, table, false) } -func (s *testParserSuite) TestTrace(c *C) { +func TestOrderBy(t *testing.T) { + table := []testCase{ + {"select c1 from t1 group by c1 order by null", true, "SELECT `c1` FROM `t1` GROUP BY `c1` ORDER BY NULL"}, + {"select c1 from t1 group by c1 order by 1", true, "SELECT `c1` FROM `t1` GROUP BY `c1` ORDER BY 1"}, + } + RunTest(t, table, false) +} + +func TestTrace(t *testing.T) { table := []testCase{ {"trace select c1 from t1", true, "TRACE SELECT `c1` FROM `t1`"}, {"trace delete t1, t2 from t1 inner join t2 inner join t3 where t1.id=t2.id and t2.id=t3.id;", true, "TRACE DELETE `t1`,`t2` FROM (`t1` JOIN `t2`) JOIN `t3` WHERE `t1`.`id`=`t2`.`id` AND `t2`.`id`=`t3`.`id`"}, @@ -2477,10 +2523,10 @@ func (s *testParserSuite) TestTrace(c *C) { {"trace format = 'row' select c1 from t1 union (select c2 from t2) limit 1, 1", true, "TRACE FORMAT = 'row' SELECT `c1` FROM `t1` UNION (SELECT `c2` FROM `t2`) LIMIT 1,1"}, {"trace format = 'json' update t set id = id + 1 order by id desc;", true, "TRACE UPDATE `t` SET `id`=`id`+1 ORDER BY `id` DESC"}, } - s.RunTest(c, table) + RunTest(t, table, false) } -func (s *testParserSuite) TestBinding(c *C) { +func TestBinding(t *testing.T) { table := []testCase{ {"create global binding for select * from t using select * from t use index(a)", true, "CREATE GLOBAL BINDING FOR SELECT * FROM `t` USING SELECT * FROM `t` USE INDEX (`a`)"}, {"create session binding for select * from t using select * from t use index(a)", true, "CREATE SESSION BINDING FOR SELECT * FROM `t` USING SELECT * FROM `t` USE INDEX (`a`)"}, @@ -2489,19 +2535,19 @@ func (s *testParserSuite) TestBinding(c *C) { {"show global bindings", true, "SHOW GLOBAL BINDINGS"}, {"show session bindings", true, "SHOW SESSION BINDINGS"}, } - s.RunTest(c, table) + RunTest(t, table, false) - p := New() + p := parser.New() sms, _, err := p.Parse("create global binding for select * from t using select * from t use index(a)", "", "") - c.Assert(err, IsNil) + require.NoError(t, err) v, ok := sms[0].(*ast.CreateBindingStmt) - c.Assert(ok, IsTrue) - c.Assert(v.OriginSel.Text(), Equals, "select * from t") - c.Assert(v.HintedSel.Text(), Equals, "select * from t use index(a)") - c.Assert(v.GlobalScope, IsTrue) + require.True(t, ok) + require.Equal(t, "select * from t", v.OriginSel.Text()) + require.Equal(t, "select * from t use index(a)", v.HintedSel.Text()) + require.True(t, v.GlobalScope) } -func (s *testParserSuite) TestView(c *C) { +func TestView(t *testing.T) { table := []testCase{ {"create view v as select * from t", true, "CREATE ALGORITHM = UNDEFINED DEFINER = CURRENT_USER SQL SECURITY DEFINER VIEW `v` AS SELECT * FROM `t`"}, {"create or replace view v as select * from t", true, "CREATE OR REPLACE ALGORITHM = UNDEFINED DEFINER = CURRENT_USER SQL SECURITY DEFINER VIEW `v` AS SELECT * FROM `t`"}, @@ -2516,18 +2562,18 @@ func (s *testParserSuite) TestView(c *C) { {"create or replace algorithm = merge definer = 'root' sql security invoker view v(a,b) as select * from t with cascaded check option", true, "CREATE OR REPLACE ALGORITHM = MERGE DEFINER = `root`@`%` SQL SECURITY INVOKER VIEW `v` (`a`,`b`) AS SELECT * FROM `t`"}, {"create or replace algorithm = merge definer = current_user view v as select * from t", true, "CREATE OR REPLACE ALGORITHM = MERGE DEFINER = CURRENT_USER SQL SECURITY DEFINER VIEW `v` AS SELECT * FROM `t`"}, } - s.RunTest(c, table) + RunTest(t, table, false) // Test case for the text of the select statement in create view statement. - p := New() + p := parser.New() sms, _, err := p.Parse("create view v as select * from t", "", "") - c.Assert(err, IsNil) + require.NoError(t, err) v, ok := sms[0].(*ast.CreateViewStmt) - c.Assert(ok, IsTrue) - c.Assert(v.Algorithm, Equals, model.AlgorithmUndefined) - c.Assert(v.Select.Text(), Equals, "select * from t") - c.Assert(v.Security, Equals, model.SecurityDefiner) - c.Assert(v.CheckOption, Equals, model.CheckOptionCascaded) + require.True(t, ok) + require.Equal(t, model.AlgorithmUndefined, v.Algorithm) + require.Equal(t, "select * from t", v.Select.Text()) + require.Equal(t, model.SecurityDefiner, v.Security) + require.Equal(t, model.CheckOptionCascaded, v.CheckOption) src := `CREATE OR REPLACE ALGORITHM = UNDEFINED DEFINER = root@localhost SQL SECURITY DEFINER @@ -2536,39 +2582,41 @@ func (s *testParserSuite) TestView(c *C) { var st ast.StmtNode st, err = p.ParseOneStmt(src, "", "") - c.Assert(err, IsNil) + require.NoError(t, err) v, ok = st.(*ast.CreateViewStmt) - c.Assert(ok, IsTrue) - c.Assert(v.OrReplace, IsTrue) - c.Assert(v.Algorithm, Equals, model.AlgorithmUndefined) - c.Assert(v.Definer.Username, Equals, "root") - c.Assert(v.Definer.Hostname, Equals, "localhost") - c.Assert(v.Cols[0], Equals, model.NewCIStr("a")) - c.Assert(v.Cols[1], Equals, model.NewCIStr("b")) - c.Assert(v.Cols[2], Equals, model.NewCIStr("c")) - c.Assert(v.Select.Text(), Equals, "select c,d,e from t") - c.Assert(v.Security, Equals, model.SecurityDefiner) - c.Assert(v.CheckOption, Equals, model.CheckOptionCascaded) -} - -func (s *testParserSuite) TestTimestampDiffUnit(c *C) { + require.True(t, ok) + require.True(t, v.OrReplace) + require.Equal(t, model.AlgorithmUndefined, v.Algorithm) + require.Equal(t, "root", v.Definer.Username) + require.Equal(t, "localhost", v.Definer.Hostname) + require.Equal(t, model.NewCIStr("a"), v.Cols[0]) + require.Equal(t, model.NewCIStr("b"), v.Cols[1]) + require.Equal(t, model.NewCIStr("c"), v.Cols[2]) + require.Equal(t, "select c,d,e from t", v.Select.Text()) + require.Equal(t, model.SecurityDefiner, v.Security) + require.Equal(t, model.CheckOptionCascaded, v.CheckOption) + +} + +func TestTimestampDiffUnit(t *testing.T) { // Test case for timestampdiff unit. // TimeUnit should be unified to upper case. - parser := New() + parser := parser.New() stmt, _, err := parser.Parse("SELECT TIMESTAMPDIFF(MONTH,'2003-02-01','2003-05-01'), TIMESTAMPDIFF(month,'2003-02-01','2003-05-01');", "", "") - c.Assert(err, IsNil) + require.NoError(t, err) ss := stmt[0].(*ast.SelectStmt) fields := ss.Fields.Fields - c.Assert(len(fields), Equals, 2) + require.Len(t, fields, 2) + expr := fields[0].Expr f, ok := expr.(*ast.FuncCallExpr) - c.Assert(ok, IsTrue) - c.Assert(f.Args[0].(ast.ValueExpr).GetDatumString(), Equals, "MONTH") + require.True(t, ok) + require.Equal(t, "MONTH", f.Args[0].(ast.ValueExpr).GetDatumString()) expr = fields[1].Expr f, ok = expr.(*ast.FuncCallExpr) - c.Assert(ok, IsTrue) - c.Assert(f.Args[0].(ast.ValueExpr).GetDatumString(), Equals, "MONTH") + require.True(t, ok) + require.Equal(t, "MONTH", f.Args[0].(ast.ValueExpr).GetDatumString()) // Test Illegal TimeUnit for TimestampDiff table := []testCase{ @@ -2584,10 +2632,10 @@ func (s *testParserSuite) TestTimestampDiffUnit(c *C) { {"SELECT TIMESTAMPDIFF(DAY_HOUR,'2003-02-01','2003-05-01')", false, ""}, {"SELECT TIMESTAMPDIFF(YEAR_MONTH,'2003-02-01','2003-05-01')", false, ""}, } - s.RunTest(c, table) + RunTest(t, table, false) } -func (s *testParserSuite) TestSessionManage(c *C) { +func TestSessionManage(t *testing.T) { table := []testCase{ // Kill statement. // See https://dev.mysql.com/doc/refman/5.7/en/kill.html @@ -2600,11 +2648,11 @@ func (s *testParserSuite) TestSessionManage(c *C) { {"show processlist", true, "SHOW PROCESSLIST"}, {"show full processlist", true, "SHOW FULL PROCESSLIST"}, } - s.RunTest(c, table) + RunTest(t, table, false) } -func (s *testParserSuite) TestSQLModeANSIQuotes(c *C) { - parser := New() +func TestSQLModeANSIQuotes(t *testing.T) { + parser := parser.New() parser.SetSQLMode(mysql.ModeANSIQuotes) tests := []string{ `CREATE TABLE "table" ("id" int)`, @@ -2612,30 +2660,30 @@ func (s *testParserSuite) TestSQLModeANSIQuotes(c *C) { } for _, test := range tests { _, _, err := parser.Parse(test, "", "") - c.Assert(err, IsNil) + require.NoError(t, err) } } -func (s *testParserSuite) TestDDLStatements(c *C) { - parser := New() +func TestDDLStatements(t *testing.T) { + parser := parser.New() // Tests that whatever the charset it is define, we always assign utf8 charset and utf8_bin collate. createTableStr := `CREATE TABLE t ( a varchar(64) binary, b char(10) charset utf8 collate utf8_general_ci, c text charset latin1) ENGINE=innoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin` stmts, _, err := parser.Parse(createTableStr, "", "") - c.Assert(err, IsNil) + require.NoError(t, err) stmt := stmts[0].(*ast.CreateTableStmt) - c.Assert(mysql.HasBinaryFlag(stmt.Cols[0].Tp.Flag), IsTrue) + require.True(t, mysql.HasBinaryFlag(stmt.Cols[0].Tp.Flag)) for _, colDef := range stmt.Cols[1:] { - c.Assert(mysql.HasBinaryFlag(colDef.Tp.Flag), IsFalse) + require.False(t, mysql.HasBinaryFlag(colDef.Tp.Flag)) } for _, tblOpt := range stmt.Options { switch tblOpt.Tp { case ast.TableOptionCharset: - c.Assert(tblOpt.StrValue, Equals, "utf8") + require.Equal(t, "utf8", tblOpt.StrValue) case ast.TableOptionCollate: - c.Assert(tblOpt.StrValue, Equals, "utf8_bin") + require.Equal(t, "utf8_bin", tblOpt.StrValue) } } createTableStr = `CREATE TABLE t ( @@ -2643,16 +2691,16 @@ func (s *testParserSuite) TestDDLStatements(c *C) { b binary(10), c blob)` stmts, _, err = parser.Parse(createTableStr, "", "") - c.Assert(err, IsNil) + require.NoError(t, err) stmt = stmts[0].(*ast.CreateTableStmt) for _, colDef := range stmt.Cols { - c.Assert(colDef.Tp.Charset, Equals, mysql.CharsetBin) - c.Assert(colDef.Tp.Collate, Equals, mysql.CollationBin) - c.Assert(mysql.HasBinaryFlag(colDef.Tp.Flag), IsTrue) + require.Equal(t, mysql.CharsetBin, colDef.Tp.Charset) + require.Equal(t, mysql.CollationBin, colDef.Tp.Collate) + require.True(t, mysql.HasBinaryFlag(colDef.Tp.Flag)) } } -func (s *testParserSuite) TestAnalyze(c *C) { +func TestAnalyze(t *testing.T) { table := []testCase{ {"analyze table t1", true, "ANALYZE TABLE `t1`"}, {"analyze table t,t1", true, "ANALYZE TABLE `t`,`t1`"}, @@ -2666,10 +2714,10 @@ func (s *testParserSuite) TestAnalyze(c *C) { {"analyze table t partition a index b", true, "ANALYZE TABLE `t` PARTITION `a` INDEX `b`"}, {"analyze table t partition a index b with 4 buckets", true, "ANALYZE TABLE `t` PARTITION `a` INDEX `b` WITH 4 BUCKETS"}, } - s.RunTest(c, table) + RunTest(t, table, false) } -func (s *testParserSuite) TestGeneratedColumn(c *C) { +func TestGeneratedColumn(t *testing.T) { tests := []struct { input string ok bool @@ -2679,27 +2727,27 @@ func (s *testParserSuite) TestGeneratedColumn(c *C) { {"create table t (c int, d int as ( c + 1 ) virtual)", true, "c + 1"}, {"create table t (c int, d int as (1 + 1) stored)", true, "1 + 1"}, } - parser := New() + parser := parser.New() for _, tt := range tests { stmtNodes, _, err := parser.Parse(tt.input, "", "") if tt.ok { - c.Assert(err, IsNil) + require.NoError(t, err) stmtNode := stmtNodes[0] for _, col := range stmtNode.(*ast.CreateTableStmt).Cols { for _, opt := range col.Options { if opt.Tp == ast.ColumnOptionGenerated { - c.Assert(opt.Expr.Text(), Equals, tt.expr) + require.Equal(t, tt.expr, opt.Expr.Text()) } } } } else { - c.Assert(err, NotNil) + require.Error(t, err) } } } -func (s *testParserSuite) TestSetTransaction(c *C) { +func TestSetTransaction(t *testing.T) { // Set transaction is equivalent to setting the global or session value of tx_isolation. // For example: // SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED @@ -2718,31 +2766,32 @@ func (s *testParserSuite) TestSetTransaction(c *C) { true, "REPEATABLE-READ", }, } - parser := New() - for _, t := range tests { - stmt1, err := parser.ParseOneStmt(t.input, "", "") - c.Assert(err, IsNil) + parser := parser.New() + for _, tt := range tests { + stmt1, err := parser.ParseOneStmt(tt.input, "", "") + require.NoError(t, err) setStmt := stmt1.(*ast.SetStmt) vars := setStmt.Variables[0] - c.Assert(vars.Name, Equals, "tx_isolation") - c.Assert(vars.IsGlobal, Equals, t.isGlobal) - c.Assert(vars.IsSystem, Equals, true) - c.Assert(vars.Value.(ast.ValueExpr).GetValue(), Equals, t.value) + require.Equal(t, "tx_isolation", vars.Name) + require.Equal(t, tt.isGlobal, vars.IsGlobal) + require.True(t, vars.IsSystem) + require.Equal(t, tt.value, vars.Value.(ast.ValueExpr).GetValue()) + } } -func (s *testParserSuite) TestSideEffect(c *C) { +func TestSideEffect(t *testing.T) { // This test cover a bug that parse an error SQL doesn't leave the parser in a // clean state, cause the following SQL parse fail. - parser := New() + parser := parser.New() _, err := parser.ParseOneStmt("create table t /*!50100 'abc', 'abc' */;", "", "") - c.Assert(err, NotNil) + require.Error(t, err) _, err = parser.ParseOneStmt("show tables;", "", "") - c.Assert(err, IsNil) + require.NoError(t, err) } -func (s *testParserSuite) TestTablePartition(c *C) { +func TestTablePartition(t *testing.T) { table := []testCase{ {"ALTER TABLE t1 TRUNCATE PARTITION p0", true, "ALTER TABLE `t1` TRUNCATE PARTITION `p0`"}, {"ALTER TABLE t1 ADD PARTITION (PARTITION `p5` VALUES LESS THAN (2010) COMMENT 'APSTART \\' APEND')", true, "ALTER TABLE `t1` ADD PARTITION (PARTITION `p5` VALUES LESS THAN (2010) COMMENT = 'APSTART '' APEND')"}, @@ -2772,70 +2821,68 @@ func (s *testParserSuite) TestTablePartition(c *C) { subpartition by hash (id) (partition p0 values less than (42))`, true, "CREATE TABLE `t` (`id` INT) PARTITION BY RANGE (`id`) (PARTITION `p0` VALUES LESS THAN (42))"}, } - s.RunTest(c, table) + RunTest(t, table, false) // Check comment content. - parser := New() + parser := parser.New() stmt, err := parser.ParseOneStmt("create table t (id int) partition by range (id) (partition p0 values less than (10) comment 'check')", "", "") - c.Assert(err, IsNil) + require.NoError(t, err) createTable := stmt.(*ast.CreateTableStmt) - c.Assert(createTable.Partition.Definitions[0].Comment, Equals, "check") + require.Equal(t, "check", createTable.Partition.Definitions[0].Comment, Equals) } -func (s *testParserSuite) TestTablePartitionNameList(c *C) { +func TestTablePartitionNameList(t *testing.T) { table := []testCase{ {`select * from t partition (p0,p1)`, true, ""}, } - parser := New() + parser := parser.New() for _, tt := range table { stmt, _, err := parser.Parse(tt.src, "", "") - c.Assert(err, IsNil) + require.NoError(t, err) sel := stmt[0].(*ast.SelectStmt) source, ok := sel.From.TableRefs.Left.(*ast.TableSource) - c.Assert(ok, IsTrue) + require.True(t, ok) tableName, ok := source.Source.(*ast.TableName) - c.Assert(ok, IsTrue) - c.Assert(len(tableName.PartitionNames), Equals, 2) - c.Assert(tableName.PartitionNames[0], Equals, model.CIStr{"p0", "p0"}) - c.Assert(tableName.PartitionNames[1], Equals, model.CIStr{"p1", "p1"}) + require.True(t, ok) + require.Len(t, tableName.PartitionNames, 2) + require.Equal(t, model.CIStr{O: "p0", L: "p0"}, tableName.PartitionNames[0]) + require.Equal(t, model.CIStr{O: "p1", L: "p1"}, tableName.PartitionNames[1]) + } } -func (s *testParserSuite) TestNotExistsSubquery(c *C) { +func TestNotExistsSubquery(t *testing.T) { table := []testCase{ {`select * from t1 where not exists (select * from t2 where t1.a = t2.a)`, true, ""}, } - parser := New() + parser := parser.New() for _, tt := range table { stmt, _, err := parser.Parse(tt.src, "", "") - c.Assert(err, IsNil) + require.NoError(t, err) sel := stmt[0].(*ast.SelectStmt) exists, ok := sel.Where.(*ast.ExistsSubqueryExpr) - c.Assert(ok, IsTrue) - c.Assert(exists.Not, Equals, tt.ok) + require.True(t, ok) + require.Equal(t, tt.ok, exists.Not) } } -func (s *testParserSuite) TestWindowFunctionIdentifier(c *C) { +func TestWindowFunctionIdentifier(t *testing.T) { var table []testCase - s.enableWindowFunc = true - for key := range windowFuncTokenMap { + for key := range parser.WindowFuncTokenMap { table = append(table, testCase{fmt.Sprintf("select 1 %s", key), false, fmt.Sprintf("SELECT 1 AS `%s`", key)}) } - s.RunTest(c, table) - - s.enableWindowFunc = false + RunTest(t, table, true) for i := range table { table[i].ok = true } - s.RunTest(c, table) + RunTest(t, table, false) } -func (s *testParserSuite) TestWindowFunctions(c *C) { +func TestWindowFunctions(t *testing.T) { table := []testCase{ // For window function descriptions. // See https://dev.mysql.com/doc/refman/8.0/en/window-function-descriptions.html @@ -2900,15 +2947,14 @@ func (s *testParserSuite) TestWindowFunctions(c *C) { {`select from_unixtime(404411537129996288)`, true, "SELECT FROM_UNIXTIME(404411537129996288)"}, {`select from_unixtime(404411537129996288.22)`, true, "SELECT FROM_UNIXTIME(404411537129996288.22)"}, } - s.enableWindowFunc = true - s.RunTest(c, table) + RunTest(t, table, true) } type windowFrameBoundChecker struct { fb *ast.FrameBound exprRc int timeUnitRc int - c *C + t *testing.T } // Enter implements ast.Visitor interface. @@ -2917,7 +2963,7 @@ func (wfc *windowFrameBoundChecker) Enter(inNode ast.Node) (outNode ast.Node, sk wfc.fb = inNode.(*ast.FrameBound) if wfc.fb.Unit != nil { _, ok := wfc.fb.Expr.(ast.ValueExpr) - wfc.c.Assert(ok, IsFalse) + require.False(wfc.t, ok) } } return inNode, false @@ -2940,8 +2986,8 @@ func (wfc *windowFrameBoundChecker) Leave(inNode ast.Node) (node ast.Node, ok bo // For issue #51 // See https://github.com/XiaoMi/Gaea/parser/pull/51 for details -func (s *testParserSuite) TestVisitFrameBound(c *C) { - parser := New() +func TestVisitFrameBound(t *testing.T) { + parser := parser.New() parser.EnableWindowFunc(true) table := []struct { s string @@ -2952,23 +2998,23 @@ func (s *testParserSuite) TestVisitFrameBound(c *C) { {`SELECT AVG(val) OVER (RANGE 5 PRECEDING) FROM t;`, 1, 0}, {`SELECT AVG(val) OVER () FROM t;`, 0, 0}, } - for _, t := range table { - stmt, err := parser.ParseOneStmt(t.s, "", "") - c.Assert(err, IsNil) - checker := windowFrameBoundChecker{c: c} + for _, tt := range table { + stmt, err := parser.ParseOneStmt(tt.s, "", "") + require.NoError(t, err) + checker := windowFrameBoundChecker{t: t} stmt.Accept(&checker) - c.Assert(checker.exprRc, Equals, t.exprRc) - c.Assert(checker.timeUnitRc, Equals, t.timeUnitRc) + require.Equal(t, tt.exprRc, checker.exprRc) + require.Equal(t, tt.timeUnitRc, checker.timeUnitRc) } } -func (s *testParserSuite) TestFieldText(c *C) { - parser := New() +func TestFieldText(t *testing.T) { + parser := parser.New() stmts, _, err := parser.Parse("select a from t", "", "") - c.Assert(err, IsNil) + require.NoError(t, err) tmp := stmts[0].(*ast.SelectStmt) - c.Assert(tmp.Fields.Fields[0].Text(), Equals, "a") + require.Equal(t, "a", tmp.Fields.Fields[0].Text()) sqls := []string{ "trace select a from t", @@ -2977,23 +3023,23 @@ func (s *testParserSuite) TestFieldText(c *C) { } for _, sql := range sqls { stmts, _, err = parser.Parse(sql, "", "") - c.Assert(err, IsNil) + require.NoError(t, err) traceStmt := stmts[0].(*ast.TraceStmt) - c.Assert(traceStmt.Text(), Equals, sql) - c.Assert(traceStmt.Stmt.Text(), Equals, "select a from t") + require.Equal(t, sql, traceStmt.Text()) + require.Equal(t, "select a from t", traceStmt.Stmt.Text()) } } // See https://github.com/XiaoMi/Gaea/parser/issue/94 -func (s *testParserSuite) TestQuotedSystemVariables(c *C) { - parser := New() +func TestQuotedSystemVariables(t *testing.T) { + parser := parser.New() st, err := parser.ParseOneStmt( "select @@Sql_Mode, @@`SQL_MODE`, @@session.`sql_mode`, @@global.`s ql``mode`, @@session.'sql\\nmode', @@local.\"sql\\\"mode\";", "", "", ) - c.Assert(err, IsNil) + require.NoError(t, err) ss := st.(*ast.SelectStmt) expected := []*ast.VariableExpr{ { @@ -3033,28 +3079,27 @@ func (s *testParserSuite) TestQuotedSystemVariables(c *C) { ExplicitScope: true, }, } - - c.Assert(len(ss.Fields.Fields), Equals, len(expected)) + require.Len(t, ss.Fields.Fields, len(expected)) for i, field := range ss.Fields.Fields { ve := field.Expr.(*ast.VariableExpr) - cmt := Commentf("field %d, ve = %v", i, ve) - c.Assert(ve.Name, Equals, expected[i].Name, cmt) - c.Assert(ve.IsGlobal, Equals, expected[i].IsGlobal, cmt) - c.Assert(ve.IsSystem, Equals, expected[i].IsSystem, cmt) - c.Assert(ve.ExplicitScope, Equals, expected[i].ExplicitScope, cmt) + comment := fmt.Sprintf("field %d, ve = %v", i, ve) + require.Equal(t, expected[i].Name, ve.Name, comment) + require.Equal(t, expected[i].IsGlobal, ve.IsGlobal, comment) + require.Equal(t, expected[i].IsSystem, ve.IsSystem, comment) + require.Equal(t, expected[i].ExplicitScope, ve.ExplicitScope, comment) } } // See https://github.com/XiaoMi/Gaea/parser/issue/95 -func (s *testParserSuite) TestQuotedVariableColumnName(c *C) { - parser := New() +func TestQuotedVariableColumnName(t *testing.T) { + parser := parser.New() st, err := parser.ParseOneStmt( "select @abc, @`abc`, @'aBc', @\"AbC\", @6, @`6`, @'6', @\"6\", @@sql_mode, @@`sql_mode`, @;", "", "", ) - c.Assert(err, IsNil) + require.NoError(t, err) ss := st.(*ast.SelectStmt) expected := []string{ "@abc", @@ -3069,10 +3114,9 @@ func (s *testParserSuite) TestQuotedVariableColumnName(c *C) { "@@`sql_mode`", "@", } - - c.Assert(len(ss.Fields.Fields), Equals, len(expected)) + require.Len(t, ss.Fields.Fields, len(expected)) for i, field := range ss.Fields.Fields { - c.Assert(field.Text(), Equals, expected[i]) + require.Equal(t, expected[i], field.Text()) } } diff --git a/parser/terror/terror_test.go b/parser/terror/terror_test.go index e430c6ee..8b5d0996 100644 --- a/parser/terror/terror_test.go +++ b/parser/terror/terror_test.go @@ -17,81 +17,72 @@ import ( "encoding/json" "testing" - . "github.com/pingcap/check" "github.com/pingcap/errors" + "github.com/stretchr/testify/require" "github.com/XiaoMi/Gaea/util/testleak" ) -func TestT(t *testing.T) { - CustomVerboseFlag = true - TestingT(t) +func TestErrCode(t *testing.T) { + require.Equal(t, ErrCode(1), CodeMissConnectionID) + require.Equal(t, ErrCode(2), CodeResultUndetermined) } -var _ = Suite(&testTErrorSuite{}) - -type testTErrorSuite struct { -} - -func (s *testTErrorSuite) TestErrCode(c *C) { - c.Assert(CodeMissConnectionID, Equals, ErrCode(1)) - c.Assert(CodeResultUndetermined, Equals, ErrCode(2)) -} - -func (s *testTErrorSuite) TestTError(c *C) { - defer testleak.AfterTest(c)() - c.Assert(ClassParser.String(), Not(Equals), "") - c.Assert(ClassOptimizer.String(), Not(Equals), "") - c.Assert(ClassKV.String(), Not(Equals), "") - c.Assert(ClassServer.String(), Not(Equals), "") +func TestTError(t *testing.T) { + defer testleak.AfterTestT(t)() + require.NotEqual(t, "", ClassParser.String()) + require.NotEqual(t, "", ClassOptimizer.String()) + require.NotEqual(t, "", ClassKV.String()) + require.NotEqual(t, "", ClassServer.String()) parserErr := ClassParser.New(ErrCode(1), "error 1") - c.Assert(parserErr.Error(), Not(Equals), "") - c.Assert(ClassParser.EqualClass(parserErr), IsTrue) - c.Assert(ClassParser.NotEqualClass(parserErr), IsFalse) + require.NotEqual(t, "", parserErr.Error()) + require.True(t, ClassParser.EqualClass(parserErr)) + require.False(t, ClassParser.NotEqualClass(parserErr)) + require.False(t, ClassOptimizer.EqualClass(parserErr)) - c.Assert(ClassOptimizer.EqualClass(parserErr), IsFalse) optimizerErr := ClassOptimizer.New(ErrCode(2), "abc") - c.Assert(ClassOptimizer.EqualClass(errors.New("abc")), IsFalse) - c.Assert(ClassOptimizer.EqualClass(nil), IsFalse) - c.Assert(optimizerErr.Equal(optimizerErr.GenWithStack("def")), IsTrue) - c.Assert(optimizerErr.Equal(nil), IsFalse) - c.Assert(optimizerErr.Equal(errors.New("abc")), IsFalse) + require.False(t, ClassOptimizer.EqualClass(errors.New("abc"))) + require.True(t, optimizerErr.Equal(optimizerErr.GenWithStack("def"))) + require.False(t, ClassOptimizer.EqualClass(nil)) + require.False(t, optimizerErr.Equal(nil)) + require.False(t, optimizerErr.Equal(errors.New("abc"))) // Test case for FastGen. - c.Assert(optimizerErr.Equal(optimizerErr.FastGen("def")), IsTrue) - c.Assert(optimizerErr.Equal(optimizerErr.FastGen("def: %s", "def")), IsTrue) + require.True(t, optimizerErr.Equal(optimizerErr.FastGen("def"))) + require.True(t, optimizerErr.Equal(optimizerErr.FastGen("def: %s", "def"))) + kvErr := ClassKV.New(1062, "key already exist") e := kvErr.FastGen("Duplicate entry '%d' for key 'PRIMARY'", 1) - c.Assert(e.Error(), Equals, "[kv:1062]Duplicate entry '1' for key 'PRIMARY'") + require.Equal(t, "[kv:1062]Duplicate entry '1' for key 'PRIMARY'", e.Error()) kvMySQLErrCodes := map[ErrCode]uint16{ 1062: uint16(1062), } ErrClassToMySQLCodes[ClassKV] = kvMySQLErrCodes sqlErr := errors.Cause(e).(*Error).ToSQLError() - c.Assert(sqlErr.Message, Equals, "Duplicate entry '1' for key 'PRIMARY'") - c.Assert(sqlErr.Code, Equals, uint16(1062)) + require.Equal(t, "Duplicate entry '1' for key 'PRIMARY'", sqlErr.Message) + require.Equal(t, uint16(1062), sqlErr.Code) err := errors.Trace(ErrCritical.GenWithStackByArgs("test")) - c.Assert(ErrCritical.Equal(err), IsTrue) + require.True(t, ErrCritical.Equal(err)) err = errors.Trace(ErrCritical) - c.Assert(ErrCritical.Equal(err), IsTrue) + require.True(t, ErrCritical.Equal(err)) } -func (s *testTErrorSuite) TestJson(c *C) { +func TestJson(t *testing.T) { prevTErr := &Error{ class: ClassTable, code: CodeExecResultIsEmpty, message: "json test", } buf, err := json.Marshal(prevTErr) - c.Assert(err, IsNil) + require.NoError(t, err) var curTErr Error err = json.Unmarshal(buf, &curTErr) - c.Assert(err, IsNil) + require.NoError(t, err) isEqual := prevTErr.Equal(&curTErr) - c.Assert(isEqual, IsTrue) + require.True(t, isEqual) } var predefinedErr = ClassExecutor.New(ErrCode(123), "predefiend error") @@ -105,43 +96,43 @@ func call() error { return predefinedErr.GenWithStack("error message:%s", "abc") } -func (s *testTErrorSuite) TestErrorEqual(c *C) { - defer testleak.AfterTest(c)() +func TestErrorEqual(t *testing.T) { + defer testleak.AfterTestT(t)() e1 := errors.New("test error") - c.Assert(e1, NotNil) + require.NotNil(t, e1) e2 := errors.Trace(e1) - c.Assert(e2, NotNil) + require.NotNil(t, e2) e3 := errors.Trace(e2) - c.Assert(e3, NotNil) + require.NotNil(t, e3) - c.Assert(errors.Cause(e2), Equals, e1) - c.Assert(errors.Cause(e3), Equals, e1) - c.Assert(errors.Cause(e2), Equals, errors.Cause(e3)) + require.Equal(t, e1, errors.Cause(e2)) + require.Equal(t, e1, errors.Cause(e3)) + require.Equal(t, errors.Cause(e3), errors.Cause(e2)) e4 := errors.New("test error") - c.Assert(errors.Cause(e4), Not(Equals), e1) + require.NotEqual(t, e1, errors.Cause(e4)) e5 := errors.Errorf("test error") - c.Assert(errors.Cause(e5), Not(Equals), e1) + require.NotEqual(t, e1, errors.Cause(e5)) - c.Assert(ErrorEqual(e1, e2), IsTrue) - c.Assert(ErrorEqual(e1, e3), IsTrue) - c.Assert(ErrorEqual(e1, e4), IsTrue) - c.Assert(ErrorEqual(e1, e5), IsTrue) + require.True(t, ErrorEqual(e1, e2)) + require.True(t, ErrorEqual(e1, e3)) + require.True(t, ErrorEqual(e1, e4)) + require.True(t, ErrorEqual(e1, e5)) var e6 error - c.Assert(ErrorEqual(nil, nil), IsTrue) - c.Assert(ErrorNotEqual(e1, e6), IsTrue) + require.True(t, ErrorEqual(nil, nil)) + require.True(t, ErrorNotEqual(e1, e6)) code1 := ErrCode(1) code2 := ErrCode(2) te1 := ClassParser.New(code1, "abc") te2 := ClassParser.New(code1, "def") te3 := ClassKV.New(code1, "abc") te4 := ClassKV.New(code2, "abc") - c.Assert(ErrorEqual(te1, te2), IsTrue) - c.Assert(ErrorEqual(te1, te3), IsFalse) - c.Assert(ErrorEqual(te3, te4), IsFalse) + require.True(t, ErrorEqual(te1, te2)) + require.False(t, ErrorEqual(te1, te3)) + require.False(t, ErrorEqual(te3, te4)) } diff --git a/parser/tidb-types/binary_literal_test.go b/parser/tidb-types/binary_literal_test.go index ab175705..db15abea 100644 --- a/parser/tidb-types/binary_literal_test.go +++ b/parser/tidb-types/binary_literal_test.go @@ -14,250 +14,245 @@ package types import ( - . "github.com/pingcap/check" + "fmt" + "testing" + + "github.com/stretchr/testify/require" "github.com/XiaoMi/Gaea/parser/stmtctx" "github.com/XiaoMi/Gaea/util/testleak" ) -var _ = Suite(&testBinaryLiteralSuite{}) - -type testBinaryLiteralSuite struct { -} - -func (s *testBinaryLiteralSuite) TestTrimLeadingZeroBytes(c *C) { - defer testleak.AfterTest(c)() - tbl := []struct { - Input []byte - Expected []byte - }{ - {[]byte{}, []byte{}}, - {[]byte{0x0}, []byte{0x0}}, - {[]byte{0x1}, []byte{0x1}}, - {[]byte{0x1, 0x0}, []byte{0x1, 0x0}}, - {[]byte{0x0, 0x1}, []byte{0x1}}, - {[]byte{0x0, 0x0, 0x0}, []byte{0x0}}, - {[]byte{0x1, 0x0, 0x0}, []byte{0x1, 0x0, 0x0}}, - {[]byte{0x0, 0x1, 0x0, 0x0, 0x1, 0x0, 0x0}, []byte{0x1, 0x0, 0x0, 0x1, 0x0, 0x0}}, - {[]byte{0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x1, 0x0, 0x0}, []byte{0x1, 0x0, 0x0, 0x1, 0x0, 0x0}}, - } - for _, t := range tbl { - b := trimLeadingZeroBytes(t.Input) - c.Assert(b, DeepEquals, t.Expected, Commentf("%#v", t)) - } -} - -func (s *testBinaryLiteralSuite) TestParseBitStr(c *C) { - defer testleak.AfterTest(c)() - tbl := []struct { - Input string - Expected []byte - IsError bool - }{ - {"b''", []byte{}, false}, - {"B''", []byte{}, false}, - {"0b''", nil, true}, - {"0b0", []byte{0x0}, false}, - {"b'0'", []byte{0x0}, false}, - {"B'0'", []byte{0x0}, false}, - {"0B0", nil, true}, - {"0b123", nil, true}, - {"b'123'", nil, true}, - {"0b'1010'", nil, true}, - {"0b0000000", []byte{0x0}, false}, - {"b'0000000'", []byte{0x0}, false}, - {"B'0000000'", []byte{0x0}, false}, - {"0b00000000", []byte{0x0}, false}, - {"b'00000000'", []byte{0x0}, false}, - {"B'00000000'", []byte{0x0}, false}, - {"0b000000000", []byte{0x0, 0x0}, false}, - {"b'000000000'", []byte{0x0, 0x0}, false}, - {"B'000000000'", []byte{0x0, 0x0}, false}, - {"0b1", []byte{0x1}, false}, - {"b'1'", []byte{0x1}, false}, - {"B'1'", []byte{0x1}, false}, - {"0b00000001", []byte{0x1}, false}, - {"b'00000001'", []byte{0x1}, false}, - {"B'00000001'", []byte{0x1}, false}, - {"0b000000010", []byte{0x0, 0x2}, false}, - {"b'000000010'", []byte{0x0, 0x2}, false}, - {"B'000000010'", []byte{0x0, 0x2}, false}, - {"0b000000001", []byte{0x0, 0x1}, false}, - {"b'000000001'", []byte{0x0, 0x1}, false}, - {"B'000000001'", []byte{0x0, 0x1}, false}, - {"0b11111111", []byte{0xFF}, false}, - {"b'11111111'", []byte{0xFF}, false}, - {"B'11111111'", []byte{0xFF}, false}, - {"0b111111111", []byte{0x1, 0xFF}, false}, - {"b'111111111'", []byte{0x1, 0xFF}, false}, - {"B'111111111'", []byte{0x1, 0xFF}, false}, - {"0b1101000011001010110110001101100011011110010000001110111011011110111001001101100011001000010000001100110011011110110111100100000011000100110000101110010", []byte("hello world foo bar"), false}, - {"b'1101000011001010110110001101100011011110010000001110111011011110111001001101100011001000010000001100110011011110110111100100000011000100110000101110010'", []byte("hello world foo bar"), false}, - {"B'1101000011001010110110001101100011011110010000001110111011011110111001001101100011001000010000001100110011011110110111100100000011000100110000101110010'", []byte("hello world foo bar"), false}, - {"0b01101000011001010110110001101100011011110010000001110111011011110111001001101100011001000010000001100110011011110110111100100000011000100110000101110010", []byte("hello world foo bar"), false}, - {"b'01101000011001010110110001101100011011110010000001110111011011110111001001101100011001000010000001100110011011110110111100100000011000100110000101110010'", []byte("hello world foo bar"), false}, - {"B'01101000011001010110110001101100011011110010000001110111011011110111001001101100011001000010000001100110011011110110111100100000011000100110000101110010'", []byte("hello world foo bar"), false}, - } - for _, t := range tbl { - b, err := ParseBitStr(t.Input) - if t.IsError { - c.Assert(err, NotNil, Commentf("%#v", t)) - } else { - c.Assert(err, IsNil, Commentf("%#v", t)) - c.Assert([]byte(b), DeepEquals, t.Expected, Commentf("%#v", t)) +func TestBinaryLiteral(t *testing.T) { + t.Run("TestTrimLeadingZeroBytes", func(t *testing.T) { + defer testleak.AfterTestT(t)() + tbl := []struct { + Input []byte + Expected []byte + }{ + {[]byte{}, []byte{}}, + {[]byte{0x0}, []byte{0x0}}, + {[]byte{0x1}, []byte{0x1}}, + {[]byte{0x1, 0x0}, []byte{0x1, 0x0}}, + {[]byte{0x0, 0x1}, []byte{0x1}}, + {[]byte{0x0, 0x0, 0x0}, []byte{0x0}}, + {[]byte{0x1, 0x0, 0x0}, []byte{0x1, 0x0, 0x0}}, + {[]byte{0x0, 0x1, 0x0, 0x0, 0x1, 0x0, 0x0}, []byte{0x1, 0x0, 0x0, 0x1, 0x0, 0x0}}, + {[]byte{0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x1, 0x0, 0x0}, []byte{0x1, 0x0, 0x0, 0x1, 0x0, 0x0}}, } - } -} - -func (s *testBinaryLiteralSuite) TestParseHexStr(c *C) { - defer testleak.AfterTest(c)() - tbl := []struct { - Input string - Expected []byte - IsError bool - }{ - {"x'1'", nil, true}, - {"x'01'", []byte{0x1}, false}, - {"X'01'", []byte{0x1}, false}, - {"0x1", []byte{0x1}, false}, - {"0x-1", nil, true}, - {"0X11", nil, true}, - {"x'01+'", nil, true}, - {"0x123", []byte{0x01, 0x23}, false}, - {"0x10", []byte{0x10}, false}, - {"0x4D7953514C", []byte("MySQL"), false}, - {"0x4920616D2061206C6F6E672068657820737472696E67", []byte("I am a long hex string"), false}, - {"x'4920616D2061206C6F6E672068657820737472696E67'", []byte("I am a long hex string"), false}, - {"X'4920616D2061206C6F6E672068657820737472696E67'", []byte("I am a long hex string"), false}, - {"x''", []byte{}, false}, - } - for _, t := range tbl { - hex, err := ParseHexStr(t.Input) - if t.IsError { - c.Assert(err, NotNil, Commentf("%#v", t)) - } else { - c.Assert(err, IsNil, Commentf("%#v", t)) - c.Assert([]byte(hex), DeepEquals, t.Expected, Commentf("%#v", t)) + for _, item := range tbl { + b := trimLeadingZeroBytes(item.Input) + require.Equal(t, item.Expected, b, fmt.Sprintf("%#v", item)) } - } -} - -func (s *testBinaryLiteralSuite) TestString(c *C) { - defer testleak.AfterTest(c)() - tbl := []struct { - Input BinaryLiteral - Expected string - }{ - {BinaryLiteral{}, ""}, // Expected - {BinaryLiteral{0x0}, "0x00"}, - {BinaryLiteral{0x1}, "0x01"}, - {BinaryLiteral{0xff, 0x01}, "0xff01"}, - } - for _, t := range tbl { - str := t.Input.String() - c.Assert(str, Equals, t.Expected) - } -} + }) -func (s *testBinaryLiteralSuite) TestToBitLiteralString(c *C) { - defer testleak.AfterTest(c)() - tbl := []struct { - Input BinaryLiteral - TrimLeadingZero bool - Expected string - }{ - {BinaryLiteral{}, true, "b''"}, - {BinaryLiteral{}, false, "b''"}, - {BinaryLiteral{0x0}, true, "b'0'"}, - {BinaryLiteral{0x0}, false, "b'00000000'"}, - {BinaryLiteral{0x0, 0x0}, true, "b'0'"}, - {BinaryLiteral{0x0, 0x0}, false, "b'0000000000000000'"}, - {BinaryLiteral{0x1}, true, "b'1'"}, - {BinaryLiteral{0x1}, false, "b'00000001'"}, - {BinaryLiteral{0xff, 0x01}, true, "b'1111111100000001'"}, - {BinaryLiteral{0xff, 0x01}, false, "b'1111111100000001'"}, - {BinaryLiteral{0x0, 0xff, 0x01}, true, "b'1111111100000001'"}, - {BinaryLiteral{0x0, 0xff, 0x01}, false, "b'000000001111111100000001'"}, - } - for _, t := range tbl { - str := t.Input.ToBitLiteralString(t.TrimLeadingZero) - c.Assert(str, Equals, t.Expected) - } -} - -func (s *testBinaryLiteralSuite) TestToInt(c *C) { - defer testleak.AfterTest(c)() - tbl := []struct { - Input string - Expected uint64 - HasError bool - }{ - {"x''", 0, false}, - {"0x00", 0x0, false}, - {"0xff", 0xff, false}, - {"0x10ff", 0x10ff, false}, - {"0x1010ffff", 0x1010ffff, false}, - {"0x1010ffff8080", 0x1010ffff8080, false}, - {"0x1010ffff8080ff12", 0x1010ffff8080ff12, false}, - {"0x1010ffff8080ff12ff", 0xffffffffffffffff, true}, - } - sc := new(stmtctx.StatementContext) - for _, t := range tbl { - hex, err := ParseHexStr(t.Input) - c.Assert(err, IsNil) - intValue, err := hex.ToInt(sc) - if t.HasError { - c.Assert(err, NotNil) - } else { - c.Assert(err, IsNil) + t.Run("TestParseBitStr", func(t *testing.T) { + defer testleak.AfterTestT(t)() + tbl := []struct { + Input string + Expected []byte + IsError bool + }{ + {"b''", []byte{}, false}, + {"B''", []byte{}, false}, + {"0b''", nil, true}, + {"0b0", []byte{0x0}, false}, + {"b'0'", []byte{0x0}, false}, + {"B'0'", []byte{0x0}, false}, + {"0B0", nil, true}, + {"0b123", nil, true}, + {"b'123'", nil, true}, + {"0b'1010'", nil, true}, + {"0b0000000", []byte{0x0}, false}, + {"b'0000000'", []byte{0x0}, false}, + {"B'0000000'", []byte{0x0}, false}, + {"0b00000000", []byte{0x0}, false}, + {"b'00000000'", []byte{0x0}, false}, + {"B'00000000'", []byte{0x0}, false}, + {"0b000000000", []byte{0x0, 0x0}, false}, + {"b'000000000'", []byte{0x0, 0x0}, false}, + {"B'000000000'", []byte{0x0, 0x0}, false}, + {"0b1", []byte{0x1}, false}, + {"b'1'", []byte{0x1}, false}, + {"B'1'", []byte{0x1}, false}, + {"0b00000001", []byte{0x1}, false}, + {"b'00000001'", []byte{0x1}, false}, + {"B'00000001'", []byte{0x1}, false}, + {"0b000000010", []byte{0x0, 0x2}, false}, + {"b'000000010'", []byte{0x0, 0x2}, false}, + {"B'000000010'", []byte{0x0, 0x2}, false}, + {"0b000000001", []byte{0x0, 0x1}, false}, + {"b'000000001'", []byte{0x0, 0x1}, false}, + {"B'000000001'", []byte{0x0, 0x1}, false}, + {"0b11111111", []byte{0xFF}, false}, + {"b'11111111'", []byte{0xFF}, false}, + {"B'11111111'", []byte{0xFF}, false}, + {"0b111111111", []byte{0x1, 0xFF}, false}, + {"b'111111111'", []byte{0x1, 0xFF}, false}, + {"B'111111111'", []byte{0x1, 0xFF}, false}, + {"0b1101000011001010110110001101100011011110010000001110111011011110111001001101100011001000010000001100110011011110110111100100000011000100110000101110010", []byte("hello world foo bar"), false}, + {"b'1101000011001010110110001101100011011110010000001110111011011110111001001101100011001000010000001100110011011110110111100100000011000100110000101110010'", []byte("hello world foo bar"), false}, + {"B'1101000011001010110110001101100011011110010000001110111011011110111001001101100011001000010000001100110011011110110111100100000011000100110000101110010'", []byte("hello world foo bar"), false}, + {"0b01101000011001010110110001101100011011110010000001110111011011110111001001101100011001000010000001100110011011110110111100100000011000100110000101110010", []byte("hello world foo bar"), false}, + {"b'01101000011001010110110001101100011011110010000001110111011011110111001001101100011001000010000001100110011011110110111100100000011000100110000101110010'", []byte("hello world foo bar"), false}, + {"B'01101000011001010110110001101100011011110010000001110111011011110111001001101100011001000010000001100110011011110110111100100000011000100110000101110010'", []byte("hello world foo bar"), false}, } - c.Assert(intValue, Equals, t.Expected) - } -} - -func (s *testBinaryLiteralSuite) TestNewBinaryLiteralFromUint(c *C) { - defer testleak.AfterTest(c)() - tbl := []struct { - Input uint64 - ByteSize int - Expected []byte - }{ - {0x0, -1, []byte{0x0}}, - {0x0, 1, []byte{0x0}}, - {0x0, 2, []byte{0x0, 0x0}}, - {0x1, -1, []byte{0x1}}, - {0x1, 1, []byte{0x1}}, - {0x1, 2, []byte{0x0, 0x1}}, - {0x1, 3, []byte{0x0, 0x0, 0x1}}, - {0x10, -1, []byte{0x10}}, - {0x123, -1, []byte{0x1, 0x23}}, - {0x123, 2, []byte{0x1, 0x23}}, - {0x123, 1, []byte{0x23}}, - {0x123, 5, []byte{0x0, 0x0, 0x0, 0x1, 0x23}}, - {0x4D7953514C, -1, []byte{0x4D, 0x79, 0x53, 0x51, 0x4C}}, - {0x4D7953514C, 8, []byte{0x0, 0x0, 0x0, 0x4D, 0x79, 0x53, 0x51, 0x4C}}, - {0x4920616D2061206C, -1, []byte{0x49, 0x20, 0x61, 0x6D, 0x20, 0x61, 0x20, 0x6C}}, - {0x4920616D2061206C, 8, []byte{0x49, 0x20, 0x61, 0x6D, 0x20, 0x61, 0x20, 0x6C}}, - {0x4920616D2061206C, 5, []byte{0x6D, 0x20, 0x61, 0x20, 0x6C}}, - } - for _, t := range tbl { - hex := NewBinaryLiteralFromUint(t.Input, t.ByteSize) - c.Assert([]byte(hex), DeepEquals, t.Expected, Commentf("%#v", t)) - } -} + for _, item := range tbl { + b, err := ParseBitStr(item.Input) + if item.IsError { + require.Error(t, err, fmt.Sprintf("%#v", item)) + } else { + require.NoError(t, err, fmt.Sprintf("%#v", item)) + require.Equal(t, item.Expected, []byte(b), fmt.Sprintf("%#v", item)) + } + } + }) + t.Run("TestParseHexStr", func(t *testing.T) { + defer testleak.AfterTestT(t)() + tbl := []struct { + Input string + Expected []byte + IsError bool + }{ + {"x'1'", nil, true}, + {"x'01'", []byte{0x1}, false}, + {"X'01'", []byte{0x1}, false}, + {"0x1", []byte{0x1}, false}, + {"0x-1", nil, true}, + {"0X11", nil, true}, + {"x'01+'", nil, true}, + {"0x123", []byte{0x01, 0x23}, false}, + {"0x10", []byte{0x10}, false}, + {"0x4D7953514C", []byte("MySQL"), false}, + {"0x4920616D2061206C6F6E672068657820737472696E67", []byte("I am a long hex string"), false}, + {"x'4920616D2061206C6F6E672068657820737472696E67'", []byte("I am a long hex string"), false}, + {"X'4920616D2061206C6F6E672068657820737472696E67'", []byte("I am a long hex string"), false}, + {"x''", []byte{}, false}, + } + for _, item := range tbl { + hex, err := ParseHexStr(item.Input) + if item.IsError { + require.Error(t, err, fmt.Sprintf("%#v", item)) + } else { + require.NoError(t, err, fmt.Sprintf("%#v", item)) + require.Equal(t, item.Expected, []byte(hex), fmt.Sprintf("%#v", item)) + } + } + }) + t.Run("TestString", func(t *testing.T) { + defer testleak.AfterTestT(t)() + tbl := []struct { + Input BinaryLiteral + Expected string + }{ + {BinaryLiteral{}, ""}, // Expected + {BinaryLiteral{0x0}, "0x00"}, + {BinaryLiteral{0x1}, "0x01"}, + {BinaryLiteral{0xff, 0x01}, "0xff01"}, + } + for _, item := range tbl { + str := item.Input.String() + require.Equal(t, str, item.Expected) + } + }) + t.Run("TestToBitLiteralString", func(t *testing.T) { + defer testleak.AfterTestT(t)() + tbl := []struct { + Input BinaryLiteral + TrimLeadingZero bool + Expected string + }{ + {BinaryLiteral{}, true, "b''"}, + {BinaryLiteral{}, false, "b''"}, + {BinaryLiteral{0x0}, true, "b'0'"}, + {BinaryLiteral{0x0}, false, "b'00000000'"}, + {BinaryLiteral{0x0, 0x0}, true, "b'0'"}, + {BinaryLiteral{0x0, 0x0}, false, "b'0000000000000000'"}, + {BinaryLiteral{0x1}, true, "b'1'"}, + {BinaryLiteral{0x1}, false, "b'00000001'"}, + {BinaryLiteral{0xff, 0x01}, true, "b'1111111100000001'"}, + {BinaryLiteral{0xff, 0x01}, false, "b'1111111100000001'"}, + {BinaryLiteral{0x0, 0xff, 0x01}, true, "b'1111111100000001'"}, + {BinaryLiteral{0x0, 0xff, 0x01}, false, "b'000000001111111100000001'"}, + } + for _, item := range tbl { + str := item.Input.ToBitLiteralString(item.TrimLeadingZero) + require.Equal(t, str, item.Expected) + } + }) + t.Run("TestToInt", func(t *testing.T) { + defer testleak.AfterTestT(t)() + tbl := []struct { + Input string + Expected uint64 + HasError bool + }{ + {"x''", 0, false}, + {"0x00", 0x0, false}, + {"0xff", 0xff, false}, + {"0x10ff", 0x10ff, false}, + {"0x1010ffff", 0x1010ffff, false}, + {"0x1010ffff8080", 0x1010ffff8080, false}, + {"0x1010ffff8080ff12", 0x1010ffff8080ff12, false}, + {"0x1010ffff8080ff12ff", 0xffffffffffffffff, true}, + } + sc := new(stmtctx.StatementContext) + for _, item := range tbl { + hex, err := ParseHexStr(item.Input) + require.NoError(t, err) + intValue, err := hex.ToInt(sc) + if item.HasError { + require.Error(t, err) + } else { + require.NoError(t, err) + } + require.Equal(t, item.Expected, intValue) + } + }) + t.Run("TestNewBinaryLiteralFromUint", func(t *testing.T) { + defer testleak.AfterTestT(t)() + tbl := []struct { + Input uint64 + ByteSize int + Expected []byte + }{ + {0x0, -1, []byte{0x0}}, + {0x0, 1, []byte{0x0}}, + {0x0, 2, []byte{0x0, 0x0}}, + {0x1, -1, []byte{0x1}}, + {0x1, 1, []byte{0x1}}, + {0x1, 2, []byte{0x0, 0x1}}, + {0x1, 3, []byte{0x0, 0x0, 0x1}}, + {0x10, -1, []byte{0x10}}, + {0x123, -1, []byte{0x1, 0x23}}, + {0x123, 2, []byte{0x1, 0x23}}, + {0x123, 1, []byte{0x23}}, + {0x123, 5, []byte{0x0, 0x0, 0x0, 0x1, 0x23}}, + {0x4D7953514C, -1, []byte{0x4D, 0x79, 0x53, 0x51, 0x4C}}, + {0x4D7953514C, 8, []byte{0x0, 0x0, 0x0, 0x4D, 0x79, 0x53, 0x51, 0x4C}}, + {0x4920616D2061206C, -1, []byte{0x49, 0x20, 0x61, 0x6D, 0x20, 0x61, 0x20, 0x6C}}, + {0x4920616D2061206C, 8, []byte{0x49, 0x20, 0x61, 0x6D, 0x20, 0x61, 0x20, 0x6C}}, + {0x4920616D2061206C, 5, []byte{0x6D, 0x20, 0x61, 0x20, 0x6C}}, + } + for _, item := range tbl { + hex := NewBinaryLiteralFromUint(item.Input, item.ByteSize) + require.Equal(t, item.Expected, []byte(hex), fmt.Sprintf("%#v", item)) + } + }) + t.Run("TestCompare", func(t *testing.T) { + tbl := []struct { + a BinaryLiteral + b BinaryLiteral + cmp int + }{ + {BinaryLiteral{0, 0, 1}, BinaryLiteral{2}, -1}, + {BinaryLiteral{0, 1}, BinaryLiteral{0, 0, 2}, -1}, + {BinaryLiteral{0, 1}, BinaryLiteral{1}, 0}, + {BinaryLiteral{0, 2, 1}, BinaryLiteral{1, 2}, 1}, + } + for _, item := range tbl { + require.Equal(t, item.cmp, item.a.Compare(item.b)) + } + }) -func (s *testBinaryLiteralSuite) TestCompare(c *C) { - tbl := []struct { - a BinaryLiteral - b BinaryLiteral - cmp int - }{ - {BinaryLiteral{0, 0, 1}, BinaryLiteral{2}, -1}, - {BinaryLiteral{0, 1}, BinaryLiteral{0, 0, 2}, -1}, - {BinaryLiteral{0, 1}, BinaryLiteral{1}, 0}, - {BinaryLiteral{0, 2, 1}, BinaryLiteral{1, 2}, 1}, - } - for _, t := range tbl { - c.Assert(t.a.Compare(t.b), Equals, t.cmp) - } } diff --git a/parser/tidb-types/compare_test.go b/parser/tidb-types/compare_test.go index 02ea73e0..42e9770c 100644 --- a/parser/tidb-types/compare_test.go +++ b/parser/tidb-types/compare_test.go @@ -14,22 +14,18 @@ package types import ( + "testing" "time" - . "github.com/pingcap/check" + "github.com/stretchr/testify/require" "github.com/XiaoMi/Gaea/mysql" "github.com/XiaoMi/Gaea/parser/stmtctx" "github.com/XiaoMi/Gaea/util/testleak" ) -var _ = Suite(&testCompareSuite{}) - -type testCompareSuite struct { -} - -func (s *testCompareSuite) TestCompare(c *C) { - defer testleak.AfterTest(c)() +func TestCompare(t *testing.T) { + defer testleak.AfterTestT(t)() cmpTbl := []struct { lhs interface{} rhs interface{} @@ -138,16 +134,16 @@ func (s *testCompareSuite) TestCompare(c *C) { {NewDecFromInt(0), "hello", 0}, } - for i, t := range cmpTbl { - comment := Commentf("%d %v %v", i, t.lhs, t.rhs) - ret, err := compareForTest(t.lhs, t.rhs) - c.Assert(err, IsNil) - c.Assert(ret, Equals, t.ret, comment) + for i, tt := range cmpTbl { + ret, err := compareForTest(tt.lhs, tt.rhs) + require.NoError(t, err) + require.Equal(t, tt.ret, ret, "%d %v %v", i, tt.lhs, tt.rhs) - ret, err = compareForTest(t.rhs, t.lhs) - c.Assert(err, IsNil) - c.Assert(ret, Equals, -t.ret, comment) + ret, err = compareForTest(tt.rhs, tt.lhs) + require.NoError(t, err) + require.Equal(t, -tt.ret, ret, "%d %v %v", i, tt.lhs, tt.rhs) } + } func compareForTest(a, b interface{}) (int, error) { @@ -158,8 +154,8 @@ func compareForTest(a, b interface{}) (int, error) { return aDatum.CompareDatum(sc, &bDatum) } -func (s *testCompareSuite) TestCompareDatum(c *C) { - defer testleak.AfterTest(c)() +func TestCompareDatum(t *testing.T) { + defer testleak.AfterTestT(t)() cmpTbl := []struct { lhs Datum rhs Datum @@ -176,14 +172,13 @@ func (s *testCompareSuite) TestCompareDatum(c *C) { } sc := new(stmtctx.StatementContext) sc.IgnoreTruncate = true - for i, t := range cmpTbl { - comment := Commentf("%d %v %v", i, t.lhs, t.rhs) - ret, err := t.lhs.CompareDatum(sc, &t.rhs) - c.Assert(err, IsNil) - c.Assert(ret, Equals, t.ret, comment) - - ret, err = t.rhs.CompareDatum(sc, &t.lhs) - c.Assert(err, IsNil) - c.Assert(ret, Equals, -t.ret, comment) + for i, tt := range cmpTbl { + ret, err := tt.lhs.CompareDatum(sc, &tt.rhs) + require.NoError(t, err) + require.Equal(t, tt.ret, ret, "%d %v %v", i, tt.lhs, tt.rhs) + + ret, err = tt.rhs.CompareDatum(sc, &tt.lhs) + require.NoError(t, err) + require.Equal(t, -tt.ret, ret, "%d %v %v", i, tt.lhs, tt.rhs) } } diff --git a/parser/tidb-types/convert_test.go b/parser/tidb-types/convert_test.go index 70093a44..b46ac99d 100644 --- a/parser/tidb-types/convert_test.go +++ b/parser/tidb-types/convert_test.go @@ -17,10 +17,11 @@ import ( "fmt" "math" "strconv" + "testing" "time" - . "github.com/pingcap/check" "github.com/pingcap/errors" + "github.com/stretchr/testify/require" "github.com/XiaoMi/Gaea/mysql" "github.com/XiaoMi/Gaea/parser/stmtctx" @@ -29,11 +30,6 @@ import ( "github.com/XiaoMi/Gaea/util/testleak" ) -var _ = Suite(&testTypeConvertSuite{}) - -type testTypeConvertSuite struct { -} - type invalidMockType struct { } @@ -49,307 +45,309 @@ func Convert(val interface{}, target *FieldType) (v interface{}, err error) { return ret.GetValue(), nil } -func (s *testTypeConvertSuite) TestConvertType(c *C) { - defer testleak.AfterTest(c)() +func TestConvertType(t *testing.T) { + defer testleak.AfterTestT(t)() ft := NewFieldType(mysql.TypeBlob) ft.Flen = 4 ft.Charset = "utf8" v, err := Convert("123456", ft) - c.Assert(ErrDataTooLong.Equal(err), IsTrue) - c.Assert(v, Equals, "1234") + require.True(t, ErrDataTooLong.Equal(err)) + require.Equal(t, "1234", v) ft = NewFieldType(mysql.TypeString) ft.Flen = 4 ft.Charset = mysql.CharsetBin v, err = Convert("12345", ft) - c.Assert(ErrDataTooLong.Equal(err), IsTrue) - c.Assert(v, DeepEquals, []byte("1234")) + require.True(t, ErrDataTooLong.Equal(err)) + require.Equal(t, []byte("1234"), v) ft = NewFieldType(mysql.TypeFloat) ft.Flen = 5 ft.Decimal = 2 v, err = Convert(111.114, ft) - c.Assert(err, IsNil) - c.Assert(v, Equals, float32(111.11)) + require.NoError(t, err) + require.Equal(t, float32(111.11), v) ft = NewFieldType(mysql.TypeFloat) ft.Flen = 5 ft.Decimal = 2 v, err = Convert(999.999, ft) - c.Assert(err, NotNil) - c.Assert(v, Equals, float32(999.99)) + require.Error(t, err) + require.Equal(t, float32(999.99), v) ft = NewFieldType(mysql.TypeFloat) ft.Flen = 5 ft.Decimal = 2 v, err = Convert(-999.999, ft) - c.Assert(err, NotNil) - c.Assert(v, Equals, float32(-999.99)) + require.Error(t, err) + require.Equal(t, float32(-999.99), v) ft = NewFieldType(mysql.TypeFloat) ft.Flen = 5 ft.Decimal = 2 v, err = Convert(1111.11, ft) - c.Assert(err, NotNil) - c.Assert(v, Equals, float32(999.99)) + require.Error(t, err) + require.Equal(t, float32(999.99), v) ft = NewFieldType(mysql.TypeFloat) ft.Flen = 5 ft.Decimal = 2 v, err = Convert(999.916, ft) - c.Assert(err, IsNil) - c.Assert(v, Equals, float32(999.92)) + require.NoError(t, err) + require.Equal(t, float32(999.92), v) ft = NewFieldType(mysql.TypeFloat) ft.Flen = 5 ft.Decimal = 2 v, err = Convert(999.914, ft) - c.Assert(err, IsNil) - c.Assert(v, Equals, float32(999.91)) + require.NoError(t, err) + require.Equal(t, float32(999.91), v) ft = NewFieldType(mysql.TypeFloat) ft.Flen = 5 ft.Decimal = 2 v, err = Convert(999.9155, ft) - c.Assert(err, IsNil) - c.Assert(v, Equals, float32(999.92)) + require.NoError(t, err) + require.Equal(t, float32(999.92), v) // For TypeBlob ft = NewFieldType(mysql.TypeBlob) _, err = Convert(&invalidMockType{}, ft) - c.Assert(err, NotNil) + require.Error(t, err) // Nil ft = NewFieldType(mysql.TypeBlob) v, err = Convert(nil, ft) - c.Assert(err, IsNil) - c.Assert(v, IsNil) + require.NoError(t, err) + require.Nil(t, v) // TypeDouble ft = NewFieldType(mysql.TypeDouble) ft.Flen = 5 ft.Decimal = 2 v, err = Convert(999.9155, ft) - c.Assert(err, IsNil) - c.Assert(v, Equals, float64(999.92)) + require.NoError(t, err) + require.Equal(t, float64(999.92), v) // For TypeString ft = NewFieldType(mysql.TypeString) ft.Flen = 3 v, err = Convert("12345", ft) - c.Assert(ErrDataTooLong.Equal(err), IsTrue) - c.Assert(v, Equals, "123") + require.True(t, ErrDataTooLong.Equal(err)) + require.Equal(t, "123", v) ft = NewFieldType(mysql.TypeString) ft.Flen = 3 ft.Charset = mysql.CharsetBin v, err = Convert("12345", ft) - c.Assert(ErrDataTooLong.Equal(err), IsTrue) - c.Assert(v, DeepEquals, []byte("123")) + require.True(t, ErrDataTooLong.Equal(err)) + require.Equal(t, []byte("123"), v) // For TypeDuration ft = NewFieldType(mysql.TypeDuration) ft.Decimal = 3 v, err = Convert("10:11:12.123456", ft) - c.Assert(err, IsNil) - c.Assert(v.(Duration).String(), Equals, "10:11:12.123") + require.NoError(t, err) + require.Equal(t, "10:11:12.123", v.(Duration).String()) + ft.Decimal = 1 vv, err := Convert(v, ft) - c.Assert(err, IsNil) - c.Assert(vv.(Duration).String(), Equals, "10:11:12.1") + require.NoError(t, err) + require.Equal(t, "10:11:12.1", vv.(Duration).String()) vd, err := ParseTime(nil, "2010-10-10 10:11:11.12345", mysql.TypeDatetime, 2) - c.Assert(vd.String(), Equals, "2010-10-10 10:11:11.12") - c.Assert(err, IsNil) + require.Equal(t, "2010-10-10 10:11:11.12", vd.String()) + require.NoError(t, err) v, err = Convert(vd, ft) - c.Assert(err, IsNil) - c.Assert(v.(Duration).String(), Equals, "10:11:11.1") + require.NoError(t, err) + require.Equal(t, "10:11:11.1", v.(Duration).String()) vt, err := ParseTime(&stmtctx.StatementContext{TimeZone: time.UTC}, "2010-10-10 10:11:11.12345", mysql.TypeTimestamp, 2) - c.Assert(vt.String(), Equals, "2010-10-10 10:11:11.12") - c.Assert(err, IsNil) + require.Equal(t, "2010-10-10 10:11:11.12", vt.String()) + require.NoError(t, err) v, err = Convert(vt, ft) - c.Assert(err, IsNil) - c.Assert(v.(Duration).String(), Equals, "10:11:11.1") + require.NoError(t, err) + require.Equal(t, "10:11:11.1", v.(Duration).String()) // For mysql.TypeTimestamp, mysql.TypeDatetime, mysql.TypeDate ft = NewFieldType(mysql.TypeTimestamp) ft.Decimal = 3 v, err = Convert("2010-10-10 10:11:11.12345", ft) - c.Assert(err, IsNil) - c.Assert(v.(Time).String(), Equals, "2010-10-10 10:11:11.123") + require.NoError(t, err) + require.Equal(t, "2010-10-10 10:11:11.123", v.(Time).String()) + ft.Decimal = 1 vv, err = Convert(v, ft) - c.Assert(err, IsNil) - c.Assert(vv.(Time).String(), Equals, "2010-10-10 10:11:11.1") + require.NoError(t, err) + require.Equal(t, "2010-10-10 10:11:11.1", vv.(Time).String()) // For TypeLonglong ft = NewFieldType(mysql.TypeLonglong) v, err = Convert("100", ft) - c.Assert(err, IsNil) - c.Assert(v, Equals, int64(100)) + require.NoError(t, err) + require.Equal(t, int64(100), v) // issue 4287. v, err = Convert(math.Pow(2, 63)-1, ft) - c.Assert(err, IsNil) - c.Assert(v, Equals, int64(math.MaxInt64)) + require.NoError(t, err) + require.Equal(t, int64(math.MaxInt64), v) ft = NewFieldType(mysql.TypeLonglong) ft.Flag |= mysql.UnsignedFlag v, err = Convert("100", ft) - c.Assert(err, IsNil) - c.Assert(v, Equals, uint64(100)) + require.NoError(t, err) + require.Equal(t, uint64(100), v) // issue 3470 ft = NewFieldType(mysql.TypeLonglong) v, err = Convert(Duration{Duration: time.Duration(12*time.Hour + 59*time.Minute + 59*time.Second + 555*time.Millisecond), Fsp: 3}, ft) - c.Assert(err, IsNil) - c.Assert(v, Equals, int64(130000)) + require.NoError(t, err) + require.Equal(t, int64(130000), v) v, err = Convert(Time{ Time: FromDate(2017, 1, 1, 12, 59, 59, 555000), Type: mysql.TypeDatetime, Fsp: MaxFsp}, ft) - c.Assert(err, IsNil) - c.Assert(v, Equals, int64(20170101130000)) + require.NoError(t, err) + require.Equal(t, int64(20170101130000), v) // For TypeBit ft = NewFieldType(mysql.TypeBit) ft.Flen = 24 // 3 bytes. v, err = Convert("100", ft) - c.Assert(err, IsNil) - c.Assert(v, DeepEquals, NewBinaryLiteralFromUint(3223600, 3)) + require.NoError(t, err) + require.Equal(t, NewBinaryLiteralFromUint(3223600, 3), v) v, err = Convert(NewBinaryLiteralFromUint(100, -1), ft) - c.Assert(err, IsNil) - c.Assert(v, DeepEquals, NewBinaryLiteralFromUint(100, 3)) + require.NoError(t, err) + require.Equal(t, NewBinaryLiteralFromUint(100, 3), v) ft.Flen = 1 v, err = Convert(1, ft) - c.Assert(err, IsNil) - c.Assert(v, DeepEquals, NewBinaryLiteralFromUint(1, 1)) + require.NoError(t, err) + require.Equal(t, NewBinaryLiteralFromUint(1, 1), v) _, err = Convert(2, ft) - c.Assert(err, NotNil) + require.Error(t, err) ft.Flen = 0 _, err = Convert(2, ft) - c.Assert(err, NotNil) + require.Error(t, err) // For TypeNewDecimal ft = NewFieldType(mysql.TypeNewDecimal) ft.Flen = 8 ft.Decimal = 4 v, err = Convert(3.1416, ft) - c.Assert(err, IsNil, Commentf(errors.ErrorStack(err))) - c.Assert(v.(*MyDecimal).String(), Equals, "3.1416") + require.NoErrorf(t, err, errors.ErrorStack(err)) + require.Equal(t, "3.1416", v.(*MyDecimal).String()) v, err = Convert("3.1415926", ft) - c.Assert(terror.ErrorEqual(err, ErrTruncated), IsTrue, Commentf("err %v", err)) - c.Assert(v.(*MyDecimal).String(), Equals, "3.1416") + require.True(t, terror.ErrorEqual(err, ErrTruncated)) + require.Equal(t, "3.1416", v.(*MyDecimal).String()) v, err = Convert("99999", ft) - c.Assert(terror.ErrorEqual(err, ErrOverflow), IsTrue, Commentf("err %v", err)) - c.Assert(v.(*MyDecimal).String(), Equals, "9999.9999") + require.Truef(t, terror.ErrorEqual(err, ErrOverflow), "err %v", err) + require.Equal(t, "9999.9999", v.(*MyDecimal).String()) + v, err = Convert("-10000", ft) - c.Assert(terror.ErrorEqual(err, ErrOverflow), IsTrue, Commentf("err %v", err)) - c.Assert(v.(*MyDecimal).String(), Equals, "-9999.9999") + require.Truef(t, terror.ErrorEqual(err, ErrOverflow), "err %v", err) + require.Equal(t, "-9999.9999", v.(*MyDecimal).String()) // Test Datum.ToDecimal with bad number. d := NewDatum("hello") sc := new(stmtctx.StatementContext) _, err = d.ToDecimal(sc) - c.Assert(terror.ErrorEqual(err, ErrBadNumber), IsTrue, Commentf("err %v", err)) + require.Truef(t, terror.ErrorEqual(err, ErrBadNumber), "err %v", err) sc.IgnoreTruncate = true v, err = d.ToDecimal(sc) - c.Assert(err, IsNil) - c.Assert(v.(*MyDecimal).String(), Equals, "0") + require.NoError(t, err) + require.Equal(t, "0", v.(*MyDecimal).String()) // For TypeYear ft = NewFieldType(mysql.TypeYear) v, err = Convert("2015", ft) - c.Assert(err, IsNil) - c.Assert(v, Equals, int64(2015)) + require.NoError(t, err) + require.Equal(t, int64(2015), v) v, err = Convert(2015, ft) - c.Assert(err, IsNil) - c.Assert(v, Equals, int64(2015)) + require.NoError(t, err) + require.Equal(t, int64(2015), v) _, err = Convert(1800, ft) - c.Assert(err, NotNil) + require.Error(t, err) dt, err := ParseDate(nil, "2015-11-11") - c.Assert(err, IsNil) + require.NoError(t, err) v, err = Convert(dt, ft) - c.Assert(err, IsNil) - c.Assert(v, Equals, int64(2015)) + require.NoError(t, err) + require.Equal(t, int64(2015), v) v, err = Convert(ZeroDuration, ft) - c.Assert(err, IsNil) - c.Assert(v, Equals, int64(time.Now().Year())) + require.NoError(t, err) + require.Equal(t, int64(time.Now().Year()), v) // For enum ft = NewFieldType(mysql.TypeEnum) ft.Elems = []string{"a", "b", "c"} v, err = Convert("a", ft) - c.Assert(err, IsNil) - c.Assert(v, DeepEquals, Enum{Name: "a", Value: 1}) + require.NoError(t, err) + require.Equal(t, Enum{Name: "a", Value: 1}, v) v, err = Convert(2, ft) - c.Log(errors.ErrorStack(err)) - c.Assert(err, IsNil) - c.Assert(v, DeepEquals, Enum{Name: "b", Value: 2}) + require.NoError(t, err) + require.Equal(t, Enum{Name: "b", Value: 2}, v) _, err = Convert("d", ft) - c.Assert(err, NotNil) + require.Error(t, err) v, err = Convert(4, ft) - c.Assert(terror.ErrorEqual(err, ErrTruncated), IsTrue, Commentf("err %v", err)) - c.Assert(v, DeepEquals, Enum{}) + require.Truef(t, terror.ErrorEqual(err, ErrTruncated), "err %v", err) + require.Equal(t, Enum{}, v) ft = NewFieldType(mysql.TypeSet) ft.Elems = []string{"a", "b", "c"} v, err = Convert("a", ft) - c.Assert(err, IsNil) - c.Assert(v, DeepEquals, Set{Name: "a", Value: 1}) + require.NoError(t, err) + require.Equal(t, Set{Name: "a", Value: 1}, v) v, err = Convert(2, ft) - c.Assert(err, IsNil) - c.Assert(v, DeepEquals, Set{Name: "b", Value: 2}) + require.NoError(t, err) + require.Equal(t, Set{Name: "b", Value: 2}, v) v, err = Convert(3, ft) - c.Assert(err, IsNil) - c.Assert(v, DeepEquals, Set{Name: "a,b", Value: 3}) + require.NoError(t, err) + require.Equal(t, Set{Name: "a,b", Value: 3}, v) _, err = Convert("d", ft) - c.Assert(err, NotNil) + require.Error(t, err) _, err = Convert(9, ft) - c.Assert(err, NotNil) + require.Error(t, err) } -func testToString(c *C, val interface{}, expect string) { +func testToString(t *testing.T, val interface{}, expect string) { b, err := ToString(val) - c.Assert(err, IsNil) - c.Assert(b, Equals, expect) + require.NoError(t, err) + require.Equal(t, expect, b) } -func (s *testTypeConvertSuite) TestConvertToString(c *C) { - defer testleak.AfterTest(c)() - testToString(c, "0", "0") - testToString(c, true, "1") - testToString(c, "false", "false") - testToString(c, int(0), "0") - testToString(c, int64(0), "0") - testToString(c, uint64(0), "0") - testToString(c, float32(1.6), "1.6") - testToString(c, float64(-0.6), "-0.6") - testToString(c, []byte{1}, "\x01") - testToString(c, NewBinaryLiteralFromUint(0x4D7953514C, -1), "MySQL") - testToString(c, NewBinaryLiteralFromUint(0x41, -1), "A") - testToString(c, Enum{Name: "a", Value: 1}, "a") - testToString(c, Set{Name: "a", Value: 1}, "a") - - t, err := ParseTime(&stmtctx.StatementContext{TimeZone: time.UTC}, +func TestConvertToString(t *testing.T) { + defer testleak.AfterTestT(t)() + testToString(t, "0", "0") + testToString(t, true, "1") + testToString(t, "false", "false") + testToString(t, int(0), "0") + testToString(t, int64(0), "0") + testToString(t, uint64(0), "0") + testToString(t, float32(1.6), "1.6") + testToString(t, float64(-0.6), "-0.6") + testToString(t, []byte{1}, "\x01") + testToString(t, NewBinaryLiteralFromUint(0x4D7953514C, -1), "MySQL") + testToString(t, NewBinaryLiteralFromUint(0x41, -1), "A") + testToString(t, Enum{Name: "a", Value: 1}, "a") + testToString(t, Set{Name: "a", Value: 1}, "a") + + t1, err := ParseTime(&stmtctx.StatementContext{TimeZone: time.UTC}, "2011-11-10 11:11:11.999999", mysql.TypeTimestamp, 6) - c.Assert(err, IsNil) - testToString(c, t, "2011-11-10 11:11:11.999999") + require.NoError(t, err) + testToString(t, t1, "2011-11-10 11:11:11.999999") td, err := ParseDuration(nil, "11:11:11.999999", 6) - c.Assert(err, IsNil) - testToString(c, td, "11:11:11.999999") + require.NoError(t, err) + testToString(t, td, "11:11:11.999999") ft := NewFieldType(mysql.TypeNewDecimal) ft.Flen = 10 ft.Decimal = 5 v, err := Convert(3.1415926, ft) - c.Assert(terror.ErrorEqual(err, ErrTruncated), IsTrue, Commentf("err %v", err)) - testToString(c, v, "3.14159") + require.True(t, terror.ErrorEqual(err, ErrTruncated)) + testToString(t, v, "3.14159") _, err = ToString(&invalidMockType{}) - c.Assert(err, NotNil) + require.Error(t, err) // test truncate tests := []struct { @@ -374,106 +372,106 @@ func (s *testTypeConvertSuite) TestConvertToString(c *C) { sc := new(stmtctx.StatementContext) outputDatum, err := inputDatum.ConvertTo(sc, ft) if tt.input != tt.output { - c.Assert(ErrDataTooLong.Equal(err), IsTrue) + require.True(t, ErrDataTooLong.Equal(err)) } else { - c.Assert(err, IsNil) + require.NoError(t, err) } - c.Assert(outputDatum.GetString(), Equals, tt.output) + require.Equal(t, tt.output, outputDatum.GetString()) } } -func testStrToInt(c *C, str string, expect int64, truncateAsErr bool, expectErr error) { +func testStrToInt(t *testing.T, str string, expect int64, truncateAsErr bool, expectErr error) { sc := new(stmtctx.StatementContext) sc.IgnoreTruncate = !truncateAsErr val, err := StrToInt(sc, str) if expectErr != nil { - c.Assert(terror.ErrorEqual(err, expectErr), IsTrue, Commentf("err %v", err)) + require.Truef(t, terror.ErrorEqual(err, expectErr), "err %v", err) } else { - c.Assert(err, IsNil) - c.Assert(val, Equals, expect) + require.NoError(t, err) + require.Equal(t, expect, val) } } -func testStrToUint(c *C, str string, expect uint64, truncateAsErr bool, expectErr error) { +func testStrToUint(t *testing.T, str string, expect uint64, truncateAsErr bool, expectErr error) { sc := new(stmtctx.StatementContext) sc.IgnoreTruncate = !truncateAsErr val, err := StrToUint(sc, str) if expectErr != nil { - c.Assert(terror.ErrorEqual(err, expectErr), IsTrue, Commentf("err %v", err)) + require.Truef(t, terror.ErrorEqual(err, expectErr), "err %v", err) } else { - c.Assert(err, IsNil) - c.Assert(val, Equals, expect) + require.NoError(t, err) + require.Equal(t, expect, val) } } -func testStrToFloat(c *C, str string, expect float64, truncateAsErr bool, expectErr error) { +func testStrToFloat(t *testing.T, str string, expect float64, truncateAsErr bool, expectErr error) { sc := new(stmtctx.StatementContext) sc.IgnoreTruncate = !truncateAsErr val, err := StrToFloat(sc, str) if expectErr != nil { - c.Assert(terror.ErrorEqual(err, expectErr), IsTrue, Commentf("err %v", err)) + require.Truef(t, terror.ErrorEqual(err, expectErr), "err %v", err) } else { - c.Assert(err, IsNil) - c.Assert(val, Equals, expect) + require.NoError(t, err) + require.Equal(t, expect, val) } } -func (s *testTypeConvertSuite) TestStrToNum(c *C) { - defer testleak.AfterTest(c)() - testStrToInt(c, "0", 0, true, nil) - testStrToInt(c, "-1", -1, true, nil) - testStrToInt(c, "100", 100, true, nil) - testStrToInt(c, "65.0", 65, false, nil) - testStrToInt(c, "65.0", 65, true, nil) - testStrToInt(c, "", 0, false, nil) - testStrToInt(c, "", 0, true, ErrTruncated) - testStrToInt(c, "xx", 0, true, ErrTruncated) - testStrToInt(c, "xx", 0, false, nil) - testStrToInt(c, "11xx", 11, true, ErrTruncated) - testStrToInt(c, "11xx", 11, false, nil) - testStrToInt(c, "xx11", 0, false, nil) - - testStrToUint(c, "0", 0, true, nil) - testStrToUint(c, "", 0, false, nil) - testStrToUint(c, "", 0, false, nil) - testStrToUint(c, "-1", 0xffffffffffffffff, false, ErrOverflow) - testStrToUint(c, "100", 100, true, nil) - testStrToUint(c, "+100", 100, true, nil) - testStrToUint(c, "65.0", 65, true, nil) - testStrToUint(c, "xx", 0, true, ErrTruncated) - testStrToUint(c, "11xx", 11, true, ErrTruncated) - testStrToUint(c, "xx11", 0, true, ErrTruncated) +func TestStrToNum(t *testing.T) { + defer testleak.AfterTestT(t)() + testStrToInt(t, "0", 0, true, nil) + testStrToInt(t, "-1", -1, true, nil) + testStrToInt(t, "100", 100, true, nil) + testStrToInt(t, "65.0", 65, false, nil) + testStrToInt(t, "65.0", 65, true, nil) + testStrToInt(t, "", 0, false, nil) + testStrToInt(t, "", 0, true, ErrTruncated) + testStrToInt(t, "xx", 0, true, ErrTruncated) + testStrToInt(t, "xx", 0, false, nil) + testStrToInt(t, "11xx", 11, true, ErrTruncated) + testStrToInt(t, "11xx", 11, false, nil) + testStrToInt(t, "xx11", 0, false, nil) + + testStrToUint(t, "0", 0, true, nil) + testStrToUint(t, "", 0, false, nil) + testStrToUint(t, "", 0, false, nil) + testStrToUint(t, "-1", 0xffffffffffffffff, false, ErrOverflow) + testStrToUint(t, "100", 100, true, nil) + testStrToUint(t, "+100", 100, true, nil) + testStrToUint(t, "65.0", 65, true, nil) + testStrToUint(t, "xx", 0, true, ErrTruncated) + testStrToUint(t, "11xx", 11, true, ErrTruncated) + testStrToUint(t, "xx11", 0, true, ErrTruncated) // TODO: makes StrToFloat return truncated value instead of zero to make it pass. - testStrToFloat(c, "", 0, true, ErrTruncated) - testStrToFloat(c, "-1", -1.0, true, nil) - testStrToFloat(c, "1.11", 1.11, true, nil) - testStrToFloat(c, "1.11.00", 1.11, false, nil) - testStrToFloat(c, "1.11.00", 1.11, true, ErrTruncated) - testStrToFloat(c, "xx", 0.0, false, nil) - testStrToFloat(c, "0x00", 0.0, false, nil) - testStrToFloat(c, "11.xx", 11.0, false, nil) - testStrToFloat(c, "11.xx", 11.0, true, ErrTruncated) - testStrToFloat(c, "xx.11", 0.0, false, nil) + testStrToFloat(t, "", 0, true, ErrTruncated) + testStrToFloat(t, "-1", -1.0, true, nil) + testStrToFloat(t, "1.11", 1.11, true, nil) + testStrToFloat(t, "1.11.00", 1.11, false, nil) + testStrToFloat(t, "1.11.00", 1.11, true, ErrTruncated) + testStrToFloat(t, "xx", 0.0, false, nil) + testStrToFloat(t, "0x00", 0.0, false, nil) + testStrToFloat(t, "11.xx", 11.0, false, nil) + testStrToFloat(t, "11.xx", 11.0, true, ErrTruncated) + testStrToFloat(t, "xx.11", 0.0, false, nil) // for issue #5111 - testStrToFloat(c, "1e649", math.MaxFloat64, true, ErrTruncatedWrongVal) - testStrToFloat(c, "1e649", math.MaxFloat64, false, nil) - testStrToFloat(c, "-1e649", -math.MaxFloat64, true, ErrTruncatedWrongVal) - testStrToFloat(c, "-1e649", -math.MaxFloat64, false, nil) + testStrToFloat(t, "1e649", math.MaxFloat64, true, ErrTruncatedWrongVal) + testStrToFloat(t, "1e649", math.MaxFloat64, false, nil) + testStrToFloat(t, "-1e649", -math.MaxFloat64, true, ErrTruncatedWrongVal) + testStrToFloat(t, "-1e649", -math.MaxFloat64, false, nil) } -func (s *testTypeConvertSuite) TestFieldTypeToStr(c *C) { - defer testleak.AfterTest(c)() +func TestFieldTypeToStr(t *testing.T) { + defer testleak.AfterTestT(t)() v := TypeToStr(mysql.TypeUnspecified, "not binary") - c.Assert(v, Equals, TypeStr(mysql.TypeUnspecified)) + require.Equal(t, TypeStr(mysql.TypeUnspecified), v) v = TypeToStr(mysql.TypeBlob, mysql.CharsetBin) - c.Assert(v, Equals, "blob") + require.Equal(t, "blob", v) v = TypeToStr(mysql.TypeString, mysql.CharsetBin) - c.Assert(v, Equals, "binary") + require.Equal(t, "binary", v) } -func accept(c *C, tp byte, value interface{}, unsigned bool, expected string) { +func accept(t *testing.T, tp byte, value interface{}, unsigned bool, expected string) { ft := NewFieldType(tp) if unsigned { ft.Flag |= mysql.UnsignedFlag @@ -483,25 +481,25 @@ func accept(c *C, tp byte, value interface{}, unsigned bool, expected string) { sc.TimeZone = time.UTC sc.IgnoreTruncate = true casted, err := d.ConvertTo(sc, ft) - c.Assert(err, IsNil, Commentf("%v", ft)) + require.NoErrorf(t, err, "%v", ft) if casted.IsNull() { - c.Assert(expected, Equals, "") + require.Equal(t, "", expected) } else { str, err := casted.ToString() - c.Assert(err, IsNil) - c.Assert(str, Equals, expected) + require.NoError(t, err) + require.Equal(t, expected, str) } } -func unsignedAccept(c *C, tp byte, value interface{}, expected string) { - accept(c, tp, value, true, expected) +func unsignedAccept(t *testing.T, tp byte, value interface{}, expected string) { + accept(t, tp, value, true, expected) } -func signedAccept(c *C, tp byte, value interface{}, expected string) { - accept(c, tp, value, false, expected) +func signedAccept(t *testing.T, tp byte, value interface{}, expected string) { + accept(t, tp, value, false, expected) } -func deny(c *C, tp byte, value interface{}, unsigned bool, expected string) { +func deny(t *testing.T, tp byte, value interface{}, unsigned bool, expected string) { ft := NewFieldType(tp) if unsigned { ft.Flag |= mysql.UnsignedFlag @@ -509,159 +507,159 @@ func deny(c *C, tp byte, value interface{}, unsigned bool, expected string) { d := NewDatum(value) sc := new(stmtctx.StatementContext) casted, err := d.ConvertTo(sc, ft) - c.Assert(err, NotNil) + require.Error(t, err) if casted.IsNull() { - c.Assert(expected, Equals, "") + require.Equal(t, "", expected) } else { str, err := casted.ToString() - c.Assert(err, IsNil) - c.Assert(str, Equals, expected) + require.NoError(t, err) + require.Equal(t, expected, str) } } -func unsignedDeny(c *C, tp byte, value interface{}, expected string) { - deny(c, tp, value, true, expected) +func unsignedDeny(t *testing.T, tp byte, value interface{}, expected string) { + deny(t, tp, value, true, expected) } -func signedDeny(c *C, tp byte, value interface{}, expected string) { - deny(c, tp, value, false, expected) +func signedDeny(t *testing.T, tp byte, value interface{}, expected string) { + deny(t, tp, value, false, expected) } func strvalue(v interface{}) string { return fmt.Sprintf("%v", v) } -func (s *testTypeConvertSuite) TestConvert(c *C) { - defer testleak.AfterTest(c)() +func TestConvert(t *testing.T) { + defer testleak.AfterTestT(t)() // integer ranges - signedDeny(c, mysql.TypeTiny, -129, "-128") - signedAccept(c, mysql.TypeTiny, -128, "-128") - signedAccept(c, mysql.TypeTiny, 127, "127") - signedDeny(c, mysql.TypeTiny, 128, "127") - unsignedDeny(c, mysql.TypeTiny, -1, "255") - unsignedAccept(c, mysql.TypeTiny, 0, "0") - unsignedAccept(c, mysql.TypeTiny, 255, "255") - unsignedDeny(c, mysql.TypeTiny, 256, "255") - - signedDeny(c, mysql.TypeShort, int64(math.MinInt16)-1, strvalue(int64(math.MinInt16))) - signedAccept(c, mysql.TypeShort, int64(math.MinInt16), strvalue(int64(math.MinInt16))) - signedAccept(c, mysql.TypeShort, int64(math.MaxInt16), strvalue(int64(math.MaxInt16))) - signedDeny(c, mysql.TypeShort, int64(math.MaxInt16)+1, strvalue(int64(math.MaxInt16))) - unsignedDeny(c, mysql.TypeShort, -1, "65535") - unsignedAccept(c, mysql.TypeShort, 0, "0") - unsignedAccept(c, mysql.TypeShort, uint64(math.MaxUint16), strvalue(uint64(math.MaxUint16))) - unsignedDeny(c, mysql.TypeShort, uint64(math.MaxUint16)+1, strvalue(uint64(math.MaxUint16))) - - signedDeny(c, mysql.TypeInt24, -1<<23-1, strvalue(-1<<23)) - signedAccept(c, mysql.TypeInt24, -1<<23, strvalue(-1<<23)) - signedAccept(c, mysql.TypeInt24, 1<<23-1, strvalue(1<<23-1)) - signedDeny(c, mysql.TypeInt24, 1<<23, strvalue(1<<23-1)) - unsignedDeny(c, mysql.TypeInt24, -1, "16777215") - unsignedAccept(c, mysql.TypeInt24, 0, "0") - unsignedAccept(c, mysql.TypeInt24, 1<<24-1, strvalue(1<<24-1)) - unsignedDeny(c, mysql.TypeInt24, 1<<24, strvalue(1<<24-1)) - - signedDeny(c, mysql.TypeLong, int64(math.MinInt32)-1, strvalue(int64(math.MinInt32))) - signedAccept(c, mysql.TypeLong, int64(math.MinInt32), strvalue(int64(math.MinInt32))) - signedAccept(c, mysql.TypeLong, int64(math.MaxInt32), strvalue(int64(math.MaxInt32))) - signedDeny(c, mysql.TypeLong, uint64(math.MaxUint64), strvalue(uint64(math.MaxInt32))) - signedDeny(c, mysql.TypeLong, int64(math.MaxInt32)+1, strvalue(int64(math.MaxInt32))) - signedDeny(c, mysql.TypeLong, "1343545435346432587475", strvalue(int64(math.MaxInt32))) - unsignedDeny(c, mysql.TypeLong, -1, "4294967295") - unsignedAccept(c, mysql.TypeLong, 0, "0") - unsignedAccept(c, mysql.TypeLong, uint64(math.MaxUint32), strvalue(uint64(math.MaxUint32))) - unsignedDeny(c, mysql.TypeLong, uint64(math.MaxUint32)+1, strvalue(uint64(math.MaxUint32))) - - signedDeny(c, mysql.TypeLonglong, math.MinInt64*1.1, strvalue(int64(math.MinInt64))) - signedAccept(c, mysql.TypeLonglong, int64(math.MinInt64), strvalue(int64(math.MinInt64))) - signedAccept(c, mysql.TypeLonglong, int64(math.MaxInt64), strvalue(int64(math.MaxInt64))) - signedDeny(c, mysql.TypeLonglong, math.MaxInt64*1.1, strvalue(int64(math.MaxInt64))) - unsignedAccept(c, mysql.TypeLonglong, -1, "18446744073709551615") - unsignedAccept(c, mysql.TypeLonglong, 0, "0") - unsignedAccept(c, mysql.TypeLonglong, uint64(math.MaxUint64), strvalue(uint64(math.MaxUint64))) - unsignedDeny(c, mysql.TypeLonglong, math.MaxUint64*1.1, strvalue(uint64(math.MaxUint64))) + signedDeny(t, mysql.TypeTiny, -129, "-128") + signedAccept(t, mysql.TypeTiny, -128, "-128") + signedAccept(t, mysql.TypeTiny, 127, "127") + signedDeny(t, mysql.TypeTiny, 128, "127") + unsignedDeny(t, mysql.TypeTiny, -1, "255") + unsignedAccept(t, mysql.TypeTiny, 0, "0") + unsignedAccept(t, mysql.TypeTiny, 255, "255") + unsignedDeny(t, mysql.TypeTiny, 256, "255") + + signedDeny(t, mysql.TypeShort, int64(math.MinInt16)-1, strvalue(int64(math.MinInt16))) + signedAccept(t, mysql.TypeShort, int64(math.MinInt16), strvalue(int64(math.MinInt16))) + signedAccept(t, mysql.TypeShort, int64(math.MaxInt16), strvalue(int64(math.MaxInt16))) + signedDeny(t, mysql.TypeShort, int64(math.MaxInt16)+1, strvalue(int64(math.MaxInt16))) + unsignedDeny(t, mysql.TypeShort, -1, "65535") + unsignedAccept(t, mysql.TypeShort, 0, "0") + unsignedAccept(t, mysql.TypeShort, uint64(math.MaxUint16), strvalue(uint64(math.MaxUint16))) + unsignedDeny(t, mysql.TypeShort, uint64(math.MaxUint16)+1, strvalue(uint64(math.MaxUint16))) + + signedDeny(t, mysql.TypeInt24, -1<<23-1, strvalue(-1<<23)) + signedAccept(t, mysql.TypeInt24, -1<<23, strvalue(-1<<23)) + signedAccept(t, mysql.TypeInt24, 1<<23-1, strvalue(1<<23-1)) + signedDeny(t, mysql.TypeInt24, 1<<23, strvalue(1<<23-1)) + unsignedDeny(t, mysql.TypeInt24, -1, "16777215") + unsignedAccept(t, mysql.TypeInt24, 0, "0") + unsignedAccept(t, mysql.TypeInt24, 1<<24-1, strvalue(1<<24-1)) + unsignedDeny(t, mysql.TypeInt24, 1<<24, strvalue(1<<24-1)) + + signedDeny(t, mysql.TypeLong, int64(math.MinInt32)-1, strvalue(int64(math.MinInt32))) + signedAccept(t, mysql.TypeLong, int64(math.MinInt32), strvalue(int64(math.MinInt32))) + signedAccept(t, mysql.TypeLong, int64(math.MaxInt32), strvalue(int64(math.MaxInt32))) + signedDeny(t, mysql.TypeLong, uint64(math.MaxUint64), strvalue(uint64(math.MaxInt32))) + signedDeny(t, mysql.TypeLong, int64(math.MaxInt32)+1, strvalue(int64(math.MaxInt32))) + signedDeny(t, mysql.TypeLong, "1343545435346432587475", strvalue(int64(math.MaxInt32))) + unsignedDeny(t, mysql.TypeLong, -1, "4294967295") + unsignedAccept(t, mysql.TypeLong, 0, "0") + unsignedAccept(t, mysql.TypeLong, uint64(math.MaxUint32), strvalue(uint64(math.MaxUint32))) + unsignedDeny(t, mysql.TypeLong, uint64(math.MaxUint32)+1, strvalue(uint64(math.MaxUint32))) + + signedDeny(t, mysql.TypeLonglong, math.MinInt64*1.1, strvalue(int64(math.MinInt64))) + signedAccept(t, mysql.TypeLonglong, int64(math.MinInt64), strvalue(int64(math.MinInt64))) + signedAccept(t, mysql.TypeLonglong, int64(math.MaxInt64), strvalue(int64(math.MaxInt64))) + signedDeny(t, mysql.TypeLonglong, math.MaxInt64*1.1, strvalue(int64(math.MaxInt64))) + unsignedAccept(t, mysql.TypeLonglong, -1, "18446744073709551615") + unsignedAccept(t, mysql.TypeLonglong, 0, "0") + unsignedAccept(t, mysql.TypeLonglong, uint64(math.MaxUint64), strvalue(uint64(math.MaxUint64))) + unsignedDeny(t, mysql.TypeLonglong, math.MaxUint64*1.1, strvalue(uint64(math.MaxUint64))) // integer from string - signedAccept(c, mysql.TypeLong, " 234 ", "234") - signedAccept(c, mysql.TypeLong, " 2.35e3 ", "2350") - signedAccept(c, mysql.TypeLong, " 2.e3 ", "2000") - signedAccept(c, mysql.TypeLong, " -2.e3 ", "-2000") - signedAccept(c, mysql.TypeLong, " 2e2 ", "200") - signedAccept(c, mysql.TypeLong, " 0.002e3 ", "2") - signedAccept(c, mysql.TypeLong, " .002e3 ", "2") - signedAccept(c, mysql.TypeLong, " 20e-2 ", "0") - signedAccept(c, mysql.TypeLong, " -20e-2 ", "0") - signedAccept(c, mysql.TypeLong, " +2.51 ", "3") - signedAccept(c, mysql.TypeLong, " -9999.5 ", "-10000") - signedAccept(c, mysql.TypeLong, " 999.4", "999") - signedAccept(c, mysql.TypeLong, " -3.58", "-4") - signedDeny(c, mysql.TypeLong, " 1a ", "1") - signedDeny(c, mysql.TypeLong, " +1+ ", "1") + signedAccept(t, mysql.TypeLong, " 234 ", "234") + signedAccept(t, mysql.TypeLong, " 2.35e3 ", "2350") + signedAccept(t, mysql.TypeLong, " 2.e3 ", "2000") + signedAccept(t, mysql.TypeLong, " -2.e3 ", "-2000") + signedAccept(t, mysql.TypeLong, " 2e2 ", "200") + signedAccept(t, mysql.TypeLong, " 0.002e3 ", "2") + signedAccept(t, mysql.TypeLong, " .002e3 ", "2") + signedAccept(t, mysql.TypeLong, " 20e-2 ", "0") + signedAccept(t, mysql.TypeLong, " -20e-2 ", "0") + signedAccept(t, mysql.TypeLong, " +2.51 ", "3") + signedAccept(t, mysql.TypeLong, " -9999.5 ", "-10000") + signedAccept(t, mysql.TypeLong, " 999.4", "999") + signedAccept(t, mysql.TypeLong, " -3.58", "-4") + signedDeny(t, mysql.TypeLong, " 1a ", "1") + signedDeny(t, mysql.TypeLong, " +1+ ", "1") // integer from float - signedAccept(c, mysql.TypeLong, 234.5456, "235") - signedAccept(c, mysql.TypeLong, -23.45, "-23") - unsignedAccept(c, mysql.TypeLonglong, 234.5456, "235") - unsignedDeny(c, mysql.TypeLonglong, -23.45, "18446744073709551593") + signedAccept(t, mysql.TypeLong, 234.5456, "235") + signedAccept(t, mysql.TypeLong, -23.45, "-23") + unsignedAccept(t, mysql.TypeLonglong, 234.5456, "235") + unsignedDeny(t, mysql.TypeLonglong, -23.45, "18446744073709551593") // float from string - signedAccept(c, mysql.TypeFloat, "23.523", "23.523") - signedAccept(c, mysql.TypeFloat, int64(123), "123") - signedAccept(c, mysql.TypeFloat, uint64(123), "123") - signedAccept(c, mysql.TypeFloat, int(123), "123") - signedAccept(c, mysql.TypeFloat, float32(123), "123") - signedAccept(c, mysql.TypeFloat, float64(123), "123") - signedAccept(c, mysql.TypeDouble, " -23.54", "-23.54") - signedDeny(c, mysql.TypeDouble, "-23.54a", "-23.54") - signedDeny(c, mysql.TypeDouble, "-23.54e2e", "-2354") - signedDeny(c, mysql.TypeDouble, "+.e", "0") - signedAccept(c, mysql.TypeDouble, "1e+1", "10") + signedAccept(t, mysql.TypeFloat, "23.523", "23.523") + signedAccept(t, mysql.TypeFloat, int64(123), "123") + signedAccept(t, mysql.TypeFloat, uint64(123), "123") + signedAccept(t, mysql.TypeFloat, int(123), "123") + signedAccept(t, mysql.TypeFloat, float32(123), "123") + signedAccept(t, mysql.TypeFloat, float64(123), "123") + signedAccept(t, mysql.TypeDouble, " -23.54", "-23.54") + signedDeny(t, mysql.TypeDouble, "-23.54a", "-23.54") + signedDeny(t, mysql.TypeDouble, "-23.54e2e", "-2354") + signedDeny(t, mysql.TypeDouble, "+.e", "0") + signedAccept(t, mysql.TypeDouble, "1e+1", "10") // year - signedDeny(c, mysql.TypeYear, 123, "") - signedDeny(c, mysql.TypeYear, 3000, "") - signedAccept(c, mysql.TypeYear, "2000", "2000") + signedDeny(t, mysql.TypeYear, 123, "") + signedDeny(t, mysql.TypeYear, 3000, "") + signedAccept(t, mysql.TypeYear, "2000", "2000") // time from string - signedAccept(c, mysql.TypeDate, "2012-08-23", "2012-08-23") - signedAccept(c, mysql.TypeDatetime, "2012-08-23 12:34:03.123456", "2012-08-23 12:34:03") - signedAccept(c, mysql.TypeDatetime, ZeroDatetime, "0000-00-00 00:00:00") - signedAccept(c, mysql.TypeDatetime, int64(0), "0000-00-00 00:00:00") - signedAccept(c, mysql.TypeTimestamp, "2012-08-23 12:34:03.123456", "2012-08-23 12:34:03") - signedAccept(c, mysql.TypeDuration, "10:11:12", "10:11:12") - signedAccept(c, mysql.TypeDuration, ZeroDatetime, "00:00:00") - signedAccept(c, mysql.TypeDuration, ZeroDuration, "00:00:00") - signedAccept(c, mysql.TypeDuration, 0, "00:00:00") - - signedDeny(c, mysql.TypeDate, "2012-08-x", "0000-00-00") - signedDeny(c, mysql.TypeDatetime, "2012-08-x", "0000-00-00 00:00:00") - signedDeny(c, mysql.TypeTimestamp, "2012-08-x", "0000-00-00 00:00:00") - signedDeny(c, mysql.TypeDuration, "2012-08-x", "00:00:00") + signedAccept(t, mysql.TypeDate, "2012-08-23", "2012-08-23") + signedAccept(t, mysql.TypeDatetime, "2012-08-23 12:34:03.123456", "2012-08-23 12:34:03") + signedAccept(t, mysql.TypeDatetime, ZeroDatetime, "0000-00-00 00:00:00") + signedAccept(t, mysql.TypeDatetime, int64(0), "0000-00-00 00:00:00") + signedAccept(t, mysql.TypeTimestamp, "2012-08-23 12:34:03.123456", "2012-08-23 12:34:03") + signedAccept(t, mysql.TypeDuration, "10:11:12", "10:11:12") + signedAccept(t, mysql.TypeDuration, ZeroDatetime, "00:00:00") + signedAccept(t, mysql.TypeDuration, ZeroDuration, "00:00:00") + signedAccept(t, mysql.TypeDuration, 0, "00:00:00") + + signedDeny(t, mysql.TypeDate, "2012-08-x", "0000-00-00") + signedDeny(t, mysql.TypeDatetime, "2012-08-x", "0000-00-00 00:00:00") + signedDeny(t, mysql.TypeTimestamp, "2012-08-x", "0000-00-00 00:00:00") + signedDeny(t, mysql.TypeDuration, "2012-08-x", "00:00:00") // string from string - signedAccept(c, mysql.TypeString, "abc", "abc") + signedAccept(t, mysql.TypeString, "abc", "abc") // string from integer - signedAccept(c, mysql.TypeString, 5678, "5678") - signedAccept(c, mysql.TypeString, ZeroDuration, "00:00:00") - signedAccept(c, mysql.TypeString, ZeroDatetime, "0000-00-00 00:00:00") - signedAccept(c, mysql.TypeString, []byte("123"), "123") + signedAccept(t, mysql.TypeString, 5678, "5678") + signedAccept(t, mysql.TypeString, ZeroDuration, "00:00:00") + signedAccept(t, mysql.TypeString, ZeroDatetime, "0000-00-00 00:00:00") + signedAccept(t, mysql.TypeString, []byte("123"), "123") //TODO add more tests - signedAccept(c, mysql.TypeNewDecimal, 123, "123") - signedAccept(c, mysql.TypeNewDecimal, int64(123), "123") - signedAccept(c, mysql.TypeNewDecimal, uint64(123), "123") - signedAccept(c, mysql.TypeNewDecimal, float32(123), "123") - signedAccept(c, mysql.TypeNewDecimal, 123.456, "123.456") - signedAccept(c, mysql.TypeNewDecimal, "-123.456", "-123.456") - signedAccept(c, mysql.TypeNewDecimal, NewDecFromInt(12300000), "12300000") + signedAccept(t, mysql.TypeNewDecimal, 123, "123") + signedAccept(t, mysql.TypeNewDecimal, int64(123), "123") + signedAccept(t, mysql.TypeNewDecimal, uint64(123), "123") + signedAccept(t, mysql.TypeNewDecimal, float32(123), "123") + signedAccept(t, mysql.TypeNewDecimal, 123.456, "123.456") + signedAccept(t, mysql.TypeNewDecimal, "-123.456", "-123.456") + signedAccept(t, mysql.TypeNewDecimal, NewDecFromInt(12300000), "12300000") dec := NewDecFromInt(-123) dec.Shift(-5) dec.Round(dec, 5, ModeHalfEven) - signedAccept(c, mysql.TypeNewDecimal, dec, "-0.00123") + signedAccept(t, mysql.TypeNewDecimal, dec, "-0.00123") } -func (s *testTypeConvertSuite) TestGetValidFloat(c *C) { +func TestGetValidFloat(t *testing.T) { tests := []struct { origin string valid string @@ -684,25 +682,25 @@ func (s *testTypeConvertSuite) TestGetValidFloat(c *C) { sc := new(stmtctx.StatementContext) for _, tt := range tests { prefix, _ := getValidFloatPrefix(sc, tt.origin) - c.Assert(prefix, Equals, tt.valid) + require.Equal(t, tt.valid, prefix) _, err := strconv.ParseFloat(prefix, 64) - c.Assert(err, IsNil) + require.NoError(t, err) } floatStr, err := floatStrToIntStr(sc, "1e9223372036854775807", "1e9223372036854775807") - c.Assert(err, IsNil) - c.Assert(floatStr, Equals, "1") + require.NoError(t, err) + require.Equal(t, "1", floatStr) floatStr, err = floatStrToIntStr(sc, "125e342", "125e342.83") - c.Assert(err, IsNil) - c.Assert(floatStr, Equals, "125") + require.NoError(t, err) + require.Equal(t, "125", floatStr) floatStr, err = floatStrToIntStr(sc, "1e21", "1e21") - c.Assert(err, IsNil) - c.Assert(floatStr, Equals, "1") + require.NoError(t, err) + require.Equal(t, "1", floatStr) } // TestConvertTime tests time related conversion. // time conversion is complicated including Date/Datetime/Time/Timestamp etc, // Timestamp may involving timezone. -func (s *testTypeConvertSuite) TestConvertTime(c *C) { +func TestConvertTime(t *testing.T) { timezones := []*time.Location{ time.UTC, time.FixedZone("", 3*3600), @@ -713,11 +711,11 @@ func (s *testTypeConvertSuite) TestConvertTime(c *C) { sc := &stmtctx.StatementContext{ TimeZone: timezone, } - testConvertTimeTimeZone(c, sc) + testConvertTimeTimeZone(t, sc) } } -func testConvertTimeTimeZone(c *C, sc *stmtctx.StatementContext) { +func testConvertTimeTimeZone(t *testing.T, sc *stmtctx.StatementContext) { raw := FromDate(2002, 3, 4, 4, 6, 7, 8) tests := []struct { input Time @@ -750,14 +748,14 @@ func testConvertTimeTimeZone(c *C, sc *stmtctx.StatementContext) { var d Datum d.SetMysqlTime(test.input) nd, err := d.ConvertTo(sc, test.target) - c.Assert(err, IsNil) - t := nd.GetMysqlTime() - c.Assert(t.Type, Equals, test.expect.Type) - c.Assert(t.Time, Equals, test.expect.Time) + require.NoError(t, err) + v := nd.GetMysqlTime() + require.Equal(t, test.expect.Type, v.Type) + require.Equal(t, test.expect.Time, v.Time) } } -func (s *testTypeConvertSuite) TestConvertJSONToInt(c *C) { +func TestConvertJSONToInt(t *testing.T) { var tests = []struct { In string Out int64 @@ -776,14 +774,13 @@ func (s *testTypeConvertSuite) TestConvertJSONToInt(c *C) { } for _, tt := range tests { j, err := json.ParseBinaryFromString(tt.In) - c.Assert(err, IsNil) - + require.NoError(t, err) casted, _ := ConvertJSONToInt(new(stmtctx.StatementContext), j, false) - c.Assert(casted, Equals, tt.Out) + require.Equal(t, tt.Out, casted) } } -func (s *testTypeConvertSuite) TestConvertJSONToFloat(c *C) { +func TestConvertJSONToFloat(t *testing.T) { var tests = []struct { In string Out float64 @@ -802,13 +799,13 @@ func (s *testTypeConvertSuite) TestConvertJSONToFloat(c *C) { } for _, tt := range tests { j, err := json.ParseBinaryFromString(tt.In) - c.Assert(err, IsNil) + require.NoError(t, err) casted, _ := ConvertJSONToFloat(new(stmtctx.StatementContext), j) - c.Assert(casted, Equals, tt.Out) + require.Equal(t, tt.Out, casted) } } -func (s *testTypeConvertSuite) TestConvertJSONToDecimal(c *C) { +func TestConvertJSONToDecimal(t *testing.T) { var tests = []struct { In string Out *MyDecimal @@ -823,13 +820,13 @@ func (s *testTypeConvertSuite) TestConvertJSONToDecimal(c *C) { } for _, tt := range tests { j, err := json.ParseBinaryFromString(tt.In) - c.Assert(err, IsNil) + require.NoError(t, err) casted, _ := ConvertJSONToDecimal(new(stmtctx.StatementContext), j) - c.Assert(casted.Compare(tt.Out), Equals, 0) + require.Equal(t, 0, casted.Compare(tt.Out)) } } -func (s *testTypeConvertSuite) TestNumberToDuration(c *C) { +func TestNumberToDuration(t *testing.T) { var testCases = []struct { number int64 fsp int @@ -856,13 +853,13 @@ func (s *testTypeConvertSuite) TestNumberToDuration(c *C) { for _, tc := range testCases { dur, err := NumberToDuration(tc.number, tc.fsp) if tc.hasErr { - c.Assert(err, NotNil) + require.Error(t, err) continue } - c.Assert(err, IsNil) - c.Assert(dur.Hour(), Equals, tc.hour) - c.Assert(dur.Minute(), Equals, tc.minute) - c.Assert(dur.Second(), Equals, tc.second) + require.NoError(t, err) + require.Equal(t, tc.hour, dur.Hour()) + require.Equal(t, tc.minute, dur.Minute()) + require.Equal(t, tc.second, dur.Second()) } var testCases1 = []struct { @@ -875,7 +872,7 @@ func (s *testTypeConvertSuite) TestNumberToDuration(c *C) { for _, tc := range testCases1 { dur, err := NumberToDuration(tc.number, 0) - c.Assert(err, IsNil) - c.Assert(dur.Duration, Equals, tc.dur) + require.NoError(t, err) + require.Equal(t, tc.dur, dur.Duration) } } diff --git a/parser/tidb-types/datum_test.go b/parser/tidb-types/datum_test.go index c9004f8f..caa8454b 100644 --- a/parser/tidb-types/datum_test.go +++ b/parser/tidb-types/datum_test.go @@ -18,19 +18,14 @@ import ( "testing" "time" - . "github.com/pingcap/check" + "github.com/stretchr/testify/require" "github.com/XiaoMi/Gaea/mysql" "github.com/XiaoMi/Gaea/parser/stmtctx" "github.com/XiaoMi/Gaea/parser/tidb-types/json" ) -var _ = Suite(&testDatumSuite{}) - -type testDatumSuite struct { -} - -func (ts *testDatumSuite) TestDatum(c *C) { +func TestDatum(t *testing.T) { values := []interface{}{ int64(1), uint64(1), @@ -43,55 +38,55 @@ func (ts *testDatumSuite) TestDatum(c *C) { var d Datum d.SetValue(val) x := d.GetValue() - c.Assert(x, DeepEquals, val) + require.Equal(t, val, x) } } -func testDatumToBool(c *C, in interface{}, res int) { +func testDatumToBool(t *testing.T, in interface{}, res int) { datum := NewDatum(in) res64 := int64(res) sc := new(stmtctx.StatementContext) sc.IgnoreTruncate = true b, err := datum.ToBool(sc) - c.Assert(err, IsNil) - c.Assert(b, Equals, res64) + require.NoError(t, err) + require.Equal(t, res64, b) } -func (ts *testDatumSuite) TestToBool(c *C) { - testDatumToBool(c, int(0), 0) - testDatumToBool(c, int64(0), 0) - testDatumToBool(c, uint64(0), 0) - testDatumToBool(c, float32(0.1), 0) - testDatumToBool(c, float64(0.1), 0) - testDatumToBool(c, "", 0) - testDatumToBool(c, "0.1", 0) - testDatumToBool(c, []byte{}, 0) - testDatumToBool(c, []byte("0.1"), 0) - testDatumToBool(c, NewBinaryLiteralFromUint(0, -1), 0) - testDatumToBool(c, Enum{Name: "a", Value: 1}, 1) - testDatumToBool(c, Set{Name: "a", Value: 1}, 1) - - t, err := ParseTime(&stmtctx.StatementContext{TimeZone: time.UTC}, "2011-11-10 11:11:11.999999", mysql.TypeTimestamp, 6) - c.Assert(err, IsNil) - testDatumToBool(c, t, 1) +func TestToBool(t *testing.T) { + testDatumToBool(t, int(0), 0) + testDatumToBool(t, int64(0), 0) + testDatumToBool(t, uint64(0), 0) + testDatumToBool(t, float32(0.1), 0) + testDatumToBool(t, float64(0.1), 0) + testDatumToBool(t, "", 0) + testDatumToBool(t, "0.1", 0) + testDatumToBool(t, []byte{}, 0) + testDatumToBool(t, []byte("0.1"), 0) + testDatumToBool(t, NewBinaryLiteralFromUint(0, -1), 0) + testDatumToBool(t, Enum{Name: "a", Value: 1}, 1) + testDatumToBool(t, Set{Name: "a", Value: 1}, 1) + + t1, err := ParseTime(&stmtctx.StatementContext{TimeZone: time.UTC}, "2011-11-10 11:11:11.999999", mysql.TypeTimestamp, 6) + require.NoError(t, err) + testDatumToBool(t, t1, 1) td, err := ParseDuration(nil, "11:11:11.999999", 6) - c.Assert(err, IsNil) - testDatumToBool(c, td, 1) + require.NoError(t, err) + testDatumToBool(t, td, 1) ft := NewFieldType(mysql.TypeNewDecimal) ft.Decimal = 5 v, err := Convert(0.1415926, ft) - c.Assert(err, IsNil) - testDatumToBool(c, v, 0) + require.NoError(t, err) + testDatumToBool(t, v, 0) d := NewDatum(&invalidMockType{}) sc := new(stmtctx.StatementContext) sc.IgnoreTruncate = true _, err = d.ToBool(sc) - c.Assert(err, NotNil) + require.Error(t, err) } -func (ts *testDatumSuite) TestEqualDatums(c *C) { +func TestEqualDatums(t *testing.T) { tests := []struct { a []interface{} b []interface{} @@ -115,84 +110,85 @@ func (ts *testDatumSuite) TestEqualDatums(c *C) { {[]interface{}{nil}, []interface{}{1}, false}, } for _, tt := range tests { - testEqualDatums(c, tt.a, tt.b, tt.same) + testEqualDatums(t, tt.a, tt.b, tt.same) } } -func testEqualDatums(c *C, a []interface{}, b []interface{}, same bool) { +func testEqualDatums(t *testing.T, a []interface{}, b []interface{}, same bool) { sc := new(stmtctx.StatementContext) sc.IgnoreTruncate = true res, err := EqualDatums(sc, MakeDatums(a...), MakeDatums(b...)) - c.Assert(err, IsNil) - c.Assert(res, Equals, same, Commentf("a: %v, b: %v", a, b)) + require.NoError(t, err) + require.Equal(t, same, res) } -func testDatumToInt64(c *C, val interface{}, expect int64) { +func testDatumToInt64(t *testing.T, val interface{}, expect int64) { d := NewDatum(val) sc := new(stmtctx.StatementContext) sc.IgnoreTruncate = true b, err := d.ToInt64(sc) - c.Assert(err, IsNil) - c.Assert(b, Equals, expect) + require.NoError(t, err) + require.Equal(t, expect, b) } -func (ts *testTypeConvertSuite) TestToInt64(c *C) { - testDatumToInt64(c, "0", int64(0)) - testDatumToInt64(c, int(0), int64(0)) - testDatumToInt64(c, int64(0), int64(0)) - testDatumToInt64(c, uint64(0), int64(0)) - testDatumToInt64(c, float32(3.1), int64(3)) - testDatumToInt64(c, float64(3.1), int64(3)) - testDatumToInt64(c, NewBinaryLiteralFromUint(100, -1), int64(100)) - testDatumToInt64(c, Enum{Name: "a", Value: 1}, int64(1)) - testDatumToInt64(c, Set{Name: "a", Value: 1}, int64(1)) - testDatumToInt64(c, json.CreateBinary(int64(3)), int64(3)) - - t, err := ParseTime(&stmtctx.StatementContext{ +func TestToInt64(t *testing.T) { + testDatumToInt64(t, "0", int64(0)) + testDatumToInt64(t, int(0), int64(0)) + testDatumToInt64(t, int64(0), int64(0)) + testDatumToInt64(t, uint64(0), int64(0)) + testDatumToInt64(t, float32(3.1), int64(3)) + testDatumToInt64(t, float64(3.1), int64(3)) + testDatumToInt64(t, NewBinaryLiteralFromUint(100, -1), int64(100)) + testDatumToInt64(t, Enum{Name: "a", Value: 1}, int64(1)) + testDatumToInt64(t, Set{Name: "a", Value: 1}, int64(1)) + testDatumToInt64(t, json.CreateBinary(int64(3)), int64(3)) + + t1, err := ParseTime(&stmtctx.StatementContext{ TimeZone: time.UTC, }, "2011-11-10 11:11:11.999999", mysql.TypeTimestamp, 0) - c.Assert(err, IsNil) - testDatumToInt64(c, t, int64(20111110111112)) + require.NoError(t, err) + testDatumToInt64(t, t1, int64(20111110111112)) td, err := ParseDuration(nil, "11:11:11.999999", 6) - c.Assert(err, IsNil) - testDatumToInt64(c, td, int64(111112)) + require.NoError(t, err) + testDatumToInt64(t, td, int64(111112)) ft := NewFieldType(mysql.TypeNewDecimal) ft.Decimal = 5 v, err := Convert(3.1415926, ft) - c.Assert(err, IsNil) - testDatumToInt64(c, v, int64(3)) + require.NoError(t, err) + testDatumToInt64(t, v, int64(3)) binLit, err := ParseHexStr("0x9999999999999999999999999999999999999999999") - c.Assert(err, IsNil) - testDatumToInt64(c, binLit, -1) + require.NoError(t, err) + testDatumToInt64(t, binLit, -1) } -func (ts *testTypeConvertSuite) TestToFloat32(c *C) { +func TestToFloat32(t *testing.T) { ft := NewFieldType(mysql.TypeFloat) var datum = NewFloat64Datum(281.37) sc := new(stmtctx.StatementContext) sc.IgnoreTruncate = true converted, err := datum.ConvertTo(sc, ft) - c.Assert(err, IsNil) - c.Assert(converted.Kind(), Equals, KindFloat32) - c.Assert(converted.GetFloat32(), Equals, float32(281.37)) + require.NoError(t, err) + require.Equal(t, KindFloat32, converted.Kind()) + require.Equal(t, float32(281.37), converted.GetFloat32()) datum.SetString("281.37") converted, err = datum.ConvertTo(sc, ft) - c.Assert(err, IsNil) - c.Assert(converted.Kind(), Equals, KindFloat32) - c.Assert(converted.GetFloat32(), Equals, float32(281.37)) + require.NoError(t, err) + require.Equal(t, KindFloat32, converted.Kind()) + require.Equal(t, float32(281.37), converted.GetFloat32()) ft = NewFieldType(mysql.TypeDouble) datum = NewFloat32Datum(281.37) converted, err = datum.ConvertTo(sc, ft) - c.Assert(err, IsNil) - c.Assert(converted.Kind(), Equals, KindFloat64) + require.NoError(t, err) + require.Equal(t, KindFloat64, converted.Kind()) // Convert to float32 and convert back to float64, we will get a different value. - c.Assert(converted.GetFloat64(), Not(Equals), 281.37) - c.Assert(converted.GetFloat64(), Equals, datum.GetFloat64()) + require.NotEqual(t, 281.37, converted.GetFloat64()) + require.Equal(t, datum.GetFloat64(), converted.GetFloat64()) + } // mustParseTimeIntoDatum is similar to ParseTime but panic if any error occurs. @@ -205,7 +201,7 @@ func mustParseTimeIntoDatum(s string, tp byte, fsp int) (d Datum) { return } -func (ts *testDatumSuite) TestToJSON(c *C) { +func TestToJSON(t *testing.T) { ft := NewFieldType(mysql.TypeJSON) sc := new(stmtctx.StatementContext) tests := []struct { @@ -226,24 +222,24 @@ func (ts *testDatumSuite) TestToJSON(c *C) { for _, tt := range tests { obtain, err := tt.datum.ConvertTo(sc, ft) if tt.success { - c.Assert(err, IsNil) + require.NoError(t, err) sd := NewStringDatum(tt.expected) var expected Datum expected, err = sd.ConvertTo(sc, ft) - c.Assert(err, IsNil) + require.NoError(t, err) var cmp int cmp, err = obtain.CompareDatum(sc, &expected) - c.Assert(err, IsNil) - c.Assert(cmp, Equals, 0) + require.NoError(t, err) + require.Equal(t, 0, cmp) } else { - c.Assert(err, NotNil) + require.Error(t, err) } } } -func (ts *testDatumSuite) TestIsNull(c *C) { +func TestIsNull(t *testing.T) { tests := []struct { data interface{} isnull bool @@ -256,16 +252,16 @@ func (ts *testDatumSuite) TestIsNull(c *C) { {"", false}, } for _, tt := range tests { - testIsNull(c, tt.data, tt.isnull) + testIsNull(t, tt.data, tt.isnull) } } -func testIsNull(c *C, data interface{}, isnull bool) { +func testIsNull(t *testing.T, data interface{}, isnull bool) { d := NewDatum(data) - c.Assert(d.IsNull(), Equals, isnull, Commentf("data: %v, isnull: %v", data, isnull)) + require.Equal(t, isnull, d.IsNull()) } -func (ts *testDatumSuite) TestToBytes(c *C) { +func TestToBytes(t *testing.T) { tests := []struct { a Datum out []byte @@ -279,8 +275,8 @@ func (ts *testDatumSuite) TestToBytes(c *C) { sc.IgnoreTruncate = true for _, tt := range tests { bin, err := tt.a.ToBytes() - c.Assert(err, IsNil) - c.Assert(bin, BytesEquals, tt.out) + require.NoError(t, err) + require.Equal(t, tt.out, bin) } } @@ -292,7 +288,7 @@ func mustParseDurationDatum(str string, fsp int) Datum { return NewDurationDatum(dur) } -func (ts *testDatumSuite) TestComputePlusAndMinus(c *C) { +func TestComputePlusAndMinus(t *testing.T) { sc := &stmtctx.StatementContext{TimeZone: time.UTC} tests := []struct { a Datum @@ -313,14 +309,14 @@ func (ts *testDatumSuite) TestComputePlusAndMinus(c *C) { for ith, tt := range tests { got, err := ComputePlus(tt.a, tt.b) - c.Assert(err != nil, Equals, tt.hasErr) + require.Equal(t, tt.hasErr, err != nil) v, err := got.CompareDatum(sc, &tt.plus) - c.Assert(err, IsNil) - c.Assert(v, Equals, 0, Commentf("%dth got:%#v, expect:%#v", ith, got, tt.plus)) + require.NoError(t, err) + require.Equalf(t, 0, v, "%dth got:%#v, %#v, expect:%#v, %#v", ith, got, got.x, tt.plus, tt.plus.x) } } -func (ts *testDatumSuite) TestCopyDatum(c *C) { +func TestCopyDatum(t *testing.T) { var raw Datum raw.b = []byte("raw") raw.k = KindRaw @@ -337,10 +333,10 @@ func (ts *testDatumSuite) TestCopyDatum(c *C) { for _, tt := range tests { tt1 := CopyDatum(tt) res, err := tt.CompareDatum(sc, &tt1) - c.Assert(err, IsNil) - c.Assert(res, Equals, 0) + require.NoError(t, err) + require.Equal(t, 0, res) if tt.b != nil { - c.Assert(&tt.b[0], Not(Equals), &tt1.b[0]) + require.NotSame(t, &tt1.b[0], &tt.b[0]) } } } diff --git a/parser/tidb-types/enum_test.go b/parser/tidb-types/enum_test.go index 25655d4f..29d79593 100644 --- a/parser/tidb-types/enum_test.go +++ b/parser/tidb-types/enum_test.go @@ -14,18 +14,15 @@ package types import ( - . "github.com/pingcap/check" + "testing" + + "github.com/stretchr/testify/require" "github.com/XiaoMi/Gaea/util/testleak" ) -var _ = Suite(&testEnumSuite{}) - -type testEnumSuite struct { -} - -func (s *testEnumSuite) TestEnum(c *C) { - defer testleak.AfterTest(c)() +func TestEnum(t *testing.T) { + defer testleak.AfterTestT(t)() tbl := []struct { Elems []string Name string @@ -36,18 +33,18 @@ func (s *testEnumSuite) TestEnum(c *C) { {[]string{"a"}, "1", 1}, } - for _, t := range tbl { - e, err := ParseEnumName(t.Elems, t.Name) - if t.Expected == 0 { - c.Assert(err, NotNil) - c.Assert(e.ToNumber(), Equals, float64(0)) - c.Assert(e.String(), Equals, "") + for _, tt := range tbl { + e, err := ParseEnumName(tt.Elems, tt.Name) + if tt.Expected == 0 { + require.Error(t, err) + require.Equal(t, float64(0), e.ToNumber()) + require.Equal(t, "", e.String()) continue } - c.Assert(err, IsNil) - c.Assert(e.String(), Equals, t.Elems[t.Expected-1]) - c.Assert(e.ToNumber(), Equals, float64(t.Expected)) + require.NoError(t, err) + require.Equal(t, tt.Elems[tt.Expected-1], e.String()) + require.Equal(t, float64(tt.Expected), e.ToNumber()) } tblNumber := []struct { @@ -59,14 +56,13 @@ func (s *testEnumSuite) TestEnum(c *C) { {[]string{"a"}, 0, 0}, } - for _, t := range tblNumber { - e, err := ParseEnumValue(t.Elems, t.Number) - if t.Expected == 0 { - c.Assert(err, NotNil) + for _, tt := range tblNumber { + e, err := ParseEnumValue(tt.Elems, tt.Number) + if tt.Expected == 0 { + require.Error(t, err) continue } - - c.Assert(err, IsNil) - c.Assert(e.ToNumber(), Equals, float64(t.Expected)) + require.NoError(t, err) + require.Equal(t, float64(tt.Expected), e.ToNumber()) } } diff --git a/parser/tidb-types/etc.go b/parser/tidb-types/etc.go index 37733f59..5ad45be7 100644 --- a/parser/tidb-types/etc.go +++ b/parser/tidb-types/etc.go @@ -138,6 +138,7 @@ func KindStr(kind byte) (r string) { // It is used for converting Text to Blob, // or converting Char to Binary. // Args: +// // tp: type enum // cs: charset var TypeToStr = ast.TypeToStr diff --git a/parser/tidb-types/etc_test.go b/parser/tidb-types/etc_test.go index 87cb1042..f63535cd 100644 --- a/parser/tidb-types/etc_test.go +++ b/parser/tidb-types/etc_test.go @@ -18,6 +18,7 @@ import ( "testing" . "github.com/pingcap/check" + "github.com/stretchr/testify/require" "github.com/XiaoMi/Gaea/mysql" "github.com/XiaoMi/Gaea/parser/terror" @@ -28,89 +29,84 @@ func TestT(t *testing.T) { TestingT(t) } -var _ = Suite(&testTypeEtcSuite{}) - -type testTypeEtcSuite struct { -} - -func testIsTypeBlob(c *C, tp byte, expect bool) { +func testIsTypeBlob(t *testing.T, tp byte, expect bool) { v := IsTypeBlob(tp) - c.Assert(v, Equals, expect) + require.Equal(t, expect, v) } -func testIsTypeChar(c *C, tp byte, expect bool) { +func testIsTypeChar(t *testing.T, tp byte, expect bool) { v := IsTypeChar(tp) - c.Assert(v, Equals, expect) + require.Equal(t, expect, v) } -func (s *testTypeEtcSuite) TestIsType(c *C) { - defer testleak.AfterTest(c)() - testIsTypeBlob(c, mysql.TypeTinyBlob, true) - testIsTypeBlob(c, mysql.TypeMediumBlob, true) - testIsTypeBlob(c, mysql.TypeBlob, true) - testIsTypeBlob(c, mysql.TypeLongBlob, true) - testIsTypeBlob(c, mysql.TypeInt24, false) - - testIsTypeChar(c, mysql.TypeString, true) - testIsTypeChar(c, mysql.TypeVarchar, true) - testIsTypeChar(c, mysql.TypeLong, false) +func TestIsType(t *testing.T) { + defer testleak.AfterTestT(t)() + testIsTypeBlob(t, mysql.TypeTinyBlob, true) + testIsTypeBlob(t, mysql.TypeMediumBlob, true) + testIsTypeBlob(t, mysql.TypeBlob, true) + testIsTypeBlob(t, mysql.TypeLongBlob, true) + testIsTypeBlob(t, mysql.TypeInt24, false) + + testIsTypeChar(t, mysql.TypeString, true) + testIsTypeChar(t, mysql.TypeVarchar, true) + testIsTypeChar(t, mysql.TypeLong, false) } -func testTypeStr(c *C, tp byte, expect string) { +func testTypeStr(t *testing.T, tp byte, expect string) { v := TypeStr(tp) - c.Assert(v, Equals, expect) + require.Equal(t, expect, v) } -func testTypeToStr(c *C, tp byte, charset string, expect string) { +func testTypeToStr(t *testing.T, tp byte, charset string, expect string) { v := TypeToStr(tp, charset) - c.Assert(v, Equals, expect) + require.Equal(t, expect, v) } -func (s *testTypeEtcSuite) TestTypeToStr(c *C) { - defer testleak.AfterTest(c)() - testTypeStr(c, mysql.TypeYear, "year") - testTypeStr(c, 0xdd, "") - - testTypeToStr(c, mysql.TypeBlob, "utf8", "text") - testTypeToStr(c, mysql.TypeLongBlob, "utf8", "longtext") - testTypeToStr(c, mysql.TypeTinyBlob, "utf8", "tinytext") - testTypeToStr(c, mysql.TypeMediumBlob, "utf8", "mediumtext") - testTypeToStr(c, mysql.TypeVarchar, "binary", "varbinary") - testTypeToStr(c, mysql.TypeString, "binary", "binary") - testTypeToStr(c, mysql.TypeTiny, "binary", "tinyint") - testTypeToStr(c, mysql.TypeBlob, "binary", "blob") - testTypeToStr(c, mysql.TypeLongBlob, "binary", "longblob") - testTypeToStr(c, mysql.TypeTinyBlob, "binary", "tinyblob") - testTypeToStr(c, mysql.TypeMediumBlob, "binary", "mediumblob") - testTypeToStr(c, mysql.TypeVarchar, "utf8", "varchar") - testTypeToStr(c, mysql.TypeString, "utf8", "char") - testTypeToStr(c, mysql.TypeShort, "binary", "smallint") - testTypeToStr(c, mysql.TypeInt24, "binary", "mediumint") - testTypeToStr(c, mysql.TypeLong, "binary", "int") - testTypeToStr(c, mysql.TypeLonglong, "binary", "bigint") - testTypeToStr(c, mysql.TypeFloat, "binary", "float") - testTypeToStr(c, mysql.TypeDouble, "binary", "double") - testTypeToStr(c, mysql.TypeYear, "binary", "year") - testTypeToStr(c, mysql.TypeDuration, "binary", "time") - testTypeToStr(c, mysql.TypeDatetime, "binary", "datetime") - testTypeToStr(c, mysql.TypeDate, "binary", "date") - testTypeToStr(c, mysql.TypeTimestamp, "binary", "timestamp") - testTypeToStr(c, mysql.TypeNewDecimal, "binary", "decimal") - testTypeToStr(c, mysql.TypeUnspecified, "binary", "unspecified") - testTypeToStr(c, 0xdd, "binary", "") - testTypeToStr(c, mysql.TypeBit, "binary", "bit") - testTypeToStr(c, mysql.TypeEnum, "binary", "enum") - testTypeToStr(c, mysql.TypeSet, "binary", "set") +func TestTypeToStr(t *testing.T) { + defer testleak.AfterTestT(t)() + testTypeStr(t, mysql.TypeYear, "year") + testTypeStr(t, 0xdd, "") + + testTypeToStr(t, mysql.TypeBlob, "utf8", "text") + testTypeToStr(t, mysql.TypeLongBlob, "utf8", "longtext") + testTypeToStr(t, mysql.TypeTinyBlob, "utf8", "tinytext") + testTypeToStr(t, mysql.TypeMediumBlob, "utf8", "mediumtext") + testTypeToStr(t, mysql.TypeVarchar, "binary", "varbinary") + testTypeToStr(t, mysql.TypeString, "binary", "binary") + testTypeToStr(t, mysql.TypeTiny, "binary", "tinyint") + testTypeToStr(t, mysql.TypeBlob, "binary", "blob") + testTypeToStr(t, mysql.TypeLongBlob, "binary", "longblob") + testTypeToStr(t, mysql.TypeTinyBlob, "binary", "tinyblob") + testTypeToStr(t, mysql.TypeMediumBlob, "binary", "mediumblob") + testTypeToStr(t, mysql.TypeVarchar, "utf8", "varchar") + testTypeToStr(t, mysql.TypeString, "utf8", "char") + testTypeToStr(t, mysql.TypeShort, "binary", "smallint") + testTypeToStr(t, mysql.TypeInt24, "binary", "mediumint") + testTypeToStr(t, mysql.TypeLong, "binary", "int") + testTypeToStr(t, mysql.TypeLonglong, "binary", "bigint") + testTypeToStr(t, mysql.TypeFloat, "binary", "float") + testTypeToStr(t, mysql.TypeDouble, "binary", "double") + testTypeToStr(t, mysql.TypeYear, "binary", "year") + testTypeToStr(t, mysql.TypeDuration, "binary", "time") + testTypeToStr(t, mysql.TypeDatetime, "binary", "datetime") + testTypeToStr(t, mysql.TypeDate, "binary", "date") + testTypeToStr(t, mysql.TypeTimestamp, "binary", "timestamp") + testTypeToStr(t, mysql.TypeNewDecimal, "binary", "decimal") + testTypeToStr(t, mysql.TypeUnspecified, "binary", "unspecified") + testTypeToStr(t, 0xdd, "binary", "") + testTypeToStr(t, mysql.TypeBit, "binary", "bit") + testTypeToStr(t, mysql.TypeEnum, "binary", "enum") + testTypeToStr(t, mysql.TypeSet, "binary", "set") } -func (s *testTypeEtcSuite) TestEOFAsNil(c *C) { - defer testleak.AfterTest(c)() +func TestEOFAsNil(t *testing.T) { + defer testleak.AfterTestT(t)() err := EOFAsNil(io.EOF) - c.Assert(err, IsNil) + require.NoError(t, err) } -func (s *testTypeEtcSuite) TestMaxFloat(c *C) { - defer testleak.AfterTest(c)() +func TestMaxFloat(t *testing.T) { + defer testleak.AfterTestT(t)() tbl := []struct { Flen int Decimal int @@ -122,14 +118,14 @@ func (s *testTypeEtcSuite) TestMaxFloat(c *C) { {5, 5, 0.99999}, } - for _, t := range tbl { - f := GetMaxFloat(t.Flen, t.Decimal) - c.Assert(f, Equals, t.Expect) + for _, test := range tbl { + f := GetMaxFloat(test.Flen, test.Decimal) + require.Equal(t, test.Expect, f) } } -func (s *testTypeEtcSuite) TestRoundFloat(c *C) { - defer testleak.AfterTest(c)() +func TestRoundFloat(t *testing.T) { + defer testleak.AfterTestT(t)() tbl := []struct { Input float64 Expect float64 @@ -145,14 +141,14 @@ func (s *testTypeEtcSuite) TestRoundFloat(c *C) { {-1.5, -2}, } - for _, t := range tbl { - f := RoundFloat(t.Input) - c.Assert(f, Equals, t.Expect) + for _, test := range tbl { + f := RoundFloat(test.Input) + require.Equal(t, test.Expect, f) } } -func (s *testTypeEtcSuite) TestRound(c *C) { - defer testleak.AfterTest(c)() +func TestRound(t *testing.T) { + defer testleak.AfterTestT(t)() tbl := []struct { Input float64 Dec int @@ -166,14 +162,14 @@ func (s *testTypeEtcSuite) TestRound(c *C) { {23.298, -1, 20}, } - for _, t := range tbl { - f := Round(t.Input, t.Dec) - c.Assert(f, Equals, t.Expect) + for _, test := range tbl { + f := Round(test.Input, test.Dec) + require.Equal(t, test.Expect, f) } } -func (s *testTypeEtcSuite) TestTruncate(c *C) { - defer testleak.AfterTest(c)() +func TestTruncate(t *testing.T) { + defer testleak.AfterTestT(t)() tbl := []struct { Input float64 Flen int @@ -188,9 +184,9 @@ func (s *testTypeEtcSuite) TestTruncate(c *C) { {1.36, 10, 2, 1.36, nil}, } - for _, t := range tbl { - f, err := TruncateFloat(t.Input, t.Flen, t.Decimal) - c.Assert(f, Equals, t.Expect) - c.Assert(terror.ErrorEqual(err, t.Err), IsTrue, Commentf("err %v", err)) + for _, test := range tbl { + f, err := TruncateFloat(test.Input, test.Flen, test.Decimal) + require.Equal(t, test.Expect, f) + require.True(t, terror.ErrorEqual(err, test.Err)) } } diff --git a/parser/tidb-types/field_type_test.go b/parser/tidb-types/field_type_test.go index 55aa30f9..bae0166d 100644 --- a/parser/tidb-types/field_type_test.go +++ b/parser/tidb-types/field_type_test.go @@ -14,152 +14,149 @@ package types import ( - . "github.com/pingcap/check" + "testing" + + "github.com/stretchr/testify/require" "github.com/XiaoMi/Gaea/mysql" "github.com/XiaoMi/Gaea/util/testleak" ) -var _ = Suite(&testFieldTypeSuite{}) - -type testFieldTypeSuite struct { -} - -func (s *testFieldTypeSuite) TestFieldType(c *C) { - defer testleak.AfterTest(c)() +func TestFieldType(t *testing.T) { + defer testleak.AfterTestT(t)() ft := NewFieldType(mysql.TypeDuration) - c.Assert(ft.Flen, Equals, UnspecifiedLength) - c.Assert(ft.Decimal, Equals, UnspecifiedLength) + require.Equal(t, UnspecifiedLength, ft.Flen) + require.Equal(t, UnspecifiedLength, ft.Decimal) ft.Decimal = 5 - c.Assert(ft.String(), Equals, "time(5)") + require.Equal(t, "time(5)", ft.String()) ft = NewFieldType(mysql.TypeLong) ft.Flen = 5 ft.Flag = mysql.UnsignedFlag | mysql.ZerofillFlag - c.Assert(ft.String(), Equals, "int(5) UNSIGNED ZEROFILL") - c.Assert(ft.InfoSchemaStr(), Equals, "int(5) unsigned") + require.Equal(t, "int(5) UNSIGNED ZEROFILL", ft.String()) + require.Equal(t, "int(5) unsigned", ft.InfoSchemaStr()) ft = NewFieldType(mysql.TypeFloat) ft.Flen = 12 // Default ft.Decimal = 3 // Not Default - c.Assert(ft.String(), Equals, "float(12,3)") + require.Equal(t, "float(12,3)", ft.String()) ft = NewFieldType(mysql.TypeFloat) ft.Flen = 12 // Default ft.Decimal = -1 // Default - c.Assert(ft.String(), Equals, "float") + require.Equal(t, "float", ft.String()) ft = NewFieldType(mysql.TypeFloat) ft.Flen = 5 // Not Default ft.Decimal = -1 // Default - c.Assert(ft.String(), Equals, "float") + require.Equal(t, "float", ft.String()) ft = NewFieldType(mysql.TypeFloat) ft.Flen = 7 // Not Default ft.Decimal = 3 // Not Default - c.Assert(ft.String(), Equals, "float(7,3)") + require.Equal(t, "float(7,3)", ft.String()) ft = NewFieldType(mysql.TypeDouble) ft.Flen = 22 // Default ft.Decimal = 3 // Not Default - c.Assert(ft.String(), Equals, "double(22,3)") + require.Equal(t, "double(22,3)", ft.String()) ft = NewFieldType(mysql.TypeDouble) ft.Flen = 22 // Default ft.Decimal = -1 // Default - c.Assert(ft.String(), Equals, "double") + require.Equal(t, "double", ft.String()) ft = NewFieldType(mysql.TypeDouble) ft.Flen = 5 // Not Default ft.Decimal = -1 // Default - c.Assert(ft.String(), Equals, "double") + require.Equal(t, "double", ft.String()) ft = NewFieldType(mysql.TypeDouble) ft.Flen = 7 // Not Default ft.Decimal = 3 // Not Default - c.Assert(ft.String(), Equals, "double(7,3)") + require.Equal(t, "double(7,3)", ft.String()) ft = NewFieldType(mysql.TypeBlob) ft.Flen = 10 ft.Charset = "UTF8" ft.Collate = "UTF8_UNICODE_GI" - c.Assert(ft.String(), Equals, "text CHARACTER SET UTF8 COLLATE UTF8_UNICODE_GI") + require.Equal(t, "text CHARACTER SET UTF8 COLLATE UTF8_UNICODE_GI", ft.String()) ft = NewFieldType(mysql.TypeVarchar) ft.Flen = 10 ft.Flag |= mysql.BinaryFlag - c.Assert(ft.String(), Equals, "varchar(10) BINARY") + require.Equal(t, "varchar(10) BINARY", ft.String()) ft = NewFieldType(mysql.TypeString) ft.Charset = mysql.CollationBin ft.Flag |= mysql.BinaryFlag - c.Assert(ft.String(), Equals, "binary(1)") + require.Equal(t, "binary(1)", ft.String()) ft = NewFieldType(mysql.TypeEnum) ft.Elems = []string{"a", "b"} - c.Assert(ft.String(), Equals, "enum('a','b')") + require.Equal(t, "enum('a','b')", ft.String()) ft = NewFieldType(mysql.TypeEnum) ft.Elems = []string{"'a'", "'b'"} - c.Assert(ft.String(), Equals, "enum('''a''','''b''')") + require.Equal(t, "enum('''a''','''b''')", ft.String()) ft = NewFieldType(mysql.TypeEnum) ft.Elems = []string{"a\nb", "a\tb", "a\rb"} - c.Assert(ft.String(), Equals, "enum('a\\nb','a\tb','a\\rb')") + require.Equal(t, "enum('a\\nb','a\tb','a\\rb')", ft.String()) ft = NewFieldType(mysql.TypeEnum) ft.Elems = []string{"a\nb", "a'\t\r\nb", "a\rb"} - c.Assert(ft.String(), Equals, "enum('a\\nb','a'' \\r\\nb','a\\rb')") + require.Equal(t, "enum('a\\nb','a'' \\r\\nb','a\\rb')", ft.String()) ft = NewFieldType(mysql.TypeSet) ft.Elems = []string{"a", "b"} - c.Assert(ft.String(), Equals, "set('a','b')") + require.Equal(t, "set('a','b')", ft.String()) ft = NewFieldType(mysql.TypeSet) ft.Elems = []string{"'a'", "'b'"} - c.Assert(ft.String(), Equals, "set('''a''','''b''')") + require.Equal(t, "set('''a''','''b''')", ft.String()) ft = NewFieldType(mysql.TypeSet) ft.Elems = []string{"a\nb", "a'\t\r\nb", "a\rb"} - c.Assert(ft.String(), Equals, "set('a\\nb','a'' \\r\\nb','a\\rb')") + require.Equal(t, "set('a\\nb','a'' \\r\\nb','a\\rb')", ft.String()) ft = NewFieldType(mysql.TypeSet) ft.Elems = []string{"a'\nb", "a'b\tc"} - c.Assert(ft.String(), Equals, "set('a''\\nb','a''b c')") + require.Equal(t, "set('a''\\nb','a''b c')", ft.String()) ft = NewFieldType(mysql.TypeTimestamp) ft.Flen = 8 ft.Decimal = 2 - c.Assert(ft.String(), Equals, "timestamp(2)") + require.Equal(t, "timestamp(2)", ft.String()) ft = NewFieldType(mysql.TypeTimestamp) ft.Flen = 8 ft.Decimal = 0 - c.Assert(ft.String(), Equals, "timestamp") + require.Equal(t, "timestamp", ft.String()) ft = NewFieldType(mysql.TypeDatetime) ft.Flen = 8 ft.Decimal = 2 - c.Assert(ft.String(), Equals, "datetime(2)") + require.Equal(t, "datetime(2)", ft.String()) ft = NewFieldType(mysql.TypeDatetime) ft.Flen = 8 ft.Decimal = 0 - c.Assert(ft.String(), Equals, "datetime") + require.Equal(t, "datetime", ft.String()) ft = NewFieldType(mysql.TypeDate) ft.Flen = 8 ft.Decimal = 2 - c.Assert(ft.String(), Equals, "date") + require.Equal(t, "date", ft.String()) ft = NewFieldType(mysql.TypeDate) ft.Flen = 8 ft.Decimal = 0 - c.Assert(ft.String(), Equals, "date") + require.Equal(t, "date", ft.String()) ft = NewFieldType(mysql.TypeYear) ft.Flen = 4 ft.Decimal = 0 - c.Assert(ft.String(), Equals, "year") + require.Equal(t, "year", ft.String()) ft = NewFieldType(mysql.TypeYear) ft.Flen = 2 ft.Decimal = 2 - c.Assert(ft.String(), Equals, "year") // Note: Invalid year. + require.Equal(t, "year", ft.String()) // Note: Invalid year. } -func (s *testFieldTypeSuite) TestDefaultTypeForValue(c *C) { - defer testleak.AfterTest(c)() +func TestDefaultTypeForValue(t *testing.T) { + defer testleak.AfterTestT(t)() tests := []struct { value interface{} tp byte @@ -187,20 +184,20 @@ func (s *testFieldTypeSuite) TestDefaultTypeForValue(c *C) { {Enum{Name: "a", Value: 1}, mysql.TypeEnum, 1, UnspecifiedLength, mysql.CharsetBin, mysql.CharsetBin, mysql.BinaryFlag}, {Set{Name: "a", Value: 1}, mysql.TypeSet, 1, UnspecifiedLength, mysql.CharsetBin, mysql.CharsetBin, mysql.BinaryFlag}, } - for _, tt := range tests { + for i, tt := range tests { var ft FieldType DefaultTypeForValue(tt.value, &ft) - c.Assert(ft.Tp, Equals, tt.tp, Commentf("%v %v", ft.Tp, tt.tp)) - c.Assert(ft.Flen, Equals, tt.flen, Commentf("%v %v", ft.Flen, tt.flen)) - c.Assert(ft.Charset, Equals, tt.charset, Commentf("%v %v", ft.Charset, tt.charset)) - c.Assert(ft.Decimal, Equals, tt.decimal, Commentf("%v %v", ft.Decimal, tt.decimal)) - c.Assert(ft.Collate, Equals, tt.collation, Commentf("%v %v", ft.Collate, tt.collation)) - c.Assert(ft.Flag, Equals, tt.flag, Commentf("%v %v", ft.Flag, tt.flag)) + require.Equalf(t, tt.tp, ft.Tp, "%v %v %v", i, ft.Tp, tt.tp) + require.Equalf(t, tt.flen, ft.Flen, "%v %v %v", i, ft.Flen, tt.flen) + require.Equalf(t, tt.charset, ft.Charset, "%v %v %v", i, ft.Charset, tt.charset) + require.Equalf(t, tt.decimal, ft.Decimal, "%v %v %v", i, ft.Decimal, tt.decimal) + require.Equalf(t, tt.collation, ft.Collate, "%v %v %v", i, ft.Collate, tt.collation) + require.Equalf(t, tt.flag, ft.Flag, "%v %v %v", i, ft.Flag, tt.flag) } } -func (s *testFieldTypeSuite) TestAggFieldType(c *C) { - defer testleak.AfterTest(c)() +func TestAggFieldType(t *testing.T) { + defer testleak.AfterTestT(t)() fts := []*FieldType{ NewFieldType(mysql.TypeDecimal), NewFieldType(mysql.TypeTiny), @@ -234,66 +231,66 @@ func (s *testFieldTypeSuite) TestAggFieldType(c *C) { for i := range fts { aggTp := AggFieldType(fts[i : i+1]) - c.Assert(aggTp.Tp, Equals, fts[i].Tp) + require.Equal(t, fts[i].Tp, aggTp.Tp) aggTp = AggFieldType([]*FieldType{fts[i], fts[i]}) switch fts[i].Tp { case mysql.TypeDate: - c.Assert(aggTp.Tp, Equals, mysql.TypeDate) + require.Equal(t, mysql.TypeDate, aggTp.Tp) case mysql.TypeJSON: - c.Assert(aggTp.Tp, Equals, mysql.TypeJSON) + require.Equal(t, mysql.TypeJSON, aggTp.Tp) case mysql.TypeEnum, mysql.TypeSet, mysql.TypeVarString: - c.Assert(aggTp.Tp, Equals, mysql.TypeVarchar) + require.Equal(t, mysql.TypeVarchar, aggTp.Tp) case mysql.TypeDecimal: - c.Assert(aggTp.Tp, Equals, mysql.TypeNewDecimal) + require.Equal(t, mysql.TypeNewDecimal, aggTp.Tp) default: - c.Assert(aggTp.Tp, Equals, fts[i].Tp) + require.Equal(t, fts[i].Tp, aggTp.Tp) } aggTp = AggFieldType([]*FieldType{fts[i], NewFieldType(mysql.TypeLong)}) switch fts[i].Tp { case mysql.TypeTiny, mysql.TypeShort, mysql.TypeLong, mysql.TypeYear, mysql.TypeInt24, mysql.TypeNull: - c.Assert(aggTp.Tp, Equals, mysql.TypeLong) + require.Equal(t, mysql.TypeLong, aggTp.Tp) case mysql.TypeLonglong: - c.Assert(aggTp.Tp, Equals, mysql.TypeLonglong) + require.Equal(t, mysql.TypeLonglong, aggTp.Tp) case mysql.TypeFloat, mysql.TypeDouble: - c.Assert(aggTp.Tp, Equals, mysql.TypeDouble) + require.Equal(t, mysql.TypeDouble, aggTp.Tp) case mysql.TypeTimestamp, mysql.TypeDate, mysql.TypeDuration, mysql.TypeDatetime, mysql.TypeNewDate, mysql.TypeVarchar, mysql.TypeBit, mysql.TypeJSON, mysql.TypeEnum, mysql.TypeSet, mysql.TypeVarString, mysql.TypeGeometry: - c.Assert(aggTp.Tp, Equals, mysql.TypeVarchar) + require.Equal(t, mysql.TypeVarchar, aggTp.Tp) case mysql.TypeString: - c.Assert(aggTp.Tp, Equals, mysql.TypeString) + require.Equal(t, mysql.TypeString, aggTp.Tp) case mysql.TypeDecimal, mysql.TypeNewDecimal: - c.Assert(aggTp.Tp, Equals, mysql.TypeNewDecimal) + require.Equal(t, mysql.TypeNewDecimal, aggTp.Tp) case mysql.TypeTinyBlob: - c.Assert(aggTp.Tp, Equals, mysql.TypeTinyBlob) + require.Equal(t, mysql.TypeTinyBlob, aggTp.Tp) case mysql.TypeBlob: - c.Assert(aggTp.Tp, Equals, mysql.TypeBlob) + require.Equal(t, mysql.TypeBlob, aggTp.Tp) case mysql.TypeMediumBlob: - c.Assert(aggTp.Tp, Equals, mysql.TypeMediumBlob) + require.Equal(t, mysql.TypeMediumBlob, aggTp.Tp) case mysql.TypeLongBlob: - c.Assert(aggTp.Tp, Equals, mysql.TypeLongBlob) + require.Equal(t, mysql.TypeLongBlob, aggTp.Tp) } aggTp = AggFieldType([]*FieldType{fts[i], NewFieldType(mysql.TypeJSON)}) switch fts[i].Tp { case mysql.TypeJSON, mysql.TypeNull: - c.Assert(aggTp.Tp, Equals, mysql.TypeJSON) + require.Equal(t, mysql.TypeJSON, aggTp.Tp) case mysql.TypeLongBlob, mysql.TypeMediumBlob, mysql.TypeTinyBlob, mysql.TypeBlob: - c.Assert(aggTp.Tp, Equals, mysql.TypeLongBlob) + require.Equal(t, mysql.TypeLongBlob, aggTp.Tp) case mysql.TypeString: - c.Assert(aggTp.Tp, Equals, mysql.TypeString) + require.Equal(t, mysql.TypeString, aggTp.Tp) default: - c.Assert(aggTp.Tp, Equals, mysql.TypeVarchar) + require.Equal(t, mysql.TypeVarchar, aggTp.Tp) } } } -func (s *testFieldTypeSuite) TestAggregateEvalType(c *C) { - defer testleak.AfterTest(c)() +func TestAggregateEvalType(t *testing.T) { + defer testleak.AfterTestT(t)() fts := []*FieldType{ NewFieldType(mysql.TypeDecimal), NewFieldType(mysql.TypeTiny), @@ -334,18 +331,18 @@ func (s *testFieldTypeSuite) TestAggregateEvalType(c *C) { mysql.TypeJSON, mysql.TypeEnum, mysql.TypeSet, mysql.TypeTinyBlob, mysql.TypeMediumBlob, mysql.TypeLongBlob, mysql.TypeBlob, mysql.TypeVarString, mysql.TypeString, mysql.TypeGeometry: - c.Assert(aggregatedEvalType.IsStringKind(), IsTrue) - c.Assert(flag, Equals, uint(0)) + require.True(t, aggregatedEvalType.IsStringKind()) + require.Equal(t, uint(0), flag) case mysql.TypeTiny, mysql.TypeShort, mysql.TypeLong, mysql.TypeLonglong, mysql.TypeBit, mysql.TypeInt24, mysql.TypeYear: - c.Assert(aggregatedEvalType, Equals, ETInt) - c.Assert(flag, Equals, uint(mysql.BinaryFlag)) + require.Equal(t, ETInt, aggregatedEvalType) + require.Equal(t, uint(mysql.BinaryFlag), flag) case mysql.TypeFloat, mysql.TypeDouble: - c.Assert(aggregatedEvalType, Equals, ETReal) - c.Assert(flag, Equals, uint(mysql.BinaryFlag)) + require.Equal(t, ETReal, aggregatedEvalType) + require.Equal(t, uint(mysql.BinaryFlag), flag) case mysql.TypeNewDecimal: - c.Assert(aggregatedEvalType, Equals, ETDecimal) - c.Assert(flag, Equals, uint(mysql.BinaryFlag)) + require.Equal(t, ETDecimal, aggregatedEvalType) + require.Equal(t, uint(mysql.BinaryFlag), flag) } flag = 0 @@ -356,18 +353,18 @@ func (s *testFieldTypeSuite) TestAggregateEvalType(c *C) { mysql.TypeJSON, mysql.TypeEnum, mysql.TypeSet, mysql.TypeTinyBlob, mysql.TypeMediumBlob, mysql.TypeLongBlob, mysql.TypeBlob, mysql.TypeVarString, mysql.TypeString, mysql.TypeGeometry: - c.Assert(aggregatedEvalType.IsStringKind(), IsTrue) - c.Assert(flag, Equals, uint(0)) + require.True(t, aggregatedEvalType.IsStringKind()) + require.Equal(t, uint(0), flag) case mysql.TypeTiny, mysql.TypeShort, mysql.TypeLong, mysql.TypeLonglong, mysql.TypeBit, mysql.TypeInt24, mysql.TypeYear: - c.Assert(aggregatedEvalType, Equals, ETInt) - c.Assert(flag, Equals, uint(mysql.BinaryFlag)) + require.Equal(t, ETInt, aggregatedEvalType) + require.Equal(t, uint(mysql.BinaryFlag), flag) case mysql.TypeFloat, mysql.TypeDouble: - c.Assert(aggregatedEvalType, Equals, ETReal) - c.Assert(flag, Equals, uint(mysql.BinaryFlag)) + require.Equal(t, ETReal, aggregatedEvalType) + require.Equal(t, uint(mysql.BinaryFlag), flag) case mysql.TypeNewDecimal: - c.Assert(aggregatedEvalType, Equals, ETDecimal) - c.Assert(flag, Equals, uint(mysql.BinaryFlag)) + require.Equal(t, ETDecimal, aggregatedEvalType) + require.Equal(t, uint(mysql.BinaryFlag), flag) } flag = 0 aggregatedEvalType = AggregateEvalType([]*FieldType{fts[i], NewFieldType(mysql.TypeLong)}, &flag) @@ -377,18 +374,18 @@ func (s *testFieldTypeSuite) TestAggregateEvalType(c *C) { mysql.TypeEnum, mysql.TypeSet, mysql.TypeTinyBlob, mysql.TypeMediumBlob, mysql.TypeLongBlob, mysql.TypeBlob, mysql.TypeVarString, mysql.TypeString, mysql.TypeGeometry: - c.Assert(aggregatedEvalType.IsStringKind(), IsTrue) - c.Assert(flag, Equals, uint(0)) + require.True(t, aggregatedEvalType.IsStringKind()) + require.Equal(t, uint(0), flag) case mysql.TypeDecimal, mysql.TypeTiny, mysql.TypeShort, mysql.TypeLong, mysql.TypeNull, mysql.TypeBit, mysql.TypeLonglong, mysql.TypeYear, mysql.TypeInt24: - c.Assert(aggregatedEvalType, Equals, ETInt) - c.Assert(flag, Equals, uint(mysql.BinaryFlag)) + require.Equal(t, ETInt, aggregatedEvalType) + require.Equal(t, uint(mysql.BinaryFlag), flag) case mysql.TypeFloat, mysql.TypeDouble: - c.Assert(aggregatedEvalType, Equals, ETReal) - c.Assert(flag, Equals, uint(mysql.BinaryFlag)) + require.Equal(t, ETReal, aggregatedEvalType) + require.Equal(t, uint(mysql.BinaryFlag), flag) case mysql.TypeNewDecimal: - c.Assert(aggregatedEvalType, Equals, ETDecimal) - c.Assert(flag, Equals, uint(mysql.BinaryFlag)) + require.Equal(t, ETDecimal, aggregatedEvalType) + require.Equal(t, uint(mysql.BinaryFlag), flag) } } } diff --git a/parser/tidb-types/fsp_test.go b/parser/tidb-types/fsp_test.go index e4b73ee1..e804c0ca 100644 --- a/parser/tidb-types/fsp_test.go +++ b/parser/tidb-types/fsp_test.go @@ -17,107 +17,100 @@ import ( "strconv" "testing" - . "github.com/pingcap/check" + "github.com/stretchr/testify/require" ) -func Test(t *testing.T) { - TestingT(t) -} - -var _ = Suite(&FspTest{}) +func TestCheckFsp(t *testing.T) { -type FspTest struct{} - -func (s *FspTest) TestCheckFsp(c *C) { - c.Parallel() obtained, err := CheckFsp(UnspecifiedFsp) - c.Assert(obtained, Equals, DefaultFsp) - c.Assert(err, IsNil) + require.Equal(t, DefaultFsp, obtained) + require.NoError(t, err) obtained, err = CheckFsp(-2019) - c.Assert(obtained, Equals, DefaultFsp) - c.Assert(err, ErrorMatches, "Invalid fsp -2019") + require.Equal(t, DefaultFsp, obtained) + require.EqualError(t, err, "Invalid fsp -2019") obtained, err = CheckFsp(MinFsp - 4294967296) - c.Assert(obtained, Equals, DefaultFsp) - c.Assert(err, ErrorMatches, "Invalid fsp "+strconv.Itoa(MinFsp-4294967296)) + require.Equal(t, DefaultFsp, obtained) + require.EqualError(t, err, "Invalid fsp "+strconv.Itoa(MinFsp-4294967296)) // UnspecifiedFsp obtained, err = CheckFsp(-1) - c.Assert(obtained, Equals, DefaultFsp) - c.Assert(err, IsNil) + require.Equal(t, DefaultFsp, obtained) + require.NoError(t, err) obtained, err = CheckFsp(MaxFsp + 1) - c.Assert(obtained, Equals, DefaultFsp) - c.Assert(err, ErrorMatches, "Invalid fsp "+strconv.Itoa(MaxFsp+1)) + require.Equal(t, DefaultFsp, obtained) + require.EqualError(t, err, "Invalid fsp "+strconv.Itoa(MaxFsp+1)) obtained, err = CheckFsp(MaxFsp + 2019) - c.Assert(obtained, Equals, DefaultFsp) - c.Assert(err, ErrorMatches, "Invalid fsp "+strconv.Itoa(MaxFsp+2019)) + require.Equal(t, DefaultFsp, obtained) + require.EqualError(t, err, "Invalid fsp "+strconv.Itoa(MaxFsp+2019)) obtained, err = CheckFsp(MaxFsp + 4294967296) - c.Assert(obtained, Equals, DefaultFsp) - c.Assert(err, ErrorMatches, "Invalid fsp "+strconv.Itoa(MaxFsp+4294967296)) + require.Equal(t, DefaultFsp, obtained) + require.EqualError(t, err, "Invalid fsp "+strconv.Itoa(MaxFsp+4294967296)) obtained, err = CheckFsp((MaxFsp + MinFsp) / 2) - c.Assert(obtained, Equals, (MaxFsp+MinFsp)/2) - c.Assert(err, IsNil) + require.Equal(t, (MaxFsp+MinFsp)/2, obtained) + require.NoError(t, err) obtained, err = CheckFsp(5) - c.Assert(obtained, Equals, 5) - c.Assert(err, IsNil) + require.Equal(t, 5, obtained) + require.NoError(t, err) + } -func (s *FspTest) TestParseFrac(c *C) { - c.Parallel() +func TestParseFrac(t *testing.T) { obtained, overflow, err := ParseFrac("", 5) - c.Assert(obtained, Equals, 0) - c.Assert(overflow, Equals, false) - c.Assert(err, IsNil) + require.Equal(t, 0, obtained) + require.False(t, overflow) + require.NoError(t, err) obtained, overflow, err = ParseFrac("999", 200) - c.Assert(obtained, Equals, 0) - c.Assert(overflow, Equals, false) - c.Assert(err, ErrorMatches, "Invalid fsp .*") + require.Equal(t, 0, obtained) + require.False(t, overflow) + require.Error(t, err) + require.Regexp(t, "^Invalid fsp ", err.Error()) obtained, overflow, err = ParseFrac("NotNum", MaxFsp) - c.Assert(obtained, Equals, 0) - c.Assert(overflow, Equals, false) - c.Assert(err, ErrorMatches, "strconv.ParseInt:.*") + require.Equal(t, 0, obtained) + require.False(t, overflow) + require.Error(t, err) + require.Regexp(t, "strconv.ParseInt:.*", err.Error()) obtained, overflow, err = ParseFrac("1235", 6) - c.Assert(obtained, Equals, 123500) - c.Assert(overflow, Equals, false) - c.Assert(err, IsNil) + require.Equal(t, 123500, obtained) + require.False(t, overflow) + require.NoError(t, err) obtained, overflow, err = ParseFrac("123456", 4) - c.Assert(obtained, Equals, 123500) - c.Assert(overflow, Equals, false) - c.Assert(err, IsNil) + require.Equal(t, 123500, obtained) + require.False(t, overflow) + require.NoError(t, err) // 1236 round 3 -> 124 -> 124000 obtained, overflow, err = ParseFrac("1236", 3) - c.Assert(obtained, Equals, 124000) - c.Assert(overflow, Equals, false) - c.Assert(err, IsNil) + require.Equal(t, 124000, obtained) + require.False(t, overflow) + require.NoError(t, err) // 03123 round 2 -> 3 -> 30000 obtained, overflow, err = ParseFrac("0312", 2) - c.Assert(obtained, Equals, 30000) - c.Assert(overflow, Equals, false) - c.Assert(err, IsNil) + require.Equal(t, 30000, obtained) + require.False(t, overflow) + require.NoError(t, err) // 999 round 2 -> 100 -> overflow obtained, overflow, err = ParseFrac("999", 2) - c.Assert(obtained, Equals, 0) - c.Assert(overflow, Equals, true) - c.Assert(err, IsNil) + require.Equal(t, 0, obtained) + require.True(t, overflow) + require.NoError(t, err) } -func (s *FspTest) TestAlignFrac(c *C) { - c.Parallel() +func TestAlignFrac(t *testing.T) { obtained := alignFrac("100", 6) - c.Assert(obtained, Equals, "100000") + require.Equal(t, "100000", obtained) obtained = alignFrac("10000000000", 6) - c.Assert(obtained, Equals, "10000000000") + require.Equal(t, "10000000000", obtained) } diff --git a/parser/tidb-types/helper_test.go b/parser/tidb-types/helper_test.go index fa399802..0e0b9ca1 100644 --- a/parser/tidb-types/helper_test.go +++ b/parser/tidb-types/helper_test.go @@ -15,17 +15,13 @@ package types import ( "strconv" + "testing" - . "github.com/pingcap/check" "github.com/pingcap/errors" + "github.com/stretchr/testify/require" ) -var _ = Suite(&testTypeHelperSuite{}) - -type testTypeHelperSuite struct { -} - -func (s *testTypeHelperSuite) TestStrToInt(c *C) { +func TestStrToInt(t *testing.T) { tests := []struct { input string output string @@ -40,7 +36,7 @@ func (s *testTypeHelperSuite) TestStrToInt(c *C) { } for _, tt := range tests { output, err := strToInt(tt.input) - c.Assert(errors.Cause(err), Equals, tt.err) - c.Check(strconv.FormatInt(output, 10), Equals, tt.output) + require.Equal(t, tt.err, errors.Cause(err)) + require.Equal(t, tt.output, strconv.FormatInt(output, 10)) } } diff --git a/parser/tidb-types/json/binary_functions.go b/parser/tidb-types/json/binary_functions.go index 3508d43a..e2b26e4f 100644 --- a/parser/tidb-types/json/binary_functions.go +++ b/parser/tidb-types/json/binary_functions.go @@ -151,8 +151,9 @@ func decodeEscapedUnicode(s []byte) (char [4]byte, size int, err error) { } // Extract receives several path expressions as arguments, matches them in bj, and returns: -// ret: target JSON matched any path expressions. maybe autowrapped as an array. -// found: true if any path expressions matched. +// +// ret: target JSON matched any path expressions. maybe autowrapped as an array. +// found: true if any path expressions matched. func (bj BinaryJSON) Extract(pathExprList []PathExpression) (ret BinaryJSON, found bool) { buf := make([]BinaryJSON, 0, 1) for _, pathExpr := range pathExprList { diff --git a/parser/tidb-types/json/binary_test.go b/parser/tidb-types/json/binary_test.go index efa109cb..49e209cb 100644 --- a/parser/tidb-types/json/binary_test.go +++ b/parser/tidb-types/json/binary_test.go @@ -17,31 +17,28 @@ import ( "testing" . "github.com/pingcap/check" + "github.com/stretchr/testify/require" ) -var _ = Suite(&testJSONSuite{}) - -type testJSONSuite struct{} - func TestT(t *testing.T) { TestingT(t) } -func (s *testJSONSuite) TestBinaryJSONMarshalUnmarshal(c *C) { +func TestBinaryJSONMarshalUnmarshal(t *testing.T) { strs := []string{ `{"a": [1, "2", {"aa": "bb"}, 4, null], "b": true, "c": null}`, `{"aaaaaaaaaaa": [1, "2", {"aa": "bb"}, 4.1], "bbbbbbbbbb": true, "ccccccccc": "d"}`, `[{"a": 1, "b": true}, 3, 3.5, "hello, world", null, true]`, } for _, str := range strs { - parsedBJ := mustParseBinaryFromString(c, str) - c.Assert(parsedBJ.String(), Equals, str) + parsedBJ := mustParseBinaryFromString(t, str) + require.Equal(t, str, parsedBJ.String()) } } -func (s *testJSONSuite) TestBinaryJSONExtract(c *C) { - bj1 := mustParseBinaryFromString(c, `{"\"hello\"": "world", "a": [1, "2", {"aa": "bb"}, 4.0, {"aa": "cc"}], "b": true, "c": ["d"]}`) - bj2 := mustParseBinaryFromString(c, `[{"a": 1, "b": true}, 3, 3.5, "hello, world", null, true]`) +func TestBinaryJSONExtract(t *testing.T) { + bj1 := mustParseBinaryFromString(t, `{"\"hello\"": "world", "a": [1, "2", {"aa": "bb"}, 4.0, {"aa": "cc"}], "b": true, "c": ["d"]}`) + bj2 := mustParseBinaryFromString(t, `[{"a": 1, "b": true}, 3, 3.5, "hello, world", null, true]`) var tests = []struct { bj BinaryJSON @@ -51,39 +48,39 @@ func (s *testJSONSuite) TestBinaryJSONExtract(c *C) { err error }{ // test extract with only one path expression. - {bj1, []string{"$.a"}, mustParseBinaryFromString(c, `[1, "2", {"aa": "bb"}, 4.0, {"aa": "cc"}]`), true, nil}, - {bj2, []string{"$.a"}, mustParseBinaryFromString(c, "null"), false, nil}, + {bj1, []string{"$.a"}, mustParseBinaryFromString(t, `[1, "2", {"aa": "bb"}, 4.0, {"aa": "cc"}]`), true, nil}, + {bj2, []string{"$.a"}, mustParseBinaryFromString(t, "null"), false, nil}, {bj1, []string{"$[0]"}, bj1, true, nil}, // in Extract, autowraped bj1 as an array. - {bj2, []string{"$[0]"}, mustParseBinaryFromString(c, `{"a": 1, "b": true}`), true, nil}, - {bj1, []string{"$.a[2].aa"}, mustParseBinaryFromString(c, `"bb"`), true, nil}, - {bj1, []string{"$.a[*].aa"}, mustParseBinaryFromString(c, `["bb", "cc"]`), true, nil}, - {bj1, []string{"$.*[0]"}, mustParseBinaryFromString(c, `["world", 1, true, "d"]`), true, nil}, - {bj1, []string{`$.a[*]."aa"`}, mustParseBinaryFromString(c, `["bb", "cc"]`), true, nil}, - {bj1, []string{`$."\"hello\""`}, mustParseBinaryFromString(c, `"world"`), true, nil}, - {bj1, []string{`$**[1]`}, mustParseBinaryFromString(c, `"2"`), true, nil}, + {bj2, []string{"$[0]"}, mustParseBinaryFromString(t, `{"a": 1, "b": true}`), true, nil}, + {bj1, []string{"$.a[2].aa"}, mustParseBinaryFromString(t, `"bb"`), true, nil}, + {bj1, []string{"$.a[*].aa"}, mustParseBinaryFromString(t, `["bb", "cc"]`), true, nil}, + {bj1, []string{"$.*[0]"}, mustParseBinaryFromString(t, `["world", 1, true, "d"]`), true, nil}, + {bj1, []string{`$.a[*]."aa"`}, mustParseBinaryFromString(t, `["bb", "cc"]`), true, nil}, + {bj1, []string{`$."\"hello\""`}, mustParseBinaryFromString(t, `"world"`), true, nil}, + {bj1, []string{`$**[1]`}, mustParseBinaryFromString(t, `"2"`), true, nil}, // test extract with multi path expressions. - {bj1, []string{"$.a", "$[5]"}, mustParseBinaryFromString(c, `[[1, "2", {"aa": "bb"}, 4.0, {"aa": "cc"}]]`), true, nil}, - {bj2, []string{"$.a", "$[0]"}, mustParseBinaryFromString(c, `[{"a": 1, "b": true}]`), true, nil}, + {bj1, []string{"$.a", "$[5]"}, mustParseBinaryFromString(t, `[[1, "2", {"aa": "bb"}, 4.0, {"aa": "cc"}]]`), true, nil}, + {bj2, []string{"$.a", "$[0]"}, mustParseBinaryFromString(t, `[{"a": 1, "b": true}]`), true, nil}, } for _, tt := range tests { var pathExprList = make([]PathExpression, 0) for _, peStr := range tt.pathExprStrings { pe, err := ParseJSONPathExpr(peStr) - c.Assert(err, IsNil) + require.NoError(t, err) pathExprList = append(pathExprList, pe) } result, found := tt.bj.Extract(pathExprList) - c.Assert(found, Equals, tt.found) + require.Equal(t, tt.found, found, found) if found { - c.Assert(result.String(), Equals, tt.expected.String()) + require.Equal(t, tt.expected.String(), result.String()) } } } -func (s *testJSONSuite) TestBinaryJSONType(c *C) { +func TestBinaryJSONType(t *testing.T) { var tests = []struct { In string Out string @@ -96,15 +93,15 @@ func (s *testJSONSuite) TestBinaryJSONType(c *C) { {`true`, "BOOLEAN"}, } for _, tt := range tests { - bj := mustParseBinaryFromString(c, tt.In) - c.Assert(bj.Type(), Equals, tt.Out) + bj := mustParseBinaryFromString(t, tt.In) + require.Equal(t, tt.Out, bj.Type()) } // we can't parse '9223372036854775808' to JSON::Uint64 now, // because go builtin JSON parser treats that as DOUBLE. - c.Assert(CreateBinary(uint64(1<<63)).Type(), Equals, "UNSIGNED INTEGER") + require.Equal(t, "UNSIGNED INTEGER", CreateBinary(uint64(1<<63)).Type()) } -func (s *testJSONSuite) TestBinaryJSONUnquote(c *C) { +func TestBinaryJSONUnquote(t *testing.T) { var tests = []struct { j string unquoted string @@ -122,14 +119,14 @@ func (s *testJSONSuite) TestBinaryJSONUnquote(c *C) { {j: `""`, unquoted: ``}, } for _, tt := range tests { - bj := mustParseBinaryFromString(c, tt.j) + bj := mustParseBinaryFromString(t, tt.j) unquoted, err := bj.Unquote() - c.Assert(err, IsNil) - c.Assert(unquoted, Equals, tt.unquoted) + require.NoError(t, err) + require.Equal(t, tt.unquoted, unquoted) } } -func (s *testJSONSuite) TestBinaryJSONModify(c *C) { +func TestBinaryJSONModify(t *testing.T) { var tests = []struct { base string setField string @@ -167,22 +164,22 @@ func (s *testJSONSuite) TestBinaryJSONModify(c *C) { } for _, tt := range tests { pathExpr, err := ParseJSONPathExpr(tt.setField) - c.Assert(err, IsNil) + require.NoError(t, err) - base := mustParseBinaryFromString(c, tt.base) - value := mustParseBinaryFromString(c, tt.setValue) - expected := mustParseBinaryFromString(c, tt.expected) + base := mustParseBinaryFromString(t, tt.base) + value := mustParseBinaryFromString(t, tt.setValue) + expected := mustParseBinaryFromString(t, tt.expected) obtain, err := base.Modify([]PathExpression{pathExpr}, []BinaryJSON{value}, tt.mt) if tt.success { - c.Assert(err, IsNil) - c.Assert(obtain.String(), Equals, expected.String()) + require.NoError(t, err) + require.Equal(t, expected.String(), obtain.String()) } else { - c.Assert(err, NotNil) + require.Error(t, err) } } } -func (s *testJSONSuite) TestBinaryJSONRemove(c *C) { +func TestBinaryJSONRemove(t *testing.T) { var tests = []struct { base string path string @@ -203,31 +200,31 @@ func (s *testJSONSuite) TestBinaryJSONRemove(c *C) { } for _, tt := range tests { pathExpr, err := ParseJSONPathExpr(tt.path) - c.Assert(err, IsNil) + require.NoError(t, err) - base := mustParseBinaryFromString(c, tt.base) - expected := mustParseBinaryFromString(c, tt.expected) + base := mustParseBinaryFromString(t, tt.base) + expected := mustParseBinaryFromString(t, tt.expected) obtain, err := base.Remove([]PathExpression{pathExpr}) if tt.success { - c.Assert(err, IsNil) - c.Assert(obtain.String(), Equals, expected.String()) + require.NoError(t, err) + require.Equal(t, expected.String(), obtain.String()) } else { - c.Assert(err, NotNil) + require.Error(t, err) } } } -func (s *testJSONSuite) TestCompareBinary(c *C) { - jNull := mustParseBinaryFromString(c, `null`) - jBoolTrue := mustParseBinaryFromString(c, `true`) - jBoolFalse := mustParseBinaryFromString(c, `false`) +func TestCompareBinary(t *testing.T) { + jNull := mustParseBinaryFromString(t, `null`) + jBoolTrue := mustParseBinaryFromString(t, `true`) + jBoolFalse := mustParseBinaryFromString(t, `false`) jIntegerLarge := CreateBinary(uint64(1 << 63)) - jIntegerSmall := mustParseBinaryFromString(c, `3`) - jStringLarge := mustParseBinaryFromString(c, `"hello, world"`) - jStringSmall := mustParseBinaryFromString(c, `"hello"`) - jArrayLarge := mustParseBinaryFromString(c, `["a", "c"]`) - jArraySmall := mustParseBinaryFromString(c, `["a", "b"]`) - jObject := mustParseBinaryFromString(c, `{"a": "b"}`) + jIntegerSmall := mustParseBinaryFromString(t, `3`) + jStringLarge := mustParseBinaryFromString(t, `"hello, world"`) + jStringSmall := mustParseBinaryFromString(t, `"hello"`) + jArrayLarge := mustParseBinaryFromString(t, `["a", "c"]`) + jArraySmall := mustParseBinaryFromString(t, `["a", "b"]`) + jObject := mustParseBinaryFromString(t, `{"a": "b"}`) var tests = []struct { left BinaryJSON @@ -245,11 +242,11 @@ func (s *testJSONSuite) TestCompareBinary(c *C) { } for _, tt := range tests { cmp := CompareBinary(tt.left, tt.right) - c.Assert(cmp < 0, IsTrue) + require.True(t, cmp < 0) } } -func (s *testJSONSuite) TestBinaryJSONMerge(c *C) { +func TestBinaryJSONMerge(t *testing.T) { var tests = []struct { suffixes []string expected string @@ -269,17 +266,17 @@ func (s *testJSONSuite) TestBinaryJSONMerge(c *C) { for _, tt := range tests { suffixes := make([]BinaryJSON, 0, len(tt.suffixes)+1) for _, s := range tt.suffixes { - suffixes = append(suffixes, mustParseBinaryFromString(c, s)) + suffixes = append(suffixes, mustParseBinaryFromString(t, s)) } result := MergeBinary(suffixes) - cmp := CompareBinary(result, mustParseBinaryFromString(c, tt.expected)) - c.Assert(cmp, Equals, 0) + cmp := CompareBinary(result, mustParseBinaryFromString(t, tt.expected)) + require.Equal(t, 0, cmp) } } -func mustParseBinaryFromString(c *C, s string) BinaryJSON { +func mustParseBinaryFromString(t *testing.T, s string) BinaryJSON { bj, err := ParseBinaryFromString(s) - c.Assert(err, IsNil) + require.NoError(t, err) return bj } @@ -294,7 +291,7 @@ func BenchmarkBinaryMarshal(b *testing.B) { } } -func (s *testJSONSuite) TestBinaryJSONContains(c *C) { +func TestBinaryJSONContains(t *testing.T) { var tests = []struct { input string target string @@ -319,13 +316,13 @@ func (s *testJSONSuite) TestBinaryJSONContains(c *C) { } for _, tt := range tests { - obj := mustParseBinaryFromString(c, tt.input) - target := mustParseBinaryFromString(c, tt.target) - c.Assert(ContainsBinary(obj, target), Equals, tt.expected) + obj := mustParseBinaryFromString(t, tt.input) + target := mustParseBinaryFromString(t, tt.target) + require.Equal(t, tt.expected, ContainsBinary(obj, target)) } } -func (s *testJSONSuite) TestBinaryJSONDepth(c *C) { +func TestBinaryJSONDepth(t *testing.T) { var tests = []struct { input string expected int @@ -340,7 +337,7 @@ func (s *testJSONSuite) TestBinaryJSONDepth(c *C) { } for _, tt := range tests { - obj := mustParseBinaryFromString(c, tt.input) - c.Assert(obj.GetElemDepth(), Equals, tt.expected) + obj := mustParseBinaryFromString(t, tt.input) + require.Equal(t, tt.expected, obj.GetElemDepth()) } } diff --git a/parser/tidb-types/json/path_expr_test.go b/parser/tidb-types/json/path_expr_test.go index 4525b7fe..19a17fd4 100644 --- a/parser/tidb-types/json/path_expr_test.go +++ b/parser/tidb-types/json/path_expr_test.go @@ -14,10 +14,12 @@ package json import ( - . "github.com/pingcap/check" + "testing" + + "github.com/stretchr/testify/require" ) -func (s *testJSONSuite) TestContainsAnyAsterisk(c *C) { +func TestContainsAnyAsterisk(t *testing.T) { var tests = []struct { exprString string containsAsterisks bool @@ -29,12 +31,12 @@ func (s *testJSONSuite) TestContainsAnyAsterisk(c *C) { } for _, tt := range tests { pe, err := ParseJSONPathExpr(tt.exprString) - c.Assert(err, IsNil) - c.Assert(pe.flags.containsAnyAsterisk(), Equals, tt.containsAsterisks) + require.NoError(t, err) + require.Equal(t, tt.containsAsterisks, pe.flags.containsAnyAsterisk()) } } -func (s *testJSONSuite) TestValidatePathExpr(c *C) { +func TestValidatePathExpr(t *testing.T) { var tests = []struct { exprString string success bool @@ -55,10 +57,10 @@ func (s *testJSONSuite) TestValidatePathExpr(c *C) { for _, tt := range tests { pe, err := ParseJSONPathExpr(tt.exprString) if tt.success { - c.Assert(err, IsNil) - c.Assert(len(pe.legs), Equals, tt.legs) + require.NoError(t, err) + require.Len(t, pe.legs, tt.legs) } else { - c.Assert(err, NotNil) + require.Error(t, err) } } } diff --git a/parser/tidb-types/mydecimal.go b/parser/tidb-types/mydecimal.go index 34c84e85..4daf6d8b 100644 --- a/parser/tidb-types/mydecimal.go +++ b/parser/tidb-types/mydecimal.go @@ -145,10 +145,10 @@ func fixWordCntError(wordsInt, wordsFrac int) (newWordsInt int, newWordsFrac int } /* - countLeadingZeroes returns the number of leading zeroes that can be removed from fraction. +countLeadingZeroes returns the number of leading zeroes that can be removed from fraction. - @param i start index - @param word value to compare against list of powers of 10 +@param i start index +@param word value to compare against list of powers of 10 */ func countLeadingZeroes(i int, word int32) int { leading := 0 @@ -160,10 +160,10 @@ func countLeadingZeroes(i int, word int32) int { } /* - countTrailingZeros returns the number of trailing zeroes that can be removed from fraction. +countTrailingZeros returns the number of trailing zeroes that can be removed from fraction. - @param i start index - @param word value to compare against list of powers of 10 +@param i start index +@param word value to compare against list of powers of 10 */ func countTrailingZeroes(i int, word int32) int { trailing := 0 @@ -254,11 +254,10 @@ func (d *MyDecimal) removeTrailingZeros() (lastWordIdx int, digitsFrac int) { // ToString converts decimal to its printable string representation without rounding. // -// RETURN VALUE -// -// str - result string -// errCode - eDecOK/eDecTruncate/eDecOverflow +// RETURN VALUE // +// str - result string +// errCode - eDecOK/eDecTruncate/eDecOverflow func (d *MyDecimal) ToString() (str []byte) { str = make([]byte, d.stringSize()) digitsFrac := int(d.digitsFrac) @@ -475,10 +474,10 @@ func (d *MyDecimal) FromString(str []byte) error { // shift < 0 means right shift. In fact it is multiplying on 10^shift. // // RETURN -// eDecOK OK -// eDecOverflow operation lead to overflow, number is untoched -// eDecTruncated number was rounded to fit into buffer // +// eDecOK OK +// eDecOverflow operation lead to overflow, number is untoched +// eDecTruncated number was rounded to fit into buffer func (d *MyDecimal) Shift(shift int) error { var err error if shift == 0 { @@ -638,10 +637,10 @@ func (d *MyDecimal) Shift(shift int) error { } /* - digitBounds returns bounds of decimal digits in the number. +digitBounds returns bounds of decimal digits in the number. - start - index (from 0 ) of first decimal digits. - end - index of position just after last decimal digit. + start - index (from 0 ) of first decimal digits. + end - index of position just after last decimal digit. */ func (d *MyDecimal) digitBounds() (start, end int) { var i int @@ -687,14 +686,15 @@ func (d *MyDecimal) digitBounds() (start, end int) { } /* - doMiniLeftShift does left shift for alignment of data in buffer. +doMiniLeftShift does left shift for alignment of data in buffer. + + shift number of decimal digits on which it should be shifted + beg/end bounds of decimal digits (see digitsBounds()) - shift number of decimal digits on which it should be shifted - beg/end bounds of decimal digits (see digitsBounds()) +NOTE - NOTE - Result fitting in the buffer should be garanted. - 'shift' have to be from 1 to digitsPerWord-1 (inclusive) + Result fitting in the buffer should be garanted. + 'shift' have to be from 1 to digitsPerWord-1 (inclusive) */ func (d *MyDecimal) doMiniLeftShift(shift, beg, end int) { bufFrom := beg / digitsPerWord @@ -711,14 +711,15 @@ func (d *MyDecimal) doMiniLeftShift(shift, beg, end int) { } /* - doMiniRightShift does right shift for alignment of data in buffer. +doMiniRightShift does right shift for alignment of data in buffer. + + shift number of decimal digits on which it should be shifted + beg/end bounds of decimal digits (see digitsBounds()) - shift number of decimal digits on which it should be shifted - beg/end bounds of decimal digits (see digitsBounds()) +NOTE - NOTE - Result fitting in the buffer should be garanted. - 'shift' have to be from 1 to digitsPerWord-1 (inclusive) + Result fitting in the buffer should be garanted. + 'shift' have to be from 1 to digitsPerWord-1 (inclusive) */ func (d *MyDecimal) doMiniRightShift(shift, beg, end int) { bufFrom := (end - 1) / digitsPerWord @@ -736,18 +737,20 @@ func (d *MyDecimal) doMiniRightShift(shift, beg, end int) { // Round rounds the decimal to "frac" digits. // -// to - result buffer. d == to is allowed -// frac - to what position after fraction point to round. can be negative! -// roundMode - round to nearest even or truncate -// ModeHalfEven rounds normally. -// Truncate just truncates the decimal. +// to - result buffer. d == to is allowed +// frac - to what position after fraction point to round. can be negative! +// roundMode - round to nearest even or truncate +// ModeHalfEven rounds normally. +// Truncate just truncates the decimal. // // NOTES -// scale can be negative ! -// one TRUNCATED error (line XXX below) isn't treated very logical :( +// +// scale can be negative ! +// one TRUNCATED error (line XXX below) isn't treated very logical :( // // RETURN VALUE -// eDecOK/eDecTruncated +// +// eDecOK/eDecTruncated func (d *MyDecimal) Round(to *MyDecimal, frac int, roundMode RoundMode) (err error) { // wordsFracTo is the number of fraction words in buffer. wordsFracTo := (frac + 1) / digitsPerWord @@ -1047,78 +1050,78 @@ ToBin converts decimal to its binary fixed-length representation two representations of the same length can be compared with memcmp with the correct -1/0/+1 result - PARAMS - precision/frac - if precision is 0, internal value of the decimal will be used, - then the encoded value is not memory comparable. + PARAMS + precision/frac - if precision is 0, internal value of the decimal will be used, + then the encoded value is not memory comparable. - NOTE - the buffer is assumed to be of the size decimalBinSize(precision, frac) + NOTE + the buffer is assumed to be of the size decimalBinSize(precision, frac) - RETURN VALUE - bin - binary value - errCode - eDecOK/eDecTruncate/eDecOverflow + RETURN VALUE + bin - binary value + errCode - eDecOK/eDecTruncate/eDecOverflow - DESCRIPTION - for storage decimal numbers are converted to the "binary" format. + DESCRIPTION + for storage decimal numbers are converted to the "binary" format. - This format has the following properties: - 1. length of the binary representation depends on the {precision, frac} - as provided by the caller and NOT on the digitsInt/digitsFrac of the decimal to - convert. - 2. binary representations of the same {precision, frac} can be compared - with memcmp - with the same result as DecimalCompare() of the original - decimals (not taking into account possible precision loss during - conversion). + This format has the following properties: + 1. length of the binary representation depends on the {precision, frac} + as provided by the caller and NOT on the digitsInt/digitsFrac of the decimal to + convert. + 2. binary representations of the same {precision, frac} can be compared + with memcmp - with the same result as DecimalCompare() of the original + decimals (not taking into account possible precision loss during + conversion). - This binary format is as follows: - 1. First the number is converted to have a requested precision and frac. - 2. Every full digitsPerWord digits of digitsInt part are stored in 4 bytes - as is - 3. The first digitsInt % digitesPerWord digits are stored in the reduced - number of bytes (enough bytes to store this number of digits - - see dig2bytes) - 4. same for frac - full word are stored as is, - the last frac % digitsPerWord digits - in the reduced number of bytes. - 5. If the number is negative - every byte is inversed. - 5. The very first bit of the resulting byte array is inverted (because - memcmp compares unsigned bytes, see property 2 above) + This binary format is as follows: + 1. First the number is converted to have a requested precision and frac. + 2. Every full digitsPerWord digits of digitsInt part are stored in 4 bytes + as is + 3. The first digitsInt % digitesPerWord digits are stored in the reduced + number of bytes (enough bytes to store this number of digits - + see dig2bytes) + 4. same for frac - full word are stored as is, + the last frac % digitsPerWord digits - in the reduced number of bytes. + 5. If the number is negative - every byte is inversed. + 5. The very first bit of the resulting byte array is inverted (because + memcmp compares unsigned bytes, see property 2 above) - Example: + Example: - 1234567890.1234 + 1234567890.1234 - internally is represented as 3 words + internally is represented as 3 words - 1 234567890 123400000 + 1 234567890 123400000 - (assuming we want a binary representation with precision=14, frac=4) - in hex it's + (assuming we want a binary representation with precision=14, frac=4) + in hex it's - 00-00-00-01 0D-FB-38-D2 07-5A-EF-40 + 00-00-00-01 0D-FB-38-D2 07-5A-EF-40 - now, middle word is full - it stores 9 decimal digits. It goes - into binary representation as is: + now, middle word is full - it stores 9 decimal digits. It goes + into binary representation as is: - ........... 0D-FB-38-D2 ............ + ........... 0D-FB-38-D2 ............ - First word has only one decimal digit. We can store one digit in - one byte, no need to waste four: + First word has only one decimal digit. We can store one digit in + one byte, no need to waste four: - 01 0D-FB-38-D2 ............ + 01 0D-FB-38-D2 ............ - now, last word. It's 123400000. We can store 1234 in two bytes: + now, last word. It's 123400000. We can store 1234 in two bytes: - 01 0D-FB-38-D2 04-D2 + 01 0D-FB-38-D2 04-D2 - So, we've packed 12 bytes number in 7 bytes. - And now we invert the highest bit to get the final result: + So, we've packed 12 bytes number in 7 bytes. + And now we invert the highest bit to get the final result: - 81 0D FB 38 D2 04 D2 + 81 0D FB 38 D2 04 D2 - And for -1234567890.1234 it would be + And for -1234567890.1234 it would be - 7E F2 04 C7 2D FB 2D + 7E F2 04 C7 2D FB 2D */ func (d *MyDecimal) ToBin(precision, frac int) ([]byte, error) { if precision > digitsPerWord*maxWordBufLen || precision < 0 || frac > mysql.MaxDecimalScale || frac < 0 { @@ -1770,21 +1773,21 @@ func maxDecimal(precision, frac int, to *MyDecimal) { /* DecimalMul multiplies two decimals. - from1, from2 - factors - to - product + from1, from2 - factors + to - product - RETURN VALUE - E_DEC_OK/E_DEC_TRUNCATED/E_DEC_OVERFLOW; + RETURN VALUE + E_DEC_OK/E_DEC_TRUNCATED/E_DEC_OVERFLOW; - NOTES - in this implementation, with wordSize=4 we have digitsPerWord=9, - and 63-digit number will take only 7 words (basically a 7-digit - "base 999999999" number). Thus there's no need in fast multiplication - algorithms, 7-digit numbers can be multiplied with a naive O(n*n) - method. + NOTES + in this implementation, with wordSize=4 we have digitsPerWord=9, + and 63-digit number will take only 7 words (basically a 7-digit + "base 999999999" number). Thus there's no need in fast multiplication + algorithms, 7-digit numbers can be multiplied with a naive O(n*n) + method. - XXX if this library is to be used with huge numbers of thousands of - digits, fast multiplication must be implemented. + XXX if this library is to be used with huge numbers of thousands of + digits, fast multiplication must be implemented. */ func DecimalMul(from1, from2, to *MyDecimal) error { var ( @@ -1922,26 +1925,26 @@ func DecimalDiv(from1, from2, to *MyDecimal, fracIncr int) error { /* DecimalMod does modulus of two decimals. - from1 - dividend - from2 - divisor - to - modulus + from1 - dividend + from2 - divisor + to - modulus - RETURN VALUE - E_DEC_OK/E_DEC_TRUNCATED/E_DEC_OVERFLOW/E_DEC_DIV_ZERO; + RETURN VALUE + E_DEC_OK/E_DEC_TRUNCATED/E_DEC_OVERFLOW/E_DEC_DIV_ZERO; - NOTES - see do_div_mod() + NOTES + see do_div_mod() - DESCRIPTION - the modulus R in R = M mod N + DESCRIPTION + the modulus R in R = M mod N - is defined as + is defined as - 0 <= |R| < |M| - sign R == sign M - R = M - k*N, where k is integer + 0 <= |R| < |M| + sign R == sign M + R = M - k*N, where k is integer - thus, there's no requirement for M or N to be integers + thus, there's no requirement for M or N to be integers */ func DecimalMod(from1, from2, to *MyDecimal) error { to.resultFrac = myMaxInt8(from1.resultFrac, from2.resultFrac) diff --git a/parser/tidb-types/mydecimal_test.go b/parser/tidb-types/mydecimal_test.go index e7996922..c57706b0 100644 --- a/parser/tidb-types/mydecimal_test.go +++ b/parser/tidb-types/mydecimal_test.go @@ -17,15 +17,10 @@ import ( "strings" "testing" - . "github.com/pingcap/check" + "github.com/stretchr/testify/require" ) -var _ = Suite(&testMyDecimalSuite{}) - -type testMyDecimalSuite struct { -} - -func (s *testMyDecimalSuite) TestFromInt(c *C) { +func TestFromInt(t *testing.T) { tests := []struct { input int64 output string @@ -39,11 +34,11 @@ func (s *testMyDecimalSuite) TestFromInt(c *C) { for _, tt := range tests { dec := NewDecFromInt(tt.input) str := dec.ToString() - c.Check(string(str), Equals, tt.output) + require.Equal(t, tt.output, string(str)) } } -func (s *testMyDecimalSuite) TestFromUint(c *C) { +func TestFromUint(t *testing.T) { tests := []struct { input uint64 output string @@ -56,11 +51,11 @@ func (s *testMyDecimalSuite) TestFromUint(c *C) { var dec MyDecimal dec.FromUint(tt.input) str := dec.ToString() - c.Check(string(str), Equals, tt.output) + require.Equal(t, tt.output, string(str)) } } -func (s *testMyDecimalSuite) TestToInt(c *C) { +func TestToInt(t *testing.T) { tests := []struct { input string output int64 @@ -79,12 +74,12 @@ func (s *testMyDecimalSuite) TestToInt(c *C) { var dec MyDecimal dec.FromString([]byte(tt.input)) result, ec := dec.ToInt() - c.Check(ec, Equals, tt.err) - c.Check(result, Equals, tt.output) + require.Equal(t, tt.err, ec) + require.Equal(t, tt.output, result) } } -func (s *testMyDecimalSuite) TestToUint(c *C) { +func TestToUint(t *testing.T) { tests := []struct { input string output uint64 @@ -103,12 +98,12 @@ func (s *testMyDecimalSuite) TestToUint(c *C) { var dec MyDecimal dec.FromString([]byte(tt.input)) result, ec := dec.ToUint() - c.Check(ec, Equals, tt.err) - c.Check(result, Equals, tt.output) + require.Equal(t, tt.err, ec) + require.Equal(t, tt.output, result) } } -func (s *testMyDecimalSuite) TestFromFloat(c *C) { +func TestFromFloat(t *testing.T) { tests := []struct { s string f float64 @@ -122,11 +117,11 @@ func (s *testMyDecimalSuite) TestFromFloat(c *C) { for _, tt := range tests { dec := NewDecFromFloatForTest(tt.f) str := dec.ToString() - c.Check(string(str), Equals, tt.s) + require.Equal(t, tt.s, string(str)) } } -func (s *testMyDecimalSuite) TestToFloat(c *C) { +func TestToFloat(t *testing.T) { tests := []struct { s string f float64 @@ -141,12 +136,12 @@ func (s *testMyDecimalSuite) TestToFloat(c *C) { var dec MyDecimal dec.FromString([]byte(ca.s)) f, err := dec.ToFloat64() - c.Check(err, IsNil) - c.Check(f, Equals, ca.f) + require.NoError(t, err) + require.Equal(t, ca.f, f) } } -func (s *testMyDecimalSuite) TestToHashKey(c *C) { +func TestToHashKey(t *testing.T) { tests := []struct { numbers []string }{ @@ -164,14 +159,14 @@ func (s *testMyDecimalSuite) TestToHashKey(c *C) { keys := make([]string, 0, len(ca.numbers)) for _, num := range ca.numbers { var dec MyDecimal - c.Check(dec.FromString([]byte(num)), IsNil) + require.NoError(t, dec.FromString([]byte(num))) key, err := dec.ToHashKey() - c.Check(err, IsNil) + require.NoError(t, err) keys = append(keys, string(key)) } for i := 1; i < len(keys); i++ { - c.Check(keys[0], Equals, keys[i]) + require.Equal(t, keys[0], keys[i]) } } @@ -201,27 +196,27 @@ func (s *testMyDecimalSuite) TestToHashKey(c *C) { keys := make([]string, 0, len(ca.hashNumbers)+len(ca.binNumbers)) for _, num := range ca.hashNumbers { var dec MyDecimal - c.Check(dec.FromString([]byte(num)), IsNil) + require.NoError(t, dec.FromString([]byte(num))) key, err := dec.ToHashKey() - c.Check(err, IsNil) + require.NoError(t, err) keys = append(keys, string(key)) } for _, num := range ca.binNumbers { var dec MyDecimal - c.Check(dec.FromString([]byte(num)), IsNil) + require.NoError(t, dec.FromString([]byte(num))) prec, frac := dec.PrecisionAndFrac() // remove leading zeros but trailing zeros remain key, err := dec.ToBin(prec, frac) - c.Check(err, IsNil) + require.NoError(t, err) keys = append(keys, string(key)) } for i := 1; i < len(keys); i++ { - c.Check(keys[0], Equals, keys[i]) + require.Equal(t, keys[0], keys[i]) } } } -func (s *testMyDecimalSuite) TestRemoveTrailingZeros(c *C) { +func TestRemoveTrailingZeros(t *testing.T) { tests := []string{ "0", "0.0", ".0", ".00000000", "0.0000", "0000", "0000.0", "0000.000", "-0", "-0.0", "-.0", "-.00000000", "-0.0000", "-0000", "-0000.0", "-0000.000", @@ -232,8 +227,8 @@ func (s *testMyDecimalSuite) TestRemoveTrailingZeros(c *C) { } for _, ca := range tests { var dec MyDecimal - c.Check(dec.FromString([]byte(ca)), IsNil) - + err := dec.FromString([]byte(ca)) + require.NoError(t, err) // calculate the number of digits after point but trailing zero digitsFracExp := 0 str := string(dec.ToString()) @@ -250,27 +245,27 @@ func (s *testMyDecimalSuite) TestRemoveTrailingZeros(c *C) { } _, digitsFrac := dec.removeTrailingZeros() - c.Check(digitsFrac, Equals, digitsFracExp) + require.Equal(t, digitsFracExp, digitsFrac) } } -func (s *testMyDecimalSuite) TestShift(c *C) { +func TestShift(t *testing.T) { type tcase struct { input string shift int output string err error } - var dotest = func(c *C, tests []tcase) { + var dotest = func(tests []tcase) { for _, ca := range tests { var dec MyDecimal err := dec.FromString([]byte(ca.input)) - c.Check(err, IsNil) + require.NoError(t, err) origin := dec err = dec.Shift(ca.shift) - c.Check(err, Equals, ca.err) + require.Equal(t, ca.err, err) result := dec.ToString() - c.Check(string(result), Equals, ca.output, Commentf("origin:%s\ndec:%s", origin.String(), string(result))) + require.Equal(t, ca.output, string(result), "origin:%s\ndec:%s", origin.String(), string(result)) } } wordBufLen = maxWordBufLen @@ -311,7 +306,7 @@ func (s *testMyDecimalSuite) TestShift(c *C) { {"123987654321.123456789000", -14, "0.00123987654321123456789", nil}, {"00000087654321.123456789000", -14, "0.00000087654321123456789", nil}, } - dotest(c, tests) + dotest(tests) wordBufLen = 2 tests = []tcase{ {"123.123", -2, "1.23123", nil}, @@ -364,11 +359,11 @@ func (s *testMyDecimalSuite) TestShift(c *C) { {"123456789.987654321", 10, "123456789.987654321", ErrOverflow}, {"123456789.987654321", 0, "123456789.987654321", nil}, } - dotest(c, tests) + dotest(tests) wordBufLen = maxWordBufLen } -func (s *testMyDecimalSuite) TestRoundWithHalfEven(c *C) { +func TestRoundWithHalfEven(t *testing.T) { tests := []struct { input string scale int @@ -397,13 +392,13 @@ func (s *testMyDecimalSuite) TestRoundWithHalfEven(c *C) { dec.FromString([]byte(ca.input)) var rounded MyDecimal err := dec.Round(&rounded, ca.scale, ModeHalfEven) - c.Check(err, Equals, ca.err) + require.Equal(t, ca.err, err) result := rounded.ToString() - c.Check(string(result), Equals, ca.output) + require.Equal(t, ca.output, string(result)) } } -func (s *testMyDecimalSuite) TestRoundWithTruncate(c *C) { +func TestRoundWithTruncate(t *testing.T) { tests := []struct { input string scale int @@ -431,13 +426,13 @@ func (s *testMyDecimalSuite) TestRoundWithTruncate(c *C) { dec.FromString([]byte(ca.input)) var rounded MyDecimal err := dec.Round(&rounded, ca.scale, ModeTruncate) - c.Check(err, Equals, ca.err) + require.Equal(t, ca.err, err) result := rounded.ToString() - c.Check(string(result), Equals, ca.output) + require.Equal(t, ca.output, string(result)) } } -func (s *testMyDecimalSuite) TestRoundWithCeil(c *C) { +func TestRoundWithCeil(t *testing.T) { tests := []struct { input string scale int @@ -466,13 +461,13 @@ func (s *testMyDecimalSuite) TestRoundWithCeil(c *C) { dec.FromString([]byte(ca.input)) var rounded MyDecimal err := dec.Round(&rounded, ca.scale, modeCeiling) - c.Check(err, Equals, ca.err) + require.Equal(t, ca.err, err) result := rounded.ToString() - c.Check(string(result), Equals, ca.output) + require.Equal(t, ca.output, string(result)) } } -func (s *testMyDecimalSuite) TestFromString(c *C) { +func TestFromString(t *testing.T) { type tcase struct { input string output string @@ -503,9 +498,9 @@ func (s *testMyDecimalSuite) TestFromString(c *C) { for _, ca := range tests { var dec MyDecimal err := dec.FromString([]byte(ca.input)) - c.Check(err, Equals, ca.err, Commentf("input: %s", ca.input)) + require.Equal(t, ca.err, err) result := dec.ToString() - c.Check(string(result), Equals, ca.output, Commentf("dec:%s", dec.String())) + require.Equal(t, ca.output, string(result)) } wordBufLen = 1 tests = []tcase{ @@ -515,14 +510,14 @@ func (s *testMyDecimalSuite) TestFromString(c *C) { for _, ca := range tests { var dec MyDecimal err := dec.FromString([]byte(ca.input)) - c.Check(err, Equals, ca.err) + require.Equal(t, ca.err, err) result := dec.ToString() - c.Check(string(result), Equals, ca.output, Commentf("dec:%s", dec.String())) + require.Equal(t, ca.output, string(result)) } wordBufLen = maxWordBufLen } -func (s *testMyDecimalSuite) TestToString(c *C) { +func TestToString(t *testing.T) { type tcase struct { input string output string @@ -536,11 +531,11 @@ func (s *testMyDecimalSuite) TestToString(c *C) { var dec MyDecimal dec.FromString([]byte(ca.input)) result := dec.ToString() - c.Check(string(result), Equals, ca.output) + require.Equal(t, ca.output, string(result)) } } -func (s *testMyDecimalSuite) TestToBinFromBin(c *C) { +func TestToBinFromBin(t *testing.T) { type tcase struct { input string precision int @@ -568,14 +563,14 @@ func (s *testMyDecimalSuite) TestToBinFromBin(c *C) { for _, ca := range tests { var dec MyDecimal err := dec.FromString([]byte(ca.input)) - c.Assert(err, IsNil) + require.NoError(t, err) buf, err := dec.ToBin(ca.precision, ca.frac) - c.Assert(err, Equals, ca.err, Commentf(ca.input)) + require.Equal(t, ca.err, err) var dec2 MyDecimal _, err = dec2.FromBin(buf, ca.precision, ca.frac) - c.Assert(err, IsNil) + require.NoError(t, err) str := dec2.ToString() - c.Assert(string(str), Equals, ca.output) + require.Equal(t, ca.output, string(str)) } var dec MyDecimal dec.FromInt(1) @@ -590,11 +585,11 @@ func (s *testMyDecimalSuite) TestToBinFromBin(c *C) { } for _, tt := range errTests { _, err := dec.ToBin(tt.prec, tt.frac) - c.Assert(ErrBadNumber.Equal(err), IsTrue) + require.True(t, ErrBadNumber.Equal(err)) } } -func (s *testMyDecimalSuite) TestCompare(c *C) { +func TestCompareMyDecimal(t *testing.T) { type tcase struct { a string b string @@ -617,11 +612,11 @@ func (s *testMyDecimalSuite) TestCompare(c *C) { var a, b MyDecimal a.FromString([]byte(tt.a)) b.FromString([]byte(tt.b)) - c.Assert(a.Compare(&b), Equals, tt.cmp) + require.Equal(t, tt.cmp, a.Compare(&b)) } } -func (s *testMyDecimalSuite) TestMaxDecimal(c *C) { +func TestMaxDecimal(t *testing.T) { type tcase struct { prec int frac int @@ -648,11 +643,11 @@ func (s *testMyDecimalSuite) TestMaxDecimal(c *C) { var dec MyDecimal maxDecimal(tt.prec, tt.frac, &dec) str := dec.ToString() - c.Assert(string(str), Equals, tt.result) + require.Equal(t, tt.result, string(str)) } } -func (s *testMyDecimalSuite) TestNeg(c *C) { +func TestNeg(t *testing.T) { type testCase struct { a string result string @@ -667,11 +662,11 @@ func (s *testMyDecimalSuite) TestNeg(c *C) { a := NewDecFromStringForTest(tt.a) negResult := DecimalNeg(a) result := negResult.ToString() - c.Assert(string(result), Equals, tt.result) + require.Equal(t, tt.result, string(result)) } } -func (s *testMyDecimalSuite) TestAdd(c *C) { +func TestAddMyDecimal(t *testing.T) { type testCase struct { a string b string @@ -700,13 +695,13 @@ func (s *testMyDecimalSuite) TestAdd(c *C) { b := NewDecFromStringForTest(tt.b) var sum MyDecimal err := DecimalAdd(a, b, &sum) - c.Assert(err, Equals, tt.err) + require.Equal(t, tt.err, err) result := sum.ToString() - c.Assert(string(result), Equals, tt.result) + require.Equal(t, tt.result, string(result)) } } -func (s *testMyDecimalSuite) TestSub(c *C) { +func TestSubMyDecimal(t *testing.T) { type tcase struct { a string b string @@ -734,13 +729,14 @@ func (s *testMyDecimalSuite) TestSub(c *C) { a.FromString([]byte(tt.a)) b.FromString([]byte(tt.b)) err := DecimalSub(&a, &b, &sum) - c.Assert(err, Equals, tt.err) + require.Equal(t, tt.err, err) result := sum.ToString() - c.Assert(string(result), Equals, tt.result) + require.Equal(t, tt.result, string(result)) + } } -func (s *testMyDecimalSuite) TestMul(c *C) { +func TestMulMyDecimal(t *testing.T) { type tcase struct { a string b string @@ -765,13 +761,13 @@ func (s *testMyDecimalSuite) TestMul(c *C) { a.FromString([]byte(tt.a)) b.FromString([]byte(tt.b)) err := DecimalMul(&a, &b, &product) - c.Check(err, Equals, tt.err) + require.Equal(t, tt.err, err) result := product.String() - c.Assert(result, Equals, tt.result) + require.Equal(t, tt.result, string(result)) } } -func (s *testMyDecimalSuite) TestDivMod(c *C) { +func TestDivMod(t *testing.T) { type tcase struct { a string b string @@ -800,12 +796,13 @@ func (s *testMyDecimalSuite) TestDivMod(c *C) { a.FromString([]byte(tt.a)) b.FromString([]byte(tt.b)) err := doDivMod(&a, &b, &to, nil, 5) - c.Check(err, Equals, tt.err) + require.Equal(t, tt.err, err) if tt.err == ErrDivByZero { continue } result := to.ToString() - c.Assert(string(result), Equals, tt.result) + require.Equal(t, tt.result, string(result)) + } tests = []tcase{ @@ -822,12 +819,12 @@ func (s *testMyDecimalSuite) TestDivMod(c *C) { a.FromString([]byte(tt.a)) b.FromString([]byte(tt.b)) ec := doDivMod(&a, &b, nil, &to, 0) - c.Check(ec, Equals, tt.err) + require.Equal(t, tt.err, ec) if tt.err == ErrDivByZero { continue } result := to.ToString() - c.Assert(string(result), Equals, tt.result) + require.Equal(t, tt.result, string(result)) } tests = []tcase{ @@ -842,11 +839,11 @@ func (s *testMyDecimalSuite) TestDivMod(c *C) { a.FromString([]byte(tt.a)) b.FromString([]byte(tt.b)) ec := DecimalDiv(&a, &b, &to, DivFracIncr) - c.Check(ec, Equals, tt.err) + require.Equal(t, tt.err, ec) if tt.err == ErrDivByZero { continue } - c.Assert(to.String(), Equals, tt.result) + require.Equal(t, tt.result, to.String()) } tests = []tcase{ @@ -860,15 +857,15 @@ func (s *testMyDecimalSuite) TestDivMod(c *C) { a.FromString([]byte(tt.a)) b.FromString([]byte(tt.b)) ec := DecimalMod(&a, &b, &to) - c.Check(ec, Equals, tt.err) + require.Equal(t, tt.err, ec) if tt.err == ErrDivByZero { continue } - c.Assert(to.String(), Equals, tt.result) + require.Equal(t, tt.result, to.String()) } } -func (s *testMyDecimalSuite) TestMaxOrMin(c *C) { +func TestMaxOrMin(t *testing.T) { type tcase struct { neg bool prec int @@ -884,7 +881,7 @@ func (s *testMyDecimalSuite) TestMaxOrMin(c *C) { } for _, tt := range tests { dec := NewMaxOrMinDec(tt.neg, tt.prec, tt.frac) - c.Assert(dec.String(), Equals, tt.result) + require.Equal(t, tt.result, dec.String()) } } diff --git a/parser/tidb-types/mytime_test.go b/parser/tidb-types/mytime_test.go index 8d9d8d01..32757c0b 100644 --- a/parser/tidb-types/mytime_test.go +++ b/parser/tidb-types/mytime_test.go @@ -14,24 +14,22 @@ package types import ( - . "github.com/pingcap/check" -) - -type testMyTimeSuite struct{} + "testing" -var _ = Suite(&testMyTimeSuite{}) + "github.com/stretchr/testify/require" +) -func (s *testMyTimeSuite) TestWeekBehaviour(c *C) { - c.Assert(weekBehaviourMondayFirst, Equals, weekBehaviour(1)) - c.Assert(weekBehaviourYear, Equals, weekBehaviour(2)) - c.Assert(weekBehaviourFirstWeekday, Equals, weekBehaviour(4)) +func TestWeekBehaviour(t *testing.T) { + require.Equal(t, weekBehaviour(1), weekBehaviourMondayFirst) + require.Equal(t, weekBehaviour(2), weekBehaviourYear) + require.Equal(t, weekBehaviour(4), weekBehaviourFirstWeekday) - c.Check(weekBehaviour(1).test(weekBehaviourMondayFirst), IsTrue) - c.Check(weekBehaviour(2).test(weekBehaviourYear), IsTrue) - c.Check(weekBehaviour(4).test(weekBehaviourFirstWeekday), IsTrue) + require.True(t, weekBehaviour(1).test(weekBehaviourMondayFirst)) + require.True(t, weekBehaviour(2).test(weekBehaviourYear)) + require.True(t, weekBehaviour(4).test(weekBehaviourFirstWeekday)) } -func (s *testMyTimeSuite) TestWeek(c *C) { +func TestWeek(t *testing.T) { tests := []struct { Input MysqlTime Mode int @@ -42,22 +40,22 @@ func (s *testMyTimeSuite) TestWeek(c *C) { {MysqlTime{2008, 12, 31, 0, 0, 0, 0}, 1, 53}, } - for ith, tt := range tests { + for _, tt := range tests { _, week := calcWeek(&tt.Input, weekMode(tt.Mode)) - c.Check(week, Equals, tt.Expect, Commentf("%d failed.", ith)) + require.Equal(t, tt.Expect, week) } } -func (s *testMyTimeSuite) TestCalcDaynr(c *C) { - c.Assert(calcDaynr(0, 0, 0), Equals, 0) - c.Assert(calcDaynr(9999, 12, 31), Equals, 3652424) - c.Assert(calcDaynr(1970, 1, 1), Equals, 719528) - c.Assert(calcDaynr(2006, 12, 16), Equals, 733026) - c.Assert(calcDaynr(10, 1, 2), Equals, 3654) - c.Assert(calcDaynr(2008, 2, 20), Equals, 733457) +func TestCalcDaynr(t *testing.T) { + require.Equal(t, 0, calcDaynr(0, 0, 0)) + require.Equal(t, 3652424, calcDaynr(9999, 12, 31)) + require.Equal(t, 719528, calcDaynr(1970, 1, 1)) + require.Equal(t, 733026, calcDaynr(2006, 12, 16)) + require.Equal(t, 3654, calcDaynr(10, 1, 2)) + require.Equal(t, 733457, calcDaynr(2008, 2, 20)) } -func (s *testMyTimeSuite) TestCalcTimeDiff(c *C) { +func TestCalcTimeDiff(t *testing.T) { tests := []struct { T1 MysqlTime T2 MysqlTime @@ -89,11 +87,11 @@ func (s *testMyTimeSuite) TestCalcTimeDiff(c *C) { seconds, microseconds, _ := calcTimeDiff(tt.T1, tt.T2, tt.Sign) var result MysqlTime calcTimeFromSec(&result, seconds, microseconds) - c.Assert(result, Equals, tt.Expect, Commentf("%d failed.", i)) + require.Equal(t, tt.Expect, result, i) } } -func (s *testMyTimeSuite) TestCompareTime(c *C) { +func TestCompareTime(t *testing.T) { tests := []struct { T1 MysqlTime T2 MysqlTime @@ -106,13 +104,13 @@ func (s *testMyTimeSuite) TestCompareTime(c *C) { {MysqlTime{9999, 12, 30, 23, 59, 59, 999999}, MysqlTime{0, 1, 2, 3, 4, 5, 6}, 1}, } - for _, tt := range tests { - c.Assert(compareTime(tt.T1, tt.T2), Equals, tt.Expect) - c.Assert(compareTime(tt.T2, tt.T1), Equals, -tt.Expect) + for i, tt := range tests { + require.Equal(t, tt.Expect, compareTime(tt.T1, tt.T2), i) + require.Equal(t, -tt.Expect, compareTime(tt.T2, tt.T1), i) } } -func (s *testMyTimeSuite) TestGetDateFromDaynr(c *C) { +func TestGetDateFromDaynr(t *testing.T) { tests := []struct { daynr uint year uint @@ -135,13 +133,13 @@ func (s *testMyTimeSuite) TestGetDateFromDaynr(c *C) { for _, tt := range tests { yy, mm, dd := getDateFromDaynr(tt.daynr) - c.Assert(yy, Equals, tt.year) - c.Assert(mm, Equals, tt.month) - c.Assert(dd, Equals, tt.day) + require.Equal(t, tt.year, yy) + require.Equal(t, tt.month, mm) + require.Equal(t, tt.day, dd) } } -func (s *testMyTimeSuite) TestMixDateAndTime(c *C) { +func TestMixDateAndTime(t *testing.T) { tests := []struct { date MysqlTime time MysqlTime @@ -180,13 +178,13 @@ func (s *testMyTimeSuite) TestMixDateAndTime(c *C) { }, } - for ith, t := range tests { - mixDateAndTime(&t.date, &t.time, t.neg) - c.Assert(compareTime(t.date, t.expect), Equals, 0, Commentf("%d", ith)) + for _, tt := range tests { + mixDateAndTime(&tt.date, &tt.time, tt.neg) + require.Equal(t, 0, compareTime(tt.date, tt.expect)) } } -func (s *testMyTimeSuite) TestIsLeapYear(c *C) { +func TestIsLeapYear(t *testing.T) { tests := []struct { T MysqlTime Expect bool @@ -207,10 +205,10 @@ func (s *testMyTimeSuite) TestIsLeapYear(c *C) { } for _, tt := range tests { - c.Assert(tt.T.IsLeapYear(), Equals, tt.Expect) + require.Equal(t, tt.Expect, tt.T.IsLeapYear()) } } -func (s *testMyTimeSuite) TestGetLastDay(c *C) { +func TestGetLastDay(t *testing.T) { tests := []struct { year int month int @@ -223,8 +221,8 @@ func (s *testMyTimeSuite) TestGetLastDay(c *C) { {1996, 2, 29}, } - for _, t := range tests { - day := GetLastDay(t.year, t.month) - c.Assert(day, Equals, t.expectedDay) + for _, tt := range tests { + day := GetLastDay(tt.year, tt.month) + require.Equal(t, tt.expectedDay, day) } } diff --git a/parser/tidb-types/overflow_test.go b/parser/tidb-types/overflow_test.go index ddb696f6..9341e280 100644 --- a/parser/tidb-types/overflow_test.go +++ b/parser/tidb-types/overflow_test.go @@ -15,19 +15,15 @@ package types import ( "math" + "testing" - . "github.com/pingcap/check" + "github.com/stretchr/testify/require" "github.com/XiaoMi/Gaea/util/testleak" ) -var _ = Suite(&testOverflowSuite{}) - -type testOverflowSuite struct { -} - -func (s *testOverflowSuite) TestAdd(c *C) { - defer testleak.AfterTest(c)() +func TestAdd(t *testing.T) { + defer testleak.AfterTestT(t)() tblUint64 := []struct { lsh uint64 rsh uint64 @@ -39,12 +35,12 @@ func (s *testOverflowSuite) TestAdd(c *C) { {1, 1, 2, false}, } - for _, t := range tblUint64 { - ret, err := AddUint64(t.lsh, t.rsh) - if t.overflow { - c.Assert(err, NotNil) + for _, tt := range tblUint64 { + ret, err := AddUint64(tt.lsh, tt.rsh) + if tt.overflow { + require.Error(t, err) } else { - c.Assert(ret, Equals, t.ret) + require.Equal(t, tt.ret, ret) } } @@ -63,12 +59,12 @@ func (s *testOverflowSuite) TestAdd(c *C) { {1, -1, 0, false}, } - for _, t := range tblInt64 { - ret, err := AddInt64(t.lsh, t.rsh) - if t.overflow { - c.Assert(err, NotNil) + for _, tt := range tblInt64 { + ret, err := AddInt64(tt.lsh, tt.rsh) + if tt.overflow { + require.Error(t, err) } else { - c.Assert(ret, Equals, t.ret) + require.Equal(t, tt.ret, ret) } } @@ -86,18 +82,18 @@ func (s *testOverflowSuite) TestAdd(c *C) { {1, 1, 2, false}, } - for _, t := range tblInt { - ret, err := AddInteger(t.lsh, t.rsh) - if t.overflow { - c.Assert(err, NotNil) + for _, tt := range tblInt { + ret, err := AddInteger(tt.lsh, tt.rsh) + if tt.overflow { + require.Error(t, err) } else { - c.Assert(ret, Equals, t.ret) + require.Equal(t, tt.ret, ret) } } } -func (s *testOverflowSuite) TestSub(c *C) { - defer testleak.AfterTest(c)() +func TestSub(t *testing.T) { + defer testleak.AfterTestT(t)() tblUint64 := []struct { lsh uint64 rsh uint64 @@ -112,12 +108,12 @@ func (s *testOverflowSuite) TestSub(c *C) { {1, 1, 0, false}, } - for _, t := range tblUint64 { - ret, err := SubUint64(t.lsh, t.rsh) - if t.overflow { - c.Assert(err, NotNil) + for _, tt := range tblUint64 { + ret, err := SubUint64(tt.lsh, tt.rsh) + if tt.overflow { + require.Error(t, err) } else { - c.Assert(ret, Equals, t.ret) + require.Equal(t, tt.ret, ret) } } @@ -138,12 +134,12 @@ func (s *testOverflowSuite) TestSub(c *C) { {1, 1, 0, false}, } - for _, t := range tblInt64 { - ret, err := SubInt64(t.lsh, t.rsh) - if t.overflow { - c.Assert(err, NotNil) + for _, tt := range tblInt64 { + ret, err := SubInt64(tt.lsh, tt.rsh) + if tt.overflow { + require.Error(t, err) } else { - c.Assert(ret, Equals, t.ret) + require.Equal(t, tt.ret, ret) } } @@ -162,12 +158,12 @@ func (s *testOverflowSuite) TestSub(c *C) { {1, 1, 0, false}, } - for _, t := range tblInt { - ret, err := SubUintWithInt(t.lsh, t.rsh) - if t.overflow { - c.Assert(err, NotNil) + for _, tt := range tblInt { + ret, err := SubUintWithInt(tt.lsh, tt.rsh) + if tt.overflow { + require.Error(t, err) } else { - c.Assert(ret, Equals, t.ret) + require.Equal(t, tt.ret, ret) } } @@ -185,18 +181,18 @@ func (s *testOverflowSuite) TestSub(c *C) { {1, 1, 0, false}, } - for _, t := range tblInt2 { - ret, err := SubIntWithUint(t.lsh, t.rsh) - if t.overflow { - c.Assert(err, NotNil) + for _, tt := range tblInt2 { + ret, err := SubIntWithUint(tt.lsh, tt.rsh) + if tt.overflow { + require.Error(t, err) } else { - c.Assert(ret, Equals, t.ret) + require.Equal(t, tt.ret, ret) } } } -func (s *testOverflowSuite) TestMul(c *C) { - defer testleak.AfterTest(c)() +func TestMul(t *testing.T) { + defer testleak.AfterTestT(t)() tblUint64 := []struct { lsh uint64 rsh uint64 @@ -209,12 +205,12 @@ func (s *testOverflowSuite) TestMul(c *C) { {1, 1, 1, false}, } - for _, t := range tblUint64 { - ret, err := MulUint64(t.lsh, t.rsh) - if t.overflow { - c.Assert(err, NotNil) + for _, tt := range tblUint64 { + ret, err := MulUint64(tt.lsh, tt.rsh) + if tt.overflow { + require.Error(t, err) } else { - c.Assert(ret, Equals, t.ret) + require.Equal(t, tt.ret, ret) } } @@ -236,12 +232,12 @@ func (s *testOverflowSuite) TestMul(c *C) { {1, 1, 1, false}, } - for _, t := range tblInt64 { - ret, err := MulInt64(t.lsh, t.rsh) - if t.overflow { - c.Assert(err, NotNil) + for _, tt := range tblInt64 { + ret, err := MulInt64(tt.lsh, tt.rsh) + if tt.overflow { + require.Error(t, err) } else { - c.Assert(ret, Equals, t.ret) + require.Equal(t, tt.ret, ret) } } @@ -259,18 +255,18 @@ func (s *testOverflowSuite) TestMul(c *C) { {1, 1, 1, false}, } - for _, t := range tblInt { - ret, err := MulInteger(t.lsh, t.rsh) - if t.overflow { - c.Assert(err, NotNil) + for _, tt := range tblInt { + ret, err := MulInteger(tt.lsh, tt.rsh) + if tt.overflow { + require.Error(t, err) } else { - c.Assert(ret, Equals, t.ret) + require.Equal(t, tt.ret, ret) } } } -func (s *testOverflowSuite) TestDiv(c *C) { - defer testleak.AfterTest(c)() +func TestDiv(t *testing.T) { + defer testleak.AfterTestT(t)() tblInt64 := []struct { lsh int64 rsh int64 @@ -287,12 +283,12 @@ func (s *testOverflowSuite) TestDiv(c *C) { {math.MinInt64, 2, math.MinInt64 / 2, false}, } - for _, t := range tblInt64 { - ret, err := DivInt64(t.lsh, t.rsh) - if t.overflow { - c.Assert(err, NotNil) + for _, tt := range tblInt64 { + ret, err := DivInt64(tt.lsh, tt.rsh) + if tt.overflow { + require.Error(t, err) } else { - c.Assert(ret, Equals, t.ret) + require.Equal(t, tt.ret, ret) } } @@ -308,12 +304,12 @@ func (s *testOverflowSuite) TestDiv(c *C) { {math.MaxInt64, -1, 0, true}, } - for _, t := range tblInt { - ret, err := DivUintWithInt(t.lsh, t.rsh) - if t.overflow { - c.Assert(err, NotNil) + for _, tt := range tblInt { + ret, err := DivUintWithInt(tt.lsh, tt.rsh) + if tt.overflow { + require.Error(t, err) } else { - c.Assert(ret, Equals, t.ret) + require.Equal(t, tt.ret, ret) } } @@ -328,12 +324,12 @@ func (s *testOverflowSuite) TestDiv(c *C) { {-1, math.MaxInt64, 0, false}, } - for _, t := range tblInt2 { - ret, err := DivIntWithUint(t.lsh, t.rsh) - if t.overflow { - c.Assert(err, NotNil) + for _, tt := range tblInt2 { + ret, err := DivIntWithUint(tt.lsh, tt.rsh) + if tt.overflow { + require.Error(t, err) } else { - c.Assert(ret, Equals, t.ret) + require.Equal(t, tt.ret, ret) } } } diff --git a/parser/tidb-types/parser_driver/value_expr_test.go b/parser/tidb-types/parser_driver/value_expr_test.go index daea09c1..9be0c834 100644 --- a/parser/tidb-types/parser_driver/value_expr_test.go +++ b/parser/tidb-types/parser_driver/value_expr_test.go @@ -17,22 +17,13 @@ import ( "strings" "testing" - . "github.com/pingcap/check" + "github.com/stretchr/testify/require" "github.com/XiaoMi/Gaea/parser/format" - "github.com/XiaoMi/Gaea/parser/tidb-types" + types "github.com/XiaoMi/Gaea/parser/tidb-types" ) -var _ = Suite(&testValueExprRestoreSuite{}) - -func TestT(t *testing.T) { - TestingT(t) -} - -type testValueExprRestoreSuite struct { -} - -func (s *testValueExprRestoreSuite) TestValueExprRestore(c *C) { +func TestValueExprRestore(t *testing.T) { testCases := []struct { datum types.Datum expect string @@ -54,7 +45,7 @@ func (s *testValueExprRestoreSuite) TestValueExprRestore(c *C) { sb.Reset() expr := &ValueExpr{Datum: testCase.datum} err := expr.Restore(format.NewRestoreCtx(format.DefaultRestoreFlags, &sb)) - c.Assert(err, IsNil) - c.Assert(sb.String(), Equals, testCase.expect, Commentf("Datum: %#v", testCase.datum)) + require.NoError(t, err) + require.Equal(t, testCase.expect, sb.String()) } } diff --git a/parser/tidb-types/set_test.go b/parser/tidb-types/set_test.go index 076c0c8a..5212d5be 100644 --- a/parser/tidb-types/set_test.go +++ b/parser/tidb-types/set_test.go @@ -14,18 +14,15 @@ package types import ( - . "github.com/pingcap/check" + "testing" + + "github.com/stretchr/testify/require" "github.com/XiaoMi/Gaea/util/testleak" ) -var _ = Suite(&testSetSuite{}) - -type testSetSuite struct { -} - -func (s *testSetSuite) TestSet(c *C) { - defer testleak.AfterTest(c)() +func TestSet(t *testing.T) { + defer testleak.AfterTestT(t)() elems := []string{"a", "b", "c", "d"} tbl := []struct { Name string @@ -41,11 +38,11 @@ func (s *testSetSuite) TestSet(c *C) { {"0", 0, ""}, } - for _, t := range tbl { - e, err := ParseSetName(elems, t.Name) - c.Assert(err, IsNil) - c.Assert(e.ToNumber(), Equals, float64(t.ExpectedValue)) - c.Assert(e.String(), Equals, t.ExpectedName) + for _, tt := range tbl { + e, err := ParseSetName(elems, tt.Name) + require.NoError(t, err) + require.Equal(t, float64(tt.ExpectedValue), e.ToNumber()) + require.Equal(t, tt.ExpectedName, e.String()) } tblNumber := []struct { @@ -58,27 +55,27 @@ func (s *testSetSuite) TestSet(c *C) { {9, "a,d"}, } - for _, t := range tblNumber { - e, err := ParseSetValue(elems, t.Number) - c.Assert(err, IsNil) - c.Assert(e.String(), Equals, t.ExpectedName) - c.Assert(e.ToNumber(), Equals, float64(t.Number)) + for _, tt := range tblNumber { + e, err := ParseSetValue(elems, tt.Number) + require.NoError(t, err) + require.Equal(t, tt.ExpectedName, e.String()) + require.Equal(t, float64(tt.Number), e.ToNumber()) } tblErr := []string{ "a.e", "e.f", } - for _, t := range tblErr { - _, err := ParseSetName(elems, t) - c.Assert(err, NotNil) + for _, tt := range tblErr { + _, err := ParseSetName(elems, tt) + require.Error(t, err) } tblNumberErr := []uint64{ 100, 16, 64, } - for _, t := range tblNumberErr { - _, err := ParseSetValue(elems, t) - c.Assert(err, NotNil) + for _, tt := range tblNumberErr { + _, err := ParseSetValue(elems, tt) + require.Error(t, err) } } diff --git a/parser/tidb-types/time.go b/parser/tidb-types/time.go index 8243d10b..2b9b40eb 100644 --- a/parser/tidb-types/time.go +++ b/parser/tidb-types/time.go @@ -314,8 +314,10 @@ func (t Time) Compare(o Time) int { // compareTime compare two MysqlTime. // return: -// 0: if a == b -// 1: if a > b +// +// 0: if a == b +// 1: if a > b +// // -1: if a < b func compareTime(a, b MysqlTime) int { ta := datetimeToUint64(a) @@ -421,18 +423,17 @@ func RoundFrac(t gotime.Time, fsp int) (gotime.Time, error) { // ToPackedUint encodes Time to a packed uint64 value. // -// 1 bit 0 -// 17 bits year*13+month (year 0-9999, month 0-12) -// 5 bits day (0-31) -// 5 bits hour (0-23) -// 6 bits minute (0-59) -// 6 bits second (0-59) -// 24 bits microseconds (0-999999) -// -// Total: 64 bits = 8 bytes +// 1 bit 0 +// 17 bits year*13+month (year 0-9999, month 0-12) +// 5 bits day (0-31) +// 5 bits hour (0-23) +// 6 bits minute (0-59) +// 6 bits second (0-59) +// 24 bits microseconds (0-999999) // -// 0YYYYYYY.YYYYYYYY.YYdddddh.hhhhmmmm.mmssssss.ffffffff.ffffffff.ffffffff +// Total: 64 bits = 8 bytes // +// 0YYYYYYY.YYYYYYYY.YYdddddh.hhhhmmmm.mmssssss.ffffffff.ffffffff.ffffffff func (t Time) ToPackedUint() (uint64, error) { tm := t.Time if t.IsZero() { @@ -812,7 +813,7 @@ type Duration struct { Fsp int } -//Add adds d to d, returns a duration value. +// Add adds d to d, returns a duration value. func (d Duration) Add(v Duration) (Duration, error) { if &v == nil { return d, nil @@ -2520,7 +2521,7 @@ func monthNumeric(t *MysqlTime, input string, ctx map[string]int) (string, bool) return input[length:], true } -// dayOfMonthWithSuffix returns different suffix according t being which day. i.e. 0 return th. 1 return st. +// dayOfMonthWithSuffix returns different suffix according t being which day. i.e. 0 return th. 1 return st. func dayOfMonthWithSuffix(t *MysqlTime, input string, ctx map[string]int) (string, bool) { month, remain := parseOrdinalNumbers(input) if month >= 0 { diff --git a/parser/types/etc.go b/parser/types/etc.go index d7e35925..3b8f6810 100644 --- a/parser/types/etc.go +++ b/parser/types/etc.go @@ -79,6 +79,7 @@ func TypeStr(tp byte) (r string) { // It is used for converting Text to Blob, // or converting Char to Binary. // Args: +// // tp: type enum // cs: charset func TypeToStr(tp byte, cs string) (r string) { diff --git a/parser/yy_parser.go b/parser/yy_parser.go index 03960526..36e639ee 100644 --- a/parser/yy_parser.go +++ b/parser/yy_parser.go @@ -88,7 +88,7 @@ func New() *Parser { } return &Parser{ - cache: make([]yySymType, 200), + cache: make([]yySymType, 10), } } diff --git a/proxy/plan/merge_result.go b/proxy/plan/merge_result.go index 46eef736..31ae160a 100644 --- a/proxy/plan/merge_result.go +++ b/proxy/plan/merge_result.go @@ -16,6 +16,7 @@ package plan import ( "fmt" + "github.com/shopspring/decimal" "strconv" "strings" @@ -92,6 +93,27 @@ func (r ResultRow) GetFloat(column int) (float64, error) { } } +// GetDecimal get decimal value from column +func (r ResultRow) GetDecimal(column int) (decimal.Decimal, error) { + d := r[column] + switch v := d.(type) { + case float64: + return decimal.NewFromFloat(v), nil + case uint64: + return decimal.NewFromString(strconv.FormatUint(v, 10)) + case int64: + return decimal.NewFromInt(v), nil + case string: + return decimal.NewFromString(v) + case []byte: + return decimal.NewFromString(string(v)) + case nil: + return decimal.NewFromInt(0), nil + default: + return decimal.NewFromInt(0), fmt.Errorf("data type is %T", v) + } +} + // SetValue set value to column func (r ResultRow) SetValue(column int, value interface{}) { r[column] = value @@ -110,12 +132,14 @@ type AggregateFuncMerger interface { type aggregateFuncBaseMerger struct { fieldIndex int // 所在列位置 + distinct bool + extra string } // CreateAggregateFunctionMerger create AggregateFunctionMerger by function type // currently support: "count", "sum", "max", "min" -func CreateAggregateFunctionMerger(funcType string, fieldIndex int) (AggregateFuncMerger, error) { - switch strings.ToLower(funcType) { +func CreateAggregateFunctionMerger(aggregateFunc *ast.AggregateFuncExpr, fieldIndex int) (AggregateFuncMerger, error) { + switch strings.ToLower(aggregateFunc.F) { case "count": ret := new(AggregateFuncCountMerger) ret.fieldIndex = fieldIndex @@ -132,8 +156,13 @@ func CreateAggregateFunctionMerger(funcType string, fieldIndex int) (AggregateFu ret := new(AggregateFuncMinMerger) ret.fieldIndex = fieldIndex return ret, nil + case "group_concat": + ret := new(AggregateFuncGroupConcatMerger) + ret.fieldIndex = fieldIndex + ret.distinct = aggregateFunc.Distinct + return ret, nil default: - return nil, fmt.Errorf("aggregate function type is not support: %s", funcType) + return nil, fmt.Errorf("aggregate function type is not support: %s", aggregateFunc.F) } } @@ -186,7 +215,7 @@ func (a *AggregateFuncSumMerger) MergeTo(from, to ResultRow) error { case uint64: return a.sumToUint64(from, to) case float64, string, []byte, nil: - return a.sumToFloat64(from, to) + return a.sumToDecimal(from, to) default: fromValue := from.GetValue(idx) toValue := to.GetValue(idx) @@ -236,6 +265,23 @@ func (a *AggregateFuncSumMerger) sumToFloat64(from, to ResultRow) error { return nil } +// sumToDecimal turn float to decimal to aggregate func sum +func (a *AggregateFuncSumMerger) sumToDecimal(from, to ResultRow) error { + idx := a.fieldIndex // does not need to check + valueToMerge, err := from.GetDecimal(idx) + if err != nil { + return fmt.Errorf("get from decimal value error: %v", err) + } + originValue, err := to.GetDecimal(idx) + if err != nil { + return fmt.Errorf("get to decimal value error: %v", err) + } + mergeValueDecimal := originValue.Add(valueToMerge) + mergeValueFloat, _ := mergeValueDecimal.Float64() + to.SetValue(idx, mergeValueFloat) + return nil +} + // AggregateFuncMaxMerger merge MAX() column in result type AggregateFuncMaxMerger struct { aggregateFuncBaseMerger @@ -336,9 +382,45 @@ func (a *AggregateFuncMinMerger) MergeTo(from, to ResultRow) error { } } +// AggregateFuncGroupConcatMerger merge group_concat columns in result +type AggregateFuncGroupConcatMerger struct { + aggregateFuncBaseMerger +} + +func (a *AggregateFuncGroupConcatMerger) concatToString(from, to ResultRow) error { + idx := a.fieldIndex // does not need to check + valueToMerge := fmt.Sprintf("%s", from.GetValue(idx)) + originValue := fmt.Sprintf("%s", to.GetValue(idx)) + // if distinct will remove duplicates + if a.distinct { + originSplits := strings.Split(originValue, ",") + valueSplit := strings.Split(valueToMerge, ",") + mergedSlice := removeDuplicatesString(originSplits, valueSplit) + to.SetValue(idx, strings.Join(mergedSlice, ",")) + return nil + } + + if originValue == "" { + to.SetValue(idx, valueToMerge) + return nil + } + to.SetValue(idx, originValue+","+valueToMerge) + return nil +} + +// MergeTo implement AggregateFuncGroupConcatMerger +func (a *AggregateFuncGroupConcatMerger) MergeTo(from, to ResultRow) error { + idx := a.fieldIndex + if idx >= len(from) || idx >= len(to) { + return fmt.Errorf("field index out of bound: %d", a.fieldIndex) + } + + return a.concatToString(from, to) +} + // MergeExecResult merge execution results, like UPDATE, INSERT, DELETE, ... func MergeExecResult(rs []*mysql.Result) (*mysql.Result, error) { - r := new(mysql.Result) + r := mysql.ResultPool.GetWithoutResultSet() for _, v := range rs { r.Status |= v.Status r.AffectedRows += v.AffectedRows @@ -401,6 +483,9 @@ func mergeMultiResultSet(rs []*mysql.Result) *mysql.Result { // 列信息认为相同, 因此只合并结果 for i := 1; i < len(rs); i++ { + if len(rs[i].Fields) < len(rs[0].Fields) { + rs[0].Fields = rs[i].Fields + } rs[0].Status |= rs[i].Status rs[0].Values = append(rs[0].Values, rs[i].Values...) rs[0].RowDatas = append(rs[0].RowDatas, rs[i].RowDatas...) @@ -699,7 +784,7 @@ func formatValue(value interface{}) ([]byte, error) { case float32: return strconv.AppendFloat(nil, float64(v), 'f', -1, 64), nil case float64: - return strconv.AppendFloat(nil, float64(v), 'f', -1, 64), nil + return strconv.AppendFloat(nil, v, 'f', -1, 64), nil case []byte: return v, nil case string: diff --git a/proxy/plan/plan.go b/proxy/plan/plan.go index 32ec86c0..89d17d0a 100644 --- a/proxy/plan/plan.go +++ b/proxy/plan/plan.go @@ -16,6 +16,7 @@ package plan import ( "fmt" + "math/rand" "strings" "github.com/XiaoMi/Gaea/mysql" @@ -35,6 +36,7 @@ var _ Plan = &DeletePlan{} var _ Plan = &UpdatePlan{} var _ Plan = &InsertPlan{} var _ Plan = &SelectLastInsertIDPlan{} +var _ Plan = &SetPlan{} // Plan is a interface for select/insert etc. type Plan interface { @@ -57,6 +59,8 @@ type Executor interface { SetLastInsertID(uint64) GetLastInsertID() uint64 + + HandleSet(*util.RequestContext, string, *ast.SetStmt) (*mysql.Result, error) } // Checker 用于检查SelectStmt是不是分表的Visitor, 以及是否包含DB信息 @@ -169,13 +173,17 @@ type TableAliasStmtInfo struct { } // BuildPlan build plan for ast -func BuildPlan(stmt ast.StmtNode, phyDBs map[string]string, db, sql string, router *router.Router, seq *sequence.SequenceManager) (Plan, error) { +func BuildPlan(stmt ast.StmtNode, phyDBs map[string]string, db, sql string, router *router.Router, seq *sequence.SequenceManager, hintPlan Plan) (Plan, error) { if IsSelectLastInsertIDStmt(stmt) { - return CreateSelectLastInsertIDPlan(), nil + return CreateSelectLastInsertIDPlan(stmt.(*ast.SelectStmt)), nil + } + + if IsSetStmt(stmt) { + return CreateSetPlan(sql, stmt), nil } if estmt, ok := stmt.(*ast.ExplainStmt); ok { - return buildExplainPlan(estmt, phyDBs, db, sql, router, seq) + return buildExplainPlan(estmt, phyDBs, db, sql, router, seq, hintPlan) } checker := NewChecker(db, router) @@ -186,15 +194,25 @@ func BuildPlan(stmt ast.StmtNode, phyDBs map[string]string, db, sql string, rout } if checker.IsShard() { - return buildShardPlan(stmt, db, sql, router, seq) + return buildShardPlan(stmt, db, sql, router, seq, hintPlan) } return CreateUnshardPlan(stmt, phyDBs, db, checker.GetUnshardTableNames()) } -func buildShardPlan(stmt ast.StmtNode, db string, sql string, router *router.Router, seq *sequence.SequenceManager) (Plan, error) { +func buildShardPlan(stmt ast.StmtNode, db string, sql string, router *router.Router, seq *sequence.SequenceManager, hintPlan Plan) (Plan, error) { switch s := stmt.(type) { case *ast.SelectStmt: plan := NewSelectPlan(db, sql, router) + // convert MyCat hint Plan to hint DB + if p, ok := hintPlan.(*SelectPlan); ok { + hintSelectPlan := p + for _, v := range hintSelectPlan.sqls { + for db := range v { + plan.TableAliasStmtInfo.hintPhyDB = db + } + } + + } if err := HandleSelectStmt(plan, s); err != nil { return nil, err } @@ -338,7 +356,7 @@ func (s *StmtInfo) getSettedRuleByColumnName(column string) (router.Rule, bool, } // 处理SELECT只含有全局表的情况 -// 这种情况只路由到默认分片 +// 这种情况会随机路由到各个分片表 // 如果有多个全局表, 则只取第一个全局表的配置, 因此需要业务上保证这些全局表的配置是一致的. func postHandleGlobalTableRouteResultInQuery(p *StmtInfo) error { if len(p.tableRules) == 0 && len(p.globalTableRules) != 0 { @@ -351,7 +369,10 @@ func postHandleGlobalTableRouteResultInQuery(p *StmtInfo) error { } p.result.db = rule.GetDB() p.result.table = tableName - p.result.indexes = []int{0} // 全局表SELECT只取默认分片 + + // 全局表SELECT随机分片 + tableLen := len(rule.GetSubTableIndexes()) + p.result.indexes = []int{rand.Intn(tableLen)} } return nil } @@ -495,6 +516,7 @@ func (t *TableAliasStmtInfo) getAliasTable(alias string) (string, bool) { return table, ok } +// TODO: 删除该函数 // 根据StmtNode和路由信息生成分片SQL func generateShardingSQLs(stmt ast.StmtNode, result *RouteResult, router *router.Router) (map[string]map[string][]string, error) { ret := make(map[string]map[string][]string) @@ -528,6 +550,41 @@ func generateShardingSQLs(stmt ast.StmtNode, result *RouteResult, router *router return ret, nil } +// 根据多个StmtNode和路由信息生成分片SQL,适用于 batch insert +func generateMultiShardingSQLs(stmts []ast.StmtNode, result *RouteResult, router *router.Router) (map[string]map[string][]string, error) { + if len(stmts) != len(result.GetShardIndexes()) { + return nil, fmt.Errorf("stmt not equal result") + } + ret := make(map[string]map[string][]string) + + for result.HasNext() { + sb := &strings.Builder{} + ctx := format.NewRestoreCtx(format.EscapeRestoreFlags, sb) + if err := stmts[result.currentIndex].Restore(ctx); err != nil { + return nil, err + } + index := result.Next() + rule, ok := router.GetShardRule(result.db, result.table) + if !ok { + return nil, fmt.Errorf("cannot find shard rule, db: %s, table: %s", result.db, result.table) + } + sliceIndex := rule.GetSliceIndexFromTableIndex(index) + sliceName := rule.GetSlice(sliceIndex) + dbName, _ := rule.GetDatabaseNameByTableIndex(index) + sliceSQLs, ok := ret[sliceName] + if !ok { + sliceSQLs = make(map[string][]string) + ret[sliceName] = sliceSQLs + } + + ret[sliceName][dbName] = append(ret[sliceName][dbName], sb.String()) + } + + result.Reset() // must reset the cursor for next call + + return ret, nil +} + // 根据原始SQL生成后端对应slice和db的SQL func generateSQLResultFromOriginSQL(sql string, result *RouteResult, router *router.Router) (map[string]map[string][]string, error) { rule := router.GetRule(result.db, result.table) diff --git a/proxy/plan/plan_exec_test.go b/proxy/plan/plan_exec_test.go index 7383bd2c..c11991e8 100644 --- a/proxy/plan/plan_exec_test.go +++ b/proxy/plan/plan_exec_test.go @@ -1,3 +1,17 @@ +// Copyright 2019 The Gaea Authors. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + package plan import ( @@ -11,7 +25,7 @@ func TestExecuteIn(t *testing.T) { planInfo, _ := preparePlanInfo() sql := "SELECT * FROM tbl_mycat_murmur WHERE tbl_mycat_murmur.id=5 AND tbl_mycat_murmur.id=4" stmt, _ := parser.ParseSQL(sql) - plan, err := BuildPlan(stmt, nil, "db_mycat", sql, planInfo.rt, planInfo.seqs) + plan, err := BuildPlan(stmt, nil, "db_mycat", sql, planInfo.rt, planInfo.seqs, nil) if err != nil { t.Fatalf("build plan error: %v", err) } diff --git a/proxy/plan/plan_explain.go b/proxy/plan/plan_explain.go index 6a52f060..5f650342 100644 --- a/proxy/plan/plan_explain.go +++ b/proxy/plan/plan_explain.go @@ -27,6 +27,7 @@ import ( const ( ShardTypeUnshard = "unshard" ShardTypeShard = "shard" + ExplainKey = "explain" ) // ExplainPlan is the plan for explain statement @@ -35,13 +36,13 @@ type ExplainPlan struct { sqls map[string]map[string][]string } -func buildExplainPlan(stmt *ast.ExplainStmt, phyDBs map[string]string, db, sql string, r *router.Router, seq *sequence.SequenceManager) (*ExplainPlan, error) { +func buildExplainPlan(stmt *ast.ExplainStmt, phyDBs map[string]string, db, sql string, r *router.Router, seq *sequence.SequenceManager, hintPlan Plan) (*ExplainPlan, error) { stmtToExplain := stmt.Stmt if _, ok := stmtToExplain.(*ast.ExplainStmt); ok { return nil, fmt.Errorf("nested explain") } - p, err := BuildPlan(stmtToExplain, phyDBs, db, sql, r, seq) + p, err := BuildPlan(stmtToExplain, phyDBs, db, sql, r, seq, hintPlan) if err != nil { return nil, fmt.Errorf("build plan to explain error: %v", err) } @@ -69,9 +70,6 @@ func buildExplainPlan(stmt *ast.ExplainStmt, phyDBs map[string]string, db, sql s ep.shardType = ShardTypeUnshard ep.sqls = make(map[string]map[string][]string) dbSQLs := make(map[string][]string) - if phyDB, ok := phyDBs[pl.db]; ok { - pl.db = phyDB - } dbSQLs[pl.db] = []string{pl.sql} ep.sqls[r.GetDefaultRule().GetSlice(0)] = dbSQLs return ep, nil @@ -81,32 +79,41 @@ func buildExplainPlan(stmt *ast.ExplainStmt, phyDBs map[string]string, db, sql s } // ExecuteIn implement Plan -func (p *ExplainPlan) ExecuteIn(*util.RequestContext, Executor) (*mysql.Result, error) { - return createExplainResult(p.shardType, p.sqls), nil -} - -// Size implement Plan -func (p *ExplainPlan) Size() int { - return 1 -} - -func createExplainResult(shardType string, sqls map[string]map[string][]string) *mysql.Result { +func (p *ExplainPlan) ExecuteIn(reqCtx *util.RequestContext, se Executor) (*mysql.Result, error) { var rows [][]interface{} - var names = []string{"type", "slice", "db", "sql"} + var names = []string{"shard_type", "slice", "db", "sql", "select_type", "table", "partitions", "type", + "possible_keys", "key", "key_len", "ref", "rows", "filtered", "Extra"} - for slice, dbSQLs := range sqls { + for slice, dbSQLs := range p.sqls { for db, tableSQLs := range dbSQLs { for _, sql := range tableSQLs { - row := []interface{}{shardType, slice, db, sql} - rows = append(rows, row) + s, err := se.ExecuteSQL(reqCtx, slice, db, ExplainKey+" "+sql) + if err != nil { + return nil, err + } + + for i := 0; i < len(s.Resultset.Values); i++ { + row := []interface{}{p.shardType, slice, db, sql} + for j := 1; j < len(s.Resultset.Values[i]); j++ { + if s.Resultset.Values[i][j] == nil { + s.Resultset.Values[i][j] = "NULL" + } + row = append(row, s.Resultset.Values[i][j]) + } + rows = append(rows, row) + } } } } r, _ := mysql.BuildResultset(nil, names, rows) - ret := &mysql.Result{ - Resultset: r, - } + ret := mysql.ResultPool.Get() + ret.Resultset = r + + return ret, nil +} - return ret +// Size implement Plan +func (p *ExplainPlan) Size() int { + return 1 } diff --git a/proxy/plan/plan_explain_test.go b/proxy/plan/plan_explain_test.go index 37f9d5b3..ddee2803 100644 --- a/proxy/plan/plan_explain_test.go +++ b/proxy/plan/plan_explain_test.go @@ -105,8 +105,13 @@ func TestExplainMycatShardSimpleInsert(t *testing.T) { }, }, { - db: "db_mycat", - sql: "explain insert into tbl_mycat (a) values ('hi')", + db: "db_mycat", + sql: "explain insert into tbl_mycat (a) values ('hi')", + sqls: map[string]map[string][]string{ + "slice-0": { + "db_mycat_1": {"INSERT INTO `tbl_mycat` (`a`,`id`) VALUES ('hi',1)"}, + }, + }, hasErr: true, // sharding column not found }, { @@ -189,7 +194,7 @@ func TestExplainUnshardInsert(t *testing.T) { sql: "explain insert into tbl_unshard (id, a) values (0, 'hi')", sqls: map[string]map[string][]string{ "slice-0": { - "db_mycat_0": {"INSERT INTO `tbl_unshard` (`id`,`a`) VALUES (0,'hi')"}, + "db_mycat": {"INSERT INTO `tbl_unshard` (`id`,`a`) VALUES (0,'hi')"}, }, }, }, @@ -199,6 +204,7 @@ func TestExplainUnshardInsert(t *testing.T) { } } +// TODO: delete this test cause unshard may use pre-build unshard plan func TestExplainUnshardInsertWithDb(t *testing.T) { ns, err := preparePlanInfo() if err != nil { @@ -211,7 +217,7 @@ func TestExplainUnshardInsertWithDb(t *testing.T) { sql: "explain insert into db_mycat.tbl_unshard (id, a) values (0, 'hi')", sqls: map[string]map[string][]string{ "slice-0": { - "db_mycat_0": {"INSERT INTO `db_mycat_0`.`tbl_unshard` (`id`,`a`) VALUES (0,'hi')"}, + "db_mycat": {"INSERT INTO `db_mycat_0`.`tbl_unshard` (`id`,`a`) VALUES (0,'hi')"}, }, }, }, diff --git a/proxy/plan/plan_insert.go b/proxy/plan/plan_insert.go index 98b6aa3f..ff3db687 100644 --- a/proxy/plan/plan_insert.go +++ b/proxy/plan/plan_insert.go @@ -17,6 +17,8 @@ package plan import ( "fmt" + "github.com/XiaoMi/Gaea/parser/model" + "github.com/XiaoMi/Gaea/core/errors" "github.com/XiaoMi/Gaea/log" "github.com/XiaoMi/Gaea/mysql" @@ -31,8 +33,8 @@ import ( type InsertPlan struct { basePlan *StmtInfo - - stmt *ast.InsertStmt + rewriteStmts []ast.StmtNode + stmt *ast.InsertStmt table string isAssignmentMode bool @@ -46,6 +48,7 @@ type InsertPlan struct { // NewInsertPlan constructor of InsertPlan func NewInsertPlan(db string, sql string, r *router.Router, seq *sequence.SequenceManager) *InsertPlan { return &InsertPlan{ + rewriteStmts: []ast.StmtNode{}, StmtInfo: NewStmtInfo(db, sql, r), shardingColumnIndex: -1, sequences: seq, @@ -66,18 +69,23 @@ func HandleInsertStmt(p *InsertPlan, stmt *ast.InsertStmt) error { } // 处理全局表成功时会触发fastReturn - fastReturn, err := handleInsertTableRefs(p) + isGlobalTable, err := handleInsertTableRefs(p) if err != nil { return fmt.Errorf("handleInsertTableRefs error: %v", err) } - if fastReturn { - return nil - } if err := handleInsertGlobalSequenceValue(p); err != nil { return fmt.Errorf("handleInsertGlobalSequenceValue error: %v", err) } + // 全局表直接生成 SQL 返回 + if isGlobalTable { + if err := generateGlobalShardingSQLs(p); err != nil { + return fmt.Errorf("generate global table sharding sqls error: %v", err) + } + return nil + } + if err := handleInsertColumnNames(p); err != nil { return fmt.Errorf("handleInsertColumnNames error: %v", err) } @@ -90,7 +98,7 @@ func HandleInsertStmt(p *InsertPlan, stmt *ast.InsertStmt) error { return fmt.Errorf("handleInsertValues error: %v", err) } - sqls, err := generateShardingSQLs(p.stmt, p.result, p.router) + sqls, err := generateMultiShardingSQLs(p.rewriteStmts, p.result, p.router) if err != nil { log.Warn("generate insert sql failed, %v", err) return err @@ -126,7 +134,7 @@ func precheckInsertStmt(p *InsertPlan) error { return nil } -func handleInsertTableRefs(p *InsertPlan) (fastReturn bool, err error) { +func handleInsertTableRefs(p *InsertPlan) (isGlobalTable bool, err error) { if p.stmt.Table.TableRefs.Right != nil { return false, fmt.Errorf("have multi tables in insert") } @@ -154,20 +162,34 @@ func handleInsertTableRefs(p *InsertPlan) (fastReturn bool, err error) { tableSource.Source = decorator - // 如果是全局表, 则将记录写入所有分片 if rule.GetType() == router.GlobalTableRuleType { - p.result.db = rule.GetDB() - p.result.table = rule.GetTable() - p.result.indexes = rule.GetSubTableIndexes() + return true, nil + } + + return false, nil +} + +func generateGlobalShardingSQLs(p *InsertPlan) error { + tableSource, ok := p.stmt.Table.TableRefs.Left.(*ast.TableSource) + if !ok { + return fmt.Errorf("not a table source") + } + if dec, ok := tableSource.Source.(*TableNameDecorator); ok { + if dec.rule.GetType() != router.GlobalTableRuleType { + return fmt.Errorf("not global table rule type") + } + + p.result.db = dec.rule.GetDB() + p.result.table = dec.rule.GetTable() + p.result.indexes = dec.rule.GetSubTableIndexes() sqls, err := generateShardingSQLs(p.stmt, p.result, p.router) if err != nil { - return false, fmt.Errorf("generate global table insert sql error: %v", err) + return fmt.Errorf("generate global table insert sql error: %v", err) } p.sqls = sqls - return true, nil + return nil } - - return false, nil + return fmt.Errorf("global table source not TableNameDecorator") } func handleInsertColumnNames(p *InsertPlan) error { @@ -227,10 +249,13 @@ func handleInsertValues(p *InsertPlan) error { } p.result.Inter([]int{routeIdx}) } + p.rewriteStmts = append(p.rewriteStmts, p.stmt) return nil } // not assignment mode + routeIdxs := make([]int, 0, len(p.result.indexes)) + newStmtMap := make(map[int]*ast.InsertStmt) for _, valueList := range p.stmt.Lists { valueItem := valueList[p.shardingColumnIndex] switch x := valueItem.(type) { @@ -243,15 +268,23 @@ func handleInsertValues(p *InsertPlan) error { return fmt.Errorf("sharding value cannot be null") } routeIdx, err := p.tableRules[p.table].FindTableIndex(v) + if newStmt, ok := newStmtMap[routeIdx]; ok { + newStmt.Lists = append(newStmt.Lists, valueList) + } else { + newStmt := *p.stmt + newStmt.Lists = [][]ast.ExprNode{valueList} + routeIdxs = append(routeIdxs, routeIdx) + p.rewriteStmts = append(p.rewriteStmts, &newStmt) + newStmtMap[routeIdx] = &newStmt + } if err != nil { return fmt.Errorf("find table index error: %v", err) } - p.result.Inter([]int{routeIdx}) } } - if len(p.result.GetShardIndexes()) == 0 { - return fmt.Errorf("batch insert has cross slice values or no route found") - } + + p.result.indexes = routeIdxs + return nil } @@ -314,19 +347,40 @@ func handleInsertGlobalSequenceValue(p *InsertPlan) error { // global sequence column not found if seqIndex == -1 { - return nil + // 有配置全局自增列但是没有指定自增列,自动补齐 + p.stmt.Columns = append(p.stmt.Columns, &ast.ColumnName{ + Name: model.NewCIStr(pkName), + }) + seqIndex = len(p.stmt.Columns) - 1 + // for batch insert, we should append every list + for i := 0; i < len(p.stmt.Lists); i++ { + p.stmt.Lists[i] = append(p.stmt.Lists[i], &ast.FuncCallExpr{FnName: model.NewCIStr("nextval")}) + } } for _, valueList := range p.stmt.Lists { - if x, ok := valueList[seqIndex].(*ast.FuncCallExpr); ok { + generateNextSeq := false + switch x := valueList[seqIndex].(type) { + // insert into t(col) values(val) -> insert into t(col,id) values(val, nextSeq) + case *ast.FuncCallExpr: if x.FnName.L == "nextval" { - id, err := seq.NextSeq() - if err != nil { - return fmt.Errorf("get next seq error: %v", err) - } - valueList[seqIndex] = ast.NewValueExpr(id) + generateNextSeq = true + } + // insert into t(id, col) values(null, val) -> insert into t(id,col) values(nextSeq, val) + case *driver.ValueExpr: + if x.IsNull() { + generateNextSeq = true } } + + if generateNextSeq { + id, err := seq.NextSeq() + if err != nil { + return fmt.Errorf("get next seq error: %v", err) + } + valueList[seqIndex] = ast.NewValueExpr(id) + } + } return nil diff --git a/proxy/plan/plan_insert_test.go b/proxy/plan/plan_insert_test.go index e0d631ab..51db16b3 100644 --- a/proxy/plan/plan_insert_test.go +++ b/proxy/plan/plan_insert_test.go @@ -105,9 +105,14 @@ func TestMycatShardSimpleInsert(t *testing.T) { }, }, { - db: "db_mycat", - sql: "insert into tbl_mycat (a) values ('hi')", - hasErr: true, // sharding column not found + db: "db_mycat", + sql: "insert into tbl_mycat (a) values ('hi')", + sqls: map[string]map[string][]string{ + "slice-0": { + "db_mycat_1": {"INSERT INTO `tbl_mycat` (`a`,`id`) VALUES ('hi',1)"}, + }, + }, + //hasErr: true, // sharding column not found }, { db: "db_mycat", @@ -177,6 +182,7 @@ func TestMycatShardSimpleInsert(t *testing.T) { } } +// TestMycatShardBatchInsert should run once cause global sequence has cached func TestMycatShardBatchInsert(t *testing.T) { ns, err := preparePlanInfo() if err != nil { @@ -185,23 +191,148 @@ func TestMycatShardBatchInsert(t *testing.T) { tests := []SQLTestcase{ { + // test mycat_mod shard mode batch insert simple db: "db_mycat", - sql: "insert into tbl_mycat (id, a) values (0, 'hi'), (4, 'hi')", + sql: "insert into tbl_mycat (id, a) values (0, 'hi'), (4, 'hi'),(8, 'hi')", sqls: map[string]map[string][]string{ "slice-0": { - "db_mycat_0": {"INSERT INTO `tbl_mycat` (`id`,`a`) VALUES (0,'hi'),(4,'hi')"}, + "db_mycat_0": { + "INSERT INTO `tbl_mycat` (`id`,`a`) VALUES (0,'hi'),(4,'hi'),(8,'hi')", + }, }, }, }, { - db: "db_mycat", - sql: "insert into tbl_mycat (id, a) values (0, 'hi'), (1, 'hi'), (4, 'hi')", - hasErr: true, // batch insert has cross slice values + // test mycat_mod shard mode batch insert + db: "db_mycat", + sql: "insert into tbl_mycat (id, a) values (6, 'hi'), (5, 'hello'),(7,'hi'),(9,'hi')", + sqls: map[string]map[string][]string{ + "slice-0": { + "db_mycat_1": { + "INSERT INTO `tbl_mycat` (`id`,`a`) VALUES (5,'hello'),(9,'hi')", + }, + }, + "slice-1": { + "db_mycat_2": { + "INSERT INTO `tbl_mycat` (`id`,`a`) VALUES (6,'hi')", + }, + "db_mycat_3": { + "INSERT INTO `tbl_mycat` (`id`,`a`) VALUES (7,'hi')", + }, + }, + }, }, { - db: "db_mycat", - sql: "insert into tbl_mycat (id, a) values (6, 'hi'), (5, 'hello')", - hasErr: true, // batch insert has cross slice values + // test mycat_murmur shard mode batch insert + db: "db_mycat", + sql: "insert into tbl_mycat_murmur (id, a) values (0, 'hi'),(1, 'hi'),(2, 'hi'),(3, 'hi'),(4, 'hi')", + sqls: map[string]map[string][]string{ + "slice-0": { + "db_mycat_1": { + "INSERT INTO `tbl_mycat_murmur` (`id`,`a`) VALUES (1,'hi'),(2,'hi'),(3,'hi')", + }, + }, + "slice-1": { + "db_mycat_2": { + "INSERT INTO `tbl_mycat_murmur` (`id`,`a`) VALUES (0,'hi'),(4,'hi')", + }, + }, + }, + }, + { + // test mycat_long shard mode batch insert + db: "db_mycat", + sql: "insert into tbl_mycat_long (id, a) values (0, 'hi'),(1, 'hi'),(256, 'hi'),(257, 'hi'),(512, 'hi'),(513, 'hi'),(768, 'hi'),(769, 'hi')", + sqls: map[string]map[string][]string{ + "slice-0": { + "db_mycat_0": { + "INSERT INTO `tbl_mycat_long` (`id`,`a`) VALUES (0,'hi'),(1,'hi')", + }, + "db_mycat_1": { + "INSERT INTO `tbl_mycat_long` (`id`,`a`) VALUES (256,'hi'),(257,'hi')", + }, + }, + "slice-1": { + "db_mycat_2": { + "INSERT INTO `tbl_mycat_long` (`id`,`a`) VALUES (512,'hi'),(513,'hi')", + }, + "db_mycat_3": { + "INSERT INTO `tbl_mycat_long` (`id`,`a`) VALUES (768,'hi'),(769,'hi')", + }, + }, + }, + }, + { + // test global table batch insert value not use global sequence + db: "db_mycat", + sql: "insert into tbl_mycat_global_3(id,a) values(1,'hi'),(2,'hello')", + sqls: map[string]map[string][]string{ + "slice-0": { + "db_mycat_0": {"INSERT INTO `tbl_mycat_global_3` (`id`,`a`) VALUES (1,'hi'),(2,'hello')"}, + "db_mycat_1": {"INSERT INTO `tbl_mycat_global_3` (`id`,`a`) VALUES (1,'hi'),(2,'hello')"}, + }, + "slice-1": { + "db_mycat_2": {"INSERT INTO `tbl_mycat_global_3` (`id`,`a`) VALUES (1,'hi'),(2,'hello')"}, + "db_mycat_3": {"INSERT INTO `tbl_mycat_global_3` (`id`,`a`) VALUES (1,'hi'),(2,'hello')"}, + }, + }, + }, + { + // test global table batch insert value use global sequence + db: "db_mycat", + sql: "insert into tbl_mycat_global_3(id,a) values(nextval(),'hi'),(nextval(),'hello')", + sqls: map[string]map[string][]string{ + "slice-0": { + "db_mycat_0": {"INSERT INTO `tbl_mycat_global_3` (`id`,`a`) VALUES (1,'hi'),(2,'hello')"}, + "db_mycat_1": {"INSERT INTO `tbl_mycat_global_3` (`id`,`a`) VALUES (1,'hi'),(2,'hello')"}, + }, + "slice-1": { + "db_mycat_2": {"INSERT INTO `tbl_mycat_global_3` (`id`,`a`) VALUES (1,'hi'),(2,'hello')"}, + "db_mycat_3": {"INSERT INTO `tbl_mycat_global_3` (`id`,`a`) VALUES (1,'hi'),(2,'hello')"}, + }, + }, + }, + { + // test global table batch insert value not use global sequence without id column + db: "db_mycat", + sql: "insert into tbl_mycat_global_3(a) values('hi'),('hello')", + sqls: map[string]map[string][]string{ + "slice-0": { + "db_mycat_0": {"INSERT INTO `tbl_mycat_global_3` (`a`,`id`) VALUES ('hi',3),('hello',4)"}, + "db_mycat_1": {"INSERT INTO `tbl_mycat_global_3` (`a`,`id`) VALUES ('hi',3),('hello',4)"}, + }, + "slice-1": { + "db_mycat_2": {"INSERT INTO `tbl_mycat_global_3` (`a`,`id`) VALUES ('hi',3),('hello',4)"}, + "db_mycat_3": {"INSERT INTO `tbl_mycat_global_3` (`a`,`id`) VALUES ('hi',3),('hello',4)"}, + }, + }, + hasErr: false, + }, + { + // test shard table batch insert value use global sequence without global sequence column + db: "db_mycat", + sql: "insert into tbl_mycat (id, a) values (nextval(), 'hi'),(nextval(), 'hello')", + sqls: map[string]map[string][]string{ + "slice-0": { + "db_mycat_1": {"INSERT INTO `tbl_mycat` (`id`,`a`) VALUES (1,'hi')"}, + }, + "slice-1": { + "db_mycat_2": {"INSERT INTO `tbl_mycat` (`id`,`a`) VALUES (2,'hello')"}, + }, + }, + }, + { + // test shard table batch insert value use global sequence + db: "db_mycat", + sql: "insert into tbl_mycat (a) values ('hi'),('hello')", + sqls: map[string]map[string][]string{ + "slice-0": { + "db_mycat_0": {"INSERT INTO `tbl_mycat` (`a`,`id`) VALUES ('hello',4)"}, + }, + "slice-1": { + "db_mycat_3": {"INSERT INTO `tbl_mycat` (`a`,`id`) VALUES ('hi',3)"}, + }, + }, }, } for _, test := range tests { @@ -625,6 +756,46 @@ func TestMycatInsertGlobalTable(t *testing.T) { }, }, }, + { + // global insert value with AssignmentMode will not use global sequence + db: "db_mycat", + sql: "insert into tbl_mycat_global_3 set a = 'hi'", + sqls: map[string]map[string][]string{ + "slice-0": { + "db_mycat_0": {"INSERT INTO `tbl_mycat_global_3` SET `a`='hi'"}, + "db_mycat_1": {"INSERT INTO `tbl_mycat_global_3` SET `a`='hi'"}, + }, + "slice-1": { + "db_mycat_2": {"INSERT INTO `tbl_mycat_global_3` SET `a`='hi'"}, + "db_mycat_3": {"INSERT INTO `tbl_mycat_global_3` SET `a`='hi'"}, + }, + }, + }, + { + // global table insert value use global sequence + db: "db_mycat", + sql: "insert into tbl_mycat_global_3(a) values('hi')", + sqls: map[string]map[string][]string{ + "slice-0": { + "db_mycat_0": {"INSERT INTO `tbl_mycat_global_3` (`a`,`id`) VALUES ('hi',1)"}, + "db_mycat_1": {"INSERT INTO `tbl_mycat_global_3` (`a`,`id`) VALUES ('hi',1)"}, + }, + "slice-1": { + "db_mycat_2": {"INSERT INTO `tbl_mycat_global_3` (`a`,`id`) VALUES ('hi',1)"}, + "db_mycat_3": {"INSERT INTO `tbl_mycat_global_3` (`a`,`id`) VALUES ('hi',1)"}, + }, + }, + }, + { + // use global table replace single table to use global sequence + db: "db_mycat", + sql: "insert into tbl_mycat_global_4(a) values('hi')", + sqls: map[string]map[string][]string{ + "slice-0": { + "db_mycat_0": {"INSERT INTO `tbl_mycat_global_4` (`a`,`id`) VALUES ('hi',1)"}, + }, + }, + }, } for _, test := range tests { t.Run(test.sql, getTestFunc(ns, test)) @@ -721,7 +892,9 @@ func TestMycatInsertSequenceUnshardKey(t *testing.T) { sql: "insert into tbl_ks (id, user_id) values (3,nextval()),(3,nextval()),(3, nextval())", sqls: map[string]map[string][]string{ "slice-1": { - "db_ks": {"INSERT INTO `tbl_ks_0003` (`id`,`user_id`) VALUES (3,3),(3,4),(3,5)"}, + "db_ks": []string{ + "INSERT INTO `tbl_ks_0003` (`id`,`user_id`) VALUES (3,3),(3,4),(3,5)", + }, }, }, }, @@ -743,7 +916,7 @@ func TestEscapeBackslashShard(t *testing.T) { sql: `insert into tbl_ks (id,name) values (1,'hello\\"world')`, sqls: map[string]map[string][]string{ "slice-0": { - "db_ks": {"INSERT INTO `tbl_ks_0001` (`id`,`name`) VALUES (1,'hello\\\\\"world')"}, + "db_ks": {"INSERT INTO `tbl_ks_0001` (`id`,`name`,`user_id`) VALUES (1,'hello\\\\\"world',1)"}, }, }, }, diff --git a/proxy/plan/plan_select.go b/proxy/plan/plan_select.go index d789df7d..46bd75d6 100644 --- a/proxy/plan/plan_select.go +++ b/proxy/plan/plan_select.go @@ -16,7 +16,6 @@ package plan import ( "fmt" - "github.com/XiaoMi/Gaea/mysql" "github.com/XiaoMi/Gaea/parser/ast" "github.com/XiaoMi/Gaea/parser/opcode" @@ -67,9 +66,8 @@ func (s *SelectPlan) ExecuteIn(reqCtx *util.RequestContext, sess Executor) (*mys if len(sqls) == 0 { r := newEmptyResultset(s, s.GetStmt()) - ret := &mysql.Result{ - Resultset: r, - } + ret := mysql.ResultPool.Get() + ret.Resultset = r return ret, nil } @@ -77,16 +75,17 @@ func (s *SelectPlan) ExecuteIn(reqCtx *util.RequestContext, sess Executor) (*mys if err != nil { return nil, fmt.Errorf("execute in SelectPlan error: %v", err) } - - if s.isExecOnSingleNode() { + // fix: 修复全局表或分片表 order by/group by等情况下单分片执行时多一列的问题, 修复由于 limit offset 语句改写导致结果行数不正确问题 + if s.isExecOnSingleNode() && s.noAddColumns() && !s.HasLimit() { return rs[0], nil - } else { - r, err := MergeSelectResult(s, s.stmt, rs) - if err != nil { - return nil, fmt.Errorf("merge select result error: %v", err) - } - return r, nil } + + r, err := MergeSelectResult(s, s.stmt, rs) + if err != nil { + return nil, fmt.Errorf("merge select result error: %v", err) + } + return r, nil + } // GetStmt SelectStmt @@ -149,13 +148,13 @@ func (s *SelectPlan) GetSQLs() map[string]map[string][]string { return s.sqls } -//执行计划是否仅仅涉及一个分片 +// 执行计划是否仅仅涉及一个分片 func (s *SelectPlan) isExecOnSingleNode() bool { - if len(s.result.indexes) == 1 { - return true - } else { - return false - } + return len(s.result.indexes) == 1 +} + +func (s *SelectPlan) noAddColumns() bool { + return s.originColumnCount == s.columnCount } // HandleSelectStmt build a SelectPlan @@ -214,6 +213,11 @@ func HandleSelectStmt(p *SelectPlan, stmt *ast.SelectStmt) error { if err := handleLimit(p, stmt); err != nil { return fmt.Errorf("handle Limit error: %v", err) } + } else { + // 即使在单个分片执行,也会产生加列的情况 + if stmt.Fields != nil { + p.columnCount = len(stmt.Fields.Fields) + } } if err := postHandleGlobalTableRouteResultInQuery(p.StmtInfo); err != nil { @@ -332,8 +336,13 @@ func createSelectFieldsFromByItems(p *SelectPlan, items []*ast.ByItem) ([]*ast.S } func createSelectFieldFromByItem(p *SelectPlan, item *ast.ByItem) (*ast.SelectField, error) { - // 特殊处理DATABASE()这种情况 - if funcExpr, ok := item.Expr.(*ast.FuncCallExpr); ok { + var columnExpr *ast.ColumnNameExpr + + // support order by null/order by 1/order by max/order by min + switch item.Expr.(type) { + case *ast.FuncCallExpr: + // 特殊处理DATABASE()这种情况 + funcExpr := item.Expr.(*ast.FuncCallExpr) if funcExpr.FnName.L == "database" { ret := &ast.SelectField{ Expr: item.Expr, @@ -341,10 +350,16 @@ func createSelectFieldFromByItem(p *SelectPlan, item *ast.ByItem) (*ast.SelectFi return ret, nil } return nil, fmt.Errorf("ByItem.Expr is a FuncCallExpr but not DATABASE()") - } - - columnExpr, ok := item.Expr.(*ast.ColumnNameExpr) - if !ok { + case *driver.ValueExpr: + return &ast.SelectField{Expr: item.Expr}, nil + case *ast.PositionExpr: + return &ast.SelectField{Expr: item.Expr}, nil + case *ast.AggregateFuncExpr: + // 处理 order by max()/min() 等情况 + return &ast.SelectField{Expr: item.Expr}, nil + case *ast.ColumnNameExpr: + columnExpr = item.Expr.(*ast.ColumnNameExpr) + default: return nil, fmt.Errorf("ByItem.Expr is not a ColumnNameExpr") } @@ -359,7 +374,7 @@ func createSelectFieldFromByItem(p *SelectPlan, item *ast.ByItem) (*ast.SelectFi } ret := &ast.SelectField{ - Expr: item.Expr, + Expr: columnExpr, } return ret, nil } @@ -602,7 +617,7 @@ func handleFieldList(p *SelectPlan, stmt *ast.SelectStmt) (err error) { for i, f := range fields.Fields { switch field := f.Expr.(type) { case *ast.AggregateFuncExpr: - merger, err := CreateAggregateFunctionMerger(field.F, i) + merger, err := CreateAggregateFunctionMerger(field, i) if err != nil { return fmt.Errorf("create aggregate function merger error, column index: %d, err: %v", i, err) } diff --git a/proxy/plan/plan_select_test.go b/proxy/plan/plan_select_test.go index c9c90c45..664de4ed 100644 --- a/proxy/plan/plan_select_test.go +++ b/proxy/plan/plan_select_test.go @@ -1810,6 +1810,34 @@ func TestMycatSelectGroupBy(t *testing.T) { }, }, }, + { + db: "db_mycat", + sql: "select col1,count(*) from tbl_mycat group by col1", + sqls: map[string]map[string][]string{ + "slice-0": { + "db_mycat_0": {"SELECT `col1`,COUNT(1) FROM `tbl_mycat` GROUP BY `col1`"}, + "db_mycat_1": {"SELECT `col1`,COUNT(1) FROM `tbl_mycat` GROUP BY `col1`"}, + }, + "slice-1": { + "db_mycat_2": {"SELECT `col1`,COUNT(1) FROM `tbl_mycat` GROUP BY `col1`"}, + "db_mycat_3": {"SELECT `col1`,COUNT(1) FROM `tbl_mycat` GROUP BY `col1`"}, + }, + }, + }, + { + db: "db_mycat", + sql: "select * from tbl_mycat order by col1", + sqls: map[string]map[string][]string{ + "slice-0": { + "db_mycat_0": {"SELECT *,`col1` FROM `tbl_mycat` ORDER BY `col1`"}, + "db_mycat_1": {"SELECT *,`col1` FROM `tbl_mycat` ORDER BY `col1`"}, + }, + "slice-1": { + "db_mycat_2": {"SELECT *,`col1` FROM `tbl_mycat` ORDER BY `col1`"}, + "db_mycat_3": {"SELECT *,`col1` FROM `tbl_mycat` ORDER BY `col1`"}, + }, + }, + }, } for _, test := range tests { @@ -1838,6 +1866,20 @@ func TestMycatSelectHaving(t *testing.T) { }, }, }, + { + db: "db_mycat", + sql: "select user from tbl_mycat having id = 1", // note: does not calculate route in having clause + sqls: map[string]map[string][]string{ + "slice-0": { + "db_mycat_0": {"SELECT `user` FROM `tbl_mycat` HAVING `id`=1"}, + "db_mycat_1": {"SELECT `user` FROM `tbl_mycat` HAVING `id`=1"}, + }, + "slice-1": { + "db_mycat_2": {"SELECT `user` FROM `tbl_mycat` HAVING `id`=1"}, + "db_mycat_3": {"SELECT `user` FROM `tbl_mycat` HAVING `id`=1"}, + }, + }, + }, { db: "db_mycat", sql: "select id, count(user) from tbl_mycat where id=1 group by id having count(user) > 5", @@ -1912,6 +1954,21 @@ func TestMycatSelectOrderBy(t *testing.T) { }, }, }, + // order by will auto add column to select list + { + db: "db_mycat", + sql: "select user from tbl_mycat order by id desc", + sqls: map[string]map[string][]string{ + "slice-0": { + "db_mycat_0": {"SELECT `user`,`id` FROM `tbl_mycat` ORDER BY `id` DESC"}, + "db_mycat_1": {"SELECT `user`,`id` FROM `tbl_mycat` ORDER BY `id` DESC"}, + }, + "slice-1": { + "db_mycat_2": {"SELECT `user`,`id` FROM `tbl_mycat` ORDER BY `id` DESC"}, + "db_mycat_3": {"SELECT `user`,`id` FROM `tbl_mycat` ORDER BY `id` DESC"}, + }, + }, + }, } for _, test := range tests { @@ -1968,6 +2025,20 @@ func TestMycatSelectLimit(t *testing.T) { }, }, }, + { + db: "db_mycat", + sql: "select * from tbl_mycat limit 10 offset 20", + sqls: map[string]map[string][]string{ + "slice-0": { + "db_mycat_0": {"SELECT * FROM `tbl_mycat` LIMIT 30"}, + "db_mycat_1": {"SELECT * FROM `tbl_mycat` LIMIT 30"}, + }, + "slice-1": { + "db_mycat_2": {"SELECT * FROM `tbl_mycat` LIMIT 30"}, + "db_mycat_3": {"SELECT * FROM `tbl_mycat` LIMIT 30"}, + }, + }, + }, { db: "db_mycat", sql: "select id, user from tbl_mycat where id= 1 group by age having age > 10 order by age desc limit 10, 10", @@ -3146,21 +3217,40 @@ func TestSelectGlobalTableKingshard(t *testing.T) { { db: "db_ks", sql: "select * from tbl_ks_global_one where name='haha'", - sqls: map[string]map[string][]string{ - "slice-0": { - "db_ks": { - "SELECT * FROM `tbl_ks_global_one` WHERE `name`='haha'", + randomSqls: []map[string]map[string][]string{ + { + "slice-0": { + "db_ks": { + "SELECT * FROM `tbl_ks_global_one` WHERE `name`='haha'", + }, + }, + }, + { + "slice-1": { + "db_ks": { + "SELECT * FROM `tbl_ks_global_one` WHERE `name`='haha'", + }, }, }, }, }, + // TODO: random slice to be fixed 100% success { db: "db_ks", sql: "select * from db_ks.tbl_ks_global_one, tbl_ks_global_two where tbl_ks_global_one.name='haha' and tbl_ks_global_two.name='hehe'", - sqls: map[string]map[string][]string{ - "slice-0": { - "db_ks": { - "SELECT * FROM (`db_ks`.`tbl_ks_global_one`) JOIN `tbl_ks_global_two` WHERE `tbl_ks_global_one`.`name`='haha' AND `tbl_ks_global_two`.`name`='hehe'", + randomSqls: []map[string]map[string][]string{ + { + "slice-0": { + "db_ks": { + "SELECT * FROM (`db_ks`.`tbl_ks_global_one`) JOIN `tbl_ks_global_two` WHERE `tbl_ks_global_one`.`name`='haha' AND `tbl_ks_global_two`.`name`='hehe'", + }, + }, + }, + { + "slice-1": { + "db_ks": { + "SELECT * FROM (`db_ks`.`tbl_ks_global_one`) JOIN `tbl_ks_global_two` WHERE `tbl_ks_global_one`.`name`='haha' AND `tbl_ks_global_two`.`name`='hehe'", + }, }, }, }, @@ -3259,57 +3349,212 @@ func TestSelectGlobalTableMycat(t *testing.T) { } tests := []SQLTestcase{ + { db: "db_mycat", sql: "select * from tbl_mycat_global_one where name='haha'", - sqls: map[string]map[string][]string{ - "slice-0": { - "db_mycat_0": { - "SELECT * FROM `tbl_mycat_global_one` WHERE `name`='haha'", + randomSqls: []map[string]map[string][]string{ + { + "slice-0": { + "db_mycat_0": { + "SELECT * FROM `tbl_mycat_global_one` WHERE `name`='haha'", + }, + }, + }, + { + "slice-0": { + "db_mycat_1": { + "SELECT * FROM `tbl_mycat_global_one` WHERE `name`='haha'", + }, + }, + }, + { + "slice-1": { + "db_mycat_2": { + "SELECT * FROM `tbl_mycat_global_one` WHERE `name`='haha'", + }, + }, + }, + { + "slice-1": { + "db_mycat_3": { + "SELECT * FROM `tbl_mycat_global_one` WHERE `name`='haha'", + }, }, }, }, }, + { db: "db_mycat", sql: "select * from db_mycat.tbl_mycat_global_one where name='haha'", - sqls: map[string]map[string][]string{ - "slice-0": { - "db_mycat_0": { - "SELECT * FROM `db_mycat_0`.`tbl_mycat_global_one` WHERE `name`='haha'", + randomSqls: []map[string]map[string][]string{ + { + "slice-0": { + "db_mycat_0": { + "SELECT * FROM `db_mycat_0`.`tbl_mycat_global_one` WHERE `name`='haha'", + }, + }, + }, + { + "slice-0": { + "db_mycat_1": { + "SELECT * FROM `db_mycat_1`.`tbl_mycat_global_one` WHERE `name`='haha'", + }, + }, + }, + { + "slice-1": { + "db_mycat_2": { + "SELECT * FROM `db_mycat_2`.`tbl_mycat_global_one` WHERE `name`='haha'", + }, + }, + }, + { + "slice-1": { + "db_mycat_3": { + "SELECT * FROM `db_mycat_3`.`tbl_mycat_global_one` WHERE `name`='haha'", + }, }, }, }, }, + { db: "db_mycat", sql: "select * from db_mycat.tbl_mycat_global_one where db_mycat.tbl_mycat_global_one.name='haha'", - sqls: map[string]map[string][]string{ - "slice-0": { - "db_mycat_0": { - "SELECT * FROM `db_mycat_0`.`tbl_mycat_global_one` WHERE `db_mycat_0`.`tbl_mycat_global_one`.`name`='haha'", + randomSqls: []map[string]map[string][]string{ + { + "slice-0": { + "db_mycat_0": { + "SELECT * FROM `db_mycat_0`.`tbl_mycat_global_one` WHERE `db_mycat_0`.`tbl_mycat_global_one`.`name`='haha'", + }, + }, + }, + { + "slice-0": { + "db_mycat_1": { + "SELECT * FROM `db_mycat_1`.`tbl_mycat_global_one` WHERE `db_mycat_1`.`tbl_mycat_global_one`.`name`='haha'", + }, + }, + }, + { + "slice-1": { + "db_mycat_2": { + "SELECT * FROM `db_mycat_2`.`tbl_mycat_global_one` WHERE `db_mycat_2`.`tbl_mycat_global_one`.`name`='haha'", + }, + }, + }, + { + "slice-1": { + "db_mycat_3": { + "SELECT * FROM `db_mycat_3`.`tbl_mycat_global_one` WHERE `db_mycat_3`.`tbl_mycat_global_one`.`name`='haha'", + }, }, }, }, }, + { db: "db_mycat", sql: "select * from db_mycat.tbl_mycat_global_one, tbl_mycat_global_two where tbl_mycat_global_one.name='haha' and tbl_mycat_global_two.name='hehe'", - sqls: map[string]map[string][]string{ - "slice-0": { - "db_mycat_0": { - "SELECT * FROM (`db_mycat_0`.`tbl_mycat_global_one`) JOIN `tbl_mycat_global_two` WHERE `tbl_mycat_global_one`.`name`='haha' AND `tbl_mycat_global_two`.`name`='hehe'", + randomSqls: []map[string]map[string][]string{ + { + "slice-0": { + "db_mycat_0": { + "SELECT * FROM (`db_mycat_0`.`tbl_mycat_global_one`) JOIN `tbl_mycat_global_two` WHERE `tbl_mycat_global_one`.`name`='haha' AND `tbl_mycat_global_two`.`name`='hehe'", + }, + }, + }, + { + "slice-0": { + "db_mycat_1": { + "SELECT * FROM (`db_mycat_1`.`tbl_mycat_global_one`) JOIN `tbl_mycat_global_two` WHERE `tbl_mycat_global_one`.`name`='haha' AND `tbl_mycat_global_two`.`name`='hehe'", + }, + }, + }, + { + "slice-1": { + "db_mycat_2": { + "SELECT * FROM (`db_mycat_2`.`tbl_mycat_global_one`) JOIN `tbl_mycat_global_two` WHERE `tbl_mycat_global_one`.`name`='haha' AND `tbl_mycat_global_two`.`name`='hehe'", + }, + }, + }, + { + "slice-1": { + "db_mycat_3": { + "SELECT * FROM (`db_mycat_3`.`tbl_mycat_global_one`) JOIN `tbl_mycat_global_two` WHERE `tbl_mycat_global_one`.`name`='haha' AND `tbl_mycat_global_two`.`name`='hehe'", + }, }, }, }, }, + { db: "db_mycat", sql: "select * from db_mycat.tbl_mycat_global_one, db_mycat.tbl_mycat_global_two where db_mycat.tbl_mycat_global_one.name='haha' and db_mycat.tbl_mycat_global_two.name='hehe'", - sqls: map[string]map[string][]string{ - "slice-0": { - "db_mycat_0": { - "SELECT * FROM (`db_mycat_0`.`tbl_mycat_global_one`) JOIN `db_mycat_0`.`tbl_mycat_global_two` WHERE `db_mycat_0`.`tbl_mycat_global_one`.`name`='haha' AND `db_mycat_0`.`tbl_mycat_global_two`.`name`='hehe'", + randomSqls: []map[string]map[string][]string{ + { + "slice-0": { + "db_mycat_0": { + "SELECT * FROM (`db_mycat_0`.`tbl_mycat_global_one`) JOIN `db_mycat_0`.`tbl_mycat_global_two` WHERE `db_mycat_0`.`tbl_mycat_global_one`.`name`='haha' AND `db_mycat_0`.`tbl_mycat_global_two`.`name`='hehe'", + }, + }, + }, + { + "slice-0": { + "db_mycat_1": { + "SELECT * FROM (`db_mycat_1`.`tbl_mycat_global_one`) JOIN `db_mycat_1`.`tbl_mycat_global_two` WHERE `db_mycat_1`.`tbl_mycat_global_one`.`name`='haha' AND `db_mycat_1`.`tbl_mycat_global_two`.`name`='hehe'", + }, + }, + }, + { + "slice-1": { + "db_mycat_2": { + "SELECT * FROM (`db_mycat_2`.`tbl_mycat_global_one`) JOIN `db_mycat_2`.`tbl_mycat_global_two` WHERE `db_mycat_2`.`tbl_mycat_global_one`.`name`='haha' AND `db_mycat_2`.`tbl_mycat_global_two`.`name`='hehe'", + }, + }, + }, + { + "slice-1": { + "db_mycat_3": { + "SELECT * FROM (`db_mycat_3`.`tbl_mycat_global_one`) JOIN `db_mycat_3`.`tbl_mycat_global_two` WHERE `db_mycat_3`.`tbl_mycat_global_one`.`name`='haha' AND `db_mycat_3`.`tbl_mycat_global_two`.`name`='hehe'", + }, + }, + }, + }, + }, + + { + db: "db_mycat", + sql: "select A.name, B.name from db_mycat.tbl_mycat_global_one A, db_mycat.tbl_mycat_global_two B where A.name='haha' and B.name='hehe' order by B.col2 desc", + randomSqls: []map[string]map[string][]string{ + { + "slice-0": { + "db_mycat_0": { + "SELECT `A`.`name`,`B`.`name`,`B`.`col2` FROM (`db_mycat_0`.`tbl_mycat_global_one` AS `A`) JOIN `db_mycat_0`.`tbl_mycat_global_two` AS `B` WHERE `A`.`name`='haha' AND `B`.`name`='hehe' ORDER BY `B`.`col2` DESC", + }, + }, + }, + { + "slice-0": { + "db_mycat_1": { + "SELECT `A`.`name`,`B`.`name`,`B`.`col2` FROM (`db_mycat_1`.`tbl_mycat_global_one` AS `A`) JOIN `db_mycat_1`.`tbl_mycat_global_two` AS `B` WHERE `A`.`name`='haha' AND `B`.`name`='hehe' ORDER BY `B`.`col2` DESC", + }, + }, + }, + { + "slice-1": { + "db_mycat_2": { + "SELECT `A`.`name`,`B`.`name`,`B`.`col2` FROM (`db_mycat_2`.`tbl_mycat_global_one` AS `A`) JOIN `db_mycat_2`.`tbl_mycat_global_two` AS `B` WHERE `A`.`name`='haha' AND `B`.`name`='hehe' ORDER BY `B`.`col2` DESC", + }, + }, + }, + { + "slice-1": { + "db_mycat_3": { + "SELECT `A`.`name`,`B`.`name`,`B`.`col2` FROM (`db_mycat_3`.`tbl_mycat_global_one` AS `A`) JOIN `db_mycat_3`.`tbl_mycat_global_two` AS `B` WHERE `A`.`name`='haha' AND `B`.`name`='hehe' ORDER BY `B`.`col2` DESC", + }, }, }, }, @@ -3317,6 +3562,7 @@ func TestSelectGlobalTableMycat(t *testing.T) { } for _, test := range tests { + // TODO: random slice to be fixed 100% success t.Run(test.sql, getTestFunc(ns, test)) } } diff --git a/proxy/plan/plan_test.go b/proxy/plan/plan_test.go index 65df0d27..c8a1a7e2 100644 --- a/proxy/plan/plan_test.go +++ b/proxy/plan/plan_test.go @@ -16,6 +16,7 @@ package plan import ( "encoding/json" + "fmt" "sync/atomic" "testing" @@ -27,10 +28,11 @@ import ( ) type SQLTestcase struct { - db string - sql string - sqls map[string]map[string][]string - hasErr bool + db string + sql string + sqls map[string]map[string][]string + randomSqls []map[string]map[string][]string + hasErr bool } type OrderSequence struct { @@ -75,7 +77,7 @@ func getTestFunc(info *PlanInfo, test SQLTestcase) func(t *testing.T) { t.Fatalf("parse sql error: %v", err) } - p, err := BuildPlan(stmt, info.phyDBs, test.db, test.sql, info.rt, info.seqs) + p, err := BuildPlan(stmt, info.phyDBs, test.db, test.sql, info.rt, info.seqs, nil) if err != nil { if test.hasErr { t.Logf("BuildPlan got expect error, sql: %s, err: %v", test.sql, err) @@ -96,6 +98,8 @@ func getTestFunc(info *PlanInfo, test SQLTestcase) func(t *testing.T) { actualSQLs = plan.sqls case *ExplainPlan: actualSQLs = plan.sqls + case *SelectLastInsertIDPlan: + actualSQLs = make(map[string]map[string][]string) case *UnshardPlan: actualSQLs = make(map[string]map[string][]string) dbSQLs := make(map[string][]string) @@ -109,12 +113,165 @@ func getTestFunc(info *PlanInfo, test SQLTestcase) func(t *testing.T) { if actualSQLs == nil { t.Fatalf("get sqls error: %v", err) } - + if len(test.randomSqls) > 0 { + if !checkRandomSQLs(test.randomSqls, actualSQLs) { + fmt.Println("checkRandomSQLs") + t.Errorf("not equal, expect: %v, actual: %v", test.randomSqls, actualSQLs) + return + } + return + } if !checkSQLs(test.sqls, actualSQLs) { t.Errorf("not equal, expect: %v, actual: %v", test.sqls, actualSQLs) } } } +func TestCheckRandomSQLs(t *testing.T) { + randomSqlsFirst := []map[string]map[string][]string{ + { + "slice0": {"db0": {"sql1", "sql2"}, "db1": {"sql1"}}, + "slice1": {"db2": {"sql1", "sql2"}, "db3": {"sql1"}}, + }, + } + randomSqlsSecond := []map[string]map[string][]string{ + { + "slice0": {"db0": {"sql1", "sql2"}}, + }, + { + "slice0": {"db1": {"sql1"}}, + }, + { + "slice1": {"db2": {"sql1", "sql2"}}, + }, + { + "slice1": {"db3": {"sql1"}}, + }, + } + tests := []struct { + name string + actual map[string]map[string][]string + expected bool + }{ + { + name: "Normal match", + actual: map[string]map[string][]string{ + "slice0": {"db0": {"sql1", "sql2"}}, + }, + expected: true, + }, + { + name: "Normal match", + actual: map[string]map[string][]string{ + "slice0": {"db0": {"sql2", "sql1"}}, + }, + expected: true, + }, + { + name: "Normal match", + actual: map[string]map[string][]string{ + "slice0": {"db1": {"sql1"}}, + }, + expected: true, + }, + { + name: "Normal match", + actual: map[string]map[string][]string{ + "slice1": {"db3": {"sql1"}}, + }, + expected: true, + }, + { + name: "Normal match", + actual: map[string]map[string][]string{ + "slice1": {"db2": {"sql2", "sql1"}}, + }, + expected: true, + }, + { + name: "Mismatched SQL list", + actual: map[string]map[string][]string{ + "slice1": {"db2": {"sql2"}}, + }, + expected: false, + }, + { + name: "Extra key in actual", + actual: map[string]map[string][]string{ + "slice1": {"db1": {"sql1"}}, + }, + expected: false, + }, + { + name: "Empty maps", + actual: map[string]map[string][]string{}, + expected: true, + }, + } + for _, test := range tests { + t.Run(test.name, func(t *testing.T) { + result := checkRandomSQLs(randomSqlsFirst, test.actual) + if result != test.expected { + t.Errorf("Test %s failed: expected %v, got %v", test.name, test.expected, result) + } + result = checkRandomSQLs(randomSqlsSecond, test.actual) + if result != test.expected { + t.Errorf("Test %s failed: expected %v, got %v", test.name, test.expected, result) + } + }) + } +} + +// 用来判断全局表生成所有的DB和SQL是否和randomSqls对应,actual 没有多db 的情况,例如:"slice0": {"db0": {"sql1", "sql2"}, "db1": {"sql1"}} +func checkRandomSQLs(randomSqls []map[string]map[string][]string, actual map[string]map[string][]string) bool { + // sliceMatch 检查两个切片是否包含相同的元素,不考虑顺序 + sliceMatch := func(a, b []string) bool { + if len(a) != len(b) { + return false + } + count := make(map[string]int) + for _, v := range a { + count[v]++ + } + for _, v := range b { + if count[v] == 0 { + return false + } + count[v]-- + } + return true + } + // 遍历 actual 中的每个 slice 和其对应的 db-SQL 映射 + for slice, actualDbMap := range actual { + foundSliceMatch := false + for _, randomSQLMap := range randomSqls { + if randomDbMap, ok := randomSQLMap[slice]; ok { + // 检查当前 slice 的所有 db 和 SQL 是否匹配 + allDbSQLMatch := true + for db, actualSQLs := range actualDbMap { + if expectedSQLs, ok := randomDbMap[db]; ok { + if !sliceMatch(expectedSQLs, actualSQLs) { + allDbSQLMatch = false + break + } + } else { + // 如果 actual 中的 db 在 randomDbMap 中不存在 + allDbSQLMatch = false + break + } + } + if allDbSQLMatch { + foundSliceMatch = true + break + } + } + } + if !foundSliceMatch { + return false + } + } + // 如果所有检查都通过,则返回 true + return true +} func createNamespace(nsStr string) (*models.Namespace, error) { ns := &models.Namespace{} @@ -431,6 +588,34 @@ func preparePlanInfo() (*PlanInfo, error) { "databases": [ "db_mycat_[0-3]" ] + }, + { + "db": "db_mycat", + "table": "tbl_mycat_global_3", + "type": "global", + "locations": [ + 2, + 2 + ], + "slices": [ + "slice-0", + "slice-1" + ], + "databases": [ + "db_mycat_[0-3]" + ] + }, + { + "db": "db_mycat", + "table": "tbl_mycat_global_4", + "type": "global", + "locations": [1], + "slices": [ + "slice-0" + ], + "databases": [ + "db_mycat_0" + ] }, { "db": "db_mycat", @@ -465,6 +650,18 @@ func preparePlanInfo() (*PlanInfo, error) { "table": "tbl_ks", "type": "test", "pk_name": "user_id" + }, + { + "db": "db_mycat", + "table": "tbl_mycat_global_3", + "type": "mycat", + "pk_name": "id" + }, + { + "db": "db_mycat", + "table": "tbl_mycat_global_4", + "type": "mycat", + "pk_name": "id" } ], "users": [ diff --git a/proxy/plan/plan_unshard.go b/proxy/plan/plan_unshard.go index 7ff76ae9..453eccae 100644 --- a/proxy/plan/plan_unshard.go +++ b/proxy/plan/plan_unshard.go @@ -16,6 +16,8 @@ package plan import ( "fmt" + "github.com/XiaoMi/Gaea/parser" + "github.com/XiaoMi/Gaea/proxy/router" "strings" "github.com/XiaoMi/Gaea/mysql" @@ -41,6 +43,17 @@ type UnshardPlan struct { // to a non-“magic” value (that is, a value that is not NULL and not 0). type SelectLastInsertIDPlan struct { basePlan + asName string +} + +type SetPlan struct { + basePlan + sql string + stmt ast.StmtNode +} + +type IgnorePlan struct { + basePlan } // IsSelectLastInsertIDStmt check if the statement is SELECT LAST_INSERT_ID() @@ -66,6 +79,16 @@ func IsSelectLastInsertIDStmt(stmt ast.StmtNode) bool { return f.FnName.L == "last_insert_id" } +// IsSetStmt check if the statement is set comment +func IsSetStmt(stmt ast.StmtNode) bool { + _, ok := stmt.(*ast.SetStmt) + if !ok { + return false + } + + return true +} + // CreateUnshardPlan constructor of UnshardPlan func CreateUnshardPlan(stmt ast.StmtNode, phyDBs map[string]string, db string, tableNames []*ast.TableName) (*UnshardPlan, error) { p := &UnshardPlan{ @@ -82,6 +105,23 @@ func CreateUnshardPlan(stmt ast.StmtNode, phyDBs map[string]string, db string, t return p, nil } +// PreCreateUnshardPlan constructor of UnshardPlan +// if db not in phyDBs, return false +// if db is empty, like `select user()` or `select * from t`, will not return true and use session db cause error may return from backend mysql +func PreCreateUnshardPlan(sql string, phyDBs map[string]string, db string) (*UnshardPlan, error) { + if phyDB, ok := phyDBs[db]; ok { + if db != phyDB { + return nil, fmt.Errorf("db name not match, db: %s, phyDB: %s", db, phyDB) + } + } + + return &UnshardPlan{ + db: db, + phyDBs: phyDBs, + sql: sql, + }, nil +} + func rewriteUnshardTableName(phyDBs map[string]string, tableNames []*ast.TableName) { for _, tableName := range tableNames { if phyDB, ok := phyDBs[tableName.Schema.String()]; ok { @@ -99,22 +139,35 @@ func generateUnshardingSQL(stmt ast.StmtNode) (string, error) { } // CreateSelectLastInsertIDPlan constructor of SelectLastInsertIDPlan -func CreateSelectLastInsertIDPlan() *SelectLastInsertIDPlan { - return &SelectLastInsertIDPlan{} +func CreateSelectLastInsertIDPlan(stmt *ast.SelectStmt) *SelectLastInsertIDPlan { + asName := "" + if len(stmt.Fields.Fields) > 0 && stmt.Fields.Fields[0].AsName.String() != "" { + asName = stmt.Fields.Fields[0].AsName.String() + } + return &SelectLastInsertIDPlan{asName: asName} +} + +// CreateSetPlan constructor of SetPlan +func CreateSetPlan(sql string, stmt ast.StmtNode) *SetPlan { + return &SetPlan{sql: sql, + stmt: stmt} +} + +// CreateIgnoreSetPlan constructor of SetPlan +func CreateIgnorePlan() *IgnorePlan { + return &IgnorePlan{} } // ExecuteIn implement Plan func (p *UnshardPlan) ExecuteIn(reqCtx *util.RequestContext, se Executor) (*mysql.Result, error) { - r, err := se.ExecuteSQL(reqCtx, reqCtx.Get(util.DefaultSlice).(string), p.db, p.sql) + r, err := se.ExecuteSQL(reqCtx, reqCtx.GetDefaultSlice(), p.db, p.sql) if err != nil { return nil, err } // set last insert id to session - if _, ok := p.stmt.(*ast.InsertStmt); ok { - if r.InsertID != 0 { - se.SetLastInsertID(r.InsertID) - } + if r.InsertID != 0 { + se.SetLastInsertID(r.InsertID) } return r, nil @@ -122,22 +175,36 @@ func (p *UnshardPlan) ExecuteIn(reqCtx *util.RequestContext, se Executor) (*mysq // ExecuteIn implement Plan func (p *SelectLastInsertIDPlan) ExecuteIn(reqCtx *util.RequestContext, se Executor) (*mysql.Result, error) { - r := createLastInsertIDResult(se.GetLastInsertID()) + r := createLastInsertIDResult(se.GetLastInsertID(), p.asName) return r, nil } -func createLastInsertIDResult(lastInsertID uint64) *mysql.Result { +// ExecuteIn implement Plan +func (p *SetPlan) ExecuteIn(reqCtx *util.RequestContext, se Executor) (*mysql.Result, error) { + if stmt, ok := p.stmt.(*ast.SetStmt); ok { + se.HandleSet(reqCtx, p.sql, stmt) + } + + return nil, nil +} + +// ExecuteIn implement Plan +func (p *IgnorePlan) ExecuteIn(reqCtx *util.RequestContext, se Executor) (*mysql.Result, error) { + return mysql.ResultPool.GetWithoutResultSet(), nil +} + +func createLastInsertIDResult(lastInsertID uint64, asName string) *mysql.Result { name := "last_insert_id()" + if asName != "" { + name = asName + } var column = 1 - var rows [][]string + var rows [][]uint64 var names = []string{ name, } - var t = fmt.Sprintf("%d", lastInsertID) - rows = append(rows, []string{t}) - - r := new(mysql.Resultset) + rows = append(rows, []uint64{lastInsertID}) var values = make([][]interface{}, len(rows)) for i := range rows { @@ -147,10 +214,82 @@ func createLastInsertIDResult(lastInsertID uint64) *mysql.Result { } } - r, _ = mysql.BuildResultset(nil, names, values) - ret := &mysql.Result{ - Resultset: r, - } + r, _ := mysql.BuildResultset(nil, names, values) + ret := mysql.ResultPool.Get() + ret.Resultset = r return ret } + +func CheckUnshardBase(tokenId int, tokens []string, rt *router.Router, db string) (string, bool) { + ruleDB := db + tokensLen := len(tokens) + for i := 0; i < tokensLen; i++ { + if strings.ToLower(tokens[i]) != mysql.ParseTokenIdStrMap[tokenId] { + continue + } + if i+1 >= tokensLen { + continue + } + // select: select col1 from db.t where... + // delete: delete from db.t where... + dbName, tableName := parser.GetDBTable(tokens[i+1]) + //if the token[i+1] like this: db.test_shard_hash + if dbName != "" { + ruleDB = dbName + } + // if table in shard rule, is shard plan + if rt.GetRule(ruleDB, tableName) != rt.GetDefaultRule() { + return ruleDB, false + } + } + return ruleDB, true +} + +func CheckUnshardInsert(tokens []string, rt *router.Router, db string) (string, bool) { + ruleDB := db + tokensLen := len(tokens) + for i := 0; i < tokensLen; i++ { + if strings.ToLower(tokens[i]) != mysql.ParseTokenIdStrMap[mysql.TkIdInsert] { + continue + } + if i+1 >= tokensLen { + continue + } + // insert: insert into db.t(col1) values... + // replace: replace into db.t(col1) values... + dbName, tableName := parser.GetInsertDBTable(tokens[i+1]) + //if the token[i+1] like this: db.test_shard_hash + if dbName != "" { + ruleDB = dbName + } + // if table in shard rule, is shard plan + if rt.GetRule(ruleDB, tableName) != rt.GetDefaultRule() { + return ruleDB, false + } + } + return ruleDB, true +} + +func CheckUnshardUpdate(tokens []string, rt *router.Router, db string) (string, bool) { + ruleDB := db + tokensLen := len(tokens) + for i := 1; i < tokensLen; i++ { + if strings.ToLower(tokens[i]) != mysql.ParseTokenIdStrMap[mysql.TkIdUpdate] { + continue + } + if i+1 >= tokensLen { + continue + } + // update: update t set a=1 where ... + dbName, tableName := parser.GetDBTable(tokens[i-1]) + if dbName != "" { + ruleDB = dbName + } + // if table in shard rule, is shard plan + if rt.GetRule(ruleDB, tableName) != rt.GetDefaultRule() { + return ruleDB, false + } + } + return ruleDB, true +} diff --git a/proxy/plan/plan_unshard_test.go b/proxy/plan/plan_unshard_test.go index a366d492..a904a785 100644 --- a/proxy/plan/plan_unshard_test.go +++ b/proxy/plan/plan_unshard_test.go @@ -1,6 +1,28 @@ +// Copyright 2019 The Gaea Authors. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + package plan import ( + "github.com/XiaoMi/Gaea/models" + "github.com/XiaoMi/Gaea/mysql" + "github.com/XiaoMi/Gaea/parser" + "github.com/XiaoMi/Gaea/parser/ast" + "github.com/XiaoMi/Gaea/proxy/router" + "github.com/XiaoMi/Gaea/util" + "github.com/stretchr/testify/assert" + "reflect" "testing" "github.com/XiaoMi/Gaea/backend" @@ -47,3 +69,236 @@ func TestUnshardPlanWithoutDB(t *testing.T) { t.Run(test.sql, getTestFunc(ns, test)) } } + +func TestSelectInsertID(t *testing.T) { + ns, err := preparePlanInfo() + if err != nil { + t.Fatalf("prepare namespace error: %v", err) + } + tests := []SQLTestcase{ + { + db: "db_mycat", + sql: `select last_insert_id()`, + sqls: map[string]map[string][]string{}, + }, + } + for _, test := range tests { + t.Run(test.sql, getTestFunc(ns, test)) + } +} + +func TestPreCreateUnshardPlan(t *testing.T) { + sql := "select 1" + p, err := PreCreateUnshardPlan(sql, map[string]string{}, "test") + assert.Equal(t, err, nil) + assert.Equal(t, sql, p.sql) + p, err = PreCreateUnshardPlan(sql, map[string]string{"test": "test_0"}, "test") + assert.NotEqual(t, err, nil) +} + +type mockExecutor struct { +} + +func (*mockExecutor) ExecuteSQL(ctx *util.RequestContext, slice, db, sql string) (*mysql.Result, error) { + return mysql.ResultPool.Get(), nil +} + +func (*mockExecutor) ExecuteSQLs(*util.RequestContext, map[string]map[string][]string) ([]*mysql.Result, error) { + return make([]*mysql.Result, 0), nil +} + +func (*mockExecutor) SetLastInsertID(uint64) { +} + +func (*mockExecutor) GetLastInsertID() uint64 { + return 0 +} + +func (*mockExecutor) HandleSet(*util.RequestContext, string, *ast.SetStmt) (*mysql.Result, error) { + return mysql.ResultPool.Get(), nil +} + +func TestBuildPlan(t *testing.T) { + tests := []struct { + sql string + expectPlan Plan + }{ + { + sql: `select last_insert_id()`, + expectPlan: &SelectLastInsertIDPlan{}, + }, + { + sql: `set session read_only=1`, + expectPlan: &SetPlan{}, + }, + { + sql: `select 1`, + expectPlan: &UnshardPlan{}, + }, + } + for _, test := range tests { + t.Run(test.sql, func(t *testing.T) { + stmt, err := parser.ParseSQL(test.sql) + assert.Equal(t, err, nil) + p, err := BuildPlan(stmt, map[string]string{}, "test", test.sql, nil, nil, nil) + assert.Equal(t, reflect.TypeOf(test.expectPlan), reflect.TypeOf(p)) + assert.Equal(t, err, nil) + _, err = p.ExecuteIn(util.NewRequestContext(), &mockExecutor{}) + assert.Equal(t, err, nil) + }) + } + +} + +func TestIgnorePlan(t *testing.T) { + p := CreateIgnorePlan() + _, err := p.ExecuteIn(util.NewRequestContext(), &mockExecutor{}) + assert.Equal(t, err, nil) +} + +func newMockRouter() *router.Router { + r, _ := router.NewRouter(&models.Namespace{ + DefaultSlice: "slice-0", + Slices: []*models.Slice{ + { + Name: "slice-0", + }, + }, + }) + return r +} + +var ( + testTokensSelect = []string{"SELECT", "db.test_shard_hash"} + testTokensInsert = []string{"INSERT", "db.test_shard_hash"} + testTokensUpdate = []string{"UPDATE", "t", "SET", "a=1"} +) + +func TestCheckUnshardBase(t *testing.T) { + type args struct { + tokenId int + tokens []string + rt *router.Router + db string + } + tests := []struct { + name string + args args + want string + want1 bool + }{ + { + name: "Test with valid token and shard rule", + args: args{ + tokenId: 1, + tokens: testTokensSelect, + rt: newMockRouter(), + db: "db", + }, + want: "db", + want1: true, + }, + { + name: "Test without shard rule", + args: args{ + tokenId: 1, + tokens: testTokensSelect, + rt: newMockRouter(), + db: "other_db", + }, + want: "other_db", + want1: true, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + got, got1 := CheckUnshardBase(tt.args.tokenId, tt.args.tokens, tt.args.rt, tt.args.db) + assert.Equal(t, tt.want, got) + assert.Equal(t, tt.want1, got1) + }) + } +} + +func TestCheckUnshardInsert(t *testing.T) { + type args struct { + tokens []string + rt *router.Router + db string + } + tests := []struct { + name string + args args + want string + want1 bool + }{ + { + name: "Test with valid insert token and shard rule", + args: args{ + tokens: testTokensInsert, + rt: newMockRouter(), + db: "db", + }, + want: "db", + want1: true, + }, + { + name: "Test without shard rule", + args: args{ + tokens: testTokensInsert, + rt: newMockRouter(), + db: "other_db", + }, + want: "other_db", + want1: true, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + got, got1 := CheckUnshardInsert(tt.args.tokens, tt.args.rt, tt.args.db) + assert.Equal(t, tt.want, got) + assert.Equal(t, tt.want1, got1) + }) + } +} + +func TestCheckUnshardUpdate(t *testing.T) { + type args struct { + tokens []string + rt *router.Router + db string + } + tests := []struct { + name string + args args + want string + want1 bool + }{ + { + name: "Test with valid update token and shard rule", + args: args{ + tokens: testTokensUpdate, + rt: newMockRouter(), + db: "db", + }, + want: "db", + want1: true, + }, + { + name: "Test without shard rule", + args: args{ + tokens: testTokensUpdate, + rt: newMockRouter(), + db: "other_db", + }, + want: "other_db", + want1: true, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + got, got1 := CheckUnshardUpdate(tt.args.tokens, tt.args.rt, tt.args.db) + assert.Equal(t, tt.want, got) + assert.Equal(t, tt.want1, got1) + }) + } +} diff --git a/proxy/plan/util.go b/proxy/plan/util.go index 347e28a4..f0316e57 100644 --- a/proxy/plan/util.go +++ b/proxy/plan/util.go @@ -40,8 +40,8 @@ func makeList(start, end int) []int { return list } -//if value is 2016, and indexs is [2015,2016,2017] -//the result is [2015,2016] +// if value is 2016, and indexs is [2015,2016,2017] +// the result is [2015,2016] // the indexs must be sorted func makeLeList(value int, indexs []int) []int { for k, v := range indexs { @@ -52,8 +52,8 @@ func makeLeList(value int, indexs []int) []int { return nil } -//if value is 2016, and indexs is [2015,2016,2017,2018] -//the result is [2016,2017,2018] +// if value is 2016, and indexs is [2015,2016,2017,2018] +// the result is [2016,2017,2018] // the indexs must be sorted func makeGeList(value int, indexs []int) []int { for k, v := range indexs { @@ -64,8 +64,8 @@ func makeGeList(value int, indexs []int) []int { return nil } -//if value is 2016, and indexs is [2015,2016,2017,2018] -//the result is [2015] +// if value is 2016, and indexs is [2015,2016,2017,2018] +// the result is [2015] // the indexs must be sorted func makeLtList(value int, indexs []int) []int { for k, v := range indexs { @@ -76,8 +76,8 @@ func makeLtList(value int, indexs []int) []int { return nil } -//if value is 2016, and indexs is [2015,2016,2017,2018] -//the result is [2017,2018] +// if value is 2016, and indexs is [2015,2016,2017,2018] +// the result is [2017,2018] // the indexs must be sorted func makeGtList(value int, indexs []int) []int { for k, v := range indexs { @@ -88,8 +88,8 @@ func makeGtList(value int, indexs []int) []int { return nil } -//if start is 2016, end is 2017. indexs is [2015,2016,2017,2018] -//the result is [2016,2017] +// if start is 2016, end is 2017. indexs is [2015,2016,2017,2018] +// the result is [2016,2017] // the indexs must be sorted func makeBetweenList(start, end int, indexs []int) []int { var startIndex, endIndex int @@ -233,3 +233,18 @@ func distinctList(l []int) []int { } return ret } + +func removeDuplicatesString(arr1 []string, arr2 []string) []string { + m := make(map[string]int) + for _, v := range arr1 { + m[v] = 1 + } + for _, v := range arr2 { + m[v] = 1 + } + var result []string + for k := range m { + result = append(result, k) + } + return result +} diff --git a/proxy/plan/util_test.go b/proxy/plan/util_test.go index a06ad20d..8409bf56 100644 --- a/proxy/plan/util_test.go +++ b/proxy/plan/util_test.go @@ -29,6 +29,8 @@ package plan import ( + "github.com/stretchr/testify/assert" + "reflect" "sort" "testing" ) @@ -169,3 +171,75 @@ func TestMakeGtList(t *testing.T) { l4 := makeGtList(20150828, l1) testCheckList(t, l4, []int{}...) } + +func TestMakeBetweenList(t *testing.T) { + // 测试正常情况 + t.Run("Normal Case", func(t *testing.T) { + indexs := []int{10, 20, 30, 40, 50} + expected := []int{20, 30, 40} + result := makeBetweenList(20, 40, indexs) + if !reflect.DeepEqual(result, expected) { + t.Errorf("Expected %v but got %v", expected, result) + } + }) + + // 测试反转的情况 + t.Run("Reversed Range", func(t *testing.T) { + indexs := []int{10, 20, 30, 40, 50} + expected := []int{20, 30, 40} + result := makeBetweenList(40, 20, indexs) + if !reflect.DeepEqual(result, expected) { + t.Errorf("Expected %v but got %v", expected, result) + } + }) + + // 测试没有找到起始或结束索引的情况 + t.Run("Not Found Start or End Index", func(t *testing.T) { + indexs := []int{10, 20, 30, 40, 50} + expected := ([]int)(nil) + result := makeBetweenList(25, 35, indexs) + if !reflect.DeepEqual(result, expected) { + t.Errorf("Expected %v but got %v", expected, result) + } + }) + + // 测试空列表的情况 + t.Run("Empty List", func(t *testing.T) { + indexs := []int{} + expected := ([]int)(nil) + result := makeBetweenList(10, 20, indexs) + if !reflect.DeepEqual(result, expected) { + t.Errorf("Expected %v but got %v", expected, result) + } + }) + + // 测试包含重复元素的情况 + t.Run("Duplicate Elements", func(t *testing.T) { + indexs := []int{10, 20, 30, 20, 50} + expected := []int{20, 30} + result := makeBetweenList(20, 30, indexs) + if !reflect.DeepEqual(result, expected) { + t.Errorf("Expected %v but got %v", expected, result) + } + }) +} + +func TestRemoveDuplicatesString(t *testing.T) { + testCases := []struct { + arr1 []string + arr2 []string + expected []string + }{ + {[]string{}, []string{}, []string{}}, + {[]string{"a"}, []string{"b"}, []string{"a", "b"}}, + {[]string{"a", "b", "c"}, []string{"d", "e", "f"}, []string{"a", "b", "c", "d", "e", "f"}}, + {[]string{"a", "a", "b", "c"}, []string{"b", "d", "d", "e"}, []string{"a", "b", "c", "d", "e"}}, + {[]string{"a", "b", "b", "c", "c", "c"}, []string{"a", "a", "d", "d", "d", "d"}, []string{"a", "b", "c", "d"}}, + {[]string{"a", "a", "a", "a", "a"}, []string{"b", "b", "b", "b", "b"}, []string{"a", "b"}}, + } + + for _, tc := range testCases { + output := removeDuplicatesString(tc.arr1, tc.arr2) + assert.Equal(t, len(output), len(tc.expected)) + } +} diff --git a/proxy/router/numkey.go b/proxy/router/numkey.go index f742f5f7..cb1e4811 100644 --- a/proxy/router/numkey.go +++ b/proxy/router/numkey.go @@ -69,8 +69,8 @@ func ParseNumSharding(Locations []int, TableRowLimit int) ([]NumKeyRange, error) } // ParseDayRange return date of daynumber by order -//20151201-20151205 -//20151201,20151202,20151203,20151204,20151205 +// 20151201-20151205 +// 20151201,20151202,20151203,20151204,20151205 func ParseDayRange(dateRange string) ([]int, error) { timeFormat := "20060102" dateDays := make([]int, 0) @@ -123,8 +123,8 @@ func ParseDayRange(dateRange string) ([]int, error) { } // ParseMonthRange return date of month by order -//201510-201512 -//201510,201511,201512 +// 201510-201512 +// 201510,201511,201512 func ParseMonthRange(dateRange string) ([]int, error) { dateMonth := make([]int, 0) dateLength := 6 @@ -186,8 +186,8 @@ func ParseMonthRange(dateRange string) ([]int, error) { } // ParseYearRange return date of year by order -//2013-2015 -//2013,2014,2015 +// 2013-2015 +// 2013,2014,2015 func ParseYearRange(dateRange string) ([]int, error) { dateYear := make([]int, 0) dateLength := 4 diff --git a/proxy/router/router.go b/proxy/router/router.go index 8075b25c..ddf60e99 100644 --- a/proxy/router/router.go +++ b/proxy/router/router.go @@ -4,7 +4,7 @@ // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // -// http://www.apache.org/licenses/LICENSE-2.0 +// http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, @@ -25,7 +25,7 @@ type Router struct { defaultRule Rule } -//NewRouter build router according to the models of namespace +// NewRouter build router according to the models of namespace func NewRouter(namespace *models.Namespace) (*Router, error) { // copy names of slice list var sliceNames []string @@ -126,6 +126,11 @@ func (r *Router) GetRule(db, table string) Rule { } } +// GetAllRules return all shard rules +func (r *Router) GetAllRules() map[string]map[string]Rule { + return r.rules +} + func (r *Router) GetDefaultRule() Rule { return r.defaultRule } diff --git a/proxy/router/rule.go b/proxy/router/rule.go index 74213b04..672de64b 100644 --- a/proxy/router/rule.go +++ b/proxy/router/rule.go @@ -636,3 +636,7 @@ func getRealDatabases(dbs []string) ([]string, error) { func IsMycatShardingRule(ruleType string) bool { return ruleType == MycatModRuleType || ruleType == MycatLongRuleType || ruleType == MycatMurmurRuleType || ruleType == MycatPaddingModRuleType || ruleType == MycatStringRuleType } + +func GetRealDatabases(dbs []string) ([]string, error) { + return getRealDatabases(dbs) +} diff --git a/proxy/router/rule_test.go b/proxy/router/rule_test.go index e8eff0f1..ffbcefc4 100644 --- a/proxy/router/rule_test.go +++ b/proxy/router/rule_test.go @@ -16,6 +16,7 @@ package router import ( "fmt" + "github.com/stretchr/testify/assert" "testing" "github.com/XiaoMi/Gaea/models" @@ -222,7 +223,7 @@ func TestParseMycatRule(t *testing.T) { } } -//TODO YYYY-MM-DD HH:MM:SS,YYYY-MM-DD test +// TODO YYYY-MM-DD HH:MM:SS,YYYY-MM-DD test func TestParseDateRule(t *testing.T) { var s = ` {"name": "gaea_namespace_1", @@ -458,3 +459,367 @@ func TestParseRule(t *testing.T) { t.Fatal("nil error") } } + +type MockShard struct { + FindForKeyFunc func(key interface{}) (int, error) +} + +func (m *MockShard) FindForKey(key interface{}) (int, error) { + return m.FindForKeyFunc(key) +} + +type MockRule struct { + GetDBFunc func() string + GetTableFunc func() string + GetShardingColumnFunc func() string + IsLinkedRuleFunc func() bool + GetShardFunc func() Shard + FindTableIndexFunc func(key interface{}) (int, error) + GetSliceFunc func(i int) string + GetSliceIndexFromTableIndexFunc func(i int) int + GetSlicesFunc func() []string + GetSubTableIndexesFunc func() []int + GetTypeFunc func() string + GetDatabaseNameByTableIndexFunc func(index int) (string, error) + GetTableIndexByDatabaseNameFunc func(phyDB string) (int, bool) + GetDatabasesFunc func() []string + GetFirstTableIndexFunc func() int + GetLastTableIndexFunc func() int +} + +func (m *MockRule) GetDB() string { + return m.GetDBFunc() +} + +func (m *MockRule) GetTable() string { + return m.GetTableFunc() +} + +func (m *MockRule) GetShardingColumn() string { + return m.GetShardingColumnFunc() +} + +func (m *MockRule) IsLinkedRule() bool { + return m.IsLinkedRuleFunc() +} + +func (m *MockRule) GetShard() Shard { + return m.GetShardFunc() +} + +func (m *MockRule) FindTableIndex(key interface{}) (int, error) { + return m.FindTableIndexFunc(key) +} + +func (m *MockRule) GetSlice(i int) string { + return m.GetSliceFunc(i) +} + +func (m *MockRule) GetSliceIndexFromTableIndex(i int) int { + return m.GetSliceIndexFromTableIndexFunc(i) +} + +func (m *MockRule) GetSlices() []string { + return m.GetSlicesFunc() +} + +func (m *MockRule) GetSubTableIndexes() []int { + return m.GetSubTableIndexesFunc() +} + +func (m *MockRule) GetType() string { + return m.GetTypeFunc() +} + +func (m *MockRule) GetDatabaseNameByTableIndex(index int) (string, error) { + return m.GetDatabaseNameByTableIndexFunc(index) +} + +func (m *MockRule) GetTableIndexByDatabaseName(phyDB string) (int, bool) { + return m.GetTableIndexByDatabaseNameFunc(phyDB) +} + +func (m *MockRule) GetDatabases() []string { + return m.GetDatabasesFunc() +} +func (m *MockRule) GetFirstTableIndex() int { + return m.GetFirstTableIndexFunc() +} +func (m *MockRule) GetLastTableIndex() int { + return m.GetLastTableIndexFunc() +} + +func TestCreateLinkedRule(t *testing.T) { + rules := map[string]map[string]Rule{ + "db1": { + "table1": &MockRule{}, + }, + } + shard := &models.Shard{ + Type: LinkedTableRuleType, + DB: "db1", + Table: "table2", + ParentTable: "table1", + Key: "key1", + } + + t.Run("valid creation", func(t *testing.T) { + expectedLinkedRule := &LinkedRule{ + db: "db1", + table: "table2", + shardingColumn: "key1", + linkToRule: &BaseRule{ + db: "db1", + table: "table2", + shardingColumn: "key1", + }, + } + rules["db1"]["table1"] = &BaseRule{ + db: "db1", + table: "table2", + shardingColumn: "key1", + } + linkedRule, err := createLinkedRule(rules, shard) + assert.NoError(t, err) + assert.Equal(t, expectedLinkedRule, linkedRule) + }) + + t.Run("invalid type", func(t *testing.T) { + shard.Type = "other" + _, err := createLinkedRule(rules, shard) + assert.Error(t, err) + }) + + t.Run("db not found", func(t *testing.T) { + shard.DB = "unknown" + _, err := createLinkedRule(rules, shard) + assert.Error(t, err) + }) + + t.Run("parent table not found", func(t *testing.T) { + shard.DB = "db1" + shard.ParentTable = "unknown" + _, err := createLinkedRule(rules, shard) + assert.Error(t, err) + }) + + t.Run("cannot link to another linked rule", func(t *testing.T) { + mockLinkToRule := &MockRule{} + mockLinkToRule.GetTypeFunc = func() string { + return LinkedTableRuleType + } + _, err := createLinkedRule(rules, shard) + assert.Error(t, err) + }) + + t.Run("must link to a base rule", func(t *testing.T) { + mockLinkToRule := &MockRule{} + mockLinkToRule.GetTypeFunc = func() string { + return "other" + } + _, err := createLinkedRule(rules, shard) + assert.Error(t, err) + }) +} + +func TestBaseRuleMethods(t *testing.T) { + baseRule := &BaseRule{ + db: "db1", + table: "table1", + shardingColumn: "column1", + shard: &MockShard{}, + slices: []string{"slice1", "slice2"}, + tableToSlice: map[int]int{0: 0, 1: 1}, + subTableIndexes: []int{0, 1}, + ruleType: "base", + mycatDatabases: []string{"db1", "db2"}, + mycatDatabaseToTableIndexMap: map[string]int{ + "db1": 0, + "db2": 1, + }, + } + + t.Run("GetDB", func(t *testing.T) { + assert.Equal(t, "db1", baseRule.GetDB()) + }) + + t.Run("GetTable", func(t *testing.T) { + assert.Equal(t, "table1", baseRule.GetTable()) + }) + + t.Run("GetShardingColumn", func(t *testing.T) { + assert.Equal(t, "column1", baseRule.GetShardingColumn()) + }) + + t.Run("IsLinkedRule", func(t *testing.T) { + assert.False(t, baseRule.IsLinkedRule()) + }) + + t.Run("GetShard", func(t *testing.T) { + assert.NotNil(t, baseRule.GetShard()) + }) + + t.Run("FindTableIndex", func(t *testing.T) { + mockShard := &MockShard{ + FindForKeyFunc: func(key interface{}) (int, error) { + return 0, nil + }, + } + baseRule.shard = mockShard + index, err := baseRule.FindTableIndex("key") + assert.NoError(t, err) + assert.Equal(t, 0, index) + }) + + t.Run("GetSlice", func(t *testing.T) { + assert.Equal(t, "slice1", baseRule.GetSlice(0)) + }) + + t.Run("GetSliceIndexFromTableIndex", func(t *testing.T) { + assert.Equal(t, 0, baseRule.GetSliceIndexFromTableIndex(0)) + }) + + t.Run("GetSlices", func(t *testing.T) { + assert.Equal(t, []string{"slice1", "slice2"}, baseRule.GetSlices()) + }) + + t.Run("GetSubTableIndexes", func(t *testing.T) { + assert.Equal(t, []int{0, 1}, baseRule.GetSubTableIndexes()) + }) + + t.Run("GetFirstTableIndex", func(t *testing.T) { + assert.Equal(t, 0, baseRule.GetFirstTableIndex()) + }) + + t.Run("GetLastTableIndex", func(t *testing.T) { + assert.Equal(t, 1, baseRule.GetLastTableIndex()) + }) + + t.Run("GetType", func(t *testing.T) { + assert.Equal(t, "base", baseRule.GetType()) + }) + + t.Run("GetDatabaseNameByTableIndex", func(t *testing.T) { + name, err := baseRule.GetDatabaseNameByTableIndex(0) + assert.NoError(t, err) + assert.Equal(t, "db1", name) + }) + + t.Run("GetTableIndexByDatabaseName", func(t *testing.T) { + index, ok := baseRule.GetTableIndexByDatabaseName("db1") + assert.True(t, ok) + assert.Equal(t, 0, index) + }) + + t.Run("GetDatabases", func(t *testing.T) { + assert.Equal(t, []string{"db1", "db2"}, baseRule.GetDatabases()) + }) +} + +func TestLinkedRuleMethods(t *testing.T) { + baseRule := &BaseRule{ + db: "db1", + table: "table1", + shardingColumn: "column1", + shard: &MockShard{}, + slices: []string{"slice1", "slice2"}, + tableToSlice: map[int]int{0: 0, 1: 1}, + subTableIndexes: []int{0, 1}, + ruleType: "base", + mycatDatabases: []string{"db1", "db2"}, + mycatDatabaseToTableIndexMap: map[string]int{ + "db1": 0, + "db2": 1, + }, + } + linkedRule := &LinkedRule{ + db: "db1", + table: "table2", + shardingColumn: "column1", + linkToRule: baseRule, + } + + t.Run("GetDB", func(t *testing.T) { + assert.Equal(t, "db1", linkedRule.GetDB()) + }) + + t.Run("GetTable", func(t *testing.T) { + assert.Equal(t, "table2", linkedRule.GetTable()) + }) + + t.Run("GetParentDB", func(t *testing.T) { + assert.Equal(t, "db1", linkedRule.GetParentDB()) + }) + + t.Run("GetParentTable", func(t *testing.T) { + assert.Equal(t, "table1", linkedRule.GetParentTable()) + }) + + t.Run("GetShardingColumn", func(t *testing.T) { + assert.Equal(t, "column1", linkedRule.GetShardingColumn()) + }) + + t.Run("IsLinkedRule", func(t *testing.T) { + assert.True(t, linkedRule.IsLinkedRule()) + }) + + t.Run("GetShard", func(t *testing.T) { + assert.NotNil(t, linkedRule.GetShard()) + }) + + t.Run("FindTableIndex", func(t *testing.T) { + mockShard := &MockShard{ + FindForKeyFunc: func(key interface{}) (int, error) { + return 0, nil + }, + } + baseRule.shard = mockShard + index, err := linkedRule.FindTableIndex("key") + assert.NoError(t, err) + assert.Equal(t, 0, index) + }) + + t.Run("GetFirstTableIndex", func(t *testing.T) { + assert.Equal(t, 0, linkedRule.GetFirstTableIndex()) + }) + + t.Run("GetLastTableIndex", func(t *testing.T) { + assert.Equal(t, 1, linkedRule.GetLastTableIndex()) + }) + + t.Run("GetSlice", func(t *testing.T) { + assert.Equal(t, "slice1", linkedRule.GetSlice(0)) + }) + + t.Run("GetSliceIndexFromTableIndex", func(t *testing.T) { + assert.Equal(t, 0, linkedRule.GetSliceIndexFromTableIndex(0)) + }) + + t.Run("GetSlices", func(t *testing.T) { + assert.Equal(t, []string{"slice1", "slice2"}, linkedRule.GetSlices()) + }) + + t.Run("GetSubTableIndexes", func(t *testing.T) { + assert.Equal(t, []int{0, 1}, linkedRule.GetSubTableIndexes()) + }) + + t.Run("GetType", func(t *testing.T) { + assert.Equal(t, "base", linkedRule.GetType()) + }) + + t.Run("GetDatabaseNameByTableIndex", func(t *testing.T) { + name, err := linkedRule.GetDatabaseNameByTableIndex(0) + assert.NoError(t, err) + assert.Equal(t, "db1", name) + }) + + t.Run("GetDatabases", func(t *testing.T) { + assert.Equal(t, []string{"db1", "db2"}, linkedRule.GetDatabases()) + }) + + t.Run("GetTableIndexByDatabaseName", func(t *testing.T) { + index, ok := linkedRule.GetTableIndexByDatabaseName("db1") + assert.True(t, ok) + assert.Equal(t, 0, index) + }) +} diff --git a/proxy/router/shard.go b/proxy/router/shard.go index 5f9a09b6..91758630 100644 --- a/proxy/router/shard.go +++ b/proxy/router/shard.go @@ -226,7 +226,7 @@ func (s *DateYearShard) getNumYear(key interface{}) (int, error) { return -1, NewKeyError("Unexpected key variable type %T", key) } -//the format of date is: YYYY-MM-DD HH:MM:SS,YYYY-MM-DD or unix timestamp(int) +// the format of date is: YYYY-MM-DD HH:MM:SS,YYYY-MM-DD or unix timestamp(int) func (s *DateYearShard) FindForKey(key interface{}) (int, error) { return s.getNumYear(key) } @@ -287,7 +287,7 @@ func (s *DateMonthShard) getNumYearMonth(key interface{}) (int, error) { return -1, NewKeyError("Unexpected key variable type %T", key) } -//the format of date is: YYYY-MM-DD HH:MM:SS,YYYY-MM-DD or unix timestamp(int) +// the format of date is: YYYY-MM-DD HH:MM:SS,YYYY-MM-DD or unix timestamp(int) func (s *DateMonthShard) FindForKey(key interface{}) (int, error) { return s.getNumYearMonth(key) } @@ -348,7 +348,7 @@ func (s *DateDayShard) getNumYearMonthDay(key interface{}) (int, error) { return -1, NewKeyError("Unexpected key variable type %T", key) } -//the format of date is: YYYY-MM-DD HH:MM:SS,YYYY-MM-DD or unix timestamp(int) +// the format of date is: YYYY-MM-DD HH:MM:SS,YYYY-MM-DD or unix timestamp(int) func (s *DateDayShard) FindForKey(key interface{}) (int, error) { return s.getNumYearMonthDay(key) } diff --git a/proxy/router/shard_mycat.go b/proxy/router/shard_mycat.go index 8192b4e1..25dd8829 100644 --- a/proxy/router/shard_mycat.go +++ b/proxy/router/shard_mycat.go @@ -21,9 +21,9 @@ import ( "strconv" "strings" - "github.com/emirpasic/gods/maps/treemap" "github.com/XiaoMi/Gaea/util" "github.com/XiaoMi/Gaea/util/hack" + "github.com/emirpasic/gods/maps/treemap" ) // MycatPartitionModShard mycat route algorithm: PartitionByMod diff --git a/proxy/sequence/mysql.go b/proxy/sequence/mysql.go index f427f97b..b2a964b6 100644 --- a/proxy/sequence/mysql.go +++ b/proxy/sequence/mysql.go @@ -26,26 +26,28 @@ import ( // MySQLSequence struct of sequence number with specific sequence name type MySQLSequence struct { - slice *backend.Slice - pkName string - seqName string - lock *sync.Mutex - curr int64 - max int64 - sql string + slice *backend.Slice + pkName string + seqName string + lock *sync.Mutex + curr int64 + max int64 + maxLimit int64 // 限制全局自增最大值 + sql string } // NewMySQLSequence init sequence item // TODO: 直接注入slice需要考虑关闭的问题, 目前是在Namespace中管理Slice的关闭的. 如果单独使用MySQLSequence, 需要注意. -func NewMySQLSequence(slice *backend.Slice, seqName, pkName string) *MySQLSequence { +func NewMySQLSequence(slice *backend.Slice, seqName, pkName string, maxLimit int64) *MySQLSequence { t := &MySQLSequence{ - slice: slice, - seqName: seqName, - pkName: pkName, - lock: new(sync.Mutex), - curr: 0, - max: 0, - sql: "SELECT mycat_seq_nextval('" + seqName + "') as seq_val", + slice: slice, + seqName: seqName, + pkName: pkName, + lock: new(sync.Mutex), + curr: 0, + max: 0, + maxLimit: maxLimit, + sql: "SELECT mycat_seq_nextval('" + seqName + "') as seq_val", } return t } @@ -61,6 +63,10 @@ func (s *MySQLSequence) NextSeq() (int64, error) { } } s.curr++ + // 设置上限 + if s.maxLimit > 0 && s.curr >= s.maxLimit { + return 0, fmt.Errorf("seq reach max limit, curr: %d, max limit:%d", s.curr, s.maxLimit) + } return s.curr, nil } diff --git a/proxy/server/admin.go b/proxy/server/admin.go index 526df1b8..27347538 100644 --- a/proxy/server/admin.go +++ b/proxy/server/admin.go @@ -16,6 +16,7 @@ package server import ( "fmt" + "github.com/XiaoMi/Gaea/core" "net" "net/http" "net/http/pprof" @@ -48,6 +49,8 @@ type AdminServer struct { } proxy *Server model *models.ProxyInfo + // proxy config file path + configFile string listener net.Listener adminUser string @@ -86,7 +89,7 @@ func NewAdminServer(proxy *Server, cfg *models.Proxy) (*AdminServer, error) { s.coordinatorUsername = cfg.UserName s.coordinatorPassword = cfg.Password s.coordinatorRoot = cfg.CoordinatorRoot - + s.configFile = cfg.ConfigFile s.engine = gin.New() l, err := net.Listen(cfg.ProtoType, cfg.AdminAddr) if err != nil { @@ -96,6 +99,7 @@ func NewAdminServer(proxy *Server, cfg *models.Proxy) (*AdminServer, error) { s.registerURL() s.registerMetric() s.registerProf() + s.registerVersion() proxyInfo, err := NewProxyInfo(cfg, s.proxy.Listener().Addr().String()) if err != nil { @@ -144,6 +148,7 @@ func (s *AdminServer) Close() error { func (s *AdminServer) registerURL() { adminGroup := s.engine.Group("/api/proxy", gin.BasicAuth(gin.Accounts{s.adminUser: s.adminPassword})) adminGroup.GET("/ping", s.ping) + adminGroup.PUT("/proxyconfig/reload", s.reloadProxyConfig) adminGroup.PUT("/config/prepare/:name", s.prepareConfig) adminGroup.PUT("/config/commit/:name", s.commitConfig) adminGroup.PUT("/namespace/delete/:name", s.deleteNamespace) @@ -189,6 +194,11 @@ func (s *AdminServer) registerProf() { profGroup.GET("/allocs", gin.WrapF(pprof.Handler("allocs").ServeHTTP)) } +func (s *AdminServer) registerVersion() { + versionGroup := s.engine.Group("/api/proxy") + versionGroup.GET("/version", s.ProxyVersion) +} + // NewProxyInfo create proxy information func NewProxyInfo(cfg *models.Proxy, addr string) (*models.ProxyInfo, error) { ipPort, err := util.ResolveAddr(cfg.ProtoType, addr) @@ -269,6 +279,20 @@ func (s *AdminServer) ping(c *gin.Context) { c.JSON(http.StatusOK, "OK") } +// @Summary reload proxy config +// @Description 通过管理接口, 重载 proxy 配置文件,当前仅支持 log 配置的重载 +// @Produce json +// @Success 200 {string} string "OK" +// @Security BasicAuth +// @Router /api/proxy/proxyconfig/reload [put] +func (s *AdminServer) reloadProxyConfig(c *gin.Context) { + if err := s.proxy.ReloadProxyConfig(); err != nil { + c.JSON(selfDefinedInternalError, fmt.Sprintf("reload config file Error:%s", err)) + } + log.Notice("reload proxy config success") + c.JSON(http.StatusOK, "OK") +} + // @Summary prepare namespace配置 // @Description 通过管理接口, 二阶段提交, prepare namespace配置 // @Produce json @@ -431,3 +455,12 @@ func (s *AdminServer) clearNamespaceBackendSQLFingerprint(c *gin.Context) { c.JSON(http.StatusOK, "OK") } + +// @Summary 获取gaea版本信息 +// @Description 获取gaea版本信息,2.0版本新增接口 +// @Success 200 {string} string "version" +// @Security 不需要鉴权 +// @Router /api/proxy/config/version [get] +func (s *AdminServer) ProxyVersion(c *gin.Context) { + c.JSON(http.StatusOK, core.Info.Version) +} diff --git a/proxy/server/client_conn.go b/proxy/server/client_conn.go index aadfdb9d..87c2f882 100644 --- a/proxy/server/client_conn.go +++ b/proxy/server/client_conn.go @@ -16,9 +16,10 @@ package server import ( "fmt" + "github.com/XiaoMi/Gaea/backend" "github.com/XiaoMi/Gaea/log" "github.com/XiaoMi/Gaea/mysql" - "strings" + "github.com/XiaoMi/Gaea/util/sync2" ) // ClientConn session client connection @@ -34,6 +35,8 @@ type ClientConn struct { namespace string // TODO: remove it when refactor is done proxy *Server + + hasRecycledReadPacket sync2.AtomicBool } // HandshakeResponseInfo handshake response information @@ -49,31 +52,20 @@ type HandshakeResponseInfo struct { // NewClientConn constructor of ClientConn func NewClientConn(c *mysql.Conn, manager *Manager) *ClientConn { salt, _ := mysql.RandomBuf(20) - return &ClientConn{ + cc := &ClientConn{ Conn: c, salt: salt, manager: manager, } -} - -func (cc *ClientConn) CompactVersion(sv string) string { - version := strings.Trim(sv, " ") - if version != "" { - v := strings.Split(sv, ".") - if len(v) < 3 { - return mysql.ServerVersion - } - return version - } else { - return mysql.ServerVersion - } + cc.hasRecycledReadPacket.Set(false) + return cc } func (cc *ClientConn) writeInitialHandshakeV10() error { - ServerVersion := cc.CompactVersion(cc.proxy.ServerVersion) + length := 1 + // protocol version - mysql.LenNullString(ServerVersion) + + mysql.LenNullString(cc.proxy.ServerVersion) + 4 + // connection ID 8 + // first part of salt data 1 + // filler byte @@ -97,7 +89,7 @@ func (cc *ClientConn) writeInitialHandshakeV10() error { // Copy server version. // server version data with terminate character 0x00, type: string[NUL]. - pos = mysql.WriteNullString(data, pos, ServerVersion) + pos = mysql.WriteNullString(data, pos, cc.proxy.ServerVersion) // Add connectionID in. // connection id type: 4 bytes. @@ -250,7 +242,7 @@ func (cc *ClientConn) readHandshakeResponse() (HandshakeResponseInfo, error) { } func (cc *ClientConn) writeOK(status uint16) error { - err := cc.WriteOKPacket(0, 0, status, 0) + err := cc.WriteOKPacket(0, 0, status, 0, "") if err != nil { log.Warn("write ok packet failed, %v", err) return err @@ -258,11 +250,95 @@ func (cc *ClientConn) writeOK(status uint16) error { return nil } -func (cc *ClientConn) writeOKResult(status uint16, r *mysql.Result) error { +func (cc *ClientConn) writeOKResultStream(status uint16, rs *mysql.Result, continueConn backend.PooledConnect, maxRows int, isBinary bool) error { + if rs == nil { + return cc.writeOK(status) + } + if rs.Status&mysql.ServerMoreResultsExists > 0 { + status |= mysql.ServerMoreResultsExists + } else { + status = status &^ (1 << 3) + } + if isBinary { + if err := rs.BuildBinaryResultSet(); err != nil { + return err + } + } + // 提前拷贝,防止 writeOKResult 中 rs 释放 + var globalFields []*mysql.Field + if rs.Resultset != nil { + globalFields = rs.Resultset.Fields + } + err := cc.writeOKResult(status, continueConn.MoreRowsExist(), rs) + if err != nil { + return err + } + + for continueConn.MoreRowsExist() { + result := mysql.ResultPool.Get() + result.Resultset = &mysql.Resultset{ + Fields: globalFields, + } + err = continueConn.FetchMoreRows(result, maxRows) + if isBinary { + if err := result.BuildBinaryResultSet(); err != nil { + return err + } + } + if err = cc.writeRowsWithEOF(result, continueConn.MoreRowsExist(), status); err != nil { + return err + } + } + // handle multi rs + for continueConn.MoreResultsExist() { + rs, err := continueConn.ReadMoreResult(maxRows) + if err != nil { + return fmt.Errorf("readMoreresult error: %v", err) + } + + if isBinary { + if err := rs.BuildBinaryResultSet(); err != nil { + return err + } + } + // TODO: multi statement may have large result + err = cc.writeOKResult(rs.Status, false, rs) + if err != nil { + return err + } + } + return nil +} + +// 写入结果集后,不能再引用结果集 +func (cc *ClientConn) writeOKResult(status uint16, moreRows bool, r *mysql.Result) error { + defer r.Free() if r.Resultset == nil { - return cc.WriteOKPacket(r.AffectedRows, r.InsertID, status, 0) + return cc.WriteOKPacket(r.AffectedRows, r.InsertID, status, 0, r.Info) + } + return cc.writeResultset(status, moreRows, r.Resultset) +} + +// 写入结果集后,不能再引用结果集 +func (cc *ClientConn) writeRowsWithEOF(result *mysql.Result, moreRowsExists bool, status uint16) error { + defer result.Free() + var err error + cc.StartWriterBuffering() + for _, v := range result.RowDatas { + if err = cc.writeRow(v); err != nil { + return err + } + } + if !moreRowsExists { + status = status &^ (1 << 3) + if err = cc.writeEOFPacket(status); err != nil { + return err + } } - return cc.writeResultset(status, r.Resultset) + if err = cc.Flush(); err != nil { + return err + } + return nil } func (cc *ClientConn) writeEOFPacket(status uint16) error { @@ -275,12 +351,7 @@ func (cc *ClientConn) writeEOFPacket(status uint16) error { } func (cc *ClientConn) writeErrorPacket(err error) error { - e := cc.WriteErrorPacketFromError(err) - if e != nil { - log.Warn("write error packet failed, %v", err) - return e - } - return nil + return cc.WriteErrorPacketFromError(err) } func (cc *ClientConn) writeColumnCount(count uint64) error { @@ -300,8 +371,35 @@ func (cc *ClientConn) writeRow(row []byte) error { return cc.WriteEphemeralPacket() } +func (cc *ClientConn) writeFields(status uint16, r *mysql.Resultset) error { + var err error + cc.StartWriterBuffering() + + // write column count + columnCount := uint64(len(r.Fields)) + err = cc.writeColumnCount(columnCount) + if err != nil { + return err + } + + // write columns + err = cc.writeFieldList(status, r.Fields) + if err != nil { + return err + } + return nil +} + +func (cc *ClientConn) writeEndResult(status uint16) error { + err := cc.writeEOFPacket(status) + if err != nil { + return err + } + return cc.Flush() +} + // https://dev.mysql.com/doc/internals/en/com-query-response.html#packet-ProtocolText::Resultset -func (cc *ClientConn) writeResultset(status uint16, r *mysql.Resultset) error { +func (cc *ClientConn) writeResultset(status uint16, moreRows bool, r *mysql.Resultset) error { var err error cc.StartWriterBuffering() @@ -326,10 +424,12 @@ func (cc *ClientConn) writeResultset(status uint16, r *mysql.Resultset) error { return err } } - - err = cc.writeEOFPacket(status) - if err != nil { - return err + // if moreRows exists, will not send EOF packet + if !moreRows { + err = cc.writeEOFPacket(status) + if err != nil { + return err + } } err = cc.Flush() @@ -487,7 +587,7 @@ func (cc *ClientConn) WriteAuthSwitchRequest(authMethod string) error { l := 1 + len(authMethod) + 1 + len(cc.salt) + 1 data := cc.StartEphemeralPacket(l) pos := 0 - pos = mysql.WriteByte(data, pos, mysql.AuthSwitchHeader) + pos = mysql.WriteByte(data, pos, mysql.EOFHeader) pos = mysql.WriteNullString(data, pos, authMethod) pos = mysql.WriteBytes(data, pos, cc.salt) mysql.WriteByte(data, pos, 0) diff --git a/proxy/server/client_conn_test.go b/proxy/server/client_conn_test.go new file mode 100644 index 00000000..9268de9a --- /dev/null +++ b/proxy/server/client_conn_test.go @@ -0,0 +1,51 @@ +package server + +import ( + "github.com/XiaoMi/Gaea/backend" + "github.com/XiaoMi/Gaea/mysql" + "github.com/bytedance/mockey" + "github.com/stretchr/testify/assert" + "testing" +) + +// 检测 continueConn.MoreRowsExist Fields 是否正常 +func TestWriteOkResultStreamMoreRowsExistFields(t *testing.T) { + mockey.PatchConvey("test", t, func() { + testMoreRowExistStatus := []bool{true, true, false} + testMoreRowExistIndex := 0 + mockey.Mock((*ClientConn).writeOK).Return(nil).Build() + mockey.Mock((*ClientConn).writeOKResult).To(func(status uint16, moreRows bool, r *mysql.Result) error { + r.Free() + return nil + }).Build() + mockey.Mock((*ClientConn).writeRowsWithEOF).To(func(r *mysql.Result, moreRowsExists bool, status uint16) error { + r.Free() + return nil + }).Build() + mockey.Mock((*mysql.Result).BuildBinaryResultSet).Return(nil).Build() + mockey.Mock((*backend.MockPooledConnect).MoreRowsExist).To(func() bool { + if testMoreRowExistIndex >= len(testMoreRowExistStatus) { + return false + } + ret := testMoreRowExistStatus[testMoreRowExistIndex] + testMoreRowExistIndex += 1 + return ret + }).Build() + mockey.Mock((*backend.MockPooledConnect).MoreResultsExist).Return(false).Build() + mockey.Mock((*backend.MockPooledConnect).FetchMoreRows).To(func(result *mysql.Result, maxRows int) error { + // 检测 fields 长度是否正常 + assert.Equal(t, 1, len(result.Fields)) + return nil + }).Build() + + rs := mysql.ResultPool.Get() + rs.Resultset = &mysql.Resultset{ + Fields: []*mysql.Field{ + {}, + }, + } + backendConn := &backend.MockPooledConnect{} + c := ClientConn{} + c.writeOKResultStream(0, rs, backendConn, 0, true) + }) +} diff --git a/proxy/server/executor.go b/proxy/server/executor.go index f4f74be4..b62cc85d 100644 --- a/proxy/server/executor.go +++ b/proxy/server/executor.go @@ -17,12 +17,16 @@ package server import ( "context" "fmt" + "net" + "sort" "strconv" "strings" "sync" "sync/atomic" "time" + "github.com/XiaoMi/Gaea/models" + "github.com/XiaoMi/Gaea/backend" "github.com/XiaoMi/Gaea/core/errors" "github.com/XiaoMi/Gaea/log" @@ -37,9 +41,30 @@ import ( const ( // master comments - masterComment = "/*master*/" + masterComment = "/*master*/" + masterHint = "*master*" + mycatHint = "/* !mycat:" + standardMasterHint = "/*+ master */" // general query log variable - gaeaGeneralLogVariable = "gaea_general_log" + gaeaGeneralLogVariable = "gaea_general_log" + readonlyVariable = "read_only" + globalReadonlyVariable = "global.read_only" + TxReadonlyLT5720 = "@@tx_read_only" + TxReadonlyGT5720 = "@@transaction_read_only" + SessionTxReadonlyLT5720 = "@@session.tx_read_only" + SessionTxReadonlyGT5720 = "@@session.transaction_read_only" + TxIsolationLT5720 = "@@tx_isolation" + TxIsolationGT5720 = "@@transaction_isolation" + SessionTxIsolationLT5720 = "@@session.tx_isolation" + SessionTxIsolationGT5720 = "@@session.transaction_isolation" + // JdbcInitPrefix jdbc prefix: /* mysql-connector-java (<8.0.30); /* mysql-connector-j-8...(>8.0.30) + JdbcInitPrefix = "/* mysql-connector-j" + + // multiBackendAddrMark marks the backend addr is one of multi backend addrs + multiBackendAddrMark = ">" + + // select last_insert_id() + lastInsetIdMark = "SELECTLAST_INSERT_ID()" ) // SessionExecutor is bound to a session, so requests are serializable @@ -58,14 +83,23 @@ type SessionExecutor struct { charset string sessionVariables *mysql.SessionVariables - txConns map[string]backend.PooledConnect - savepoints []string - txLock sync.Mutex + keepSession bool + userPriv int + + txConns map[string]backend.PooledConnect + ksConns map[string]backend.PooledConnect // keep session connections + nsChangeIndexOld uint32 + savepoints []string + txLock sync.Mutex stmtID uint32 stmts map[uint32]*Stmt //prepare相关,client端到proxy的stmt - parser *parser.Parser + session *Session + serverAddr net.Addr + backendAddr string //记录执行 SQL 后端实例的地址 + backendConnectionId int64 //记录执行 SQL 后端实例的连接ID + contextNamespace *Namespace } // Response response info @@ -73,6 +107,7 @@ type Response struct { RespType int Status uint16 Data interface{} + IsBinary bool } const ( @@ -101,11 +136,12 @@ func CreateOKResponse(status uint16) Response { } // CreateResultResponse create result response -func CreateResultResponse(status uint16, result *mysql.Result) Response { +func CreateResultResponse(status uint16, result *mysql.Result, isBinary bool) Response { return Response{ RespType: RespResult, Status: status, Data: result, + IsBinary: isBinary, } } @@ -156,8 +192,8 @@ func newSessionExecutor(manager *Manager) *SessionExecutor { return &SessionExecutor{ sessionVariables: mysql.NewSessionVariables(), txConns: make(map[string]backend.PooledConnect), + ksConns: make(map[string]backend.PooledConnect), stmts: make(map[uint32]*Stmt), - parser: parser.New(), status: initClientConnStatus, manager: manager, } @@ -165,6 +201,15 @@ func newSessionExecutor(manager *Manager) *SessionExecutor { // GetNamespace return namespace in session func (se *SessionExecutor) GetNamespace() *Namespace { + return se.contextNamespace +} + +// GetNamespace return namespace in session +func (se *SessionExecutor) SetContextNamespace() { + se.contextNamespace = se.GetManagerNamespace() +} + +func (se *SessionExecutor) GetManagerNamespace() *Namespace { return se.manager.GetNamespace(se.namespace) } @@ -217,6 +262,10 @@ func (se *SessionExecutor) SetLastInsertID(id uint64) { se.lastInsertID = id } +func (se *SessionExecutor) HandleSet(reqCtx *util.RequestContext, sql string, stmt *ast.SetStmt) (*mysql.Result, error) { + return se.handleSet(reqCtx, sql, stmt) +} + // GetStatus return session status func (se *SessionExecutor) GetStatus() uint16 { return se.status @@ -248,7 +297,7 @@ func (se *SessionExecutor) SetCharset(charset string) { } // SetNamespaceDefaultCharset set session default charset -func (se SessionExecutor) SetNamespaceDefaultCharset() { +func (se *SessionExecutor) SetNamespaceDefaultCharset() { se.charset = se.manager.GetNamespace(se.namespace).GetDefaultCharset() } @@ -267,10 +316,17 @@ func (se *SessionExecutor) GetDatabase() string { return se.db } +// IsKeepSession return keepSession flag +func (se *SessionExecutor) IsKeepSession() bool { + return se.keepSession +} + // ExecuteCommand execute command func (se *SessionExecutor) ExecuteCommand(cmd byte, data []byte) Response { switch cmd { case mysql.ComQuit: + _ = se.manager.statistics.generalLogger.Notice("Quit - conn_id=%d, ns=%s, %s@%s/%s", + se.session.c.ConnectionID, se.namespace, se.user, se.clientAddr, se.db) se.handleRollback(nil) // https://dev.mysql.com/doc/internals/en/com-quit.html // either a connection close or a OK_Packet, OK_Packet will cause client RST sometimes, but doesn't affect sql execute @@ -282,8 +338,13 @@ func (se *SessionExecutor) ExecuteCommand(cmd byte, data []byte) Response { if err != nil { return CreateErrorResponse(se.status, err) } - return CreateResultResponse(se.status, r) + return CreateResultResponse(se.status, r, false) case mysql.ComPing: + if se.IsKeepSession() { + if err := se.handleKeepSessionPing(); err != nil { + return CreateErrorResponse(se.status, err) + } + } return CreateOKResponse(se.status) case mysql.ComInitDB: db := string(data) @@ -313,7 +374,7 @@ func (se *SessionExecutor) ExecuteCommand(cmd byte, data []byte) Response { if err != nil { return CreateErrorResponse(se.status, err) } - return CreateResultResponse(se.status, r) + return CreateResultResponse(se.status, r, true) case mysql.ComStmtClose: // no response if err := se.handleStmtClose(data); err != nil { return CreateErrorResponse(se.status, err) @@ -342,6 +403,9 @@ func (se *SessionExecutor) ExecuteCommand(cmd byte, data []byte) Response { func (se *SessionExecutor) getBackendConns(sqls map[string]map[string][]string, fromSlave bool) (pcs map[string]backend.PooledConnect, err error) { pcs = make(map[string]backend.PooledConnect) + backendAddr := "" + backendConnectionID := int64(0) + for sliceName := range sqls { var pc backend.PooledConnect pc, err = se.getBackendConn(sliceName, fromSlave) @@ -349,71 +413,138 @@ func (se *SessionExecutor) getBackendConns(sqls map[string]map[string][]string, return } pcs[sliceName] = pc + backendAddr = pc.GetAddr() + backendConnectionID = pc.GetConnectionID() + } + se.backendAddr = backendAddr + se.backendConnectionId = backendConnectionID + if len(pcs) > 1 { + se.backendAddr = multiBackendAddrMark + backendAddr } return } func (se *SessionExecutor) getBackendConn(sliceName string, fromSlave bool) (pc backend.PooledConnect, err error) { + if se.IsKeepSession() { + return se.getBackendKsConn(sliceName) + } + return se.getBackendNoKsConn(sliceName, fromSlave) +} + +func (se *SessionExecutor) getBackendNoKsConn(sliceName string, fromSlave bool) (pc backend.PooledConnect, err error) { if !se.isInTransaction() { slice := se.GetNamespace().GetSlice(sliceName) - return slice.GetConn(fromSlave, se.GetNamespace().GetUserProperty(se.user)) + return slice.GetConn(fromSlave, se.GetNamespace().GetUserProperty(se.user), se.GetNamespace().localSlaveReadPriority) } return se.getTransactionConn(sliceName) } +func (se *SessionExecutor) getBackendKsConn(sliceName string) (pc backend.PooledConnect, err error) { + pc, ok := se.ksConns[sliceName] + if ok { + return pc, nil + } + + slice := se.GetNamespace().GetSlice(sliceName) + pc, err = slice.GetConn(se.userPriv == models.ReadOnly, se.GetNamespace().GetUserProperty(se.user), se.GetNamespace().localSlaveReadPriority) + if err != nil { + log.Warn("get connection from backend failed, error: %s", err.Error()) + return + } + + if !se.isAutoCommit() { + if err = pc.SetAutoCommit(0); err != nil { + pc.Close() + pc.Recycle() + return + } + } + + if se.isInTransaction() { + if err = pc.Begin(); err != nil { + pc.Close() + pc.Recycle() + return + } + } + + se.ksConns[sliceName] = pc + return +} + func (se *SessionExecutor) getTransactionConn(sliceName string) (pc backend.PooledConnect, err error) { se.txLock.Lock() defer se.txLock.Unlock() var ok bool - pc, ok = se.txConns[sliceName] + if pc, ok = se.txConns[sliceName]; ok { + return + } - if !ok { - slice := se.GetNamespace().GetSlice(sliceName) // returns nil only when the conf is error (fatal) so panic is correct - if pc, err = slice.GetMasterConn(); err != nil { + slice := se.GetNamespace().GetSlice(sliceName) // returns nil only when the conf is error (fatal) so panic is correct + if pc, err = slice.GetMasterConn(); err != nil { + return + } + // Synchronize session variables before starting the transaction. + // This step ensures that the session settings like `transaction_read_only` are correctly applied. + // Setting session variables after `BEGIN` might not affect the transaction as expected, + // since some session settings need to be established before the transaction starts. + // pc.SetAutoCommit(0) is equivalent to starting a transaction + if err = pc.SyncSessionVariables(se.sessionVariables); err != nil { + pc.Close() + pc.Recycle() + return + } + if !se.isAutoCommit() { + if err = pc.SetAutoCommit(0); err != nil { + pc.Close() + pc.Recycle() return } - - if !se.isAutoCommit() { - if err = pc.SetAutoCommit(0); err != nil { - pc.Close() - pc.Recycle() - return - } - } else { - if err = pc.Begin(); err != nil { - pc.Close() - pc.Recycle() - return - } - } - for _, savepoint := range se.savepoints { - pc.Execute("savepoint "+savepoint, 0) + } else { + if err = pc.Begin(); err != nil { + pc.Close() + pc.Recycle() + return } - se.txConns[sliceName] = pc } - + for _, savepoint := range se.savepoints { + pc.Execute("savepoint "+savepoint, 0) + } + se.txConns[sliceName] = pc return } -func (se *SessionExecutor) recycleBackendConn(pc backend.PooledConnect, rollback bool) { +func (se *SessionExecutor) recycleBackendConn(pc backend.PooledConnect) { if pc == nil { return } - if se.isInTransaction() { + if pc.IsClosed() { + se.recycleTx() + pc.Recycle() + return + } + + // if continueConn set to pc,maybe moreRowsExist or moreResultsExist + if se.session.continueConn != nil && (pc.MoreRowsExist() || pc.MoreResultsExist()) { return } - if rollback { - pc.Rollback() + if se.IsKeepSession() { + se.session.clearKsConns(se.nsChangeIndexOld) + return + } + + if se.isInTransaction() { + return } pc.Recycle() } func (se *SessionExecutor) recycleBackendConns(pcs map[string]backend.PooledConnect, rollback bool) { - if se.isInTransaction() { + if se.isInTransaction() || se.IsKeepSession() { return } @@ -428,11 +559,18 @@ func (se *SessionExecutor) recycleBackendConns(pcs map[string]backend.PooledConn } } +// initBackendConn tries to initialize the database connection with the specified database, +// charset, and session variables. func initBackendConn(pc backend.PooledConnect, phyDB string, charset string, collation mysql.CollationID, sessionVariables *mysql.SessionVariables) error { if err := pc.UseDB(phyDB); err != nil { return err } + return InitializeSessionVariables(pc, charset, collation, sessionVariables) +} +// InitializeSessionVariables sets the charset and session variables for the pooled connection. +// It attempts to write these settings and handles errors appropriately by closing the connection. +func InitializeSessionVariables(pc backend.PooledConnect, charset string, collation mysql.CollationID, sessionVariables *mysql.SessionVariables) error { charsetChanged, err := pc.SetCharset(charset, collation) if err != nil { return err @@ -445,6 +583,10 @@ func initBackendConn(pc backend.PooledConnect, phyDB string, charset string, col if charsetChanged || variablesChanged { if err = pc.WriteSetStatement(); err != nil { + log.Warn("set charset or session variables failed, address: %s, error: %s", pc.GetAddr(), err.Error()) + // Reset session variables to ensure the next use of the connection does not encounter incorrect settings or character set issues. + // Resetting helps to address the root causes of session inconsistencies without masking them by simply pc.Close() + sessionVariables.Reset(err) return err } } @@ -489,16 +631,25 @@ func (se *SessionExecutor) executeInMultiSlices(reqCtx *util.RequestContext, pcs } rs := make([]interface{}, resultCount) f := func(reqCtx *util.RequestContext, rs []interface{}, i int, sliceName string, execSqls map[string][]string, pc backend.PooledConnect) { - for db, sqls := range execSqls { + // 对 execSqls 排序后处理 + dbs := make([]string, 0, len(execSqls)) + for k := range execSqls { + dbs = append(dbs, k) + } + sort.Slice(dbs, func(i, j int) bool { + return dbs[i] < dbs[j] + }) + for _, db := range dbs { err := initBackendConn(pc, db, se.GetCharset(), se.GetCollationID(), se.GetVariables()) if err != nil { rs[i] = err break } + sqls := execSqls[db] for _, v := range sqls { startTime := time.Now() r, err := pc.Execute(v, se.manager.GetNamespace(se.namespace).GetMaxResultSize()) - se.manager.RecordBackendSQLMetrics(reqCtx, se.namespace, v, pc.GetAddr(), startTime, err) + se.manager.RecordBackendSQLMetrics(reqCtx, se, sliceName, v, pc.GetAddr(), startTime, err) if err != nil { rs[i] = err } else { @@ -511,9 +662,17 @@ func (se *SessionExecutor) executeInMultiSlices(reqCtx *util.RequestContext, pcs } offset := 0 - for sliceName, pc := range pcs { + // 对 pcs 排序后处理 + sliceNames := make([]string, 0, len(pcs)) + for k := range pcs { + sliceNames = append(sliceNames, k) + } + sort.Slice(sliceNames, func(i, j int) bool { + return sliceNames[i] < sliceNames[j] + }) + for _, sliceName := range sliceNames { s := sqls[sliceName] //map[string][]string - go f(reqCtx, rs, offset, sliceName, s, pc) + go f(reqCtx, rs, offset, sliceName, s, pcs[sliceName]) for _, sqlDB := range sqls[sliceName] { offset += len(sqlDB) } @@ -557,6 +716,48 @@ func (se *SessionExecutor) executeInMultiSlices(reqCtx *util.RequestContext, pcs return r, err } +func (se *SessionExecutor) executeInSlice(reqCtx *util.RequestContext, pc backend.PooledConnect, phyDb, sql string) (*mysql.Result, error) { + var ctx = context.Background() + var cancel context.CancelFunc + maxExecuteTime := se.GetNamespace().GetMaxExecuteTime() + if maxExecuteTime > 0 { + ctx, cancel = context.WithTimeout(context.Background(), time.Duration(maxExecuteTime)*time.Millisecond) + defer cancel() + } + + // Control go routine execution + done := make(chan struct{}) + + var rs *mysql.Result + var err error + go func() { + defer close(done) + if pc == nil { + err = fmt.Errorf("no backend connection") + done <- struct{}{} + return + } + err = initBackendConn(pc, phyDb, se.GetCharset(), se.GetCollationID(), se.GetVariables()) + if err != nil { + done <- struct{}{} + return + } + startTime := time.Now() + rs, err = pc.Execute(sql, se.GetNamespace().GetMaxResultSize()) + + se.manager.RecordBackendSQLMetrics(reqCtx, se, "slice0", sql, pc.GetAddr(), startTime, err) + done <- struct{}{} + }() + + select { + case <-ctx.Done(): + log.Warn("exec sql: %s, error: %s", sql, errors.ErrTimeLimitExceeded.Error()) + return nil, fmt.Errorf("%v %dms", errors.ErrTimeLimitExceeded, maxExecuteTime) + case <-done: + return rs, err + } +} + func canHandleWithoutPlan(stmtType int) bool { return stmtType == parser.StmtShow || stmtType == parser.StmtSet || @@ -564,10 +765,14 @@ func canHandleWithoutPlan(stmtType int) bool { stmtType == parser.StmtCommit || stmtType == parser.StmtRollback || stmtType == parser.StmtSavepoint || - stmtType == parser.StmtUse + stmtType == parser.StmtUse || + stmtType == parser.StmtRelease || + stmtType == parser.StmeSRollback || + stmtType == parser.StmtLockTables } const variableRestoreFlag = format.RestoreKeyWordLowercase | format.RestoreNameLowercase +const sqlModeRestoreFlag = format.RestoreStringSingleQuotes // 获取SET语句中变量的字符串值, 去掉各种引号并转换为小写 func getVariableExprResult(v ast.ExprNode) string { @@ -577,6 +782,14 @@ func getVariableExprResult(v ast.ExprNode) string { return strings.ToLower(s.String()) } +// 获取 SET 语句中变量的字符串值, 保留引号,不转换大小写 +func getSqlModeExprResult(v ast.ExprNode) string { + s := &strings.Builder{} + ctx := format.NewRestoreCtx(sqlModeRestoreFlag, s) + v.Restore(ctx) + return s.String() +} + func getOnOffVariable(v string) (string, error) { if v == "1" || v == "on" { return "1", nil @@ -587,20 +800,76 @@ func getOnOffVariable(v string) (string, error) { } } +// extractPrefixCommentsAndRewrite extractPrefixComments and rewrite origin SQL +func extractPrefixCommentsAndRewrite(sql string, version *util.VersionCompareStatus) (trimmed string, comment parser.MarginComments) { + sql = preRewriteSQL(sql, version) + + //TODO: 优化 tokens 逻辑,所有的 comments 都从 tokens 中获取 + _, comments := parser.SplitMarginComments(sql) + trimmed = strings.TrimPrefix(sql, comments.Leading) + trimmed = strings.TrimSuffix(trimmed, comments.Trailing) + return trimmed, comments +} + // master-slave routing -func canExecuteFromSlave(c *SessionExecutor, sql string) bool { - if parser.Preview(sql) != parser.StmtSelect { +func checkExecuteFromSlave(reqCtx *util.RequestContext, c *SessionExecutor, sql string) bool { + stmtType := reqCtx.GetStmtType() + tokens := reqCtx.GetTokens() + tokensLen := len(tokens) + + if stmtType != parser.StmtSelect && stmtType != parser.StmtShow { return false } - _, comments := parser.SplitMarginComments(sql) - lcomment := strings.ToLower(strings.TrimSpace(comments.Leading)) - var fromSlave = c.GetNamespace().IsRWSplit(c.user) - if strings.ToLower(lcomment) == masterComment { - fromSlave = false + // if user is ReadOnly,then only can + if !c.GetNamespace().IsAllowWrite(c.user) { + return true + } + + // send sql `select ... for update [nowait/skip locked]` + // or `select ... in share mode [nowait/skip locked]` to master + if c.GetNamespace().CheckSelectLock { + if len(tokens) < 2 { + return true + } + lastFirstWord := strings.ToLower(tokens[tokensLen-1]) + lastSecondWord := strings.ToLower(tokens[tokensLen-2]) + if (lastFirstWord == "update" && lastSecondWord == "for") || + (lastFirstWord == "mode" && lastSecondWord == "share") || + (lastFirstWord == "share" && lastSecondWord == "for") || + (lastFirstWord == "nowait" && (lastSecondWord == "share" || lastSecondWord == "update")) || + (lastFirstWord == "locked" && lastSecondWord == "skip") { + return false + } + } + + // handle show variables like 'read_only' default to master + if stmtType == parser.StmtShow && strings.Contains(strings.ToLower(sql), readonlyVariable) { + return false + } + + if strings.Contains(sql, "@@") { + // handle select @@read_only default to master + if strings.Contains(strings.ToLower(sql), "@@"+readonlyVariable) { + return false + } + + // handle select @@global.read_only default to master + if strings.Contains(strings.ToLower(sql), "@@"+globalReadonlyVariable) { + return false + } + } + + // handle master hint + if len(tokens) > 1 && util.LowerEqual(tokens[1], masterHint) { + return false + } + // handle master hint + if len(tokens) > 1 && util.LowerEqual(tokens[tokensLen-1], masterHint) { + return false } - return fromSlave + return c.GetNamespace().IsRWSplit(c.user) } // 如果是只读用户, 且SQL是INSERT, UPDATE, DELETE, 则拒绝执行, 返回true @@ -612,14 +881,52 @@ func isSQLNotAllowedByUser(c *SessionExecutor, stmtType int) bool { return stmtType == parser.StmtDelete || stmtType == parser.StmtInsert || stmtType == parser.StmtUpdate } +// 旧版本,这边有个版本对比的函数性能比较差,qps 大时损耗比较严重遂去掉,Contains 比 HasSuffix 性能差,去掉 +// preRewriteSQL pre rewite sql with string +func preRewriteSQL(sql string, version *util.VersionCompareStatus) string { + if !version.LessThanMySQLVersion80 { + return sql + } + // fix jdbc version mismatch gaea version + if strings.HasPrefix(sql, JdbcInitPrefix) { + return strings.Replace(sql, TxIsolationGT5720, TxIsolationLT5720, 1) + } + + // fix `select @@transaction_isolation` + if strings.HasSuffix(sql, TxIsolationGT5720) { + return strings.Replace(sql, TxIsolationGT5720, TxIsolationLT5720, 1) + } + // fix `select @@session.transaction_isolation` + if strings.HasSuffix(sql, SessionTxIsolationGT5720) { + return strings.Replace(sql, SessionTxIsolationGT5720, SessionTxIsolationLT5720, 1) + } + + // fix `select @@transaction_read_only` + if strings.HasSuffix(sql, TxReadonlyGT5720) { + return strings.Replace(sql, TxReadonlyGT5720, TxReadonlyLT5720, 1) + } + // fix `select @@session.transaction_read_only` + if strings.HasSuffix(sql, SessionTxReadonlyGT5720) { + return strings.Replace(sql, SessionTxReadonlyGT5720, SessionTxReadonlyLT5720, 1) + } + return sql +} + func modifyResultStatus(r *mysql.Result, cc *SessionExecutor) { + if r == nil { + return + } r.Status = r.Status | cc.GetStatus() } func createShowDatabaseResult(dbs []string) *mysql.Result { r := new(mysql.Resultset) - field := &mysql.Field{} + // + field := &mysql.Field{ + Charset: 33, + Type: 0xFD, //FIELD_TYPE_VAR_STRING fix: show databases jdbc err + } field.Name = hack.Slice("Database") r.Fields = append(r.Fields, field) @@ -627,10 +934,9 @@ func createShowDatabaseResult(dbs []string) *mysql.Result { r.Values = append(r.Values, []interface{}{db}) } - result := &mysql.Result{ - AffectedRows: uint64(len(dbs)), - Resultset: r, - } + result := mysql.ResultPool.Get() + result.AffectedRows = uint64(len(dbs)) + result.Resultset = r plan.GenerateSelectResultRowData(result) return result @@ -650,33 +956,80 @@ func createShowGeneralLogResult() *mysql.Result { value = "OFF" } r.Values = append(r.Values, []interface{}{value}) - result := &mysql.Result{ - AffectedRows: 1, - Resultset: r, - } + result := mysql.ResultPool.Get() + result.AffectedRows = 1 + result.Resultset = r plan.GenerateSelectResultRowData(result) return result } func getFromSlave(reqCtx *util.RequestContext) bool { - slaveFlag := reqCtx.Get(util.FromSlave) - if slaveFlag != nil && slaveFlag.(int) == 1 { - return true + slaveFlag := reqCtx.GetFromSlave() + return slaveFlag == 1 +} + +// 仅多语句执行时使用 +func setContextSQLFingerprint(reqCtx *util.RequestContext, sql string) { + fingerprint := mysql.GetFingerprint(sql) + md5sql := mysql.GetMd5(fingerprint) + reqCtx.SetFingerprint(fingerprint) + reqCtx.SetFingerprintMD5(md5sql) +} + +func getSQLFingerprint(reqCtx *util.RequestContext, sql string) string { + if reqCtx.GetFingerprint() == "" { + fingerprint := mysql.GetFingerprint(sql) + reqCtx.SetFingerprint(fingerprint) } + return reqCtx.GetFingerprint() +} - return false +func getSQLFingerprintMd5(reqCtx *util.RequestContext, sql string) string { + if reqCtx.GetFingerprintMD5() == "" { + fingerprint := getSQLFingerprint(reqCtx, sql) + md5Value := mysql.GetMd5(fingerprint) + reqCtx.SetFingerprintMD5(md5Value) + } + return reqCtx.GetFingerprintMD5() } func (se *SessionExecutor) isInTransaction() bool { - return se.status&mysql.ServerStatusInTrans > 0 || - !se.isAutoCommit() + return se.status&mysql.ServerStatusInTrans > 0 || !se.isAutoCommit() } func (se *SessionExecutor) isAutoCommit() bool { return se.status&mysql.ServerStatusAutocommit > 0 } +func (se *SessionExecutor) handleShow(reqCtx *util.RequestContext, sql string) (*mysql.Result, error) { + tokens := reqCtx.GetTokens() + if len(tokens) == 0 { + return nil, fmt.Errorf("show command is empty") + } + + // handle show databases; + if len(tokens) == 2 && strings.ToLower(tokens[1]) == "databases" { + dbs := se.GetNamespace().GetAllowedDBs() + return createShowDatabaseResult(dbs), nil + } + // readonly && readwrite user send to slave + if !se.GetNamespace().IsAllowWrite(se.user) || se.GetNamespace().IsRWSplit(se.user) { + reqCtx.SetFromSlave(1) + } + // handle show variables like '%read_only%' default to master + if strings.Contains(sql, readonlyVariable) && se.GetNamespace().IsAllowWrite(se.user) { + reqCtx.SetFromSlave(0) + } + r, err := se.ExecuteSQL(reqCtx, se.GetNamespace().GetDefaultSlice(), se.db, sql) + if err != nil { + return nil, fmt.Errorf("execute sql error, sql: %s, err: %v", sql, err) + } + + modifyResultStatus(r, se) + return r, nil +} + func (se *SessionExecutor) handleBegin() error { se.txLock.Lock() defer se.txLock.Unlock() @@ -686,6 +1039,14 @@ func (se *SessionExecutor) handleBegin() error { return err } } + + // 客户端执行 begin 时后端 MySQL 实际并未执行 + for _, co := range se.ksConns { + if err := co.Begin(); err != nil { + return err + } + } + se.status |= mysql.ServerStatusInTrans se.savepoints = []string{} return nil @@ -699,6 +1060,7 @@ func (se *SessionExecutor) handleCommit() (err error) { } +// handleRollback handle rollback and rollback to savepoint func (se *SessionExecutor) handleRollback(stmt *ast.RollbackStmt) (err error) { if stmt == nil || stmt.Savepoint == "" { return se.rollback() @@ -718,8 +1080,14 @@ func (se *SessionExecutor) commit() (err error) { err = e } pc.Recycle() + } + for _, pc := range se.ksConns { + if e := pc.Commit(); e != nil { + err = e + } + } se.txConns = make(map[string]backend.PooledConnect) se.savepoints = []string{} return @@ -733,6 +1101,10 @@ func (se *SessionExecutor) rollback() (err error) { err = pc.Rollback() pc.Recycle() } + + for _, pc := range se.ksConns { + err = pc.Rollback() + } se.txConns = make(map[string]backend.PooledConnect) se.savepoints = []string{} return @@ -744,6 +1116,9 @@ func (se *SessionExecutor) rollbackSavepoint(savepoint string) (err error) { for _, pc := range se.txConns { _, err = pc.Execute("rollback to "+savepoint, 0) } + for _, pc := range se.ksConns { + _, err = pc.Execute("rollback to "+savepoint, 0) + } if err == nil && se.isInTransaction() { if index := util.ArrayFindIndex(se.savepoints, savepoint); index > -1 { se.savepoints = se.savepoints[0:index] @@ -752,6 +1127,7 @@ func (se *SessionExecutor) rollbackSavepoint(savepoint string) (err error) { return } +// handleSavepoint handle savepoint and release savepoint func (se *SessionExecutor) handleSavepoint(stmt *ast.SavepointStmt) (err error) { se.txLock.Lock() defer se.txLock.Unlock() @@ -778,6 +1154,24 @@ func (se *SessionExecutor) handleSavepoint(stmt *ast.SavepointStmt) (err error) return } +func (se *SessionExecutor) recycleTx() { + if !se.isInTransaction() { + return + } + se.txLock.Lock() + defer se.txLock.Unlock() + se.txConns = make(map[string]backend.PooledConnect) +} + +// handleKQuit close backend connection and recycle, only called when client exit +func (se *SessionExecutor) handleKsQuit() { + for _, ksConn := range se.ksConns { + ksConn.Close() + ksConn.Recycle() + } + se.ksConns = make(map[string]backend.PooledConnect) +} + // ExecuteSQL execute sql func (se *SessionExecutor) ExecuteSQL(reqCtx *util.RequestContext, slice, db, sql string) (*mysql.Result, error) { phyDB, err := se.GetNamespace().GetDefaultPhyDB(db) @@ -785,27 +1179,26 @@ func (se *SessionExecutor) ExecuteSQL(reqCtx *util.RequestContext, slice, db, sq return nil, err } - sqls := make(map[string]map[string][]string) - dbSQLs := make(map[string][]string) - dbSQLs[phyDB] = []string{sql} - sqls[slice] = dbSQLs + pc, err := se.getBackendConn(slice, getFromSlave(reqCtx)) + defer se.recycleBackendConn(pc) - pcs, err := se.getBackendConns(sqls, getFromSlave(reqCtx)) - defer se.recycleBackendConns(pcs, false) if err != nil { - log.Warn("getUnShardConns failed: %v", err) - return nil, err + log.Warn("[ns:%s]getBackendConn failed: %v", se.GetNamespace().name, err) + return nil, fmt.Errorf("getBackendConn failed: %v", err) } - rs, err := se.executeInMultiSlices(reqCtx, pcs, sqls) + se.backendAddr = pc.GetAddr() + se.backendConnectionId = pc.GetConnectionID() + + rs, err := se.executeInSlice(reqCtx, pc, phyDB, sql) if err != nil { return nil, err } - if len(rs) == 0 { - return nil, mysql.NewError(mysql.ErrUnknown, "result is empty") + if pc.MoreRowsExist() || pc.MoreResultsExist() { + se.session.continueConn = pc } - return rs[0], nil + return rs, nil } // ExecuteSQLs len(sqls) must not be 0, or return error diff --git a/proxy/server/executor_handle.go b/proxy/server/executor_handle.go index 16152758..afd46a63 100644 --- a/proxy/server/executor_handle.go +++ b/proxy/server/executor_handle.go @@ -22,8 +22,9 @@ import ( "strings" "time" - "github.com/XiaoMi/Gaea/backend" "github.com/XiaoMi/Gaea/core/errors" + + "github.com/XiaoMi/Gaea/backend" "github.com/XiaoMi/Gaea/log" "github.com/XiaoMi/Gaea/mysql" "github.com/XiaoMi/Gaea/parser" @@ -34,7 +35,7 @@ import ( // Parse parse sql func (se *SessionExecutor) Parse(sql string) (ast.StmtNode, error) { - return se.parser.ParseOneStmt(sql, "", "") + return parser.New().ParseOneStmt(sql, "", "") } // 处理query语句 @@ -52,59 +53,128 @@ func (se *SessionExecutor) handleQuery(sql string) (r *mysql.Result, err error) sql, err.Error(), string(buf)) } - err = errors.ErrInternalServer + err = fmt.Errorf("%s:%s", errors.ErrInternalServer, e) return } }() sql = strings.TrimRight(sql, ";") //删除sql语句最后的分号 - reqCtx := util.NewRequestContext() - // check black sql + ns := se.GetNamespace() + startTime := time.Now() + + // clientQPSLimit: max client queries per second + // supportLimitTx: limit transaction queries + // qps limit error code: 901 + if se.GetNamespace().clientQPSLimit > 0 && se.GetNamespace().supportLimitTx && !se.GetNamespace().limiter.Allow() { + if se.isInTransaction() { + // if client transaction is limited, gaea will actively close client connection + err = mysql.NewSessionCloseRespError(mysql.ErrClientQpsLimitedMsg) + } else { + // if non-transaction connection is limited, gaea will not close client connection + err = fmt.Errorf(mysql.ErrClientQpsLimitedMsg) + } + } else if se.GetNamespace().clientQPSLimit > 0 && !se.GetNamespace().supportLimitTx && !se.isInTransaction() && !se.GetNamespace().limiter.Allow() { + // if non-transaction connection is limited, gaea will not close client connection + err = fmt.Errorf(mysql.ErrClientQpsLimitedMsg) + } else { + if ns.supportMultiQuery && se.session.c.capability&mysql.ClientMultiStatements != 0 { + r, err = se.doMultiStmts(reqCtx, sql) + } else { + r, err = se.doQuery(reqCtx, sql) + } + } + + se.manager.RecordSessionSQLMetrics(reqCtx, se, sql, startTime, err) + return r, err +} + +func (se *SessionExecutor) checkSQLAllowed(reqCtx *util.RequestContext, sql string) error { + stmtType := parser.Preview(sql) + reqCtx.SetStmtType(stmtType) + if isSQLNotAllowedByUser(se, stmtType) { + return fmt.Errorf("write DML is now allowed by read user") + } ns := se.GetNamespace() if !ns.IsSQLAllowed(reqCtx, sql) { - fingerprint := mysql.GetFingerprint(sql) + fingerprint := getSQLFingerprint(reqCtx, sql) log.Warn("catch black sql, sql: %s", sql) se.manager.GetStatisticManager().RecordSQLForbidden(fingerprint, se.GetNamespace().GetName()) err := mysql.NewError(mysql.ErrUnknown, "sql in blacklist") + return err + } + return nil +} + +// handle multi-stmts,like `select 1;set autcommit=0;insert into...;` +func (se *SessionExecutor) doMultiStmts(reqCtx *util.RequestContext, sql string) (r *mysql.Result, errRet error) { + if se.session.c.hasRecycledReadPacket.CompareAndSwap(false, true) { + se.session.c.RecycleReadPacket() + } + + piecesSql, err := parser.SplitStatementToPieces(sql) + if err != nil { + log.Warn("parse sql error. sql: [%s], err: %v", sql, err) return nil, err } - startTime := time.Now() - stmtType := parser.Preview(sql) - reqCtx.Set(util.StmtType, stmtType) + stmtsNum := len(piecesSql) + if stmtsNum == 1 { //single statements + return se.doQuery(reqCtx, sql) + } - r, err = se.doQuery(reqCtx, sql) - se.manager.RecordSessionSQLMetrics(reqCtx, se, sql, startTime, err) - return r, err + //multi-query + for index, piece := range piecesSql { + setContextSQLFingerprint(reqCtx, sql) + r, errRet = se.doQuery(reqCtx, piece) + if errRet != nil { + return nil, errRet + } + + if index < stmtsNum-1 { + //write result to client + response := CreateResultResponse(se.status|mysql.ServerMoreResultsExists, r, false) + if err = se.session.writeResponse(response); err != nil { + log.Warn("session write response error, error: %v", err) + se.session.Close() + return r, errRet + } + } + } + + return r, errRet } func (se *SessionExecutor) doQuery(reqCtx *util.RequestContext, sql string) (*mysql.Result, error) { - stmtType := reqCtx.Get("stmtType").(int) - - if isSQLNotAllowedByUser(se, stmtType) { - return nil, fmt.Errorf("write DML is now allowed by read user") + if err := se.checkSQLAllowed(reqCtx, sql); err != nil { + return nil, err } - if canHandleWithoutPlan(stmtType) { + if canHandleWithoutPlan(reqCtx.GetStmtType()) { return se.handleQueryWithoutPlan(reqCtx, sql) } db := se.db + if se.session == nil { + return nil, fmt.Errorf("session is nil") + } - p, err := se.getPlan(se.GetNamespace(), db, sql) + // get plan 会生成 tokens,需要放在 checkExecuteFromSlave 前面 + p, err := se.getPlan(reqCtx, se.GetNamespace(), db, sql, true) if err != nil { - return nil, fmt.Errorf("get plan error, db: %s, sql: %s, err: %v", db, sql, err) + return nil, fmt.Errorf("get plan error, db: %s, origin sql: %s, err: %v", db, sql, err) } - if canExecuteFromSlave(se, sql) { - reqCtx.Set(util.FromSlave, 1) + // 防止多语句执行的时候被复用 + if checkExecuteFromSlave(reqCtx, se, sql) { + reqCtx.SetFromSlave(1) + } else { + reqCtx.SetFromSlave(0) } - reqCtx.Set(util.DefaultSlice, se.GetNamespace().GetDefaultSlice()) + reqCtx.SetDefaultSlice(se.GetNamespace().GetDefaultSlice()) r, err := p.ExecuteIn(reqCtx, se) if err != nil { - log.Warn("execute select: %s", err.Error()) return nil, err } @@ -113,22 +183,55 @@ func (se *SessionExecutor) doQuery(reqCtx *util.RequestContext, sql string) (*my return r, nil } +func checkMyCatHintPlan(reqCtx *util.RequestContext, se *SessionExecutor, db string, comments parser.MarginComments) (plan.Plan, error) { + if !strings.HasPrefix(strings.TrimSpace(comments.Trailing), mycatHint) { + return nil, nil + } + + hintSQL := getMyCatHintSQL(comments.Trailing) + if hintSQL == "" { + return nil, fmt.Errorf("get nil hintSQL.comments:%+v", comments) + } + hintPlan, err := se.getPlan(reqCtx, se.GetNamespace(), db, hintSQL, false) + if err != nil { + return nil, fmt.Errorf("get MyCat hintPlan error") + } + return hintPlan, nil +} + // 处理逻辑较简单的SQL, 不走执行计划部分 func (se *SessionExecutor) handleQueryWithoutPlan(reqCtx *util.RequestContext, sql string) (*mysql.Result, error) { + tokens := parser.Tokenize(sql) + if len(tokens) == 0 { + return nil, fmt.Errorf("tokenize sql error, sql: %s", sql) + } + reqCtx.SetTokens(tokens) + + stmtType := reqCtx.GetStmtType() + + // handle show to prevent parsing error in some cases like sql mode has ANSI_QUOTES + if stmtType == parser.StmtShow { + return se.handleShow(reqCtx, sql) + } + n, err := se.Parse(sql) if err != nil { return nil, fmt.Errorf("parse sql error, sql: %s, err: %v", sql, err) } switch stmt := n.(type) { - case *ast.ShowStmt: - return se.handleShow(reqCtx, sql, stmt) case *ast.SetStmt: return se.handleSet(reqCtx, sql, stmt) case *ast.BeginStmt: return nil, se.handleBegin() case *ast.CommitStmt: return nil, se.handleCommit() + case *ast.LockTablesStmt: + // TODO: handle lock tables + // TODO: unify sql exec time + se.manager.statistics.generalLogger.Warn("%s - %dms - ns=%s, %s@%s->%s/%s, connect_id=%d, mysql_connect_id=%d, transaction=%t|%v. err:%s", + SQLExecStatusIgnore, 0, se.namespace, se.user, se.clientAddr, "", se.db, se.session.c.GetConnectionID(), 0, se.isInTransaction(), sql, "ignore lock tables") + return nil, nil case *ast.RollbackStmt: return nil, se.handleRollback(stmt) case *ast.SavepointStmt: @@ -153,46 +256,113 @@ func (se *SessionExecutor) handleUseDB(dbName string) error { return mysql.NewDefaultError(mysql.ErrNoDB) } -func (se *SessionExecutor) getPlan(ns *Namespace, db string, sql string) (plan.Plan, error) { +func (se *SessionExecutor) getPlan(reqCtx *util.RequestContext, ns *Namespace, db string, sql string, checkHint bool) (plan.Plan, error) { + p, isUnshardPlan := se.preBuildUnshardPlan(reqCtx, db, sql) + if isUnshardPlan { + return p, nil + } n, err := se.Parse(sql) if err != nil { + // 如果是注释的情况,则忽略 + if reqCtx.GetStmtType() == parser.StmtComment { + se.manager.statistics.generalLogger.Warn("%s - %dms - ns=%s, %s@%s->%s/%s, connect_id=%d, mysql_connect_id=%d, transaction=%t|%v. err:%s", + SQLExecStatusIgnore, 0, se.namespace, se.user, se.clientAddr, "", se.db, se.session.c.GetConnectionID(), 0, se.isInTransaction(), sql, "ignore syntax error") + return plan.CreateIgnorePlan(), nil + } return nil, fmt.Errorf("parse sql error, sql: %s, err: %v", sql, err) } - rt := ns.GetRouter() - seq := ns.GetSequences() - phyDBs := ns.GetPhysicalDBs() - p, err := plan.BuildPlan(n, phyDBs, db, sql, rt, seq) + var hintPlan plan.Plan + if checkHint { + //TODO: 获取 token 没有处理 `/* !mycat:sql=` hint,所以需要在这里处理下 + _, comments := extractPrefixCommentsAndRewrite(sql, se.session.proxy.ServerVersionCompareStatus) + hintPlan, err = checkMyCatHintPlan(reqCtx, se, db, comments) + // get MyCat hint plan error,will only log + if err != nil { + log.Notice("check MyCat hint plan err:%s", err) + } + } + + p, err = plan.BuildPlan(n, ns.GetPhysicalDBs(), db, sql, ns.GetRouter(), ns.GetSequences(), hintPlan) if err != nil { - return nil, fmt.Errorf("create select plan error: %v", err) + return nil, fmt.Errorf("build plan error: %v", err) } return p, nil } -func (se *SessionExecutor) handleShow(reqCtx *util.RequestContext, sql string, stmt *ast.ShowStmt) (*mysql.Result, error) { - switch stmt.Tp { - case ast.ShowDatabases: - dbs := se.GetNamespace().GetAllowedDBs() - return createShowDatabaseResult(dbs), nil - case ast.ShowVariables: - if strings.Contains(sql, gaeaGeneralLogVariable) { - return createShowGeneralLogResult(), nil +// preBuildUnshardPlan pre-build unshard plan by shard rules or tokens +func (se *SessionExecutor) preBuildUnshardPlan(reqCtx *util.RequestContext, db string, sql string) (plan.Plan, bool) { + rt := se.GetNamespace().GetRouter() + phyDBs := se.GetNamespace().GetPhysicalDBs() + + tokens := parser.Tokenize(sql) + if len(tokens) == 0 { + return nil, false + } + + // to be used to check master hint + reqCtx.SetTokens(tokens) + + // StmtComment not in UnshardPlan + if reqCtx.GetStmtType() == parser.StmtComment { + return nil, false + } + + // select last_insert_id() not in UnshardPlan 使用长度判断,进一步降低命中的概率 + if len(tokens) > 1 && len(tokens[1]) > 13 && len(tokens[1]) < 17 { + // select last_insert_id(); select last_insert_id (); select last_insert_id ( );select last_insert_id( ); + // select last_insert_id() as last_id; select last_insert_id () as last_id; select last_insert_id ( ) as last_id; select last_insert_id( ) as last_id; + if compressSQL := strings.Join(tokens, ""); util.HasUpperPrefix(compressSQL, lastInsetIdMark) { + return nil, false } - fallthrough + } + + // preCheck unshard sql + // 1. no shard rules return unshard plan directly + if len(rt.GetAllRules()) == 0 { + p, err := plan.PreCreateUnshardPlan(sql, phyDBs, db) + if err == nil { + return p, true + } + // if err occur, will further check sql + log.Notice("pre create unshard plan with no sharding rules,will further check sql, ns:%s, sql: %s, err: %v", se.GetNamespace().GetName(), sql, err) + } + + // 2. check sql, if all tables in sql are unshard, return unshard plan + ruleDB := db + isUnshardPlan := true + tokenId, ok := mysql.ParseTokenMap[strings.ToLower(tokens[0])] + if !ok { + return nil, false + } + + // TODO: deal with more sql type and optimize + switch tokenId { + case mysql.TkIdSelect, mysql.TkIdDelete: + ruleDB, isUnshardPlan = plan.CheckUnshardBase(tokenId, tokens, rt, db) + case mysql.TkIdReplace, mysql.TkIdInsert: + ruleDB, isUnshardPlan = plan.CheckUnshardInsert(tokens, rt, db) + case mysql.TkIdUpdate: + ruleDB, isUnshardPlan = plan.CheckUnshardUpdate(tokens, rt, db) default: - r, err := se.ExecuteSQL(reqCtx, se.GetNamespace().GetDefaultSlice(), se.db, sql) - if err != nil { - return nil, fmt.Errorf("execute sql error, sql: %s, err: %v", sql, err) + return nil, false + } + + if isUnshardPlan { + // check databases and tables in sql + p, err := plan.PreCreateUnshardPlan(sql, phyDBs, ruleDB) + if err == nil { + return p, true } - modifyResultStatus(r, se) - return r, nil } + + return nil, false } func (se *SessionExecutor) handleSet(reqCtx *util.RequestContext, sql string, stmt *ast.SetStmt) (*mysql.Result, error) { for _, v := range stmt.Variables { - if err := se.handleSetVariable(v); err != nil { + if err := se.handleSetVariable(sql, v); err != nil { return nil, err } } @@ -200,7 +370,7 @@ func (se *SessionExecutor) handleSet(reqCtx *util.RequestContext, sql string, st return nil, nil } -func (se *SessionExecutor) handleSetVariable(v *ast.VariableAssignment) error { +func (se *SessionExecutor) handleSetVariable(sql string, v *ast.VariableAssignment) error { if v.IsGlobal { return fmt.Errorf("does not support set variable in global scope") } @@ -216,13 +386,16 @@ func (se *SessionExecutor) handleSetVariable(v *ast.VariableAssignment) error { se.collation = se.GetNamespace().GetDefaultCollationID() return nil } - cid, ok := mysql.CharsetIds[charset] - if !ok { - return mysql.NewDefaultError(mysql.ErrUnknownCharacterSet, charset) + + if err := se.sessionVariables.Set(name, charset); err != nil { + return err } - se.charset = charset - se.collation = cid + return nil + case "group_concat_max_len": + concatMaxLen := getVariableExprResult(v.Value) + return se.setIntSessionVariable(mysql.GroupConcatMaxLen, concatMaxLen) + case "autocommit": value := getVariableExprResult(v.Value) if value == mysql.KeywordDefault || value == "on" || value == "1" { @@ -267,7 +440,7 @@ func (se *SessionExecutor) handleSetVariable(v *ast.VariableAssignment) error { se.collation = collationID return nil case "sql_mode": - sqlMode := getVariableExprResult(v.Value) + sqlMode := getSqlModeExprResult(v.Value) return se.setStringSessionVariable(mysql.SQLModeStr, sqlMode) case "sql_safe_updates": value := getVariableExprResult(v.Value) @@ -286,10 +459,24 @@ func (se *SessionExecutor) handleSetVariable(v *ast.VariableAssignment) error { case "wait_timeout", "interactive_timeout", "net_write_timeout", "net_read_timeout": return nil case "sql_select_limit": - return nil - // unsupported + value := getVariableExprResult(v.Value) + return se.setIntSessionVariable(mysql.SQLSelectLimit, value) case "transaction": return fmt.Errorf("does not support set transaction in gaea") + case "tx_read_only", "transaction_read_only": + //set session transaction read only; set session transaction read write ... + value := getVariableExprResult(v.Value) + onOffValue, err := getOnOffVariable(value) + if err != nil { + return mysql.NewDefaultError(mysql.ErrWrongValueForVar, name, value) + } + + // mysql 8.0.3 not support tx_read_only + if name == "tx_read_only" && !se.session.proxy.ServerVersionCompareStatus.LessThanMySQLVersion803 { + return se.setIntSessionVariable("transaction_read_only", onOffValue) + } + + return se.setIntSessionVariable(name, onOffValue) case gaeaGeneralLogVariable: value := getVariableExprResult(v.Value) onOffValue, err := getOnOffVariable(value) @@ -298,6 +485,35 @@ func (se *SessionExecutor) handleSetVariable(v *ast.VariableAssignment) error { } return se.setGeneralLogVariable(onOffValue) default: + // 从命名空间获取允许用户配置的会话变量 + allowedVariables := se.GetNamespace().GetAllowedSessionVariables() + // 如果变量名在命名空间中,则进行类型检查 + if variableType, ok := allowedVariables[name]; ok { + switch variableType { + case "int": + value := getVariableExprResult(v.Value) + return se.setIntSessionVariable(name, value) + case "string": + value := getVariableExprResult(v.Value) + return se.setStringSessionVariable(name, value) + case "bool": + value := getVariableExprResult(v.Value) + onOffValue, err := getOnOffVariable(value) + if err != nil { + return mysql.NewDefaultError(mysql.ErrWrongValueForVar, name, value) + } + return se.setIntSessionVariable(name, onOffValue) + default: + value := getVariableExprResult(v.Value) + log.Warn("Unsupported session variable type for variable name: %s\n variable value %s\n", name, value) + } + } + + // unsupported variables will be ignored and logged to avoid user confusion + // TODO: refactor sql exec time log + se.manager.statistics.generalLogger.Warn("%s - %dms - ns=%s, %s@%s->%s/%s, connect_id=%d, mysql_connect_id=%d, transaction=%t|%v. err:%s", + SQLExecStatusIgnore, 0, se.namespace, se.user, se.clientAddr, "", se.db, se.session.c.GetConnectionID(), 0, se.isInTransaction(), + sql, fmt.Sprintf("variable(%s) not supported", name)) return nil } } @@ -333,12 +549,13 @@ func (se *SessionExecutor) handleStmtPrepare(sql string) (*Stmt, error) { sql = strings.TrimRight(sql, ";") stmt.sql = sql - paramCount, offsets, err := calcParams(stmt.sql) + paramCount, offsets, sqlItems, err := CalcParams(stmt.sql) if err != nil { log.Warn("prepare calc params failed, namespace: %s, sql: %s", se.GetNamespace().GetName(), sql) return nil, err } + stmt.sqlItems = sqlItems stmt.paramCount = paramCount stmt.offsets = offsets stmt.id = se.stmtID @@ -374,7 +591,7 @@ func (se *SessionExecutor) handleFieldList(data []byte) ([]*mysql.Field, error) if err != nil { return nil, err } - defer se.recycleBackendConn(pc, false) + defer se.recycleBackendConn(pc) phyDB, err := se.GetNamespace().GetDefaultPhyDB(se.GetDatabase()) if err != nil { @@ -392,3 +609,33 @@ func (se *SessionExecutor) handleFieldList(data []byte) ([]*mysql.Field, error) return fs, nil } + +func (se *SessionExecutor) handleKeepSessionPing() (err error) { + for _, ksConn := range se.ksConns { + if err = ksConn.PingWithTimeout(backend.GetConnTimeout); err != nil { + ksConn.Close() + break + } + } + + if err != nil { + for _, ksConn := range se.ksConns { + if se.isInTransaction() { + ksConn.Close() + } + ksConn.Recycle() + } + return mysql.ErrBadConn + } + + return nil +} + +// getMyCatHintSQL get SQL from MyCat hints +func getMyCatHintSQL(hints string) string { + tmp := strings.Split(hints, mycatHint+"sql=") + if len(tmp) < 2 { + return "" + } + return strings.TrimSpace(strings.TrimRight(tmp[1], "*/")) +} diff --git a/proxy/server/executor_stmt.go b/proxy/server/executor_stmt.go index d807d49f..7d92b137 100644 --- a/proxy/server/executor_stmt.go +++ b/proxy/server/executor_stmt.go @@ -29,24 +29,24 @@ package server import ( + "bytes" "encoding/binary" "errors" "fmt" - "math" - "strconv" - "github.com/XiaoMi/Gaea/mysql" "github.com/XiaoMi/Gaea/util" + "math" + "strconv" ) var p = &mysql.Field{Name: []byte("?")} var c = &mysql.Field{} -func calcParams(sql string) (paramCount int, offsets []int, err error) { - count := 0 +func CalcParams(sql string) (count int, offsets []int, sqlItems []string, err error) { quoteChar := "" - paramCount = 0 offsets = make([]int, 0) + sqlItems = make([]string, 0) + subBeginIndex := 0 for i, elem := range []byte(sql) { if elem == '\\' { @@ -60,16 +60,22 @@ func calcParams(sql string) (paramCount int, offsets []int, err error) { } else if quoteChar == "" && elem == '?' { count++ offsets = append(offsets, i) + sqlItems = append(sqlItems, sql[subBeginIndex:i], "?") + subBeginIndex = i + 1 } + } + // sub string behind the last "?", eg: select * from t where id = ? limit 1 + if subBeginIndex != len(sql) { + sqlItems = append(sqlItems, sql[subBeginIndex:]) } + + // quote char not match if quoteChar != "" { err = fmt.Errorf("fatal situation") return } - paramCount = count - return } @@ -93,6 +99,7 @@ type Stmt struct { paramCount int paramTypes []byte offsets []int + sqlItems []string } // ResetParams reset args @@ -110,24 +117,24 @@ func (s *Stmt) GetParamTypes() []byte { // GetRewriteSQL get rewrite sql func (s *Stmt) GetRewriteSQL() (string, error) { - sql := s.sql - var tmp = "" - var pos = 0 - var offset = 0 - var quote = false - for i := 0; i < s.paramCount; i++ { - quote, tmp = util.ItoString(s.args[i]) - tmp = escapeSQL(tmp) - pos = s.offsets[i] - if quote { - sql = util.Concat(sql[:pos+offset], "'", tmp, "'", sql[pos+offset+1:]) - offset = offset + len(tmp) - 1 + 2 + var buffer bytes.Buffer + index := 0 + + for i := 0; i < len(s.sqlItems); i++ { + if s.sqlItems[i] == "?" { + quote, tmp := util.ItoString(s.args[index]) + index++ + tmp = escapeSQL(tmp) + if quote { + tmp = "'" + tmp + "'" + } + buffer.WriteString(tmp) } else { - sql = util.Concat(sql[:pos+offset], tmp, sql[pos+offset+1:]) - offset = offset + len(tmp) - 1 + buffer.WriteString(s.sqlItems[i]) } } - return sql, nil + + return buffer.String(), nil } func (se *SessionExecutor) handleStmtExecute(data []byte) (*mysql.Result, error) { @@ -198,25 +205,9 @@ func (se *SessionExecutor) handleStmtExecute(data []byte) (*mysql.Result, error) } else { executeSQL = s.sql } - defer s.ResetParams() - // execute sql using ComQuery - r, err := se.handleQuery(executeSQL) - if err != nil { - return nil, err - } - - // build binary result set - if r != nil && r.Resultset != nil { - resultSet, err := mysql.BuildBinaryResultset(r.Fields, r.Values) - if err != nil { - return nil, err - } - r.Resultset = resultSet - } - - return r, nil + return se.handleQuery(executeSQL) } // long data and generic args are all in s.args @@ -226,6 +217,7 @@ func (se *SessionExecutor) bindStmtArgs(s *Stmt, nullBitmap, paramTypes, paramVa pos := 0 var v []byte + n := 0 var isNull bool for i := 0; i < s.paramCount; i++ { @@ -320,12 +312,56 @@ func (se *SessionExecutor) bindStmtArgs(s *Stmt, nullBitmap, paramTypes, paramVa pos += 8 continue + case mysql.TypeDate, mysql.TypeNewDate: + if len(paramValues) < (pos + 1) { + return mysql.ErrMalformPacket + } + + n = int(paramValues[pos]) + pos++ + tVal, err := mysql.FormatBinaryDate(n, paramValues[pos:pos+n]) + pos += n + if err != nil { + return err + } + args[i] = tVal + continue + + case mysql.TypeDuration: + if len(paramValues) < (pos + 1) { + return mysql.ErrMalformPacket + } + + n = int(paramValues[pos]) + pos++ + tVal, err := mysql.FormatBinaryTime(n, paramValues[pos:pos+n]) + pos += n + if err != nil { + return err + } + args[i] = tVal + continue + + case mysql.TypeTimestamp, mysql.TypeDatetime: + if len(paramValues) < (pos + 1) { + return mysql.ErrMalformPacket + } + + n := int(paramValues[pos]) + pos++ + tVal, err := mysql.FormatBinaryDateTime(n, paramValues[pos:pos+n]) + pos += n + if err != nil { + return err + } + args[i] = tVal + continue + case mysql.TypeDecimal, mysql.TypeNewDecimal, mysql.TypeVarchar, mysql.TypeBit, mysql.TypeEnum, mysql.TypeSet, mysql.TypeTinyBlob, mysql.TypeMediumBlob, mysql.TypeLongBlob, mysql.TypeBlob, mysql.TypeVarString, mysql.TypeString, mysql.TypeGeometry, - mysql.TypeDate, mysql.TypeNewDate, - mysql.TypeTimestamp, mysql.TypeDatetime, mysql.TypeDuration, mysql.TypeJSON: + mysql.TypeJSON: if len(paramValues) < (pos + 1) { return mysql.ErrMalformPacket } diff --git a/proxy/server/executor_stmt_test.go b/proxy/server/executor_stmt_test.go index a24fee98..12c72763 100644 --- a/proxy/server/executor_stmt_test.go +++ b/proxy/server/executor_stmt_test.go @@ -24,18 +24,20 @@ func Test_calcParams(t *testing.T) { "order_id in ('1321989216361392') and\n" + "project_id = 371 and\n" + "order_status = 2" - paramCount, offsets, err := calcParams(sql) + paramCount, offsets, sqlItems, err := CalcParams(sql) t.Log(paramCount) t.Log(offsets) + t.Log(sqlItems) t.Log(err) if err != nil { t.Logf("test calcParams failed, %v\n", err) } sql = "select * from t1 where id = ? and col = ?" - paramCount, offsets, err = calcParams(sql) + paramCount, offsets, sqlItems, err = CalcParams(sql) t.Log(paramCount) t.Log(offsets) + t.Log(sqlItems) t.Log(err) if err != nil || paramCount != 2 { t.Logf("test calcParams failed, %v\n", err) diff --git a/proxy/server/executor_test.go b/proxy/server/executor_test.go index 9b659711..0967a4f3 100644 --- a/proxy/server/executor_test.go +++ b/proxy/server/executor_test.go @@ -4,7 +4,7 @@ // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // -// http://www.apache.org/licenses/LICENSE-2.0 +// http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, @@ -17,21 +17,26 @@ import ( "context" "encoding/json" "fmt" + "reflect" + "strings" + "sync" "testing" "github.com/XiaoMi/Gaea/backend" - "github.com/XiaoMi/Gaea/backend/mocks" "github.com/XiaoMi/Gaea/log" "github.com/XiaoMi/Gaea/models" "github.com/XiaoMi/Gaea/mysql" "github.com/XiaoMi/Gaea/parser" "github.com/XiaoMi/Gaea/parser/ast" + "github.com/XiaoMi/Gaea/proxy/plan" "github.com/XiaoMi/Gaea/util" "github.com/golang/mock/gomock" "github.com/stretchr/testify/assert" "gopkg.in/ini.v1" ) +var localManager *Manager + func TestGetVariableExprResult(t *testing.T) { tests := []struct { variable []string @@ -54,7 +59,7 @@ func TestGetVariableExprResult(t *testing.T) { for _, v := range stmt.Variables { actual := getVariableExprResult(v.Value) if actual != test.expect { - t.Errorf("not equal, expect: %v, actual: %v", test.expect, actual) + t.Errorf("not equal, fromSlave: %v, actual: %v", test.expect, actual) } } } @@ -62,48 +67,113 @@ func TestGetVariableExprResult(t *testing.T) { } } +func (se *SessionExecutor) forTest(sql string, ctx *util.RequestContext) error { + _, err := se.doQuery(ctx, sql) + return err +} + +// Test for CheckSelectLock +func TestTokensSplit(t *testing.T) { + type testCase struct { + sql string + expectedTrimmed []string + } + + testCases := []testCase{ + {"select id,name from t1", []string{"select", "id", "name", "from", "t1"}}, + {"select id,name from t1\n", []string{"select", "id", "name", "from", "t1"}}, + {"select id,name from t1\r", []string{"select", "id", "name", "from", "t1"}}, + {"select \t id,name \nfrom t1", []string{"select", "id", "name", "from", "t1"}}, + {"select / id,name from t1", []string{"select", "id", "name", "from", "t1"}}, + } + + for _, test := range testCases { + res := strings.FieldsFunc(test.sql, func(r rune) bool { + return r == ' ' || r == ',' || + r == '\t' || r == '/' || + r == '\n' || r == '\r' + }) + assert.Equal(t, res, test.expectedTrimmed) + } +} + func TestExecute(t *testing.T) { se, err := prepareSessionExecutor() if err != nil { t.Fatal("prepare session executer error:", err) return } - mockCtrl := gomock.NewController(t) - defer mockCtrl.Finish() + se.session.proxy.ServerVersionCompareStatus = util.NewVersionCompareStatus("") + + reqCtx := util.NewRequestContext() + + reqCtx.SetStmtType(parser.StmtSelect) + reqCtx.SetFromSlave(0) + + type testCase struct { + sql string + expectFromSlave int + } + + testCases := []testCase{ + {"/*master*/ select * from t1", 0}, + {"select * from t1", 1}, + {"select /*master*/ * from t1", 0}, + {"/*master*/ select /*master*/ * from t1", 0}, + {"/*master*/ select /* master*/ * from t1", 0}, + {"select /* master*/ * from t1", 1}, + {"/*master */ select * from t1", 1}, + {"/*master*/ select * from t1 inner join t2 on t1.id = t2.id", 0}, + {"select /*master*/ * from t1 inner join t2 on t1.id = t2.id", 0}, + } + + for _, ca := range testCases { + t.Run(ca.sql, func(t *testing.T) { + _ = se.forTest(ca.sql, reqCtx) + assert.Equal(t, reqCtx.GetFromSlave(), ca.expectFromSlave) + reqCtx.SetFromSlave(0) + }) + } + mockCtl := gomock.NewController(t) + defer mockCtl.Finish() + slice0MasterPool := backend.NewMockConnectionPool(mockCtl) + slice1MasterPool := backend.NewMockConnectionPool(mockCtl) + + slice0Status := &sync.Map{} + slice0Status.Store(0, backend.StatusUp) + + slice1Status := &sync.Map{} + slice1Status.Store(0, backend.StatusUp) - slice0MasterPool := new(mocks.ConnectionPool) - slice0SlavePool := new(mocks.ConnectionPool) - slice1MasterPool := new(mocks.ConnectionPool) - slice1SlavePool := new(mocks.ConnectionPool) - se.manager.GetNamespace("test_executor_namespace").slices["slice-0"].Master = slice0MasterPool - se.manager.GetNamespace("test_executor_namespace").slices["slice-0"].Slave = []backend.ConnectionPool{slice0SlavePool} - se.manager.GetNamespace("test_executor_namespace").slices["slice-1"].Master = slice1MasterPool - se.manager.GetNamespace("test_executor_namespace").slices["slice-1"].Slave = []backend.ConnectionPool{slice1SlavePool} + se.manager.GetNamespace("test_executor_namespace").slices["slice-0"].Master = &backend.DBInfo{ConnPool: []backend.ConnectionPool{slice0MasterPool}, StatusMap: slice0Status} + se.manager.GetNamespace("test_executor_namespace").slices["slice-0"].Slave = &backend.DBInfo{} + se.manager.GetNamespace("test_executor_namespace").slices["slice-1"].Master = &backend.DBInfo{ConnPool: []backend.ConnectionPool{slice1MasterPool}, StatusMap: slice1Status} + se.manager.GetNamespace("test_executor_namespace").slices["slice-1"].Slave = &backend.DBInfo{} expectResult1 := &mysql.Result{} expectResult2 := &mysql.Result{} //slice-0 - ctx := context.Background() - slice0MasterConn := new(mocks.PooledConnect) - slice0MasterConn.On("GetConnectionID").Return(int64(1)) - slice0MasterPool.On("Get", ctx).Return(slice0MasterConn, nil).Once() - slice0MasterConn.On("UseDB", "db_mycat_0").Return(nil) - slice0MasterConn.On("SetCharset", "utf8", mysql.CharsetIds["utf8"]).Return(false, nil) - slice0MasterConn.On("SetSessionVariables", mysql.NewSessionVariables()).Return(false, nil) - slice0MasterConn.On("GetAddr").Return("127.0.0.1:3306") - slice0MasterConn.On("Execute", "SELECT * FROM `tbl_mycat` WHERE `k`=0", defaultMaxSqlResultSize).Return(expectResult1, nil) - slice0MasterConn.On("Recycle").Return(nil) + slice0MasterConn := backend.NewMockPooledConnect(mockCtl) + slice0MasterConn.EXPECT().GetConnectionID().Return(int64(1)).AnyTimes() + slice0MasterConn.EXPECT().UseDB("db_mycat_0").Return(nil) + slice0MasterConn.EXPECT().SetCharset("utf8", mysql.CharsetIds["utf8"]).Return(false, nil) + slice0MasterConn.EXPECT().SetSessionVariables(mysql.NewSessionVariables()).Return(false, nil) + slice0MasterConn.EXPECT().GetAddr().Return("127.0.0.1:3306").AnyTimes() + slice0MasterConn.EXPECT().Execute("SELECT * FROM `tbl_mycat` WHERE `k`=0", defaultMaxSqlResultSize).Return(expectResult1, nil) + slice0MasterConn.EXPECT().Recycle().Return() //slice-1 - slice1MasterConn := new(mocks.PooledConnect) - slice1MasterConn.On("GetConnectionID").Return(int64(2)) - slice1MasterPool.On("Get", ctx).Return(slice1MasterConn, nil).Once() - slice1MasterConn.On("UseDB", "db_mycat_2").Return(nil) - slice1MasterConn.On("SetCharset", "utf8", mysql.CharsetIds["utf8"]).Return(false, nil) - slice1MasterConn.On("SetSessionVariables", mysql.NewSessionVariables()).Return(false, nil) - slice1MasterConn.On("GetAddr").Return("127.0.0.1:3306") - slice1MasterConn.On("Execute", "SELECT * FROM `tbl_mycat` WHERE `k`=0", defaultMaxSqlResultSize).Return(expectResult2, nil) - slice1MasterConn.On("Recycle").Return(nil) + slice1MasterConn := backend.NewMockPooledConnect(mockCtl) + slice1MasterConn.EXPECT().GetConnectionID().Return(int64(2)).AnyTimes() + slice1MasterConn.EXPECT().UseDB("db_mycat_2").Return(nil) + slice1MasterConn.EXPECT().SetCharset("utf8", mysql.CharsetIds["utf8"]).Return(false, nil) + slice1MasterConn.EXPECT().SetSessionVariables(mysql.NewSessionVariables()).Return(false, nil) + slice1MasterConn.EXPECT().GetAddr().Return("127.0.0.1:3306").AnyTimes() + slice1MasterConn.EXPECT().Execute("SELECT * FROM `tbl_mycat` WHERE `k`=0", defaultMaxSqlResultSize).Return(expectResult2, nil) + slice1MasterConn.EXPECT().Recycle().Return() + + slice0MasterPool.EXPECT().Get(context.TODO()).Return(slice0MasterConn, nil) + slice1MasterPool.EXPECT().Get(context.TODO()).Return(slice1MasterConn, nil) sqls := map[string]map[string][]string{ "slice-0": { @@ -117,8 +187,7 @@ func TestExecute(t *testing.T) { ret := make([]*mysql.Result, 0) ret = append(ret, expectResult1, expectResult2) - reqCtx := util.NewRequestContext() - reqCtx.Set(util.StmtType, parser.StmtInsert) + reqCtx.SetStmtType(parser.StmtInsert) rs, err := se.ExecuteSQLs(reqCtx, sqls) assert.Equal(t, nil, err) @@ -129,12 +198,15 @@ func prepareSessionExecutor() (*SessionExecutor, error) { var userName = "test_executor" var namespaceName = "test_executor_namespace" var database = "db_ks" - - m, err := prepareNamespaceManager() - if err != nil { - return nil, err + var err error + if localManager == nil { + localManager, err = prepareNamespaceManager() + if err != nil { + return nil, err + } } - executor := newSessionExecutor(m) + + executor := newSessionExecutor(localManager) executor.user = userName collationID := 33 // "utf8" @@ -143,9 +215,18 @@ func prepareSessionExecutor() (*SessionExecutor, error) { // set database executor.SetDatabase(database) executor.namespace = namespaceName + cc := new(Session) + cc.proxy = &Server{ + manager: localManager, + ServerVersion: "5.7.25-gaea", + } + executor.session = cc + executor.SetContextNamespace() return executor, nil } +type ModifyNamespaceFunc func(nsConfig *models.Namespace) + func prepareNamespaceManager() (*Manager, error) { proxyCfg := ` ; config type, etcd/file, you can test gaea with file type, you shoud use etcd in production @@ -258,7 +339,22 @@ encrypt_key=1234abcd5678efg* "namespace": "test_executor_namespace", "rw_flag": 2, "rw_split": 1 + }, + { + "user_name": "test_executor_w", + "password": "test_executor", + "namespace": "test_executor_namespace", + "rw_flag": 2, + "rw_split": 0 + }, + { + "user_name": "test_executor_r", + "password": "test_executor", + "namespace": "test_executor_namespace", + "rw_flag": 1, + "rw_split": 1 } + ], "default_slice": "slice-0", "max_sql_execute_time": 0 @@ -301,3 +397,957 @@ encrypt_key=1234abcd5678efg* m.users[current] = user return m, nil } + +func initNamespaceConfig() *models.Namespace { + namespaceConfig := &models.Namespace{} + nsCfg := ` +{ + "name": "test_executor_namespace", + "online": true, + "read_only": true, + "allowed_dbs": { + "db_ks": true, + "db_mycat": true + }, + "default_phy_dbs": { + "db_ks": "db_ks", + "db_mycat": "db_mycat_0" + }, + "slices": [ + { + "name": "slice-0", + "user_name": "root", + "password": "root", + "master": "127.0.0.1:3306", + "slave":[ + "127.0.0.1:3307" + ], + "capacity": 64, + "max_capacity": 128, + "idle_timeout": 3600 + }, + { + "name": "slice-1", + "user_name": "root", + "password": "root", + "master": "127.0.0.1:13306", + "slave":[ + "127.0.0.1:13307" + ], + "capacity": 64, + "max_capacity": 128, + "idle_timeout": 3600 + } + ], + "shard_rules": [ + { + "db": "db_ks", + "table": "tbl_ks", + "type": "mod", + "key": "id", + "locations": [ + 2, + 2 + ], + "slices": [ + "slice-0", + "slice-1" + ] + } + ], + "users": [ + { + "user_name": "test_executor", + "password": "test_executor", + "namespace": "test_executor_namespace", + "rw_flag": 2, + "rw_split": 1 + }, + { + "user_name": "test_executor_w", + "password": "test_executor", + "namespace": "test_executor_namespace", + "rw_flag": 2, + "rw_split": 0 + }, + { + "user_name": "test_executor_r", + "password": "test_executor", + "namespace": "test_executor_namespace", + "rw_flag": 1, + "rw_split": 1 + } + + ], + "default_slice": "slice-0", + "max_sql_execute_time": 0 +}` + if err := json.Unmarshal([]byte(nsCfg), namespaceConfig); err != nil { + return nil + } + return namespaceConfig +} +func modifyDefaultNamespace(mnFunc ModifyNamespaceFunc, m *Manager) error { + nsConfig := initNamespaceConfig() + if mnFunc != nil { + mnFunc(nsConfig) + } + if err := m.ReloadNamespacePrepare(nsConfig); err != nil { + return err + } + if err := m.ReloadNamespaceCommit(nsConfig.Name); err != nil { + return err + } + return nil +} + +func newDefaultSessionExecutor(mnFunc ModifyNamespaceFunc) (*SessionExecutor, error) { + var err error + if localManager == nil { + localManager, err = prepareNamespaceManager() + if err != nil { + return nil, err + } + } + + err = modifyDefaultNamespace(mnFunc, localManager) + if err != nil { + return nil, err + } + + c := newSessionExecutor(localManager) + c.namespace = "test_executor_namespace" + c.user = "test_executor" + c.db = "db_ks" + cc := new(Session) + cc.proxy = &Server{ + manager: localManager, + ServerVersion: "5.7.25-gaea", + } + cc.c = &ClientConn{Conn: &mysql.Conn{}} + c.session = cc + c.SetContextNamespace() + return c, nil +} + +// test checkExecuteFromSlave +func TestCanExecuteFromSlave(t *testing.T) { + var userPriv = map[string]string{ + "read_write_split": "test_executor", // rw_flag: 2, rw_split: 1 + "write_only": "test_executor_w", // rw_flag: 2, rw_split: 0 + "read_only": "test_executor_r", // rw_flag: 1, rw_split: 1 + } + type TestCase struct { + name string + sql string + userList []string + expectFromSlaves []bool + } + + testCases := []TestCase{ + { + name: "test show read_only", + sql: `show variables like "read_only";`, + userList: []string{userPriv["read_write_split"], userPriv["write_only"], userPriv["read_only"]}, + expectFromSlaves: []bool{false, false, true}, + }, + { + name: "test show read_", + sql: `show variables like "read_";`, + userList: []string{userPriv["read_write_split"], userPriv["write_only"], userPriv["read_only"]}, + expectFromSlaves: []bool{true, false, true}, + }, + { + name: "test show global status", + sql: `show global status like "uptime";`, + userList: []string{userPriv["read_write_split"], userPriv["write_only"], userPriv["read_only"]}, + expectFromSlaves: []bool{true, false, true}, + }, + { + name: "test select read_only", + sql: "select @@read_only;", + userList: []string{userPriv["read_write_split"], userPriv["write_only"], userPriv["read_only"]}, + expectFromSlaves: []bool{false, false, true}, + }, + { + name: "test select global read_only", + sql: "select @@global.read_only;", + userList: []string{userPriv["read_write_split"], userPriv["write_only"], userPriv["read_only"]}, + expectFromSlaves: []bool{false, false, true}, + }, + { + name: "test select simple", + sql: "select * from t", + userList: []string{userPriv["read_write_split"], userPriv["write_only"], userPriv["read_only"]}, + expectFromSlaves: []bool{true, false, true}, + }, + { + name: "test select simple where id=?", + sql: "select * from t", + userList: []string{userPriv["read_write_split"], userPriv["write_only"], userPriv["read_only"]}, + expectFromSlaves: []bool{true, false, true}, + }, + { + name: "test select master hint", + sql: "/*master*/ select * from t", + userList: []string{userPriv["read_write_split"], userPriv["write_only"], userPriv["read_only"]}, + expectFromSlaves: []bool{false, false, true}, + }, + { + name: "test prepare select master hint", + sql: "/*master*/ select * from t where id=?", + userList: []string{userPriv["read_write_split"], userPriv["write_only"], userPriv["read_only"]}, + expectFromSlaves: []bool{false, false, true}, + }, + { + name: "test select master hint internal", + sql: "select /*master*/ * from t", + userList: []string{userPriv["read_write_split"], userPriv["write_only"], userPriv["read_only"]}, + expectFromSlaves: []bool{false, false, true}, + }, + { + name: "test prepare select master hint internal", + sql: "select /*master*/ * from t where id=?", + userList: []string{userPriv["read_write_split"], userPriv["write_only"], userPriv["read_only"]}, + expectFromSlaves: []bool{false, false, true}, + }, + { + name: "test select master hint after", + sql: "select * from t /*master*/", + userList: []string{userPriv["read_write_split"], userPriv["write_only"], userPriv["read_only"]}, + expectFromSlaves: []bool{false, false, true}, + }, + { + name: "test prepare select master hint after", + sql: "select * from t where id=? /*master*/", + userList: []string{userPriv["read_write_split"], userPriv["write_only"], userPriv["read_only"]}, + expectFromSlaves: []bool{false, false, true}, + }, + { + name: "test select for update", + sql: "select * from t where id=1 for update", + userList: []string{userPriv["read_write_split"], userPriv["write_only"], userPriv["read_only"]}, + expectFromSlaves: []bool{false, false, true}, + }, + { + name: "test prepare select for update", + sql: "select * from t where id=? for update", + userList: []string{userPriv["read_write_split"], userPriv["write_only"], userPriv["read_only"]}, + expectFromSlaves: []bool{false, false, true}, + }, + { + name: "test select for share mode", + sql: "select * from t where id=1 in share mode", + userList: []string{userPriv["read_write_split"], userPriv["write_only"], userPriv["read_only"]}, + expectFromSlaves: []bool{false, false, true}, + }, + { + name: "test select for share", + sql: "select * from t where id=1 for share", + userList: []string{userPriv["read_write_split"], userPriv["write_only"], userPriv["read_only"]}, + expectFromSlaves: []bool{false, false, true}, + }, + { + name: "test select for share", + sql: "select * from t where id=1 for share nowait", + userList: []string{userPriv["read_write_split"], userPriv["write_only"], userPriv["read_only"]}, + expectFromSlaves: []bool{false, false, true}, + }, + { + name: "test select for share", + sql: "select * from t where id=1 for share skip locked", + userList: []string{userPriv["read_write_split"], userPriv["write_only"], userPriv["read_only"]}, + expectFromSlaves: []bool{false, false, true}, + }, + { + name: "test select for share", + sql: "select * from t where id=1 for update nowait", + userList: []string{userPriv["read_write_split"], userPriv["write_only"], userPriv["read_only"]}, + expectFromSlaves: []bool{false, false, true}, + }, + { + name: "test select for share", + sql: "select * from t where id=1 for update skip locked", + userList: []string{userPriv["read_write_split"], userPriv["write_only"], userPriv["read_only"]}, + expectFromSlaves: []bool{false, false, true}, + }, + { + name: "test update", + sql: "update t set col1='a' where id=1", + userList: []string{userPriv["read_write_split"], userPriv["write_only"], userPriv["read_only"]}, + expectFromSlaves: []bool{false, false, false}, + }, + { + name: "test insert", + sql: "insert into t(col1) values('a')", + userList: []string{userPriv["read_write_split"], userPriv["write_only"], userPriv["read_only"]}, + expectFromSlaves: []bool{false, false, false}, + }, + { + name: "test delete", + sql: "delete from t where id=1", + userList: []string{userPriv["read_write_split"], userPriv["write_only"], userPriv["read_only"]}, + expectFromSlaves: []bool{false, false, false}, + }, + { + name: "test replace", + sql: "replace into t(col1) values('a')", + userList: []string{userPriv["read_write_split"], userPriv["write_only"], userPriv["read_only"]}, + expectFromSlaves: []bool{false, false, false}, + }, + { + name: "test only comments", + sql: `/*!40100 SET @@SQL_MODE='' */`, + userList: []string{userPriv["read_write_split"], userPriv["write_only"], userPriv["read_only"]}, + expectFromSlaves: []bool{false, false, false}, + }, + { + name: "test select read_only", + sql: "select 'aaa', @@read_only, 'bbb';", + userList: []string{userPriv["read_write_split"], userPriv["write_only"], userPriv["read_only"]}, + expectFromSlaves: []bool{false, false, true}, + }, + } + + for _, tt := range testCases { + t.Run(tt.name, func(t *testing.T) { + for i, user := range tt.userList { + tt.sql = strings.TrimRight(tt.sql, ";") + se, err := newDefaultSessionExecutor(nil) + se.session.proxy.ServerVersionCompareStatus = util.NewVersionCompareStatus("") + assert.Equal(t, err, nil) + se.user = user + reqCtx := util.NewRequestContext() + reqCtx.SetStmtType(parser.Preview(tt.sql)) + _, err = se.getPlan(reqCtx, se.GetNamespace(), se.db, tt.sql, true) + if err != nil { + t.Fatalf("getPlan error.name:%s, sql:%s,err:%s", tt.name, tt.sql, err) + } + assert.Equal(t, checkExecuteFromSlave(reqCtx, se, tt.sql), tt.expectFromSlaves[i], tt.name+"-"+tt.userList[i]) + } + }) + } +} + +// test extractPrefixCommentsAndRewrite +func TestCanExecuteJDBCPrefix(t *testing.T) { + type TestCase struct { + name string + mysqlVersion string + sql string + trimmedSql string + } + + testCases := []TestCase{ + { + name: "test jdbc more than 8030 with mysql ", + sql: "/* mysql-connector-j-8.0.31 (Revision: 0c86fc148d567b62266c2302bdad0f1e7a7e4eba) */SELECT @@session.auto_increment_increment AS auto_increment_increment, @@character_set_client AS character_set_client, @@character_set_connection AS character_set_connection, @@character_set_results AS character_set_results, @@character_set_server AS character_set_server, @@collation_server AS collation_server, @@collation_connection AS collation_connection, @@init_connect AS init_connect, @@interactive_timeout AS interactive_timeout, @@license AS license, @@lower_case_table_names AS lower_case_table_names, @@max_allowed_packet AS max_allowed_packet, @@net_write_timeout AS net_write_timeout, @@performance_schema AS performance_schema, @@query_cache_size AS query_cache_size, @@query_cache_type AS query_cache_type, @@sql_mode AS sql_mode, @@system_time_zone AS system_time_zone, @@time_zone AS time_zone, @@transaction_isolation AS transaction_isolation, @@wait_timeout AS wait_timeout", + trimmedSql: "SELECT @@session.auto_increment_increment AS auto_increment_increment, @@character_set_client AS character_set_client, @@character_set_connection AS character_set_connection, @@character_set_results AS character_set_results, @@character_set_server AS character_set_server, @@collation_server AS collation_server, @@collation_connection AS collation_connection, @@init_connect AS init_connect, @@interactive_timeout AS interactive_timeout, @@license AS license, @@lower_case_table_names AS lower_case_table_names, @@max_allowed_packet AS max_allowed_packet, @@net_write_timeout AS net_write_timeout, @@performance_schema AS performance_schema, @@query_cache_size AS query_cache_size, @@query_cache_type AS query_cache_type, @@sql_mode AS sql_mode, @@system_time_zone AS system_time_zone, @@time_zone AS time_zone, @@tx_isolation AS transaction_isolation, @@wait_timeout AS wait_timeout", + }, + { + name: "test jdbc less than 8030", + sql: "/* mysql-connector-j-8.0.31 (Revision: 0c86fc148d567b62266c2302bdad0f1e7a7e4eba) */SELECT @@session.auto_increment_increment AS auto_increment_increment, @@character_set_client AS character_set_client, @@character_set_connection AS character_set_connection, @@character_set_results AS character_set_results, @@character_set_server AS character_set_server, @@collation_server AS collation_server, @@collation_connection AS collation_connection, @@init_connect AS init_connect, @@interactive_timeout AS interactive_timeout, @@license AS license, @@lower_case_table_names AS lower_case_table_names, @@max_allowed_packet AS max_allowed_packet, @@net_write_timeout AS net_write_timeout, @@performance_schema AS performance_schema, @@query_cache_size AS query_cache_size, @@query_cache_type AS query_cache_type, @@sql_mode AS sql_mode, @@system_time_zone AS system_time_zone, @@time_zone AS time_zone, @@transaction_isolation AS transaction_isolation, @@wait_timeout AS wait_timeout", + trimmedSql: "SELECT @@session.auto_increment_increment AS auto_increment_increment, @@character_set_client AS character_set_client, @@character_set_connection AS character_set_connection, @@character_set_results AS character_set_results, @@character_set_server AS character_set_server, @@collation_server AS collation_server, @@collation_connection AS collation_connection, @@init_connect AS init_connect, @@interactive_timeout AS interactive_timeout, @@license AS license, @@lower_case_table_names AS lower_case_table_names, @@max_allowed_packet AS max_allowed_packet, @@net_write_timeout AS net_write_timeout, @@performance_schema AS performance_schema, @@query_cache_size AS query_cache_size, @@query_cache_type AS query_cache_type, @@sql_mode AS sql_mode, @@system_time_zone AS system_time_zone, @@time_zone AS time_zone, @@tx_isolation AS transaction_isolation, @@wait_timeout AS wait_timeout", + }, + } + + for _, tt := range testCases { + trimmedSql, _ := extractPrefixCommentsAndRewrite(tt.sql, util.NewVersionCompareStatus(mysql.ServerVersion)) + assert.Equal(t, trimmedSql, tt.trimmedSql, tt.name+"-"+tt.sql) + } +} + +// Test for unshard database and table +func TestUnshardPlan(t *testing.T) { + type TestCase struct { + name string + sql string + mnFunc ModifyNamespaceFunc + expectUnshardPlan bool + expectDB string + expectSql string + expectPlan plan.Plan + } + + defaltDb := "db_ks" + var ( + testCases = []TestCase{ + { + name: "test unshard show variable read_only without shard rules", + sql: `show variables like "read_only"`, + expectUnshardPlan: true, + mnFunc: func(nsConfig *models.Namespace) { + nsConfig.AllowedDBS = map[string]bool{"db_unshard": true} + nsConfig.DefaultPhyDBS = map[string]string{"db_unshard": "db_unshard"} + nsConfig.ShardRules = nil + }, + expectDB: defaltDb, + expectSql: `show variables like "read_only"`, + }, + { + name: "test unshard show columns without shard rules", + sql: `show columns from db_unshard.tbl_unshard`, + expectUnshardPlan: true, + mnFunc: func(nsConfig *models.Namespace) { + nsConfig.AllowedDBS = map[string]bool{"db_unshard": true} + nsConfig.DefaultPhyDBS = map[string]string{"db_unshard": "db_unshard"} + nsConfig.ShardRules = nil + }, + expectDB: defaltDb, + expectSql: `show columns from db_unshard.tbl_unshard`, + }, + { + name: "test unshard select with db but without shard rules", + sql: "select * from db_unshard.tbl_unshard", + expectUnshardPlan: true, + mnFunc: func(nsConfig *models.Namespace) { + nsConfig.AllowedDBS = map[string]bool{"db_unshard": true} + nsConfig.DefaultPhyDBS = map[string]string{"db_unshard": "db_unshard"} + nsConfig.ShardRules = nil + }, + expectDB: defaltDb, + expectSql: "select * from db_unshard.tbl_unshard", + }, + { + name: "test unshard select with db and subquery", + sql: "select * from (select id from db_unshard.tbl_unshard_1) db_unshard.tbl_unshard", + expectUnshardPlan: true, + mnFunc: func(nsConfig *models.Namespace) { + nsConfig.AllowedDBS = map[string]bool{"db_unshard": true} + nsConfig.DefaultPhyDBS = map[string]string{"db_unshard": "db_unshard"} + nsConfig.ShardRules = nil + }, + expectDB: defaltDb, + expectSql: "select * from (select id from db_unshard.tbl_unshard_1) db_unshard.tbl_unshard", + }, + { + name: "test unshard select without db but subquery", + sql: "select db_unshard.* from (select * from tbl_unshard where id>1000) as a where a.id<2000;", + expectUnshardPlan: true, + mnFunc: func(nsConfig *models.Namespace) { + nsConfig.AllowedDBS = map[string]bool{"db_unshard": true} + nsConfig.DefaultPhyDBS = map[string]string{"db_unshard": "db_unshard"} + nsConfig.ShardRules = nil + }, + expectDB: defaltDb, + expectSql: "select db_unshard.* from (select * from tbl_unshard where id>1000) as a where a.id<2000;", + }, + { + name: "test unshard select with db and with shard rules", + sql: "select * from db_unshard.tbl_unshard", + mnFunc: func(nsConfig *models.Namespace) { + nsConfig.AllowedDBS = map[string]bool{"db_unshard": true} + nsConfig.DefaultPhyDBS = map[string]string{"db_unshard": "db_unshard"} + }, + expectUnshardPlan: true, + expectDB: "db_unshard", + expectSql: "select * from db_unshard.tbl_unshard", + }, + { + name: "test unshard select without db but with shard rules", + sql: "select * from tbl_unshard", // tbl_unshard is unshard in shard db db_ks + expectUnshardPlan: true, + expectDB: defaltDb, + expectSql: "select * from tbl_unshard", + }, + { + name: "test unshard select with db but with shard rules", + sql: "select * from db_ks.tbl_unshard", // tbl_unshard is unshard in shard db db_ks + expectUnshardPlan: true, + expectDB: defaltDb, + expectSql: "select * from db_ks.tbl_unshard", + }, + { + name: "test unshard select by parsing sql with renamed origin database, but use default db", + sql: "select * from db_unshard_rename.tbl_unshard", // db_unshard_rename_0 is backend physical database + mnFunc: func(nsConfig *models.Namespace) { + // db_unshard_rename is renamed database of backend physical database db_unshard_rename_0 + nsConfig.AllowedDBS = map[string]bool{"db_unshard_rename": true} + nsConfig.DefaultPhyDBS = map[string]string{"db_unshard_rename": "db_unshard_rename_0"} + }, + expectUnshardPlan: true, + expectDB: defaltDb, + expectSql: "SELECT * FROM `db_unshard_rename_0`.`tbl_unshard`", + }, + { + name: "test unshard select without db with renamed origin database, but use default db", + sql: "select user()", // db_unshard_rename_0 is backend physical database + mnFunc: func(nsConfig *models.Namespace) { + nsConfig.AllowedDBS = map[string]bool{"db_unshard_rename": true} + nsConfig.DefaultPhyDBS = map[string]string{"db_unshard_rename": "db_unshard_rename_0"} + nsConfig.ShardRules = nil + }, + expectUnshardPlan: true, + expectDB: defaltDb, + expectSql: "select user()", + }, + { + name: "test unshard select without db and table", + sql: "select connection_id();", + expectUnshardPlan: true, + expectDB: defaltDb, + expectSql: "select connection_id();", + }, + { + name: "test unshard union select without db", + sql: "select * from tbl_unshard_1 union select * from tbl_unshard_2", + mnFunc: func(nsConfig *models.Namespace) { + nsConfig.ShardRules = nil + }, + expectUnshardPlan: true, + expectDB: defaltDb, + expectSql: "select * from tbl_unshard_1 union select * from tbl_unshard_2", + }, + { + name: "test unshard union select with db", + sql: "select * from db_unshard.t1 union select * from db_unshard.t2", // db_ks.tbl_ks is a shard table + mnFunc: func(nsConfig *models.Namespace) { + nsConfig.AllowedDBS = map[string]bool{"db_unshard": true} + nsConfig.DefaultPhyDBS = map[string]string{"db_unshard": "db_unshard"} + }, + expectUnshardPlan: true, + expectDB: "db_unshard", + expectSql: "select * from db_unshard.t1 union select * from db_unshard.t2", + }, + { + name: "test shard simple select without db", + sql: "select * from tbl_ks", + mnFunc: nil, + expectUnshardPlan: false, + }, + { + name: "test shard select with db", + sql: "select * from db_ks.tbl_ks", + mnFunc: nil, + expectUnshardPlan: false, + }, + { + name: "test unshard update with no shard rules", + sql: "UPDATE db_unshard.tbl_unshard SET col1='a' WHERE id=6", + mnFunc: func(nsConfig *models.Namespace) { + nsConfig.AllowedDBS = map[string]bool{"db_unshard": true} + nsConfig.DefaultPhyDBS = map[string]string{"db_unshard": "db_unshard"} + nsConfig.ShardRules = nil + }, + expectUnshardPlan: true, + expectDB: defaltDb, + expectSql: "UPDATE db_unshard.tbl_unshard SET col1='a' WHERE id=6", + }, + { + name: "test update unshard with no db and no shard rules", + sql: "UPDATE tbl_unshard SET col1='a' WHERE id=6", + mnFunc: func(nsConfig *models.Namespace) { + nsConfig.AllowedDBS = map[string]bool{"db_unshard": true} + nsConfig.DefaultPhyDBS = map[string]string{"db_unshard": "db_unshard"} + nsConfig.ShardRules = nil + }, + expectUnshardPlan: true, + expectDB: defaltDb, + expectSql: "UPDATE tbl_unshard SET col1='a' WHERE id=6", + }, + { + name: "test update unshard without db", + sql: "UPDATE tbl_unshard SET col1='a' WHERE id=6", + expectUnshardPlan: true, + expectDB: defaltDb, + expectSql: "UPDATE tbl_unshard SET col1='a' WHERE id=6", + }, + { + name: "test shard update without db", + sql: "UPDATE tbl_ks SET col1='a' WHERE id=6", + expectUnshardPlan: false, + }, + { + name: "test unshard insert without db", + sql: "insert into tbl_unshard values('a')", + expectUnshardPlan: true, + expectDB: defaltDb, + expectSql: "insert into tbl_unshard values('a')", + }, + { + name: "test unshard insert without db and select from", + sql: "insert into tbl_unshard(col1) (select col1 from tbl_unshard_1);", + expectUnshardPlan: true, + expectDB: defaltDb, + expectSql: "insert into tbl_unshard(col1) (select col1 from tbl_unshard_1);", + }, + { + name: "test unshard insert with db", + sql: "insert into db_unshard.tbl_unshard values('a')", + mnFunc: nil, + expectUnshardPlan: true, + expectDB: "db_unshard", + expectSql: "insert into db_unshard.tbl_unshard values('a')", + }, + { + name: "test shard insert without db", + sql: "insert into tbl_ks(id,col1) values(1,'a')", + expectUnshardPlan: false, + }, + { + name: "test unshard replace without db", + sql: "replace into tbl_unshard values('a')", + expectUnshardPlan: true, + expectDB: defaltDb, + expectSql: "replace into tbl_unshard values('a')", + }, + { + name: "test shard replace without db", + sql: "replace into tbl_ks(id,col1) values(1,'a')", + expectUnshardPlan: false, + }, + { + name: "test unshard delete without db", + sql: "delete from tbl_unshard where id=1", + expectUnshardPlan: true, + expectDB: defaltDb, + expectSql: "delete from tbl_unshard where id=1", + }, + { + name: "test shard delete without db", + sql: "delete from tbl_ks where id=1", + expectUnshardPlan: false, + }, + { + name: "test unshard delete with db", + sql: "delete from db_unshard.tbl_unshard where id=1", + expectUnshardPlan: true, + expectDB: "db_unshard", + expectSql: "delete from db_unshard.tbl_unshard where id=1", + }, + { + name: "test shard delete with db", + sql: "delete from db_ks.tbl_ks where id=1", + expectUnshardPlan: false, + }, + // TODO: fix sql execute when use renamed db + { + name: "test unshard function without db", + sql: "SELECT HEX(WEIGHT_STRING('ab' AS CHAR(4)));", + expectUnshardPlan: true, + expectDB: defaltDb, + expectSql: "SELECT HEX(WEIGHT_STRING('ab' AS CHAR(4)));", + }, + { + name: "test unshard function with db and no phydbs", + sql: "SELECT HEX(WEIGHT_STRING('ab' AS CHAR(4)));", + mnFunc: func(nsConfig *models.Namespace) { + nsConfig.AllowedDBS = map[string]bool{"db_unshard": true} + nsConfig.DefaultPhyDBS = nil + }, + expectUnshardPlan: true, + expectDB: defaltDb, + expectSql: "SELECT HEX(WEIGHT_STRING('ab' AS CHAR(4)));", + }, + { + name: "test unshard function div without db", + sql: "SELECT 5 DIV 2, -5 DIV 2, 5 DIV -2, -5 DIV -2;", + expectUnshardPlan: true, + expectDB: defaltDb, + expectSql: "SELECT 5 DIV 2, -5 DIV 2, 5 DIV -2, -5 DIV -2;", + }, + { + name: "test comment sql", + sql: "/*!40101 SET @@SQL_MODE := @OLD_SQL_MODE, @@SQL_QUOTE_SHOW_CREATE := @OLD_QUOTE */;", + mnFunc: func(nsConfig *models.Namespace) { + nsConfig.AllowedDBS = map[string]bool{"db_unshard": true} + nsConfig.DefaultPhyDBS = map[string]string{"db_unshard": "db_unshard"} + nsConfig.ShardRules = nil + }, + expectUnshardPlan: true, + expectDB: defaltDb, + expectSql: "/*!40101 SET @@SQL_MODE := @OLD_SQL_MODE, @@SQL_QUOTE_SHOW_CREATE := @OLD_QUOTE */;", + expectPlan: &plan.IgnorePlan{}, + }, + { + name: "test select last_insert_id()", + sql: "select last_insert_id()", + mnFunc: func(nsConfig *models.Namespace) { + nsConfig.AllowedDBS = map[string]bool{"db_unshard": true} + nsConfig.DefaultPhyDBS = map[string]string{"db_unshard": "db_unshard"} + nsConfig.ShardRules = nil + }, + expectUnshardPlan: true, + expectDB: defaltDb, + expectSql: "select last_insert_id()", + expectPlan: &plan.SelectLastInsertIDPlan{}, + }, + { + name: "test select last_insert_id( )", + sql: "select last_insert_id( )", + mnFunc: func(nsConfig *models.Namespace) { + nsConfig.AllowedDBS = map[string]bool{"db_unshard": true} + nsConfig.DefaultPhyDBS = map[string]string{"db_unshard": "db_unshard"} + nsConfig.ShardRules = nil + }, + expectUnshardPlan: true, + expectDB: defaltDb, + expectSql: "select last_insert_id( )", + expectPlan: &plan.SelectLastInsertIDPlan{}, + }, + { + name: "test select last_insert_id ()", + sql: "select last_insert_id ()", + mnFunc: func(nsConfig *models.Namespace) { + nsConfig.AllowedDBS = map[string]bool{"db_unshard": true} + nsConfig.DefaultPhyDBS = map[string]string{"db_unshard": "db_unshard"} + nsConfig.ShardRules = nil + }, + expectUnshardPlan: true, + expectDB: defaltDb, + expectSql: "select last_insert_id ()", + expectPlan: &plan.SelectLastInsertIDPlan{}, + }, + { + name: "test select last_insert_id() as id", + sql: "select last_insert_id() as id", + mnFunc: func(nsConfig *models.Namespace) { + nsConfig.AllowedDBS = map[string]bool{"db_unshard": true} + nsConfig.DefaultPhyDBS = map[string]string{"db_unshard": "db_unshard"} + nsConfig.ShardRules = nil + }, + expectUnshardPlan: true, + expectDB: defaltDb, + expectSql: "select last_insert_id() as id", + expectPlan: &plan.SelectLastInsertIDPlan{}, + }, + { + name: "test select last_insert_id( ) as id", + sql: "select last_insert_id( ) as id", + mnFunc: func(nsConfig *models.Namespace) { + nsConfig.AllowedDBS = map[string]bool{"db_unshard": true} + nsConfig.DefaultPhyDBS = map[string]string{"db_unshard": "db_unshard"} + nsConfig.ShardRules = nil + }, + expectUnshardPlan: true, + expectDB: defaltDb, + expectSql: "select last_insert_id( ) as id", + expectPlan: &plan.SelectLastInsertIDPlan{}, + }, + { + name: "test select last_insert_id () as id", + sql: "select last_insert_id () as id", + mnFunc: func(nsConfig *models.Namespace) { + nsConfig.AllowedDBS = map[string]bool{"db_unshard": true} + nsConfig.DefaultPhyDBS = map[string]string{"db_unshard": "db_unshard"} + nsConfig.ShardRules = nil + }, + expectUnshardPlan: true, + expectDB: defaltDb, + expectSql: "select last_insert_id () as id", + expectPlan: &plan.SelectLastInsertIDPlan{}, + }, + // 带参数的 laster insert id 直接转发 mysql + { + name: "test select last_insert_id(1)", + sql: "select last_insert_id(1)", + mnFunc: func(nsConfig *models.Namespace) { + nsConfig.AllowedDBS = map[string]bool{"db_unshard": true} + nsConfig.DefaultPhyDBS = map[string]string{"db_unshard": "db_unshard"} + nsConfig.ShardRules = nil + }, + expectUnshardPlan: true, + expectDB: defaltDb, + expectSql: "select last_insert_id(1)", + expectPlan: &plan.UnshardPlan{}, + }, + } + ) + for _, tt := range testCases { + t.Run(tt.name, func(t *testing.T) { + se, err := newDefaultSessionExecutor(tt.mnFunc) + se.SetContextNamespace() + se.session.proxy.ServerVersionCompareStatus = util.NewVersionCompareStatus("") + assert.Equal(t, err, nil) + reqCtx := util.NewRequestContext() + stmtType := parser.Preview(tt.sql) + reqCtx.SetStmtType(stmtType) + p, err := se.getPlan(reqCtx, se.GetNamespace(), se.db, tt.sql, true) + if err != nil { + t.Fatalf("getPlan error.name:%s,err:%s\n", tt.name, err) + } + if tt.expectPlan == nil { + up, ok := p.(*plan.UnshardPlan) + if ok != tt.expectUnshardPlan { + t.Fatalf("getPlan not equal, name:%s,sql:%s, plan type:%T, expect unshard plan:%v\n", tt.name, tt.sql, p, tt.expectUnshardPlan) + return + } + if !ok { + return + } + v := reflect.ValueOf(up) + resDb := v.Elem().Field(1).String() + resSql := v.Elem().Field(3).String() + if tt.expectDB != resDb { + t.Fatalf("getPlan db error, name:%s,sql:%s, get db:%s, expect db:%s\n", tt.name, tt.sql, resDb, tt.expectDB) + } + if tt.expectSql != resSql { + t.Fatalf("getPlan sql error, name:%s,sql:%s, get sql:%s, expect sql:%s\n", tt.name, tt.sql, resSql, tt.expectSql) + } + } else { + assert.Equal(t, reflect.TypeOf(tt.expectPlan), reflect.TypeOf(p)) + } + + }) + } +} + +func TestPreRewriteSQL(t *testing.T) { + type TestCase struct { + name string + mysqlVersion string + sql string + expectSQL string + } + + testCases := []TestCase{ + { + mysqlVersion: "5.7.25-gaea", + sql: "/* mysql-connector-j-8.0.31 (Revision: 0c86fc148d567b62266c2302bdad0f1e7a7e4eba) */SELECT @@session.auto_increment_increment AS auto_increment_increment, @@character_set_client AS character_set_client, @@character_set_connection AS character_set_connection, @@character_set_results AS character_set_results, @@character_set_server AS character_set_server, @@collation_server AS collation_server, @@collation_connection AS collation_connection, @@init_connect AS init_connect, @@interactive_timeout AS interactive_timeout, @@license AS license, @@lower_case_table_names AS lower_case_table_names, @@max_allowed_packet AS max_allowed_packet, @@net_write_timeout AS net_write_timeout, @@performance_schema AS performance_schema, @@query_cache_size AS query_cache_size, @@query_cache_type AS query_cache_type, @@sql_mode AS sql_mode, @@system_time_zone AS system_time_zone, @@time_zone AS time_zone, @@transaction_isolation AS transaction_isolation, @@wait_timeout AS wait_timeout", + expectSQL: "/* mysql-connector-j-8.0.31 (Revision: 0c86fc148d567b62266c2302bdad0f1e7a7e4eba) */SELECT @@session.auto_increment_increment AS auto_increment_increment, @@character_set_client AS character_set_client, @@character_set_connection AS character_set_connection, @@character_set_results AS character_set_results, @@character_set_server AS character_set_server, @@collation_server AS collation_server, @@collation_connection AS collation_connection, @@init_connect AS init_connect, @@interactive_timeout AS interactive_timeout, @@license AS license, @@lower_case_table_names AS lower_case_table_names, @@max_allowed_packet AS max_allowed_packet, @@net_write_timeout AS net_write_timeout, @@performance_schema AS performance_schema, @@query_cache_size AS query_cache_size, @@query_cache_type AS query_cache_type, @@sql_mode AS sql_mode, @@system_time_zone AS system_time_zone, @@time_zone AS time_zone, @@tx_isolation AS transaction_isolation, @@wait_timeout AS wait_timeout", + }, + { + mysqlVersion: "5.7.25-gaea", + sql: "/* mysql-connector-j-8.0.31 (Revision: 0c86fc148d567b62266c2302bdad0f1e7a7e4eba) */SELECT @@session.auto_increment_increment AS auto_increment_increment, @@character_set_client AS character_set_client, @@character_set_connection AS character_set_connection, @@character_set_results AS character_set_results, @@character_set_server AS character_set_server, @@collation_server AS collation_server, @@collation_connection AS collation_connection, @@init_connect AS init_connect, @@interactive_timeout AS interactive_timeout, @@license AS license, @@lower_case_table_names AS lower_case_table_names, @@max_allowed_packet AS max_allowed_packet, @@net_write_timeout AS net_write_timeout, @@performance_schema AS performance_schema, @@query_cache_size AS query_cache_size, @@query_cache_type AS query_cache_type, @@sql_mode AS sql_mode, @@system_time_zone AS system_time_zone, @@time_zone AS time_zone, @@transaction_isolation AS transaction_isolation, @@wait_timeout AS wait_timeout", + expectSQL: "/* mysql-connector-j-8.0.31 (Revision: 0c86fc148d567b62266c2302bdad0f1e7a7e4eba) */SELECT @@session.auto_increment_increment AS auto_increment_increment, @@character_set_client AS character_set_client, @@character_set_connection AS character_set_connection, @@character_set_results AS character_set_results, @@character_set_server AS character_set_server, @@collation_server AS collation_server, @@collation_connection AS collation_connection, @@init_connect AS init_connect, @@interactive_timeout AS interactive_timeout, @@license AS license, @@lower_case_table_names AS lower_case_table_names, @@max_allowed_packet AS max_allowed_packet, @@net_write_timeout AS net_write_timeout, @@performance_schema AS performance_schema, @@query_cache_size AS query_cache_size, @@query_cache_type AS query_cache_type, @@sql_mode AS sql_mode, @@system_time_zone AS system_time_zone, @@time_zone AS time_zone, @@tx_isolation AS transaction_isolation, @@wait_timeout AS wait_timeout", + }, + { + mysqlVersion: "5.7.25-gaea", + sql: "/* mysql-connector-java-5.1.39 ( Revision: 3289a357af6d09ecc1a10fd3c26e95183e5790ad ) */SELECT @@session.auto_increment_increment AS auto_increment_increment, @@character_set_client AS character_set_client, @@character_set_connection AS character_set_connection, @@character_set_results AS character_set_results, @@character_set_server AS character_set_server, @@init_connect AS init_connect, @@interactive_timeout AS interactive_timeout, @@license AS license, @@lower_case_table_names AS lower_case_table_names, @@max_allowed_packet AS max_allowed_packet, @@net_buffer_length AS net_buffer_length, @@net_write_timeout AS net_write_timeout, @@query_cache_size AS query_cache_size, @@query_cache_type AS query_cache_type, @@sql_mode AS sql_mode, @@system_time_zone AS system_time_zone, @@time_zone AS time_zone, @@tx_isolation AS tx_isolation, @@wait_timeout AS wait_timeout", + expectSQL: "/* mysql-connector-java-5.1.39 ( Revision: 3289a357af6d09ecc1a10fd3c26e95183e5790ad ) */SELECT @@session.auto_increment_increment AS auto_increment_increment, @@character_set_client AS character_set_client, @@character_set_connection AS character_set_connection, @@character_set_results AS character_set_results, @@character_set_server AS character_set_server, @@init_connect AS init_connect, @@interactive_timeout AS interactive_timeout, @@license AS license, @@lower_case_table_names AS lower_case_table_names, @@max_allowed_packet AS max_allowed_packet, @@net_buffer_length AS net_buffer_length, @@net_write_timeout AS net_write_timeout, @@query_cache_size AS query_cache_size, @@query_cache_type AS query_cache_type, @@sql_mode AS sql_mode, @@system_time_zone AS system_time_zone, @@time_zone AS time_zone, @@tx_isolation AS tx_isolation, @@wait_timeout AS wait_timeout", + }, + { + mysqlVersion: "5.7.25-gaea", + sql: "select @@transaction_read_only", + expectSQL: "select @@tx_read_only", + }, + { + mysqlVersion: "5.7.25-gaea", + sql: "select @@session.transaction_read_only", + expectSQL: "select @@session.tx_read_only", + }, + { + mysqlVersion: "5.7.25-gaea", + sql: "select /*master*/ @@session.transaction_read_only", + expectSQL: "select /*master*/ @@session.tx_read_only", + }, + { + mysqlVersion: "5.7.25-gaea", + sql: "select @@session.transaction_read_only /*test*/", + expectSQL: "select @@session.transaction_read_only /*test*/", + }, + { + mysqlVersion: "5.7.25-gaea", + sql: "SELECT @@session.transaction_isolation", + expectSQL: "SELECT @@session.tx_isolation", + }, + { + mysqlVersion: "5.7.25-gaea", + sql: "SELECT @@transaction_isolation", + expectSQL: "SELECT @@tx_isolation", + }, + { + mysqlVersion: "8.0.25-gaea", + sql: "select @@session.transaction_read_only", + expectSQL: "select @@session.transaction_read_only", + }, + { + mysqlVersion: "8.0.25-gaea", + sql: "SELECT @@transaction_isolation", + expectSQL: "SELECT @@transaction_isolation", + }, + } + + for _, tt := range testCases { + sql := preRewriteSQL(tt.sql, util.NewVersionCompareStatus(tt.mysqlVersion)) + assert.Equal(t, tt.expectSQL, sql, tt.sql+"-"+tt.mysqlVersion) + } +} + +func TestExtractPrefixCommentsAndRewrite(t *testing.T) { + type args struct { + sql string + version string + } + tests := []struct { + name string + args args + expectTrimmed string + expectComment parser.MarginComments + }{ + { + name: "test comment leading", + args: args{ + sql: "/*master*/ select * from t", + version: "5.7.25-gaea", + }, + expectTrimmed: "select * from t", + expectComment: parser.MarginComments{ + Leading: "/*master*/ ", + Trailing: "", + }, + }, + { + name: "test comments trailing", + args: args{ + sql: "select * from t /*master*/", + version: "5.7.25-gaea", + }, + expectTrimmed: "select * from t", + expectComment: parser.MarginComments{ + Leading: "", + Trailing: " /*master*/", + }, + }, + { + name: "test comments internal", + args: args{ + sql: "select /*master*/ * from t", + version: "5.7.25-gaea", + }, + expectTrimmed: "select /*master*/ * from t", + expectComment: parser.MarginComments{ + Leading: "", + Trailing: "", + }, + }, + { + name: "test comments mycat trailing", + args: args{ + sql: "select * from t /* !mycat:sql=select 1 from xm_order where order_id = 4230329282206593 */", + version: "5.7.25-gaea", + }, + expectTrimmed: "select * from t", + expectComment: parser.MarginComments{ + Leading: "", + Trailing: " /* !mycat:sql=select 1 from xm_order where order_id = 4230329282206593 */", + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + gotTrimmed, gotComment := extractPrefixCommentsAndRewrite(tt.args.sql, util.NewVersionCompareStatus(tt.args.version)) + assert.Equalf(t, tt.expectTrimmed, gotTrimmed, "extractPrefixCommentsAndRewrite(%v, %v)", tt.args.sql, tt.args.version) + assert.Equalf(t, tt.expectComment, gotComment, "extractPrefixCommentsAndRewrite(%v, %v)", tt.args.sql, tt.args.version) + }) + } +} + +func BenchmarkGetManagerNamespace(b *testing.B) { + se, _ := newDefaultSessionExecutor(nil) + for n := 0; n < b.N; n++ { + for i := 0; i < 10; i++ { + se.GetManagerNamespace() + } + } +} + +func BenchmarkGetNamespace(b *testing.B) { + se, _ := newDefaultSessionExecutor(nil) + for n := 0; n < b.N; n++ { + se.SetContextNamespace() + for i := 0; i < 10; i++ { + se.GetNamespace() + } + } +} diff --git a/proxy/server/manager.go b/proxy/server/manager.go index 76f53015..a4999d1e 100644 --- a/proxy/server/manager.go +++ b/proxy/server/manager.go @@ -18,16 +18,23 @@ import ( "bytes" "crypto/md5" "fmt" + "math" "net/http" + "os" + "runtime" "sort" "strconv" "strings" "sync" "time" + "github.com/XiaoMi/Gaea/log/zap" + + "github.com/XiaoMi/Gaea/backend" + "go.uber.org/atomic" + "github.com/XiaoMi/Gaea/core/errors" "github.com/XiaoMi/Gaea/log" - "github.com/XiaoMi/Gaea/log/xlog" "github.com/XiaoMi/Gaea/models" "github.com/XiaoMi/Gaea/mysql" "github.com/XiaoMi/Gaea/parser" @@ -35,6 +42,21 @@ import ( "github.com/XiaoMi/Gaea/stats/prometheus" "github.com/XiaoMi/Gaea/util" "github.com/XiaoMi/Gaea/util/sync2" + "github.com/shirou/gopsutil/process" +) + +const ( + MasterRole = "master" + SlaveRole = "slave" + StatisticSlaveRole = "statistic-slave" + SQLExecTimeSize = 5000 + DefaultDatacenter = "default" + SQLExecStatusOk = "OK" + SQLExecStatusErr = "ERROR" + SQLExecStatusIgnore = "IGNORE" + SQLExecStatusSlow = "SLOW" + SQLBackendExecStatusSlow = "backend SLOW" + SQLBackendExecStatusErr = "backend ERR" ) // LoadAndCreateManager load namespace config, and create manager @@ -63,6 +85,9 @@ func loadAllNamespace(cfg *models.Proxy) (map[string]*models.Namespace, error) { } client := models.NewClient(cfg.ConfigType, cfg.CoordinatorAddr, cfg.UserName, cfg.Password, root) + if client == nil { + return map[string]*models.Namespace{}, fmt.Errorf("client is nil") + } store := models.NewStore(client) defer store.Close() var err error @@ -92,13 +117,7 @@ func loadAllNamespace(cfg *models.Proxy) (map[string]*models.Namespace, error) { err = e return } - // verify namespace config - e = namespace.Verify() - if e != nil { - log.Warn("verify namespace %s failed, err: %v", name, e) - err = e - return - } + namespaceC <- namespace } }() @@ -179,20 +198,33 @@ func (m *Manager) Close() { } m.statistics.Close() + if m.statistics.generalLogger != nil { + // 日志落盘 + m.statistics.generalLogger.Close() + } } // ReloadNamespacePrepare prepare commit func (m *Manager) ReloadNamespacePrepare(namespaceConfig *models.Namespace) error { name := namespaceConfig.Name current, other, _ := m.switchIndex.Get() - // reload namespace prepare currentNamespaceManager := m.namespaces[current] + + nsOld := currentNamespaceManager.GetNamespace(name) + var nsChangeIndexOld uint32 + if nsOld != nil { + nsChangeIndexOld = nsOld.namespaceChangeIndex + } + newNamespaceManager := ShallowCopyNamespaceManager(currentNamespaceManager) if err := newNamespaceManager.RebuildNamespace(namespaceConfig); err != nil { log.Warn("prepare config of namespace: %s failed, err: %v", name, err) return err } + + newNamespaceManager.GetNamespace(name).namespaceChangeIndex = nsChangeIndexOld + 1 + m.namespaces[other] = newNamespaceManager // reload user prepare @@ -200,6 +232,9 @@ func (m *Manager) ReloadNamespacePrepare(namespaceConfig *models.Namespace) erro newUserManager := CloneUserManager(currentUserManager) newUserManager.RebuildNamespaceUsers(namespaceConfig) m.users[other] = newUserManager + if _, ok := m.statistics.SQLResponsePercentile[name]; !ok { + m.statistics.SQLResponsePercentile[name] = NewSQLResponse(name) + } m.reloadPrepared.Set(true) return nil @@ -274,6 +309,12 @@ func (m *Manager) CheckPassword(user string, salt, auth []byte) (bool, string) { return m.users[current].CheckPassword(user, salt, auth) } +// CheckHashPassword check if right password with specific user +func (m *Manager) CheckHashPassword(user string, salt, auth []byte) (bool, string) { + current, _, _ := m.switchIndex.Get() + return m.users[current].CheckHashPassword(user, salt, auth) +} + // CheckPassword check if right password with specific user func (m *Manager) CheckSha2Password(user string, salt, auth []byte) (bool, string) { current, _, _ := m.switchIndex.Get() @@ -299,106 +340,129 @@ func (m *Manager) ConfigFingerprint() string { // RecordSessionSQLMetrics record session SQL metrics, like response time, error func (m *Manager) RecordSessionSQLMetrics(reqCtx *util.RequestContext, se *SessionExecutor, sql string, startTime time.Time, err error) { - trimmedSql := strings.ReplaceAll(sql, "\n", " ") namespace := se.namespace ns := m.GetNamespace(namespace) if ns == nil { - log.Warn("record session SQL metrics error, namespace: %s, sql: %s, err: %s", namespace, trimmedSql, "namespace not found") + log.Warn("record session SQL metrics error, namespace: %s, sql: %s, err: %s", namespace, sql, "namespace not found") return } var operation string - if stmtType, ok := reqCtx.Get(util.StmtType).(int); ok { + if stmtType := reqCtx.GetStmtType(); stmtType > -1 { operation = parser.StmtType(stmtType) } else { - fingerprint := mysql.GetFingerprint(sql) + trimmedSql := strings.ReplaceAll(sql, "\n", " ") + fingerprint := getSQLFingerprint(reqCtx, trimmedSql) operation = mysql.GetFingerprintOperation(fingerprint) } // record sql timing - m.statistics.recordSessionSQLTiming(namespace, operation, startTime) - - // record slow sql - duration := time.Since(startTime).Nanoseconds() / int64(time.Millisecond) - if duration > ns.getSessionSlowSQLTime() || ns.getSessionSlowSQLTime() == 0 { - log.Warn("session slow SQL, namespace: %s, sql: %s, cost: %d ms", namespace, trimmedSql, duration) - fingerprint := mysql.GetFingerprint(sql) - md5 := mysql.GetMd5(fingerprint) - ns.SetSlowSQLFingerprint(md5, fingerprint) - m.statistics.recordSessionSlowSQLFingerprint(namespace, md5) + if !(err != nil && err.Error() == mysql.ErrClientQpsLimitedMsg) { + m.statistics.recordSessionSQLTiming(namespace, operation, startTime) } - // record error sql - if err != nil { - log.Warn("session error SQL, namespace: %s, sql: %s, cost: %d ms, err: %v", namespace, trimmedSql, duration, err) - fingerprint := mysql.GetFingerprint(sql) - md5 := mysql.GetMd5(fingerprint) + durationFloat := float64(time.Since(startTime).Microseconds()) / 1000.0 + + if err == nil { + se.manager.statistics.generalLogger.Notice("%s - %.1fms - ns=%s, %s@%s->%s/%s, connect_id=%d, mysql_connect_id=%d, transaction=%t|%v", + SQLExecStatusOk, durationFloat, se.namespace, se.user, se.clientAddr, se.backendAddr, se.db, + se.session.c.GetConnectionID(), se.backendConnectionId, se.isInTransaction(), sql) + } else { + // record error sql + se.manager.statistics.generalLogger.Warn("%s - %.1fms - ns=%s, %s@%s->%s/%s, connect_id=%d, mysql_connect_id=%d, transaction=%t|%v. err:%s", + SQLExecStatusErr, durationFloat, se.namespace, se.user, se.clientAddr, se.backendAddr, se.db, + se.session.c.GetConnectionID(), se.backendConnectionId, se.isInTransaction(), sql, err) + fingerprint := getSQLFingerprint(reqCtx, sql) + md5 := getSQLFingerprintMd5(reqCtx, sql) ns.SetErrorSQLFingerprint(md5, fingerprint) m.statistics.recordSessionErrorSQLFingerprint(namespace, operation, md5) } - if OpenProcessGeneralQueryLog() && ns.openGeneralLog { - m.statistics.generalLogger.Notice("client: %s, namespace: %s, db: %s, user: %s, cmd: %s, sql: %s, cost: %d ms, succ: %t", - se.clientAddr, namespace, se.db, se.user, operation, trimmedSql, duration, err == nil) + // record slow sql, only durationFloat > slowSQLTime will be recorded + if ns.getSessionSlowSQLTime() > 0 && int64(durationFloat) > ns.getSessionSlowSQLTime() { + se.manager.statistics.generalLogger.Warn("%s - %.1fms - ns=%s, %s@%s->%s/%s, connect_id=%d, mysql_connect_id=%d, transaction=%t|%v", + SQLExecStatusSlow, durationFloat, se.namespace, se.user, se.clientAddr, se.backendAddr, se.db, + se.session.c.GetConnectionID(), se.backendConnectionId, se.isInTransaction(), sql) + fingerprint := getSQLFingerprint(reqCtx, sql) + md5 := getSQLFingerprintMd5(reqCtx, sql) + ns.SetSlowSQLFingerprint(md5, fingerprint) + m.statistics.recordSessionSlowSQLFingerprint(namespace, md5) } } // RecordBackendSQLMetrics record backend SQL metrics, like response time, error -func (m *Manager) RecordBackendSQLMetrics(reqCtx *util.RequestContext, namespace string, sql, backendAddr string, startTime time.Time, err error) { - trimmedSql := strings.ReplaceAll(sql, "\n", " ") - ns := m.GetNamespace(namespace) +func (m *Manager) RecordBackendSQLMetrics(reqCtx *util.RequestContext, se *SessionExecutor, sliceName, sql, backendAddr string, startTime time.Time, err error) { + ns := m.GetNamespace(se.namespace) if ns == nil { - log.Warn("record backend SQL metrics error, namespace: %s, backend addr: %s, sql: %s, err: %s", namespace, backendAddr, trimmedSql, "namespace not found") + log.Warn("record backend SQL metrics error, namespace: %s, backend addr: %s, sql: %s, err: %s", se.namespace, backendAddr, sql, "namespace not found") return } var operation string - if stmtType, ok := reqCtx.Get(util.StmtType).(int); ok { + if stmtType := reqCtx.GetStmtType(); stmtType > -1 { operation = parser.StmtType(stmtType) } else { - fingerprint := mysql.GetFingerprint(sql) + trimmedSql := strings.ReplaceAll(sql, "\n", " ") + fingerprint := getSQLFingerprint(reqCtx, trimmedSql) operation = mysql.GetFingerprintOperation(fingerprint) } // record sql timing - m.statistics.recordBackendSQLTiming(namespace, operation, startTime) - - // record slow sql - duration := time.Since(startTime).Nanoseconds() / int64(time.Millisecond) - if m.statistics.isBackendSlowSQL(startTime) { - log.Warn("backend slow SQL, namespace: %s, addr: %s, sql: %s, cost: %d ms", namespace, backendAddr, trimmedSql, duration) - fingerprint := mysql.GetFingerprint(sql) - md5 := mysql.GetMd5(fingerprint) + go m.statistics.recordBackendSQLTiming(se.namespace, operation, sliceName, backendAddr, startTime) + + // record backend slow sql + duration := time.Since(startTime).Milliseconds() + if m.statistics.isBackendSlowSQL(duration) { + m.statistics.generalLogger.Warn("%s - %dms - ns=%s, %s@%s->%s/%s, connect_id=%d, mysql_connect_id=%d, transaction=%t|%v", + SQLBackendExecStatusSlow, duration, se.namespace, se.user, se.clientAddr, se.backendAddr, se.db, + se.session.c.GetConnectionID(), se.backendConnectionId, se.isInTransaction(), sql) + fingerprint := getSQLFingerprint(reqCtx, sql) + md5 := getSQLFingerprintMd5(reqCtx, sql) ns.SetBackendSlowSQLFingerprint(md5, fingerprint) - m.statistics.recordBackendSlowSQLFingerprint(namespace, md5) + m.statistics.recordBackendSlowSQLFingerprint(se.namespace, md5) } - // record error sql + // record backend error sql if err != nil { - log.Warn("backend error SQL, namespace: %s, addr: %s, sql: %s, cost %d ms, err: %v", namespace, backendAddr, trimmedSql, duration, err) - fingerprint := mysql.GetFingerprint(sql) - md5 := mysql.GetMd5(fingerprint) + m.statistics.generalLogger.Warn("%s - %dms - ns=%s, %s@%s->%s/%s, connect_id=%d, mysql_connect_id=%d, transaction=%t|%v, error: %v", + SQLBackendExecStatusErr, duration, se.user, se.namespace, se.clientAddr, se.backendAddr, se.db, + se.session.c.GetConnectionID(), se.backendConnectionId, se.isInTransaction(), sql, err) + fingerprint := getSQLFingerprint(reqCtx, sql) + md5 := getSQLFingerprintMd5(reqCtx, sql) ns.SetBackendErrorSQLFingerprint(md5, fingerprint) - m.statistics.recordBackendErrorSQLFingerprint(namespace, operation, md5) + m.statistics.recordBackendErrorSQLFingerprint(se.namespace, operation, md5) } } func (m *Manager) startConnectPoolMetricsTask(interval int) { + current, _, _ := m.switchIndex.Get() + for _, ns := range m.namespaces[current].namespaces { + m.statistics.SQLResponsePercentile[ns.name] = NewSQLResponse(ns.name) + } + if interval <= 0 { interval = 10 } go func() { t := time.NewTicker(time.Duration(interval) * time.Second) + tSQLRecordTime := time.NewTicker(time.Duration(backend.PingPeriod) * time.Second) for { select { case <-m.GetStatisticManager().closeChan: return case <-t.C: + m.statistics.AddUptimeCount(time.Now().Unix() - m.statistics.startTime) + + // record cpu usage will wait at least 5 seconds + m.statistics.CalcCPUBusy(interval - 5) + current, _, _ := m.switchIndex.Get() for nameSpaceName, _ := range m.namespaces[current].namespaces { m.recordBackendConnectPoolMetrics(nameSpaceName) } + case <-tSQLRecordTime.C: + m.statistics.CalcAvgSQLTimes() } } }() @@ -410,20 +474,44 @@ func (m *Manager) recordBackendConnectPoolMetrics(namespace string) { log.Warn("record backend connect pool metrics err, namespace: %s", namespace) return } + for n, v := range m.statistics.SQLResponsePercentile { + for backendAddr, val := range v.response99Max { + m.statistics.recordBackendSQLTimingP99Max(n, backendAddr, int64(val)) + } + for backendAddr, val := range v.response99Avg { + m.statistics.recordBackendSQLTimingP99Avg(n, backendAddr, int64(val)) + } + for backendAddr, val := range v.response95Max { + m.statistics.recordBackendSQLTimingP95Max(n, backendAddr, int64(val)) + } + for backendAddr, val := range v.response95Avg { + m.statistics.recordBackendSQLTimingP95Avg(n, backendAddr, int64(val)) + } + } for sliceName, slice := range ns.slices { - m.statistics.recordConnectPoolInuseCount(namespace, sliceName, slice.Master.Addr(), slice.Master.InUse()) - m.statistics.recordConnectPoolIdleCount(namespace, sliceName, slice.Master.Addr(), slice.Master.Available()) - m.statistics.recordConnectPoolWaitCount(namespace, sliceName, slice.Master.Addr(), slice.Master.WaitCount()) - for _, slave := range slice.Slave { - m.statistics.recordConnectPoolInuseCount(namespace, sliceName, slave.Addr(), slave.InUse()) - m.statistics.recordConnectPoolIdleCount(namespace, sliceName, slave.Addr(), slave.Available()) - m.statistics.recordConnectPoolWaitCount(namespace, sliceName, slave.Addr(), slave.WaitCount()) + m.statistics.recordInstanceDownCount(namespace, sliceName, slice.Master.ConnPool[0].Addr(), getStatusDownCounts(slice.Master.StatusMap, 0), MasterRole) + m.statistics.recordConnectPoolInuseCount(namespace, sliceName, slice.Master.ConnPool[0].Addr(), slice.Master.ConnPool[0].InUse(), MasterRole) + m.statistics.recordConnectPoolIdleCount(namespace, sliceName, slice.Master.ConnPool[0].Addr(), slice.Master.ConnPool[0].Available(), MasterRole) + m.statistics.recordConnectPoolWaitCount(namespace, sliceName, slice.Master.ConnPool[0].Addr(), slice.Master.ConnPool[0].WaitCount(), MasterRole) + m.statistics.recordConnectPoolActiveCount(namespace, sliceName, slice.Master.ConnPool[0].Addr(), slice.Master.ConnPool[0].Active(), MasterRole) + m.statistics.recordConnectPoolCount(namespace, sliceName, slice.Master.ConnPool[0].Addr(), slice.Master.ConnPool[0].Capacity(), MasterRole) + + for i, slave := range slice.Slave.ConnPool { + m.statistics.recordInstanceDownCount(namespace, sliceName, slave.Addr(), getStatusDownCounts(slice.Slave.StatusMap, i), SlaveRole) + m.statistics.recordConnectPoolInuseCount(namespace, sliceName, slave.Addr(), slave.InUse(), SlaveRole) + m.statistics.recordConnectPoolIdleCount(namespace, sliceName, slave.Addr(), slave.Available(), SlaveRole) + m.statistics.recordConnectPoolWaitCount(namespace, sliceName, slave.Addr(), slave.WaitCount(), SlaveRole) + m.statistics.recordConnectPoolActiveCount(namespace, sliceName, slave.Addr(), slave.Active(), SlaveRole) + m.statistics.recordConnectPoolCount(namespace, sliceName, slave.Addr(), slave.Capacity(), SlaveRole) } - for _, statisticSlave := range slice.StatisticSlave { - m.statistics.recordConnectPoolInuseCount(namespace, sliceName, statisticSlave.Addr(), statisticSlave.InUse()) - m.statistics.recordConnectPoolIdleCount(namespace, sliceName, statisticSlave.Addr(), statisticSlave.Available()) - m.statistics.recordConnectPoolWaitCount(namespace, sliceName, statisticSlave.Addr(), statisticSlave.WaitCount()) + for i, statisticSlave := range slice.StatisticSlave.ConnPool { + m.statistics.recordInstanceDownCount(namespace, sliceName, statisticSlave.Addr(), getStatusDownCounts(slice.StatisticSlave.StatusMap, i), StatisticSlaveRole) + m.statistics.recordConnectPoolInuseCount(namespace, sliceName, statisticSlave.Addr(), statisticSlave.InUse(), StatisticSlaveRole) + m.statistics.recordConnectPoolIdleCount(namespace, sliceName, statisticSlave.Addr(), statisticSlave.Available(), StatisticSlaveRole) + m.statistics.recordConnectPoolWaitCount(namespace, sliceName, statisticSlave.Addr(), statisticSlave.WaitCount(), StatisticSlaveRole) + m.statistics.recordConnectPoolActiveCount(namespace, sliceName, statisticSlave.Addr(), statisticSlave.Active(), StatisticSlaveRole) + m.statistics.recordConnectPoolCount(namespace, sliceName, statisticSlave.Addr(), statisticSlave.Capacity(), StatisticSlaveRole) } } } @@ -443,8 +531,14 @@ func NewNamespaceManager() *NamespaceManager { // CreateNamespaceManager create NamespaceManager func CreateNamespaceManager(namespaceConfigs map[string]*models.Namespace) *NamespaceManager { nsMgr := NewNamespaceManager() + proxyDatacenter, err := util.GetLocalDatacenter() + if err != nil { + log.Fatal("get proxy datacenter err,will use default datacenter,err:%s", err) + proxyDatacenter = DefaultDatacenter + } + for _, config := range namespaceConfigs { - namespace, err := NewNamespace(config) + namespace, err := NewNamespace(config, proxyDatacenter) if err != nil { log.Warn("create namespace %s failed, err: %v", config.Name, err) continue @@ -465,7 +559,11 @@ func ShallowCopyNamespaceManager(nsMgr *NamespaceManager) *NamespaceManager { // RebuildNamespace rebuild namespace func (n *NamespaceManager) RebuildNamespace(config *models.Namespace) error { - namespace, err := NewNamespace(config) + proxyDatacenter, err := util.GetLocalDatacenter() + if err != nil { + log.Fatal("get local proxy datacenter err:%s", err) + } + namespace, err := NewNamespace(config, proxyDatacenter) if err != nil { log.Warn("create namespace %s failed, err: %v", config.Name, err) return err @@ -597,6 +695,18 @@ func (u *UserManager) CheckPassword(user string, salt, auth []byte) (bool, strin return false, "" } +// CheckHashPassword check encrypt password with specific user +func (u *UserManager) CheckHashPassword(user string, salt, auth []byte) (bool, string) { + for _, password := range u.users[user] { + if strings.HasPrefix(password, "*") && len(password) == 41 { + if mysql.CheckHashPassword(auth, salt, []byte(password)[1:]) { + return true, password + } + } + } + return false, "" +} + // CheckPassword check if right password with specific user func (u *UserManager) CheckSha2Password(user string, salt, auth []byte) (bool, string) { for _, password := range u.users[user] { @@ -634,12 +744,14 @@ const ( statsLabelFlowDirection = "Flowdirection" statsLabelSlice = "Slice" statsLabelIPAddr = "IPAddr" + statsLabelRole = "role" ) // StatisticManager statistics manager type StatisticManager struct { manager *Manager clusterName string + startTime int64 statsType string // 监控后端类型 handlers map[string]http.Handler @@ -652,17 +764,63 @@ type StatisticManager struct { sqlForbidenCounts *stats.CountersWithMultiLabels // SQL黑名单请求统计 flowCounts *stats.CountersWithMultiLabels // 业务流量统计 sessionCounts *stats.GaugesWithMultiLabels // 前端会话数统计 + CPUBusy *stats.GaugesWithMultiLabels // Gaea服务器CPU消耗情况 + clientConnecions sync.Map // 等同于sessionCounts, 用于限制前端连接 backendSQLTimings *stats.MultiTimings // 后端SQL耗时统计 backendSQLFingerprintSlowCounts *stats.CountersWithMultiLabels // 后端慢SQL指纹数量统计 backendSQLErrorCounts *stats.CountersWithMultiLabels // 后端SQL错误数统计 backendSQLFingerprintErrorCounts *stats.CountersWithMultiLabels // 后端SQL指纹错误数统计 - backendConnectPoolIdleCounts *stats.GaugesWithMultiLabels //后端空闲连接数统计 - backendConnectPoolInUseCounts *stats.GaugesWithMultiLabels //后端正在使用连接数统计 - backendConnectPoolWaitCounts *stats.GaugesWithMultiLabels //后端等待队列统计 + backendConnectPoolIdleCounts *stats.GaugesWithMultiLabels // 后端空闲连接数统计 + backendConnectPoolInUseCounts *stats.GaugesWithMultiLabels // 后端正在使用连接数统计 + backendConnectPoolActiveCounts *stats.GaugesWithMultiLabels // 后端活跃连接数统计 + backendConnectPoolWaitCounts *stats.GaugesWithMultiLabels // 后端等待队列统计 + backendConnectPoolCapacityCounts *stats.GaugesWithMultiLabels // 当前连接池大小 + backendInstanceDownCounts *stats.GaugesWithMultiLabels // 后端实例状态统计 + uptimeCounts *stats.GaugesWithMultiLabels // 启动时间记录 + backendSQLResponse99MaxCounts *stats.GaugesWithMultiLabels // 后端 SQL 耗时 P99 最大响应时间 + backendSQLResponse99AvgCounts *stats.GaugesWithMultiLabels // 后端 SQL 耗时 P99 平均响应时间 + backendSQLResponse95MaxCounts *stats.GaugesWithMultiLabels // 后端 SQL 耗时 P95 最大响应时间 + backendSQLResponse95AvgCounts *stats.GaugesWithMultiLabels // 后端 SQL 耗时 P95 平均响应时间 + + SQLResponsePercentile map[string]*SQLResponse // 用于记录 P99/P95 Max/AVG 响应时间 + slowSQLTime int64 + CPUNums int // Gaea服务器使用的CPU核数 + closeChan chan bool +} + +// SQLResponse record one namespace SQL response like P99/P95 +type SQLResponse struct { + ns string + sqlExecTimeRecordSwitch bool + sQLExecTimeChan chan *SQLExecTimeRecord + sQLTimeList []*SQLExecTimeRecord + response99Max map[string]int64 // map[backendAddr]P99MaxValue + response99Avg map[string]int64 // map[backendAddr]P99AvgValue + response95Max map[string]int64 // map[backendAddr]P95MaxValue + response95Avg map[string]int64 // map[backendAddr]P95AvgValue +} + +// SQLExecTimeRecord record backend sql exec time +type SQLExecTimeRecord struct { + sliceName string + backendAddr string + execTimeMicro int64 +} + +func NewSQLResponse(name string) *SQLResponse { + sQLExecTimeRecord := make([]*SQLExecTimeRecord, 0, SQLExecTimeSize) + return &SQLResponse{ + ns: name, + sqlExecTimeRecordSwitch: false, + sQLExecTimeChan: make(chan *SQLExecTimeRecord, SQLExecTimeSize), + sQLTimeList: sQLExecTimeRecord, + response99Max: make(map[string]int64), + response99Avg: make(map[string]int64), + response95Max: make(map[string]int64), + response95Avg: make(map[string]int64), + } - slowSQLTime int64 - closeChan chan bool } // NewStatisticManager return empty StatisticManager @@ -675,6 +833,8 @@ func CreateStatisticManager(cfg *models.Proxy, manager *Manager) (*StatisticMana mgr := NewStatisticManager() mgr.manager = manager mgr.clusterName = cfg.Cluster + mgr.SQLResponsePercentile = make(map[string]*SQLResponse) + mgr.CPUNums = cfg.NumCPU var err error if err = mgr.Init(cfg); err != nil { @@ -698,7 +858,27 @@ func initGeneralLogger(cfg *models.Proxy) (log.Logger, error) { c["level"] = cfg.LogLevel c["service"] = cfg.Service c["runtime"] = "false" - return xlog.CreateLogManager(cfg.LogOutput, c) + + // LogKeepDays 或者 LogKeepCounts 只配置一个且大于默认值,实际日志保留天数为配置的天数 + if cfg.LogKeepDays > log.DefaultLogKeepDays && cfg.LogKeepCounts == 0 { + cfg.LogKeepCounts = cfg.LogKeepDays * 24 + } + if cfg.LogKeepCounts > log.DefaultLogKeepCounts && cfg.LogKeepDays == 0 { + cfg.LogKeepDays = int(math.Ceil(float64(cfg.LogKeepCounts) / 24)) + } + + // 若配置的保留天数小于默认值,实际日志保留天数为配置的天数 + c["log_keep_days"] = strconv.Itoa(log.DefaultLogKeepDays) + if cfg.LogKeepDays != 0 { + c["log_keep_days"] = strconv.Itoa(cfg.LogKeepDays) + } + + c["log_keep_counts"] = strconv.Itoa(log.DefaultLogKeepCounts) + if cfg.LogKeepCounts != 0 { + c["log_keep_counts"] = strconv.Itoa(cfg.LogKeepCounts) + } + + return zap.CreateLogManager(c) } func parseProxyStatsConfig(cfg *models.Proxy) (*proxyStatsConfig, error) { @@ -716,9 +896,11 @@ func parseProxyStatsConfig(cfg *models.Proxy) (*proxyStatsConfig, error) { // Init init StatisticManager func (s *StatisticManager) Init(cfg *models.Proxy) error { + s.startTime = time.Now().Unix() s.closeChan = make(chan bool, 0) s.handlers = make(map[string]http.Handler) s.slowSQLTime = cfg.SlowSQLTime + s.CPUNums = cfg.NumCPU statsCfg, err := parseProxyStatsConfig(cfg) if err != nil { return err @@ -742,6 +924,7 @@ func (s *StatisticManager) Init(cfg *models.Proxy) error { "gaea proxy flow counts", []string{statsLabelCluster, statsLabelNamespace, statsLabelFlowDirection}) s.sessionCounts = stats.NewGaugesWithMultiLabels("SessionCounts", "gaea proxy session counts", []string{statsLabelCluster, statsLabelNamespace}) + s.CPUBusy = stats.NewGaugesWithMultiLabels("CPUBusyByCore", "gaea proxy CPU busy by core", []string{statsLabelCluster}) s.backendSQLTimings = stats.NewMultiTimings("BackendSqlTimings", "gaea proxy backend sql sqlTimings", []string{statsLabelCluster, statsLabelNamespace, statsLabelOperation}) @@ -752,12 +935,28 @@ func (s *StatisticManager) Init(cfg *models.Proxy) error { s.backendSQLFingerprintErrorCounts = stats.NewCountersWithMultiLabels("BackendSqlFingerprintErrorCounts", "gaea proxy backend sql fingerprint error counts", []string{statsLabelCluster, statsLabelNamespace, statsLabelFingerprint}) s.backendConnectPoolIdleCounts = stats.NewGaugesWithMultiLabels("backendConnectPoolIdleCounts", - "gaea proxy backend idle connect counts", []string{statsLabelCluster, statsLabelNamespace, statsLabelSlice, statsLabelIPAddr}) + "gaea proxy backend idle connect counts", []string{statsLabelCluster, statsLabelNamespace, statsLabelSlice, statsLabelIPAddr, statsLabelRole}) s.backendConnectPoolInUseCounts = stats.NewGaugesWithMultiLabels("backendConnectPoolInUseCounts", - "gaea proxy backend in-use connect counts", []string{statsLabelCluster, statsLabelNamespace, statsLabelSlice, statsLabelIPAddr}) + "gaea proxy backend in-use connect counts", []string{statsLabelCluster, statsLabelNamespace, statsLabelSlice, statsLabelIPAddr, statsLabelRole}) s.backendConnectPoolWaitCounts = stats.NewGaugesWithMultiLabels("backendConnectPoolWaitCounts", - "gaea proxy backend wait connect counts", []string{statsLabelCluster, statsLabelNamespace, statsLabelSlice, statsLabelIPAddr}) - + "gaea proxy backend wait connect counts", []string{statsLabelCluster, statsLabelNamespace, statsLabelSlice, statsLabelIPAddr, statsLabelRole}) + s.backendConnectPoolActiveCounts = stats.NewGaugesWithMultiLabels("backendConnectPoolActiveCounts", + "gaea proxy backend active connect counts", []string{statsLabelCluster, statsLabelNamespace, statsLabelSlice, statsLabelIPAddr, statsLabelRole}) + s.backendConnectPoolCapacityCounts = stats.NewGaugesWithMultiLabels("backendConnectPoolCapacityCounts", + "gaea proxy backend capacity connect counts", []string{statsLabelCluster, statsLabelNamespace, statsLabelSlice, statsLabelIPAddr, statsLabelRole}) + s.backendInstanceDownCounts = stats.NewGaugesWithMultiLabels("backendInstanceDownCounts", + "gaea proxy backend DB status down counts", []string{statsLabelCluster, statsLabelNamespace, statsLabelSlice, statsLabelIPAddr, statsLabelRole}) + s.backendSQLResponse99MaxCounts = stats.NewGaugesWithMultiLabels("backendSQLResponse99MaxCounts", + "gaea proxy backend sql sqlTimings P99 max", []string{statsLabelCluster, statsLabelNamespace, statsLabelIPAddr}) + s.backendSQLResponse99AvgCounts = stats.NewGaugesWithMultiLabels("backendSQLResponse99AvgCounts", + "gaea proxy backend sql sqlTimings P99 avg", []string{statsLabelCluster, statsLabelNamespace, statsLabelIPAddr}) + s.backendSQLResponse95MaxCounts = stats.NewGaugesWithMultiLabels("backendSQLResponse95MaxCounts", + "gaea proxy backend sql sqlTimings P95 max", []string{statsLabelCluster, statsLabelNamespace, statsLabelIPAddr}) + s.backendSQLResponse95AvgCounts = stats.NewGaugesWithMultiLabels("backendSQLResponse95AvgCounts", + "gaea proxy backend sql sqlTimings P95 avg", []string{statsLabelCluster, statsLabelNamespace, statsLabelIPAddr}) + s.uptimeCounts = stats.NewGaugesWithMultiLabels("UptimeCounts", + "gaea proxy uptime counts", []string{statsLabelCluster}) + s.clientConnecions = sync.Map{} s.startClearTask() return nil } @@ -820,10 +1019,9 @@ func (s *StatisticManager) recordSessionSQLTiming(namespace string, operation st s.sqlTimings.Record(operationStatsKey, startTime) } -// millisecond duration -func (s *StatisticManager) isBackendSlowSQL(startTime time.Time) bool { - duration := time.Since(startTime).Nanoseconds() / int64(time.Millisecond) - return duration > s.slowSQLTime || s.slowSQLTime == 0 +// isBackendSlowSQL return true only gaea.ini slow_sql_time > 0 and duration > slow_sql_time +func (s *StatisticManager) isBackendSlowSQL(duration int64) bool { + return s.slowSQLTime > 0 && duration > s.slowSQLTime } func (s *StatisticManager) recordBackendSlowSQLFingerprint(namespace string, md5 string) { @@ -838,9 +1036,28 @@ func (s *StatisticManager) recordBackendErrorSQLFingerprint(namespace string, op s.backendSQLFingerprintErrorCounts.Add(fingerprintStatsKey, 1) } -func (s *StatisticManager) recordBackendSQLTiming(namespace string, operation string, startTime time.Time) { +func (s *StatisticManager) recordBackendSQLTiming(namespace string, operation string, sliceName, backendAddr string, startTime time.Time) { operationStatsKey := []string{s.clusterName, namespace, operation} s.backendSQLTimings.Record(operationStatsKey, startTime) + + if s.SQLResponsePercentile[namespace] == nil { + log.Warn("ns %s not in SQLResponsePercentile", namespace) + return + } + if !s.SQLResponsePercentile[namespace].sqlExecTimeRecordSwitch { + return + } + execTimeMicro := time.Since(startTime).Microseconds() + sQLExecTimeRecord := &SQLExecTimeRecord{ + sliceName: sliceName, + backendAddr: backendAddr, + execTimeMicro: execTimeMicro, + } + select { + case s.SQLResponsePercentile[namespace].sQLExecTimeChan <- sQLExecTimeRecord: + case <-time.After(time.Millisecond): + s.SQLResponsePercentile[namespace].sqlExecTimeRecordSwitch = false + } } // RecordSQLForbidden record forbidden sql @@ -855,12 +1072,30 @@ func (s *StatisticManager) IncrSessionCount(namespace string) { s.sessionCounts.Add(statsKey, 1) } +func (s *StatisticManager) IncrConnectionCount(namespace string) { + if value, ok := s.clientConnecions.Load(namespace); !ok { + s.clientConnecions.Store(namespace, atomic.NewInt32(1)) + } else { + lastNum := value.(*atomic.Int32) + lastNum.Inc() + } +} + // DescSessionCount decr session count func (s *StatisticManager) DescSessionCount(namespace string) { statsKey := []string{s.clusterName, namespace} s.sessionCounts.Add(statsKey, -1) } +func (s *StatisticManager) DescConnectionCount(namespace string) { + if value, ok := s.clientConnecions.Load(namespace); !ok { + _ = log.Warn("namespace: '%v' maxClientConnections should in map", namespace) + } else { + lastNum := value.(*atomic.Int32) + lastNum.Dec() + } +} + // AddReadFlowCount add read flow count func (s *StatisticManager) AddReadFlowCount(namespace string, byteCount int) { statsKey := []string{s.clusterName, namespace, "read"} @@ -873,20 +1108,147 @@ func (s *StatisticManager) AddWriteFlowCount(namespace string, byteCount int) { s.flowCounts.Add(statsKey, int64(byteCount)) } -//record idle connect count -func (s *StatisticManager) recordConnectPoolIdleCount(namespace string, slice string, addr string, count int64) { - statsKey := []string{s.clusterName, namespace, slice, addr} +// record idle connect count +func (s *StatisticManager) recordConnectPoolIdleCount(namespace string, slice string, addr string, count int64, role string) { + statsKey := []string{s.clusterName, namespace, slice, addr, role} s.backendConnectPoolIdleCounts.Set(statsKey, count) } -//record in-use connect count -func (s *StatisticManager) recordConnectPoolInuseCount(namespace string, slice string, addr string, count int64) { - statsKey := []string{s.clusterName, namespace, slice, addr} +// record in-use connect count +func (s *StatisticManager) recordConnectPoolInuseCount(namespace string, slice string, addr string, count int64, role string) { + statsKey := []string{s.clusterName, namespace, slice, addr, role} s.backendConnectPoolInUseCounts.Set(statsKey, count) } -//record wait queue length -func (s *StatisticManager) recordConnectPoolWaitCount(namespace string, slice string, addr string, count int64) { - statsKey := []string{s.clusterName, namespace, slice, addr} +// record wait queue length +func (s *StatisticManager) recordConnectPoolWaitCount(namespace string, slice string, addr string, count int64, role string) { + statsKey := []string{s.clusterName, namespace, slice, addr, role} s.backendConnectPoolWaitCounts.Set(statsKey, count) } + +// recordConnectPoolActive records the count of active connections in a connection pool for a specific server role within a namespace and slice context. +func (s *StatisticManager) recordConnectPoolActiveCount(namespace string, slice string, addr string, count int64, role string) { + statsKey := []string{s.clusterName, namespace, slice, addr, role} + s.backendConnectPoolActiveCounts.Set(statsKey, count) +} + +// recordConnectPoolCount records the total capacity of a connection pool for a specific server role within a namespace and slice context. +func (s *StatisticManager) recordConnectPoolCount(namespace string, slice string, addr string, count int64, role string) { + statsKey := []string{s.clusterName, namespace, slice, addr, role} + s.backendConnectPoolCapacityCounts.Set(statsKey, count) +} + +// record wait queue length +func (s *StatisticManager) recordInstanceDownCount(namespace string, slice string, addr string, count int64, role string) { + statsKey := []string{s.clusterName, namespace, slice, addr, role} + s.backendInstanceDownCounts.Set(statsKey, count) +} + +// record wait queue length +func (s *StatisticManager) recordBackendSQLTimingP99Max(namespace, backendAddr string, count int64) { + statsKey := []string{s.clusterName, namespace, backendAddr} + s.backendSQLResponse99MaxCounts.Set(statsKey, count) +} + +func (s *StatisticManager) recordBackendSQLTimingP99Avg(namespace, backendAddr string, count int64) { + statsKey := []string{s.clusterName, namespace, backendAddr} + s.backendSQLResponse99AvgCounts.Set(statsKey, count) +} + +func (s *StatisticManager) recordBackendSQLTimingP95Max(namespace, backendAddr string, count int64) { + statsKey := []string{s.clusterName, namespace, backendAddr} + s.backendSQLResponse95MaxCounts.Set(statsKey, count) +} + +func (s *StatisticManager) recordBackendSQLTimingP95Avg(namespace, backendAddr string, count int64) { + statsKey := []string{s.clusterName, namespace, backendAddr} + s.backendSQLResponse95AvgCounts.Set(statsKey, count) +} + +// AddUptimeCount add uptime count +func (s *StatisticManager) AddUptimeCount(count int64) { + statsKey := []string{s.clusterName} + s.uptimeCounts.Set(statsKey, count) +} + +func (s *StatisticManager) CalcCPUBusy(interval int) { + cpuBusy := int64(0) + p, err := process.NewProcess(int32(os.Getpid())) + if err != nil { + log.Notice("server", "gopsutil", "NewProcess", 0, err) + return + } + cpuPercent, err := p.Percent(time.Duration(interval) * time.Second) + if err == nil { + if s.CPUNums != 0 { + // 为了适应CountersWithMultiLabels的数据类型,这里对cpuTime结果做了取整,grafana显示时需要还原 + cpuBusy = int64(cpuPercent / float64(s.CPUNums) * 100) + + } else { + cpuBusy = int64(cpuPercent / float64(runtime.NumCPU()) * 100) + } + } + statsKey := []string{s.clusterName} + s.CPUBusy.Set(statsKey, cpuBusy) +} + +func (s *StatisticManager) CalcAvgSQLTimes() { + for ns, sQLResponse := range s.SQLResponsePercentile { + sqlTimesMicro := make([]int64, 0) + quit := false + backendAddr := "" + for !quit { + select { + case tmp := <-sQLResponse.sQLExecTimeChan: + if len(sqlTimesMicro) >= SQLExecTimeSize { + quit = true + } + backendAddr = tmp.backendAddr + etime := tmp.execTimeMicro + sqlTimesMicro = append(sqlTimesMicro, etime) + case <-time.After(time.Millisecond): + quit = true + } + } + if len(sqlTimesMicro) == 0 { + s.SQLResponsePercentile[ns].response99Max[backendAddr] = 0 + s.SQLResponsePercentile[ns].response95Max[backendAddr] = 0 + s.SQLResponsePercentile[ns].response99Avg[backendAddr] = 0 + s.SQLResponsePercentile[ns].response95Avg[backendAddr] = 0 + s.SQLResponsePercentile[ns].sqlExecTimeRecordSwitch = true + continue + } + sort.Slice(sqlTimesMicro, func(i, j int) bool { return sqlTimesMicro[i] < sqlTimesMicro[j] }) + sum := int64(0) + p99sum := int64(0) + p95sum := int64(0) + s.SQLResponsePercentile[ns].response99Max[backendAddr] = sqlTimesMicro[(len(sqlTimesMicro)-1)*99/100] + s.SQLResponsePercentile[ns].response95Max[backendAddr] = sqlTimesMicro[(len(sqlTimesMicro)-1)*95/100] + for k := range sqlTimesMicro { + sum += sqlTimesMicro[k] + if k < len(sqlTimesMicro)*95/100 { + p95sum += sqlTimesMicro[k] + } + if k < len(sqlTimesMicro)*99/100 { + p99sum += sqlTimesMicro[k] + } + } + if len(sqlTimesMicro)*99/100 > 0 { + s.SQLResponsePercentile[ns].response99Avg[backendAddr] = p99sum / int64(len(sqlTimesMicro)*99/100) + } + if len(sqlTimesMicro)*95/100 > 0 { + s.SQLResponsePercentile[ns].response95Avg[backendAddr] = p95sum / int64(len(sqlTimesMicro)*95/100) + } + s.SQLResponsePercentile[ns].sqlExecTimeRecordSwitch = true + } +} + +// getStatusDownCounts get status down counts from DBinfo.statusMap +func getStatusDownCounts(statusMap *sync.Map, index int) int64 { + if v, ok := statusMap.Load(index); !ok { + return 1 + } else if v != backend.StatusUp { + return 1 + } + return 0 +} diff --git a/proxy/server/manager_test.go b/proxy/server/manager_test.go index 5c69153b..c25140e8 100644 --- a/proxy/server/manager_test.go +++ b/proxy/server/manager_test.go @@ -4,7 +4,7 @@ // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // -// http://www.apache.org/licenses/LICENSE-2.0 +// http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, diff --git a/proxy/server/namespace.go b/proxy/server/namespace.go index 5aff93c2..5898fbfe 100644 --- a/proxy/server/namespace.go +++ b/proxy/server/namespace.go @@ -15,6 +15,7 @@ package server import ( + "context" "errors" "fmt" "net" @@ -31,6 +32,7 @@ import ( "github.com/XiaoMi/Gaea/proxy/sequence" "github.com/XiaoMi/Gaea/util" "github.com/XiaoMi/Gaea/util/cache" + "golang.org/x/time/rate" ) const ( @@ -44,6 +46,10 @@ const ( defaultSlowSQLTime = 1000 // millisecond defaultMaxSqlExecuteTime = 0 // 默认为0,不开启慢sql熔断功能 defaultMaxSqlResultSize = 10000 // 默认为10000, 限制查询返回的结果集大小不超过该阈值 + defaultTimeAfterNoAlive = 32 // 每间隔4秒进行一次检查, 默认 32秒后会探测到实例失败 + // 认为Slave已下线,如果需要快速判定状态,可减少该值 + defaultMaxClientConnections = 100000000 //Big enough + ) // UserProperty means runtime user properties @@ -55,28 +61,41 @@ type UserProperty struct { // Namespace is struct driected used by server type Namespace struct { - name string - allowedDBs map[string]bool - defaultPhyDBs map[string]string // logicDBName-phyDBName - sqls map[string]string //key: sql fingerprint - slowSQLTime int64 // session slow sql time, millisecond, default 1000 - allowips []util.IPInfo - router *router.Router - sequences *sequence.SequenceManager - slices map[string]*backend.Slice // key: slice name - userProperties map[string]*UserProperty // key: user name ,value: user's properties - defaultCharset string - defaultCollationID mysql.CollationID - openGeneralLog bool - maxSqlExecuteTime int // session max sql execute time,millisecond - maxSqlResultSize int - defaultSlice string - - slowSQLCache *cache.LRUCache - errorSQLCache *cache.LRUCache - backendSlowSQLCache *cache.LRUCache - backendErrorSQLCache *cache.LRUCache - planCache *cache.LRUCache + name string + allowedDBs map[string]bool + defaultPhyDBs map[string]string // logicDBName-phyDBName + sqls map[string]string //key: sql fingerprint + slowSQLTime int64 // session slow sql time, millisecond, default 1000 + allowips []util.IPInfo + router *router.Router + sequences *sequence.SequenceManager + slices map[string]*backend.Slice // key: slice name + userProperties map[string]*UserProperty // key: user name ,value: user's properties + defaultCharset string + defaultCollationID mysql.CollationID + openGeneralLog bool // 已废弃 + maxSqlExecuteTime int // session max sql execute time,millisecond + maxSqlResultSize int + defaultSlice string + downAfterNoAlive int + secondsBehindMaster uint64 + supportMultiQuery bool + maxClientConnections int + CheckSelectLock bool + localSlaveReadPriority int + setForKeepSession bool + clientQPSLimit uint32 + supportLimitTx bool + + slowSQLCache *cache.LRUCache + errorSQLCache *cache.LRUCache + backendSlowSQLCache *cache.LRUCache + backendErrorSQLCache *cache.LRUCache + planCache *cache.LRUCache + CloseCancel context.CancelFunc + limiter *rate.Limiter + namespaceChangeIndex uint32 + allowedSessionVariables map[string]string } // DumpToJSON means easy encode json @@ -85,19 +104,20 @@ func (n *Namespace) DumpToJSON() []byte { } // NewNamespace init namespace -func NewNamespace(namespaceConfig *models.Namespace) (*Namespace, error) { +func NewNamespace(namespaceConfig *models.Namespace, proxyDatacenter string) (*Namespace, error) { var err error namespace := &Namespace{ - name: namespaceConfig.Name, - sqls: make(map[string]string, 16), - userProperties: make(map[string]*UserProperty, 2), - openGeneralLog: namespaceConfig.OpenGeneralLog, - slowSQLCache: cache.NewLRUCache(defaultSQLCacheCapacity), - errorSQLCache: cache.NewLRUCache(defaultSQLCacheCapacity), - backendSlowSQLCache: cache.NewLRUCache(defaultSQLCacheCapacity), - backendErrorSQLCache: cache.NewLRUCache(defaultSQLCacheCapacity), - planCache: cache.NewLRUCache(defaultPlanCacheCapacity), - defaultSlice: namespaceConfig.DefaultSlice, + name: namespaceConfig.Name, + sqls: make(map[string]string, 16), + userProperties: make(map[string]*UserProperty, 2), + openGeneralLog: namespaceConfig.OpenGeneralLog, + slowSQLCache: cache.NewLRUCache(defaultSQLCacheCapacity), + errorSQLCache: cache.NewLRUCache(defaultSQLCacheCapacity), + backendSlowSQLCache: cache.NewLRUCache(defaultSQLCacheCapacity), + backendErrorSQLCache: cache.NewLRUCache(defaultSQLCacheCapacity), + planCache: cache.NewLRUCache(defaultPlanCacheCapacity), + defaultSlice: namespaceConfig.DefaultSlice, + allowedSessionVariables: namespaceConfig.AllowedSessionVariables, } defer func() { @@ -105,6 +125,20 @@ func NewNamespace(namespaceConfig *models.Namespace) (*Namespace, error) { namespace.Close(false) } }() + var ctx context.Context + ctx, namespace.CloseCancel = context.WithCancel(context.TODO()) + + // init SupportMultiQuery default true + namespace.supportMultiQuery = false + if namespaceConfig.SupportMultiQuery { + namespace.supportMultiQuery = namespaceConfig.SupportMultiQuery + } + + // init CheckSelectLock default true + namespace.CheckSelectLock = true + if namespaceConfig.CheckSelectLock { + namespace.CheckSelectLock = namespaceConfig.CheckSelectLock + } // init black sql namespace.sqls = parseBlackSqls(namespaceConfig.BlackSQL) @@ -140,7 +174,7 @@ func NewNamespace(namespaceConfig *models.Namespace) (*Namespace, error) { defaultPhyDBs[strings.TrimSpace(db)] = strings.TrimSpace(phyDB) } - namespace.defaultPhyDBs, err = parseDefaultPhyDB(defaultPhyDBs, allowDBs) + namespace.defaultPhyDBs, err = parseDefaultPhyDB(defaultPhyDBs, allowDBs, namespaceConfig.ShardRules) if err != nil { return nil, fmt.Errorf("parse defaultPhyDBs error: %v", err) } @@ -163,12 +197,44 @@ func NewNamespace(namespaceConfig *models.Namespace) (*Namespace, error) { namespace.userProperties[user.UserName] = up } + if namespaceConfig.MaxClientConnections <= 0 { + namespace.maxClientConnections = defaultMaxClientConnections + } else { + namespace.maxClientConnections = namespaceConfig.MaxClientConnections + } + + namespace.downAfterNoAlive = namespaceConfig.DownAfterNoAlive + if namespace.downAfterNoAlive < 0 { + return nil, fmt.Errorf("downAfterNoAlive should be greater than 0") + } + // not configurable yet, use default + if namespace.downAfterNoAlive == 0 { + namespace.downAfterNoAlive = defaultTimeAfterNoAlive + } + + namespace.secondsBehindMaster = namespaceConfig.SecondsBehindMaster + + // init localSlaveReadPriority + switch namespaceConfig.LocalSlaveReadPriority { + case backend.LocalSlaveReadPreferred: + namespace.localSlaveReadPriority = backend.LocalSlaveReadPreferred + case backend.LocalSlaveReadForce: + namespace.localSlaveReadPriority = backend.LocalSlaveReadForce + default: + namespace.localSlaveReadPriority = backend.LocalSlaveReadClosed + } + // init backend slices - namespace.slices, err = parseSlices(namespaceConfig.Slices, namespace.defaultCharset, namespace.defaultCollationID) + namespace.slices, err = parseSlices(namespaceConfig.Slices, namespace.defaultCharset, namespace.defaultCollationID, proxyDatacenter) if err != nil { return nil, fmt.Errorf("init slices of namespace: %s failed, err: %v", namespaceConfig.Name, err) } + //Check slice master and slave status and mark them as unavailable when detect down + if namespace.downAfterNoAlive > 0 { + namespace.CheckSliceStatus(ctx) + } + // init router namespace.router, err = router.NewRouter(namespaceConfig) if err != nil { @@ -184,11 +250,21 @@ func NewNamespace(namespaceConfig *models.Namespace) (*Namespace, error) { return nil, fmt.Errorf("init global sequence error: slice not found, sequence: %v", v) } seqName := strings.ToUpper(v.DB) + "." + strings.ToUpper(v.Table) - seq := sequence.NewMySQLSequence(globalSequenceSlice, seqName, v.PKName) + seq := sequence.NewMySQLSequence(globalSequenceSlice, seqName, v.PKName, v.MaxLimit) sequences.SetSequence(v.DB, v.Table, seq) } namespace.sequences = sequences + // init global keepSession in namespace + namespace.setForKeepSession = namespaceConfig.SetForKeepSession + + // init client qps limit config + if namespaceConfig.ClientQPSLimit > 0 { + namespace.clientQPSLimit = namespaceConfig.ClientQPSLimit + namespace.limiter = rate.NewLimiter(rate.Limit(namespaceConfig.ClientQPSLimit), int(namespaceConfig.ClientQPSLimit)) + namespace.supportLimitTx = namespaceConfig.SupportLimitTransaction + } + return namespace, nil } @@ -202,6 +278,11 @@ func (n *Namespace) GetSlice(name string) *backend.Slice { return n.slices[name] } +// GetDefaultSessionVariables return default session variables of namespace +func (n *Namespace) GetAllowedSessionVariables() map[string]string { + return n.allowedSessionVariables +} + // GetRouter return router of namespace func (n *Namespace) GetRouter() *router.Router { return n.router @@ -261,10 +342,7 @@ func (n *Namespace) IsSQLAllowed(reqCtx *util.RequestContext, sql string) bool { if len(n.sqls) == 0 { return true } - - fingerprint := mysql.GetFingerprint(sql) - reqCtx.Set("fingerprint", fingerprint) - md5 := mysql.GetMd5(fingerprint) + md5 := getSQLFingerprintMd5(reqCtx, sql) if _, ok := n.sqls[md5]; ok { return false } @@ -450,6 +528,9 @@ func (n *Namespace) ClearBackendErrorSQLFingerprints() { // Close recycle resources of namespace func (n *Namespace) Close(delay bool) { var err error + // close check alive + n.CloseCancel() + // delay close time if delay { time.Sleep(time.Second * namespaceDelayClose) @@ -465,14 +546,29 @@ func (n *Namespace) Close(delay bool) { n.errorSQLCache.Clear() n.backendSlowSQLCache.Clear() n.backendErrorSQLCache.Clear() + n.planCache.Clear() + _ = log.Warn("close ns:%s", n.name) } -func parseSlice(cfg *models.Slice, charset string, collationID mysql.CollationID) (*backend.Slice, error) { +func (n *Namespace) CheckSliceStatus(ctx context.Context) { + defer func() { + if err := recover(); err != nil { + log.Notice("checkSlicesStatus recover error: %s", err) + } + }() + + for _, slice := range n.slices { + slice.CheckStatus(ctx, n.name, n.downAfterNoAlive, int(n.secondsBehindMaster)) + } +} + +func parseSlice(cfg *models.Slice, charset string, collationID mysql.CollationID, dc string) (*backend.Slice, error) { var err error s := new(backend.Slice) s.Cfg = *cfg + s.ProxyDatacenter = dc s.SetCharsetInfo(charset, collationID) - + s.HealthCheckSql = cfg.HealthCheckSql // parse master err = s.ParseMaster(cfg.Master) if err != nil { @@ -480,21 +576,22 @@ func parseSlice(cfg *models.Slice, charset string, collationID mysql.CollationID } // parse slaves - err = s.ParseSlave(cfg.Slaves) + slaveInfo, err := s.ParseSlave(cfg.Slaves) if err != nil { return nil, err } + s.Slave = slaveInfo // parse statistic slaves - err = s.ParseStatisticSlave(cfg.StatisticSlaves) + statisticSalve, err := s.ParseSlave(cfg.StatisticSlaves) if err != nil { return nil, err } - + s.StatisticSlave = statisticSalve return s, nil } -func parseSlices(cfgSlices []*models.Slice, charset string, collationID mysql.CollationID) (map[string]*backend.Slice, error) { +func parseSlices(cfgSlices []*models.Slice, charset string, collationID mysql.CollationID, dc string) (map[string]*backend.Slice, error) { slices := make(map[string]*backend.Slice, len(cfgSlices)) for _, v := range cfgSlices { v.Name = strings.TrimSpace(v.Name) // modify origin slice name, trim space @@ -502,7 +599,7 @@ func parseSlices(cfgSlices []*models.Slice, charset string, collationID mysql.Co return nil, fmt.Errorf("duplicate slice [%s]", v.Name) } - s, err := parseSlice(v, charset, collationID) + s, err := parseSlice(v, charset, collationID, dc) if err != nil { return nil, err } @@ -582,7 +679,7 @@ func parseCharset(charset, collation string) (string, mysql.CollationID, error) return charset, collationID, nil } -func parseDefaultPhyDB(defaultPhyDBs map[string]string, allowedDBs map[string]bool) (map[string]string, error) { +func parseDefaultPhyDB(defaultPhyDBs map[string]string, allowedDBs map[string]bool, shardRules []*models.Shard) (map[string]string, error) { // no logic database mode if len(defaultPhyDBs) == 0 { result := make(map[string]string, len(allowedDBs)) @@ -598,5 +695,17 @@ func parseDefaultPhyDB(defaultPhyDBs map[string]string, allowedDBs map[string]bo return nil, fmt.Errorf("db %s have no phy db", db) } } + + // add real phyDB to phyDBs + for _, rule := range shardRules { + realDBs, err := router.GetRealDatabases(rule.Databases) + if err != nil { + return defaultPhyDBs, err + } + for _, realDB := range realDBs { + defaultPhyDBs[realDB] = realDB + } + } + return defaultPhyDBs, nil } diff --git a/proxy/server/namespace_test.go b/proxy/server/namespace_test.go new file mode 100644 index 00000000..e06daaee --- /dev/null +++ b/proxy/server/namespace_test.go @@ -0,0 +1,35 @@ +package server + +import ( + "github.com/XiaoMi/Gaea/models" + "reflect" + "testing" +) + +type phyDBCase struct { + defaultPhyDBs map[string]string + allowedDBs map[string]bool + shardRules []*models.Shard + realPhyDBs map[string]string +} + +func TestParsePhyDBs(t *testing.T) { + tests := []phyDBCase{ + {defaultPhyDBs: map[string]string{"db_mycat": "db_mycat"}, + allowedDBs: map[string]bool{"db_mycat": true}, + shardRules: []*models.Shard{{Databases: []string{"db_mycat_[0-1]"}}}, + realPhyDBs: map[string]string{"db_mycat": "db_mycat", "db_mycat_0": "db_mycat_0", "db_mycat_1": "db_mycat_1"}}, + {defaultPhyDBs: map[string]string{}, + allowedDBs: map[string]bool{"db_mycat": true}, + shardRules: []*models.Shard{}, + realPhyDBs: map[string]string{"db_mycat": "db_mycat"}}, + } + for index, test := range tests { + t.Run("test", func(t *testing.T) { + realPhyDBs, _ := parseDefaultPhyDB(test.defaultPhyDBs, test.allowedDBs, test.shardRules) + if !reflect.DeepEqual(realPhyDBs, test.realPhyDBs) { + t.Errorf("test %d, parse real phyDBs error, %v", index, realPhyDBs) + } + }) + } +} diff --git a/proxy/server/server.go b/proxy/server/server.go index 23ad00d5..6cd0a3a2 100644 --- a/proxy/server/server.go +++ b/proxy/server/server.go @@ -30,21 +30,23 @@ import ( ) var ( - timeWheelUnit = time.Second * 1 + timeWheelUnit = time.Second * 5 timeWheelBucketsNum = 3600 ) // Server means proxy that serve client request type Server struct { - closed sync2.AtomicBool - listener net.Listener - sessionTimeout time.Duration - tw *util.TimeWheel - adminServer *AdminServer - manager *Manager - EncryptKey string - ServerVersion string - AuthPlugin string + closed sync2.AtomicBool + listener net.Listener + sessionTimeout time.Duration + tw *util.TimeWheel + adminServer *AdminServer + manager *Manager + EncryptKey string + ServerVersion string + ServerVersionCompareStatus *util.VersionCompareStatus + AuthPlugin string + ServerConfig *models.Proxy } // NewServer create new server @@ -54,9 +56,12 @@ func NewServer(cfg *models.Proxy, manager *Manager) (*Server, error) { // init key s.EncryptKey = cfg.EncryptKey + s.ServerConfig = cfg s.manager = manager - s.ServerVersion = cfg.ServerVersion + s.ServerVersion = util.CompactServerVersion(cfg.ServerVersion) + s.ServerVersionCompareStatus = util.NewVersionCompareStatus(cfg.ServerVersion) s.AuthPlugin = cfg.AuthPlugin + if len(s.AuthPlugin) > 0 { DefaultCapability |= mysql.ClientPluginAuth } @@ -124,30 +129,30 @@ func (s *Server) onConn(c net.Conn) { cc.Close() }() - if err := cc.Handshake(); err != nil { - log.Warn("[server] onConn error: %s", err.Error()) - if err != mysql.ErrBadConn { + if _, err := cc.Handshake(); err != nil { + if err.Error() != mysql.ErrBadConn.Error() && err.Error() != mysql.ErrResetConn.Error() { + log.Warn("[server] onConn error: %s", err.Error()) cc.c.writeErrorPacket(err) } return } - // must invoke after handshake - if allowConnect := cc.IsAllowConnect(); allowConnect == false { - err := mysql.NewError(mysql.ErrAccessDenied, "ip address access denied by gaea") - cc.c.writeErrorPacket(err) - return - } + // set keep session flag + cc.executor.keepSession = cc.getNamespace().setForKeepSession + + // set user privileges flag + cc.executor.userPriv = cc.getNamespace().userProperties[cc.executor.user].RWFlag // added into time wheel s.tw.Add(s.sessionTimeout, cc, cc.Close) - log.Notice("Connected conn_id=%d, %s@%s (%s) namespace:%s capability: %d", + _ = s.manager.statistics.generalLogger.Notice("Connected - conn_id=%d, ns=%s, %s@%s/%s, capability: %d", cc.c.ConnectionID, + cc.executor.namespace, cc.executor.user, cc.executor.clientAddr, cc.executor.db, - cc.executor.namespace, cc.c.capability) + cc.Run() } @@ -234,3 +239,32 @@ func (s *Server) DeleteNamespace(name string) error { log.Notice("delete namespace end: %s", name) return nil } + +func (s *Server) ReloadProxyConfig() error { + cfg := s.ServerConfig + log.Notice("reload proxy config,old config:%#v", cfg) + newCfg, err := models.ParseProxyConfigFromFile(cfg.ConfigFile) + if err != nil { + return fmt.Errorf("parse config file error:%s", err) + } + cfg.LogFileName = newCfg.LogFileName + cfg.LogLevel = newCfg.LogLevel + cfg.LogOutput = newCfg.LogOutput + cfg.LogPath = newCfg.LogPath + cfg.LogKeepDays = newCfg.LogKeepDays + cfg.LogKeepCounts = newCfg.LogKeepCounts + log.Notice("reload proxy config,new config:%#v", cfg) + // reload sys log + if err = models.InitXLog(cfg.LogOutput, cfg.LogPath, cfg.LogFileName, cfg.LogLevel, cfg.Service, cfg.LogKeepDays, cfg.LogKeepCounts); err != nil { + return fmt.Errorf("init xlog error:%s", err) + } + // reload general log + stm := s.manager.GetStatisticManager() + oldGeneralLogger := stm.generalLogger + if stm.generalLogger, err = initGeneralLogger(cfg); err != nil { + return fmt.Errorf("reset general logger error:%s", err) + } + oldGeneralLogger.Close() + + return nil +} diff --git a/proxy/server/session.go b/proxy/server/session.go index 95097927..fd9ca54d 100644 --- a/proxy/server/session.go +++ b/proxy/server/session.go @@ -16,12 +16,16 @@ package server import ( "fmt" + "github.com/XiaoMi/Gaea/backend" "net" "runtime" "strings" "sync" + "sync/atomic" + uber_atomic "go.uber.org/atomic" + "github.com/XiaoMi/Gaea/log" "github.com/XiaoMi/Gaea/mysql" "github.com/XiaoMi/Gaea/util" @@ -30,7 +34,9 @@ import ( // DefaultCapability means default capability var DefaultCapability = mysql.ClientLongPassword | mysql.ClientLongFlag | mysql.ClientConnectWithDB | mysql.ClientProtocol41 | - mysql.ClientTransactions | mysql.ClientSecureConnection + mysql.ClientTransactions | mysql.ClientSecureConnection | mysql.ClientFoundRows | + mysql.ClientMultiResults | mysql.ClientMultiStatements | mysql.ClientPSMultiResults | + mysql.ClientLocalFiles | mysql.ClientPluginAuth //下面的会根据配置文件参数加进去 //mysql.ClientPluginAuth @@ -53,6 +59,8 @@ type Session struct { executor *SessionExecutor closed atomic.Value + + continueConn backend.PooledConnect } // create session between client<->proxy @@ -76,6 +84,8 @@ func newSession(s *Server, co net.Conn) *Session { cc.executor = newSessionExecutor(s.manager) cc.executor.clientAddr = co.RemoteAddr().String() cc.closed.Store(false) + cc.executor.session = cc + cc.executor.serverAddr = s.listener.Addr() return cc } @@ -83,6 +93,24 @@ func (cc *Session) getNamespace() *Namespace { return cc.manager.GetNamespace(cc.namespace) } +func (cc *Session) clientConnectionReachLimit() (bool, int) { + var current interface{} + var ok bool + + //can't find means this is the first connection + if current, ok = cc.manager.statistics.clientConnecions.Load(cc.namespace); !ok { + return false, 0 + } + + // 并发情况下,这边判断有问题,会检测不准,修改成原子操作,对建立连接性能有影响,暂不处理 + var v = int(current.(*uber_atomic.Int32).Load()) + if v >= cc.getNamespace().maxClientConnections { + return true, v + } + + return false, v +} + // IsAllowConnect check if allow to connect func (cc *Session) IsAllowConnect() bool { ns := cc.getNamespace() // maybe nil, and panic! @@ -99,7 +127,7 @@ func (cc *Session) IsAllowConnect() bool { // step1: server send plain handshake packets to client // step2: client send handshake response packets to server // step3: server send ok/err packets to client -func (cc *Session) Handshake() error { +func (cc *Session) Handshake() (*HandshakeResponseInfo, error) { // First build and send the server handshake packet. if err := cc.c.writeInitialHandshakeV10(); err != nil { clientHost, _, innerErr := net.SplitHostPort(cc.c.RemoteAddr().String()) @@ -109,12 +137,10 @@ func (cc *Session) Handshake() error { // filter lvs detect liveness hostname, _ := util.HostName(clientHost) if len(hostname) > 0 && strings.Contains(hostname, "lvs") { - return err + return nil, err } - log.Warn("[server] Session writeInitialHandshake error, connId: %d, ip: %s, msg: %s, error: %s", - cc.c.GetConnectionID(), clientHost, " send initial handshake error", err.Error()) - return err + return nil, err } info, err := cc.c.readHandshakeResponse() @@ -123,29 +149,40 @@ func (cc *Session) Handshake() error { if innerErr != nil { log.Warn("[server] Session parse host error: %v", innerErr) } - // filter lvs detect liveness - hostname, _ := util.HostName(clientHost) - if len(hostname) > 0 && strings.Contains(hostname, "lvs") { - return err - } - log.Warn("[server] Session readHandshakeResponse error, connId: %d, ip: %s, msg: %s, error: %s", + log.Debug("[server] Session readHandshakeResponse error, connId: %d, ip: %s, msg: %s, error: %s", cc.c.GetConnectionID(), clientHost, "read Handshake Response error", err.Error()) - return err + return &info, err } if err := cc.handleHandshakeResponse(info); err != nil { log.Warn("handleHandshakeResponse error, connId: %d, err: %v", cc.c.GetConnectionID(), err) - return err + return &info, err + } + + // check if client ip allow to connect + if allowConnect := cc.IsAllowConnect(); allowConnect == false { + errMsg := fmt.Sprintf("[ns:%s, %s@%s/%s] ip not allowed to connect.", + cc.namespace, cc.executor.user, cc.executor.clientAddr, cc.executor.db) + log.Warn(errMsg) + return &info, mysql.NewError(mysql.ErrAccessDenied, errMsg) + } + + // check connection has reach the limit, must invote after handshake like ip white list + if reachLimit, connectionNum := cc.clientConnectionReachLimit(); reachLimit { + errMsg := fmt.Sprintf("[ns:%s, %s@%s/%s] too many connections, current:%d, max:%d", + cc.namespace, cc.executor.user, cc.executor.clientAddr, cc.executor.db, connectionNum, cc.getNamespace().maxClientConnections) + log.Warn(errMsg) + return &info, mysql.NewError(mysql.ErrConCount, errMsg) } if err := cc.c.writeOK(cc.executor.GetStatus()); err != nil { log.Warn("[server] Session readHandshakeResponse error, connId %d, msg: %s, error: %s", cc.c.GetConnectionID(), "write ok fail", err.Error()) - return err + return &info, err } - return nil + return &info, nil } func (cc *Session) handleHandshakeResponse(info HandshakeResponseInfo) error { @@ -163,7 +200,10 @@ func (cc *Session) handleHandshakeResponse(info HandshakeResponseInfo) error { if len(info.AuthResponse) == 32 { succ, password = cc.manager.CheckSha2Password(user, info.Salt, info.AuthResponse) } else { - succ, password = cc.manager.CheckPassword(user, info.Salt, info.AuthResponse) + succ, password = cc.manager.CheckHashPassword(user, info.Salt, info.AuthResponse) + if !succ { + succ, password = cc.manager.CheckPassword(user, info.Salt, info.AuthResponse) + } } } else if info.AuthPlugin == mysql.CachingSHA2Password { succ, password = cc.manager.CheckSha2Password(user, info.Salt, info.AuthResponse) @@ -196,6 +236,7 @@ func (cc *Session) handleHandshakeResponse(info HandshakeResponseInfo) error { cc.namespace = namespace cc.executor.namespace = namespace cc.c.namespace = namespace // TODO: remove it when refactor is done + cc.executor.SetContextNamespace() return nil } @@ -208,6 +249,8 @@ func (cc *Session) Close() { if err := cc.executor.rollback(); err != nil { log.Warn("executor rollback error when Session close: %v", err) } + + cc.executor.handleKsQuit() cc.c.Close() log.Debug("client closed, %d", cc.c.GetConnectionID()) @@ -233,39 +276,59 @@ func (cc *Session) Run() { cc.Close() cc.proxy.tw.Remove(cc) cc.manager.GetStatisticManager().DescSessionCount(cc.namespace) + cc.manager.GetStatisticManager().DescConnectionCount(cc.namespace) }() cc.manager.GetStatisticManager().IncrSessionCount(cc.namespace) + cc.manager.GetStatisticManager().IncrConnectionCount(cc.namespace) for !cc.IsClosed() { + cc.executor.nsChangeIndexOld = cc.executor.GetNamespace().namespaceChangeIndex cc.c.SetSequence(0) data, err := cc.c.ReadEphemeralPacket() if err != nil { cc.c.RecycleReadPacket() + cc.clearKsConns(cc.executor.nsChangeIndexOld) + cc.Close() return } cc.proxy.tw.Add(cc.proxy.sessionTimeout, cc, cc.Close) cc.manager.GetStatisticManager().AddReadFlowCount(cc.namespace, len(data)) + cc.executor.SetContextNamespace() + cc.clearKsConns(cc.executor.nsChangeIndexOld) cmd := data[0] data = data[1:] - rs := cc.executor.ExecuteCommand(cmd, data) - cc.c.RecycleReadPacket() + rs := cc.execCommand(cmd, data) + + // 如果其他地方已经回收过,不再回收 + if !cc.c.hasRecycledReadPacket.CompareAndSwap(true, false) { + cc.c.RecycleReadPacket() + } if err = cc.writeResponse(rs); err != nil { log.Warn("Session write response error, connId: %d, err: %v", cc.c.GetConnectionID(), err) + if _, ok := err.(mysql.SessionCloseError); ok { + log.Notice("Aborted - conn_id=%d, namespace=%s, clientAddr=%s, remoteAddr=%s", + cc.c.GetConnectionID(), cc.namespace, cc.executor.clientAddr, cc.c.RemoteAddr()) + } + cc.clearKsConns(cc.executor.nsChangeIndexOld) cc.Close() return } - if cmd == mysql.ComQuit { + if cmd == mysql.ComQuit || cc.shouldClearKsAndCloseSession(cc.executor.nsChangeIndexOld) { cc.Close() } } } func (cc *Session) writeResponse(r Response) error { + defer func() { + cc.executor.recycleBackendConn(cc.continueConn) + cc.continueConn = nil + }() switch r.RespType { case RespEOF: return cc.c.writeEOFPacket(r.Status) @@ -274,7 +337,16 @@ func (cc *Session) writeResponse(r Response) error { if rs == nil { return cc.c.writeOK(r.Status) } - return cc.c.writeOKResult(r.Status, r.Data.(*mysql.Result)) + if cc.continueConn != nil { + return cc.c.writeOKResultStream(r.Status, r.Data.(*mysql.Result), cc.continueConn, + cc.manager.GetNamespace(cc.namespace).GetMaxResultSize(), r.IsBinary) + } + if r.IsBinary { + if err := rs.BuildBinaryResultSet(); err != nil { + return err + } + } + return cc.c.writeOKResult(r.Status, false, r.Data.(*mysql.Result)) case RespPrepare: stmt := r.Data.(*Stmt) if stmt == nil { @@ -288,16 +360,18 @@ func (cc *Session) writeResponse(r Response) error { } return cc.c.writeFieldList(r.Status, rs) case RespError: - rs := r.Data.(error) + rs := r.Data if rs == nil { return cc.c.writeOK(r.Status) } - err := cc.c.writeErrorPacket(rs) - if err != nil { - return err - } - if rs == mysql.ErrBadConn { // 后端连接如果断开, 应该返回通知Session关闭 - return rs + switch rs.(type) { + case *mysql.SessionCloseRespError: + cc.c.writeErrorPacket(rs.(*mysql.SessionCloseRespError)) + return rs.(*mysql.SessionCloseRespError) + case *mysql.SessionCloseNoRespError: + return rs.(*mysql.SessionCloseNoRespError) + case error: + return cc.c.writeErrorPacket(rs.(error)) } return nil case RespOK: @@ -310,3 +384,29 @@ func (cc *Session) writeResponse(r Response) error { return cc.c.writeErrorPacket(err) } } + +// clearKsConns clear ksConns after namespace changed +func (cc *Session) clearKsConns(nsChangeIndex uint32) { + if cc.executor.IsKeepSession() && cc.getNamespace().namespaceChangeIndex > nsChangeIndex && !cc.executor.isInTransaction() { + for _, ksConn := range cc.executor.ksConns { + ksConn.Close() + ksConn.Recycle() + } + cc.executor.ksConns = make(map[string]backend.PooledConnect) + } +} + +// shouldClearKsAndCloseSession should clear ks map and close session +func (cc *Session) shouldClearKsAndCloseSession(nsChangeIndex uint32) bool { + return cc.executor.IsKeepSession() && cc.executor.isInTransaction() && cc.executor.GetNamespace().namespaceChangeIndex > nsChangeIndex +} + +// execCommand create error response or execute sql +func (cc *Session) execCommand(cmd byte, data []byte) (rs Response) { + if cc.shouldClearKsAndCloseSession(cc.executor.nsChangeIndexOld) { + rs = CreateErrorResponse(cc.executor.status, mysql.ErrTxNsChanged) + } else { + rs = cc.executor.ExecuteCommand(cmd, data) + } + return +} diff --git a/proxy/server/session_test.go b/proxy/server/session_test.go new file mode 100644 index 00000000..f47f0b49 --- /dev/null +++ b/proxy/server/session_test.go @@ -0,0 +1,247 @@ +package server + +import ( + "fmt" + "github.com/XiaoMi/Gaea/backend" + "github.com/XiaoMi/Gaea/models" + "github.com/XiaoMi/Gaea/mysql" + "github.com/XiaoMi/Gaea/util" + "github.com/bytedance/mockey" + "github.com/stretchr/testify/assert" + "sync" + "sync/atomic" + "testing" + "time" +) + +// 检测 namespace changed 时, ks conn 是否被清除 +func TestSessionRunNamespaceChangedWithMock(t *testing.T) { + globalSe, _ := newDefaultSessionExecutor(nil) + namespaceName := globalSe.namespace + manager := globalSe.manager + var NewNamespace = func() *models.Namespace { + return &models.Namespace{ + Name: namespaceName, + Slices: []*models.Slice{ + {Name: "slice-0", Master: "127.0.0.1:3306"}, + }, + DefaultSlice: "slice-0", + } + } + + mockey.PatchConvey("test", t, func() { + mockey.Mock((*mysql.Conn).SetSequence).Return().Build() + mockey.Mock((*mysql.Conn).Close).Return().Build() + mockey.Mock((*mysql.Conn).ReadEphemeralPacket).To(func() ([]byte, error) { + time.Sleep(time.Millisecond * 10) + return []byte{0, 0, 0, 0}, nil + }).Build() + mockey.Mock((*mysql.Conn).RecycleReadPacket).Return().Build() + mockey.Mock((*mysql.Conn).GetConnectionID).Return(0).Build() + mockey.Mock((*SessionExecutor).ExecuteCommand).Return(Response{}).Build() + mockey.Mock((*Session).writeResponse).Return(nil).Build() + mockey.Mock((*Manager).GetStatisticManager).Return(&StatisticManager{}).Build() + mockey.Mock((*StatisticManager).IncrSessionCount).Return().Build() + mockey.Mock((*StatisticManager).IncrConnectionCount).Return().Build() + mockey.Mock((*StatisticManager).DescSessionCount).Return().Build() + mockey.Mock((*StatisticManager).DescConnectionCount).Return().Build() + mockey.Mock((*StatisticManager).AddReadFlowCount).Return().Build() + mockey.Mock((*StatisticManager).initBackend).Return(nil).Build() + mockey.Mock((*StatisticManager).Init).Return(nil).Build() + mockey.Mock((*backend.Slice).CheckStatus).Return().Build() + mockey.Mock((*util.TimeWheel).Remove).Return(nil).Build() + mockey.Mock((*backend.MockPooledConnect).Recycle).Return().Build() + mockey.Mock((*backend.MockPooledConnect).Rollback).Return(nil).Build() + mockey.Mock((*backend.MockPooledConnect).Close).Return().Build() + mockey.Mock(util.GetHostDatacenter).Return("", nil).Build() + + sessionCount := 100 + var g sync.WaitGroup + seList := make([]*SessionExecutor, sessionCount) + for i := 0; i < sessionCount; i++ { + se, _ := newDefaultSessionExecutor(nil) + se.manager = manager + se.session.manager = manager + se.session.namespace = namespaceName + seList[i] = se + } + for _, se := range seList { + go func(se *SessionExecutor) { + defer g.Done() + g.Add(1) + se.ksConns = make(map[string]backend.PooledConnect) + v := &backend.MockPooledConnect{} + se.ksConns["slice-0"] = v + se.session.executor = se + se.session.executor.keepSession = true + closeStatus := atomic.Value{} + closeStatus.Store(false) + se.session.closed = closeStatus + se.session.c = &ClientConn{} + se.SetContextNamespace() + se.session.Run() + }(se) + } + time.Sleep(time.Millisecond * 50) + hasKsConnSeNum := 0 + for _, se := range seList { + // 初始连接需不在事务中 + assert.Equal(t, se.isInTransaction(), false, "not in tx") + if len(se.ksConns) > 0 { + hasKsConnSeNum++ + } + } + assert.Equal(t, sessionCount, hasKsConnSeNum, "begin test") + manager.ReloadNamespacePrepare(NewNamespace()) + manager.ReloadNamespaceCommit(namespaceName) + + time.Sleep(time.Millisecond * 50) + for _, se := range seList { + if len(se.ksConns) == 0 { + hasKsConnSeNum-- + } + } + // 连接必须全部回收 + assert.Equal(t, hasKsConnSeNum, 0, "hasKsConnSeNum") + closedNum := 0 + for _, se := range seList { + if se.session.IsClosed() { + closedNum += 1 + } + } + // 非事务连接不关闭 + assert.Equal(t, closedNum, 0, "closedNum") + for _, se := range seList { + se.session.Close() + } + g.Wait() + }) +} + +// 检测 namespace changed 且 有事务时, session 关闭,且 ks conn 被清除 +func TestSessionRunInTxNamespaceChangedWithMock(t *testing.T) { + globalSe, _ := newDefaultSessionExecutor(nil) + namespaceName := globalSe.namespace + manager := globalSe.manager + var NewNamespace = func() *models.Namespace { + return &models.Namespace{ + Name: namespaceName, + Slices: []*models.Slice{ + {Name: "slice-0", Master: "127.0.0.1:3306"}, + }, + DefaultSlice: "slice-0", + } + } + + mockey.PatchConvey("test", t, func() { + mockey.Mock((*mysql.Conn).SetSequence).Return().Build() + mockey.Mock((*mysql.Conn).Close).Return().Build() + mockey.Mock((*mysql.Conn).ReadEphemeralPacket).To(func() ([]byte, error) { + time.Sleep(time.Millisecond * 10) + return []byte{0, 0, 0, 0}, nil + }).Build() + mockey.Mock((*mysql.Conn).RecycleReadPacket).Return().Build() + mockey.Mock((*mysql.Conn).GetConnectionID).Return(0).Build() + mockey.Mock((*SessionExecutor).ExecuteCommand).Return(Response{}).Build() + mockey.Mock((*Session).writeResponse).Return(nil).Build() + mockey.Mock((*Manager).GetStatisticManager).Return(&StatisticManager{}).Build() + mockey.Mock((*StatisticManager).IncrSessionCount).Return().Build() + mockey.Mock((*StatisticManager).IncrConnectionCount).Return().Build() + mockey.Mock((*StatisticManager).DescSessionCount).Return().Build() + mockey.Mock((*StatisticManager).DescConnectionCount).Return().Build() + mockey.Mock((*StatisticManager).AddReadFlowCount).Return().Build() + mockey.Mock((*StatisticManager).initBackend).Return(nil).Build() + mockey.Mock((*StatisticManager).Init).Return(nil).Build() + mockey.Mock((*backend.Slice).CheckStatus).Return().Build() + mockey.Mock((*util.TimeWheel).Remove).Return(nil).Build() + mockey.Mock((*backend.MockPooledConnect).Recycle).Return().Build() + mockey.Mock((*backend.MockPooledConnect).Rollback).Return(nil).Build() + mockey.Mock((*backend.MockPooledConnect).Close).Return().Build() + mockey.Mock(util.GetHostDatacenter).Return("", nil).Build() + + sessionCount := 100 + var g sync.WaitGroup + seList := make([]*SessionExecutor, sessionCount) + for i := 0; i < sessionCount; i++ { + se, _ := newDefaultSessionExecutor(nil) + se.manager = manager + se.session.manager = manager + se.session.namespace = namespaceName + seList[i] = se + } + for _, se := range seList { + go func(se *SessionExecutor) { + g.Add(1) + defer g.Done() + se.ksConns = make(map[string]backend.PooledConnect) + se.status = se.status | mysql.ServerStatusInTrans + v := &backend.MockPooledConnect{} + se.ksConns["slice-0"] = v + se.session.executor = se + se.session.executor.keepSession = true + closeStatus := atomic.Value{} + closeStatus.Store(false) + se.session.closed = closeStatus + se.session.c = &ClientConn{} + se.SetContextNamespace() + se.session.Run() + }(se) + } + time.Sleep(time.Millisecond * 50) + hasKsConnSeNum := 0 + for _, se := range seList { + // 初始连接需要在事务中 + assert.Equal(t, se.isInTransaction(), true) + if len(se.ksConns) > 0 { + hasKsConnSeNum++ + } + } + assert.Equal(t, sessionCount, hasKsConnSeNum) + manager.ReloadNamespacePrepare(NewNamespace()) + manager.ReloadNamespaceCommit(namespaceName) + time.Sleep(time.Millisecond * 50) + for _, se := range seList { + if len(se.ksConns) == 0 { + hasKsConnSeNum-- + } + } + // 连接必须全部回收 + assert.Equal(t, hasKsConnSeNum, 0) + closedNum := 0 + for _, se := range seList { + if se.session.IsClosed() { + closedNum += 1 + } + } + // 连接必须全部关闭 + assert.Equal(t, sessionCount, closedNum) + for _, se := range seList { + se.session.Close() + } + g.Wait() + }) +} + +func TestNamespaceChangeTimesMock(t *testing.T) { + se, _ := newDefaultSessionExecutor(nil) + namespaceName := se.namespace + + var NewNamespace = func() *models.Namespace { + return &models.Namespace{ + Name: namespaceName, + Slices: []*models.Slice{ + {Name: "slice-0", Master: "127.0.0.1:3306"}, + }, + DefaultSlice: "slice-0", + } + } + + for i := 0; i <= 3; i += 1 { + oldNmaspace := se.GetManagerNamespace() + se.manager.ReloadNamespacePrepare(NewNamespace()) + se.manager.ReloadNamespaceCommit(namespaceName) + fmt.Println("change index old : ", oldNmaspace.namespaceChangeIndex) + fmt.Println("change index new: ", se.GetManagerNamespace().namespaceChangeIndex) + assert.Equal(t, se.GetManagerNamespace().namespaceChangeIndex > oldNmaspace.namespaceChangeIndex, true) + } +} diff --git a/proxy/server/var.go b/proxy/server/var.go index 2f6a09db..2e507093 100644 --- a/proxy/server/var.go +++ b/proxy/server/var.go @@ -1,3 +1,17 @@ +// Copyright 2019 The Gaea Authors. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + package server import "sync/atomic" diff --git a/stats/prometheus/collectors.go b/stats/prometheus/collectors.go index e287f27b..2e924478 100644 --- a/stats/prometheus/collectors.go +++ b/stats/prometheus/collectors.go @@ -1,10 +1,24 @@ +// Copyright 2019 The Gaea Authors. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + package prometheus import ( "strings" - "github.com/prometheus/client_golang/prometheus" "github.com/XiaoMi/Gaea/stats" + "github.com/prometheus/client_golang/prometheus" ) type metricFuncCollector struct { diff --git a/stats/prometheus/prometheus_backend.go b/stats/prometheus/prometheus_backend.go index 0e7c7887..054b2107 100644 --- a/stats/prometheus/prometheus_backend.go +++ b/stats/prometheus/prometheus_backend.go @@ -1,3 +1,17 @@ +// Copyright 2019 The Gaea Authors. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + package prometheus import ( @@ -5,10 +19,10 @@ import ( "net/http" "strings" - "github.com/prometheus/client_golang/prometheus" - "github.com/prometheus/client_golang/prometheus/promhttp" "github.com/XiaoMi/Gaea/log" "github.com/XiaoMi/Gaea/stats" + "github.com/prometheus/client_golang/prometheus" + "github.com/prometheus/client_golang/prometheus/promhttp" ) // PromBackend implements PullBackend using Prometheus as the backing metrics storage. diff --git a/stats/prometheus/prometheus_backend_test.go b/stats/prometheus/prometheus_backend_test.go index c0609ce5..8d4a1f80 100644 --- a/stats/prometheus/prometheus_backend_test.go +++ b/stats/prometheus/prometheus_backend_test.go @@ -1,3 +1,17 @@ +// Copyright 2019 The Gaea Authors. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + package prometheus import ( diff --git a/stats/rates.go b/stats/rates.go index eca001f1..3f3f9285 100644 --- a/stats/rates.go +++ b/stats/rates.go @@ -167,7 +167,7 @@ func (rt *Rates) Get() (rateMap map[string][]float64) { return } -// GetCount get direct count without devided by duration +// GetCount get direct count without divided by duration func (rt *Rates) GetCount() (rateMap map[string][]int64) { rt.mu.Lock() defer rt.mu.Unlock() diff --git a/tests/docker/mysql5/Dockerfile b/tests/docker/mysql5/Dockerfile new file mode 100644 index 00000000..26ec2963 --- /dev/null +++ b/tests/docker/mysql5/Dockerfile @@ -0,0 +1,6 @@ +FROM centos:centos7 + +# Install dependencies +COPY install_dependencies.sh /dist/install_dependencies.sh +RUN /dist/install_dependencies.sh +ENV PATH /usr/local/go/bin:/root/go/bin/:$PATH diff --git a/tests/docker/mysql5/install_dependencies.sh b/tests/docker/mysql5/install_dependencies.sh new file mode 100755 index 00000000..286c2892 --- /dev/null +++ b/tests/docker/mysql5/install_dependencies.sh @@ -0,0 +1,84 @@ +#!/bin/bash + +set -euo pipefail + +# 更新源 +sed -i 's/mirrorlist/#mirrorlist/g' /etc/yum.repos.d/CentOS-* +sed -i 's|#baseurl=http://mirror.centos.org|baseurl=http://vault.centos.org|g' /etc/yum.repos.d/CentOS-* + +# install mysql +yum install -y wget perl net-tools etcd curl libaio libaio-devel numactl make git gcc +yum install -y glibc +yum update -y +# modify timezone +ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime + +cd /dist +wget https://downloads.percona.com/downloads/Percona-Server-5.7/Percona-Server-5.7.25-28/binary/redhat/7/x86_64/Percona-Server-server-57-5.7.25-28.1.el7.x86_64.rpm +wget https://downloads.percona.com/downloads/Percona-Server-5.7/Percona-Server-5.7.25-28/binary/redhat/7/x86_64/Percona-Server-shared-compat-57-5.7.25-28.1.el7.x86_64.rpm +wget https://downloads.percona.com/downloads/Percona-Server-5.7/Percona-Server-5.7.25-28/binary/redhat/7/x86_64/Percona-Server-shared-57-5.7.25-28.1.el7.x86_64.rpm +wget https://downloads.percona.com/downloads/Percona-Server-5.7/Percona-Server-5.7.25-28/binary/redhat/7/x86_64/Percona-Server-client-57-5.7.25-28.1.el7.x86_64.rpm + +rpm -ivh Percona-Server-server-57-5.7.25-28.1.el7.x86_64.rpm \ + Percona-Server-shared-compat-57-5.7.25-28.1.el7.x86_64.rpm \ + Percona-Server-shared-57-5.7.25-28.1.el7.x86_64.rpm \ + Percona-Server-client-57-5.7.25-28.1.el7.x86_64.rpm + +rm -rf Percona-Server-server-57-5.7.25-28.1.el7.x86_64.rpm \ + Percona-Server-shared-compat-57-5.7.25-28.1.el7.x86_64.rpm \ + Percona-Server-shared-57-5.7.25-28.1.el7.x86_64.rpm \ + Percona-Server-client-57-5.7.25-28.1.el7.x86_64.rpm + +groupadd -r --gid 2000 work +useradd -r -g work --uid 1000 work +mkdir -p /data/mysql /data/tmp /data/etc +chown -R work:work /data + +# install golang +wget https://go.dev/dl/go1.16.15.linux-amd64.tar.gz +rm -rf /usr/local/go && tar -C /usr/local -xzf go1.16.15.linux-amd64.tar.gz + +# 提前安装一些依赖库,跑 CI 的时间就可以不用拉了,减少测试用例时间 +/usr/local/go/bin/go install github.com/onsi/ginkgo/v2/ginkgo@v2.3.1 +/usr/local/go/bin/go mod download github.com/shirou/gopsutil@v2.20.9+incompatible +/usr/local/go/bin/go mod download go.uber.org/atomic@v1.4.0 +/usr/local/go/bin/go mod download github.com/golang/mock@v1.4.4 +/usr/local/go/bin/go mod download github.com/gin-contrib/gzip@v0.0.1 +/usr/local/go/bin/go mod download github.com/gin-gonic/gin@v1.7.2 +/usr/local/go/bin/go mod download github.com/pingcap/errors@v0.11.1 +/usr/local/go/bin/go mod download github.com/shopspring/decimal@v1.3.1 +/usr/local/go/bin/go mod download github.com/hashicorp/go-version@v1.6.0 +/usr/local/go/bin/go mod download github.com/go-ini/ini@v1.42.0 +/usr/local/go/bin/go mod download github.com/pingcap/tipb@v0.0.0-20190226124958-833c2ffd2fe7 +/usr/local/go/bin/go mod download github.com/coreos/etcd@v3.3.13+incompatible +/usr/local/go/bin/go mod download github.com/emirpasic/gods@v1.12.0 +/usr/local/go/bin/go mod download github.com/prometheus/client_golang@v0.9.2 +/usr/local/go/bin/go mod download github.com/cznic/mathutil@v0.0.0-20181122101859-297441e03548 +/usr/local/go/bin/go mod download github.com/prometheus/common@v0.0.0-20181126121408-4724e9255275 +/usr/local/go/bin/go mod download github.com/prometheus/client_model@v0.0.0-20180712105110-5c3871d89910 +/usr/local/go/bin/go mod download github.com/beorn7/perks@v0.0.0-20180321164747-3a771d992973 +/usr/local/go/bin/go mod download github.com/golang/protobuf@v1.5.2 +/usr/local/go/bin/go mod download github.com/prometheus/procfs@v0.0.0-20181204211112-1dc9a6cbc91a +/usr/local/go/bin/go mod download github.com/remyoudompheng/bigfft@v0.0.0-20190321074620-2f0d2b0e0001 +/usr/local/go/bin/go mod download github.com/mattn/go-isatty@v0.0.13 +/usr/local/go/bin/go mod download github.com/gin-contrib/sse@v0.1.0 +/usr/local/go/bin/go mod download gopkg.in/yaml.v2@v2.4.0 +/usr/local/go/bin/go mod download github.com/ugorji/go@v1.1.7 +/usr/local/go/bin/go mod download github.com/go-playground/validator/v10@v10.8.0 +/usr/local/go/bin/go mod download golang.org/x/sys@v0.0.0-20220722155257-8c9f86f7a55f +/usr/local/go/bin/go mod download github.com/ugorji/go/codec@v1.1.7 +/usr/local/go/bin/go mod download google.golang.org/protobuf@v1.28.0 +/usr/local/go/bin/go mod download github.com/matttproud/golang_protobuf_extensions@v1.0.1 +/usr/local/go/bin/go mod download golang.org/x/text@v0.3.7 +/usr/local/go/bin/go mod download golang.org/x/crypto@v0.0.0-20210921155107-089bfa567519 +/usr/local/go/bin/go mod download github.com/leodido/go-urn@v1.2.1 +/usr/local/go/bin/go mod download github.com/go-playground/universal-translator@v0.17.0 +/usr/local/go/bin/go mod download github.com/go-playground/locales@v0.13.0 +/usr/local/go/bin/go mod download github.com/modern-go/reflect2@v1.0.1 +/usr/local/go/bin/go mod download github.com/json-iterator/go@v1.1.11 +/usr/local/go/bin/go mod download github.com/coreos/go-semver@v0.2.0 +/usr/local/go/bin/go mod download google.golang.org/grpc@v1.21.0 +/usr/local/go/bin/go mod download github.com/gogo/protobuf@v1.2.1 +/usr/local/go/bin/go mod download golang.org/x/net@v0.0.0-20220722155237-a158d28d115b +/usr/local/go/bin/go mod download github.com/modern-go/concurrent@v0.0.0-20180306012644-bacd9c7ef1dd +/usr/local/go/bin/go mod download google.golang.org/genproto@v0.0.0-20180817151627-c66870c02cf8 diff --git a/tests/docker/mysql5/my3319.cnf b/tests/docker/mysql5/my3319.cnf new file mode 100644 index 00000000..276f5233 --- /dev/null +++ b/tests/docker/mysql5/my3319.cnf @@ -0,0 +1,48 @@ +[client] +port = 3319 +socket = /data/tmp/mysql3319.sock + +[mysqld] +default_password_lifetime = 0 +lower_case_table_names = 1 +character-set-server = utf8 +tmpdir = /data/tmp +port = 3319 +socket = /data/tmp/mysql3319.sock +pid_file = /data/mysql/data3319/mysql3319.pid + +#gtid +gtid-mode = ON +enforce-gtid-consistency = ON + +relay_log_info_repository = TABLE +relay_log_purge = 1 +relay_log_recovery = 1 + +datadir = /data/mysql/data3319 +#memlock + +#innodb_file_per_table +#innodb_buffer_pool_size = 100M +#innodb_change_buffering = all +#innodb_data_file_path = ibdata1:12M:autoextend +#innodb_temp_data_file_path = ibtmp1:12M:autoextend:max:100G + +innodb_log_group_home_dir = /data/mysql/data3319 + +server-id = 38166114 +sql_mode = "STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION" +log-slave-updates +log-bin = /data/mysql/data3319/mysql-bin +relay-log = /data/mysql/data3319/mysql-relay-bin +binlog_format = row +log_bin_trust_function_creators = 1 +skip_slave_start + +general-log = 1 +general_log_file = /data/mysql/data3319/general.log + +log_warnings +log_error = /data/mysql/data3319/log_error.err +max_connections = 4096 +max_user_connections = 4096 diff --git a/tests/docker/mysql5/my3329.cnf b/tests/docker/mysql5/my3329.cnf new file mode 100644 index 00000000..b8faa958 --- /dev/null +++ b/tests/docker/mysql5/my3329.cnf @@ -0,0 +1,48 @@ +[client] +port = 3329 +socket = /data/tmp/mysql3329.sock + +[mysqld] +default_password_lifetime = 0 +lower_case_table_names = 1 +character-set-server = utf8 +tmpdir = /data/tmp +port = 3329 +socket = /data/tmp/mysql3329.sock +pid_file = /data/mysql/data3329/mysql3329.pid + +#gtid +gtid-mode = ON +enforce-gtid-consistency = ON + +relay_log_info_repository = TABLE +relay_log_purge = 1 +relay_log_recovery = 1 + +datadir = /data/mysql/data3329 +#memlock + +#innodb_file_per_table +#innodb_buffer_pool_size = 100M +#innodb_change_buffering = all +#innodb_data_file_path = ibdata1:12M:autoextend +#innodb_temp_data_file_path = ibtmp1:12M:autoextend:max:100G + +innodb_log_group_home_dir = /data/mysql/data3329 + +server-id = 38166124 +sql_mode = "STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION" +log-slave-updates +log-bin = /data/mysql/data3329/mysql-bin +relay-log = /data/mysql/data3329/mysql-relay-bin +binlog_format = row +log_bin_trust_function_creators = 1 +skip_slave_start + +general-log = 1 +general_log_file = /data/mysql/data3329/general.log + +log_warnings +log_error = /data/mysql/data3329/log_error.err +max_connections = 4096 +max_user_connections = 4096 diff --git a/tests/docker/mysql5/my3339.cnf b/tests/docker/mysql5/my3339.cnf new file mode 100644 index 00000000..d746b646 --- /dev/null +++ b/tests/docker/mysql5/my3339.cnf @@ -0,0 +1,48 @@ +[client] +port = 3339 +socket = /data/tmp/mysql3339.sock + +[mysqld] +default_password_lifetime = 0 +lower_case_table_names = 1 +character-set-server = utf8 +tmpdir = /data/tmp +port = 3339 +socket = /data/tmp/mysql3339.sock +pid_file = /data/mysql/data3339/mysql3339.pid + +#gtid +gtid-mode = ON +enforce-gtid-consistency = ON + +relay_log_info_repository = TABLE +relay_log_purge = 1 +relay_log_recovery = 1 + +datadir = /data/mysql/data3339 +#memlock + +#innodb_file_per_table +#innodb_buffer_pool_size = 100M +#innodb_change_buffering = all +#innodb_data_file_path = ibdata1:12M:autoextend +#innodb_temp_data_file_path = ibtmp1:12M:autoextend:max:100G + +innodb_log_group_home_dir = /data/mysql/data3339 + +server-id = 38166134 +sql_mode = "STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION" +log-slave-updates +log-bin = /data/mysql/data3339/mysql-bin +relay-log = /data/mysql/data3339/mysql-relay-bin +binlog_format = row +log_bin_trust_function_creators = 1 +skip_slave_start + +general-log = 1 +general_log_file = /data/mysql/data3339/general.log + +log_warnings +log_error = /data/mysql/data3339/log_error.err +max_connections = 4096 +max_user_connections = 4096 diff --git a/tests/docker/mysql5/my3349.cnf b/tests/docker/mysql5/my3349.cnf new file mode 100644 index 00000000..62d1e2aa --- /dev/null +++ b/tests/docker/mysql5/my3349.cnf @@ -0,0 +1,48 @@ +[client] +port = 3349 +socket = /data/tmp/mysql3349.sock + +[mysqld] +default_password_lifetime = 0 +lower_case_table_names = 1 +character-set-server = utf8 +tmpdir = /data/tmp +port = 3349 +socket = /data/tmp/mysql3349.sock +pid_file = /data/mysql/data3349/mysql3349.pid + +#gtid +gtid-mode = ON +enforce-gtid-consistency = ON + +relay_log_info_repository = TABLE +relay_log_purge = 1 +relay_log_recovery = 1 + +datadir = /data/mysql/data3349 +#memlock + +#innodb_file_per_table +#innodb_buffer_pool_size = 100M +#innodb_change_buffering = all +#innodb_data_file_path = ibdata1:12M:autoextend +#innodb_temp_data_file_path = ibtmp1:12M:autoextend:max:100G + +innodb_log_group_home_dir = /data/mysql/data3349 + +server-id = 38166144 +sql_mode = "STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION" +log-slave-updates +log-bin = /data/mysql/data3349/mysql-bin +relay-log = /data/mysql/data3349/mysql-relay-bin +binlog_format = row +log_bin_trust_function_creators = 1 +skip_slave_start + +general-log = 1 +general_log_file = /data/mysql/data3349/general.log + +log_warnings +log_error = /data/mysql/data3349/log_error.err +max_connections = 4096 +max_user_connections = 4096 diff --git a/tests/docker/mysql5/my3379.cnf b/tests/docker/mysql5/my3379.cnf new file mode 100644 index 00000000..c966ac57 --- /dev/null +++ b/tests/docker/mysql5/my3379.cnf @@ -0,0 +1,48 @@ +[client] +port = 3379 +socket = /data/tmp/mysql3379.sock + +[mysqld] +default_password_lifetime = 0 +lower_case_table_names = 1 +character-set-server = utf8 +tmpdir = /data/tmp +port = 3379 +socket = /data/tmp/mysql3379.sock +pid_file = /data/mysql/data3379/mysql3379.pid + +#gtid +gtid-mode = ON +enforce-gtid-consistency = ON + +relay_log_info_repository = TABLE +relay_log_purge = 1 +relay_log_recovery = 1 + +datadir = /data/mysql/data3379 +#memlock + +#innodb_file_per_table +#innodb_buffer_pool_size = 100M +#innodb_change_buffering = all +#innodb_data_file_path = ibdata1:12M:autoextend +#innodb_temp_data_file_path = ibtmp1:12M:autoextend:max:100G + +innodb_log_group_home_dir = /data/mysql/data3379 + +server-id = 38166104 +sql_mode = "STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION" +log-slave-updates +log-bin = /data/mysql/data3379/mysql-bin +relay-log = /data/mysql/data3379/mysql-relay-bin +binlog_format = row +log_bin_trust_function_creators = 1 +skip_slave_start + +general-log = 1 +general_log_file = /data/mysql/data3379/general.log + +log_warnings +log_error = /data/mysql/data3379/log_error.err +max_connections = 4096 +max_user_connections = 4096 diff --git a/tests/docker/mysql8/Dockerfile b/tests/docker/mysql8/Dockerfile new file mode 100644 index 00000000..0047be38 --- /dev/null +++ b/tests/docker/mysql8/Dockerfile @@ -0,0 +1,6 @@ +FROM centos:centos7 + +# Install dependencies +COPY install_dependencies_mysql8.sh /dist/install_dependencies_mysql8.sh +RUN /dist/install_dependencies_mysql8.sh +ENV PATH /usr/local/go/bin:/root/go/bin/:$PATH diff --git a/tests/docker/mysql8/install_dependencies_mysql8.sh b/tests/docker/mysql8/install_dependencies_mysql8.sh new file mode 100755 index 00000000..11976d54 --- /dev/null +++ b/tests/docker/mysql8/install_dependencies_mysql8.sh @@ -0,0 +1,89 @@ +#!/bin/bash + +set -euo pipefail + +# 更新源 +sed -i 's/mirrorlist/#mirrorlist/g' /etc/yum.repos.d/CentOS-* +sed -i 's|#baseurl=http://mirror.centos.org|baseurl=http://vault.centos.org|g' /etc/yum.repos.d/CentOS-* + +# install mysql +yum install -y wget perl net-tools etcd curl libaio libaio-devel numactl make git gcc openssl percona-icu-data-files +yum install -y glibc +yum update -y +# modify timezone +ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime + +mkdir -p /dist +cd /dist + +wget https://downloads.percona.com/downloads/Percona-Server-8.0/Percona-Server-8.0.30-22/binary/redhat/7/x86_64/percona-server-server-8.0.30-22.1.el7.x86_64.rpm +wget https://downloads.percona.com/downloads/Percona-Server-8.0/Percona-Server-8.0.30-22/binary/redhat/7/x86_64/percona-server-shared-compat-8.0.30-22.1.el7.x86_64.rpm +wget https://downloads.percona.com/downloads/Percona-Server-8.0/Percona-Server-8.0.30-22/binary/redhat/7/x86_64/percona-server-shared-8.0.30-22.1.el7.x86_64.rpm +wget https://downloads.percona.com/downloads/Percona-Server-8.0/Percona-Server-8.0.30-22/binary/redhat/7/x86_64/percona-server-client-8.0.30-22.1.el7.x86_64.rpm +wget https://downloads.percona.com/downloads/Percona-Server-8.0/Percona-Server-8.0.30-22/binary/redhat/7/x86_64/percona-icu-data-files-8.0.30-22.1.el7.x86_64.rpm + +rpm -ivh percona-server-server-8.0.30-22.1.el7.x86_64.rpm \ + percona-server-shared-compat-8.0.30-22.1.el7.x86_64.rpm \ + percona-server-shared-8.0.30-22.1.el7.x86_64.rpm \ + percona-server-client-8.0.30-22.1.el7.x86_64.rpm \ + percona-icu-data-files-8.0.30-22.1.el7.x86_64.rpm + +rm -rf percona-server-server-8.0.30-22.1.el7.x86_64.rpm \ + percona-server-shared-compat-8.0.30-22.1.el7.x86_64.rpm \ + percona-server-shared-8.0.30-22.1.el7.x86_64.rpm \ + percona-server-client-8.0.30-22.1.el7.x86_64.rpm \ + percona-icu-data-files-8.0.30-22.1.el7.x86_64.rpm + +groupadd -r --gid 2000 work +useradd -r -g work --uid 1000 work +mkdir -p /data/mysql /data/tmp /data/etc +chown -R work:work /data + +# install golang +wget https://go.dev/dl/go1.16.15.linux-amd64.tar.gz +rm -rf /usr/local/go && tar -C /usr/local -xzf go1.16.15.linux-amd64.tar.gz + +# 提前安装一些依赖库,跑 CI 的时间就可以不用拉了,减少测试用例时间 +/usr/local/go/bin/go install github.com/onsi/ginkgo/v2/ginkgo@v2.3.1 +/usr/local/go/bin/go mod download github.com/shirou/gopsutil@v2.20.9+incompatible +/usr/local/go/bin/go mod download go.uber.org/atomic@v1.4.0 +/usr/local/go/bin/go mod download github.com/golang/mock@v1.4.4 +/usr/local/go/bin/go mod download github.com/gin-contrib/gzip@v0.0.1 +/usr/local/go/bin/go mod download github.com/gin-gonic/gin@v1.7.2 +/usr/local/go/bin/go mod download github.com/pingcap/errors@v0.11.1 +/usr/local/go/bin/go mod download github.com/shopspring/decimal@v1.3.1 +/usr/local/go/bin/go mod download github.com/hashicorp/go-version@v1.6.0 +/usr/local/go/bin/go mod download github.com/go-ini/ini@v1.42.0 +/usr/local/go/bin/go mod download github.com/pingcap/tipb@v0.0.0-20190226124958-833c2ffd2fe7 +/usr/local/go/bin/go mod download github.com/coreos/etcd@v3.3.13+incompatible +/usr/local/go/bin/go mod download github.com/emirpasic/gods@v1.12.0 +/usr/local/go/bin/go mod download github.com/prometheus/client_golang@v0.9.2 +/usr/local/go/bin/go mod download github.com/cznic/mathutil@v0.0.0-20181122101859-297441e03548 +/usr/local/go/bin/go mod download github.com/prometheus/common@v0.0.0-20181126121408-4724e9255275 +/usr/local/go/bin/go mod download github.com/prometheus/client_model@v0.0.0-20180712105110-5c3871d89910 +/usr/local/go/bin/go mod download github.com/beorn7/perks@v0.0.0-20180321164747-3a771d992973 +/usr/local/go/bin/go mod download github.com/golang/protobuf@v1.5.2 +/usr/local/go/bin/go mod download github.com/prometheus/procfs@v0.0.0-20181204211112-1dc9a6cbc91a +/usr/local/go/bin/go mod download github.com/remyoudompheng/bigfft@v0.0.0-20190321074620-2f0d2b0e0001 +/usr/local/go/bin/go mod download github.com/mattn/go-isatty@v0.0.13 +/usr/local/go/bin/go mod download github.com/gin-contrib/sse@v0.1.0 +/usr/local/go/bin/go mod download gopkg.in/yaml.v2@v2.4.0 +/usr/local/go/bin/go mod download github.com/ugorji/go@v1.1.7 +/usr/local/go/bin/go mod download github.com/go-playground/validator/v10@v10.8.0 +/usr/local/go/bin/go mod download golang.org/x/sys@v0.0.0-20220722155257-8c9f86f7a55f +/usr/local/go/bin/go mod download github.com/ugorji/go/codec@v1.1.7 +/usr/local/go/bin/go mod download google.golang.org/protobuf@v1.28.0 +/usr/local/go/bin/go mod download github.com/matttproud/golang_protobuf_extensions@v1.0.1 +/usr/local/go/bin/go mod download golang.org/x/text@v0.3.7 +/usr/local/go/bin/go mod download golang.org/x/crypto@v0.0.0-20210921155107-089bfa567519 +/usr/local/go/bin/go mod download github.com/leodido/go-urn@v1.2.1 +/usr/local/go/bin/go mod download github.com/go-playground/universal-translator@v0.17.0 +/usr/local/go/bin/go mod download github.com/go-playground/locales@v0.13.0 +/usr/local/go/bin/go mod download github.com/modern-go/reflect2@v1.0.1 +/usr/local/go/bin/go mod download github.com/json-iterator/go@v1.1.11 +/usr/local/go/bin/go mod download github.com/coreos/go-semver@v0.2.0 +/usr/local/go/bin/go mod download google.golang.org/grpc@v1.21.0 +/usr/local/go/bin/go mod download github.com/gogo/protobuf@v1.2.1 +/usr/local/go/bin/go mod download golang.org/x/net@v0.0.0-20220722155237-a158d28d115b +/usr/local/go/bin/go mod download github.com/modern-go/concurrent@v0.0.0-20180306012644-bacd9c7ef1dd +/usr/local/go/bin/go mod download google.golang.org/genproto@v0.0.0-20180817151627-c66870c02cf8 diff --git a/tests/docker/mysql8/my3319.cnf b/tests/docker/mysql8/my3319.cnf new file mode 100644 index 00000000..db44a0d8 --- /dev/null +++ b/tests/docker/mysql8/my3319.cnf @@ -0,0 +1,47 @@ +[client] +port = 3319 +socket = /data/tmp/mysql3319.sock + +[mysqld] +default_password_lifetime = 0 +lower_case_table_names = 1 +character-set-server = utf8 +tmpdir = /data/tmp +port = 3319 +socket = /data/tmp/mysql3319.sock +pid_file = /data/mysql/data3319/mysql3319.pid + +#gtid +gtid-mode = ON +enforce-gtid-consistency = ON + +relay_log_info_repository = TABLE +relay_log_purge = 1 +relay_log_recovery = 1 + +datadir = /data/mysql/data3319 +#memlock + +#innodb_file_per_table +#innodb_buffer_pool_size = 100M +#innodb_change_buffering = all +#innodb_data_file_path = ibdata1:12M:autoextend +#innodb_temp_data_file_path = ibtmp1:12M:autoextend:max:100G + +innodb_log_group_home_dir = /data/mysql/data3319 + +server-id = 38166114 +sql_mode = "" +log-slave-updates +log-bin = /data/mysql/data3319/mysql-bin +relay-log = /data/mysql/data3319/mysql-relay-bin +binlog_format = row +log_bin_trust_function_creators = 1 +skip_slave_start + +general-log = 0 +general_log_file = /data/mysql/data3319/general.log + +log_error = /data/mysql/data3319/log_error.err +max_connections = 4096 +max_user_connections = 4096 diff --git a/tests/docker/mysql8/my3329.cnf b/tests/docker/mysql8/my3329.cnf new file mode 100644 index 00000000..b0d9b05a --- /dev/null +++ b/tests/docker/mysql8/my3329.cnf @@ -0,0 +1,47 @@ +[client] +port = 3329 +socket = /data/tmp/mysql3329.sock + +[mysqld] +default_password_lifetime = 0 +lower_case_table_names = 1 +character-set-server = utf8 +tmpdir = /data/tmp +port = 3329 +socket = /data/tmp/mysql3329.sock +pid_file = /data/mysql/data3329/mysql3329.pid + +#gtid +gtid-mode = ON +enforce-gtid-consistency = ON + +relay_log_info_repository = TABLE +relay_log_purge = 1 +relay_log_recovery = 1 + +datadir = /data/mysql/data3329 +#memlock + +#innodb_file_per_table +#innodb_buffer_pool_size = 100M +#innodb_change_buffering = all +#innodb_data_file_path = ibdata1:12M:autoextend +#innodb_temp_data_file_path = ibtmp1:12M:autoextend:max:100G + +innodb_log_group_home_dir = /data/mysql/data3329 + +server-id = 38166124 +sql_mode = "" +log-slave-updates +log-bin = /data/mysql/data3329/mysql-bin +relay-log = /data/mysql/data3329/mysql-relay-bin +binlog_format = row +log_bin_trust_function_creators = 1 +skip_slave_start + +general-log = 0 +general_log_file = /data/mysql/data3329/general.log + +log_error = /data/mysql/data3329/log_error.err +max_connections = 4096 +max_user_connections = 4096 diff --git a/tests/docker/mysql8/my3339.cnf b/tests/docker/mysql8/my3339.cnf new file mode 100644 index 00000000..bcd42657 --- /dev/null +++ b/tests/docker/mysql8/my3339.cnf @@ -0,0 +1,47 @@ +[client] +port = 3339 +socket = /data/tmp/mysql3339.sock + +[mysqld] +default_password_lifetime = 0 +lower_case_table_names = 1 +character-set-server = utf8 +tmpdir = /data/tmp +port = 3339 +socket = /data/tmp/mysql3339.sock +pid_file = /data/mysql/data3339/mysql3339.pid + +#gtid +gtid-mode = ON +enforce-gtid-consistency = ON + +relay_log_info_repository = TABLE +relay_log_purge = 1 +relay_log_recovery = 1 + +datadir = /data/mysql/data3339 +#memlock + +#innodb_file_per_table +#innodb_buffer_pool_size = 100M +#innodb_change_buffering = all +#innodb_data_file_path = ibdata1:12M:autoextend +#innodb_temp_data_file_path = ibtmp1:12M:autoextend:max:100G + +innodb_log_group_home_dir = /data/mysql/data3339 + +server-id = 38166134 +sql_mode = "" +log-slave-updates +log-bin = /data/mysql/data3339/mysql-bin +relay-log = /data/mysql/data3339/mysql-relay-bin +binlog_format = row +log_bin_trust_function_creators = 1 +skip_slave_start + +general-log = 0 +general_log_file = /data/mysql/data3339/general.log + +log_error = /data/mysql/data3339/log_error.err +max_connections = 4096 +max_user_connections = 4096 diff --git a/tests/docker/mysql8/my3349.cnf b/tests/docker/mysql8/my3349.cnf new file mode 100644 index 00000000..758b5fb7 --- /dev/null +++ b/tests/docker/mysql8/my3349.cnf @@ -0,0 +1,47 @@ +[client] +port = 3349 +socket = /data/tmp/mysql3349.sock + +[mysqld] +default_password_lifetime = 0 +lower_case_table_names = 1 +character-set-server = utf8 +tmpdir = /data/tmp +port = 3349 +socket = /data/tmp/mysql3349.sock +pid_file = /data/mysql/data3349/mysql3349.pid + +#gtid +gtid-mode = ON +enforce-gtid-consistency = ON + +relay_log_info_repository = TABLE +relay_log_purge = 1 +relay_log_recovery = 1 + +datadir = /data/mysql/data3349 +#memlock + +#innodb_file_per_table +#innodb_buffer_pool_size = 100M +#innodb_change_buffering = all +#innodb_data_file_path = ibdata1:12M:autoextend +#innodb_temp_data_file_path = ibtmp1:12M:autoextend:max:100G + +innodb_log_group_home_dir = /data/mysql/data3349 + +server-id = 38166144 +sql_mode = "" +log-slave-updates +log-bin = /data/mysql/data3349/mysql-bin +relay-log = /data/mysql/data3349/mysql-relay-bin +binlog_format = row +log_bin_trust_function_creators = 1 +skip_slave_start + +general-log = 0 +general_log_file = /data/mysql/data3349/general.log + +log_error = /data/mysql/data3349/log_error.err +max_connections = 4096 +max_user_connections = 4096 diff --git a/tests/docker/mysql8/my3379.cnf b/tests/docker/mysql8/my3379.cnf new file mode 100644 index 00000000..269e95a4 --- /dev/null +++ b/tests/docker/mysql8/my3379.cnf @@ -0,0 +1,47 @@ +[client] +port = 3379 +socket = /data/tmp/mysql3379.sock + +[mysqld] +default_password_lifetime = 0 +lower_case_table_names = 1 +character-set-server = utf8 +tmpdir = /data/tmp +port = 3379 +socket = /data/tmp/mysql3379.sock +pid_file = /data/mysql/data3379/mysql3379.pid + +#gtid +gtid-mode = ON +enforce-gtid-consistency = ON + +relay_log_info_repository = TABLE +relay_log_purge = 1 +relay_log_recovery = 1 + +datadir = /data/mysql/data3379 +#memlock + +#innodb_file_per_table +#innodb_buffer_pool_size = 100M +#innodb_change_buffering = all +#innodb_data_file_path = ibdata1:12M:autoextend +#innodb_temp_data_file_path = ibtmp1:12M:autoextend:max:100G + +innodb_log_group_home_dir = /data/mysql/data3379 + +server-id = 38166104 +sql_mode = "" +log-slave-updates +log-bin = /data/mysql/data3379/mysql-bin +relay-log = /data/mysql/data3379/mysql-relay-bin +binlog_format = row +log_bin_trust_function_creators = 1 +skip_slave_start + +general-log = 0 +general_log_file = /data/mysql/data3379/general.log + +log_error = /data/mysql/data3379/log_error.err +max_connections = 4096 +max_user_connections = 4096 diff --git a/tests/e2e/cmd/gaea.ini b/tests/e2e/cmd/gaea.ini new file mode 100644 index 00000000..abb4a5c0 --- /dev/null +++ b/tests/e2e/cmd/gaea.ini @@ -0,0 +1,59 @@ +; config type, etcd/file/etcdv3, you can test gaea with file type, you shoud use etcd/etcdv3 in production +; 请指定设定方式为 file 或 etcd 或 etcdv3 +;config_type=file +config_type=etcdv3 +;file config path, 具体配置放到file_config_path的namespace目录下,该下级目录为固定目录 +;file_config_path=./etc/file +;file_config_path=/etc/ + +;coordinator addr +coordinator_addr=http://127.0.0.1:2379 +;etcd user config +username=root +password=root + +;environ +environ=local +;service name +service_name=gaea_proxy +;gaea_proxy cluster name +cluster_name=gaea_default_cluster + +;log config +log_path=./logs +log_level=Notice +log_filename=gaea +log_output=file +; 日志保留天数 +log_keep_days=1 +; 日志保留数量 +log_keep_counts=3 + +;admin addr +admin_addr=0.0.0.0:13307 +; basic auth +admin_user=test +admin_password=test + +;proxy addr +proto_type=tcp4 +proxy_addr=0.0.0.0:13306 +proxy_charset=utf8 +;slow sql time, when execute time is higher than this, log it, unit: ms +slow_sql_time=100 +;close session after session timeout, unit: seconds +session_timeout=3600 + +;stats conf +stats_enabled=true +;stats interval +stats_interval=10 + +;encrypt key +encrypt_key=1234abcd5678efg* + +;server_version +server_version=5.6.20-gaea + +;auth plugin mysql_native_password or caching_sha2_password or '' +auth_plugin=mysql_native_password diff --git a/tests/e2e/cmd/gaea_cc.ini b/tests/e2e/cmd/gaea_cc.ini new file mode 100644 index 00000000..7be9b09c --- /dev/null +++ b/tests/e2e/cmd/gaea_cc.ini @@ -0,0 +1,27 @@ +addr=0.0.0.0:23306 +; basic auth of gaea-cc +admin_username=admin +admin_password=admin + +; basic auth of gaea-proxy's admin service +proxy_username=test +proxy_password=test + +;Debug, Trace, Notice, Warn, Fatal, 建议测试采用debug级别,上线采用Notice级别 +log_level=Notice +log_path =./logs +log_filename=gaea_cc +log_output=file +log_keep_days=3 + +;coordinator 目前支持 etcd 和 etcdv3,coodinator config +coordinator_type=etcdv3 +coordinator_addr=http://127.0.0.1:2379 +username=root +password=root + +;指定一个的默认gaea集群名称 +default_cluster=gaea_default_cluster + +;encrypt key +encrypt_key=1234abcd5678efg* diff --git a/tests/e2e/config/cluster.go b/tests/e2e/config/cluster.go new file mode 100644 index 00000000..4c4b5100 --- /dev/null +++ b/tests/e2e/config/cluster.go @@ -0,0 +1,220 @@ +// Copyright 2024 The Gaea Authors. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package config + +import ( + "bytes" + "database/sql" + "encoding/json" + "fmt" + "io/ioutil" + "path/filepath" + "runtime" + "text/template" + + "github.com/XiaoMi/Gaea/models" +) + +type NsSlice struct { + Name string + Slices []*models.Slice + GaeaUsers []*models.User +} + +func (ns *NsSlice) GetLocalSliceConn() (res map[string]*LocalSliceConn, err error) { + sliceConns := make(map[string]*LocalSliceConn, len(ns.Slices)) + for _, slice := range ns.Slices { + localConn := &LocalSliceConn{ + MasterConn: nil, + SlaveConns: []*sql.DB{}, + } + // 初始化主服务器连接 + // TODO: fix hard user and password + localConn.MasterConn, err = InitConn(defaultMysqlAdminUser, defaultMysqlAdminPasswd, slice.Master, "") + if err != nil { + return nil, fmt.Errorf("failed to initialize master connection for slice '%s': %v", slice.Name, err) + } + // 初始化从服务器连接 + for _, slave := range slice.Slaves { + slaveDb, err := InitConn(defaultMysqlAdminUser, defaultMysqlAdminPasswd, slave, "") + if err != nil { + return nil, fmt.Errorf("failed to initialize slave connection for slice '%s': %v", slice.Name, err) + } + localConn.SlaveConns = append(localConn.SlaveConns, slaveDb) + } + + sliceConns[slice.Name] = localConn + } + + return sliceConns, nil +} + +// TODO: fix to rename SliceConn +type LocalSliceConn struct { + MasterConn *sql.DB + SlaveConns []*sql.DB +} + +// TODO: fix error +func (ns *NsSlice) GetMasterAdminConn(sliceIndex int) (*sql.DB, error) { + return InitConn(defaultMysqlAdminUser, defaultMysqlAdminPasswd, ns.Slices[sliceIndex].Master, "") +} + +func (ns *NsSlice) GetMasterAdminDBConn(sliceIndex int, db string) (*sql.DB, error) { + return InitConn(defaultMysqlAdminUser, defaultMysqlAdminPasswd, ns.Slices[sliceIndex].Master, db) +} + +func (ns *NsSlice) GetMasterCommonConn(sliceIndex int) (*sql.DB, error) { + return InitConn(defaultGaeaBackendUser, defaultGaeaBackendPass, ns.Slices[sliceIndex].Master, "") +} + +func (ns *NsSlice) GetMasterCommonDBConn(sliceIndex int, db string) (*sql.DB, error) { + return InitConn(defaultGaeaBackendUser, defaultGaeaBackendPass, ns.Slices[sliceIndex].Master, db) +} + +// TODO: fix error +func (ns *NsSlice) GetSlaveAdminConn(sliceIndex int, index int) (*sql.DB, error) { + if sliceIndex > len(ns.Slices) { + return nil, fmt.Errorf("sliceIndex more than") + } + if index > len(ns.Slices[sliceIndex].Slaves) { + return nil, fmt.Errorf("slaveIndex more than") + } + + return InitConn(defaultMysqlAdminUser, defaultMysqlAdminPasswd, ns.Slices[sliceIndex].Slaves[index], "") +} + +func (ns *NsSlice) GetSlaveCommonConn(sliceIndex int, index int) (*sql.DB, error) { + if sliceIndex > len(ns.Slices) { + return nil, fmt.Errorf("sliceIndex more than") + } + if index > len(ns.Slices[sliceIndex].Slaves) { + return nil, fmt.Errorf("slaveIndex more than") + } + return InitConn(defaultGaeaBackendUser, defaultGaeaBackendPass, ns.Slices[sliceIndex].Slaves[index], "") +} + +func ParseNamespaceTmpl(nsTmpl string, ns *NsSlice) (*models.Namespace, error) { + tmpl, err := template.New(nsTmpl).Funcs(template.FuncMap{ + "lastItem": func(index int, all int) bool { + return index == all-1 + }, + }).Parse(nsTmpl) + if err != nil { + return nil, err + } + var buf bytes.Buffer + err = tmpl.Execute(&buf, ns) + if err != nil { + return nil, err + } + + var nameSpace = &models.Namespace{} + err = json.NewDecoder(&buf).Decode(&nameSpace) + if err != nil { + return nil, err + } + return nameSpace, nil +} + +type MySqlCluster struct { + Type string + Master *MysqlInstance + Slaves []*MysqlInstance +} + +type MysqlInstance struct { + UserName string + Password string + Host string + Port int +} + +func (m *MysqlInstance) Addr() string { + return fmt.Sprintf("%s:%d", m.Host, m.Port) +} + +type GaeaCluster struct { + Host string + Port int + ReadWriteUser *models.User + ReadUser *models.User + WriteUser *models.User + LogDirectory string + readWriteConn *sql.DB + readConn *sql.DB + writeConn *sql.DB +} + +var basePath string + +func init() { + _, currentFile, _, _ := runtime.Caller(0) + configDir := filepath.Dir(currentFile) + // 获取上级目录 + basePath = filepath.Dir(configDir) + fmt.Printf("basePath: %s\n", basePath) +} + +func (e *E2eManager) Clean() error { + // 删除所有的namespace + namespaces, err := e.ListNamespace() + if err != nil { + return err + } + for _, name := range namespaces { + if err = e.DeleteNamespace(name); err != nil { + return err + } + } + if e.GCluster != nil { + if e.GCluster.readWriteConn != nil { + _ = e.GCluster.readWriteConn.Close() + } + if e.GCluster.writeConn != nil { + _ = e.GCluster.writeConn.Close() + } + if e.GCluster.readConn != nil { + _ = e.GCluster.readConn.Close() + } + } + for _, conn := range e.openConnections { + if conn != nil { + // Close each database connection + conn.Close() + } + } + // Clear the list to avoid repeated closings + e.openConnections = []*sql.DB{} + return nil +} + +func GetJSONFilesFromDir(dir string) ([]string, error) { + var casesPath []string + + files, err := ioutil.ReadDir(dir) + if err != nil { + return nil, err + } + + for _, f := range files { + if filepath.Ext(f.Name()) == ".json" { + absPath := filepath.Join(dir, f.Name()) + casesPath = append(casesPath, absPath) + } + } + + return casesPath, nil +} diff --git a/tests/e2e/config/manager.go b/tests/e2e/config/manager.go new file mode 100644 index 00000000..6f24a1b1 --- /dev/null +++ b/tests/e2e/config/manager.go @@ -0,0 +1,488 @@ +// Copyright 2024 The Gaea Authors. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package config + +import ( + "database/sql" + _ "embed" + "encoding/json" + "errors" + "fmt" + + "net/http" + "os" + "path/filepath" + "regexp" + "strings" + "time" + + "github.com/XiaoMi/Gaea/cc" + "github.com/XiaoMi/Gaea/models" + "github.com/XiaoMi/Gaea/tests/e2e/util" + "github.com/XiaoMi/Gaea/util/requests" +) + +const ( + // 注意这里的端口要和gaea_cc.ini 中的addr=0.0.0.0:23306 + gaeaCCBaseRouter = "http://localhost:23306/api/cc/namespace/" + gaeaCCAdminUsername = "admin" + gaeaCCAdminPassword = "admin" + defaultMysqlAdminUser = "superroot" + defaultMysqlAdminPasswd = "superroot" + defaultGaeaBackendUser = "gaea_backend_user" + defaultGaeaBackendPass = "gaea_backend_pass" + defaultGaeaUser = "gaea_user" + defaultGaeaPass = "gaea_pass" + defaultHost = "127.0.0.1" + + DefaultE2eDatabase = "db_e2e_test" + DefaultE2eTable = "tbl_e2e_test" + // SliceSingleTestMaster 表示测试(对照)的单主 MySQL 集群 3379 + SliceSingleTestMaster = "slice-single-test-master" + // SliceSingleMaster 表示gaea使用的单主 MySQL 集群 3349 + SliceSingleMaster = "slice-single-master" + // SliceDualMaster 表示测试的多主 MySQL 集群 3319 3349 + SliceDualMaster = "slice-dual-master" + // SliceSingleSlave 表示测试的主从 MySQL 集群 3319 3329 + SliceSingleSlave = "slice-single-slave" + // SliceDualSlave 表示测试的主从 MySQL 集群 3319 3329 3339 + SliceDualSlave = "slice-dual-slave" + // LogExpression 标识 Gaea SQL Log 的格式 + LogExpression = `\[(.*?)\] \[INFO\] \[(\d+)\] OK - (\d+\.\d+)ms - ns=(.*?), (.*?)@(.*?)->(.*?)/(.*?), connect_id=(\d+), mysql_connect_id=(\d+), transaction=(\w+)\|(.*?)$` +) + +var logDirectory = "cmd/logs" +var E2eMgr *E2eManager + +// Embed namespace templates directly into the Go binary. +var ( + //go:embed ns/default.template + DefaultNamespaceTmpl string + + //go:embed ns/unshard.template + UnShardNamespaceTmpl string + + //go:embed ns/mycat_long.template + MycatLongNamespaceTmpl string + + //go:embed ns/mycat_mod.template + MycatModNamespaceTmpl string + + //go:embed ns/mycat_murmur.template + MycatMurmurNamespaceTmpl string + + //go:embed ns/mycat_string.template + MycatStringNamespaceTmpl string + + //go:embed ns/shard.template + ShardNamespaceTmpl string + + //go:embed ns/kingshard_hash.template + KingShardHashNamespaceTmpl string + + //go:embed ns/kingshard_mod.template + KingShardModNamespaceTmpl string + + //go:embed ns/unshard_dml.template + UnShardDMLNamespaceTmpl string +) + +type E2eManager struct { + // 用于管理所有的测试用例 + NsManager *NamespaceRegisterManager + GCluster *GaeaCluster + NsSlices map[string]*NsSlice + BasePath string + StartTime time.Time + Db string + Table string + openConnections []*sql.DB // 存储所有打开的数据库连接 +} + +func NewE2eManager() *E2eManager { + GaeaUsers := []*models.User{ + { + UserName: defaultGaeaUser, + Password: defaultGaeaPass, + RWFlag: 2, + RWSplit: 1, + }, + { + UserName: defaultGaeaUser + "_r", + Password: defaultGaeaPass + "_r", + RWFlag: 1, + RWSplit: 0, + }, + { + UserName: defaultGaeaUser + "_w", + Password: defaultGaeaPass + "_w", + RWFlag: 2, + RWSplit: 0, + }, + } + + // 3379 + sliceSingleTestMaster := &NsSlice{ + Name: SliceSingleTestMaster, + Slices: []*models.Slice{ + { + Name: "slice-0", + UserName: defaultGaeaBackendUser, + Password: defaultGaeaBackendPass, + Master: fmt.Sprintf("%s:%d", defaultHost, 3379), + Slaves: nil, + StatisticSlaves: nil, + Capacity: 12, + HealthCheckSql: "", + MaxCapacity: 24, + IdleTimeout: 60, + }, + }, + GaeaUsers: GaeaUsers, + } + // 3349 + sliceSingleMaster := &NsSlice{ + Name: SliceSingleMaster, + Slices: []*models.Slice{ + { + Name: "slice-0", + UserName: defaultGaeaBackendUser, + Password: defaultGaeaBackendPass, + Master: fmt.Sprintf("%s:%d", defaultHost, 3349), + Slaves: nil, + StatisticSlaves: nil, + Capacity: 12, + HealthCheckSql: "", + MaxCapacity: 24, + IdleTimeout: 60, + Capability: 500357, + }, + }, + GaeaUsers: GaeaUsers, + } + // 3319 3329 3339 + sliceMasterSlaves := &NsSlice{ + Name: SliceDualSlave, + Slices: []*models.Slice{ + { + Name: "slice-0", + UserName: defaultGaeaBackendUser, + Password: defaultGaeaBackendPass, + Master: fmt.Sprintf("%s:%d", defaultHost, 3319), + Slaves: []string{fmt.Sprintf("%s:%d", defaultHost, 3329), fmt.Sprintf("%s:%d", defaultHost, 3339)}, + StatisticSlaves: nil, + Capacity: 12, + HealthCheckSql: "", + MaxCapacity: 24, + IdleTimeout: 60, + }, + }, + GaeaUsers: GaeaUsers, + } + + // 3319 3329 + sliceMasterSingleSlave := &NsSlice{ + Name: SliceSingleSlave, + Slices: []*models.Slice{ + { + Name: "slice-0", + UserName: defaultGaeaBackendUser, + Password: defaultGaeaBackendPass, + Master: fmt.Sprintf("%s:%d", defaultHost, 3319), + Slaves: []string{fmt.Sprintf("%s:%d", defaultHost, 3329)}, + StatisticSlaves: nil, + Capacity: 12, + HealthCheckSql: "", + MaxCapacity: 24, + IdleTimeout: 60, + }, + }, + GaeaUsers: GaeaUsers, + } + // 3319 3349 + sliceMultiMasters := &NsSlice{ + Name: SliceDualMaster, + Slices: []*models.Slice{ + { + Name: "slice-0", + UserName: defaultGaeaBackendUser, + Password: defaultGaeaBackendPass, + Master: fmt.Sprintf("%s:%d", defaultHost, 3319), + Slaves: nil, + StatisticSlaves: nil, + Capacity: 12, + HealthCheckSql: "", + MaxCapacity: 24, + IdleTimeout: 60, + }, + { + Name: "slice-1", + UserName: defaultGaeaBackendUser, + Password: defaultGaeaBackendPass, + Master: fmt.Sprintf("%s:%d", defaultHost, 3349), + Slaves: nil, + StatisticSlaves: nil, + Capacity: 12, + HealthCheckSql: "", + MaxCapacity: 24, + IdleTimeout: 60, + }, + }, + GaeaUsers: GaeaUsers, + } + + nsSlices := map[string]*NsSlice{ + //3349 + sliceSingleMaster.Name: sliceSingleMaster, + //3379 + sliceSingleTestMaster.Name: sliceSingleTestMaster, + //3319 3329 3339 + sliceMasterSlaves.Name: sliceMasterSlaves, + //3329 3339 + sliceMultiMasters.Name: sliceMultiMasters, + //3319 3329 + sliceMasterSingleSlave.Name: sliceMasterSingleSlave, + } + E2eMgr = &E2eManager{ + NsManager: NewNamespaceRegisterManger(), + GCluster: &GaeaCluster{ + Host: defaultHost, + Port: 13306, + ReadWriteUser: GaeaUsers[0], + ReadUser: GaeaUsers[1], + WriteUser: GaeaUsers[2], + LogDirectory: filepath.Join(basePath, logDirectory), + }, + NsSlices: nsSlices, + BasePath: basePath, + StartTime: time.Now(), + Db: DefaultE2eDatabase, + Table: DefaultE2eTable, + } + return E2eMgr +} + +func (e *E2eManager) GetReadWriteGaeaUserConn() (*sql.DB, error) { + conn, err := InitConn(e.GCluster.ReadWriteUser.UserName, e.GCluster.ReadWriteUser.Password, fmt.Sprintf("%s:%d", e.GCluster.Host, e.GCluster.Port), "") + if err != nil { + return nil, err + } + e.openConnections = append(e.openConnections, conn) // 添加到追踪列表 + return conn, nil +} + +func (e *E2eManager) GetReadWriteGaeaUserDBConn(db string) (*sql.DB, error) { + conn, err := InitConn(e.GCluster.ReadWriteUser.UserName, e.GCluster.ReadWriteUser.Password, fmt.Sprintf("%s:%d", e.GCluster.Host, e.GCluster.Port), db) + if err != nil { + return nil, err + } + e.openConnections = append(e.openConnections, conn) // 添加到追踪列表 + return conn, nil +} + +func (e *E2eManager) GetReadGaeaUserConn() (*sql.DB, error) { + conn, err := InitConn(e.GCluster.ReadUser.UserName, e.GCluster.ReadUser.Password, fmt.Sprintf("%s:%d", e.GCluster.Host, e.GCluster.Port), "") + if err != nil { + return nil, err + } + e.openConnections = append(e.openConnections, conn) // 添加到追踪列表 + return conn, err +} + +func (e *E2eManager) GetReadGaeaUserDBConn(db string) (*sql.DB, error) { + conn, err := InitConn(e.GCluster.ReadUser.UserName, e.GCluster.ReadUser.Password, fmt.Sprintf("%s:%d", e.GCluster.Host, e.GCluster.Port), db) + if err != nil { + return nil, err + } + e.openConnections = append(e.openConnections, conn) // 添加到追踪列表 + return conn, err +} + +func (e *E2eManager) GetWriteGaeaUserConn() (*sql.DB, error) { + conn, err := InitConn(e.GCluster.WriteUser.UserName, e.GCluster.WriteUser.Password, fmt.Sprintf("%s:%d", e.GCluster.Host, e.GCluster.Port), "") + if err != nil { + return nil, err + } + e.openConnections = append(e.openConnections, conn) // 添加到追踪列表 + return conn, err +} + +func (e *E2eManager) GetWriteGaeaUserDBConn(db string) (*sql.DB, error) { + conn, err := InitConn(e.GCluster.WriteUser.UserName, e.GCluster.WriteUser.Password, fmt.Sprintf("%s:%d", e.GCluster.Host, e.GCluster.Port), db) + if err != nil { + return nil, err + } + e.openConnections = append(e.openConnections, conn) // 添加到追踪列表 + return conn, err +} + +func (e *E2eManager) ModifyNamespace(m *models.Namespace) error { + if e.NsManager == nil { + return fmt.Errorf("namespace manager has not been initialized") + } + return e.NsManager.modifyNamespace(m) +} + +func (e *E2eManager) DeleteNamespace(name string) error { + return e.NsManager.DeleteNamespace(name) +} + +func (e *E2eManager) ListNamespace() ([]string, error) { + return e.NsManager.ListNamespaces() +} + +type NamespaceRegisterManager struct { + GaeaCCManager *GaeaCCManager +} + +func NewNamespaceRegisterManger() *NamespaceRegisterManager { + return &NamespaceRegisterManager{ + GaeaCCManager: &GaeaCCManager{ + GaeaCCAdminUser: gaeaCCAdminUsername, + GaeaCCAdminPassword: gaeaCCAdminPassword, + GaeaCCBaseRouter: gaeaCCBaseRouter, + }, + } +} + +func (nr *NamespaceRegisterManager) modifyNamespace(m *models.Namespace) error { + // 存在就替换 + err := m.Verify() + if err != nil { + return err + } + err = nr.GaeaCCManager.modifyNamespace(m) + if err != nil { + return fmt.Errorf("modify Namespace error:%v", err) + } + return nil +} + +func (nr *NamespaceRegisterManager) DeleteNamespace(name string) error { + return nr.GaeaCCManager.deleteNamespace(name) +} + +func (nr *NamespaceRegisterManager) ListNamespaces() ([]string, error) { + return nr.GaeaCCManager.listNamespaces() +} + +type GaeaCCManager struct { + GaeaCCAdminUser string + GaeaCCAdminPassword string + GaeaCCBaseRouter string +} + +func (g *GaeaCCManager) modifyNamespace(n *models.Namespace) error { + // Serialize the namespace object into JSON + data, err := json.Marshal(n) + if err != nil { + return err + } + req := requests.NewRequest(g.GaeaCCBaseRouter+"modify", requests.Put, map[string]string{"Content-Type": "application/json"}, nil, data) + req.SetBasicAuth(g.GaeaCCAdminUser, g.GaeaCCAdminPassword) + // Send the request + resp, err := requests.Send(req) + if err != nil { + return err + } + // Check response status code + if resp.StatusCode != http.StatusOK { + return errors.New(string(resp.Body)) + } + return nil +} + +// deleteNamespace delete Namespace by name +func (g *GaeaCCManager) deleteNamespace(key string) error { + // Build the full URL for the DELETE request + url := g.GaeaCCBaseRouter + "delete/" + key + // Send the request + return requests.SendPut(url, g.GaeaCCAdminUser, g.GaeaCCAdminPassword) +} + +// listNamespace queries the GaeaCC for a list of namespaces. +func (g *GaeaCCManager) listNamespaces() ([]string, error) { + // Build the full URL for the DELETE request + url := g.GaeaCCBaseRouter + "list" + // Send the request + resp, err := requests.SendGet(url, g.GaeaCCAdminUser, g.GaeaCCAdminPassword) + if err != nil { + return []string{}, err + } + var listResp cc.ListNamespaceResp + err = json.Unmarshal(resp.Body, &listResp) + if err != nil { + return nil, fmt.Errorf("error decoding response: %v", err) + } + // Check if the list namespaces was successful + return listResp.Data, nil +} + +// SearchSqlLog function in the provided code is designed to search through SQL log files for specific entries. +// It takes a search string and a timestamp, and returns a slice of log entries that match the criteria. +// The incoming searchString will be unblocked. +// The function reads log files within a specified directory, looking for files named with the prefix "gaea_sql.log". +// It uses regular expressions to parse and match log entries based on the input parameters. +// If a matching entry is found, it's added to the result slice. The function handles errors such as file access issues and returns an error if any problems occur during the file reading and parsing process. +func (e *E2eManager) SearchSqlLog(searchString string, currentTime time.Time) ([]util.LogEntry, error) { + // 等待日志落盘 + time.Sleep(100 * time.Millisecond) + searchString = strings.TrimSuffix(searchString, ";") + var allEntries []util.LogEntry + + err := filepath.Walk(e.GCluster.LogDirectory, func(path string, info os.FileInfo, err error) error { + if err != nil { + return err + } + if !info.IsDir() && strings.HasPrefix(info.Name(), "gaea_sql.log") && info.Mode()&os.ModeSymlink == 0 { + file, err := os.Open(path) + if err != nil { + return fmt.Errorf("open file:%s error %v", path, err) + } + defer file.Close() + + re := regexp.MustCompile(LogExpression) + + entries, err := util.ParseLogEntries(file, re, currentTime, searchString) + if err != nil { + return err + } + allEntries = append(allEntries, entries...) + } + return nil + }) + + if err != nil { + return []util.LogEntry{}, err + } + return allEntries, nil +} +func (e *E2eManager) ClearSqlLog() error { + err := filepath.Walk(e.GCluster.LogDirectory, func(path string, info os.FileInfo, err error) error { + if err != nil { + return err + } + if !info.IsDir() && strings.HasPrefix(info.Name(), "gaea_sql.log") { + file, err := os.OpenFile(path, os.O_WRONLY|os.O_TRUNC|os.O_CREATE, 0644) + if err != nil { + return fmt.Errorf("open file:%s error %v", path, err) + } + defer file.Close() + file.Truncate(0) + } + return nil + }) + return err +} diff --git a/tests/e2e/config/ns/default.template b/tests/e2e/config/ns/default.template new file mode 100644 index 00000000..07d48a57 --- /dev/null +++ b/tests/e2e/config/ns/default.template @@ -0,0 +1,64 @@ +{ + "open_general_log": false, + "is_encrypt": true, + "name": "test_namespace_e2e_test", + "online": true, + "read_only": false, + "allowed_dbs": { + "db_e2e_test": true + }, + "default_phy_dbs": null, + "slow_sql_time": "1000", + "black_sql": [], + "allowed_ip": null, + "slices": [ + {{- range $index, $slice := .Slices }} + { + "name": "{{.Name}}", + "user_name": "{{.UserName}}", + "password": "{{.Password}}", + "master": "{{.Master}}", + "slaves": [ + {{- range $index1, $value1 := $slice.Slaves }} + "{{$value1}}"{{ if not (lastItem $index1 (len $slice.Slaves) ) }}, {{ end }} + {{- end }} + ], + "statistic_slaves": [ + {{- range $index2, $value2 := $slice.StatisticSlaves }} + "{{$value2}}"{{ if not (lastItem $index2 (len $slice.StatisticSlaves) ) }}, {{ end }} + {{- end }} + ], + "capacity": {{.Capacity}}, + "max_capacity": {{.MaxCapacity}}, + "idle_timeout": {{.IdleTimeout}}, + "capability": {{.Capability}}, + "init_connect": "{{.InitConnect}}" + }{{ if not (lastItem $index (len $.Slices) ) }}, {{ end }} + {{- end}} + ], + "shard_rules": [], + "users": [ + {{- range $index, $user := .GaeaUsers }} + { + "user_name": "{{.UserName}}", + "password": "{{.Password}}", + "namespace": "test_namespace_e2e_test", + "rw_flag": {{.RWFlag}}, + "rw_split": {{.RWSplit}}, + "other_property":{{.OtherProperty}} + }{{ if not (lastItem $index (len $.GaeaUsers) ) }}, {{ end }} + {{- end}} + ], + "default_slice": "slice-0", + "global_sequences": null, + "default_charset": "", + "default_collation": "", + "max_sql_execute_time": 0, + "max_sql_result_size": 0, + "max_client_connections": 100000, + "down_after_no_alive": 0, + "seconds_behind_master": 0, + "check_select_lock": false, + "support_multi_query": false, + "local_slave_read_priority": 0 +} diff --git a/tests/e2e/config/ns/kingshard_hash.template b/tests/e2e/config/ns/kingshard_hash.template new file mode 100644 index 00000000..9cebeb4f --- /dev/null +++ b/tests/e2e/config/ns/kingshard_hash.template @@ -0,0 +1,203 @@ +{ + "name": "test_kingshard_hash", + "online": true, + "read_only": false, + "allowed_dbs": { + "sbtest": true + }, + "default_phy_dbs": { + "sbtest": "sbtest" + }, + "slow_sql_time": "1000", + "black_sql": [ + "" + ], + "allowed_ip": null, + "slices": [ + {{- range $index, $slice := .Slices }} + { + "name": "{{.Name}}", + "user_name": "{{.UserName}}", + "password": "{{.Password}}", + "master": "{{.Master}}", + "slaves": [ + {{- range $index1, $value1 := $slice.Slaves }} + "{{$value1}}"{{ if not (lastItem $index1 (len $slice.Slaves) ) }}, {{ end }} + {{- end }} + ], + "statistic_slaves": [ + {{- range $index2, $value2 := $slice.StatisticSlaves }} + "{{$value2}}"{{ if not (lastItem $index2 (len $slice.StatisticSlaves) ) }}, {{ end }} + {{- end }} + ], + "capacity": {{.Capacity}}, + "max_capacity": {{.MaxCapacity}}, + "idle_timeout": {{.IdleTimeout}}, + "capability": {{.Capability}}, + "init_connect": "{{.InitConnect}}" + }{{ if not (lastItem $index (len $.Slices) ) }}, {{ end }} + {{- end}} + ], + "shard_rules": [ + { + "db": "sbtest", + "table": "t", + "type": "hash", + "key": "id", + "locations": [ + 2, + 2 + ], + "slices": [ + "slice-0", + "slice-1" + ] + + }, + { + "db": "sbtest", + "table": "t1", + "type": "linked", + "parent_table": "t", + "key": "id" + }, + { + "db": "sbtest", + "table": "t2", + "type": "linked", + "parent_table": "t", + "key": "id" + }, + { + "db": "sbtest", + "table": "t3", + "type": "linked", + "parent_table": "t", + "key": "id" + }, + { + "db": "sbtest", + "table": "test1", + "type": "hash", + "key": "id", + "locations": [ + 2, + 2 + ], + "slices": [ + "slice-0", + "slice-1" + ] + + }, + { + "db": "sbtest", + "table": "test2", + "type": "linked", + "parent_table": "test1", + "key": "id" + }, + { + "db": "sbtest", + "table": "test3", + "type": "linked", + "parent_table": "test1", + "key": "id" + }, + { + "db": "sbtest", + "table": "test4", + "type": "linked", + "parent_table": "test1", + "key": "id" + }, + { + "db": "sbtest", + "table": "test5", + "type": "linked", + "parent_table": "test1", + "key": "id" + }, + { + "db": "sbtest", + "table": "test6", + "type": "linked", + "parent_table": "test1", + "key": "id" + }, + { + "db": "sbtest", + "table": "test7", + "type": "linked", + "parent_table": "test1", + "key": "id" + }, + { + "db": "sbtest", + "table": "test8", + "type": "linked", + "parent_table": "test1", + "key": "id" + }, + { + "db": "sbtest", + "table": "test9", + "type": "linked", + "parent_table": "test1", + "key": "id" + }, + { + "db": "sbtest", + "table": "t4", + "type": "hash", + "key": "id", + "locations": [ + 2, + 2 + ], + "slices": [ + "slice-0", + "slice-1" + ] + + + }, + { + "db": "sbtest", + "table": "t5", + "type": "linked", + "parent_table": "t4", + "key": "id" + }, + { + "db": "sbtest", + "table": "t6", + "type": "linked", + "parent_table": "t4", + "key": "id" + } + ], + "users": [ + {{- range $index, $user := .GaeaUsers }} + { + "user_name": "{{.UserName}}", + "password": "{{.Password}}", + "namespace": "test_kingshard_hash", + "rw_flag": {{.RWFlag}}, + "rw_split": {{.RWSplit}}, + "other_property":{{.OtherProperty}} + }{{ if not (lastItem $index (len $.GaeaUsers) ) }}, {{ end }} + {{- end}} + ], + "default_slice": "slice-0", + "global_sequences": null, + "default_charset": "", + "default_collation": "", + "max_sql_execute_time": 0, + "max_sql_result_size": 0, + "max_client_connections": 100000, + "down_after_no_alive": 0, + "seconds_behind_master": 0, + "check_select_lock": false, + "support_multi_query": false +} diff --git a/tests/e2e/config/ns/kingshard_mod.template b/tests/e2e/config/ns/kingshard_mod.template new file mode 100644 index 00000000..1c5c806d --- /dev/null +++ b/tests/e2e/config/ns/kingshard_mod.template @@ -0,0 +1,203 @@ +{ + "name": "test_kingshard_mod", + "online": true, + "read_only": false, + "allowed_dbs": { + "sbtest": true + }, + "default_phy_dbs": { + "sbtest": "sbtest" + }, + "slow_sql_time": "1000", + "black_sql": [ + "" + ], + "allowed_ip": null, + "slices": [ + {{- range $index, $slice := .Slices }} + { + "name": "{{.Name}}", + "user_name": "{{.UserName}}", + "password": "{{.Password}}", + "master": "{{.Master}}", + "slaves": [ + {{- range $index1, $value1 := $slice.Slaves }} + "{{$value1}}"{{ if not (lastItem $index1 (len $slice.Slaves) ) }}, {{ end }} + {{- end }} + ], + "statistic_slaves": [ + {{- range $index2, $value2 := $slice.StatisticSlaves }} + "{{$value2}}"{{ if not (lastItem $index2 (len $slice.StatisticSlaves) ) }}, {{ end }} + {{- end }} + ], + "capacity": {{.Capacity}}, + "max_capacity": {{.MaxCapacity}}, + "idle_timeout": {{.IdleTimeout}}, + "capability": {{.Capability}}, + "init_connect": "{{.InitConnect}}" + }{{ if not (lastItem $index (len $.Slices) ) }}, {{ end }} + {{- end}} + ], + "shard_rules": [ + { + "db": "sbtest", + "table": "t", + "type": "mod", + "key": "id", + "locations": [ + 2, + 2 + ], + "slices": [ + "slice-0", + "slice-1" + ] + + }, + { + "db": "sbtest", + "table": "t1", + "type": "linked", + "parent_table": "t", + "key": "id" + }, + { + "db": "sbtest", + "table": "t2", + "type": "linked", + "parent_table": "t", + "key": "id" + }, + { + "db": "sbtest", + "table": "t3", + "type": "linked", + "parent_table": "t", + "key": "id" + }, + { + "db": "sbtest", + "table": "test1", + "type": "mod", + "key": "id", + "locations": [ + 2, + 2 + ], + "slices": [ + "slice-0", + "slice-1" + ] + + }, + { + "db": "sbtest", + "table": "test2", + "type": "linked", + "parent_table": "test1", + "key": "id" + }, + { + "db": "sbtest", + "table": "test3", + "type": "linked", + "parent_table": "test1", + "key": "id" + }, + { + "db": "sbtest", + "table": "test4", + "type": "linked", + "parent_table": "test1", + "key": "id" + }, + { + "db": "sbtest", + "table": "test5", + "type": "linked", + "parent_table": "test1", + "key": "id" + }, + { + "db": "sbtest", + "table": "test6", + "type": "linked", + "parent_table": "test1", + "key": "id" + }, + { + "db": "sbtest", + "table": "test7", + "type": "linked", + "parent_table": "test1", + "key": "id" + }, + { + "db": "sbtest", + "table": "test8", + "type": "linked", + "parent_table": "test1", + "key": "id" + }, + { + "db": "sbtest", + "table": "test9", + "type": "linked", + "parent_table": "test1", + "key": "id" + }, + { + "db": "sbtest", + "table": "t4", + "type": "mod", + "key": "id", + "locations": [ + 2, + 2 + ], + "slices": [ + "slice-0", + "slice-1" + ] + + + }, + { + "db": "sbtest", + "table": "t5", + "type": "linked", + "parent_table": "t4", + "key": "id" + }, + { + "db": "sbtest", + "table": "t6", + "type": "linked", + "parent_table": "t4", + "key": "id" + } + ], + "users": [ + {{- range $index, $user := .GaeaUsers }} + { + "user_name": "{{.UserName}}", + "password": "{{.Password}}", + "namespace": "test_kingshard_mod", + "rw_flag": {{.RWFlag}}, + "rw_split": {{.RWSplit}}, + "other_property":{{.OtherProperty}} + }{{ if not (lastItem $index (len $.GaeaUsers) ) }}, {{ end }} + {{- end}} + ], + "default_slice": "slice-0", + "global_sequences": null, + "default_charset": "", + "default_collation": "", + "max_sql_execute_time": 0, + "max_sql_result_size": 0, + "max_client_connections": 100000, + "down_after_no_alive": 0, + "seconds_behind_master": 0, + "check_select_lock": false, + "support_multi_query": false +} diff --git a/tests/e2e/config/ns/mycat_long.template b/tests/e2e/config/ns/mycat_long.template new file mode 100644 index 00000000..d91dad62 --- /dev/null +++ b/tests/e2e/config/ns/mycat_long.template @@ -0,0 +1,217 @@ +{ + "name": "test_mycat_long", + "online": true, + "read_only": false, + "allowed_dbs": { + "sbtest": true + }, + "default_phy_dbs": { + "sbtest": "sbtest_0" + }, + "slow_sql_time": "1000", + "black_sql": [ + "" + ], + "allowed_ip": null, + "slices": [ + {{- range $index, $slice := .Slices }} + { + "name": "{{.Name}}", + "user_name": "{{.UserName}}", + "password": "{{.Password}}", + "master": "{{.Master}}", + "slaves": [ + {{- range $index1, $value1 := $slice.Slaves }} + "{{$value1}}"{{ if not (lastItem $index1 (len $slice.Slaves) ) }}, {{ end }} + {{- end }} + ], + "statistic_slaves": [ + {{- range $index2, $value2 := $slice.StatisticSlaves }} + "{{$value2}}"{{ if not (lastItem $index2 (len $slice.StatisticSlaves) ) }}, {{ end }} + {{- end }} + ], + "capacity": {{.Capacity}}, + "max_capacity": {{.MaxCapacity}}, + "idle_timeout": {{.IdleTimeout}}, + "capability": {{.Capability}}, + "init_connect": "{{.InitConnect}}" + }{{ if not (lastItem $index (len $.Slices) ) }}, {{ end }} + {{- end}} + ], + "shard_rules": [ + + { + "db": "sbtest", + "table": "t", + "type": "mycat_long", + "key": "id", + "locations": [ + 2, + 2 + ], + "slices": [ + "slice-0", + "slice-1" + ], + "databases": [ + "sbtest_[0-3]" + ], + "partition_count": "4", + "partition_length": "256" + + }, + { + "db": "sbtest", + "table": "t1", + "type": "linked", + "parent_table": "t", + "key": "id" + }, + { + "db": "sbtest", + "table": "t2", + "type": "linked", + "parent_table": "t", + "key": "id" + }, + { + "db": "sbtest", + "table": "t3", + "type": "linked", + "parent_table": "t", + "key": "id" + }, + { + "db": "sbtest", + "table": "test1", + "type": "mycat_long", + "key": "id", + "locations": [ + 2, + 2 + ], + "slices": [ + "slice-0", + "slice-1" + ], + "databases": [ + "sbtest_[0-3]" + ], + "partition_count": "4", + "partition_length": "256" + }, + { + "db": "sbtest", + "table": "test2", + "type": "linked", + "parent_table": "test1", + "key": "id" + }, + { + "db": "sbtest", + "table": "test3", + "type": "linked", + "parent_table": "test1", + "key": "id" + }, + { + "db": "sbtest", + "table": "test4", + "type": "linked", + "parent_table": "test1", + "key": "id" + }, + { + "db": "sbtest", + "table": "test5", + "type": "linked", + "parent_table": "test1", + "key": "id" + }, + { + "db": "sbtest", + "table": "test6", + "type": "linked", + "parent_table": "test1", + "key": "id" + }, + { + "db": "sbtest", + "table": "test7", + "type": "linked", + "parent_table": "test1", + "key": "id" + }, + { + "db": "sbtest", + "table": "test8", + "type": "linked", + "parent_table": "test1", + "key": "id" + }, + { + "db": "sbtest", + "table": "test9", + "type": "linked", + "parent_table": "test1", + "key": "id" + }, + { + "db": "sbtest", + "table": "t4", + "type": "mycat_long", + "key": "id", + "locations": [ + 2, + 2 + ], + "slices": [ + "slice-0", + "slice-1" + ], + "databases": [ + "sbtest_[0-3]" + ], + "partition_count": "4", + "partition_length": "256" + + }, + { + "db": "sbtest", + "table": "t5", + "type": "linked", + "parent_table": "t4", + "key": "id" + }, + { + "db": "sbtest", + "table": "t6", + "type": "linked", + "parent_table": "t4", + "key": "id" + } + ], + "users": [ + {{- range $index, $user := .GaeaUsers }} + { + "user_name": "{{.UserName}}", + "password": "{{.Password}}", + "namespace": "test_mycat_long", + "rw_flag": {{.RWFlag}}, + "rw_split": {{.RWSplit}}, + "other_property":{{.OtherProperty}} + }{{ if not (lastItem $index (len $.GaeaUsers) ) }}, {{ end }} + {{- end}} + ], + "default_slice": "slice-0", + "global_sequences": null, + "default_charset": "", + "default_collation": "", + "max_sql_execute_time": 0, + "max_sql_result_size": 0, + "max_client_connections": 100000, + "down_after_no_alive": 0, + "seconds_behind_master": 0, + "check_select_lock": false, + "support_multi_query": false +} diff --git a/tests/e2e/config/ns/mycat_mod.template b/tests/e2e/config/ns/mycat_mod.template new file mode 100644 index 00000000..a4fbc9fb --- /dev/null +++ b/tests/e2e/config/ns/mycat_mod.template @@ -0,0 +1,208 @@ +{ + "name": "test_mycat_mod", + "online": true, + "read_only": false, + "allowed_dbs": { + "sbtest": true + }, + "default_phy_dbs": { + "sbtest": "sbtest_0" + }, + "slow_sql_time": "0", + "black_sql": [ + "" + ], + "allowed_ip": null, + "slices": [ + {{- range $index, $slice := .Slices }} + { + "name": "{{.Name}}", + "user_name": "{{.UserName}}", + "password": "{{.Password}}", + "master": "{{.Master}}", + "slaves": [ + {{- range $index1, $value1 := $slice.Slaves }} + "{{$value1}}"{{ if not (lastItem $index1 (len $slice.Slaves) ) }}, {{ end }} + {{- end }} + ], + "statistic_slaves": [ + {{- range $index2, $value2 := $slice.StatisticSlaves }} + "{{$value2}}"{{ if not (lastItem $index2 (len $slice.StatisticSlaves) ) }}, {{ end }} + {{- end }} + ], + "capacity": {{.Capacity}}, + "max_capacity": {{.MaxCapacity}}, + "idle_timeout": {{.IdleTimeout}}, + "capability": {{.Capability}}, + "init_connect": "{{.InitConnect}}" + }{{ if not (lastItem $index (len $.Slices) ) }}, {{ end }} + {{- end}} + ], + "shard_rules": [ + { + "db": "sbtest", + "table": "t", + "type": "mycat_mod", + "key": "id", + "locations": [ + 2, + 2 + ], + "slices": [ + "slice-0", + "slice-1" + ], + "databases": [ + "sbtest_[0-3]" + ] + }, + { + "db": "sbtest", + "table": "t1", + "type": "linked", + "parent_table": "t", + "key": "id" + }, + { + "db": "sbtest", + "table": "t2", + "type": "linked", + "parent_table": "t", + "key": "id" + }, + { + "db": "sbtest", + "table": "t3", + "type": "linked", + "parent_table": "t", + "key": "id" + }, + { + "db": "sbtest", + "table": "test1", + "type": "mycat_mod", + "key": "id", + "locations": [ + 2, + 2 + ], + "slices": [ + "slice-0", + "slice-1" + ], + "databases": [ + "sbtest_[0-3]" + ] + }, + { + "db": "sbtest", + "table": "test2", + "type": "linked", + "parent_table": "test1", + "key": "id" + }, + { + "db": "sbtest", + "table": "test3", + "type": "linked", + "parent_table": "test1", + "key": "id" + }, + { + "db": "sbtest", + "table": "test4", + "type": "linked", + "parent_table": "test1", + "key": "id" + }, + { + "db": "sbtest", + "table": "test5", + "type": "linked", + "parent_table": "test1", + "key": "id" + }, + { + "db": "sbtest", + "table": "test6", + "type": "linked", + "parent_table": "test1", + "key": "id" + }, + { + "db": "sbtest", + "table": "test7", + "type": "linked", + "parent_table": "test1", + "key": "id" + }, + { + "db": "sbtest", + "table": "test8", + "type": "linked", + "parent_table": "test1", + "key": "id" + }, + { + "db": "sbtest", + "table": "test9", + "type": "linked", + "parent_table": "test1", + "key": "id" + }, + { + "db": "sbtest", + "table": "t4", + "type": "mycat_mod", + "key": "id", + "locations": [ + 2, + 2 + ], + "slices": [ + "slice-0", + "slice-1" + ], + "databases": [ + "sbtest_[0-3]" + ] + }, + { + "db": "sbtest", + "table": "t5", + "type": "linked", + "parent_table": "t4", + "key": "id" + }, + { + "db": "sbtest", + "table": "t6", + "type": "linked", + "parent_table": "t4", + "key": "id" + } + ], + "users": [ + {{- range $index, $user := .GaeaUsers }} + { + "user_name": "{{.UserName}}", + "password": "{{.Password}}", + "namespace": "test_mycat_mod", + "rw_flag": {{.RWFlag}}, + "rw_split": {{.RWSplit}}, + "other_property":{{.OtherProperty}} + }{{ if not (lastItem $index (len $.GaeaUsers) ) }}, {{ end }} + {{- end}} + ], + "default_slice": "slice-0", + "global_sequences": null, + "default_charset": "", + "default_collation": "", + "max_sql_execute_time": 0, + "max_sql_result_size": 0, + "max_client_connections": 100000, + "down_after_no_alive": 0, + "seconds_behind_master": 0, + "check_select_lock": false, + "support_multi_query": false +} diff --git a/tests/e2e/config/ns/mycat_murmur.template b/tests/e2e/config/ns/mycat_murmur.template new file mode 100644 index 00000000..fd713122 --- /dev/null +++ b/tests/e2e/config/ns/mycat_murmur.template @@ -0,0 +1,217 @@ +{ + "name": "test_mycat_murmur", + "online": true, + "read_only": false, + "allowed_dbs": { + "sbtest": true + }, + "default_phy_dbs": { + "sbtest": "sbtest_0" + }, + "slow_sql_time": "1000", + "black_sql": [ + "" + ], + "allowed_ip": null, + "slices": [ + {{- range $index, $slice := .Slices }} + { + "name": "{{.Name}}", + "user_name": "{{.UserName}}", + "password": "{{.Password}}", + "master": "{{.Master}}", + "slaves": [ + {{- range $index1, $value1 := $slice.Slaves }} + "{{$value1}}"{{ if not (lastItem $index1 (len $slice.Slaves) ) }}, {{ end }} + {{- end }} + ], + "statistic_slaves": [ + {{- range $index2, $value2 := $slice.StatisticSlaves }} + "{{$value2}}"{{ if not (lastItem $index2 (len $slice.StatisticSlaves) ) }}, {{ end }} + {{- end }} + ], + "capacity": {{.Capacity}}, + "max_capacity": {{.MaxCapacity}}, + "idle_timeout": {{.IdleTimeout}}, + "capability": {{.Capability}}, + "init_connect": "{{.InitConnect}}" + }{{ if not (lastItem $index (len $.Slices) ) }}, {{ end }} + {{- end}} + ], + "shard_rules": [ + + { + "db": "sbtest", + "table": "t", + "type": "mycat_murmur", + "key": "id", + "locations": [ + 2, + 2 + ], + "slices": [ + "slice-0", + "slice-1" + ], + "databases": [ + "sbtest_[0-3]" + ], + "seed": "0", + "virtual_bucket_times": "160" + + }, + { + "db": "sbtest", + "table": "t1", + "type": "linked", + "parent_table": "t", + "key": "id" + }, + { + "db": "sbtest", + "table": "t2", + "type": "linked", + "parent_table": "t", + "key": "id" + }, + { + "db": "sbtest", + "table": "t3", + "type": "linked", + "parent_table": "t", + "key": "id" + }, + { + "db": "sbtest", + "table": "test1", + "type": "mycat_murmur", + "key": "id", + "locations": [ + 2, + 2 + ], + "slices": [ + "slice-0", + "slice-1" + ], + "databases": [ + "sbtest_[0-3]" + ], + "seed": "0", + "virtual_bucket_times": "160" + }, + { + "db": "sbtest", + "table": "test2", + "type": "linked", + "parent_table": "test1", + "key": "id" + }, + { + "db": "sbtest", + "table": "test3", + "type": "linked", + "parent_table": "test1", + "key": "id" + }, + { + "db": "sbtest", + "table": "test4", + "type": "linked", + "parent_table": "test1", + "key": "id" + }, + { + "db": "sbtest", + "table": "test5", + "type": "linked", + "parent_table": "test1", + "key": "id" + }, + { + "db": "sbtest", + "table": "test6", + "type": "linked", + "parent_table": "test1", + "key": "id" + }, + { + "db": "sbtest", + "table": "test7", + "type": "linked", + "parent_table": "test1", + "key": "id" + }, + { + "db": "sbtest", + "table": "test8", + "type": "linked", + "parent_table": "test1", + "key": "id" + }, + { + "db": "sbtest", + "table": "test9", + "type": "linked", + "parent_table": "test1", + "key": "id" + }, + { + "db": "sbtest", + "table": "t4", + "type": "mycat_murmur", + "key": "id", + "locations": [ + 2, + 2 + ], + "slices": [ + "slice-0", + "slice-1" + ], + "databases": [ + "sbtest_[0-3]" + ], + "seed": "0", + "virtual_bucket_times": "160" + + }, + { + "db": "sbtest", + "table": "t5", + "type": "linked", + "parent_table": "t4", + "key": "id" + }, + { + "db": "sbtest", + "table": "t6", + "type": "linked", + "parent_table": "t4", + "key": "id" + } + ], + "users": [ + {{- range $index, $user := .GaeaUsers }} + { + "user_name": "{{.UserName}}", + "password": "{{.Password}}", + "namespace": "test_mycat_murmur", + "rw_flag": {{.RWFlag}}, + "rw_split": {{.RWSplit}}, + "other_property":{{.OtherProperty}} + }{{ if not (lastItem $index (len $.GaeaUsers) ) }}, {{ end }} + {{- end}} + ], + "default_slice": "slice-0", + "global_sequences": null, + "default_charset": "", + "default_collation": "", + "max_sql_execute_time": 0, + "max_sql_result_size": 0, + "max_client_connections": 100000, + "down_after_no_alive": 0, + "seconds_behind_master": 0, + "check_select_lock": false, + "support_multi_query": false +} diff --git a/tests/e2e/config/ns/mycat_string.template b/tests/e2e/config/ns/mycat_string.template new file mode 100644 index 00000000..dca0ef85 --- /dev/null +++ b/tests/e2e/config/ns/mycat_string.template @@ -0,0 +1,219 @@ +{ + "name": "test_mycat_string", + "online": true, + "read_only": false, + "allowed_dbs": { + "sbtest": true + }, + "default_phy_dbs": { + "sbtest": "sbtest_0" + }, + "slow_sql_time": "1000", + "black_sql": [ + "" + ], + "allowed_ip": null, + "slices": [ + {{- range $index, $slice := .Slices }} + { + "name": "{{.Name}}", + "user_name": "{{.UserName}}", + "password": "{{.Password}}", + "master": "{{.Master}}", + "slaves": [ + {{- range $index1, $value1 := $slice.Slaves }} + "{{$value1}}"{{ if not (lastItem $index1 (len $slice.Slaves) ) }}, {{ end }} + {{- end }} + ], + "statistic_slaves": [ + {{- range $index2, $value2 := $slice.StatisticSlaves }} + "{{$value2}}"{{ if not (lastItem $index2 (len $slice.StatisticSlaves) ) }}, {{ end }} + {{- end }} + ], + "capacity": {{.Capacity}}, + "max_capacity": {{.MaxCapacity}}, + "idle_timeout": {{.IdleTimeout}}, + "capability": {{.Capability}}, + "init_connect": "{{.InitConnect}}" + }{{ if not (lastItem $index (len $.Slices) ) }}, {{ end }} + {{- end}} + ], + "shard_rules": [ + { + "db": "sbtest", + "table": "t", + "type": "mycat_string", + "key": "id", + "locations": [ + 2, + 2 + ], + "slices": [ + "slice-0", + "slice-1" + ], + "databases": [ + "sbtest_[0-3]" + ], + "partition_count": "4", + "partition_length": "256", + "hash_slice": ":" + + }, + { + "db": "sbtest", + "table": "t1", + "type": "linked", + "parent_table": "t", + "key": "id" + }, + { + "db": "sbtest", + "table": "t2", + "type": "linked", + "parent_table": "t", + "key": "id" + }, + { + "db": "sbtest", + "table": "t3", + "type": "linked", + "parent_table": "t", + "key": "id" + }, + { + "db": "sbtest", + "table": "test1", + "type": "mycat_string", + "key": "id", + "locations": [ + 2, + 2 + ], + "slices": [ + "slice-0", + "slice-1" + ], + "databases": [ + "sbtest_[0-3]" + ], + "partition_count": "4", + "partition_length": "256", + "hash_slice": ":" + }, + { + "db": "sbtest", + "table": "test2", + "type": "linked", + "parent_table": "test1", + "key": "id" + }, + { + "db": "sbtest", + "table": "test3", + "type": "linked", + "parent_table": "test1", + "key": "id" + }, + { + "db": "sbtest", + "table": "test4", + "type": "linked", + "parent_table": "test1", + "key": "id" + }, + { + "db": "sbtest", + "table": "test5", + "type": "linked", + "parent_table": "test1", + "key": "id" + }, + { + "db": "sbtest", + "table": "test6", + "type": "linked", + "parent_table": "test1", + "key": "id" + }, + { + "db": "sbtest", + "table": "test7", + "type": "linked", + "parent_table": "test1", + "key": "id" + }, + { + "db": "sbtest", + "table": "test8", + "type": "linked", + "parent_table": "test1", + "key": "id" + }, + { + "db": "sbtest", + "table": "test9", + "type": "linked", + "parent_table": "test1", + "key": "id" + }, + { + "db": "sbtest", + "table": "t4", + "type": "mycat_string", + "key": "id", + "locations": [ + 2, + 2 + ], + "slices": [ + "slice-0", + "slice-1" + ], + "databases": [ + "sbtest_[0-3]" + ], + "partition_count": "4", + "partition_length": "256", + "hash_slice": ":" + + }, + { + "db": "sbtest", + "table": "t5", + "type": "linked", + "parent_table": "t4", + "key": "id" + }, + { + "db": "sbtest", + "table": "t6", + "type": "linked", + "parent_table": "t4", + "key": "id" + } + ], + "users": [ + {{- range $index, $user := .GaeaUsers }} + { + "user_name": "{{.UserName}}", + "password": "{{.Password}}", + "namespace": "test_mycat_string", + "rw_flag": {{.RWFlag}}, + "rw_split": {{.RWSplit}}, + "other_property":{{.OtherProperty}} + }{{ if not (lastItem $index (len $.GaeaUsers) ) }}, {{ end }} + {{- end}} + ], + "default_slice": "slice-0", + "global_sequences": null, + "default_charset": "", + "default_collation": "", + "max_sql_execute_time": 0, + "max_sql_result_size": 0, + "max_client_connections": 100000, + "down_after_no_alive": 0, + "seconds_behind_master": 0, + "check_select_lock": false, + "support_multi_query": false +} diff --git a/tests/e2e/config/ns/shard.template b/tests/e2e/config/ns/shard.template new file mode 100644 index 00000000..f9b69342 --- /dev/null +++ b/tests/e2e/config/ns/shard.template @@ -0,0 +1,361 @@ +{ + "open_general_log": false, + "is_encrypt": true, + "name": "test_namespace_shard_plan", + "online": true, + "read_only": false, + "allowed_dbs": { + "db_kingshard_date_day": true, + "db_kingshard_date_month": true, + "db_kingshard_date_year": true, + "db_kingshard_hash": true, + "db_kingshard_mod": true, + "db_kingshard_range": true, + "db_mycat_long": true, + "db_mycat_mod": true, + "db_mycat_murmur": true, + "db_mycat_string": true + }, + "default_phy_dbs": null, + "slow_sql_time": "1000", + "black_sql": [], + "allowed_ip": null, + "slices": [ + {{- range $index, $slice := .Slices }} + { + "name": "{{.Name}}", + "user_name": "{{.UserName}}", + "password": "{{.Password}}", + "master": "{{.Master}}", + "slaves": [ + {{- range $index1, $value1 := $slice.Slaves }} + "{{$value1}}"{{ if not (lastItem $index1 (len $slice.Slaves) ) }}, {{ end }} + {{- end }} + ], + "statistic_slaves": [ + {{- range $index2, $value2 := $slice.StatisticSlaves }} + "{{$value2}}"{{ if not (lastItem $index2 (len $slice.StatisticSlaves) ) }}, {{ end }} + {{- end }} + ], + "capacity": {{.Capacity}}, + "max_capacity": {{.MaxCapacity}}, + "idle_timeout": {{.IdleTimeout}}, + "capability": {{.Capability}}, + "init_connect": "{{.InitConnect}}" + }{{ if not (lastItem $index (len $.Slices) ) }}, {{ end }} + {{- end}} + ], + "shard_rules": [ + { + "db": "db_kingshard_hash", + "table": "tbl_shard", + "parent_table": "", + "type": "hash", + "key": "id", + "locations": [ + 2, + 2 + ], + "slices": [ + "slice-0", + "slice-1" + ], + "date_range": null, + "table_row_limit": 0, + "databases": null, + "partition_count": "", + "partition_length": "", + "hash_slice": "", + "seed": "", + "virtual_bucket_times": "", + "pad_from": "", + "pad_length": "", + "mod_begin": "", + "mod_end": "" + }, + { + "db": "db_kingshard_mod", + "table": "tbl_shard", + "parent_table": "", + "type": "mod", + "key": "id", + "locations": [ + 2, + 2 + ], + "slices": [ + "slice-0", + "slice-1" + ], + "date_range": null, + "table_row_limit": 0, + "databases": null, + "partition_count": "", + "partition_length": "", + "hash_slice": "", + "seed": "", + "virtual_bucket_times": "", + "pad_from": "", + "pad_length": "", + "mod_begin": "", + "mod_end": "" + }, + { + "db": "db_kingshard_range", + "table": "tbl_shard", + "parent_table": "", + "type": "range", + "key": "id", + "locations": [ + 2, + 2 + ], + "slices": [ + "slice-0", + "slice-1" + ], + "date_range": null, + "table_row_limit": 3, + "databases": null, + "partition_count": "", + "partition_length": "", + "hash_slice": "", + "seed": "", + "virtual_bucket_times": "", + "pad_from": "", + "pad_length": "", + "mod_begin": "", + "mod_end": "" + }, + { + "db": "db_kingshard_date_year", + "table": "tbl_shard", + "parent_table": "", + "type": "date_year", + "key": "create_time", + "locations": [ + 2, + 2 + ], + "slices": [ + "slice-0", + "slice-1" + ], + "date_range": [ + "2016-2017", + "2018-2019" + ], + "table_row_limit": 0, + "databases": null, + "partition_count": "", + "partition_length": "", + "hash_slice": "", + "seed": "", + "virtual_bucket_times": "", + "pad_from": "", + "pad_length": "", + "mod_begin": "", + "mod_end": "" + }, + { + "db": "db_kingshard_date_month", + "table": "tbl_shard", + "parent_table": "", + "type": "date_month", + "key": "create_time", + "locations": [ + 2, + 2 + ], + "slices": [ + "slice-0", + "slice-1" + ], + "date_range": [ + "201405-201406", + "201408-201409" + ], + "table_row_limit": 0, + "databases": null, + "partition_count": "", + "partition_length": "", + "hash_slice": "", + "seed": "", + "virtual_bucket_times": "", + "pad_from": "", + "pad_length": "", + "mod_begin": "", + "mod_end": "" + }, + { + "db": "db_kingshard_date_day", + "table": "tbl_shard", + "parent_table": "", + "type": "date_day", + "key": "create_time", + "locations": [ + 2, + 2 + ], + "slices": [ + "slice-0", + "slice-1" + ], + "date_range": [ + "20201201-20201202", + "20201203-20201204" + ], + "table_row_limit": 3, + "databases": null, + "partition_count": "", + "partition_length": "", + "hash_slice": "", + "seed": "", + "virtual_bucket_times": "", + "pad_from": "", + "pad_length": "", + "mod_begin": "", + "mod_end": "" + }, + { + "db": "db_mycat_mod", + "table": "tbl_mycat", + "parent_table": "", + "type": "mycat_mod", + "key": "id", + "locations": [ + 2, + 2 + ], + "slices": [ + "slice-0", + "slice-1" + ], + "date_range": null, + "table_row_limit": 0, + "databases": [ + "db_mycat_mod_[0-3]" + ], + "partition_count": "", + "partition_length": "", + "hash_slice": "", + "seed": "", + "virtual_bucket_times": "", + "pad_from": "", + "pad_length": "", + "mod_begin": "", + "mod_end": "" + }, + { + "db": "db_mycat_long", + "table": "tbl_mycat", + "parent_table": "", + "type": "mycat_long", + "key": "id", + "locations": [ + 2, + 2 + ], + "slices": [ + "slice-0", + "slice-1" + ], + "date_range": null, + "table_row_limit": 0, + "databases": [ + "db_mycat_long_[0-3]" + ], + "partition_count": "4", + "partition_length": "256", + "hash_slice": "", + "seed": "", + "virtual_bucket_times": "", + "pad_from": "", + "pad_length": "", + "mod_begin": "", + "mod_end": "" + }, + { + "db": "db_mycat_murmur", + "table": "tbl_mycat", + "parent_table": "", + "type": "mycat_murmur", + "key": "id", + "locations": [ + 2, + 2 + ], + "slices": [ + "slice-0", + "slice-1" + ], + "date_range": null, + "table_row_limit": 0, + "databases": [ + "db_mycat_murmur_[0-3]" + ], + "partition_count": "", + "partition_length": "", + "hash_slice": "", + "seed": "0", + "virtual_bucket_times": "160", + "pad_from": "", + "pad_length": "", + "mod_begin": "", + "mod_end": "" + }, + { + "db": "db_mycat_string", + "table": "tbl_mycat", + "parent_table": "", + "type": "mycat_string", + "key": "col1", + "locations": [ + 2, + 2 + ], + "slices": [ + "slice-0", + "slice-1" + ], + "date_range": null, + "table_row_limit": 0, + "databases": [ + "db_mycat_string_[0-3]" + ], + "partition_count": "4", + "partition_length": "256", + "hash_slice": ":", + "seed": "", + "virtual_bucket_times": "", + "pad_from": "", + "pad_length": "", + "mod_begin": "", + "mod_end": "" + } + ], + "users": [ + {{- range $index, $user := .GaeaUsers }} + { + "user_name": "{{.UserName}}", + "password": "{{.Password}}", + "namespace": "test_namespace_shard_plan", + "rw_flag": {{.RWFlag}}, + "rw_split": {{.RWSplit}}, + "other_property":{{.OtherProperty}} + }{{ if not (lastItem $index (len $.GaeaUsers) ) }}, {{ end }} + {{- end}} + ], + "default_slice": "slice-0", + "global_sequences": null, + "default_charset": "", + "default_collation": "", + "max_sql_execute_time": 0, + "max_sql_result_size": 0, + "max_client_connections": 0, + "down_after_no_alive": 0, + "seconds_behind_master": 0, + "check_select_lock": false, + "support_multi_query": false, + "local_slave_read_priority": 0 +} diff --git a/tests/e2e/config/ns/unshard.template b/tests/e2e/config/ns/unshard.template new file mode 100644 index 00000000..1b675eb6 --- /dev/null +++ b/tests/e2e/config/ns/unshard.template @@ -0,0 +1,65 @@ +{ + "open_general_log": false, + "is_encrypt": true, + "name": "test_namespace_un_shard", + "online": true, + "read_only": false, + "allowed_dbs": { + "sbtest1": true, + "sbtest1_shard": true + }, + "default_phy_dbs": null, + "slow_sql_time": "1000", + "black_sql": [], + "allowed_ip": null, + "slices": [ + {{- range $index, $slice := .Slices }} + { + "name": "{{.Name}}", + "user_name": "{{.UserName}}", + "password": "{{.Password}}", + "master": "{{.Master}}", + "slaves": [ + {{- range $index1, $value1 := $slice.Slaves }} + "{{$value1}}"{{ if not (lastItem $index1 (len $slice.Slaves) ) }}, {{ end }} + {{- end }} + ], + "statistic_slaves": [ + {{- range $index2, $value2 := $slice.StatisticSlaves }} + "{{$value2}}"{{ if not (lastItem $index2 (len $slice.StatisticSlaves) ) }}, {{ end }} + {{- end }} + ], + "capacity": {{.Capacity}}, + "max_capacity": {{.MaxCapacity}}, + "idle_timeout": {{.IdleTimeout}}, + "capability": {{.Capability}}, + "init_connect": "{{.InitConnect}}" + }{{ if not (lastItem $index (len $.Slices) ) }}, {{ end }} + {{- end}} + ], + "shard_rules": [], + "users": [ + {{- range $index, $user := .GaeaUsers }} + { + "user_name": "{{.UserName}}", + "password": "{{.Password}}", + "namespace": "test_namespace_un_shard", + "rw_flag": {{.RWFlag}}, + "rw_split": {{.RWSplit}}, + "other_property":{{.OtherProperty}} + }{{ if not (lastItem $index (len $.GaeaUsers) ) }}, {{ end }} + {{- end}} + ], + "default_slice": "slice-0", + "global_sequences": null, + "default_charset": "", + "default_collation": "", + "max_sql_execute_time": 0, + "max_sql_result_size": 0, + "max_client_connections": 0, + "down_after_no_alive": 0, + "seconds_behind_master": 0, + "check_select_lock": false, + "support_multi_query": false, + "local_slave_read_priority": 0 +} diff --git a/tests/e2e/config/ns/unshard_dml.template b/tests/e2e/config/ns/unshard_dml.template new file mode 100644 index 00000000..4d5811e5 --- /dev/null +++ b/tests/e2e/config/ns/unshard_dml.template @@ -0,0 +1,67 @@ +{ + "open_general_log": false, + "is_encrypt": true, + "name": "test_namespace_sql_plan", + "online": true, + "read_only": false, + "allowed_dbs": { + "db_test": true, + "db_test_delete": true, + "db_test_insert": true, + "db_test_replace": true, + "db_test_select": true, + "db_test_update": true + }, + "default_phy_dbs": null, + "slow_sql_time": "1000", + "black_sql": [], + "allowed_ip": null, + "slices": [ + {{- range $index, $slice := .Slices }} + { + "name": "{{.Name}}", + "user_name": "{{.UserName}}", + "password": "{{.Password}}", + "master": "{{.Master}}", + "slaves": [ + {{- range $index1, $value1 := $slice.Slaves }} + "{{$value1}}"{{ if not (lastItem $index1 (len $slice.Slaves) ) }}, {{ end }} + {{- end }} + ], + "statistic_slaves": [ + {{- range $index2, $value2 := $slice.StatisticSlaves }} + "{{$value2}}"{{ if not (lastItem $index2 (len $slice.StatisticSlaves) ) }}, {{ end }} + {{- end }} + ], + "capacity": {{.Capacity}}, + "max_capacity": {{.MaxCapacity}}, + "idle_timeout": {{.IdleTimeout}}, + "capability": {{.Capability}}, + "init_connect": "{{.InitConnect}}" + }{{ if not (lastItem $index (len $.Slices) ) }}, {{ end }} + {{- end}} + ], + "shard_rules": [], + "users": [ + { + "user_name": "gaea_user", + "password": "gaea_pass", + "namespace": "test_namespace_sql_plan", + "rw_flag": 2, + "rw_split": 1, + "other_property": 0 + } + ], + "default_slice": "slice-0", + "global_sequences": null, + "default_charset": "", + "default_collation": "", + "max_sql_execute_time": 0, + "max_sql_result_size": 0, + "max_client_connections": 0, + "down_after_no_alive": 0, + "seconds_behind_master": 0, + "check_select_lock": false, + "support_multi_query": false, + "local_slave_read_priority": 0 +} diff --git a/tests/e2e/config/plan.go b/tests/e2e/config/plan.go new file mode 100644 index 00000000..9e97f9e5 --- /dev/null +++ b/tests/e2e/config/plan.go @@ -0,0 +1,409 @@ +// Copyright 2024 The Gaea Authors. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package config + +import ( + "bufio" + "database/sql" + "encoding/json" + "errors" + "fmt" + "time" + + "github.com/XiaoMi/Gaea/tests/e2e/util" + + "os" + "reflect" + + _ "github.com/go-sql-driver/mysql" +) + +type ( + ExecCase struct { + Description string `json:"description"` // 可选的,为测试场景提供描述 + SetUp []EnvironmentSQL `json:"setUp"` // 测试环境的设置 默认都是根据slice名下的主库执行 + GaeaActions []GaeaAction `json:"gaeaActions"` // 中间件上执行的操作 + MasterCheckSQL []DBAction `json:"masterCheckSQL"` // 主库执行的操作 + SlaveCheckSQL []DBAction `json:"slaveCheckSQL"` // 从库执行的操作 + TearDown []EnvironmentSQL `json:"tearDown"` // 测试环境的清理 默认都是根据slice名下的主库执行 + } + + EnvironmentSQL struct { + Description string `json:"description"` // 可选的,为测试场景提供描述 + Slice string `json:"slice"` + SQL string `json:"sql"` + } + + GaeaAction struct { + SQL string `json:"sql"` + ExecType string `json:"execType"` + Expect interface{} `json:"expect"` + } + + DBAction struct { + Slice string `json:"slice"` + DB string `json:"Db"` + SQL string `json:"sql"` + ExecType string `json:"execType"` + Expect interface{} `json:"expect"` + } + + MysqlCluster struct { + Slices map[string]*Slice `json:"slices"` + } + + Slice struct { + Master *DB `json:"master"` + Slaves []*DB `json:"slaves"` + } + DB struct { + User string `yaml:"user" json:"user"` + Password string `yaml:"password" json:"password"` + Url string `yaml:"url" json:"url"` + } + + Plan struct { + ExecCases []ExecCase `json:"execCases"` + } +) + +func InitConn(username string, password string, host string, database string) (db *sql.DB, err error) { + connStr := fmt.Sprintf("%s:%s@tcp(%s)/", username, password, host) + if len(database) != 0 { + connStr = connStr + database + } + db, err = sql.Open("mysql", connStr) + if err != nil { + return nil, fmt.Errorf("error on initializing mysql connection: %s", err.Error()) + } + db.SetConnMaxLifetime(time.Minute * 5) + db.SetMaxOpenConns(150) + db.SetMaxIdleConns(150) + return db, nil +} + +func (e ExecCase) GaeaRun(gaeaDB *sql.DB) error { + // 执行在Gaea中的操作 + for _, action := range e.GaeaActions { + isSuccess, err := DBExecAndCompare(gaeaDB, action.ExecType, action.SQL, action.Expect) + if err != nil || !isSuccess { + return fmt.Errorf("[gaeaAction] failed to execute SQL:%s, err:%s", action.SQL, err) + } + } + return nil +} + +func DBExecAndCompare(db *sql.DB, expectType string, execSql string, expect interface{}) (bool, error) { + switch expectType { + case "Query": + return Query(db, execSql, expect) + case "QueryRow": + return QueryRow(db, execSql, expect) + case "Exec": + return Exec(db, execSql, expect) + case "Default": + return ExecDefault(db, execSql) + default: + return false, errors.New("unsupported expect type") + } +} + +func ExecDefault(db *sql.DB, sqlStr string) (bool, error) { + _, err := db.Exec(sqlStr) + if err != nil { + return false, fmt.Errorf("default exec error%s", err) + } + return true, nil + +} + +func Query(db *sql.DB, sqlStr string, expect interface{}) (bool, error) { + if !util.IsSlice(expect) { + return false, fmt.Errorf("expect is not slice") + } + if v, ok := expect.([]interface{}); ok { + // Convert []interface{} to [][]string + var values [][]string + for _, row := range v { + var rowValues []string + if rowItems, ok := row.([]interface{}); ok { + for _, item := range rowItems { + if strValue, ok := item.(string); ok { + rowValues = append(rowValues, strValue) + } + } + } + values = append(values, rowValues) + } + rows, err := db.Query(sqlStr) + if err != nil { + if err == sql.ErrNoRows && len(v) == 0 { + return true, nil + } + return false, fmt.Errorf("db Exec Error %v", err) + } + defer rows.Close() + res, err := util.GetDataFromRows(rows) + if err != nil { + return false, fmt.Errorf("get data from rows error:%v", err) + } + // res为空代表没有查到数据 + if (len(res) == 0 || res == nil) && len(v) == 0 { + return true, nil + } + if !reflect.DeepEqual(values, res) { + return false, fmt.Errorf("mismatch. Actual: %v, Expect: %v", res, values) + } + } else { + return false, fmt.Errorf("expect data assertion failed") + } + return true, nil // 所有数据都匹配 +} + +func QueryRow(db *sql.DB, sqlStr string, expect interface{}) (bool, error) { + if !util.IsSlice(expect) { + return false, fmt.Errorf("expect is not slice") + } + if v, ok := expect.([]interface{}); ok { + // Convert []interface{} to []string + values := []string{} + for _, item := range v { + if strValue, ok := item.(string); ok { + values = append(values, strValue) + } + } + row := db.QueryRow(sqlStr) + res, err := util.GetDataFromRow(row, len(v)) + if err != nil { + if err == sql.ErrNoRows && len(v) == 0 { + return true, nil + } + return false, fmt.Errorf("get data from row error:%v", err) + } + if !reflect.DeepEqual(values, res) { + return false, fmt.Errorf("mismatch. Actual: %v, Expect: %v", res, values) + } + } else { + return false, fmt.Errorf("expect data assertion failed") + } + return true, nil // 所有数据都匹配 +} + +func Exec(db *sql.DB, sqlStr string, expect interface{}) (bool, error) { + result, err := db.Exec(sqlStr) + if err != nil { + return false, err + } + // Assuming expect is a map with possible keys "lastInsertId" and "rowsAffected" + expectedResults, ok := expect.(map[string]int64) + if !ok { + return false, errors.New("expect format for Exec type is incorrect") + } + + // Check if "lastInsertId" is in expect and compare it with the result + if lastInsertId, exists := expectedResults["lastInsertId"]; exists { + actualLastInsertId, err := result.LastInsertId() + if err != nil { + return false, err + } + if lastInsertId != actualLastInsertId { + return false, nil + } + } + // Check if "rowsAffected" is in expect and compare it with the result + if rowsAffected, exists := expectedResults["rowsAffected"]; exists { + actualRowsAffected, err := result.RowsAffected() + if err != nil { + return false, err + } + if rowsAffected != actualRowsAffected { + return false, nil + } + } + return true, nil +} + +func (e *ExecCase) GetSetUpSQL() []EnvironmentSQL { + return e.SetUp +} + +func (e *ExecCase) GetTearDownSQL() []EnvironmentSQL { + return e.TearDown +} + +func (e *ExecCase) MasterRunAndCheck(cluster map[string]*LocalSliceConn) error { + // 对主库执行的操作进行检查 + for _, check := range e.MasterCheckSQL { + var masterDB *sql.DB + if slice, ok := cluster[check.Slice]; ok { + masterDB = slice.MasterConn + } else { + return fmt.Errorf("failed to get master database connection") + } + // 这里不能关闭 + // defer masterDB.Close() + if len(check.DB) != 0 { + res, err := masterDB.Exec(fmt.Sprintf("USE %s", check.DB)) + if err != nil { + return fmt.Errorf("[checkAction] failed to use DB statement %s: %v", res, err) + } + } + isSuccess, err := DBExecAndCompare(masterDB, check.ExecType, check.SQL, check.Expect) + if err != nil { + return fmt.Errorf("[checkAction] failed to execute SQL statement %s: %v", check.SQL, err) + } + if !isSuccess { + return fmt.Errorf("[checkAction] SQL execution %s did not meet the expected result: %v", check.SQL, check.Expect) + } + } + return nil +} + +func (e *EnvironmentSQL) MasterRun(cluster map[string]*LocalSliceConn) error { + // 执行 + var masterDB *sql.DB + if slice, ok := cluster[e.Slice]; ok { + masterDB = slice.MasterConn + } else { + return fmt.Errorf("failed to get master database connection") + } + if _, err := masterDB.Exec(e.SQL); err != nil { + return fmt.Errorf("[environment set action] failed to execute sql: %s,error :%s", e.SQL, err) + } + return nil +} + +func (p *Plan) GetExecCases() []ExecCase { + return p.ExecCases +} + +func LoadJsonConfig(path string, val interface{}) error { + if err := validInputIsPtr(val); err != nil { + return fmt.Errorf("valid conf failed:%v", err) + } + f, err := os.Open(path) + if err != nil { + return err + } + defer f.Close() + if err = json.NewDecoder(bufio.NewReader(f)).Decode(val); err != nil { + return err + } + return nil +} + +func validInputIsPtr(conf interface{}) error { + tp := reflect.TypeOf(conf) + if tp.Kind() != reflect.Ptr { + return errors.New("conf should be pointer") + } + return nil +} + +type PlanManager struct { + PlanPath string + Plan *Plan + MysqlClusterConn map[string]*LocalSliceConn + GaeaDB *sql.DB +} + +type PlanManagerOption func(*PlanManager) + +func (m *PlanManager) Init() error { + err := m.LoadPlan() + if err != nil { + return err + } + return nil +} + +func (m *PlanManager) GetMasterConnByName(sliceName string) (*sql.DB, error) { + var master *sql.DB + if slice, ok := m.MysqlClusterConn[sliceName]; ok { + master = slice.MasterConn + } else { + return nil, fmt.Errorf("failed to get master database connection") + } + return master, nil +} + +func (m *PlanManager) GetSlaveConnByName(sliceName string) ([]*sql.DB, error) { + var slaves []*sql.DB + if slice, ok := m.MysqlClusterConn[sliceName]; ok { + slaves = slice.SlaveConns + } else { + return []*sql.DB{}, fmt.Errorf("failed to get master database connection") + } + return slaves, nil +} + +func (m *PlanManager) Run() error { + if m.Plan == nil { + return errors.New("plan is not loaded") + } + // Run set up actions + for _, execCase := range m.Plan.GetExecCases() { + for _, initCase := range execCase.GetSetUpSQL() { + // Run Master actions + if err := initCase.MasterRun(m.MysqlClusterConn); err != nil { + return fmt.Errorf("master init action failed '%s',err:%v", initCase.Description, err) + } + } + // increase time to wait mysql effect + time.Sleep(100 * time.Millisecond) + // Run Gaea actions + if err := execCase.GaeaRun(m.GaeaDB); err != nil { + return fmt.Errorf("gaea action failed for test '%s': %v", execCase.Description, err) + } + + // Run master checks + if err := execCase.MasterRunAndCheck(m.MysqlClusterConn); err != nil { + return fmt.Errorf("master check failed for test '%s': %v", execCase.Description, err) + } + // Run tear down action + for _, tearDownCase := range execCase.GetTearDownSQL() { + // Run Master actions + if err := tearDownCase.MasterRun(m.MysqlClusterConn); err != nil { + return fmt.Errorf("master init action failed '%s': %v", tearDownCase.Description, err) + } + } + + } + return nil +} + +func (m *PlanManager) MysqlClusterConnClose() { + for _, slice := range m.MysqlClusterConn { + if slice.MasterConn != nil { + slice.MasterConn.Close() + } + // 关闭 Slaves 连接 + for _, slave := range slice.SlaveConns { + if slave != nil { + slave.Close() + } + } + } +} + +func (m *PlanManager) LoadPlan() error { + var plan *Plan + err := LoadJsonConfig(m.PlanPath, &plan) + if err != nil { + return err + } + m.Plan = plan + return nil +} diff --git a/tests/e2e/dml/case/delete.json b/tests/e2e/dml/case/delete.json new file mode 100644 index 00000000..b7f09b04 --- /dev/null +++ b/tests/e2e/dml/case/delete.json @@ -0,0 +1,221 @@ +{ + "execCases": [ + { + "description": "Test case for DELETE with ORDER BY and LIMIT", + "setUp": [ + { + "slice": "slice-0", + "sql": "DROP DATABASE IF EXISTS db_test_delete" + }, + { + "slice": "slice-0", + "sql": "CREATE DATABASE db_test_delete" + }, + { + "slice": "slice-0", + "sql": "USE db_test_delete" + }, + { + "slice": "slice-0", + "sql": "CREATE TABLE tbl1 (id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(50), age INT)" + }, + { + "slice": "slice-0", + "sql": "CREATE TABLE tbl2 (id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(50), age INT, ref_id INT)" + } + ], + "gaeaActions": [ + { + "sql": "USE db_test_delete", + "execType": "Default" + }, + { + "sql": "INSERT INTO tbl1 (name, age) VALUES ('User1', 30), ('User2', 29), ('User3', 28), ('User4', 27)", + "execType": "Default" + }, + { + "sql": "INSERT INTO tbl2 (name, age, ref_id) VALUES ('User1', 30, 1), ('User2', 29, 2), ('User3', 28, 3), ('User4', 27, 4)", + "execType": "Default" + }, + { + "sql": "DELETE FROM tbl1 ORDER BY age DESC LIMIT 2", + "execType": "Default" + } + ], + "masterCheckSQL": [ + { + "slice": "slice-0", + "db": "db_test_delete", + "name": "Check master after DELETE with ORDER BY and LIMIT", + "sql": "SELECT * FROM tbl1 WHERE name IN ('User1', 'User2')", + "execType": "Query", + "expect": [] + }, + { + "slice": "slice-0", + "db": "db_test_delete", + "name": "Check master after DELETE with ORDER BY and LIMIT", + "sql": "SELECT * FROM tbl1 WHERE name IN ('User3', 'User4')", + "execType": "Query", + "expect": [ + ["3","User3","28"], + ["4","User4","27"] + ] + }, + { + "slice": "slice-0", + "db": "db_test_delete", + "name": "Check master after DELETE with ORDER BY and LIMIT", + "sql": "SELECT * FROM tbl2 WHERE name IN ('User3', 'User4')", + "execType": "Query", + "expect": [ + + ["3","User3","28","3"], + ["4","User4","27","4"] + ] + } + ], + "tearDown": [ + { + "slice": "slice-0", + "sql": "DROP DATABASE IF EXISTS db_test_delete" + } + ] + }, + { + "description": "Test case for multi-table DELETE", + "setUp": [ + { + "slice": "slice-0", + "sql": "DROP DATABASE IF EXISTS db_test_delete" + }, + { + "slice": "slice-0", + "sql": "CREATE DATABASE db_test_delete" + }, + { + "slice": "slice-0", + "sql": "USE db_test_delete" + }, + { + "slice": "slice-0", + "sql": "CREATE TABLE tbl1 (id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(50), age INT)" + }, + { + "slice": "slice-0", + "sql": "CREATE TABLE tbl2 (id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(50), age INT, ref_id INT)" + } + ], + "gaeaActions": [ + { + "sql": "USE db_test_delete", + "execType": "Default" + }, + { + "sql": "INSERT INTO tbl1 (name, age) VALUES ('User1', 30), ('User2', 29), ('User3', 28), ('User4', 27)", + "execType": "Default" + }, + { + "sql": "INSERT INTO tbl2 (name, age, ref_id) VALUES ('User1', 30, 1), ('User2', 29, 2), ('User3', 28, 3), ('User4', 27, 4)", + "execType": "Default" + }, + { + "sql": "DELETE tbl1, tbl2 FROM tbl1 INNER JOIN tbl2 ON tbl1.id = tbl2.id WHERE tbl1.age >=28", + "execType": "Default" + } + ], + "masterCheckSQL": [ + { + "slice": "slice-0", + "db": "db_test_delete", + "name": "Check master after multi-table DELETE for tbl1", + "sql": "SELECT * FROM tbl1 WHERE name IN ('User3')", + "execType": "Query", + "expect": [] + }, + { + "slice": "slice-0", + "db": "db_test_delete", + "name": "Check master after multi-table DELETE for tbl2", + "sql": "SELECT * FROM tbl2 WHERE name IN ('User3')", + "execType": "Query", + "expect": [] + } + ], + "tearDown": [ + { + "slice": "slice-0", + "sql": "DROP DATABASE IF EXISTS db_test_delete" + } + ] + }, + { + "description": "Test case for multi-table DELETE using USING", + "setUp": [ + { + "slice": "slice-0", + "sql": "DROP DATABASE IF EXISTS db_test_delete" + }, + { + "slice": "slice-0", + "sql": "CREATE DATABASE db_test_delete" + }, + { + "slice": "slice-0", + "sql": "USE db_test_delete" + }, + { + "slice": "slice-0", + "sql": "CREATE TABLE tbl1 (id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(50), age INT)" + }, + { + "slice": "slice-0", + "sql": "CREATE TABLE tbl2 (id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(50), age INT, ref_id INT)" + } + ], + "gaeaActions": [ + { + "sql": "USE db_test_delete", + "execType": "Default" + }, + { + "sql": "INSERT INTO tbl1 (name, age) VALUES ('User1', 30), ('User2', 29), ('User3', 28), ('User4', 27)", + "execType": "Default" + }, + { + "sql": "INSERT INTO tbl2 (name, age, ref_id) VALUES ('User1', 30, 1), ('User2', 29, 2), ('User3', 28, 3), ('User4', 27, 4)", + "execType": "Default" + }, + { + "sql": "DELETE FROM tbl1, tbl2 USING tbl1 INNER JOIN tbl2 ON tbl1.id = tbl2.id WHERE tbl2.age >= 26", + "execType": "Default" + } + ], + "masterCheckSQL": [ + { + "slice": "slice-0", + "db": "db_test_delete", + "name": "Check master after multi-table DELETE using USING for tbl1", + "sql": "SELECT * FROM tbl1", + "execType": "Query", + "expect": [] + }, + { + "slice": "slice-0", + "db": "db_test_delete", + "name": "Check master after multi-table DELETE using USING for tbl2", + "sql": "SELECT * FROM tbl2 WHERE name IN ('User4')", + "execType": "Query", + "expect": [] + } + ], + "tearDown": [ + { + "slice": "slice-0", + "sql": "DROP DATABASE IF EXISTS db_test_delete" + } + ] + } + ] + } + diff --git a/tests/e2e/dml/case/insert.json b/tests/e2e/dml/case/insert.json new file mode 100644 index 00000000..0a1127f3 --- /dev/null +++ b/tests/e2e/dml/case/insert.json @@ -0,0 +1,113 @@ +{ + "execCases": [ + { + "description": "Test basic insert operations and their validations", + "setUp": [ + { + "slice": "slice-0", + "sql": "DROP DATABASE IF EXISTS db_test_insert" + }, + { + "slice": "slice-0", + "sql": "CREATE DATABASE db_test_insert" + }, + { + "slice": "slice-0", + "sql": "USE db_test_insert" + }, + { + "slice": "slice-0", + "sql": "CREATE TABLE tbl_test_insert (id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(50), age INT, UNIQUE KEY unique_name (name))" + } + ], + "gaeaActions": [ + { + "sql": "USE db_test_insert", + "execType": "Default" + }, + { + "sql": "INSERT INTO tbl_test_insert (name, age) VALUES ('User1', 30)", + "execType": "Default" + }, + { + "sql": "INSERT LOW_PRIORITY INTO tbl_test_insert (name, age) VALUES ('User2', 25)", + "execType": "Default" + }, + { + "sql": "INSERT IGNORE INTO tbl_test_insert (name, age) VALUES ('User1', 31)", + "execType": "Default" + }, + { + "sql": "INSERT INTO tbl_test_insert SET name = 'User3', age = 20", + "execType": "Default" + }, + { + "sql": "INSERT INTO tbl_test_insert (name, age) VALUES ('User1', 32) ON DUPLICATE KEY UPDATE age = 32", + "execType": "Default" + }, + { + "sql": "INSERT INTO tbl_test_insert (name, age) SELECT 'User4', age FROM tbl_test_insert WHERE name = 'User3'", + "execType": "Default" + } + ], + "masterCheckSQL": [ + { + "slice": "slice-0", + "db": "db_test_insert", + "name": "Check age for User1 after operations", + "sql": "SELECT age FROM tbl_test_insert WHERE name = 'User1'", + "execType": "Query", + "expect": [ + ["32"] + ] + }, + { + "slice": "slice-0", + "db": "db_test_insert", + "name": "Ensure User1's age is not 31", + "sql": "SELECT COUNT(*) FROM tbl_test_insert WHERE name = 'User1' AND age = 31", + "execType": "Query", + "expect": [ + ["0"] + ] + }, + { + "slice": "slice-0", + "db": "db_test_insert", + "name": "Check age for User2 after operations", + "sql": "SELECT age FROM tbl_test_insert WHERE name = 'User2'", + "execType": "Query", + "expect": [ + ["25"] + ] + }, + { + "slice": "slice-0", + "db": "db_test_insert", + "name": "Check age for User3 after operations", + "sql": "SELECT age FROM tbl_test_insert WHERE name = 'User3'", + "execType": "Query", + "expect": [ + ["20"] + ] + }, + { + "slice": "slice-0", + "db": "db_test_insert", + "name": "Check age for User4 after operations", + "sql": "SELECT age FROM tbl_test_insert WHERE name = 'User4'", + "execType": "Query", + "expect": [ + ["20"] + ] + } + ], + "tearDown": [ + { + "slice": "slice-0", + "sql": "DROP DATABASE IF EXISTS db_test_insert" + } + ] + } + ] +} diff --git a/tests/e2e/dml/case/replace.json b/tests/e2e/dml/case/replace.json new file mode 100644 index 00000000..cd95b871 --- /dev/null +++ b/tests/e2e/dml/case/replace.json @@ -0,0 +1,107 @@ +{ + "execCases": [ + { + "description": "Test replace operations", + "setUp": [ + { + "slice": "slice-0", + "sql": "DROP DATABASE IF EXISTS db_test_replace" + }, + { + "slice": "slice-0", + "sql": "CREATE DATABASE db_test_replace" + }, + { + "slice": "slice-0", + "sql": "USE db_test_replace" + }, + { + "slice": "slice-0", + "sql": "CREATE TABLE tbl_test_replace (id INT PRIMARY KEY, name VARCHAR(50), age INT)" + }, + { + "slice": "slice-0", + "sql": "CREATE TABLE tbl_temp_replace (id INT, name VARCHAR(50), age INT)" + } + ], + "gaeaActions": [ + { + "sql": "USE db_test_replace", + "execType": "Default" + }, + { + "sql": "INSERT INTO tbl_test_replace VALUES (1, 'User1', 35)", + "execType": "Default" + }, + { + "sql": "INSERT INTO tbl_temp_replace VALUES (1, 'User1', 35)", + "execType": "Default" + }, + { + "sql": "REPLACE INTO tbl_test_replace (id, name, age) VALUES (1, 'newUser1', 35)", + "execType": "Default" + }, + { + "sql": "REPLACE INTO tbl_test_replace SET id = 2, name = 'User2', age = 30", + "execType": "Default" + }, + { + "sql": "REPLACE INTO tbl_test_replace (id, name, age) SELECT id, name, age FROM tbl_temp_replace WHERE id = 1", + "execType": "Default" + }, + { + "sql": "REPLACE LOW_PRIORITY INTO tbl_test_replace SET id = 1, name = 'User1', age = 40", + "execType": "Default" + } + ], + "masterCheckSQL": [ + { + "slice": "slice-0", + "db": "db_test_replace", + "name": "Ensure User1's name is correctly replaced", + "sql": "SELECT name FROM tbl_test_replace WHERE id = 1", + "execType": "Query", + "expect": [ + ["User1"] + ] + }, + { + "slice": "slice-0", + "db": "db_test_replace", + "name": "Ensure User2's name remains unchanged", + "sql": "SELECT name FROM tbl_test_replace WHERE id = 2", + "execType": "Query", + "expect": [ + ["User2"] + ] + }, + { + "slice": "slice-0", + "db": "db_test_replace", + "name": "Check replace with SELECT statement", + "sql": "SELECT name FROM tbl_test_replace WHERE id = 1", + "execType": "Query", + "expect": [ + ["User1"] + ] + }, + { + "slice": "slice-0", + "db": "db_test_replace", + "name": "Check replace with LOW_PRIORITY keyword", + "sql": "SELECT age FROM tbl_test_replace WHERE id = 1", + "execType": "Query", + "expect": [ + ["40"] + ] + } + ], + "tearDown": [ + { + "slice": "slice-0", + "sql": "DROP TABLE IF EXISTS db_test_replace" + } + ] + } + ] +} diff --git a/tests/e2e/dml/case/select.json b/tests/e2e/dml/case/select.json new file mode 100644 index 00000000..27beb866 --- /dev/null +++ b/tests/e2e/dml/case/select.json @@ -0,0 +1,211 @@ +{ + "execCases": [ + { + "description": "Testing SELECT variations", + "setUp": [ + { + "slice": "slice-0", + "sql": "DROP DATABASE IF EXISTS db_test_select" + }, + { + "slice": "slice-0", + "sql": "CREATE DATABASE db_test_select" + }, + { + "slice": "slice-0", + "sql": "USE db_test_select" + }, + { + "slice": "slice-0", + "sql": "CREATE TABLE tbl_test (id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(50), age INT, score FLOAT)" + }, + { + "slice": "slice-0", + "sql": "CREATE TABLE tbl_another (id INT PRIMARY KEY AUTO_INCREMENT, user_id INT, description TEXT)" + }, + { + "slice": "slice-0", + "sql": "CREATE TABLE t_order (order_id INT PRIMARY KEY AUTO_INCREMENT, user_id INT, order_description VARCHAR(255))" + }, + { + "slice": "slice-0", + "sql": "CREATE TABLE t_order_item (item_id INT PRIMARY KEY AUTO_INCREMENT, order_id INT, product_name VARCHAR(255), user_id INT)" + } + ], + "gaeaActions": [ + { + "sql": "USE db_test_select", + "execType": "Default" + }, + { + "sql": "INSERT INTO tbl_test (name, age, score) VALUES ('User1', 30, 80.5), ('User2', 20, 72.0), ('User3', 10, 90.2)", + "execType": "Default" + }, + { + "sql": "INSERT INTO tbl_another (user_id, description) VALUES (1, 'Description for User1')", + "execType": "Default" + }, + { + "sql": "SELECT name FROM tbl_test WHERE age =30 GROUP BY name", + "execType": "Default" + }, + { + "sql": "SELECT DISTINCT name FROM tbl_test WHERE age = 20 GROUP BY name", + "execType": "Default" + }, + { + "sql": "SELECT name FROM tbl_test WHERE age =10 GROUP BY name HAVING name = 'User3'", + "execType": "Default" + }, + { + "sql": "SELECT name, AVG(score) as avg_score FROM tbl_test WHERE age = 10 GROUP BY name ORDER BY avg_score DESC LIMIT 5 OFFSET 0", + "execType": "Default" + }, + { + "sql": "SELECT DISTINCTROW name FROM tbl_test WHERE age = 10", + "execType": "Default" + }, + { + "sql": "SELECT HIGH_PRIORITY name FROM tbl_test WHERE age = 10", + "execType": "Default" + }, + { + "sql": "SELECT STRAIGHT_JOIN t.name FROM tbl_test t JOIN tbl_another a ON t.id = a.user_id", + "execType": "Default" + }, + { + "sql": "SELECT name FROM tbl_test WHERE age = 10 LOCK IN SHARE MODE", + "execType": "Default" + }, + { + "sql": "INSERT INTO t_order (user_id, order_description) VALUES (1, 'Order 1'), (2, 'Order 2')", + "execType": "Default" + }, + { + "sql": "INSERT INTO t_order_item (order_id, product_name, user_id) VALUES (1, 'Product A', 1), (2, 'Product B', 2)", + "execType": "Default" + }, + { + "sql": "SELECT product_name FROM t_order o INNER JOIN t_order_item i ON o.order_id = i.order_id WHERE o.order_id = 1", + "execType": "Default" + }, + { + "sql": "SELECT product_name FROM t_order o LEFT JOIN t_order_item i ON o.order_id = i.order_id WHERE o.order_id = 1", + "execType": "Default" + }, + { + "sql": "SELECT product_name FROM t_order o RIGHT JOIN t_order_item i ON o.order_id = i.order_id WHERE o.order_id = 1", + "execType": "Default" + } + ], + "masterCheckSQL": [ + { + "slice": "slice-0", + "db": "db_test_select", + "name": "Check result for GROUP BY", + "sql": "SELECT name FROM tbl_test WHERE age =30 GROUP BY name", + "execType": "Query", + "expect": [ + ["User1"] + ] + }, + { + "slice": "slice-0", + "db": "db_test_select", + "name": "Check result for DISTINCT GROUP BY", + "sql": "SELECT DISTINCT name FROM tbl_test WHERE age = 20 GROUP BY name", + "execType": "Query", + "expect": [ + ["User2"] + ] + }, + { + "slice": "slice-0", + "db": "db_test_select", + "name": "Check result for DISTINCT GROUP BY HAVING", + "sql": "SELECT name FROM tbl_test WHERE age =10 GROUP BY name HAVING name = 'User3'", + "execType": "Query", + "expect": [ + ["User3"] + ] + }, + { + "slice": "slice-0", + "db": "db_test_select", + "name": "Check result for GROUP BY ORDER BY LIMIT OFFSET", + "sql": "SELECT name FROM tbl_test WHERE age = 10", + "execType": "Query", + "expect": [ + ["User3"] + ] + }, + { + "slice": "slice-0", + "db": "db_test_select", + "name": "Check result for DISTINCTROW", + "sql": "SELECT DISTINCTROW name FROM tbl_test WHERE age = 10", + "execType": "Query", + "expect": [ + ["User3"] + ] + }, + { + "slice": "slice-0", + "db": "db_test_select", + "name": "Check result for HIGH_PRIORITY", + "sql": "SELECT HIGH_PRIORITY name FROM tbl_test WHERE age = 10", + "execType": "Query", + "expect": [ + ["User3"] + ] + }, + { + "slice": "slice-0", + "db": "db_test_select", + "name": "Check result for STRAIGHT_JOIN", + "sql": "SELECT STRAIGHT_JOIN t.name FROM tbl_test t JOIN tbl_another a ON t.id = a.user_id", + "execType": "Query", + "expect": [ + ["User1"] + ] + }, + { + "slice": "slice-0", + "db": "db_test_select", + "name": "Check result for LOCK IN SHARE MODE (1)", + "sql": "SELECT name FROM tbl_test WHERE age = 10 LOCK IN SHARE MODE", + "execType": "Query", + "expect": [ + ["User3"] + ] + }, + { + "slice": "slice-0", + "db": "db_test_select", + "name": "Check result for LOCK IN SHARE MODE (2)", + "sql": "SELECT name FROM tbl_test WHERE age = 10 LOCK IN SHARE MODE", + "execType": "Query", + "expect": [ + ["User3"] + ] + }, + { + "slice": "slice-0", + "db": "db_test_select", + "name": "Check result for INNER JOIN", + "sql": "SELECT product_name FROM t_order o INNER JOIN t_order_item i ON o.order_id = i.order_id WHERE o.order_id = 1", + "execType": "Query", + "expect": [ + ["Product A"] + ] + } + ], + "tearDown": [ + { + "slice": "slice-0", + "sql": "DROP DATABASE IF EXISTS db_test_select" + } + ] + } + ] +} diff --git a/tests/e2e/dml/case/sql.json b/tests/e2e/dml/case/sql.json new file mode 100644 index 00000000..26f3d581 --- /dev/null +++ b/tests/e2e/dml/case/sql.json @@ -0,0 +1,58 @@ +{ + "execCases": [ + { + "description": "Test case 1 description", + "setUp": [ + { + "slice": "slice-0", + "sql": "DROP DATABASE IF EXISTS db_test" + }, + { + "slice": "slice-0", + "sql": "CREATE DATABASE db_test" + }, + { + "slice": "slice-0", + "sql": "USE db_test" + }, + { + "slice": "slice-0", + "sql": "CREATE TABLE tbl_users (col1 INT AUTO_INCREMENT, col2 VARCHAR(20), PRIMARY KEY (col1))" + } + ], + "gaeaActions": [ + { + "sql":"USE db_test", + "execType": "Default" + }, + { + "sql": "INSERT INTO tbl_users (col2) VALUES ('test')", + "execType": "Default" + }, + { + "sql": "UPDATE tbl_users SET col2='updated' WHERE col1=1", + "execType": "Default" + } + ], + "masterCheckSQL": [ + { + "slice": "slice-0", + "db": "db_test", + "name": "Check master after insert and update", + "sql": "SELECT col2 FROM tbl_users WHERE col1=1", + "execType": "Query", + "expect": [ + ["updated"] + ] + } + ], + "tearDown": [ + { + "slice": "slice-0", + "sql": "DROP DATABASE IF EXISTS db_test" + } + ] + } + ] + } + diff --git a/tests/e2e/dml/case/update.json b/tests/e2e/dml/case/update.json new file mode 100644 index 00000000..530a1a37 --- /dev/null +++ b/tests/e2e/dml/case/update.json @@ -0,0 +1,95 @@ +{ + "execCases": [ + { + "description": "Testing UPDATE LOW_PRIORITY IGNORE", + "setUp": [ + { + "slice": "slice-0", + "sql": "DROP DATABASE IF EXISTS db_test_update" + }, + { + "slice": "slice-0", + "sql": "CREATE DATABASE db_test_update" + }, + { + "slice": "slice-0", + "sql": "USE db_test_update" + }, + { + "slice": "slice-0", + "sql": "CREATE TABLE tbl_test_update (id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(50), age INT, score FLOAT)" + } + ], + "gaeaActions": [ + { + "sql": "USE db_test_update", + "execType": "Default" + }, + { + "sql": "INSERT INTO tbl_test_update (name, age, score) VALUES ('User1', 30, 80.0), ('User2', 31, 70.0)", + "execType": "Default" + }, + { + "sql": "UPDATE LOW_PRIORITY IGNORE tbl_test_update SET age = 31 WHERE id = 1", + "execType": "Default" + }, + { + "sql": "UPDATE tbl_test_update SET name = 'newUser1' WHERE id = 1", + "execType": "Default" + }, + { + "sql": "UPDATE tbl_test_update SET score = 80.0 WHERE name = 'User2' ORDER BY score DESC LIMIT 1", + "execType": "Default" + } + ], + "masterCheckSQL": [ + { + "slice": "slice-0", + "db": "db_test_update", + "name": "Check result for LOW_PRIORITY IGNORE", + "sql": "SELECT age FROM tbl_test_update WHERE name = 'newUser1'", + "execType": "Query", + "expect": [ + ["31"] + ] + }, + { + "slice": "slice-0", + "db": "db_test_update", + "name": "Ensure User2's age remains unchanged", + "sql": "SELECT age FROM tbl_test_update WHERE id = 2", + "execType": "Query", + "expect": [ + ["31"] + ] + }, + { + "slice": "slice-0", + "db": "db_test_update", + "name": "Check result for ORDER BY LIMIT", + "sql": "SELECT score FROM tbl_test_update WHERE name = 'User2'", + "execType": "Query", + "expect": [ + ["80"] + ] + }, + { + "slice": "slice-0", + "db": "db_test_update", + "name": "Ensure User1's name is correctly updated", + "sql": "SELECT name FROM tbl_test_update WHERE id = 1", + "execType": "Query", + "expect": [ + ["newUser1"] + ] + } + ], + "tearDown": [ + { + "slice": "slice-0", + "sql": "DROP DATABASE IF EXISTS db_test_update" + } + ] + } + ] +} diff --git a/tests/e2e/dml/dml_set.go b/tests/e2e/dml/dml_set.go new file mode 100644 index 00000000..3d14f749 --- /dev/null +++ b/tests/e2e/dml/dml_set.go @@ -0,0 +1,429 @@ +// Copyright 2024 The Gaea Authors. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package dml + +import ( + "database/sql" + "fmt" + + "github.com/XiaoMi/Gaea/tests/e2e/config" + "github.com/XiaoMi/Gaea/tests/e2e/util" + "github.com/onsi/ginkgo/v2" +) + +// This Ginkgo test suite validates the correct setting and behavior of session variables within a database context, +// focusing on DML operations and session controls. +// It ensures that changes to session-specific variables, +// such as SQL modes and transaction read/write settings, are enforced correctly and affect database operations as expected. +// The tests cover various scenarios including the enforcement of SQL standards, limits on SQL select queries, and settings that govern data modification permissions within a session. +// This suite helps verify that the database handles session settings correctly, providing a robust environment for further application-specific testing. +// BeforeEach and AfterEach are defined directly inside the Describe block, +// but outside the Context block. This means that they will be executed for all It blocks inside Describe blocks, +// including those inside any Context blocks. No matter what level of Context these It blocks are located in, +// BeforeEach and AfterEach will be called before and after each It block runs. +// e2eMgr.Clean() will clean the connection of each open gaea, so make sure that each ginkgo.It uses an independent gaea connection +var _ = ginkgo.Describe("test dml set variables", func() { + e2eMgr := config.NewE2eManager() + db := config.DefaultE2eDatabase + slice := e2eMgr.NsSlices[config.SliceSingleMaster] + table := config.DefaultE2eTable + ginkgo.BeforeEach(func() { + initNs, err := config.ParseNamespaceTmpl(config.DefaultNamespaceTmpl, slice) + util.ExpectNoError(err, "parse namespace template") + initNs.Name = "test_dml_variables" + for i := 0; i < len(initNs.Users); i++ { + initNs.Users[i].Namespace = initNs.Name + } + for i := 0; i < len(initNs.Slices); i++ { + initNs.Slices[i].Capacity = 1 + initNs.Slices[i].MaxCapacity = 3 + } + + err = e2eMgr.ModifyNamespace(initNs) + util.ExpectNoError(err, "create namespace") + masterAdminConn, err := slice.GetMasterAdminConn(0) + util.ExpectNoError(err, "get master admin conn") + err = util.SetupDatabaseAndInsertData(masterAdminConn, db, table) + util.ExpectNoError(err, "setup database and insert data") + }) + ginkgo.Context("test set session variables take effect", func() { + gaeaRWConn, err := e2eMgr.GetReadWriteGaeaUserConn() + gaeaRWConn.SetMaxOpenConns(1) + gaeaRWConn.SetMaxIdleConns(1) + util.ExpectNoError(err, "get gaea read write conn when test set session variables take effect") + ginkgo.It("set sql_mode", func() { + testExecCase := []struct { + sqlMode string + sql []string + expectErr []bool + }{ + { + sqlMode: "STRICT_TRANS_TABLES", + sql: []string{ + fmt.Sprintf("insert into %s.%s(name) values('%s')", db, table, "abcdefghijklmnopqrstuvwxyz"), + fmt.Sprintf("insert into %s.%s(name) values('%s')", db, table, "abcdefghijk"), + }, + expectErr: []bool{true, false}, + }, + } + + for _, tt := range testExecCase { + _, err := gaeaRWConn.Exec(fmt.Sprintf("set sql_mode='%s'", tt.sqlMode)) + util.ExpectNoError(err, fmt.Sprintf("set sql_mode='%s'", tt.sqlMode)) + for i := 0; i < len(tt.sql); i++ { + _, err := gaeaRWConn.Exec(tt.sql[i]) + if tt.expectErr[i] { + util.ExpectError(err, fmt.Sprintf("exec sql: %s", tt.sql[i])) + continue + } + util.ExpectNoError(err, fmt.Sprintf("exec sql: %s", tt.sql[i])) + } + } + + testQueryCase := []struct { + sqlMode string + sql []string + expectRes string + expectErr []bool + }{ + { + sqlMode: "set sql_mode=ANSI_QUOTES", + sql: []string{ + `show variables like "sql_mode"`, + }, + expectErr: []bool{true}, + }, + { + sqlMode: `set sql_mode=REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE( + @@sql_mode, + "STRICT_ALL_TABLES,", ""), + ",STRICT_ALL_TABLES", ""), + "STRICT_ALL_TABLES", ""), + "STRICT_TRANS_TABLES,", ""), + ",STRICT_TRANS_TABLES",""), + "STRICT_TRANS_TABLES", "")`, + sql: []string{ + `show variables like "sql_mode"`, + }, + expectRes: `NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION`, + expectErr: []bool{false}, + }, + } + + for _, tt := range testQueryCase { + gaeaRWConn, err := e2eMgr.GetReadWriteGaeaUserConn() + _, err = gaeaRWConn.Exec(tt.sqlMode) + util.ExpectNoError(err, fmt.Sprintf("set sql_mode=%s", tt.sqlMode)) + for i := 0; i < len(tt.sql); i++ { + _, err := gaeaRWConn.Query(tt.sql[i]) + if tt.expectErr[i] { + util.ExpectError(err, fmt.Sprintf("exec sql: %s", tt.sql[i])) + continue + } + checkFunc(gaeaRWConn, tt.sql[i], tt.expectRes) + } + } + }) + + ginkgo.It("set session sql_select_limit", func() { + gaeaRWConn, err := e2eMgr.GetReadWriteGaeaUserConn() + gaeaRWConn.SetMaxOpenConns(1) + gaeaRWConn.SetMaxIdleConns(1) + util.ExpectNoError(err, "get gaea read write conn when set session sql_select_limit") + testQueryCase := []struct { + setSQL string + sql []string + expectErr []bool + resultLen []int + }{ + { + setSQL: "set SQL_SELECT_LIMIT=default", + sql: []string{ + fmt.Sprintf("select * from %s.%s", db, table), + fmt.Sprintf("select * from %s.%s limit 1", db, table), + }, + expectErr: []bool{false, false}, + resultLen: []int{10, 1}, + }, + { + setSQL: "set SQL_SELECT_LIMIT=2", + sql: []string{ + fmt.Sprintf("select * from %s.%s", db, table), + fmt.Sprintf("select * from %s.%s limit 1", db, table), + }, + expectErr: []bool{false, false}, + resultLen: []int{2, 1}, + }, + } + + for _, tt := range testQueryCase { + _, err := gaeaRWConn.Exec(tt.setSQL) + util.ExpectNoError(err, fmt.Sprintf("set sql_mode='%s'", tt.setSQL)) + for i := 0; i < len(tt.sql); i++ { + res, err := gaeaRWConn.Query(tt.sql[i]) + if tt.expectErr[i] { + util.ExpectError(err, fmt.Sprintf("exec sql: %s", tt.sql[i])) + continue + } + util.ExpectNoError(err, fmt.Sprintf("exec sql: %s", tt.sql[i])) + count := 0 + for res.Next() { + count++ + } + util.ExpectEqual(count, tt.resultLen[i], fmt.Sprintf("exec sql: %s", tt.sql[i])) + } + } + }) + + ginkgo.It("set session read write", func() { + gaeaRWConn, err := e2eMgr.GetReadWriteGaeaUserConn() + gaeaRWConn.SetMaxOpenConns(1) + gaeaRWConn.SetMaxIdleConns(1) + util.ExpectNoError(err, "get gaea read write conn when set session read write") + testExecCase := []struct { + setSQL string + sql []string + expectErr []bool + }{ + { + setSQL: "set session transaction read only", + sql: []string{ + fmt.Sprintf("insert into %s.%s(name) values('%s')", db, table, "a"), + fmt.Sprintf("select * from %s.%s", db, table), + }, + expectErr: []bool{true, false}, + }, + { + setSQL: "set session transaction read write", + sql: []string{ + fmt.Sprintf("insert into %s.%s(name) values('%s')", db, table, "b"), + fmt.Sprintf("select * from %s.%s", db, table), + }, + expectErr: []bool{false, false}, + }, + } + + for _, tt := range testExecCase { + _, err := gaeaRWConn.Exec(tt.setSQL) + util.ExpectNoError(err, fmt.Sprintf("set sql_mode='%s'", tt.setSQL)) + for i := 0; i < len(tt.sql); i++ { + _, err := gaeaRWConn.Exec(tt.sql[i]) + if tt.expectErr[i] { + util.ExpectError(err, fmt.Sprintf("exec sql: %s.", tt.sql[i])) + continue + } + util.ExpectNoError(err, fmt.Sprintf("exec sql: %s", tt.sql[i])) + } + } + + testQueryCase := []struct { + sqlMode string + sql []string + expectErr []bool + }{ + { + sqlMode: "ANSI_QUOTES", + sql: []string{ + `show variables like "sql_mode"`, + }, + expectErr: []bool{true}, + }, + } + + for _, tt := range testQueryCase { + _, err := gaeaRWConn.Exec(fmt.Sprintf("set sql_mode='%s'", tt.sqlMode)) + util.ExpectNoError(err, fmt.Sprintf("set sql_mode='%s'", tt.sqlMode)) + for i := 0; i < len(tt.sql); i++ { + _, err := gaeaRWConn.Query(tt.sql[i]) + if tt.expectErr[i] { + util.ExpectError(err, fmt.Sprintf("exec sql: %s", tt.sql[i])) + continue + } + util.ExpectNoError(err, fmt.Sprintf("exec sql: %s", tt.sql[i])) + } + } + }) + + ginkgo.It("set session timezone in different session, maybe use same backend connection", func() { + sqlCases := []struct { + GaeaSQL string + CheckSQL string + CheckTimes int + ExpectRes string + }{ + { + GaeaSQL: `/*!40103 SET TIME_ZONE='+00:00' */`, + CheckSQL: `show variables like "time_zone"`, + CheckTimes: 5, + ExpectRes: "+00:00", + }, + { + GaeaSQL: `/*!40103 SET TIME_ZONE='+01:00' */`, + CheckSQL: `show variables like "time_zone"`, + CheckTimes: 5, + ExpectRes: "+01:00", + }, + { + GaeaSQL: `/*!40103 SET TIME_ZONE='+02:00' */`, + CheckSQL: `show variables like "time_zone"`, + CheckTimes: 5, + ExpectRes: "+02:00", + }, + { + GaeaSQL: `/*!40103 SET TIME_ZONE='+03:00' */`, + CheckSQL: `show variables like "time_zone"`, + CheckTimes: 5, + ExpectRes: "+03:00", + }, + { + GaeaSQL: `/*!40103 SET TIME_ZONE='+04:00' */`, + CheckSQL: `show variables like "time_zone"`, + CheckTimes: 5, + ExpectRes: "+04:00", + }, + } + + for _, sqlCase := range sqlCases { + gaeaConn, err := e2eMgr.GetReadWriteGaeaUserConn() + util.ExpectNoError(err) + _, err = gaeaConn.Exec(sqlCase.GaeaSQL) + util.ExpectNoError(err) + err = checkFunc(gaeaConn, sqlCase.CheckSQL, sqlCase.ExpectRes) + util.ExpectNoError(err) + for i := 0; i < sqlCase.CheckTimes; i++ { + newGaeaConn, err := e2eMgr.GetReadWriteGaeaUserConn() + util.ExpectNoError(err) + err = checkFunc(newGaeaConn, sqlCase.CheckSQL, "SYSTEM") + util.ExpectNoError(err) + } + } + }) + + ginkgo.It("set session tx_read_only and transaction_read_only", func() { + sqlCases := []struct { + GaeaSQL string + CheckSQL string + ExpectRes string + }{ + { + GaeaSQL: `set @@tx_read_only=off`, + CheckSQL: `show variables like "tx_read_only"`, + ExpectRes: "OFF", + }, + { + GaeaSQL: `set @@tx_read_only=on`, + CheckSQL: `show variables like "tx_read_only"`, + ExpectRes: "ON", + }, + { + GaeaSQL: `set @@transaction_read_only=off`, + CheckSQL: `show variables like "transaction_read_only"`, + ExpectRes: "OFF", + }, + { + GaeaSQL: `set @@transaction_read_only=on`, + CheckSQL: `show variables like "transaction_read_only"`, + ExpectRes: "ON", + }, + } + + for _, sqlCase := range sqlCases { + gaeaConn, err := e2eMgr.GetReadWriteGaeaUserConn() + util.ExpectNoError(err) + _, err = gaeaConn.Exec(sqlCase.GaeaSQL) + util.ExpectNoError(err) + err = checkFunc(gaeaConn, sqlCase.CheckSQL, sqlCase.ExpectRes) + util.ExpectNoError(err) + } + }) + + ginkgo.It("set character_set_client binary test", func() { + sqlCases := []struct { + GaeaSQL string + CheckSQL string + ExpectRes string + }{ + { + GaeaSQL: `set character_set_client=binary`, + CheckSQL: `show variables like "character_set_client"`, + ExpectRes: "binary", + }, + { + GaeaSQL: `set character_set_connection=utf8, character_set_results=utf8, character_set_client=binary`, + CheckSQL: `show variables like "character_set_connection"`, + ExpectRes: "utf8", + }, + } + + for _, sqlCase := range sqlCases { + gaeaConn, err := e2eMgr.GetReadWriteGaeaUserConn() + util.ExpectNoError(err) + _, err = gaeaConn.Exec(sqlCase.GaeaSQL) + util.ExpectNoError(err) + err = checkFunc(gaeaConn, sqlCase.CheckSQL, sqlCase.ExpectRes) + util.ExpectNoError(err) + } + }) + + ginkgo.It("set some SQL statements with syntax errors", func() { + sqlCases := []struct { + GaeaSQL string + CheckSQL string + ExpectRes string + }{ + { + GaeaSQL: `/*!40101 SET @@SQL_MODE := @OLD_SQL_MODE, @@SQL_QUOTE_SHOW_CREATE := @OLD_QUOTE */`, + CheckSQL: `select @@SQL_MODE`, + ExpectRes: "", + }, + } + for _, sqlCase := range sqlCases { + gaeaConn, err := e2eMgr.GetReadWriteGaeaUserConn() + util.ExpectNoError(err) + _, err = gaeaConn.Exec(sqlCase.GaeaSQL) + util.ExpectNoError(err) + // 不检测结果,只验证释放能够继续执行 + _, err = gaeaConn.Exec(sqlCase.CheckSQL) + util.ExpectNoError(err) + } + }) + }) + ginkgo.AfterEach(func() { + e2eMgr.Clean() + }) +}) + +func checkFunc(db *sql.DB, sqlStr string, value string) error { + rows, err := db.Query(sqlStr) + if err != nil { + if err == sql.ErrNoRows { + return nil + } + return fmt.Errorf("db Exec Error %v", err) + } + defer rows.Close() + + for rows.Next() { + var variableName string + var variableValue string + err = rows.Scan(&variableName, &variableValue) + if value == variableValue { + return nil + } + return fmt.Errorf("mismatch. Actual: %v, Expect: %v", variableValue, value) + } + + return nil +} diff --git a/tests/e2e/dml/dml_set_invalid.go b/tests/e2e/dml/dml_set_invalid.go new file mode 100644 index 00000000..7821e9fb --- /dev/null +++ b/tests/e2e/dml/dml_set_invalid.go @@ -0,0 +1,112 @@ +// Copyright 2024 The Gaea Authors. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package dml + +import ( + "database/sql" + "time" + + "github.com/XiaoMi/Gaea/tests/e2e/config" + "github.com/XiaoMi/Gaea/tests/e2e/util" + "github.com/onsi/ginkgo/v2" +) + +// Test SET Invalid Value to Session Variables +// This test suite verifies the system's handling of invalid session variable values. +// Specifically, it focuses on how the system reacts when an invalid sql_mode is set for a session. + +// The core test checks the following: +// 1. Establish a connection to Gaea with read-write permissions. +// 2. Retrieve the default sql_mode from the session. +// 3. Attempt to set an invalid sql_mode value and expect the system to handle it without crashing or applying the invalid value. +// 4. Verify that the system does not apply the invalid value and continues to operate normally. + +// The test ensures robust error handling by: +// - An error is expected on the first query after setting an invalid sql_mode. +// - Confirming that no lasting changes are made to the sql_mode after the error. +// - Ensure that subsequent SQL requests are processed normally + +// Cleanup after each test: +// - Resetting modifications and cleaning up resources to ensure isolation between tests. +var _ = ginkgo.Describe("Test SET Invalid Value to Session Variables", func() { + e2eMgr := config.NewE2eManager() + db := config.DefaultE2eDatabase + table := config.DefaultE2eTable + slice := e2eMgr.NsSlices[config.SliceSingleMaster] + // 获取默认的 SQL mode + getDefaultSQLMode := func(conn *sql.DB) (string, error) { + var sqlMode string + rows, err := conn.Query("SELECT @@SESSION.sql_mode;") + if err != nil { + return "", err + } + defer rows.Close() + + for rows.Next() { + err := rows.Scan(&sqlMode) + if err != nil { + return "", err + } + } + return sqlMode, nil + } + ginkgo.BeforeEach(func() { + // mysql prepare + masterAdminConn, err := slice.GetMasterAdminConn(0) + util.ExpectNoError(err) + err = util.SetupDatabaseAndInsertData(masterAdminConn, db, table) + util.ExpectNoError(err) + + // namespace prepare + initNs, err := config.ParseNamespaceTmpl(config.DefaultNamespaceTmpl, slice) + util.ExpectNoError(err, "parse namespace template") + + // modify namespace + err = e2eMgr.ModifyNamespace(initNs) + util.ExpectNoError(err) + // wait mysql data sync and namespace load + time.Sleep(3 * time.Millisecond) + }) + + ginkgo.Context("test set invalid sql_mode value", func() { + ginkgo.It("should handle invalid sql_mode setting and fall back to default value", func() { + // Get connection + gaeaConn, err := e2eMgr.GetReadWriteGaeaUserConn() + util.ExpectNoError(err) + + //Try to get the default sql_mode + defaultMode, err := getDefaultSQLMode(gaeaConn) + util.ExpectNoError(err, "Expected error when getting default sql_mode") + + // Attempt to set invalid sql_mode + _, err = gaeaConn.Exec("SET SESSION sql_mode = 'aaa';") + util.ExpectNoError(err, "Expected error when setting an invalid sql_mode") + + // An error occurred during the first query + _, err = getDefaultSQLMode(gaeaConn) + util.ExpectError(err) + + // No error occurred during the second query + setMode, err := getDefaultSQLMode(gaeaConn) + util.ExpectNoError(err) + util.ExpectEqual(defaultMode, setMode) + + }) + }) + + ginkgo.AfterEach(func() { + e2eMgr.Clean() + }) +}) diff --git a/tests/e2e/e2e_test.go b/tests/e2e/e2e_test.go new file mode 100644 index 00000000..bf8aeada --- /dev/null +++ b/tests/e2e/e2e_test.go @@ -0,0 +1,64 @@ +// Copyright 2024 The Gaea Authors. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package e2e + +import ( + "testing" + "time" + + "github.com/XiaoMi/Gaea/tests/e2e/util" + + _ "github.com/XiaoMi/Gaea/tests/e2e/dml" + _ "github.com/XiaoMi/Gaea/tests/e2e/function" + _ "github.com/XiaoMi/Gaea/tests/e2e/shard" + _ "github.com/XiaoMi/Gaea/tests/e2e/unshard" + "github.com/onsi/ginkgo/v2" + "github.com/onsi/gomega" +) + +func TestE2E(t *testing.T) { + if testing.Short() { + t.Skip("skipping e2e test in short mode.") + } + gomega.RegisterFailHandler(ginkgo.Fail) + ginkgo.RunSpecs(t, "gaea E2E Testing") +} + +var _ = ginkgo.BeforeSuite(func() { + ginkgo.By("start gaea default.") + err := util.StartGaeaDefault() + util.ExpectNoError(err) + time.Sleep(5 * time.Second) + ginkgo.By("start gaea default success.") + + ginkgo.By("start gaea-cc default.") + err = util.StartGaeaCCDefault() + util.ExpectNoError(err) + time.Sleep(5 * time.Second) + ginkgo.By("start gaea-cc default success.") +}) + +var _ = ginkgo.AfterSuite(func() { + ginkgo.By("stop gaea-cc default.") + err := util.StopGaeaCCDefault() + util.ExpectNoError(err) + ginkgo.By("stop gaea-cc default success.") + + ginkgo.By("stop gaea default.") + err = util.StopGaeaDefault() + util.ExpectNoError(err) + ginkgo.By("stop gaea default success.") + +}) diff --git a/tests/e2e/function/auth_plugin.go b/tests/e2e/function/auth_plugin.go new file mode 100644 index 00000000..e1b9bc9d --- /dev/null +++ b/tests/e2e/function/auth_plugin.go @@ -0,0 +1,121 @@ +// Copyright 2024 The Gaea Authors. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package function + +import ( + "fmt" + "time" + + "github.com/XiaoMi/Gaea/tests/e2e/config" + "github.com/XiaoMi/Gaea/tests/e2e/util" + "github.com/onsi/ginkgo/v2" +) + +// This test suite is designed to validate the integration of backend authentication plugins within the Gaea database middleware. +// The test scenarios include: +// 1. Creating a MySQL user with 'mysql_native_password', granting them select permissions, and configuring Gaea to recognize and authenticate using these credentials. +// 2. Similarly, setting up another user with 'sha256_password', which represents a more secure authentication mechanism, and ensuring Gaea can handle this advanced encryption during the authentication process. +// Each test: +// - Configures user credentials specific to the authentication method being tested. +// - Executes SQL commands to create and grant permissions to these users. +// - Modifies the Gaea namespace to utilize these new credentials. +// - Performs database queries to confirm that the connections are appropriately authenticated and operational. +// Overall, this testing strategy is crucial for verifying that Gaea's integration with MySQL authentication plugins is robust +var _ = ginkgo.Describe("test backend auth plugin", func() { + e2eMgr := config.NewE2eManager() + db := config.DefaultE2eDatabase + slice := e2eMgr.NsSlices[config.SliceSingleMaster] + table := config.DefaultE2eTable + masterAdminConn, err := slice.GetMasterAdminConn(0) + util.ExpectNoError(err, "get master admin conn") + initNs, err := config.ParseNamespaceTmpl(config.DefaultNamespaceTmpl, slice) + util.ExpectNoError(err, "parse namespace template") + ginkgo.BeforeEach(func() { + // data prepare + err = util.SetupDatabaseAndInsertData(masterAdminConn, db, table) + util.ExpectNoError(err, "setup database and insert data") + // namespace prepare + err = e2eMgr.DeleteNamespace(initNs.Name) + util.ExpectNoError(err, "delete namespace") + initNs.Name = "test_auth_plugin" + for i := 0; i < len(initNs.Users); i++ { + initNs.Users[i].Namespace = initNs.Name + } + err = e2eMgr.ModifyNamespace(initNs) + util.ExpectNoError(err, "create namespace") + // wait mysql data sync and namespace load + time.Sleep(3 * time.Millisecond) + + }) + ginkgo.Context("backend auth plugin", func() { + ginkgo.It("auth mysql_native_password", func() { + mysqlUser, mysqlPass := "native_user", "native_pass" + grantSql := fmt.Sprintf(`CREATE USER IF NOT EXISTS "%s"@'%%' IDENTIFIED WITH mysql_native_password BY "%s"`, mysqlUser, mysqlPass) + _, err = masterAdminConn.Exec(grantSql) + util.ExpectNoError(err, "create user") + grantSql2 := fmt.Sprintf(`GRANT SELECT ON %s.* TO "%s"@'%%'`, db, mysqlUser) + _, err = masterAdminConn.Exec(grantSql2) + util.ExpectNoError(err, "grant user") + ns := initNs + ns.Slices[0].UserName = mysqlUser + ns.Slices[0].Password = mysqlPass + err = e2eMgr.ModifyNamespace(ns) + util.ExpectNoError(err, "modify namespace") + // wait mysql data sync and namespace load + gaeaReadWriteConn, err := e2eMgr.GetReadWriteGaeaUserConn() + util.ExpectNoError(err, "get gaea read write conn") + rs, err := gaeaReadWriteConn.Query(fmt.Sprintf(`select count(*) from %s.%s`, db, table)) + util.ExpectNoError(err, "query") + for rs.Next() { + var count int + err = rs.Scan(&count) + util.ExpectNoError(err, "scan gaea result") + util.ExpectEqual(count, 10, "count") + } + }) + + ginkgo.It("auth sha256_password", func() { + mysqlUser, mysqlPass := "sha256_user", "sha256_pass" + backendSql := []string{ + fmt.Sprintf(`DROP USER IF EXISTS "%s"@'%%'`, mysqlUser), + fmt.Sprintf(`CREATE USER IF NOT EXISTS "%s"@'%%' IDENTIFIED WITH sha256_password BY "%s"`, mysqlUser, mysqlPass), + fmt.Sprintf(`GRANT SELECT ON %s.* TO "%s"@'%%'`, db, mysqlUser), + } + for _, sql := range backendSql { + _, err = masterAdminConn.Exec(sql) + util.ExpectNoError(err, "init sql", sql) + } + ns := initNs + ns.Slices[0].UserName = mysqlUser + ns.Slices[0].Password = mysqlPass + err = e2eMgr.ModifyNamespace(ns) + util.ExpectNoError(err, "modify namespace") + // wait mysql data sync and namespace load + gaeaReadWriteConn, err := e2eMgr.GetReadWriteGaeaUserConn() + util.ExpectNoError(err, "get gaea read write conn") + rs, err := gaeaReadWriteConn.Query(fmt.Sprintf(`select count(*) from %s.%s`, db, table)) + util.ExpectNoError(err, "query") + for rs.Next() { + var count int + err = rs.Scan(&count) + util.ExpectNoError(err, "scan gaea result") + util.ExpectEqual(count, 10, "count") + } + }) + }) + ginkgo.AfterEach(func() { + e2eMgr.Clean() + }) +}) diff --git a/tests/e2e/function/bad_conn.go b/tests/e2e/function/bad_conn.go new file mode 100644 index 00000000..430cf900 --- /dev/null +++ b/tests/e2e/function/bad_conn.go @@ -0,0 +1,106 @@ +// Copyright 2024 The Gaea Authors. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package function + +import ( + "database/sql" + "fmt" + "log" + "time" + + "github.com/XiaoMi/Gaea/tests/e2e/config" + "github.com/XiaoMi/Gaea/tests/e2e/util" + + "github.com/onsi/ginkgo/v2" +) + +// This test suite is designed to assess Gaea's handling of abrupt MySQL connection failures. +// It prepares a testing environment with necessary database setups and namespace configurations. +// The BeforeEach block initializes the database with data and configures the Gaea namespace to simulate controlled connection disruptions. +// The actual test, within the It block, executes a long-running SQL command (`select sleep(100)`) that is intentionally interrupted by killing the MySQL process handling the query. +// This test checks if Gaea correctly detects and reports the connection failure, with the expected error message ("Error 1105: connection was bad"). +// The goal is to ensure that Gaea provides accurate error feedback when database connections are forcibly terminated, which is critical for applications relying on stable database interactions. +// The AfterEach block ensures that the environment is cleaned up, removing any artifacts that may affect subsequent tests or system stability. +var _ = ginkgo.Describe("mysql bad connection test", func() { + e2eMgr := config.NewE2eManager() + db := config.DefaultE2eDatabase + slice := e2eMgr.NsSlices[config.SliceSingleMaster] + table := config.DefaultE2eTable + ginkgo.BeforeEach(func() { + // mysql prepare + masterAdminConn, err := slice.GetMasterAdminConn(0) + util.ExpectNoError(err) + err = util.SetupDatabaseAndInsertData(masterAdminConn, db, table) + util.ExpectNoError(err) + // namespace prepare + initNs, err := config.ParseNamespaceTmpl(config.DefaultNamespaceTmpl, slice) + util.ExpectNoError(err, "parse namespace template") + err = e2eMgr.ModifyNamespace(initNs) + util.ExpectNoError(err) + // wait mysql data sync and namespace load + time.Sleep(500 * time.Millisecond) + }) + + ginkgo.Context("test mysql bad connection", func() { + ginkgo.It("should handle test mysql bad connection correctly", func() { + gaeaConn, err := e2eMgr.GetWriteGaeaUserConn() + util.ExpectNoError(err) + + sqlCases := []struct { + TestSQL string + ExpectErr string + }{ + { + TestSQL: `select sleep(100)`, + ExpectErr: "invalid connection", + }, + } + + for _, sqlCase := range sqlCases { + masterAdminConn, err := slice.GetMasterAdminConn(0) + util.ExpectNoError(err) + go killMySQLProcess(sqlCase.TestSQL, masterAdminConn) + _, err = gaeaConn.Exec(sqlCase.TestSQL) + time.Sleep(500 * time.Millisecond) + util.ExpectEqual(err.Error(), sqlCase.ExpectErr) + } + }) + }) + + ginkgo.AfterEach(func() { + e2eMgr.Clean() + }) +}) + +func killMySQLProcess(sql string, mysqlConn *sql.DB) { + time.Sleep(time.Second) + rows, err := mysqlConn.Query("select ID from information_schema.processlist where INFO = ?", sql) + if err != nil { + log.Fatal(err) + } + defer rows.Close() + + for rows.Next() { + var id string + if err := rows.Scan(&id); err != nil { + log.Fatal(err) + } + + _, err := mysqlConn.Exec(fmt.Sprintf("KILL %s", id)) + if err != nil { + util.ExpectNoError(err) + } + } +} diff --git a/tests/e2e/function/basic_sqls.go b/tests/e2e/function/basic_sqls.go new file mode 100644 index 00000000..4a87447e --- /dev/null +++ b/tests/e2e/function/basic_sqls.go @@ -0,0 +1,254 @@ +// Copyright 2024 The Gaea Authors. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package function + +import ( + "database/sql" + "fmt" + "reflect" + "time" + + "github.com/go-sql-driver/mysql" + + "github.com/XiaoMi/Gaea/tests/e2e/config" + "github.com/XiaoMi/Gaea/tests/e2e/util" + + "github.com/onsi/ginkgo/v2" +) + +// This script, titled "Simple SQL Queries" is designed to verify basic SQL operations in a database system. +// It sets up a test environment and then performs a series of SQL commands such as SELECT, DELETE, UPDATE, and INSERT. +// The test checks if these operations yield the expected results, using a custom function checkFunc to validate the outcomes. +// This approach ensures the database system accurately processes and reflects changes made by standard SQL queries, highlighting its capability to handle essential database operations reliably. +var _ = ginkgo.Describe("simple sql test", func() { + e2eMgr := config.NewE2eManager() + db := config.DefaultE2eDatabase + slice := e2eMgr.NsSlices[config.SliceDualSlave] + table := config.DefaultE2eTable + ginkgo.BeforeEach(func() { + // mysql prepare + masterAdminConn, err := slice.GetMasterAdminConn(0) + util.ExpectNoError(err) + err = util.SetupDatabaseAndInsertData(masterAdminConn, db, table) + util.ExpectNoError(err) + // namespace prepare + initNs, err := config.ParseNamespaceTmpl(config.DefaultNamespaceTmpl, slice) + util.ExpectNoError(err, "parse namespace template") + err = e2eMgr.ModifyNamespace(initNs) + util.ExpectNoError(err) + // wait mysql data sync and namespace load + time.Sleep(500 * time.Millisecond) + }) + + ginkgo.Context("test basic sqls", func() { + ginkgo.It("should handle basic sqls orrectly", func() { + gaeaConn, err := e2eMgr.GetWriteGaeaUserConn() + util.ExpectNoError(err) + mysqlConn, err := slice.GetMasterAdminConn(0) + util.ExpectNoError(err) + + // 定义 SQL 测试用例 + sqlCases := []struct { + GaeaConn *sql.DB + GaeaSQL string + MasterConn *sql.DB + CheckSQL string + ExpectRes [][]string + ExpectErr error + }{ + { + GaeaConn: gaeaConn, + GaeaSQL: fmt.Sprintf("/*master*/ SELECT * FROM `%s`.`%s` WHERE `id`= 9", db, table), + MasterConn: mysqlConn, + CheckSQL: fmt.Sprintf("/*master*/ SELECT * FROM `%s`.`%s` WHERE `id`= 9", db, table), + ExpectRes: [][]string{ + {"9", "nameValue"}, + }, + }, + { + GaeaConn: gaeaConn, + GaeaSQL: fmt.Sprintf("DELETE FROM %s.%s WHERE id=1", db, table), + MasterConn: mysqlConn, + CheckSQL: fmt.Sprintf("SELECT * FROM %s.%s WHERE id=1", db, table), + ExpectRes: [][]string{}, + }, + { + GaeaConn: gaeaConn, + GaeaSQL: fmt.Sprintf("UPDATE %s.%s SET name='Tom' WHERE id=2", db, table), + MasterConn: mysqlConn, + CheckSQL: fmt.Sprintf("SELECT * FROM %s.%s WHERE id=2 AND name='Tom'", db, table), + ExpectRes: [][]string{{ + "2", "Tom", + }}, + }, + { + GaeaConn: gaeaConn, + GaeaSQL: fmt.Sprintf("INSERT INTO %s.%s (name) VALUES ('Alex')", db, table), + MasterConn: mysqlConn, + CheckSQL: fmt.Sprintf("SELECT * FROM %s.%s WHERE name='Alex'", db, table), + ExpectRes: [][]string{{ + "11", "Alex", + }}, + }, + { + GaeaConn: gaeaConn, + GaeaSQL: fmt.Sprintf("INSERT INTO %s.%s (id,name) VALUES (9,'Alex')", db, table), + MasterConn: mysqlConn, + ExpectErr: &mysql.MySQLError{ + Number: 1062, + Message: "Duplicate entry '9' for key 'PRIMARY'", + }, + }, + } + + // 执行 SQL 测试用例 + for _, sqlCase := range sqlCases { + _, err := sqlCase.GaeaConn.Exec(sqlCase.GaeaSQL) + if sqlCase.ExpectErr != nil { + util.ExpectEqual(err.Error(), sqlCase.ExpectErr.Error()) + continue + } + util.ExpectNoError(err) + err = checkFunc(sqlCase.MasterConn, sqlCase.CheckSQL, sqlCase.ExpectRes) + util.ExpectNoError(err) + + } + }) + }) + + ginkgo.Context("test select last_insert_id sql", func() { + ginkgo.It("should return last insert id correctly", func() { + gaeaConn, err := e2eMgr.GetWriteGaeaUserConn() + util.ExpectNoError(err) + + sqlCases := []struct { + GaeaSQL string + CheckSQL string + ExpectRes [][]string + ExceptColumnName []string + }{ + { + GaeaSQL: fmt.Sprintf("INSERT INTO %s.%s (id, name) VALUES (10001, 'Alex')", db, table), + CheckSQL: "select last_insert_id()", + ExpectRes: [][]string{ + {"10001"}, + }, + ExceptColumnName: []string{"last_insert_id()"}, + }, + { + GaeaSQL: fmt.Sprintf("INSERT INTO %s.%s (id, name) VALUES (10002, 'Alex')", db, table), + CheckSQL: "SELECT LAST_INSERT_ID()", + ExpectRes: [][]string{ + {"10002"}, + }, + ExceptColumnName: []string{"last_insert_id()"}, + }, + { + GaeaSQL: fmt.Sprintf("INSERT INTO %s.%s (id, name) VALUES (10003, 'Alex')", db, table), + CheckSQL: "SELECT LAST_INSERT_ID ()", + ExpectRes: [][]string{ + {"10003"}, + }, + ExceptColumnName: []string{"last_insert_id()"}, + }, + { + GaeaSQL: fmt.Sprintf("INSERT INTO %s.%s (id, name) VALUES (10004, 'Alex')", db, table), + CheckSQL: "select last_insert_id() as id", + ExpectRes: [][]string{ + {"10004"}, + }, + ExceptColumnName: []string{"id"}, + }, + { + GaeaSQL: fmt.Sprintf("INSERT INTO %s.%s (id, name) VALUES (10005, 'Alex')", db, table), + CheckSQL: "SELECT LAST_INSERT_ID () as id", + ExpectRes: [][]string{ + {"10005"}, + }, + ExceptColumnName: []string{"id"}, + }, + } + + for _, sqlCase := range sqlCases { + _, err := gaeaConn.Exec(sqlCase.GaeaSQL) + util.ExpectNoError(err) + err = checkFuncWithColumn(gaeaConn, sqlCase.CheckSQL, sqlCase.ExpectRes, sqlCase.ExceptColumnName) + util.ExpectNoError(err) + } + }) + }) + + ginkgo.AfterEach(func() { + e2eMgr.Clean() + }) +}) + +func checkFunc(db *sql.DB, sqlStr string, values [][]string) error { + rows, err := db.Query(sqlStr) + if err != nil { + if err == sql.ErrNoRows && len(values) == 0 { + return nil + } + return fmt.Errorf("db Exec Error %v", err) + } + defer rows.Close() + res, err := util.GetDataFromRows(rows) + if err != nil { + return fmt.Errorf("get data from rows error:%v", err) + } + // res为空代表没有查到数据 + if (len(res) == 0 || res == nil) && len(values) == 0 { + return nil + } + if !reflect.DeepEqual(values, res) { + return fmt.Errorf("mismatch. Actual: %v, Expect: %v", res, values) + } + return nil +} + +func checkFuncWithColumn(db *sql.DB, sqlStr string, values [][]string, exceptColumnNames []string) error { + rows, err := db.Query(sqlStr) + if err != nil { + if err == sql.ErrNoRows && len(values) == 0 { + return nil + } + return fmt.Errorf("db Exec Error %v", err) + } + defer rows.Close() + columns, res, err := util.GetColumnAbdDataFromRows(rows) + if err != nil { + return fmt.Errorf("get data from rows error:%v", err) + } + // res为空代表没有查到数据 + if (len(res) == 0 || res == nil) && len(values) == 0 { + return nil + } + if !reflect.DeepEqual(values, res) { + return fmt.Errorf("mismatch. Actual: %v, Expect: %v", res, values) + } + if len(columns) == 0 { + return fmt.Errorf("empty column") + } + if len(columns) != len(exceptColumnNames) { + return fmt.Errorf("err columns Actual: %v, Expect: %v", columns, exceptColumnNames) + } + for i := 0; i < len(columns); i++ { + fetchField := columns[i] + if fetchField != exceptColumnNames[i] { + return fmt.Errorf("err columns Actual: %s, Expect: %s", fetchField, exceptColumnNames[i]) + } + } + return nil +} diff --git a/tests/e2e/function/client_limit.go b/tests/e2e/function/client_limit.go new file mode 100644 index 00000000..d0089577 --- /dev/null +++ b/tests/e2e/function/client_limit.go @@ -0,0 +1,89 @@ +// Copyright 2024 The Gaea Authors. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package function + +import ( + "time" + + "github.com/XiaoMi/Gaea/tests/e2e/config" + "github.com/XiaoMi/Gaea/tests/e2e/util" + "github.com/onsi/ginkgo/v2" +) + +// This test script is designed to test the client connection limit functionality. +// It sets up a testing environment with a specified maximum number of client connections (10 in this case). +// The BeforeEach block configures a namespace and prepares a database for testing. +// The actual test, within the It block, attempts to create more connections (20) than the maximum allowed, and then checks if connections exceeding the limit are correctly rejected. +// The script counts the number of errors (expected to be equal to the number of connections exceeding the limit) and successful connections (expected to be equal to the limit). +// The AfterEach block cleans up the environment after the test. +var _ = ginkgo.Describe("Test client connection limit", func() { + e2eMgr := config.NewE2eManager() + db := config.DefaultE2eDatabase + slice := e2eMgr.NsSlices[config.SliceSingleMaster] + table := config.DefaultE2eTable + maxConnections := 10 + ginkgo.BeforeEach(func() { + // mysql prepare + masterAdminConn, err := slice.GetMasterAdminConn(0) + util.ExpectNoError(err, "get master admin conn") + err = util.SetupDatabaseAndInsertData(masterAdminConn, db, table) + util.ExpectNoError(err, "setup database and insert data") + // namespace prepare + initNs, err := config.ParseNamespaceTmpl(config.DefaultNamespaceTmpl, slice) + util.ExpectNoError(err, "parse namespace template") + initNs.MaxClientConnections = maxConnections + e2eMgr.DeleteNamespace(initNs.Name) + initNs.Name = "test_client_limit" + for i := 0; i < len(initNs.Users); i++ { + initNs.Users[i].Namespace = initNs.Name + } + err = e2eMgr.ModifyNamespace(initNs) + util.ExpectNoError(err, "create namespace") + // wait mysql data sync and namespace load + time.Sleep(3 * time.Millisecond) + + }) + ginkgo.Context("When handling client limit operations", func() { + ginkgo.It("should limit exceeded maximum connection ", func() { + testCounts := 20 + gaeaReadWriteConn, err := e2eMgr.GetReadWriteGaeaUserConn() + util.ExpectNoError(err, "get gaea read write conn") + errChan := make(chan error, testCounts) + for i := 0; i < testCounts; i++ { + index := i + go func() { + time.Sleep(time.Duration(index) * 10 * time.Millisecond) + _, err := gaeaReadWriteConn.Query("select sleep(1)") + errChan <- err + }() + } + // check err count + errCount, noErrCount := 0, 0 + for i := 0; i < testCounts; i++ { + err := <-errChan + if err != nil { + errCount++ + } else { + noErrCount++ + } + } + util.ExpectEqual(errCount, testCounts-maxConnections, "err count") + util.ExpectEqual(noErrCount, maxConnections, "no err count") + }) + }) + ginkgo.AfterEach(func() { + e2eMgr.Clean() + }) +}) diff --git a/tests/e2e/function/collation_set.go b/tests/e2e/function/collation_set.go new file mode 100644 index 00000000..f3b3f016 --- /dev/null +++ b/tests/e2e/function/collation_set.go @@ -0,0 +1,126 @@ +// Copyright 2024 The Gaea Authors. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package function + +import ( + "time" + + "github.com/XiaoMi/Gaea/tests/e2e/config" + "github.com/XiaoMi/Gaea/tests/e2e/util" + "github.com/onsi/ginkgo/v2" + "github.com/onsi/gomega" +) + +// This test suite is designed to validate the integration of backend authentication plugins within the Gaea database middleware. +// The test scenarios include: +// 1. Creating a MySQL user with 'mysql_native_password', granting them select permissions, and configuring Gaea to recognize and authenticate using these credentials. +// 2. Similarly, setting up another user with 'sha256_password', which represents a more secure authentication mechanism, and ensuring Gaea can handle this advanced encryption during the authentication process. +// Each test: +// - Configures user credentials specific to the authentication method being tested. +// - Executes SQL commands to create and grant permissions to these users. +// - Modifies the Gaea namespace to utilize these new credentials. +// - Performs database queries to confirm that the connections are appropriately authenticated and operational. +// Overall, this testing strategy is crucial for verifying that Gaea's integration with MySQL authentication plugins is robust +var collationTestSqlCases = []struct { + TestSQL string + CheckSQL string + ExpectMySQL5 string + ExpectMySQL8 string +}{ + { + TestSQL: `SET NAMES 'utf8mb4' COLLATE 'utf8mb4_0900_ai_ci'`, + CheckSQL: "show variables like 'collation_connection'", + ExpectMySQL5: "utf8mb4_general_ci", + ExpectMySQL8: "utf8mb4_0900_ai_ci", + }, +} + +var _ = ginkgo.Describe("only mysql5: SET NAMES utf8mb4 COLLATE utf8mb4_0900_ai_ci", func() { + e2eMgr := config.NewE2eManager() + db := config.DefaultE2eDatabase + slice := e2eMgr.NsSlices[config.SliceSingleMaster] + table := config.DefaultE2eTable + ginkgo.BeforeEach(func() { + // mysql prepare + masterAdminConn, err := slice.GetMasterAdminConn(0) + util.ExpectNoError(err) + err = util.SetupDatabaseAndInsertData(masterAdminConn, db, table) + util.ExpectNoError(err) + // namespace prepare + initNs, err := config.ParseNamespaceTmpl(config.DefaultNamespaceTmpl, slice) + util.ExpectNoError(err, "parse namespace template") + err = e2eMgr.ModifyNamespace(initNs) + util.ExpectNoError(err) + // wait mysql data sync and namespace load + time.Sleep(500 * time.Millisecond) + }) + + ginkgo.It("should set collate 'utf8mb4_0900_ai_ci' get 'utf8mb4_general_ci'", func() { + gaeaConn, err := e2eMgr.GetWriteGaeaUserConn() + util.ExpectNoError(err) + + for _, sqlCase := range collationTestSqlCases { + gaeaConn.Exec(sqlCase.TestSQL) + res, err := util.MysqlQuery(gaeaConn, sqlCase.CheckSQL) + util.ExpectNoError(err) + gomega.Expect(res).Should(gomega.HaveLen(1)) + gomega.Expect(res[0]).Should(gomega.HaveLen(2)) + gomega.Expect(res[0][1]).Should(gomega.Equal(sqlCase.ExpectMySQL5)) + } + }) + + ginkgo.AfterEach(func() { + e2eMgr.Clean() + }) +}) + +var _ = ginkgo.Describe("only mysql8: SET NAMES utf8mb4 COLLATE utf8mb4_0900_ai_ci", func() { + e2eMgr := config.NewE2eManager() + db := config.DefaultE2eDatabase + slice := e2eMgr.NsSlices[config.SliceSingleMaster] + table := config.DefaultE2eTable + ginkgo.BeforeEach(func() { + // mysql prepare + masterAdminConn, err := slice.GetMasterAdminConn(0) + util.ExpectNoError(err) + err = util.SetupDatabaseAndInsertData(masterAdminConn, db, table) + util.ExpectNoError(err) + // namespace prepare + initNs, err := config.ParseNamespaceTmpl(config.DefaultNamespaceTmpl, slice) + util.ExpectNoError(err, "parse namespace template") + err = e2eMgr.ModifyNamespace(initNs) + util.ExpectNoError(err) + // wait mysql data sync and namespace load + time.Sleep(500 * time.Millisecond) + }) + + ginkgo.It("should set collate 'utf8mb4_0900_ai_ci' get 'utf8mb4_0900_ai_ci", func() { + gaeaConn, err := e2eMgr.GetWriteGaeaUserConn() + util.ExpectNoError(err) + + for _, sqlCase := range collationTestSqlCases { + gaeaConn.Exec(sqlCase.TestSQL) + res, err := util.MysqlQuery(gaeaConn, sqlCase.CheckSQL) + util.ExpectNoError(err) + gomega.Expect(res).Should(gomega.HaveLen(1)) + gomega.Expect(res[0]).Should(gomega.HaveLen(2)) + gomega.Expect(res[0][1]).Should(gomega.Equal(sqlCase.ExpectMySQL8)) + } + }) + + ginkgo.AfterEach(func() { + e2eMgr.Clean() + }) +}) diff --git a/tests/e2e/function/keep_session.go b/tests/e2e/function/keep_session.go new file mode 100644 index 00000000..4d3541e6 --- /dev/null +++ b/tests/e2e/function/keep_session.go @@ -0,0 +1,366 @@ +// Copyright 2024 The Gaea Authors. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package function + +import ( + "fmt" + "github.com/onsi/gomega" + "time" + + "github.com/XiaoMi/Gaea/tests/e2e/config" + "github.com/XiaoMi/Gaea/tests/e2e/util" + + "github.com/onsi/ginkgo/v2" +) + +// This Ginkgo test suite is designed to validate session persistence and transaction handling in Gaea when interfacing with a MySQL database in a dual-slave configuration. It specifically tests the behavior of both XA (eXtended Architecture) transactions and regular transactions under different session settings. +// Test scenarios are designed to evaluate: +// 1. **XA Transactions**: These tests verify that Gaea can handle XA transactions, which are designed for distributed transaction systems. The tests cover starting, preparing, and committing XA transactions, and they ensure that data manipulated within these transactions is correctly committed to the database. +// 2. **Error Handling in Transactions**: These tests ensure that Gaea appropriately reports errors when transaction commands are misused or when session settings do not support the executed operations. +// 3. **Regular Transactions**: Testing regular transaction commands (`BEGIN`, `COMMIT`) to confirm that Gaea handles these consistently within the context of session persistence. +// 4. **Session Persistence**: Some tests specifically manipulate the session persistence settings to observe how Gaea handles transaction states when sessions are not maintained. +// This suite is crucial for ensuring that Gaea reliably manages transactions across multiple database instances and maintains correct session states, which is essential for applications that require high reliability and strict data consistency in distributed environments. +var _ = ginkgo.Describe("keep session test", func() { + e2eMgr := config.NewE2eManager() + db := config.DefaultE2eDatabase + slice := e2eMgr.NsSlices[config.SliceDualSlave] + table := config.DefaultE2eTable + // namespace prepare + initNs, err := config.ParseNamespaceTmpl(config.DefaultNamespaceTmpl, slice) + util.ExpectNoError(err, "parse namespace template") + + ginkgo.BeforeEach(func() { + // mysql prepare + masterAdminConn, err := slice.GetMasterAdminConn(0) + util.ExpectNoError(err) + err = util.SetupDatabaseAndInsertData(masterAdminConn, db, table) + util.ExpectNoError(err) + _, err = masterAdminConn.Exec(fmt.Sprintf("truncate table `%s`.`%s`", db, table)) + util.ExpectNoError(err) + err = e2eMgr.ModifyNamespace(initNs) + util.ExpectNoError(err) + // wait mysql data sync and namespace load + time.Sleep(500 * time.Millisecond) + }) + + // 这个 测试用例会导致其他测试用例被阻塞 300 秒,所以暂时注释掉 + //ginkgo.Context("test xa transaction stmts", func() { + // ginkgo.It("should handle xa transactions and normal transactions correctly", func() { + // sqlCases := []struct { + // TestSQLs []string + // CheckSQL string + // ExpectRes [][]string + // ExpectErr string + // KeepSession bool + // }{ + // { + // TestSQLs: []string{`xa start "xa_test1"`, fmt.Sprintf(`insert into %s.%s values(1001, "xa_test1")`, db, table), + // `xa end "xa_test1"`, `xa prepare "xa_test1"`, `xa commit "xa_test1"`}, + // CheckSQL: fmt.Sprintf("SELECT * FROM %s.%s WHERE id = %d limit 1", db, table, 1001), + // ExpectRes: [][]string{{ + // "1001", "xa_test1", + // }}, + // KeepSession: true, + // }, + // { + // TestSQLs: []string{`xa start "xa_test2"`, fmt.Sprintf(`insert into %s.%s values(1002, "xa_test2")`, db, table), + // `xa end "xa_test2"`, `xa commit "xa_test2"`}, + // ExpectErr: "Error 1399: XAER_RMFAIL: The command cannot be executed when global transaction is in the IDLE state", + // KeepSession: true, + // }, + // { + // TestSQLs: []string{`begin`, fmt.Sprintf(`insert into %s.%s values(1003, "tx_test3")`, db, table), `commit`}, + // CheckSQL: fmt.Sprintf("SELECT * FROM %s.%s WHERE id = %d limit 1", db, table, 1003), + // ExpectRes: [][]string{{ + // "1003", "tx_test3", + // }}, + // KeepSession: true, + // }, + // { + // TestSQLs: []string{`xa start "xa_test4"`, `xa end "xa_test4"`}, + // ExpectErr: "Error 1399: XAER_RMFAIL: The command cannot be executed when global transaction is in the NON-EXISTING state", + // KeepSession: false, + // }, + // } + // + // for _, sqlCase := range sqlCases { + // // set keep session config + // initNs.SetForKeepSession = sqlCase.KeepSession + // err = e2eMgr.ModifyNamespace(initNs) + // util.ExpectNoError(err) + // gaeaTestConn, err := e2eMgr.GetReadWriteGaeaUserConn() + // util.ExpectNoError(err) + // for _, testSql := range sqlCase.TestSQLs { + // _, err = gaeaTestConn.Exec(testSql) + // } + // + // if sqlCase.ExpectErr != "" { + // if sqlCase.ExpectErr != err.Error() { + // fmt.Printf("sql exec error: %s\n", err.Error()) + // util.ExpectNoError(err) + // } + // continue + // } + // + // gaeaCheckConn, err := e2eMgr.GetReadWriteGaeaUserConn() + // util.ExpectNoError(err) + // err = checkFunc(gaeaCheckConn, sqlCase.CheckSQL, sqlCase.ExpectRes) + // util.ExpectNoError(err) + // } + // }) + //}) + + // 测试事务时,keepsession 模式的行为 + ginkgo.Context("test transaction when use keep session", func() { + initNs.SetForKeepSession = true + err = e2eMgr.ModifyNamespace(initNs) + // 模拟事务中配置变更的情况 + ginkgo.It("should commit success when use keep session", func() { + var testSqlCases = []struct { + TestSQL string + CheckSQL string + Action string + Expect string + }{ + { + TestSQL: fmt.Sprintf("insert into %s values(100, 'a')", table), + CheckSQL: fmt.Sprintf("select /*master*/ count(*) from %s", table), + Action: "commit", + Expect: "1", + }, + { + TestSQL: fmt.Sprintf("insert into %s values(101, 'a')", table), + CheckSQL: fmt.Sprintf("select /*master*/ count(*) from %s", table), + Action: "rollback", + Expect: "1", + }, + { + TestSQL: fmt.Sprintf("insert into %s values(102, 'a')", table), + CheckSQL: fmt.Sprintf("select /*master*/ count(*) from %s", table), + Action: "commit", + Expect: "2", + }, + } + gaeaConn, err := e2eMgr.GetReadWriteGaeaUserDBConn(db) + util.ExpectNoError(err) + defer gaeaConn.Close() + for _, testCase := range testSqlCases { + tx, err := gaeaConn.Begin() + util.ExpectNoError(err) + _, err = tx.Exec(testCase.TestSQL) + util.ExpectNoError(err) + switch testCase.Action { + case "rollback": + err = tx.Rollback() + case "commit": + err = tx.Commit() + } + tx.Commit() + util.ExpectNoError(err) + // 重新获取 gaea 连接 + gaeaConnNew, err := e2eMgr.GetReadWriteGaeaUserDBConn(db) + util.ExpectNoError(err) + res, err := util.MysqlQuery(gaeaConnNew, testCase.CheckSQL) + util.ExpectNoError(err) + gomega.Expect(res).Should(gomega.HaveLen(1)) + gomega.Expect(res[0]).Should(gomega.HaveLen(1)) + gomega.Expect(res[0][0]).Should(gomega.Equal(testCase.Expect)) + } + }) + ginkgo.It("should commit error when namespace changed", func() { + // 清除数据 + masterConn, err := slice.GetMasterAdminConn(0) + util.ExpectNoError(err) + defer masterConn.Close() + _, err = masterConn.Exec(fmt.Sprintf("truncate table `%s`.`%s`", db, table)) + util.ExpectNoError(err) + + var testSqlCases = []struct { + TestSQL1 string + TestSQL2 string + CheckSQL string + Action string + ExpectSuccess string + ExpectErr string + }{ + { + TestSQL1: fmt.Sprintf("insert into %s values(103, 'a')", table), + TestSQL2: fmt.Sprintf("insert into %s values(104, 'a')", table), + CheckSQL: fmt.Sprintf("select /*master*/ count(*) from %s", table), + Action: "rollback", + ExpectSuccess: "0", + ExpectErr: "Error 1105: namespace changed in transaction when keep session", + }, + { + TestSQL1: fmt.Sprintf("insert into %s values(105, 'a')", table), + TestSQL2: fmt.Sprintf("insert into %s values(106, 'a')", table), + CheckSQL: fmt.Sprintf("select /*master*/ count(*) from %s", table), + Action: "commit", + ExpectSuccess: "0", + ExpectErr: "Error 1105: namespace changed in transaction when keep session", + }, + } + gaeaConn, err := e2eMgr.GetReadWriteGaeaUserDBConn(db) + util.ExpectNoError(err) + defer gaeaConn.Close() + for _, testCase := range testSqlCases { + tx, err := gaeaConn.Begin() + util.ExpectNoError(err) + _, err = tx.Exec(testCase.TestSQL1) + util.ExpectNoError(err) + // 配置变更 + initNs.SetForKeepSession = true + err = e2eMgr.ModifyNamespace(initNs) + util.ExpectNoError(err) + _, err = tx.Exec(testCase.TestSQL2) + gomega.Expect(err.Error()).Should(gomega.Equal(testCase.ExpectErr)) + + // 重新获取 gaea 连接 + gaeaConnNew, err := e2eMgr.GetReadWriteGaeaUserDBConn(db) + util.ExpectNoError(err) + res, err := util.MysqlQuery(gaeaConnNew, testCase.CheckSQL) + util.ExpectNoError(err) + gomega.Expect(res).Should(gomega.HaveLen(1)) + gomega.Expect(res[0]).Should(gomega.HaveLen(1)) + gomega.Expect(res[0][0]).Should(gomega.Equal(testCase.ExpectSuccess)) + //} + gaeaConnNew.Close() + } + }) + }) + + // 测试事务时,keepsession 模式的行为 + ginkgo.Context("test transaction when use keep session", func() { + initNs.SetForKeepSession = true + err = e2eMgr.ModifyNamespace(initNs) + // 模拟事务中配置变更的情况 + ginkgo.It("should commit success when use keep session", func() { + var testSqlCases = []struct { + TestSQL string + CheckSQL string + Action string + Expect string + }{ + { + TestSQL: fmt.Sprintf("insert into %s values(100, 'a')", table), + CheckSQL: fmt.Sprintf("select /*master*/ count(*) from %s", table), + Action: "commit", + Expect: "1", + }, + { + TestSQL: fmt.Sprintf("insert into %s values(101, 'a')", table), + CheckSQL: fmt.Sprintf("select /*master*/ count(*) from %s", table), + Action: "rollback", + Expect: "1", + }, + { + TestSQL: fmt.Sprintf("insert into %s values(102, 'a')", table), + CheckSQL: fmt.Sprintf("select /*master*/ count(*) from %s", table), + Action: "commit", + Expect: "2", + }, + } + gaeaConn, err := e2eMgr.GetReadWriteGaeaUserDBConn(db) + util.ExpectNoError(err) + defer gaeaConn.Close() + for _, testCase := range testSqlCases { + tx, err := gaeaConn.Begin() + util.ExpectNoError(err) + _, err = tx.Exec(testCase.TestSQL) + util.ExpectNoError(err) + switch testCase.Action { + case "rollback": + err = tx.Rollback() + case "commit": + err = tx.Commit() + } + tx.Commit() + util.ExpectNoError(err) + // 重新获取 gaea 连接 + gaeaConnNew, err := e2eMgr.GetReadWriteGaeaUserDBConn(db) + util.ExpectNoError(err) + res, err := util.MysqlQuery(gaeaConnNew, testCase.CheckSQL) + util.ExpectNoError(err) + gomega.Expect(res).Should(gomega.HaveLen(1)) + gomega.Expect(res[0]).Should(gomega.HaveLen(1)) + gomega.Expect(res[0][0]).Should(gomega.Equal(testCase.Expect)) + } + }) + ginkgo.It("should commit error when namespace changed", func() { + // 清除数据 + masterConn, err := slice.GetMasterAdminConn(0) + util.ExpectNoError(err) + defer masterConn.Close() + _, err = masterConn.Exec(fmt.Sprintf("truncate table `%s`.`%s`", db, table)) + util.ExpectNoError(err) + + var testSqlCases = []struct { + TestSQL1 string + TestSQL2 string + CheckSQL string + Action string + ExpectSuccess string + ExpectErr string + }{ + { + TestSQL1: fmt.Sprintf("insert into %s values(103, 'a')", table), + TestSQL2: fmt.Sprintf("insert into %s values(104, 'a')", table), + CheckSQL: fmt.Sprintf("select /*master*/ count(*) from %s", table), + Action: "rollback", + ExpectSuccess: "0", + ExpectErr: "Error 1105: namespace changed in transaction when keep session", + }, + { + TestSQL1: fmt.Sprintf("insert into %s values(105, 'a')", table), + TestSQL2: fmt.Sprintf("insert into %s values(106, 'a')", table), + CheckSQL: fmt.Sprintf("select /*master*/ count(*) from %s", table), + Action: "commit", + ExpectSuccess: "0", + ExpectErr: "Error 1105: namespace changed in transaction when keep session", + }, + } + gaeaConn, err := e2eMgr.GetReadWriteGaeaUserDBConn(db) + util.ExpectNoError(err) + defer gaeaConn.Close() + for _, testCase := range testSqlCases { + tx, err := gaeaConn.Begin() + util.ExpectNoError(err) + _, err = tx.Exec(testCase.TestSQL1) + util.ExpectNoError(err) + // 配置变更 + initNs.SetForKeepSession = true + err = e2eMgr.ModifyNamespace(initNs) + util.ExpectNoError(err) + _, err = tx.Exec(testCase.TestSQL2) + //util.ExpectNoError(err) + gomega.Expect(err.Error()).Should(gomega.Equal(testCase.ExpectErr)) + + // 重新获取 gaea 连接 + gaeaConnNew, err := e2eMgr.GetReadWriteGaeaUserDBConn(db) + util.ExpectNoError(err) + res, err := util.MysqlQuery(gaeaConnNew, testCase.CheckSQL) + util.ExpectNoError(err, nil) + gomega.Expect(res).Should(gomega.HaveLen(1)) + gomega.Expect(res[0]).Should(gomega.HaveLen(1)) + gomega.Expect(res[0][0]).Should(gomega.Equal(testCase.ExpectSuccess)) + gaeaConnNew.Close() + } + }) + }) + + ginkgo.AfterEach(func() { + e2eMgr.Clean() + }) +}) diff --git a/tests/e2e/function/loadbalance.go b/tests/e2e/function/loadbalance.go new file mode 100644 index 00000000..792db47a --- /dev/null +++ b/tests/e2e/function/loadbalance.go @@ -0,0 +1,151 @@ +// Copyright 2024 The Gaea Authors. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package function + +import ( + "database/sql" + "fmt" + "time" + + "github.com/XiaoMi/Gaea/tests/e2e/config" + "github.com/XiaoMi/Gaea/tests/e2e/util" + + "github.com/onsi/ginkgo/v2" + "github.com/onsi/gomega" +) + +// This script, titled "Load Balancing," aims to test the load balancing functionality in a database environment. +// The test involves setting up a database and table, then running various SQL queries to check how read and write operations are distributed among the master and slave nodes in a dual-slave slice setup. +// The test includes different SQL cases for read and write operations, ensuring that read queries are evenly distributed between the slave nodes while write queries go to the master node. +// Each query's execution location is verified against the expected backend address. +// After running the test cases, the script checks the results to ensure they align with the expected load balancing behavior.. +var _ = ginkgo.Describe("Load Balancing", func() { + e2eMgr := config.NewE2eManager() + db := config.DefaultE2eDatabase + slice := e2eMgr.NsSlices[config.SliceDualSlave] + table := config.DefaultE2eTable + ginkgo.BeforeEach(func() { + // mysql prepare + masterAdminConn, err := slice.GetMasterAdminConn(0) + util.ExpectNoError(err) + err = util.SetupDatabaseAndInsertData(masterAdminConn, db, table) + util.ExpectNoError(err) + // namespace prepare + initNs, err := config.ParseNamespaceTmpl(config.DefaultNamespaceTmpl, slice) + util.ExpectNoError(err, "parse namespace template") + err = e2eMgr.ModifyNamespace(initNs) + util.ExpectNoError(err) + // wait mysql data sync and namespace load + time.Sleep(3 * time.Millisecond) + }) + + ginkgo.Context("When distributing queries among replicas", func() { + ginkgo.It("should evenly distribute read queries", func() { + + gaeaReadConn, err := e2eMgr.GetReadGaeaUserConn() + util.ExpectNoError(err) + + gaeaWriteConn, err := e2eMgr.GetWriteGaeaUserConn() + util.ExpectNoError(err) + + // 定义 SQL 测试用例 + sqlCases := []struct { + GaeaConn *sql.DB + GaeaSQL string + ExpectBackendAddr string + }{ + //读用户-读 + { + GaeaConn: gaeaReadConn, + GaeaSQL: fmt.Sprintf("/*Load Balancing Case1 */SELECT * FROM `%s`.`%s` WHERE `id`= 1", db, table), + ExpectBackendAddr: slice.Slices[0].Slaves[0], + }, + { + GaeaConn: gaeaReadConn, + GaeaSQL: fmt.Sprintf("/*Load Balancing Case2 */ SELECT * FROM `%s`.`%s` WHERE `id`= 2", db, table), + ExpectBackendAddr: slice.Slices[0].Slaves[1], + }, + { + GaeaConn: gaeaReadConn, + GaeaSQL: fmt.Sprintf("/*Load Balancing Case3 */ SELECT * FROM `%s`.`%s` WHERE `id`= 3", db, table), + ExpectBackendAddr: slice.Slices[0].Slaves[0], + }, + { + GaeaConn: gaeaReadConn, + GaeaSQL: fmt.Sprintf("/*Load Balancing Case4 */ SELECT * FROM `%s`.`%s` WHERE `id`= 4", db, table), + ExpectBackendAddr: slice.Slices[0].Slaves[1], + }, + // 写用户-读 + { + GaeaConn: gaeaWriteConn, + GaeaSQL: fmt.Sprintf("/*Load Balancing Case5 */SELECT * FROM `%s`.`%s` WHERE `id`= 1", db, table), + ExpectBackendAddr: slice.Slices[0].Master, + }, + { + GaeaConn: gaeaWriteConn, + GaeaSQL: fmt.Sprintf("/*Load Balancing Case6 */ SELECT * FROM `%s`.`%s` WHERE `id`= 2", db, table), + ExpectBackendAddr: slice.Slices[0].Master, + }, + { + GaeaConn: gaeaWriteConn, + GaeaSQL: fmt.Sprintf("/*Load Balancing Case7 */ SELECT * FROM `%s`.`%s` WHERE `id`= 3", db, table), + ExpectBackendAddr: slice.Slices[0].Master, + }, + { + GaeaConn: gaeaWriteConn, + GaeaSQL: fmt.Sprintf("/*Load Balancing Case8 */ SELECT * FROM `%s`.`%s` WHERE `id`= 4", db, table), + ExpectBackendAddr: slice.Slices[0].Master, + }, + // 写用户-写 + { + GaeaConn: gaeaWriteConn, + GaeaSQL: fmt.Sprintf("/*Load Balancing Case9 */ INSERT INTO `%s`.`%s` (name) VALUES ('%s')", db, table, "nameValue"), + ExpectBackendAddr: slice.Slices[0].Master, + }, + { + GaeaConn: gaeaWriteConn, + GaeaSQL: fmt.Sprintf("/*Load Balancing Case10 */ INSERT INTO `%s`.`%s` (name) VALUES ('%s')", db, table, "nameValue"), + ExpectBackendAddr: slice.Slices[0].Master, + }, + { + GaeaConn: gaeaWriteConn, + GaeaSQL: fmt.Sprintf("/*Load Balancing Case11 */ INSERT INTO `%s`.`%s` (name) VALUES ('%s')", db, table, "nameValue"), + ExpectBackendAddr: slice.Slices[0].Master, + }, + { + GaeaConn: gaeaWriteConn, + GaeaSQL: fmt.Sprintf("/*Load Balancing Case12 */ INSERT INTO `%s`.`%s` (name) VALUES ('%s')", db, table, "nameValue"), + ExpectBackendAddr: slice.Slices[0].Master, + }, + } + e2eMgr.ClearSqlLog() + currentTime := time.Now() + // 执行 SQL 测试用例 + for _, sqlCase := range sqlCases { + _, err := sqlCase.GaeaConn.Exec(sqlCase.GaeaSQL) + util.ExpectNoError(err) + res, err := e2eMgr.SearchSqlLog(sqlCase.GaeaSQL, currentTime) + util.ExpectNoError(err) + // 避免扫到以前的数据 + gomega.Expect(res).Should(gomega.HaveLen(1)) + gomega.Expect(sqlCase.ExpectBackendAddr).Should(gomega.Equal(res[0].BackendAddr)) + } + }) + }) + ginkgo.AfterEach(func() { + e2eMgr.Clean() + }) + +}) diff --git a/tests/e2e/function/masterhint.go b/tests/e2e/function/masterhint.go new file mode 100644 index 00000000..1d00a5e2 --- /dev/null +++ b/tests/e2e/function/masterhint.go @@ -0,0 +1,149 @@ +// Copyright 2024 The Gaea Authors. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package function + +import ( + "database/sql" + "fmt" + "time" + + "github.com/XiaoMi/Gaea/tests/e2e/config" + "github.com/XiaoMi/Gaea/tests/e2e/util" + + "github.com/onsi/ginkgo/v2" + "github.com/onsi/gomega" +) + +// This script, titled "Force Read from Master" aims to validate that all read operations are correctly directed to the master database, regardless of whether the user connection is configured for read, write, or both. +// This is tested using various SQL queries with a "/master/" hint. +// The script checks if the queries are being executed on the master or slave nodes as expected, based on the type of connection (read, write, or read-write) and the presence of the master hint in the query. +// The results from the SQL log are then verified to ensure that the read queries are directed to the correct backend address as per the configuration, demonstrating the effectiveness of the forced master read functionality. +var _ = ginkgo.Describe("Force Read from Master", func() { + e2eMgr := config.NewE2eManager() + db := config.DefaultE2eDatabase + slice := e2eMgr.NsSlices[config.SliceDualSlave] + table := config.DefaultE2eTable + ginkgo.BeforeEach(func() { + // mysql prepare + masterAdminConn, err := slice.GetMasterAdminConn(0) + util.ExpectNoError(err) + err = util.SetupDatabaseAndInsertData(masterAdminConn, db, table) + util.ExpectNoError(err) + // namespace prepare + initNs, err := config.ParseNamespaceTmpl(config.DefaultNamespaceTmpl, slice) + util.ExpectNoError(err, "parse namespace template") + err = e2eMgr.ModifyNamespace(initNs) + util.ExpectNoError(err) + // wait mysql data sync and namespace load + time.Sleep(3 * time.Millisecond) + + }) + + ginkgo.Context("When all read operations are forced to master", func() { + ginkgo.It("should evenly distribute read queries", func() { + + gaeaReadConn, err := e2eMgr.GetReadGaeaUserConn() + util.ExpectNoError(err) + gaeaWriteConn, err := e2eMgr.GetWriteGaeaUserConn() + util.ExpectNoError(err) + gaeaReadWriteConn, err := e2eMgr.GetReadWriteGaeaUserConn() + util.ExpectNoError(err) + //Select 带 Master Hint: + //读写分离用户(RWFlag=2,RWSplit=1):主库 + //只写用户(RWFlag=2,RWSplit=0):主库 + //只读用户(RWFlag=1,RWSplit=1):从库(V2.0 以下版本会请求到主库,MiProxy 会打到从库) + sqlCases := []struct { + GaeaConn *sql.DB + GaeaSQL string + ExpectBackendAddr string + }{ + { + GaeaConn: gaeaWriteConn, + GaeaSQL: fmt.Sprintf("/*master*/ SELECT * FROM `%s`.`%s` WHERE `id`= 1", db, table), + ExpectBackendAddr: slice.Slices[0].Master, + }, + { + GaeaConn: gaeaWriteConn, + GaeaSQL: fmt.Sprintf("/*master*/ SELECT * FROM `%s`.`%s` WHERE `id`= 2", db, table), + ExpectBackendAddr: slice.Slices[0].Master, + }, + { + GaeaConn: gaeaWriteConn, + GaeaSQL: fmt.Sprintf("SELECT /*master*/ * FROM `%s`.`%s` WHERE `id`= 1", db, table), + ExpectBackendAddr: slice.Slices[0].Master, + }, + { + GaeaConn: gaeaWriteConn, + GaeaSQL: fmt.Sprintf("SELECT /*master*/ * FROM `%s`.`%s` WHERE `id`= 2", db, table), + ExpectBackendAddr: slice.Slices[0].Master, + }, + { + GaeaConn: gaeaReadConn, + GaeaSQL: fmt.Sprintf("/*master*/ SELECT * FROM `%s`.`%s` WHERE `id`= 3", db, table), + ExpectBackendAddr: slice.Slices[0].Slaves[0], + }, + { + GaeaConn: gaeaReadConn, + GaeaSQL: fmt.Sprintf("/*master*/ SELECT * FROM `%s`.`%s` WHERE `id`= 4", db, table), + ExpectBackendAddr: slice.Slices[0].Slaves[1], + }, + { + GaeaConn: gaeaReadConn, + GaeaSQL: fmt.Sprintf("SELECT /*master*/ * FROM `%s`.`%s` WHERE `id`= 3", db, table), + ExpectBackendAddr: slice.Slices[0].Slaves[0], + }, + { + GaeaConn: gaeaReadConn, + GaeaSQL: fmt.Sprintf("SELECT /*master*/ * FROM `%s`.`%s` WHERE `id`= 4", db, table), + ExpectBackendAddr: slice.Slices[0].Slaves[1], + }, + { + GaeaConn: gaeaReadWriteConn, + GaeaSQL: fmt.Sprintf("/*master*/ SELECT * FROM `%s`.`%s` WHERE `id`= 5", db, table), + ExpectBackendAddr: slice.Slices[0].Master, + }, + { + GaeaConn: gaeaReadWriteConn, + GaeaSQL: fmt.Sprintf("/*master*/ SELECT * FROM `%s`.`%s` WHERE `id`= 6", db, table), + ExpectBackendAddr: slice.Slices[0].Master, + }, + { + GaeaConn: gaeaReadWriteConn, + GaeaSQL: fmt.Sprintf("SELECT * FROM `%s`.`%s` WHERE `id`= 5 /*master*/", db, table), + ExpectBackendAddr: slice.Slices[0].Master, + }, + { + GaeaConn: gaeaReadWriteConn, + GaeaSQL: fmt.Sprintf("SELECT /*master*/ * FROM `%s`.`%s` WHERE `id`= 6", db, table), + ExpectBackendAddr: slice.Slices[0].Master, + }, + } + e2eMgr.ClearSqlLog() + currentTime := time.Now() + for _, sqlCase := range sqlCases { + _, err := sqlCase.GaeaConn.Exec(sqlCase.GaeaSQL) + util.ExpectNoError(err) + res, err := e2eMgr.SearchSqlLog(sqlCase.GaeaSQL, currentTime) + util.ExpectNoError(err) + // 避免扫到以前的数据 + gomega.Expect(res).Should(gomega.HaveLen(1)) + gomega.Expect(sqlCase.ExpectBackendAddr).Should(gomega.Equal(res[0].BackendAddr)) + } + }) + }) + ginkgo.AfterEach(func() { + e2eMgr.Clean() + }) +}) diff --git a/tests/e2e/function/multi_query.go b/tests/e2e/function/multi_query.go new file mode 100644 index 00000000..d35cbf9c --- /dev/null +++ b/tests/e2e/function/multi_query.go @@ -0,0 +1,212 @@ +// Copyright 2024 The Gaea Authors. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package function + +import ( + "database/sql" + "fmt" + "time" + + "github.com/XiaoMi/Gaea/tests/e2e/config" + "github.com/XiaoMi/Gaea/tests/e2e/util" + _ "github.com/go-sql-driver/mysql" + "github.com/onsi/ginkgo/v2" +) + +// This Ginkgo test suite is designed to validate the prepared statement functionality in Gaea when interfacing with a MySQL database configured with a dual-slave topology. The tests ensure that Gaea correctly prepares, executes, and fetches results from SQL queries using prepared statements, a critical feature for enhancing security and performance in database operations. +// The test scenarios within the Context block are structured to assess multiple aspects of prepared statement handling: +// 1. **Execution of Prepared Statements**: Tests whether Gaea can prepare and execute statements with parameters, verifying if the results returned match expected values. +// 2. **Parameter Mismatch Handling**: Verifies Gaea's error handling capabilities when the number of parameters provided during the execution does not match those expected by the prepared statement. +// Each It block: +// - Prepares a SQL statement with parameter placeholders. +// - Executes the statement with actual parameters, either expecting successful execution and specific results or anticipating an error due to parameter mismatches. +// - Uses helper functions to validate the results against expected outcomes or to confirm that appropriate errors are raised. +// Specific tests include: +// - Successful preparation and execution of a query retrieving specific rows, validating the accuracy of data retrieval. +// - Execution of a query with insufficient parameters to trigger error handling mechanisms, testing the robustness of Gaea's error reporting. +// Overall, this testing strategy is crucial for confirming that Gaea’s prepared statement processing is reliable, accurate, and secure, particularly in complex database architectures like those with master-slave configurations. This capability is essential for applications that rely on dynamic SQL generation and execution where prepared statements play a key role in preventing SQL injection attacks and optimizing query performance. +var _ = ginkgo.Describe("test unshard multi query", func() { + e2eMgr := config.NewE2eManager() + db := config.DefaultE2eDatabase + slice := e2eMgr.NsSlices[config.SliceSingleMaster] + table := config.DefaultE2eTable + dsn := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s", + e2eMgr.GCluster.ReadWriteUser.UserName, + e2eMgr.GCluster.ReadWriteUser.Password, + e2eMgr.GCluster.Host, + e2eMgr.GCluster.Port, + db, + ) + initNs, err := config.ParseNamespaceTmpl(config.DefaultNamespaceTmpl, slice) + util.ExpectNoError(err, "parse namespace template") + + ginkgo.BeforeEach(func() { + // mysql prepare + masterAdminConn, err := slice.GetMasterAdminConn(0) + util.ExpectNoError(err, "get master admin conn") + err = util.SetupDatabaseAndInsertData(masterAdminConn, db, table) + util.ExpectNoError(err, "setup database and insert data") + + // namespace prepare + initNs.SupportMultiQuery = true + err = e2eMgr.DeleteNamespace(initNs.Name) + util.ExpectNoError(err) + initNs.Name = "test_unshard_multi_query" + for i := 0; i < len(initNs.Users); i++ { + initNs.Users[i].Namespace = initNs.Name + } + err = e2eMgr.ModifyNamespace(initNs) + util.ExpectNoError(err, "create namespace") + // wait mysql data sync and namespace load + time.Sleep(3 * time.Millisecond) + }) + ginkgo.Context("handle multi query", func() { + ginkgo.It("when gaea set supprt multiquery and client not set multi query", func() { + gaeaReadWriteDB, err := sql.Open("mysql", dsn+"?multiStatements=false") + util.ExpectNoError(err, "get gaea read write conn") + defer gaeaReadWriteDB.Close() + sql := fmt.Sprintf("select id from %s limit 1;select id,name from %s limit 1", table, table) + rows, err := gaeaReadWriteDB.Query(sql) + util.ExpectNoError(err, "query gaea", sql) + defer rows.Close() + for rows.Next() { + var id int + err = rows.Scan(&id) + util.ExpectNoError(err) + util.ExpectEqual(id, 1) + } + for rows.NextResultSet() { + for rows.Next() { + var id int + var name string + err = rows.Scan(&id, &name) + util.ExpectNoError(err) + util.ExpectEqual(id, 1) + util.ExpectEqual(name, "nameValue") + } + } + }) + + ginkgo.It("when gaea set supprt multiquery and client set multi query", func() { + gaeaReadWriteDB, err := sql.Open("mysql", dsn+"?multiStatements=true") + util.ExpectNoError(err, "get gaea read write conn") + defer gaeaReadWriteDB.Close() + sql := fmt.Sprintf("select id from %s limit 1;select id,name from %s limit 1", table, table) + rows, err := gaeaReadWriteDB.Query(sql) + util.ExpectNoError(err, "query gaea", sql) + defer rows.Close() + for rows.Next() { + var id int + err = rows.Scan(&id) + util.ExpectNoError(err) + util.ExpectEqual(id, 1) + } + for rows.NextResultSet() { + for rows.Next() { + var id int + var name string + err = rows.Scan(&id, &name) + util.ExpectNoError(err) + util.ExpectEqual(id, 1) + util.ExpectEqual(name, "nameValue") + } + } + }) + + ginkgo.It("when gaea not set supprt multiquery and client not set multi query", func() { + initNs.SupportMultiQuery = false + err = e2eMgr.ModifyNamespace(initNs) + util.ExpectNoError(err, "create namespace") + // wait mysql data sync and namespace load + time.Sleep(3 * time.Millisecond) + + gaeaReadWriteDB, err := sql.Open("mysql", dsn+"?multiStatements=false") + util.ExpectNoError(err, "get gaea read write conn") + defer gaeaReadWriteDB.Close() + sql := fmt.Sprintf("select id from %s limit 1;select id,name from %s limit 1", table, table) + rows, err := gaeaReadWriteDB.Query(sql) + util.ExpectNoError(err, "query gaea", sql) + defer rows.Close() + for rows.Next() { + var id int + err = rows.Scan(&id) + util.ExpectNoError(err) + util.ExpectEqual(id, 1) + } + for rows.NextResultSet() { + for rows.Next() { + var id int + var name string + err = rows.Scan(&id, &name) + util.ExpectNoError(err) + util.ExpectEqual(id, 1) + util.ExpectEqual(name, "nameValue") + } + } + }) + + ginkgo.It("when gaea not set supprt multiquery and client set multi query", func() { + initNs.SupportMultiQuery = false + err = e2eMgr.ModifyNamespace(initNs) + util.ExpectNoError(err, "create namespace") + // wait mysql data sync and namespace load + time.Sleep(3 * time.Millisecond) + + gaeaReadWriteDB, err := sql.Open("mysql", dsn+"?multiStatements=true") + util.ExpectNoError(err, "get gaea read write conn") + defer gaeaReadWriteDB.Close() + sql := fmt.Sprintf("select id from %s limit 1;select id,name from %s limit 1", table, table) + rows, err := gaeaReadWriteDB.Query(sql) + util.ExpectNoError(err, "query gaea", sql) + defer rows.Close() + for rows.Next() { + var id int + err = rows.Scan(&id) + util.ExpectNoError(err) + util.ExpectEqual(id, 1) + } + for rows.NextResultSet() { + for rows.Next() { + var id int + var name string + err = rows.Scan(&id, &name) + util.ExpectNoError(err) + util.ExpectEqual(id, 1) + util.ExpectEqual(name, "nameValue") + } + } + }) + + ginkgo.It("when gaea not set supprt multiquery and client set multi query insert", func() { + initNs.SupportMultiQuery = false + err = e2eMgr.ModifyNamespace(initNs) + util.ExpectNoError(err, "create namespace") + // wait mysql data sync and namespace load + time.Sleep(3 * time.Millisecond) + + masterAdminConn, err := slice.GetMasterAdminConn(0) + util.ExpectNoError(err) + util.SetupDatabaseAndInsertData(masterAdminConn, db, table) + gaeaReadWriteDB, err := sql.Open("mysql", dsn+"?multiStatements=true") + util.ExpectNoError(err) + _, err = gaeaReadWriteDB.Exec(fmt.Sprintf("INSERT INTO %s.%s (`id`, `name`) VALUES ('101', 'aaa');INSERT INTO %s.%s (`id`, `name`) VALUES ('102', 'bbb');", db, table, db, table)) + util.ExpectNoError(err) + }) + }) + + ginkgo.AfterEach(func() { + e2eMgr.Clean() + }) +}) diff --git a/tests/e2e/function/prepare_stmt.go b/tests/e2e/function/prepare_stmt.go new file mode 100644 index 00000000..dcc5abe6 --- /dev/null +++ b/tests/e2e/function/prepare_stmt.go @@ -0,0 +1,142 @@ +// Copyright 2024 The Gaea Authors. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package function + +import ( + "database/sql" + "errors" + "fmt" + "reflect" + "time" + + "github.com/XiaoMi/Gaea/proxy/server" + + "github.com/XiaoMi/Gaea/tests/e2e/config" + "github.com/XiaoMi/Gaea/tests/e2e/util" + + "github.com/onsi/ginkgo/v2" +) + +// This Ginkgo test suite is designed to validate the prepared statement functionality in Gaea when interfacing with a MySQL database configured with a dual-slave topology. The tests ensure that Gaea correctly prepares, executes, and fetches results from SQL queries using prepared statements, a critical feature for enhancing security and performance in database operations. +// The test scenarios within the Context block are structured to assess multiple aspects of prepared statement handling: +// 1. **Execution of Prepared Statements**: Tests whether Gaea can prepare and execute statements with parameters, verifying if the results returned match expected values. +// 2. **Parameter Mismatch Handling**: Verifies Gaea's error handling capabilities when the number of parameters provided during the execution does not match those expected by the prepared statement. +// Each It block: +// - Prepares a SQL statement with parameter placeholders. +// - Executes the statement with actual parameters, either expecting successful execution and specific results or anticipating an error due to parameter mismatches. +// - Uses helper functions to validate the results against expected outcomes or to confirm that appropriate errors are raised. +// Specific tests include: +// - Successful preparation and execution of a query retrieving specific rows, validating the accuracy of data retrieval. +// - Execution of a query with insufficient parameters to trigger error handling mechanisms, testing the robustness of Gaea's error reporting. +// Overall, this testing strategy is crucial for confirming that Gaea’s prepared statement processing is reliable, accurate, and secure, particularly in complex database architectures like those with master-slave configurations. This capability is essential for applications that rely on dynamic SQL generation and execution where prepared statements play a key role in preventing SQL injection attacks and optimizing query performance. +var _ = ginkgo.Describe("prepare stmt test", func() { + e2eMgr := config.NewE2eManager() + db := config.DefaultE2eDatabase + slice := e2eMgr.NsSlices[config.SliceDualSlave] + table := config.DefaultE2eTable + ginkgo.BeforeEach(func() { + // mysql prepare + masterAdminConn, err := slice.GetMasterAdminConn(0) + util.ExpectNoError(err) + err = util.SetupDatabaseAndInsertData(masterAdminConn, db, table) + util.ExpectNoError(err) + // namespace prepare + initNs, err := config.ParseNamespaceTmpl(config.DefaultNamespaceTmpl, slice) + util.ExpectNoError(err, "parse namespace template") + err = e2eMgr.ModifyNamespace(initNs) + util.ExpectNoError(err) + // wait mysql data sync and namespace load + time.Sleep(500 * time.Millisecond) + }) + + ginkgo.Context("test prepare and exec stmts", func() { + ginkgo.It("should handle prepare sqls correctly", func() { + gaeaConn, err := e2eMgr.GetWriteGaeaUserConn() + util.ExpectNoError(err) + + sqlCases := []struct { + PrepareSQL string + ExecSQL []interface{} + ExpectRes [][]string + ExpectErr string + }{ + { + PrepareSQL: fmt.Sprintf("SELECT * FROM %s.%s WHERE id = ? and name = ?", db, table), + ExecSQL: []interface{}{9, "nameValue"}, + ExpectRes: [][]string{{ + "9", "nameValue", + }}, + }, + { + PrepareSQL: fmt.Sprintf("SELECT * FROM %s.%s WHERE id = ? and name = ? limit 1", db, table), + ExecSQL: []interface{}{9, "nameValue"}, + ExpectRes: [][]string{{ + "9", "nameValue", + }}, + }, + { + PrepareSQL: fmt.Sprintf("SELECT * FROM %s.%s WHERE id = ? and name = ?", db, table), + ExecSQL: []interface{}{9}, + ExpectErr: "exec params mismatch", + }, + } + + for _, sqlCase := range sqlCases { + stmt, err := gaeaConn.Prepare(sqlCase.PrepareSQL) + if sqlCase.ExpectErr != "" { + count, _, _, _ := server.CalcParams(sqlCase.PrepareSQL) + if len(sqlCase.ExecSQL) != count { + err = errors.New("exec params mismatch") + } + + util.ExpectEqual(err.Error(), sqlCase.ExpectErr) + continue + } + util.ExpectNoError(err) + + err = checkPrepareExecRes(stmt, sqlCase.ExecSQL, sqlCase.ExpectRes) + util.ExpectNoError(err) + } + }) + }) + + ginkgo.AfterEach(func() { + e2eMgr.Clean() + }) +}) + +func checkPrepareExecRes(db *sql.Stmt, params []interface{}, values [][]string) error { + rows, err := db.Query(params[0].(int), params[1].(string)) + defer rows.Close() + if err != nil { + if err == sql.ErrNoRows && len(values) == 0 { + return nil + } + return fmt.Errorf("db Exec Error %v", err) + } + + res, err := util.GetDataFromRows(rows) + if err != nil { + return fmt.Errorf("get data from rows error:%v", err) + } + if (len(res) == 0 || res == nil) && len(values) == 0 { + return nil + } + if !reflect.DeepEqual(values, res) { + return fmt.Errorf("mismatch. Actual: %v, Expect: %v", res, values) + } + + return nil +} diff --git a/tests/e2e/function/qps_limit.go b/tests/e2e/function/qps_limit.go new file mode 100644 index 00000000..8340fb69 --- /dev/null +++ b/tests/e2e/function/qps_limit.go @@ -0,0 +1,114 @@ +package function + +import ( + "fmt" + "time" + + "github.com/XiaoMi/Gaea/tests/e2e/config" + "github.com/XiaoMi/Gaea/tests/e2e/util" + + "github.com/onsi/ginkgo/v2" +) + +var _ = ginkgo.Describe("client qps limit test", func() { + e2eMgr := config.NewE2eManager() + db := config.DefaultE2eDatabase + slice := e2eMgr.NsSlices[config.SliceDualSlave] + table := config.DefaultE2eTable + initNs, err := config.ParseNamespaceTmpl(config.DefaultNamespaceTmpl, slice) + util.ExpectNoError(err, "parse namespace template") + + ginkgo.BeforeEach(func() { + // mysql prepare + masterAdminConn, err := slice.GetMasterAdminConn(0) + util.ExpectNoError(err) + err = util.SetupDatabaseAndInsertData(masterAdminConn, db, table) + util.ExpectNoError(err) + err = e2eMgr.ModifyNamespace(initNs) + util.ExpectNoError(err) + // wait mysql data sync and namespace load + time.Sleep(50 * time.Millisecond) + }) + + ginkgo.Context("test client qps limit", func() { + ginkgo.It("should limit client qps correctly", func() { + sqlCases := []struct { + limitQPS uint32 + actualQPS int + limitTx bool + }{ + { + limitQPS: 5, + actualQPS: 5, + limitTx: false, + }, + { + limitQPS: 0, + actualQPS: 20, + limitTx: false, + }, + { + limitQPS: 5, + actualQPS: 5, + limitTx: true, + }, + { + limitQPS: 0, + actualQPS: 60, + limitTx: true, + }, + } + + testCount := 20 + for index, test := range sqlCases { + initNs.ClientQPSLimit = test.limitQPS + initNs.SupportLimitTransaction = test.limitTx + err = e2eMgr.ModifyNamespace(initNs) + util.ExpectNoError(err) + time.Sleep(100 * time.Millisecond) + qpsCount := 0 + now := time.Now() + if test.limitTx { + for i := 0; i < testCount; i++ { + gaeaTestConn, _ := e2eMgr.GetReadWriteGaeaUserConn() + tx, err := gaeaTestConn.Begin() + if err == nil { + qpsCount++ + } else { + continue + } + _, err = tx.Exec("select 1") + if err == nil { + qpsCount++ + } else { + continue + } + err = tx.Commit() + if err == nil { + qpsCount++ + } + } + } else { + for i := 0; i < testCount; i++ { + gaeaTestConn, err := e2eMgr.GetReadWriteGaeaUserConn() + util.ExpectNoError(err) + _, err = gaeaTestConn.Exec("select 1") + gaeaTestConn.Close() + if err == nil { + qpsCount++ + } else { + fmt.Printf("********qps limit: %v", err) + } + } + } + + duration := time.Since(now).Milliseconds() + util.ExpectEqual(qpsCount, test.actualQPS, fmt.Sprintf("test %d: actual qps not expected, duration: %d", index, duration)) + } + }) + }) + + ginkgo.AfterEach(func() { + e2eMgr.Clean() + }) +}) diff --git a/tests/e2e/function/readwritesep.go b/tests/e2e/function/readwritesep.go new file mode 100644 index 00000000..3e26b4ee --- /dev/null +++ b/tests/e2e/function/readwritesep.go @@ -0,0 +1,196 @@ +// Copyright 2024 The Gaea Authors. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package function + +import ( + "database/sql" + "fmt" + "time" + + "github.com/XiaoMi/Gaea/tests/e2e/config" + "github.com/XiaoMi/Gaea/tests/e2e/util" + + "github.com/onsi/ginkgo/v2" + "github.com/onsi/gomega" +) + +// This script, titled "Read-Write Splitting" focuses on verifying the correct routing of read and write operations in a database system with a dual-slave configuration. +// The test sets up various scenarios using different types of database connections (read-only, write-only, and read-write) to execute SQL queries. +// The goal is to ensure that read operations are directed to the slave nodes and write operations to the master node. +// It uses a mixture of successful and expected-to-fail SQL operations to validate the read-write splitting functionality. +// The results are then verified to confirm that the queries are executed on the intended backend nodes. +var _ = ginkgo.Describe("Read-Write Splitting", func() { + e2eMgr := config.NewE2eManager() + db := config.DefaultE2eDatabase + slice := e2eMgr.NsSlices[config.SliceDualSlave] + table := config.DefaultE2eTable + ginkgo.BeforeEach(func() { + // mysql prepare + masterAdminConn, err := slice.GetMasterAdminConn(0) + util.ExpectNoError(err) + err = util.SetupDatabaseAndInsertData(masterAdminConn, db, table) + util.ExpectNoError(err) + // namespace prepare + initNs, err := config.ParseNamespaceTmpl(config.DefaultNamespaceTmpl, slice) + util.ExpectNoError(err, "parse namespace template") + err = e2eMgr.ModifyNamespace(initNs) + util.ExpectNoError(err) + // wait mysql data sync and namespace load + time.Sleep(3 * time.Millisecond) + }) + + ginkgo.Context("When handling read and write operations", func() { + ginkgo.It("should direct read operations to replicas", func() { + gaeaReadWriteConn, err := e2eMgr.GetReadWriteGaeaUserConn() + util.ExpectNoError(err) + defer gaeaReadWriteConn.Close() + + gaeaWriteConn, err := e2eMgr.GetWriteGaeaUserConn() + util.ExpectNoError(err) + defer gaeaWriteConn.Close() + + gaeaReadConn, err := e2eMgr.GetReadGaeaUserConn() + util.ExpectNoError(err) + defer gaeaReadConn.Close() + + sqlCases := []struct { + GaeaConn *sql.DB + GaeaSQL string + ExpectBackendAddr string + IsSuccess bool + }{ + { + GaeaConn: gaeaReadWriteConn, + GaeaSQL: fmt.Sprintf("SELECT * FROM `%s`.`%s` WHERE `id`= 1 FOR UPDATE", db, table), + ExpectBackendAddr: slice.Slices[0].Master, + IsSuccess: true, + }, + { + GaeaConn: gaeaReadWriteConn, + GaeaSQL: fmt.Sprintf("SELECT * FROM `%s`.`%s` WHERE `id`= 1", db, table), + ExpectBackendAddr: slice.Slices[0].Slaves[0], + IsSuccess: true, + }, + { + GaeaConn: gaeaReadWriteConn, + GaeaSQL: fmt.Sprintf("DELETE FROM %s.%s WHERE id=2", db, table), + ExpectBackendAddr: slice.Slices[0].Master, + IsSuccess: true, + }, + { + GaeaConn: gaeaReadWriteConn, + GaeaSQL: fmt.Sprintf("UPDATE %s.%s SET name= '%s' WHERE id=3", db, table, "newName"), + ExpectBackendAddr: slice.Slices[0].Master, + IsSuccess: true, + }, + { + GaeaConn: gaeaReadWriteConn, + GaeaSQL: fmt.Sprintf("INSERT INTO %s.%s (name) VALUES ('tempValue')", db, table), + ExpectBackendAddr: slice.Slices[0].Master, + IsSuccess: true, + }, + // 写用户 + { + GaeaConn: gaeaWriteConn, + GaeaSQL: fmt.Sprintf("SELECT * FROM `%s`.`%s` WHERE `id`= 1 FOR UPDATE", db, table), + ExpectBackendAddr: slice.Slices[0].Master, + IsSuccess: true, + }, + { + GaeaConn: gaeaWriteConn, + GaeaSQL: fmt.Sprintf("SELECT * FROM `%s`.`%s` WHERE `id`= 1", db, table), + ExpectBackendAddr: slice.Slices[0].Master, + IsSuccess: true, + }, + { + GaeaConn: gaeaWriteConn, + GaeaSQL: fmt.Sprintf("DELETE FROM %s.%s WHERE id=2", db, table), + ExpectBackendAddr: slice.Slices[0].Master, + IsSuccess: true, + }, + { + GaeaConn: gaeaWriteConn, + GaeaSQL: fmt.Sprintf("UPDATE %s.%s SET name= '%s' WHERE id=3", db, table, "newName"), + ExpectBackendAddr: slice.Slices[0].Master, + IsSuccess: true, + }, + { + GaeaConn: gaeaWriteConn, + GaeaSQL: fmt.Sprintf("INSERT INTO %s.%s (name) VALUES ('tempValue')", db, table), + ExpectBackendAddr: slice.Slices[0].Master, + IsSuccess: true, + }, + //读用户 + { + GaeaConn: gaeaReadConn, + GaeaSQL: fmt.Sprintf("SELECT * FROM `%s`.`%s` WHERE `id`= 1 FOR UPDATE", db, table), + ExpectBackendAddr: slice.Slices[0].Slaves[1], + IsSuccess: true, + }, + + { + GaeaConn: gaeaReadConn, + GaeaSQL: fmt.Sprintf("SELECT * FROM `%s`.`%s` WHERE `id`= 1", db, table), + ExpectBackendAddr: slice.Slices[0].Slaves[0], + IsSuccess: true, + }, + { + GaeaConn: gaeaReadConn, + GaeaSQL: fmt.Sprintf("DELETE FROM %s.%s WHERE `id`= 2", db, table), + IsSuccess: false, + }, + { + GaeaConn: gaeaReadConn, + GaeaSQL: fmt.Sprintf("UPDATE %s.%s SET name= '%s' WHERE id=3", db, table, "newName"), + IsSuccess: false, + }, + { + GaeaConn: gaeaReadConn, + GaeaSQL: fmt.Sprintf("INSERT INTO %s.%s (name) VALUES ('tempValue')", db, table), + IsSuccess: false, + }, + } + for index, sqlCase := range sqlCases { + e2eMgr.ClearSqlLog() + currentTime := time.Now() + _, err := sqlCase.GaeaConn.Exec(sqlCase.GaeaSQL) + if !sqlCase.IsSuccess { + util.ExpectError(err, fmt.Sprintf("sql Case %d", index)) + continue + } else { + util.ExpectNoError(err, fmt.Sprintf("sql Case %d", index)) + } + + var res []util.LogEntry + retryCount := 3 // 设置重试次数 + for i := 0; i < retryCount; i++ { + time.Sleep(500 * time.Millisecond) // 等待一段时间再重试 + res, err = e2eMgr.SearchSqlLog(sqlCase.GaeaSQL, currentTime) + if err == nil && len(res) == 1 { + break + } + } + // 检查结果 + util.ExpectNoError(err) + gomega.Expect(res).Should(gomega.HaveLen(1)) + gomega.Expect(sqlCase.ExpectBackendAddr).Should(gomega.Equal(res[0].BackendAddr)) + } + }) + }) + ginkgo.AfterEach(func() { + e2eMgr.Clean() + }) + +}) diff --git a/tests/e2e/function/session_variables.go b/tests/e2e/function/session_variables.go new file mode 100644 index 00000000..8b019233 --- /dev/null +++ b/tests/e2e/function/session_variables.go @@ -0,0 +1,398 @@ +// Copyright 2024 The Gaea Authors. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package function + +import ( + "database/sql" + "fmt" + + "github.com/XiaoMi/Gaea/tests/e2e/config" + "github.com/XiaoMi/Gaea/tests/e2e/util" + + "github.com/onsi/ginkgo/v2" +) + +// This Go testing file is part of an end-to-end testing suite designed to validate the functionality of setting variables in a Gaea database environment. +// The primary focus is to ensure that session-specific settings such as transaction isolation levels, maximum execution time, and unique checks behave as expected within a database session, +// and to validate their correct implementation in the Gaea database middleware. +// Key Objectives of the Testing File: +// Session Variable Configuration: The tests aim to verify that various session variables can be set and retrieved correctly. +// These variables include settings for transaction isolation, maximum execution time, and checks for data uniqueness. +var _ = ginkgo.Describe("Test Gaea SET SESSION Variables", func() { + e2eMgr := config.NewE2eManager() + db := config.DefaultE2eDatabase + table := config.DefaultE2eTable + slice := e2eMgr.NsSlices[config.SliceSingleTestMaster] + var needCleanup bool + var allowedSessionVariables map[string]string + + // This is run once before each test (`It` block) to ensure fresh setup + ginkgo.BeforeEach(func() { + masterAdminConn, err := slice.GetMasterAdminConn(0) + util.ExpectNoError(err) + err = util.SetupDatabaseAndInsertData(masterAdminConn, db, table) + util.ExpectNoError(err) + }) + + ginkgo.Context("When session variables are correctly configured", func() { + ginkgo.BeforeEach(func() { + allowedSessionVariables = map[string]string{ + "transaction_isolation": "string", + "max_execution_time": "int", + "unique_checks": "bool", + "max_heap_table_size": "int", + } + + // Namespace preparation and modification per test to ensure isolation + initNs, err := config.ParseNamespaceTmpl(config.DefaultNamespaceTmpl, slice) + util.ExpectNoError(err, "parse namespace template") + initNs.AllowedSessionVariables = allowedSessionVariables + err = e2eMgr.ModifyNamespace(initNs) + util.ExpectNoError(err) + }) + + ginkgo.It("should validate correctly configured session variables that are present in variableVerifyFuncMap", func() { + // Sub-scenario A: Variables are in the verification map + scenarioATests := []struct { + VariableName string + Type string + AlternativeValues []interface{} + }{ + // session variable in variableVerifyFuncMap and Namespace + {"transaction_isolation", "string", []interface{}{"READ-UNCOMMITTED", "REPEATABLE-READ"}}, + {"unique_checks", "bool", []interface{}{1, 0}}, + {"max_execution_time", "int", []interface{}{5000, 10000}}, + } + + for _, test := range scenarioATests { + gaeaConn, err := e2eMgr.GetReadWriteGaeaUserConn() + util.ExpectNoError(err) + + // Check current value to avoid testing with the default value + getCurrentValueSQL := fmt.Sprintf("SELECT @@SESSION.%s", test.VariableName) + row := gaeaConn.QueryRow(getCurrentValueSQL) + defaultValue, err := scanVariableValue(row, test.Type) + util.ExpectNoError(err) + + for _, setValue := range test.AlternativeValues { + if setValue != defaultValue { + // Attempt to set the New value for the session variable + setSQL := generateSetSessionSQL(test.VariableName, test.Type, setValue) + _, err = gaeaConn.Exec(setSQL) + util.ExpectNoError(err) + + //Verify that the session variable's value has changed + row = gaeaConn.QueryRow(getCurrentValueSQL) + actualValue, err := scanVariableValue(row, test.Type) + util.ExpectNoError(err) + util.ExpectEqual(actualValue, setValue) + + // Restore the session variable to its original default value + restoreSQL := generateSetSessionSQL(test.VariableName, test.Type, defaultValue) + _, err = gaeaConn.Exec(restoreSQL) + util.ExpectNoError(err) + + // Verify that the session variable has been restored to its default value + row = gaeaConn.QueryRow(getCurrentValueSQL) + restoredValue, err := scanVariableValue(row, test.Type) + util.ExpectNoError(err) + util.ExpectEqual(restoredValue, defaultValue) + // Test next variable after successful change and restoration + break + } + } + } + }) + + ginkgo.It("should handle correctly configured session variables not present in variableVerifyFuncMap", func() { + // Test handling when variables are correct but not in the verification map + needCleanup = true // Set this flag only if the test modifies the namespace + tests := []struct { + VariableName string + Type string + AlternativeValues []interface{} + }{ + // session variable not in variableVerifyFuncMap and Namespace + {"max_heap_table_size", "int", []interface{}{16384, 16777216}}, + } + + for _, test := range tests { + gaeaConn, err := e2eMgr.GetReadWriteGaeaUserConn() + util.ExpectNoError(err) + + // Check current value to avoid testing with the default value + getCurrentValueSQL := fmt.Sprintf("SELECT @@SESSION.%s", test.VariableName) + row := gaeaConn.QueryRow(getCurrentValueSQL) + defaultValue, err := scanVariableValue(row, test.Type) + util.ExpectNoError(err) + + for _, setValue := range test.AlternativeValues { + if setValue != defaultValue { + // Attempt to set the New value for the session variable + setSQL := generateSetSessionSQL(test.VariableName, test.Type, setValue) + _, err = gaeaConn.Exec(setSQL) + util.ExpectNoError(err) + + //Verify that the session variable's value has changed + row = gaeaConn.QueryRow(getCurrentValueSQL) + actualValue, err := scanVariableValue(row, test.Type) + util.ExpectNoError(err) + util.ExpectEqual(actualValue, setValue) + + // Restore the session variable to its original default value + restoreSQL := generateSetSessionSQL(test.VariableName, test.Type, defaultValue) + _, err = gaeaConn.Exec(restoreSQL) + util.ExpectNoError(err) + + // Verify that the session variable has been restored to its default value + row = gaeaConn.QueryRow(getCurrentValueSQL) + restoredValue, err := scanVariableValue(row, test.Type) + util.ExpectNoError(err) + util.ExpectEqual(restoredValue, defaultValue) + // Test next variable after successful change and restoration + break + } + } + } + }) + }) + + ginkgo.Context("When session variables are incorrectly configured", func() { + ginkgo.BeforeEach(func() { + allowedSessionVariables = map[string]string{ + // wrong type for session variable + "transaction_isolation": "int", + // correct type for session variable + "max_execution_time": "int", + // correct type for session variable + "unique_checks": "bool", + // wrong type for session variable + "max_heap_table_size": "string", + } + + // Namespace preparation and modification per test to ensure isolation + initNs, err := config.ParseNamespaceTmpl(config.DefaultNamespaceTmpl, slice) + util.ExpectNoError(err, "parse namespace template") + initNs.AllowedSessionVariables = allowedSessionVariables + err = e2eMgr.ModifyNamespace(initNs) + util.ExpectNoError(err) + }) + + ginkgo.It("should handle incorrectly configured session variables present in variableVerifyFuncMap", func() { + // Sub-scenario A: Variables are in the verification map but have incorrect types + scenarioATests := []struct { + VariableName string + Type string + AlternativeValues []interface{} + }{ + // session variable in variableVerifyFuncMap but configured with incorrect types + {"transaction_isolation", "string", []interface{}{"READ-UNCOMMITTED", "REPEATABLE-READ"}}, + } + + for _, test := range scenarioATests { + gaeaConn, err := e2eMgr.GetReadWriteGaeaUserConn() + util.ExpectNoError(err) + // Check current value to avoid testing with the default value + getCurrentValueSQL := fmt.Sprintf("SELECT @@SESSION.%s", test.VariableName) + row := gaeaConn.QueryRow(getCurrentValueSQL) + defaultValue, err := scanVariableValue(row, test.Type) + util.ExpectNoError(err) + + for _, setValue := range test.AlternativeValues { + if setValue != defaultValue { + // Attempt to set the New value for the session variable + setSQL := generateSetSessionSQL(test.VariableName, test.Type, setValue) + _, err = gaeaConn.Exec(setSQL) + util.ExpectError(err, "Expected error due to incorrect type for variable") + + // Verify that the session variable's value has not changed + row := gaeaConn.QueryRow(getCurrentValueSQL) + actualValue, err := scanVariableValue(row, "string") + util.ExpectNoError(err) + util.ExpectEqual(actualValue, defaultValue) + break + } + } + } + }) + + ginkgo.It("should handle incorrectly configured session variables not present in variableVerifyFuncMap", func() { + // Sub-scenario B: Variables not in the verification map but have incorrect types + needCleanup = true // Set this flag only if the test modifies the namespace + tests := []struct { + VariableName string + Type string + AlternativeValues []interface{} + }{ + // session variable not in variableVerifyFuncMap but configured with incorrect types + {"max_heap_table_size", "int", []interface{}{16384, 16777216}}, + } + + for _, test := range tests { + gaeaConn, err := e2eMgr.GetReadWriteGaeaUserConn() + util.ExpectNoError(err) + // Check current value to avoid testing with the default value + getCurrentValueSQL := fmt.Sprintf("SELECT @@SESSION.%s", test.VariableName) + row := gaeaConn.QueryRow(getCurrentValueSQL) + defaultValue, err := scanVariableValue(row, test.Type) + util.ExpectNoError(err) + + for _, setValue := range test.AlternativeValues { + if setValue != defaultValue { + // Attempt to set the New value for the session variable + setSQL := generateSetSessionSQL(test.VariableName, test.Type, setValue) + _, err = gaeaConn.Exec(setSQL) + util.ExpectNoError(err, "Expected error due to incorrect type for variable") + + // First Select + row := gaeaConn.QueryRow(getCurrentValueSQL) + _, err := scanVariableValue(row, "int") + util.ExpectError(err) + + // Verify that the session variable's value has not changed + row = gaeaConn.QueryRow(getCurrentValueSQL) + actualValue, err := scanVariableValue(row, "int") + util.ExpectNoError(err) + util.ExpectEqual(actualValue, defaultValue) + break + } + } + } + }) + }) + + ginkgo.Context("When session variables are not configured", func() { + ginkgo.BeforeEach(func() { + // Namespace preparation and modification per test to ensure isolation + initNs, err := config.ParseNamespaceTmpl(config.DefaultNamespaceTmpl, slice) + util.ExpectNoError(err, "parse namespace template") + err = e2eMgr.ModifyNamespace(initNs) + util.ExpectNoError(err) + }) + + ginkgo.It("should not allow session variables not configured but present in variableVerifyFuncMap", func() { + // Sub-scenario A: Variables are in the verification map but not configured in allowedSessionVariables + scenarioATests := []struct { + VariableName string + Type string + AlternativeValues []interface{} + }{ + // session variable in variableVerifyFuncMap but not configured in allowedSessionVariables + {"transaction_isolation", "string", []interface{}{"READ-UNCOMMITTED", "REPEATABLE-READ"}}, + } + + for _, test := range scenarioATests { + gaeaConn, err := e2eMgr.GetReadWriteGaeaUserConn() + util.ExpectNoError(err) + // Check current value to avoid testing with the default value + getCurrentValueSQL := fmt.Sprintf("SELECT @@SESSION.%s", test.VariableName) + row := gaeaConn.QueryRow(getCurrentValueSQL) + defaultValue, err := scanVariableValue(row, test.Type) + util.ExpectNoError(err) + + for _, setValue := range test.AlternativeValues { + if setValue != defaultValue { + // Attempt to set the New value for the session variable + setSQL := generateSetSessionSQL(test.VariableName, test.Type, setValue) + _, err = gaeaConn.Exec(setSQL) + util.ExpectNoError(err, "Setting a session variable not configured in allowedSessionVariables should not throw an error") + + // Verify that the session variable's value has not changed + row = gaeaConn.QueryRow(getCurrentValueSQL) + actualValue, err := scanVariableValue(row, "string") + util.ExpectNoError(err) + util.ExpectEqual(actualValue, defaultValue) + } + } + } + }) + + ginkgo.It("should not allow session variables not configured and not present in variableVerifyFuncMap", func() { + // Sub-scenario B: Variables not in the verification map and not configured in allowedSessionVariables + needCleanup = true // Set this flag only if the test modifies the namespace + tests := []struct { + VariableName string + Type string + AlternativeValues []interface{} + }{ + // session variable not in variableVerifyFuncMap and not configured in allowedSessionVariables + {"max_heap_table_size", "int", []interface{}{16384, 16777216}}, + } + + for _, test := range tests { + gaeaConn, err := e2eMgr.GetReadWriteGaeaUserConn() + util.ExpectNoError(err) + // Check current value to avoid testing with the default value + getCurrentValueSQL := fmt.Sprintf("SELECT @@SESSION.%s", test.VariableName) + row := gaeaConn.QueryRow(getCurrentValueSQL) + defaultValue, err := scanVariableValue(row, test.Type) + util.ExpectNoError(err) + + for _, setValue := range test.AlternativeValues { + if setValue != defaultValue { + // Attempt to set the New value for the session variable + setSQL := generateSetSessionSQL(test.VariableName, test.Type, setValue) + _, err = gaeaConn.Exec(setSQL) + util.ExpectNoError(err, "Setting a session variable not configured in allowedSessionVariables should not throw an error") + + // Verify that the session variable's value has not changed + row = gaeaConn.QueryRow(getCurrentValueSQL) + actualValue, err := scanVariableValue(row, "int") + util.ExpectNoError(err) + util.ExpectEqual(actualValue, defaultValue) + + } + } + } + }) + }) + + ginkgo.AfterEach(func() { + if needCleanup { + e2eMgr.Clean() + needCleanup = false // Reset flag after cleaning + } + }) +}) + +func generateSetSessionSQL(variableName string, variableType string, value interface{}) string { + if variableType == "string" { + // Properly quote string values + return fmt.Sprintf("SET SESSION %s = '%v';", variableName, value) + } + // Non-string values do not need quotes + return fmt.Sprintf("SET SESSION %s = %v;", variableName, value) +} + +func scanVariableValue(row *sql.Row, variableType string) (interface{}, error) { + switch variableType { + case "int", "bool": + var intValue int + err := row.Scan(&intValue) + if err != nil { + return nil, err + } + return intValue, nil + case "string": + var stringValue string + err := row.Scan(&stringValue) + if err != nil { + return nil, err + } + return stringValue, nil + default: + return nil, fmt.Errorf("unsupported variable type: %s", variableType) + } +} diff --git a/tests/e2e/function/set_session_read_only.go b/tests/e2e/function/set_session_read_only.go new file mode 100644 index 00000000..0cd24eb9 --- /dev/null +++ b/tests/e2e/function/set_session_read_only.go @@ -0,0 +1,90 @@ +// Copyright 2024 The Gaea Authors. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package function + +import ( + "fmt" + "time" + + "github.com/XiaoMi/Gaea/tests/e2e/config" + "github.com/XiaoMi/Gaea/tests/e2e/util" + + "github.com/onsi/ginkgo/v2" +) + +// This script, titled "Show Sql Type" is designed to evaluate the behavior of SQL queries, particularly SHOW VARIABLES LIKE, in a dual-slave database configuration. +// The script sets up the environment and then executes the SHOW VARIABLES LIKE SQL command to determine whether it's correctly directed to the master node in the setup. +// This test ensures that specific queries are handled by the appropriate database nodes (master or slave) as expected in a read-write split environment. +// The results from the SQL log are checked to confirm that the execution happens on the correct backend address, validating the routing logic in the database setup. +var _ = ginkgo.Describe("SET SESSION transaction_read_only Test", func() { + e2eMgr := config.NewE2eManager() + db := config.DefaultE2eDatabase + table := config.DefaultE2eTable + slice := e2eMgr.NsSlices[config.SliceSingleMaster] + ginkgo.BeforeEach(func() { + // mysql prepare + masterAdminConn, err := slice.GetMasterAdminConn(0) + util.ExpectNoError(err) + err = util.SetupDatabaseAndInsertData(masterAdminConn, db, table) + util.ExpectNoError(err) + + // namespace prepare + initNs, err := config.ParseNamespaceTmpl(config.DefaultNamespaceTmpl, slice) + util.ExpectNoError(err, "parse namespace template") + + // limit slice capacity = 1 and max_capacity = 1 + initNs.Slices[0].Capacity = 1 + initNs.Slices[0].MaxCapacity = 1 + + // modify namespace + err = e2eMgr.ModifyNamespace(initNs) + util.ExpectNoError(err) + // wait mysql data sync and namespace load + time.Sleep(3 * time.Millisecond) + }) + + ginkgo.Context("test set session readonly", func() { + ginkgo.It("should correctly handle read-only transactions and write operations", func() { + // 获取两个连接,模拟两个不同的客户端 + gaeaConn1, err := e2eMgr.GetReadWriteGaeaUserConn() + util.ExpectNoError(err) + gaeaConn2, err := e2eMgr.GetReadWriteGaeaUserConn() + util.ExpectNoError(err) + + // 客户端1开始事务,并设置为只读 + _, err = gaeaConn1.Exec("BEGIN;") + util.ExpectNoError(err) + _, err = gaeaConn1.Exec("SET SESSION transaction_read_only = 1;") + util.ExpectNoError(err) + _, err = gaeaConn1.Exec(fmt.Sprintf("SELECT * FROM %s.%s;", db, table)) + util.ExpectNoError(err) + _, err = gaeaConn1.Exec("COMMIT;") + util.ExpectNoError(err) + + // 客户端2尝试写入操作 + _, err = gaeaConn2.Exec("BEGIN;") + util.ExpectNoError(err) + _, err = gaeaConn2.Exec(fmt.Sprintf("INSERT INTO %s.%s (name) VALUES (?)", db, table), "TestSessionReadOnly") + util.ExpectNoError(err) + _, err = gaeaConn2.Exec("COMMIT;") + util.ExpectNoError(err) + + }) + }) + + ginkgo.AfterEach(func() { + e2eMgr.Clean() + }) +}) diff --git a/tests/e2e/function/show_type.go b/tests/e2e/function/show_type.go new file mode 100644 index 00000000..1d4b55f9 --- /dev/null +++ b/tests/e2e/function/show_type.go @@ -0,0 +1,87 @@ +// Copyright 2024 The Gaea Authors. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package function + +import ( + "database/sql" + "fmt" + "time" + + "github.com/XiaoMi/Gaea/tests/e2e/config" + "github.com/XiaoMi/Gaea/tests/e2e/util" + + "github.com/onsi/ginkgo/v2" + "github.com/onsi/gomega" +) + +// This script, titled "Show Sql Type" is designed to evaluate the behavior of SQL queries, particularly SHOW VARIABLES LIKE, in a dual-slave database configuration. +// The script sets up the environment and then executes the SHOW VARIABLES LIKE SQL command to determine whether it's correctly directed to the master node in the setup. +// This test ensures that specific queries are handled by the appropriate database nodes (master or slave) as expected in a read-write split environment. +// The results from the SQL log are checked to confirm that the execution happens on the correct backend address, validating the routing logic in the database setup. +var _ = ginkgo.Describe("Show Sql Type", func() { + e2eMgr := config.NewE2eManager() + db := config.DefaultE2eDatabase + slice := e2eMgr.NsSlices[config.SliceDualSlave] + currentTime := time.Now() + ginkgo.BeforeEach(func() { + // mysql prepare + masterAdminConn, err := slice.GetMasterAdminConn(0) + util.ExpectNoError(err) + _, err = masterAdminConn.Exec(fmt.Sprintf(`CREATE DATABASE IF NOT EXISTS %s`, db)) + util.ExpectNoError(err) + // namespace prepare + initNs, err := config.ParseNamespaceTmpl(config.DefaultNamespaceTmpl, slice) + util.ExpectNoError(err, "parse namespace template") + err = e2eMgr.ModifyNamespace(initNs) + util.ExpectNoError(err) + // wait mysql data sync and namespace load + time.Sleep(3 * time.Millisecond) + }) + + ginkgo.Context("show variables like", func() { + ginkgo.It("show variables like to master or slave", func() { + gaeaConns, err := e2eMgr.GetReadWriteGaeaUserConn() + util.ExpectNoError(err) + sqlCase := []struct { + sql string + gaeaConns []*sql.DB + expectAddrs []string + }{ + { + sql: `show variables like "read_only"`, + gaeaConns: []*sql.DB{gaeaConns}, + expectAddrs: []string{slice.Slices[0].Master}, + }, + } + + for _, sqlCase := range sqlCase { + for i := 0; i < len(sqlCase.expectAddrs); i++ { + sql := fmt.Sprintf("/*i:%d*/ %s", i, sqlCase.sql) + _, err := sqlCase.gaeaConns[i].Exec(sql) + util.ExpectNoError(err) + res, err := e2eMgr.SearchSqlLog(sql, currentTime) + util.ExpectNoError(err) + gomega.Expect(res).Should(gomega.HaveLen(1)) + gomega.Expect(res[0].BackendAddr).Should(gomega.Equal(sqlCase.expectAddrs[i])) + } + } + + }) + }) + + ginkgo.AfterEach(func() { + e2eMgr.Clean() + }) +}) diff --git a/tests/e2e/function/slave_fuse.go b/tests/e2e/function/slave_fuse.go new file mode 100644 index 00000000..fc74b92b --- /dev/null +++ b/tests/e2e/function/slave_fuse.go @@ -0,0 +1,125 @@ +// Copyright 2024 The Gaea Authors. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package function + +import ( + _ "embed" + "fmt" + "time" + + "github.com/XiaoMi/Gaea/tests/e2e/config" + "github.com/XiaoMi/Gaea/tests/e2e/util" + "github.com/onsi/ginkgo/v2" + "github.com/onsi/gomega" +) + +// This script, titled "Test slave fuse" is designed to evaluate the behavior of a database system when slave nodes encounter specific issues. +// The test involves modifying database privileges and configurations to simulate scenarios where slave nodes have restricted access or altered roles. +// It checks whether the system correctly handles these changes without causing any service interruptions or incorrect data routing. +// The test ensures the resilience and stability of the database system in handling slave node issues, maintaining consistent query distribution and data integrity. +var _ = ginkgo.Describe("Test slave fuse", func() { + e2eMgr := config.NewE2eManager() + db, table := e2eMgr.Db, e2eMgr.Table + slice := e2eMgr.NsSlices[config.SliceDualSlave] + initNs, err := config.ParseNamespaceTmpl(config.DefaultNamespaceTmpl, slice) + util.ExpectNoError(err, "parse Namespace Tmpl") + masterAdminConn, err := slice.GetMasterAdminConn(0) + util.ExpectNoError(err, "get master admin conn") + + ginkgo.BeforeEach(func() { + // mysql prepare + err = util.SetupDatabaseAndInsertData(masterAdminConn, db, table) + util.ExpectNoError(err, "setup database and insert data") + // namespace prepare + err = e2eMgr.ModifyNamespace(initNs) + util.ExpectNoError(err, "create namespace") + // wait mysql data sync and namespace load + time.Sleep(1 * time.Second) + }) + + ginkgo.It("slave will not fuse when no privilege to show slave status", func() { + e2eMgr.ClearSqlLog() + e2eMgr.StartTime = time.Now() + // step1: revoke mysql cluster privilege + _, err = masterAdminConn.Exec(fmt.Sprintf(`REVOKE REPLICATION SLAVE, REPLICATION CLIENT ON *.* from '%s'@'%%'`, slice.Slices[0].UserName)) + util.ExpectNoError(err, "revoke replication slave") + + // step2: change cluster master to Gaea config slave, cluster slave to Gaea config master for test. + sql := fmt.Sprintf("SELECT /*check slave fuse*/ * FROM %s.%s WHERE `id`= 1", db, table) + counts := 30 + ns := initNs + // set slave to one slave for checking log + ns.Slices[0].Slaves = []string{slice.Slices[0].Slaves[0]} + ns.SecondsBehindMaster = 5 + err = e2eMgr.ModifyNamespace(ns) + util.ExpectNoError(err, "modify namespace") + + // step3: continue query and check the query distribution. + gaeaReadConn, err := e2eMgr.GetReadGaeaUserConn() + util.ExpectNoError(err) + for i := 0; i < counts; i++ { + _, err := gaeaReadConn.Exec(sql) + util.ExpectNoError(err) + time.Sleep(300 * time.Millisecond) + } + + // step4: check the gaea log for distribution. + res, err := e2eMgr.SearchSqlLog(sql, e2eMgr.StartTime) + util.ExpectNoError(err) + gomega.Expect(res).Should(gomega.HaveLen(counts)) + for _, r := range res { + gomega.Expect(ns.Slices[0].Slaves[0]).Should(gomega.Equal(r.BackendAddr)) + } + + // step5: reset mysql cluster privilege + _, err = masterAdminConn.Exec(fmt.Sprintf(`GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* to '%s'@'%%'`, slice.Slices[0].UserName)) + util.ExpectNoError(err, "grant replication slave") + }) + + ginkgo.It("slave will not fuse when show slave status is empty", func() { + e2eMgr.ClearSqlLog() + e2eMgr.StartTime = time.Now() + // step1: change cluster master to Gaea config slave, cluster slave to Gaea config master for test. + ns := initNs + ns.Slices[0].Master = slice.Slices[0].Slaves[0] + ns.Slices[0].Slaves = []string{slice.Slices[0].Master} + ns.SecondsBehindMaster = 10 + err = e2eMgr.ModifyNamespace(ns) + util.ExpectNoError(err, "modify namespace") + + // step3: continue query and check the query distribution. + sql := fmt.Sprintf("SELECT /*check slave fuse*/ * FROM %s.%s WHERE `id`= 1", db, table) + counts := 30 + gaeaReadConn, err := e2eMgr.GetReadGaeaUserConn() + util.ExpectNoError(err) + for i := 0; i < counts; i++ { + _, err := gaeaReadConn.Exec(sql) + util.ExpectNoError(err) + time.Sleep(300 * time.Millisecond) + } + + // step4: check the gaea log for distribution. + res, err := e2eMgr.SearchSqlLog(sql, e2eMgr.StartTime) + util.ExpectNoError(err) + gomega.Expect(res).Should(gomega.HaveLen(counts)) + for _, r := range res { + gomega.Expect(ns.Slices[0].Slaves[0]).Should(gomega.Equal(r.BackendAddr)) + } + }) + + ginkgo.AfterEach(func() { + e2eMgr.Clean() + }) +}) diff --git a/tests/e2e/function/table_fuse.go b/tests/e2e/function/table_fuse.go new file mode 100644 index 00000000..23fe61c7 --- /dev/null +++ b/tests/e2e/function/table_fuse.go @@ -0,0 +1,137 @@ +// Copyright 2024 The Gaea Authors. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package function + +import ( + "database/sql" + "fmt" + "time" + + "github.com/XiaoMi/Gaea/models" + "github.com/XiaoMi/Gaea/tests/e2e/config" + "github.com/XiaoMi/Gaea/tests/e2e/util" + "github.com/onsi/ginkgo/v2" + "github.com/onsi/gomega" +) + +// This script, titled "Test HealthyCheck Sql Fuse Result" is designed to test the slave database failover (fuse) functionality in a database environment. +// The test involves setting up a database and a table, followed by executing various SQL queries to check how operations are handled in a setup with a single slave slice. +// The test includes different SQL cases for scenarios such as non-existent databases, non-existent tables, and table locking. +// It ensures that traffic is correctly switched to the master database when specific health check queries fail against the slave. +// Each test case executes preparation SQL statements (like creating and locking tables) and then runs a health check query, +// followed by validating if the actual backend address corresponds with the expected one (i.e., correctly switching to the master or staying on the slave). +// After executing the test cases, any data generated during the test is cleaned up. +// Upon completion, the script checks the results to ensure they align with the expected behavior of slave database failover. +var _ = ginkgo.Describe("Test HealthyCheck Sql Fuse Result", func() { + e2eMgr := config.NewE2eManager() + slice := e2eMgr.NsSlices[config.SliceSingleSlave] + db := config.DefaultE2eDatabase + table := config.DefaultE2eTable + var initNs *models.Namespace + + ginkgo.BeforeEach(func() { + // mysql prepare + master, err := slice.GetMasterAdminConn(0) + util.ExpectNoError(err) + util.ExpectNoError(util.CleanUpDatabases(master)) + err = util.SetupDatabaseAndInsertData(master, db, table) + util.ExpectNoError(err) + err = util.SetupDatabaseAndInsertData(master, "db_fuse", "tbl_fuse") + util.ExpectNoError(err) + // namespace prepare + initNs, err = config.ParseNamespaceTmpl(config.DefaultNamespaceTmpl, slice) + util.ExpectNoError(err, "parse namespace template") + initNs.DownAfterNoAlive = 1 + initNs.Slices[0].HealthCheckSql = "select * from db_fuse.tbl_fuse" + err = e2eMgr.ModifyNamespace(initNs) + util.ExpectNoError(err) + // wait namespace down after no alive effect + time.Sleep(1 * time.Second) + }) + + ginkgo.Context("When executing basic SQL operations", func() { + ginkgo.It("should handle SELECT operations correctly", func() { + master, err := slice.GetMasterAdminConn(0) + util.ExpectNoError(err) + + slave, err := slice.GetSlaveAdminConn(0, 0) + util.ExpectNoError(err) + + sqlCases := []struct { + DB *sql.DB + PrePareSql string + ExpectBackendAddr string + CleanSql string + }{ + { + //从库锁表, + DB: slave, + // 从库锁表/主库正常/health_check_query语法正确/执行超时/熔断从库,主库正常 + PrePareSql: "LOCK TABLES db_fuse.tbl_fuse WRITE;", + ExpectBackendAddr: slice.Slices[0].Master, + CleanSql: "UNLOCK TABLES;", + }, + { + //主库删除表,从库同步删除表, + DB: master, + // 从库表不存在/health_check_query语法正确/配置错误/不熔断从库,主库。 + PrePareSql: "DROP TABLE db_fuse.tbl_fuse", + ExpectBackendAddr: slice.Slices[0].Slaves[0], + }, + { + //主库删除库,从库同步删除库 + DB: master, + // 从库库不存在/health_check_query语法正确/配置错误/不熔断从库,主库。 + PrePareSql: "DROP DATABASE db_fuse", + ExpectBackendAddr: slice.Slices[0].Slaves[0], + }, + } + + for i, v := range sqlCases { + if len(v.PrePareSql) > 0 { + _, err = v.DB.Exec(v.PrePareSql) + util.ExpectNoError(err, "Prepare Sql Exec Error") + } + e2eMgr.ClearSqlLog() + // 1. wait fuse effect + time.Sleep(6 * time.Second) + // 2. gaea exec sql + currentTime := time.Now() + gaea, err := e2eMgr.GetReadWriteGaeaUserConn() + util.ExpectNoError(err) + sql := fmt.Sprintf("/* No.%d */ select * from %s.%s", i, db, table) + _, err = gaea.Exec(sql) + util.ExpectNoError(err) + // 3.wait log write + time.Sleep(1 * time.Second) + // 4. search log + res, err := e2eMgr.SearchSqlLog(sql, currentTime) + util.ExpectNoError(err) + // 5. compare res and expect + gomega.Expect(res).Should(gomega.HaveLen(1)) + gomega.Expect(v.ExpectBackendAddr).Should(gomega.Equal(res[0].BackendAddr)) + + if len(v.CleanSql) > 0 { + _, err = v.DB.Exec(v.CleanSql) + util.ExpectNoError(err, "Clean Sql Exec Error") + } + } + + }) + }) + ginkgo.AfterEach(func() { + e2eMgr.Clean() + }) +}) diff --git a/tests/e2e/shard/case/dml/kingdate_month.json b/tests/e2e/shard/case/dml/kingdate_month.json new file mode 100644 index 00000000..1f9981f9 --- /dev/null +++ b/tests/e2e/shard/case/dml/kingdate_month.json @@ -0,0 +1,167 @@ +{ + "execCases": [ + { + "description": "Test King Shard DATE MONTH INSERT UPDATE DELETE ", + "setUp": [ + { + "slice": "slice-0", + "sql": "DROP DATABASE IF EXISTS db_kingshard_date_month" + }, + { + "slice": "slice-0", + "sql": "CREATE DATABASE db_kingshard_date_month" + }, + { + "slice": "slice-0", + "sql": "USE db_kingshard_date_month" + }, + { + "slice": "slice-1", + "sql": "DROP DATABASE IF EXISTS db_kingshard_date_month" + }, + { + "slice": "slice-1", + "sql": "CREATE DATABASE db_kingshard_date_month" + }, + { + "slice": "slice-1", + "sql": "USE db_kingshard_date_month" + }, + { + "slice": "slice-0", + "sql":"CREATE TABLE IF NOT EXISTS tbl_shard_201405 ( id INT(64) NOT NULL, col1 VARCHAR(256),create_time datetime DEFAULT NULL,PRIMARY KEY (id)) ENGINE=InnoDB DEFAULT CHARSET=utf8;" + }, + { + "slice": "slice-0", + "sql":"CREATE TABLE IF NOT EXISTS tbl_shard_201406 ( id INT(64) NOT NULL, col1 VARCHAR(256),create_time datetime DEFAULT NULL,PRIMARY KEY (id)) ENGINE=InnoDB DEFAULT CHARSET=utf8;" }, + { + "slice": "slice-1", + "sql":"CREATE TABLE IF NOT EXISTS tbl_shard_201408 ( id INT(64) NOT NULL, col1 VARCHAR(256),create_time datetime DEFAULT NULL,PRIMARY KEY (id)) ENGINE=InnoDB DEFAULT CHARSET=utf8;" + }, + { + "slice": "slice-1", + "sql":"CREATE TABLE IF NOT EXISTS tbl_shard_201409 ( id INT(64) NOT NULL, col1 VARCHAR(256),create_time datetime DEFAULT NULL,PRIMARY KEY (id)) ENGINE=InnoDB DEFAULT CHARSET=utf8;" + } + ], + "gaeaActions": [ + { + "sql":"USE db_kingshard_date_month", + "execType": "Default" + }, + { + "sql": "insert into tbl_shard (id, col1,create_time) values(5, 'test5','2014-05-01'); ", + "execType": "Default" + }, + { + "sql": "insert into tbl_shard (id, col1,create_time) values(6, 'test6','2014-06-01');", + "execType": "Default" + }, + { + "sql": "insert into tbl_shard (id, col1,create_time) values(8, 'test8','2014-08-01'); ", + "execType": "Default" + }, + { + "sql": "insert into tbl_shard (id, col1,create_time) values(9, 'test9','2014-09-01');", + "execType": "Default" + }, + { + "sql": "insert into tbl_shard (id, col1,create_time) values(10, 'test10','2014-05-01'); ", + "execType": "Default" + }, + { + "sql": "UPDATE tbl_shard SET col1='updated_test5' WHERE id=5", + "execType": "Default" + }, + { + "sql": "DELETE FROM tbl_shard WHERE id=10", + "execType": "Default" + } + ], + "masterCheckSQL": [ + { + "slice": "slice-0", + "db": "db_kingshard_date_month", + "name": "tbl_shard_201405 check", + "sql": "SELECT col1 FROM tbl_shard_201405 WHERE id=5", + "execType": "QueryRow", + "expect": ["updated_test5"] + }, + { + "slice": "slice-0", + "db": "db_kingshard_date_month", + "name": "tbl_shard_201405 check", + "sql": "SELECT * FROM tbl_shard_201405 WHERE id IN ('6', '8','9','10')", + "execType": "QueryRow", + "expect": [] + }, + { + "slice": "slice-0", + "db": "db_kingshard_date_month", + "name": "tbl_shard_201405 check", + "sql": "SELECT * FROM tbl_shard_201405 WHERE id=10", + "execType": "QueryRow", + "expect": [] + }, + + { + "slice": "slice-0", + "db": "db_kingshard_date_month", + "name": "tbl_shard_201406 check", + "sql": "SELECT col1 FROM tbl_shard_201406 WHERE id =6", + "execType": "QueryRow", + "expect": ["test6"] + }, + { + "slice": "slice-0", + "db": "db_kingshard_date_month", + "name": "tbl_shard_201406 check", + "sql": "SELECT * FROM tbl_shard_201406 WHERE id IN ('5', '8','9','10')", + "execType":"Query", + "expect": [] + }, + { + "slice": "slice-1", + "db": "db_kingshard_date_month", + "name": "tbl_shard_201408 check", + "sql": "SELECT col1 FROM tbl_shard_201408 WHERE id=8", + "execType": "QueryRow", + "expect": ["test8"] + }, + { + "slice": "slice-1", + "db": "db_kingshard_date_month", + "name": "tbl_shard_201408 check", + "sql": "SELECT * FROM tbl_shard_201408 WHERE id IN ('5', '6','9','10')", + "execType": "Query", + "expect":[] + }, + { + "slice": "slice-1", + "db": "db_kingshard_date_month", + "name": "tbl_shard_201409 check", + "sql": "SELECT col1 FROM tbl_shard_201409 WHERE id=9", + "execType": "QueryRow", + "expect": ["test9"] + }, + { + "slice": "slice-1", + "db": "db_kingshard_date_month", + "name": "tbl_shard_201409 check", + "sql": "SELECT * FROM tbl_shard_201409 WHERE id IN ('5', '6','8','10')", + "execType": "Query", + "expect": [] + } + ], + "tearDown": [ + { + "slice": "slice-0", + "sql": "DROP DATABASE IF EXISTS db_kingshard_date_year" + }, + { + "slice": "slice-1", + "sql": "DROP DATABASE IF EXISTS db_kingshard_date_year" + } + ] + } + ] + } diff --git a/tests/e2e/shard/case/dml/kingdate_year.json b/tests/e2e/shard/case/dml/kingdate_year.json new file mode 100644 index 00000000..dfedb9f6 --- /dev/null +++ b/tests/e2e/shard/case/dml/kingdate_year.json @@ -0,0 +1,173 @@ +{ + "execCases": [ + { + "description": "Test King Shard DATE YEAR INSERT UPDATE DELETE ", + "setUp": [ + { + "slice": "slice-0", + "sql": "DROP DATABASE IF EXISTS db_kingshard_date_year" + }, + { + "slice": "slice-0", + "sql": "CREATE DATABASE db_kingshard_date_year" + }, + { + "slice": "slice-0", + "sql": "USE db_kingshard_date_year" + }, + { + "slice": "slice-1", + "sql": "DROP DATABASE IF EXISTS db_kingshard_date_year" + }, + { + "slice": "slice-1", + "sql": "CREATE DATABASE db_kingshard_date_year" + }, + { + "slice": "slice-1", + "sql": "USE db_kingshard_date_year" + }, + { + "slice": "slice-0", + "sql":"CREATE TABLE IF NOT EXISTS tbl_shard_2016 ( id INT(64) NOT NULL, col1 VARCHAR(256),create_time datetime DEFAULT NULL,PRIMARY KEY (id)) ENGINE=InnoDB DEFAULT CHARSET=utf8;" + }, + { + "slice": "slice-0", + "sql":"CREATE TABLE IF NOT EXISTS tbl_shard_2017 ( id INT(64) NOT NULL, col1 VARCHAR(256),create_time datetime DEFAULT NULL,PRIMARY KEY (id)) ENGINE=InnoDB DEFAULT CHARSET=utf8;" }, + { + "slice": "slice-1", + "sql":"CREATE TABLE IF NOT EXISTS tbl_shard_2018 ( id INT(64) NOT NULL, col1 VARCHAR(256),create_time datetime DEFAULT NULL,PRIMARY KEY (id)) ENGINE=InnoDB DEFAULT CHARSET=utf8;" + }, + { + "slice": "slice-1", + "sql":"CREATE TABLE IF NOT EXISTS tbl_shard_2019 ( id INT(64) NOT NULL, col1 VARCHAR(256),create_time datetime DEFAULT NULL,PRIMARY KEY (id)) ENGINE=InnoDB DEFAULT CHARSET=utf8;" + } + ], + "gaeaActions": [ + { + "sql":"USE db_kingshard_date_year", + "execType": "Default" + }, + { + "sql": "insert into tbl_shard (id, col1,create_time) values(6, 'test6','2016-07-01'); ", + "execType": "Default" + }, + { + "sql": "insert into tbl_shard (id, col1,create_time) values(7, 'test7','2017-07-01');", + "execType": "Default" + }, + { + "sql": "insert into tbl_shard (id, col1,create_time) values(8, 'test8','2018-07-01'); ", + "execType": "Default" + }, + { + "sql": "insert into tbl_shard (id, col1,create_time) values(9, 'test9','2019-07-01');", + "execType": "Default" + }, + { + "sql": "insert into tbl_shard (id, col1,create_time) values(10, 'test10','2016-07-01'); ", + "execType": "Default" + }, + { + "sql": "UPDATE tbl_shard SET col1='updated_test6' WHERE id=6", + "execType": "Default" + }, + { + "sql": "DELETE FROM tbl_shard WHERE id=10", + "execType": "Default" + } + ], + "masterCheckSQL": [ + { + "slice": "slice-0", + "db": "db_kingshard_date_year", + "name": "tbl_shard_2016 check", + "sql": "SELECT col1 FROM tbl_shard_2016 WHERE id=6", + "execType": "QueryRow", + "expect": ["updated_test6"] + }, + { + "slice": "slice-0", + "db": "db_kingshard_date_year", + "name": "tbl_shard_2016 check", + "sql": "SELECT * FROM tbl_shard_2016 WHERE id IN ('7', '8','9','10')", + "execType": "Query", + "expect": [] + }, + { + "slice": "slice-0", + "db": "db_kingshard_date_year", + "name": "tbl_shard_2016 check", + "sql": "SELECT col1 FROM tbl_shard_2016 WHERE id=10", + "execType": "Query", + "expect": [] + }, + + { + "slice": "slice-0", + "db": "db_kingshard_date_year", + "name": "tbl_shard_2017 check", + "sql": "SELECT col1 FROM tbl_shard_2017 WHERE id =7 ", + "execType": "Query", + "expect": [ + ["test7"] + ] + }, + { + "slice": "slice-0", + "db": "db_kingshard_date_year", + "name": "tbl_shard_2017 check", + "sql": "SELECT col1 FROM tbl_shard_2017 WHERE id IN ('6', '8','9','10')", + "execType": "Query", + "expect": [] + }, + { + "slice": "slice-1", + "db": "db_kingshard_date_year", + "name": "tbl_shard_2018 check", + "sql": "SELECT col1 FROM tbl_shard_2018 WHERE id=8", + "execType": "Query", + "expect":[ + ["test8"] + ] + }, + { + "slice": "slice-1", + "db": "db_kingshard_date_year", + "name": "tbl_shard_2018 check", + "sql": "SELECT col1 FROM tbl_shard_2018 WHERE id IN ('6', '7','9','10')", + "execType": "Query", + "expect": [] + }, + { + "slice": "slice-1", + "db": "db_kingshard_date_year", + "name": "tbl_shard_2019 check", + "sql": "SELECT col1 FROM tbl_shard_2019 WHERE id=9", + "execType": "Query", + "expect": [ + ["test9"] + ] + }, + { + "slice": "slice-1", + "db": "db_kingshard_date_year", + "name": "tbl_shard_2019 check", + "sql": "SELECT col1 FROM tbl_shard_2019 WHERE id IN ('6', '7','8','10')", + "execType": "Query", + "expect": [] + } + ], + "tearDown": [ + { + "slice": "slice-0", + "sql": "DROP DATABASE IF EXISTS db_kingshard_date_year" + }, + { + "slice": "slice-1", + "sql": "DROP DATABASE IF EXISTS db_kingshard_date_year" + } + ] + } + ] + } diff --git a/tests/e2e/shard/case/dml/kinghash.json b/tests/e2e/shard/case/dml/kinghash.json new file mode 100644 index 00000000..0f55af87 --- /dev/null +++ b/tests/e2e/shard/case/dml/kinghash.json @@ -0,0 +1,175 @@ +{ + "execCases": [ + { + "description": "Test King Shard Hash INSERT ", + "setUp": [ + { + "slice": "slice-0", + "sql": "DROP DATABASE IF EXISTS db_kingshard_hash" + }, + { + "slice": "slice-0", + "sql": "CREATE DATABASE db_kingshard_hash" + }, + { + "slice": "slice-0", + "sql": "USE db_kingshard_hash" + }, + { + "slice": "slice-1", + "sql": "DROP DATABASE IF EXISTS db_kingshard_hash" + }, + { + "slice": "slice-1", + "sql": "CREATE DATABASE db_kingshard_hash" + }, + { + "slice": "slice-1", + "sql": "USE db_kingshard_hash" + }, + { + "slice": "slice-0", + "sql":"CREATE TABLE IF NOT EXISTS tbl_shard_0000 ( id INT(64) NOT NULL, col1 VARCHAR(256),PRIMARY KEY (id)) ENGINE=InnoDB DEFAULT CHARSET=utf8;" + }, + { + "slice": "slice-0", + "sql":"CREATE TABLE IF NOT EXISTS tbl_shard_0001 ( id INT(64) NOT NULL, col1 VARCHAR(256),PRIMARY KEY (id)) ENGINE=InnoDB DEFAULT CHARSET=utf8;" + }, + { + "slice": "slice-1", + "sql":"CREATE TABLE IF NOT EXISTS tbl_shard_0002 ( id INT(64) NOT NULL, col1 VARCHAR(256),PRIMARY KEY (id)) ENGINE=InnoDB DEFAULT CHARSET=utf8;" + }, + { + "slice": "slice-1", + "sql":"CREATE TABLE IF NOT EXISTS tbl_shard_0003 ( id INT(64) NOT NULL, col1 VARCHAR(256),PRIMARY KEY (id)) ENGINE=InnoDB DEFAULT CHARSET=utf8;" + } + ], + "gaeaActions": [ + { + "sql":"USE db_kingshard_hash", + "execType": "Default" + }, + { + "sql": "INSERT INTO tbl_shard (id ,col1) VALUES (1,'test1') ", + "execType": "Default" + }, + { + "sql": "INSERT INTO tbl_shard (id ,col1) VALUES (2,'test2') ", + "execType": "Default" + }, + { + "sql": "INSERT INTO tbl_shard (id ,col1) VALUES (3,'test3') ", + "execType": "Default" + }, + { + "sql": "INSERT INTO tbl_shard (id ,col1) VALUES (4,'test4') ", + "execType": "Default" + }, + { + "sql": "INSERT INTO tbl_shard (id ,col1) VALUES (5,'test5') ", + "execType": "Default" + }, + { + "sql": "UPDATE tbl_shard SET col1='updated_test1' WHERE id=1", + "execType": "Default" + }, + { + "sql": "DELETE FROM tbl_shard WHERE id=5", + "execType": "Default" + } + ], + "masterCheckSQL": [ + { + "slice": "slice-0", + "db": "db_kingshard_hash", + "name": "Check master after insert and update", + "sql": "SELECT col1 FROM tbl_shard_0000 WHERE id=4", + "execType": "Query", + "expect": [ + ["test4"] + ] + }, + { + "slice": "slice-0", + "db": "db_kingshard_hash", + "name": "Check master after insert and update", + "sql": "SELECT col1 FROM tbl_shard_0000 WHERE id IN ('1', '2', '3','5')", + "execType": "Query", + "expect": [] + }, + { + "slice": "slice-0", + "db": "db_kingshard_hash", + "name": "Check master after insert", + "sql": "SELECT col1 FROM tbl_shard_0001 WHERE id=1", + "execType": "Query", + "expect": [ + ["updated_test1"] + ] + }, + { + "slice": "slice-0", + "db": "db_kingshard_hash", + "name": "Check master after insert", + "sql": "SELECT col1 FROM tbl_shard_0001 WHERE id IN ('2', '3','4','5')", + "execType": "Query", + "expect": [] + }, + { + "slice": "slice-0", + "db": "db_kingshard_hash", + "name": "Check master after insert", + "sql": "SELECT col1 FROM tbl_shard_0001 WHERE id =5 ", + "execType": "Query", + "expect": [] + }, + { + "slice": "slice-1", + "db": "db_kingshard_hash", + "name": "Check master after insert", + "sql": "SELECT col1 FROM tbl_shard_0002 WHERE id=2", + "execType": "Query", + "expect": [ + ["test2"] + ] + }, + { + "slice": "slice-1", + "db": "db_kingshard_hash", + "name": "Check master after insert ", + "sql": "SELECT col1 FROM tbl_shard_0002 WHERE id IN ('1', '3','4','5')", + "execType": "Query", + "expect": [] + }, + { + "slice": "slice-1", + "db": "db_kingshard_hash", + "name": "Check master after insert", + "sql": "SELECT col1 FROM tbl_shard_0003 WHERE id=3", + "execType": "Query", + "expect": [ + ["test3"] + ] + }, + { + "slice": "slice-1", + "db": "db_kingshard_hash", + "name": "Check master after insert", + "sql": "SELECT col1 FROM tbl_shard_0003 WHERE id IN ('1', '2','4','5')", + "execType": "Query", + "expect": [] + } + ], + "tearDown": [ + { + "slice": "slice-0", + "sql": "DROP DATABASE IF EXISTS db_kingshard_hash" + }, + { + "slice": "slice-1", + "sql": "DROP DATABASE IF EXISTS db_kingshard_hash" + } + ] + } + ] + } diff --git a/tests/e2e/shard/case/dml/kingmod.json b/tests/e2e/shard/case/dml/kingmod.json new file mode 100644 index 00000000..75f0c9c0 --- /dev/null +++ b/tests/e2e/shard/case/dml/kingmod.json @@ -0,0 +1,185 @@ +{ + "execCases": [ + { + "description": "Test King Shard Mod INSERT UPDATE DELETE ", + "setUp": [ + { + "slice": "slice-0", + "sql": "DROP DATABASE IF EXISTS db_kingshard_mod" + }, + { + "slice": "slice-0", + "sql": "CREATE DATABASE db_kingshard_mod" + }, + { + "slice": "slice-0", + "sql": "USE db_kingshard_mod" + }, + { + "slice": "slice-1", + "sql": "DROP DATABASE IF EXISTS db_kingshard_mod" + }, + { + "slice": "slice-1", + "sql": "CREATE DATABASE db_kingshard_mod" + }, + { + "slice": "slice-1", + "sql": "USE db_kingshard_mod" + }, + { + "slice": "slice-0", + "sql":"CREATE TABLE IF NOT EXISTS tbl_shard_0000 ( id INT(64) NOT NULL, col1 VARCHAR(256),PRIMARY KEY (id)) ENGINE=InnoDB DEFAULT CHARSET=utf8;" + }, + { + "slice": "slice-0", + "sql":"CREATE TABLE IF NOT EXISTS tbl_shard_0001 ( id INT(64) NOT NULL, col1 VARCHAR(256),PRIMARY KEY (id)) ENGINE=InnoDB DEFAULT CHARSET=utf8;" + }, + { + "slice": "slice-1", + "sql":"CREATE TABLE IF NOT EXISTS tbl_shard_0002 ( id INT(64) NOT NULL, col1 VARCHAR(256),PRIMARY KEY (id)) ENGINE=InnoDB DEFAULT CHARSET=utf8;" + }, + { + "slice": "slice-1", + "sql":"CREATE TABLE IF NOT EXISTS tbl_shard_0003 ( id INT(64) NOT NULL, col1 VARCHAR(256),PRIMARY KEY (id)) ENGINE=InnoDB DEFAULT CHARSET=utf8;" + } + ], + "gaeaActions": [ + { + "sql":"USE db_kingshard_mod", + "execType": "Default" + }, + { + "sql": "INSERT INTO tbl_shard (id ,col1) VALUES (1,'test1') ", + "execType": "Default" + }, + { + "sql": "INSERT INTO tbl_shard (id ,col1) VALUES (2,'test2') ", + "execType": "Default" + }, + { + "sql": "INSERT INTO tbl_shard (id ,col1) VALUES (3,'test3') ", + "execType": "Default" + }, + { + "sql": "INSERT INTO tbl_shard (id ,col1) VALUES (4,'test4') ", + "execType": "Default" + }, + { + "sql": "INSERT INTO tbl_shard (id ,col1) VALUES (5,'test5') ", + "execType": "Default" + }, + { + "sql": "UPDATE tbl_shard SET col1='updated_test1' WHERE id=1", + "execType": "Default" + }, + { + "sql": "DELETE FROM tbl_shard WHERE id=5", + "execType": "Default" + }, + { + "sql": "SELECT * FROM tbl_shard", + "execType": "Query", + "expect": [ + ["4","test4"], + ["1","updated_test1"], + ["2","test2"], + ["3","test3"] + ] + } + ], + "masterCheckSQL": [ + { + "slice": "slice-0", + "db": "db_kingshard_mod", + "name": "Check master after insert and update", + "sql": "SELECT col1 FROM tbl_shard_0000 WHERE id=4", + "execType": "Query", + "expect": [ + ["test4"] + ] + }, + { + "slice": "slice-0", + "db": "db_kingshard_mod", + "name": "Check master after insert and update", + "sql": "SELECT col1 FROM tbl_shard_0000 WHERE id IN ('1', '2', '3','5')", + "execType": "Query", + "expect": [] + }, + { + "slice": "slice-0", + "db": "db_kingshard_mod", + "name": "Check master after insert", + "sql": "SELECT col1 FROM tbl_shard_0001 WHERE id=1", + "execType": "Query", + "expect": [ + ["updated_test1"] + ] + }, + { + "slice": "slice-0", + "db": "db_kingshard_mod", + "name": "Check master after insert", + "sql": "SELECT col1 FROM tbl_shard_0001 WHERE id IN ('2', '3','4','5')", + "execType": "Query", + "expect": [] + }, + { + "slice": "slice-0", + "db": "db_kingshard_mod", + "name": "Check master after insert", + "sql": "SELECT col1 FROM tbl_shard_0001 WHERE id =5 ", + "execType": "Query", + "expect": [] + }, + { + "slice": "slice-1", + "db": "db_kingshard_mod", + "name": "Check master after insert", + "sql": "SELECT col1 FROM tbl_shard_0002 WHERE id=2", + "execType": "Query", + "expect": [ + ["test2"] + ] + }, + { + "slice": "slice-1", + "db": "db_kingshard_mod", + "name": "Check master after insert ", + "sql": "SELECT col1 FROM tbl_shard_0002 WHERE id IN ('1', '3','4','5')", + "execType": "Query", + "expect": [] + }, + { + "slice": "slice-1", + "db": "db_kingshard_mod", + "name": "Check master after insert", + "sql": "SELECT col1 FROM tbl_shard_0003 WHERE id=3", + "execType": "Query", + "expect": [ + ["test3"] + ] + }, + { + "slice": "slice-1", + "db": "db_kingshard_mod", + "name": "Check master after insert", + "sql": "SELECT col1 FROM tbl_shard_0003 WHERE id IN ('1', '2','4','5')", + "execType": "Query", + "expect": [] + } + ], + "tearDown": [ + { + "slice": "slice-0", + "sql": "DROP DATABASE IF EXISTS db_kingshard_mod" + }, + { + "slice": "slice-1", + "sql": "DROP DATABASE IF EXISTS db_kingshard_mod" + } + ] + } + ] + } diff --git a/tests/e2e/shard/case/dml/kingrange.json b/tests/e2e/shard/case/dml/kingrange.json new file mode 100644 index 00000000..fb471e77 --- /dev/null +++ b/tests/e2e/shard/case/dml/kingrange.json @@ -0,0 +1,177 @@ +{ + "execCases": [ + { + "description": "Test King Shard Range INSERT UPDATE DELETE ", + "setUp": [ + { + "slice": "slice-0", + "sql": "DROP DATABASE IF EXISTS db_kingshard_range" + }, + { + "slice": "slice-0", + "sql": "CREATE DATABASE db_kingshard_range" + }, + { + "slice": "slice-0", + "sql": "USE db_kingshard_range" + }, + { + "slice": "slice-1", + "sql": "DROP DATABASE IF EXISTS db_kingshard_range" + }, + { + "slice": "slice-1", + "sql": "CREATE DATABASE db_kingshard_range" + }, + { + "slice": "slice-1", + "sql": "USE db_kingshard_range" + }, + { + "slice": "slice-0", + "sql":"CREATE TABLE IF NOT EXISTS tbl_shard_0000 ( id INT(64) NOT NULL, col1 VARCHAR(256),PRIMARY KEY (id)) ENGINE=InnoDB DEFAULT CHARSET=utf8;" + }, + { + "slice": "slice-0", + "sql":"CREATE TABLE IF NOT EXISTS tbl_shard_0001 ( id INT(64) NOT NULL, col1 VARCHAR(256),PRIMARY KEY (id)) ENGINE=InnoDB DEFAULT CHARSET=utf8;" + }, + { + "slice": "slice-1", + "sql":"CREATE TABLE IF NOT EXISTS tbl_shard_0002 ( id INT(64) NOT NULL, col1 VARCHAR(256),PRIMARY KEY (id)) ENGINE=InnoDB DEFAULT CHARSET=utf8;" + }, + { + "slice": "slice-1", + "sql":"CREATE TABLE IF NOT EXISTS tbl_shard_0003 ( id INT(64) NOT NULL, col1 VARCHAR(256),PRIMARY KEY (id)) ENGINE=InnoDB DEFAULT CHARSET=utf8;" + } + ], + "gaeaActions": [ + { + "sql":"USE db_kingshard_range", + "execType": "Default" + }, + { + "sql": "INSERT INTO tbl_shard (id ,col1) VALUES (1,'test1') ", + "execType": "Default" + }, + { + "sql": "INSERT INTO tbl_shard (id ,col1) VALUES (2,'test2') ", + "execType": "Default" + }, + { + "sql": "INSERT INTO tbl_shard (id ,col1) VALUES (3,'test3') ", + "execType": "Default" + }, + { + "sql": "INSERT INTO tbl_shard (id ,col1) VALUES (6,'test6') ", + "execType": "Default" + }, + { + "sql": "INSERT INTO tbl_shard (id ,col1) VALUES (9,'test9') ", + "execType": "Default" + }, + { + "sql": "UPDATE tbl_shard SET col1='updated_test1' WHERE id=1", + "execType": "Default" + }, + { + "sql": "DELETE FROM tbl_shard WHERE id=2", + "execType": "Default" + } + ], + "masterCheckSQL": [ + { + "slice": "slice-0", + "db": "db_kingshard_range", + "name": "tbl_shard_0000 check", + "sql": "SELECT col1 FROM tbl_shard_0000 WHERE id=1", + "execType": "Query", + "expect": [ + ["updated_test1"] + ] + }, + { + "slice": "slice-0", + "db": "db_kingshard_range", + "name": "tbl_shard_0000 check", + "sql": "SELECT col1 FROM tbl_shard_0000 WHERE id IN ('2', '3','6','9')", + "execType": "Query", + "expect": [] + }, + { + "slice": "slice-0", + "db": "db_kingshard_range", + "name": "tbl_shard_0000 check", + "sql": "SELECT col1 FROM tbl_shard_0000 WHERE id=2", + "execType": "Query", + "expect": [] + }, + + { + "slice": "slice-0", + "db": "db_kingshard_range", + "name": "tbl_shard_0001 check", + "sql": "SELECT col1 FROM tbl_shard_0001 WHERE id =3 ", + "execType": "Query", + "expect": [ + ["test3"] + ] + + }, + { + "slice": "slice-0", + "db": "db_kingshard_range", + "name": "tbl_shard_0001 check", + "sql": "SELECT col1 FROM tbl_shard_0001 WHERE id IN ('1', '2','6','9')", + "execType": "Query", + "expect": [] + }, + { + "slice": "slice-1", + "db": "db_kingshard_range", + "name": "tbl_shard_0002 check", + "sql": "SELECT col1 FROM tbl_shard_0002 WHERE id=6", + "execType": "Query", + "expect": [ + ["test6"] + ] + }, + { + "slice": "slice-1", + "db": "db_kingshard_range", + "name": "tbl_shard_0002 check", + "sql": "SELECT col1 FROM tbl_shard_0002 WHERE id IN ('1', '2','3','9')", + "execType": "Query", + "expect": [] + }, + { + "slice": "slice-1", + "db": "db_kingshard_range", + "name": "tbl_shard_0003 check", + "sql": "SELECT col1 FROM tbl_shard_0003 WHERE id=9", + "execType": "Query", + "expect": [ + ["test9"] + ] + }, + { + "slice": "slice-1", + "db": "db_kingshard_range", + "name": "tbl_shard_0003 check", + "sql": "SELECT col1 FROM tbl_shard_0003 WHERE id IN ('1', '2','3','6')", + "execType": "Query", + "expect": [] + } + ], + "tearDown": [ + { + "slice": "slice-0", + "sql": "DROP DATABASE IF EXISTS db_kingshard_range" + }, + { + "slice": "slice-1", + "sql": "DROP DATABASE IF EXISTS db_kingshard_range" + } + ] + } + ] + } diff --git a/tests/e2e/shard/case/dml/mycatlong.json b/tests/e2e/shard/case/dml/mycatlong.json new file mode 100644 index 00000000..de6f1c5e --- /dev/null +++ b/tests/e2e/shard/case/dml/mycatlong.json @@ -0,0 +1,255 @@ +{ + "execCases": [ + { + "description": "Test Mycat LONG", + "setUp": [ + { + "slice": "slice-0", + "sql": "DROP DATABASE IF EXISTS db_mycat_long_0" + }, + { + "slice": "slice-0", + "sql": "DROP DATABASE IF EXISTS db_mycat_long_1" + }, + { + "slice": "slice-0", + "sql": "CREATE DATABASE db_mycat_long_0" + }, + { + "slice": "slice-0", + "sql": "CREATE DATABASE db_mycat_long_1" + }, + { + "slice": "slice-0", + "sql": "USE db_mycat_long_0" + }, + { + "slice": "slice-0", + "sql":"CREATE TABLE IF NOT EXISTS tbl_mycat ( id INT(64) NOT NULL, col1 VARCHAR(256),PRIMARY KEY (id)) ENGINE=InnoDB DEFAULT CHARSET=utf8;" + }, + { + "slice": "slice-0", + "sql": "USE db_mycat_long_1" + }, + { + "slice": "slice-0", + "sql":"CREATE TABLE IF NOT EXISTS tbl_mycat ( id INT(64) NOT NULL, col1 VARCHAR(256),PRIMARY KEY (id)) ENGINE=InnoDB DEFAULT CHARSET=utf8;" + }, + { + "slice": "slice-1", + "sql": "DROP DATABASE IF EXISTS db_mycat_long_2" + }, + { + "slice": "slice-1", + "sql": "DROP DATABASE IF EXISTS db_mycat_long_3" + }, + { + "slice": "slice-1", + "sql": "CREATE DATABASE db_mycat_long_2" + }, + { + "slice": "slice-1", + "sql": "CREATE DATABASE db_mycat_long_3" + }, + { + "slice": "slice-1", + "sql": "USE db_mycat_long_2" + }, + { + "slice": "slice-1", + "sql":"CREATE TABLE IF NOT EXISTS tbl_mycat ( id INT(64) NOT NULL, col1 VARCHAR(256),PRIMARY KEY (id)) ENGINE=InnoDB DEFAULT CHARSET=utf8;" + }, + { + "slice": "slice-1", + "sql": "USE db_mycat_long_3" + }, + { + "slice": "slice-1", + "sql":"CREATE TABLE IF NOT EXISTS tbl_mycat ( id INT(64) NOT NULL, col1 VARCHAR(256),PRIMARY KEY (id)) ENGINE=InnoDB DEFAULT CHARSET=utf8;" + } + ], + "gaeaActions": [ + { + "sql":"USE db_mycat_long", + "execType": "Default" + }, + { + "sql": "INSERT INTO tbl_mycat (id ,col1) VALUES (1,'test1') ", + "execType": "Default" + }, + { + "sql": "INSERT INTO tbl_mycat (id ,col1) VALUES (255,'test255') ", + "execType": "Default" + }, + { + "sql": "INSERT INTO tbl_mycat (id ,col1) VALUES (256,'test256') ", + "execType": "Default" + }, + { + "sql": "INSERT INTO tbl_mycat (id ,col1) VALUES (511,'test511') ", + "execType": "Default" + }, + { + "sql": "INSERT INTO tbl_mycat (id ,col1) VALUES (512,'test512') ", + "execType": "Default" + }, + { + "sql": "INSERT INTO tbl_mycat (id ,col1) VALUES (767,'test767') ", + "execType": "Default" + }, + { + "sql": "INSERT INTO tbl_mycat (id ,col1) VALUES (768,'test768') ", + "execType": "Default" + }, + { + "sql": "INSERT INTO tbl_mycat (id ,col1) VALUES (1023,'test1023') ", + "execType": "Default" + }, + { + "sql": "INSERT INTO tbl_mycat (id ,col1) VALUES (1024,'test1024') ", + "execType": "Default" + }, + { + "sql": "UPDATE tbl_mycat SET col1='updated_test1' WHERE id=1", + "execType": "Default" + }, + { + "sql": "DELETE FROM tbl_mycat WHERE id=1024", + "execType": "Default" + } + ], + "masterCheckSQL": [ + { + "name": "slice-0.db_mycat_long_0 check", + "slice": "slice-0", + "db": "db_mycat_long_0", + "sql": "SELECT col1 FROM tbl_mycat WHERE id=1", + "execType": "Query", + "expect": [ + ["updated_test1"] + ] + }, + { + "name": "slice-0.db_mycat_long_0 check", + "slice": "slice-0", + "db": "db_mycat_long_0", + "sql": "SELECT col1 FROM tbl_mycat WHERE id=255", + "execType": "Query", + "expect": [ + ["test255"] + ] + }, + { + "name": "slice-0.db_mycat_long_0 check", + "slice": "slice-0", + "db": "db_mycat_long_0", + "sql": "SELECT col1 FROM tbl_mycat WHERE id IN ('1024', '256','511','512','767','768','1023')", + "execType": "Query", + "expect": [] + }, + { + "name": "slice-0.db_mycat_long_1 check", + "slice": "slice-0", + "db": "db_mycat_long_1", + "sql": "SELECT col1 FROM tbl_mycat WHERE id=256", + "execType": "Query", + "expect": [ + ["test256"] + ] + }, + { + "name": "slice-0.db_mycat_long_1 check", + "slice": "slice-0", + "db": "db_mycat_long_1", + "sql": "SELECT col1 FROM tbl_mycat WHERE id=511", + "execType": "Query", + "expect": [ + ["test511"] + ] + }, + { + "name": "slice-0.db_mycat_long_1 check", + "slice": "slice-0", + "db": "db_mycat_long_1", + "sql": "SELECT col1 FROM tbl_mycat WHERE id IN ('1024', '1','255','512','767','768','1023')", + "execType": "Query", + "expect": [] + }, + { + "name": "slice-1.db_mycat_long_2 check", + "slice": "slice-1", + "db": "db_mycat_long_2", + "sql": "SELECT col1 FROM tbl_mycat WHERE id=512", + "execType": "Query", + "expect": [ + ["test512"] + ] + }, + { + "name": "slice-1.db_mycat_long_2 check", + "slice": "slice-1", + "db": "db_mycat_long_2", + "sql": "SELECT col1 FROM tbl_mycat WHERE id=767", + "execType": "Query", + "expect": [ + ["test767"] + ] + }, + { + "name": "slice-1.db_mycat_long_2 check", + "slice": "slice-1", + "db": "db_mycat_long_2", + "sql": "SELECT col1 FROM tbl_mycat WHERE id IN ('1024', '1','255','511','768','1023')", + "execType": "Query", + "expect": [] + }, + { + "name": "slice-1.db_mycat_long_3 check", + "slice": "slice-1", + "db": "db_mycat_long_3", + "sql": "SELECT col1 FROM tbl_mycat WHERE id=768", + "execType": "Query", + "expect": [ + ["test768"] + ] + }, + { + "name": "slice-1.db_mycat_long_3 check", + "slice": "slice-1", + "db": "db_mycat_long_3", + "sql": "SELECT col1 FROM tbl_mycat WHERE id=1023", + "execType": "Query", + "expect": [ + ["test1023"] + ] + }, + { + "name": "slice-1.db_mycat_long_3 check", + "slice": "slice-1", + "db": "db_mycat_long_3", + "sql": "SELECT col1 FROM tbl_mycat WHERE id IN ('1024', '1','255','256','511','512','767')", + "execType": "Query", + "expect": [] + } + ], + "tearDown": [ + { + "slice": "slice-0", + "sql": "DROP DATABASE IF EXISTS db_mycat_long_0" + }, + { + "slice": "slice-0", + "sql": "DROP DATABASE IF EXISTS db_mycat_long_1" + }, + { + "slice": "slice-1", + "sql": "DROP DATABASE IF EXISTS db_mycat_long_2" + }, + { + "slice": "slice-1", + "sql": "DROP DATABASE IF EXISTS db_mycat_long_3" + } + ] + } + ] + } diff --git a/tests/e2e/shard/case/dml/mycatmod.json b/tests/e2e/shard/case/dml/mycatmod.json new file mode 100644 index 00000000..ec7f5833 --- /dev/null +++ b/tests/e2e/shard/case/dml/mycatmod.json @@ -0,0 +1,193 @@ +{ + "execCases": [ + { + "description": "Test Mycat MOD", + "setUp": [ + { + "slice": "slice-0", + "sql": "DROP DATABASE IF EXISTS db_mycat_mod_0" + }, + { + "slice": "slice-0", + "sql": "DROP DATABASE IF EXISTS db_mycat_mod_1" + }, + { + "slice": "slice-0", + "sql": "CREATE DATABASE db_mycat_mod_0" + }, + { + "slice": "slice-0", + "sql": "CREATE DATABASE db_mycat_mod_1" + }, + { + "slice": "slice-0", + "sql": "USE db_mycat_mod_0" + }, + { + "slice": "slice-0", + "sql":"CREATE TABLE IF NOT EXISTS tbl_mycat ( id INT(64) NOT NULL, col1 VARCHAR(256),PRIMARY KEY (id)) ENGINE=InnoDB DEFAULT CHARSET=utf8;" + }, + { + "slice": "slice-0", + "sql": "USE db_mycat_mod_1" + }, + { + "slice": "slice-0", + "sql":"CREATE TABLE IF NOT EXISTS tbl_mycat ( id INT(64) NOT NULL, col1 VARCHAR(256),PRIMARY KEY (id)) ENGINE=InnoDB DEFAULT CHARSET=utf8;" + }, + { + "slice": "slice-1", + "sql": "DROP DATABASE IF EXISTS db_mycat_mod_2" + }, + { + "slice": "slice-1", + "sql": "DROP DATABASE IF EXISTS db_mycat_mod_3" + }, + { + "slice": "slice-1", + "sql": "CREATE DATABASE db_mycat_mod_2" + }, + { + "slice": "slice-1", + "sql": "CREATE DATABASE db_mycat_mod_3" + }, + { + "slice": "slice-1", + "sql": "USE db_mycat_mod_2" + }, + { + "slice": "slice-1", + "sql":"CREATE TABLE IF NOT EXISTS tbl_mycat ( id INT(64) NOT NULL, col1 VARCHAR(256),PRIMARY KEY (id)) ENGINE=InnoDB DEFAULT CHARSET=utf8;" + }, + { + "slice": "slice-1", + "sql": "USE db_mycat_mod_3" + }, + { + "slice": "slice-1", + "sql":"CREATE TABLE IF NOT EXISTS tbl_mycat ( id INT(64) NOT NULL, col1 VARCHAR(256),PRIMARY KEY (id)) ENGINE=InnoDB DEFAULT CHARSET=utf8;" + } + ], + "gaeaActions": [ + { + "sql":"USE db_mycat_mod", + "execType": "Default" + }, + { + "sql": "INSERT INTO tbl_mycat (id ,col1) VALUES (1,'test1') ", + "execType": "Default" + }, + { + "sql": "INSERT INTO tbl_mycat (id ,col1) VALUES (2,'test2') ", + "execType": "Default" + }, + { + "sql": "INSERT INTO tbl_mycat (id ,col1) VALUES (3,'test3') ", + "execType": "Default" + }, + { + "sql": "INSERT INTO tbl_mycat (id ,col1) VALUES (4,'test4') ", + "execType": "Default" + }, + { + "sql": "INSERT INTO tbl_mycat (id ,col1) VALUES (5,'test5') ", + "execType": "Default" + }, + { + "sql": "UPDATE tbl_mycat SET col1='updated_test1' WHERE id=1", + "execType": "Default" + }, + { + "sql": "DELETE FROM tbl_mycat WHERE id=5", + "execType": "Default" + } + ], + "masterCheckSQL": [ + { + "name": "slice-0.db_mycat_mod_0 check", + "slice": "slice-0", + "db": "db_mycat_mod_0", + "sql": "SELECT col1 FROM tbl_mycat WHERE id=4", + "execType": "Query", + "expect": [ + ["test4"] + ] + }, + { + "name": "slice-10.db_mycat_mod_0 check", + "slice": "slice-0", + "db": "db_mycat_mod_0", + "sql": "SELECT col1 FROM tbl_mycat WHERE id IN ('1', '2','3','5')", + "execType": "Query", + "expect": [] + }, + { + "name": "slice-0.db_mycat_mod_1 check", + "slice": "slice-0", + "db": "db_mycat_mod_1", + "sql": "SELECT col1 FROM tbl_mycat WHERE id=1", + "execType": "Query", + "expect": [ + ["updated_test1"] + ] + }, + + { + "name": "slice-1.db_mycat_mod_2 check", + "slice": "slice-1", + "db": "db_mycat_mod_2", + "sql": "SELECT col1 FROM tbl_mycat WHERE id =2 ", + "execType": "Query", + "expect": [ + ["test2"] + ] + + }, + { + "name": "slice-1.db_mycat_mod_2 check", + "slice": "slice-1", + "db": "db_mycat_mod_2", + "sql": "SELECT col1 FROM tbl_mycat WHERE id IN ('1', '3','4','5')", + "execType": "Query", + "expect": [] + }, + { + "name": "slice-1.db_mycat_mod_3 check", + "slice": "slice-1", + "db": "db_mycat_mod_3", + "sql": "SELECT col1 FROM tbl_mycat WHERE id=3", + "execType": "Query", + "expect": [ + ["test3"] + ] + }, + { + "name": "slice-1.db_mycat_mod_3 check", + "slice": "slice-1", + "db": "db_mycat_mod_3", + "sql": "SELECT col1 FROM tbl_mycat WHERE id IN ('1', '2','4','5')", + "execType": "Query", + "expect": [] + } + ], + "tearDown": [ + { + "slice": "slice-0", + "sql": "DROP DATABASE IF EXISTS db_mycat_mod_0" + }, + { + "slice": "slice-0", + "sql": "DROP DATABASE IF EXISTS db_mycat_mod_1" + }, + { + "slice": "slice-1", + "sql": "DROP DATABASE IF EXISTS db_mycat_mod_2" + }, + { + "slice": "slice-1", + "sql": "DROP DATABASE IF EXISTS db_mycat_mod_3" + } + ] + } + ] + } diff --git a/tests/e2e/shard/case/dml/mycatmod_different_table.json b/tests/e2e/shard/case/dml/mycatmod_different_table.json new file mode 100644 index 00000000..a7e26d6d --- /dev/null +++ b/tests/e2e/shard/case/dml/mycatmod_different_table.json @@ -0,0 +1,121 @@ +{ + "execCases": [ + { + "description": "Test Mycat MOD With Different Table", + "setUp": [ + { + "slice": "slice-0", + "sql": "DROP DATABASE IF EXISTS db_mycat_mod_0" + }, + { + "slice": "slice-0", + "sql": "DROP DATABASE IF EXISTS db_mycat_mod_1" + }, + { + "slice": "slice-0", + "sql": "CREATE DATABASE db_mycat_mod_0" + }, + { + "slice": "slice-0", + "sql": "CREATE DATABASE db_mycat_mod_1" + }, + { + "slice": "slice-0", + "sql": "USE db_mycat_mod_0" + }, + { + "slice": "slice-0", + "sql":"CREATE TABLE IF NOT EXISTS tbl_mycat ( id INT(64) NOT NULL, col1 VARCHAR(256),col2 VARCHAR(256) default 'test',PRIMARY KEY (id)) ENGINE=InnoDB DEFAULT CHARSET=utf8;" + }, + { + "slice": "slice-0", + "sql": "USE db_mycat_mod_1" + }, + { + "slice": "slice-0", + "sql":"CREATE TABLE IF NOT EXISTS tbl_mycat ( id INT(64) NOT NULL, col1 VARCHAR(256),col2 VARCHAR(256) default 'test',PRIMARY KEY (id)) ENGINE=InnoDB DEFAULT CHARSET=utf8;" + }, + { + "slice": "slice-1", + "sql": "DROP DATABASE IF EXISTS db_mycat_mod_2" + }, + { + "slice": "slice-1", + "sql": "DROP DATABASE IF EXISTS db_mycat_mod_3" + }, + { + "slice": "slice-1", + "sql": "CREATE DATABASE db_mycat_mod_2" + }, + { + "slice": "slice-1", + "sql": "CREATE DATABASE db_mycat_mod_3" + }, + { + "slice": "slice-1", + "sql": "USE db_mycat_mod_2" + }, + { + "slice": "slice-1", + "sql":"CREATE TABLE IF NOT EXISTS tbl_mycat ( id INT(64) NOT NULL, col1 VARCHAR(256),PRIMARY KEY (id)) ENGINE=InnoDB DEFAULT CHARSET=utf8;" + }, + { + "slice": "slice-1", + "sql": "USE db_mycat_mod_3" + }, + { + "slice": "slice-1", + "sql":"CREATE TABLE IF NOT EXISTS tbl_mycat ( id INT(64) NOT NULL, col1 VARCHAR(256),PRIMARY KEY (id)) ENGINE=InnoDB DEFAULT CHARSET=utf8;" + } + ], + "gaeaActions": [ + { + "sql":"USE db_mycat_mod", + "execType": "Default" + }, + { + "sql": "INSERT INTO tbl_mycat (id ,col1) VALUES (1,'test1') ", + "execType": "Default" + }, + { + "sql": "INSERT INTO tbl_mycat (id ,col1) VALUES (2,'test2') ", + "execType": "Default" + }, + { + "sql": "INSERT INTO tbl_mycat (id ,col1) VALUES (3,'test3') ", + "execType": "Default" + }, + { + "sql": "INSERT INTO tbl_mycat (id ,col1) VALUES (4,'test4') ", + "execType": "Default" + }, + { + "sql": "INSERT INTO tbl_mycat (id ,col1) VALUES (5,'test5') ", + "execType": "Default" + }, + { + "sql": "SELECT * FROM tbl_mycat", + "execType": "Default" + } + ], + "tearDown": [ + { + "slice": "slice-0", + "sql": "DROP DATABASE IF EXISTS db_mycat_mod_0" + }, + { + "slice": "slice-0", + "sql": "DROP DATABASE IF EXISTS db_mycat_mod_1" + }, + { + "slice": "slice-1", + "sql": "DROP DATABASE IF EXISTS db_mycat_mod_2" + }, + { + "slice": "slice-1", + "sql": "DROP DATABASE IF EXISTS db_mycat_mod_3" + } + ] + } + ] + } diff --git a/tests/e2e/shard/case/dml/mycatmurmur.json b/tests/e2e/shard/case/dml/mycatmurmur.json new file mode 100644 index 00000000..94788f66 --- /dev/null +++ b/tests/e2e/shard/case/dml/mycatmurmur.json @@ -0,0 +1,193 @@ +{ + "execCases": [ + { + "description": "Test Mycat MURMUR", + "setUp": [ + { + "slice": "slice-0", + "sql": "DROP DATABASE IF EXISTS db_mycat_murmur_0" + }, + { + "slice": "slice-0", + "sql": "DROP DATABASE IF EXISTS db_mycat_murmur_1" + }, + { + "slice": "slice-0", + "sql": "CREATE DATABASE db_mycat_murmur_0" + }, + { + "slice": "slice-0", + "sql": "CREATE DATABASE db_mycat_murmur_1" + }, + { + "slice": "slice-0", + "sql": "USE db_mycat_murmur_0" + }, + { + "slice": "slice-0", + "sql":"CREATE TABLE IF NOT EXISTS tbl_mycat ( id INT(64) NOT NULL, col1 VARCHAR(256),PRIMARY KEY (id)) ENGINE=InnoDB DEFAULT CHARSET=utf8;" + }, + { + "slice": "slice-0", + "sql": "USE db_mycat_murmur_1" + }, + { + "slice": "slice-0", + "sql":"CREATE TABLE IF NOT EXISTS tbl_mycat ( id INT(64) NOT NULL, col1 VARCHAR(256),PRIMARY KEY (id)) ENGINE=InnoDB DEFAULT CHARSET=utf8;" + }, + { + "slice": "slice-1", + "sql": "DROP DATABASE IF EXISTS db_mycat_murmur_2" + }, + { + "slice": "slice-1", + "sql": "DROP DATABASE IF EXISTS db_mycat_murmur_3" + }, + { + "slice": "slice-1", + "sql": "CREATE DATABASE db_mycat_murmur_2" + }, + { + "slice": "slice-1", + "sql": "CREATE DATABASE db_mycat_murmur_3" + }, + { + "slice": "slice-1", + "sql": "USE db_mycat_murmur_2" + }, + { + "slice": "slice-1", + "sql":"CREATE TABLE IF NOT EXISTS tbl_mycat ( id INT(64) NOT NULL, col1 VARCHAR(256),PRIMARY KEY (id)) ENGINE=InnoDB DEFAULT CHARSET=utf8;" + }, + { + "slice": "slice-1", + "sql": "USE db_mycat_murmur_3" + }, + { + "slice": "slice-1", + "sql":"CREATE TABLE IF NOT EXISTS tbl_mycat ( id INT(64) NOT NULL, col1 VARCHAR(256),PRIMARY KEY (id)) ENGINE=InnoDB DEFAULT CHARSET=utf8;" + } + ], + "gaeaActions": [ + { + "sql":"USE db_mycat_murmur", + "execType": "Default" + }, + { + "sql": "INSERT INTO tbl_mycat (id ,col1) VALUES (1,'test1') ", + "execType": "Default" + }, + { + "sql": "INSERT INTO tbl_mycat (id ,col1) VALUES (5,'test5') ", + "execType": "Default" + }, + { + "sql": "INSERT INTO tbl_mycat (id ,col1) VALUES (4,'test4') ", + "execType": "Default" + }, + { + "sql": "INSERT INTO tbl_mycat (id ,col1) VALUES (12,'test12') ", + "execType": "Default" + }, + { + "sql": "UPDATE tbl_mycat SET col1='updated_test1' WHERE id=1", + "execType": "Default" + } + + ], + "masterCheckSQL": [ + { + "name": "slice-0.db_mycat_murmur_0 check", + "slice": "slice-0", + "db": "db_mycat_murmur_0", + "sql": "SELECT col1 FROM tbl_mycat WHERE id=5", + "execType": "Query", + "expect": [ + ["test5"] + ] + }, + { + "name": "slice-10.db_mycat_mod_0 check", + "slice": "slice-0", + "db": "db_mycat_murmur_0", + "sql": "SELECT col1 FROM tbl_mycat WHERE id IN ('1', '4','12')", + "execType": "Query", + "expect": [] + }, + { + "name": "slice-0.db_mycat_mod_1 check", + "slice": "slice-0", + "db": "db_mycat_murmur_1", + "sql": "SELECT col1 FROM tbl_mycat WHERE id=1", + "execType": "Query", + "expect": [ + ["updated_test1"] + ] + }, + { + "name": "slice-0.db_mycat_mod_1 check", + "slice": "slice-0", + "db": "db_mycat_murmur_1", + "sql": "SELECT col1 FROM tbl_mycat WHERE id IN ('5', '4','12')", + "execType": "Query", + "expect": [] + }, + { + "name": "slice-1.db_mycat_mod_2 check", + "slice": "slice-1", + "db": "db_mycat_murmur_2", + "sql": "SELECT col1 FROM tbl_mycat WHERE id =4 ", + "execType": "Query", + "expect": [ + ["test4"] + ] + + }, + { + "name": "slice-1.db_mycat_mod_2 check", + "slice": "slice-1", + "db": "db_mycat_murmur_2", + "sql": "SELECT col1 FROM tbl_mycat WHERE id IN ('1', '5','12')", + "execType": "Query", + "expect": [] + }, + { + "name": "slice-1.db_mycat_mod_3 check", + "slice": "slice-1", + "db": "db_mycat_murmur_3", + "sql": "SELECT col1 FROM tbl_mycat WHERE id=12", + "execType": "Query", + "expect": [ + ["test12"] + ] + }, + { + "name": "slice-1.db_mycat_mod_3 check", + "slice": "slice-1", + "db": "db_mycat_murmur_3", + "sql": "SELECT col1 FROM tbl_mycat WHERE id IN ('1', '5','4')", + "execType": "Query", + "expect": [] + } + ], + "tearDown": [ + { + "slice": "slice-0", + "sql": "DROP DATABASE IF EXISTS db_mycat_murmur_0" + }, + { + "slice": "slice-0", + "sql": "DROP DATABASE IF EXISTS db_mycat_murmur_1" + }, + { + "slice": "slice-1", + "sql": "DROP DATABASE IF EXISTS db_mycat_murmur_2" + }, + { + "slice": "slice-1", + "sql": "DROP DATABASE IF EXISTS db_mycat_murmur_3" + } + ] + } + ] + } diff --git a/tests/e2e/shard/case/dml/mycatstring.json b/tests/e2e/shard/case/dml/mycatstring.json new file mode 100644 index 00000000..2c5a2f16 --- /dev/null +++ b/tests/e2e/shard/case/dml/mycatstring.json @@ -0,0 +1,187 @@ +{ + "execCases": [ + { + "description": "Test Mycat STRING", + "setUp": [ + { + "slice": "slice-0", + "sql": "DROP DATABASE IF EXISTS db_mycat_string_0" + }, + { + "slice": "slice-0", + "sql": "DROP DATABASE IF EXISTS db_mycat_string_1" + }, + { + "slice": "slice-0", + "sql": "CREATE DATABASE db_mycat_string_0" + }, + { + "slice": "slice-0", + "sql": "CREATE DATABASE db_mycat_string_1" + }, + { + "slice": "slice-0", + "sql": "USE db_mycat_string_0" + }, + { + "slice": "slice-0", + "sql":"CREATE TABLE IF NOT EXISTS tbl_mycat ( id INT(64) NOT NULL, col1 VARCHAR(256),PRIMARY KEY (id)) ENGINE=InnoDB DEFAULT CHARSET=utf8;" + }, + { + "slice": "slice-0", + "sql": "USE db_mycat_string_1" + }, + { + "slice": "slice-0", + "sql":"CREATE TABLE IF NOT EXISTS tbl_mycat ( id INT(64) NOT NULL, col1 VARCHAR(256),PRIMARY KEY (id)) ENGINE=InnoDB DEFAULT CHARSET=utf8;" + }, + { + "slice": "slice-1", + "sql": "DROP DATABASE IF EXISTS db_mycat_string_2" + }, + { + "slice": "slice-1", + "sql": "DROP DATABASE IF EXISTS db_mycat_string_3" + }, + { + "slice": "slice-1", + "sql": "CREATE DATABASE db_mycat_string_2" + }, + { + "slice": "slice-1", + "sql": "CREATE DATABASE db_mycat_string_3" + }, + { + "slice": "slice-1", + "sql": "USE db_mycat_string_2" + }, + { + "slice": "slice-1", + "sql":"CREATE TABLE IF NOT EXISTS tbl_mycat ( id INT(64) NOT NULL, col1 VARCHAR(256),PRIMARY KEY (id)) ENGINE=InnoDB DEFAULT CHARSET=utf8;" + }, + { + "slice": "slice-1", + "sql": "USE db_mycat_string_3" + }, + { + "slice": "slice-1", + "sql":"CREATE TABLE IF NOT EXISTS tbl_mycat ( id INT(64) NOT NULL, col1 VARCHAR(256),PRIMARY KEY (id)) ENGINE=InnoDB DEFAULT CHARSET=utf8;" + } + ], + "gaeaActions": [ + { + "sql":"USE db_mycat_string", + "execType": "Default" + }, + { + "sql": "INSERT INTO tbl_mycat (id ,col1) VALUES (100,'test100') ", + "execType": "Default" + }, + { + "sql": "INSERT INTO tbl_mycat (id ,col1) VALUES (1,'test1') ", + "execType": "Default" + }, + { + "sql": "INSERT INTO tbl_mycat (id ,col1) VALUES (10,'test10') ", + "execType": "Default" + }, + { + "sql": "INSERT INTO tbl_mycat (id ,col1) VALUES (80,'test80') ", + "execType": "Default" + } + ], + "masterCheckSQL": [ + { + "name": "slice-0.db_mycat_string_0 check", + "slice": "slice-0", + "db": "db_mycat_string_0", + "sql": "SELECT col1 FROM tbl_mycat WHERE id=100", + "execType": "Query", + "expect": [ + ["test100"] + ] + }, + { + "name": "slice-10.db_mycat_string_0 check", + "slice": "slice-0", + "db": "db_mycat_string_0", + "sql": "SELECT col1 FROM tbl_mycat WHERE id IN ('1', '10','80')", + "execType": "Query", + "expect": [] + }, + { + "name": "slice-0.db_mycat_string_1 check", + "slice": "slice-0", + "db": "db_mycat_string_1", + "sql": "SELECT col1 FROM tbl_mycat WHERE id=1", + "execType": "Query", + "expect": [ + ["test1"] + ] + }, + { + "name": "slice-1.db_mycat_string_1 check", + "slice": "slice-0", + "db": "db_mycat_string_1", + "sql": "SELECT col1 FROM tbl_mycat WHERE id IN ('100', '10','80')", + "execType": "Query", + "expect": [] + }, + { + "name": "slice-1.db_mycat_string_2 check", + "slice": "slice-1", + "db": "db_mycat_string_2", + "sql": "SELECT col1 FROM tbl_mycat WHERE id=10", + "execType": "Query", + "expect": [ + ["test10"] + ] + }, + { + "name": "slice-1.db_mycat_string_2 check", + "slice": "slice-1", + "db": "db_mycat_string_2", + "sql": "SELECT col1 FROM tbl_mycat WHERE id IN ('100', '1','80')", + "execType": "Query", + "expect": [] + }, + { + "name": "slice-1.db_mycat_string_3 check", + "slice": "slice-1", + "db": "db_mycat_string_3", + "sql": "SELECT col1 FROM tbl_mycat WHERE id=80", + "execType": "Query", + "expect": [ + ["test80"] + ] + }, + { + "name": "slice-1.db_mycat_mod_3 check", + "slice": "slice-1", + "db": "db_mycat_string_3", + "sql": "SELECT col1 FROM tbl_mycat WHERE id IN ('100', '1','10')", + "execType": "Query", + "expect": [] + } + ], + "tearDown": [ + { + "slice": "slice-0", + "sql": "DROP DATABASE IF EXISTS db_mycat_string_0" + }, + { + "slice": "slice-0", + "sql": "DROP DATABASE IF EXISTS db_mycat_string_1" + }, + { + "slice": "slice-1", + "sql": "DROP DATABASE IF EXISTS db_mycat_string_2" + }, + { + "slice": "slice-1", + "sql": "DROP DATABASE IF EXISTS db_mycat_string_3" + } + ] + } + ] + } diff --git a/tests/e2e/shard/case/join/0-gaea-prepare.sql b/tests/e2e/shard/case/join/0-gaea-prepare.sql new file mode 100644 index 00000000..3ee2bca1 --- /dev/null +++ b/tests/e2e/shard/case/join/0-gaea-prepare.sql @@ -0,0 +1,16 @@ +insert into test1 (id, t_id, name, pad) values(1,1,'test中id为1',1),(2,2,'test_2',2),(3,3,'test中id为3',4),(4,4,'$test$4',3),(5,5,'test...5',1),(6,6,'test6',6); +insert into test2 (id, o_id, name, pad) values(1,1,'order中id为1',1),(2,2,'test_2',2),(3,3,'order中id为3',3),(4,4,'$order$4',4),(5,5,'order...5',1); +insert into test3 (id, m_id, name, pad)values(1,1,'manager中id为1',1),(2,2,'test_2',2),(3,3,'manager中id为3',3),(4,4,'$manager$4',4),(5,5,'manager...5',6); +INSERT INTO test4 (ID,FirstName,LastName,Department,Salary )VALUES(201,'Mazojys','Fxoj','Finance',7800),(202,'Jozzh','Lnanyo','Finance',45800),(203,'Syllauu','Dfaafk','Finance',57000),(204,'Gecrrcc','Srlkrt','Finance',62000),(205,'Jssme','Bdnaa','Development',75000),(206,'Dnnaao','Errllov','Development',55000),(207,'Tyoysww','Osk','Development',49000); +insert into test5 (id,R_REGIONKEY,R_NAME,R_COMMENT) values (1,1, 'Eastern','test001'),(3,3, 'Northern','test003'),(2,2, 'Western','test002'),(4,4, 'Southern','test004'); +insert into test6 (id,C_NAME,C_NATIONKEY,C_ORDERKEY,C_CUSTKEY) values (1,'chenxiao','NATIONKEY_001','ORDERKEY_001','CUSTKEY_003'),(3,'wangye','NATIONKEY_001','ORDERKEY_004','CUSTKEY_111'),(2,'xiaojuan','NATIONKEY_001','ORDERKEY_005','CUSTKEY_132'),(4,'chenqi','NATIONKEY_051','ORDERKEY_010','CUSTKEY_333'),(5,'marui','NATIONKEY_002','ORDERKEY_011','CUSTKEY_012'),(8,'huachen','NATIONKEY_002','ORDERKEY_007','CUSTKEY_980'),(7,'yanglu','NATIONKEY_132','ORDERKEY_006','CUSTKEY_420'); +insert into test7 (id,C_NAME,C_NATIONKEY,C_ORDERKEY,C_CUSTKEY) values (1,'chenxiao','NATIONKEY_001','ORDERKEY_001','CUSTKEY_003'),(3,'wangye','NATIONKEY_001','ORDERKEY_004','CUSTKEY_111'),(2,'xiaojuan','NATIONKEY_001','ORDERKEY_005','CUSTKEY_132'),(4,'chenqi','NATIONKEY_051','ORDERKEY_010','CUSTKEY_333'),(5,'marui','NATIONKEY_002','ORDERKEY_011','CUSTKEY_012'),(8,'huachen','NATIONKEY_002','ORDERKEY_007','CUSTKEY_980'),(7,'yanglu','NATIONKEY_132','ORDERKEY_006','CUSTKEY_420'); +insert into test8 (id,O_ORDERKEY,O_CUSTKEY,O_TOTALPRICE,MYDATE) values (1,'ORDERKEY_001','CUSTKEY_003',200000,'20141022'),(2,'ORDERKEY_002','CUSTKEY_003',100000,'19920501'),(4,'ORDERKEY_004','CUSTKEY_111',500,'20080105'),(5,'ORDERKEY_005','CUSTKEY_132',100,'19920628'),(10,'ORDERKEY_010','CUSTKEY_333',88888888,'19920720'),(11,'ORDERKEY_011','CUSTKEY_012',323456,'19920822'),(7,'ORDERKEY_007','CUSTKEY_980',12000,'19920910'),(6,'ORDERKEY_006','CUSTKEY_420',231,'19921111'); +insert into test9 (id,O_ORDERKEY,O_CUSTKEY,O_TOTALPRICE,MYDATE) values (1,'ORDERKEY_001','CUSTKEY_003',200000,'20141022'),(2,'ORDERKEY_002','CUSTKEY_003',100000,'19920501'),(4,'ORDERKEY_004','CUSTKEY_111',500,'20080105'),(5,'ORDERKEY_005','CUSTKEY_132',100,'19920628'),(10,'ORDERKEY_010','CUSTKEY_333',88888888,'19920720'),(11,'ORDERKEY_011','CUSTKEY_012',323456,'19920822'),(7,'ORDERKEY_007','CUSTKEY_980',12000,'19920910'),(6,'ORDERKEY_006','CUSTKEY_420',231,'19921111'); +insert into t4 (id, t_id, name, pad) values(1,1,'test中id为1',1),(2,2,'test_2',2),(3,3,'test中id为3',4),(4,4,'$test$4',3),(5,5,'test...5',1),(6,6,'test6',6); +insert into t5 (id, o_id, name, pad) values(1,1,'order中id为1',1),(2,2,'test_2',2),(3,3,'order中id为3',3),(4,4,'$order$4',4),(5,5,'order...5',1); +insert into t6 (id, m_id, name, pad) values(1,1,'manager中id为1',1),(2,2,'test_2',2),(3,3,'manager中id为3',3),(4,4,'$manager$4',4),(5,5,'manager...5',6); +insert into t (id, col1, col2) values (1, 'aa', 5),(2, 'bb', 10),(3, 'cc', 15),(4, 'dd', 20),(5, 'ee', 30),(6, 'aa', 5),(7, 'bb', 10),(8, 'cc', 15),(9, 'dd', 20),(10, 'ee', 30); +insert into t1 (id, col1, col2) values (1, 'aa', 5),(2, 'bb', 10),(3, 'cc', 15),(4, 'dd', 20),(5, 'ee', 30),(6, 'aa', 5),(7, 'bb', 10),(8, 'cc', 15),(9, 'dd', 20),(10, 'ee', 30); +insert into t2 (id, col1, col2) values (1, 'aa', 5),(2, 'bb', 10),(3, 'cc', 15),(4, 'dd', 20),(5, 'ee', 30),(6, 'aa', 5),(7, 'bb', 10),(8, 'cc', 15),(9, 'dd', 20),(10, 'ee', 30); +insert into t3 (id, col1, col2) values (1, 'aa', 5),(2, 'bb', 10),(3, 'cc', 15),(4, 'dd', 20),(5, 'ee', 30),(6, 'aa', 5),(7, 'bb', 10),(8, 'cc', 15),(9, 'dd', 20),(10, 'ee', 30); diff --git a/tests/e2e/shard/case/join/0-slice0-kingshard.sql b/tests/e2e/shard/case/join/0-slice0-kingshard.sql new file mode 100644 index 00000000..027bd68f --- /dev/null +++ b/tests/e2e/shard/case/join/0-slice0-kingshard.sql @@ -0,0 +1,64 @@ +CREATE DATABASE sbtest; +USE sbtest; + +drop table if exists t_0000,t1_0000,t2_0000,t3_0000; +create table if not exists t_0000(id int(11) not null auto_increment,col1 varchar(20) default null, col2 int default null, primary key (`id`),KEY `idx1` (`col1`),KEY `idx2` (`col2`) ) ENGINE=Innodb DEFAULT CHARSET UTF8MB4; +create table if not exists t1_0000 like t_0000; +create table if not exists t2_0000 like t_0000; +create table if not exists t3_0000 like t_0000; + + +drop table if exists test1_0000; +drop table if exists test2_0000; +drop table if exists test3_0000; +CREATE TABLE test1_0000(`id` int(10) unsigned NOT NULL,`t_id` int(10) unsigned NOT NULL DEFAULT '0',`name` char(120) NOT NULL DEFAULT '',`pad` int(11) NOT NULL,PRIMARY KEY (`id`),KEY `k_1` (`t_id`))DEFAULT CHARSET=UTF8; +CREATE TABLE test2_0000(`id` int(10) unsigned NOT NULL,`o_id` int(10) unsigned NOT NULL DEFAULT '0',`name` char(120) NOT NULL DEFAULT '',`pad` int(11) NOT NULL,PRIMARY KEY (`id`),KEY `k_1` (`o_id`))DEFAULT CHARSET=UTF8; +CREATE TABLE test3_0000(`id` int(10) unsigned NOT NULL,`m_id` int(10) unsigned NOT NULL DEFAULT '0',`name` char(120) NOT NULL DEFAULT '',`pad` int(11) NOT NULL,PRIMARY KEY (`id`),KEY `k_1` (`m_id`))DEFAULT CHARSET=UTF8; + + +drop table if exists t4_0000; +drop table if exists t5_0000; +drop table if exists t6_0000; +CREATE TABLE t4_0000(`id` int(10) unsigned NOT NULL,`t_id` int(10) unsigned NOT NULL DEFAULT '0',`name` char(120) NOT NULL DEFAULT '',`pad` int(11) NOT NULL,PRIMARY KEY (`id`),KEY `k_1` (`t_id`))DEFAULT CHARSET=UTF8; +CREATE TABLE t5_0000(`id` int(10) unsigned NOT NULL,`o_id` int(10) unsigned NOT NULL DEFAULT '0',`name` char(120) NOT NULL DEFAULT '',`pad` int(11) NOT NULL,PRIMARY KEY (`id`),KEY `k_1` (`o_id`))DEFAULT CHARSET=UTF8; +CREATE TABLE t6_0000(`id` int(10) unsigned NOT NULL,`m_id` int(10) unsigned NOT NULL DEFAULT '0',`name` char(120) NOT NULL DEFAULT '',`pad` int(11) NOT NULL,PRIMARY KEY (`id`),KEY `k_1` (`m_id`))DEFAULT CHARSET=UTF8; + +drop table if exists test4_0000,test5_0000,test6_0000,test7_0000,test8_0000,test9_0000; +CREATE TABLE test4_0000(ID INT NOT NULL,FirstName VARCHAR(20),LastName VARCHAR(20),Department VARCHAR(20),Salary INT,key `ID_index` (`ID`)); +create table test5_0000 (id int(11),R_REGIONKEY int(11) primary key,R_NAME varchar(50),R_COMMENT varchar(50)); +create table test6_0000(id int(11),C_NAME varchar(20),C_NATIONKEY varchar(20),C_ORDERKEY varchar(20),C_CUSTKEY varchar(20) primary key); +create table test7_0000(id int(11),C_NAME varchar(20),C_NATIONKEY varchar(20),C_ORDERKEY varchar(20),C_CUSTKEY varchar(20) primary key); +create table test8_0000 (id int(11),O_ORDERKEY varchar(20) primary key,O_CUSTKEY varchar(20),O_TOTALPRICE int(20),MYDATE date); +create table test9_0000 (id int(11),O_ORDERKEY varchar(20) primary key,O_CUSTKEY varchar(20),O_TOTALPRICE int(20),MYDATE date, index ORDERS_FK1 (`O_CUSTKEY`)); + + + +drop table if exists t_0001,t1_0001,t2_0001,t3_0001; +create table if not exists t_0001(id int(11) not null auto_increment,col1 varchar(20) default null, col2 int default null, primary key (`id`),KEY `idx1` (`col1`),KEY `idx2` (`col2`) ) ENGINE=Innodb DEFAULT CHARSET UTF8MB4; +create table if not exists t1_0001 like t_0001; +create table if not exists t2_0001 like t_0001; +create table if not exists t3_0001 like t_0001; + + +drop table if exists test1_0001; +drop table if exists test2_0001; +drop table if exists test3_0001; +CREATE TABLE test1_0001(`id` int(10) unsigned NOT NULL,`t_id` int(10) unsigned NOT NULL DEFAULT '0',`name` char(120) NOT NULL DEFAULT '',`pad` int(11) NOT NULL,PRIMARY KEY (`id`),KEY `k_1` (`t_id`))DEFAULT CHARSET=UTF8; +CREATE TABLE test2_0001(`id` int(10) unsigned NOT NULL,`o_id` int(10) unsigned NOT NULL DEFAULT '0',`name` char(120) NOT NULL DEFAULT '',`pad` int(11) NOT NULL,PRIMARY KEY (`id`),KEY `k_1` (`o_id`))DEFAULT CHARSET=UTF8; +CREATE TABLE test3_0001(`id` int(10) unsigned NOT NULL,`m_id` int(10) unsigned NOT NULL DEFAULT '0',`name` char(120) NOT NULL DEFAULT '',`pad` int(11) NOT NULL,PRIMARY KEY (`id`),KEY `k_1` (`m_id`))DEFAULT CHARSET=UTF8; + + +drop table if exists t4_0001; +drop table if exists t5_0001; +drop table if exists t6_0001; +CREATE TABLE t4_0001(`id` int(10) unsigned NOT NULL,`t_id` int(10) unsigned NOT NULL DEFAULT '0',`name` char(120) NOT NULL DEFAULT '',`pad` int(11) NOT NULL,PRIMARY KEY (`id`),KEY `k_1` (`t_id`))DEFAULT CHARSET=UTF8; +CREATE TABLE t5_0001(`id` int(10) unsigned NOT NULL,`o_id` int(10) unsigned NOT NULL DEFAULT '0',`name` char(120) NOT NULL DEFAULT '',`pad` int(11) NOT NULL,PRIMARY KEY (`id`),KEY `k_1` (`o_id`))DEFAULT CHARSET=UTF8; +CREATE TABLE t6_0001(`id` int(10) unsigned NOT NULL,`m_id` int(10) unsigned NOT NULL DEFAULT '0',`name` char(120) NOT NULL DEFAULT '',`pad` int(11) NOT NULL,PRIMARY KEY (`id`),KEY `k_1` (`m_id`))DEFAULT CHARSET=UTF8; + +drop table if exists test4_0001,test5_0001,test6_0001,test7_0001,test8_0001,test9_0001; +CREATE TABLE test4_0001(ID INT NOT NULL,FirstName VARCHAR(20),LastName VARCHAR(20),Department VARCHAR(20),Salary INT,key `ID_index` (`ID`)); +create table test5_0001 (id int(11),R_REGIONKEY int(11) primary key,R_NAME varchar(50),R_COMMENT varchar(50)); +create table test6_0001(id int(11),C_NAME varchar(20),C_NATIONKEY varchar(20),C_ORDERKEY varchar(20),C_CUSTKEY varchar(20) primary key); +create table test7_0001(id int(11),C_NAME varchar(20),C_NATIONKEY varchar(20),C_ORDERKEY varchar(20),C_CUSTKEY varchar(20) primary key); +create table test8_0001 (id int(11),O_ORDERKEY varchar(20) primary key,O_CUSTKEY varchar(20),O_TOTALPRICE int(20),MYDATE date); +create table test9_0001 (id int(11),O_ORDERKEY varchar(20) primary key,O_CUSTKEY varchar(20),O_TOTALPRICE int(20),MYDATE date, index ORDERS_FK1 (`O_CUSTKEY`)); diff --git a/tests/e2e/shard/case/join/0-slice0-mycat.sql b/tests/e2e/shard/case/join/0-slice0-mycat.sql new file mode 100644 index 00000000..ee36bbd2 --- /dev/null +++ b/tests/e2e/shard/case/join/0-slice0-mycat.sql @@ -0,0 +1,71 @@ +CREATE DATABASE sbtest_0; +USE sbtest_0; + +drop table if exists t,t1,t2,t3; +create table if not exists t(id int(11) not null auto_increment,col1 varchar(20) default null, col2 int default null, primary key (`id`),KEY `idx1` (`col1`),KEY `idx2` (`col2`) ) ENGINE=Innodb DEFAULT CHARSET UTF8MB4; +create table if not exists t1 like t; +create table if not exists t2 like t; +create table if not exists t3 like t; + + +drop table if exists test1; +drop table if exists test2; +drop table if exists test3; +CREATE TABLE test1(`id` int(10) unsigned NOT NULL,`t_id` int(10) unsigned NOT NULL DEFAULT '0',`name` char(120) NOT NULL DEFAULT '',`pad` int(11) NOT NULL,PRIMARY KEY (`id`),KEY `k_1` (`t_id`))DEFAULT CHARSET=UTF8; +CREATE TABLE test2(`id` int(10) unsigned NOT NULL,`o_id` int(10) unsigned NOT NULL DEFAULT '0',`name` char(120) NOT NULL DEFAULT '',`pad` int(11) NOT NULL,PRIMARY KEY (`id`),KEY `k_1` (`o_id`))DEFAULT CHARSET=UTF8; +CREATE TABLE test3(`id` int(10) unsigned NOT NULL,`m_id` int(10) unsigned NOT NULL DEFAULT '0',`name` char(120) NOT NULL DEFAULT '',`pad` int(11) NOT NULL,PRIMARY KEY (`id`),KEY `k_1` (`m_id`))DEFAULT CHARSET=UTF8; + + +drop table if exists t4; +drop table if exists t5; +drop table if exists t6; +CREATE TABLE t4(`id` int(10) unsigned NOT NULL,`t_id` int(10) unsigned NOT NULL DEFAULT '0',`name` char(120) NOT NULL DEFAULT '',`pad` int(11) NOT NULL,PRIMARY KEY (`id`),KEY `k_1` (`t_id`))DEFAULT CHARSET=UTF8; +CREATE TABLE t5(`id` int(10) unsigned NOT NULL,`o_id` int(10) unsigned NOT NULL DEFAULT '0',`name` char(120) NOT NULL DEFAULT '',`pad` int(11) NOT NULL,PRIMARY KEY (`id`),KEY `k_1` (`o_id`))DEFAULT CHARSET=UTF8; +CREATE TABLE t6(`id` int(10) unsigned NOT NULL,`m_id` int(10) unsigned NOT NULL DEFAULT '0',`name` char(120) NOT NULL DEFAULT '',`pad` int(11) NOT NULL,PRIMARY KEY (`id`),KEY `k_1` (`m_id`))DEFAULT CHARSET=UTF8; + +drop table if exists test4,test5,test6,test7,test8,test9; +CREATE TABLE test4(ID INT NOT NULL,FirstName VARCHAR(20),LastName VARCHAR(20),Department VARCHAR(20),Salary INT,key `ID_index` (`ID`)); +create table test5 (id int(11),R_REGIONKEY int(11) primary key,R_NAME varchar(50),R_COMMENT varchar(50)); +create table test6(id int(11),C_NAME varchar(20),C_NATIONKEY varchar(20),C_ORDERKEY varchar(20),C_CUSTKEY varchar(20) primary key); +create table test7(id int(11),C_NAME varchar(20),C_NATIONKEY varchar(20),C_ORDERKEY varchar(20),C_CUSTKEY varchar(20) primary key); +create table test8 (id int(11),O_ORDERKEY varchar(20) primary key,O_CUSTKEY varchar(20),O_TOTALPRICE int(20),MYDATE date); +create table test9 (id int(11),O_ORDERKEY varchar(20) primary key,O_CUSTKEY varchar(20),O_TOTALPRICE int(20),MYDATE date, index ORDERS_FK1 (`O_CUSTKEY`)); + + + + +CREATE DATABASE IF NOT EXISTS sbtest_1; +USE sbtest_1; + +drop table if exists t,t1,t2,t3; + +create table if not exists t(id int(11) not null auto_increment,col1 varchar(20) default null, col2 int default null, primary key (`id`),KEY `idx1` (`col1`),KEY `idx2` (`col2`) ) ENGINE=Innodb DEFAULT CHARSET UTF8MB4; +create table if not exists t1 like t; +create table if not exists t2 like t; +create table if not exists t3 like t; + +drop table if exists test1; +drop table if exists test2; +drop table if exists test3; + +CREATE TABLE test1(`id` int(10) unsigned NOT NULL,`t_id` int(10) unsigned NOT NULL DEFAULT '0',`name` char(120) NOT NULL DEFAULT '',`pad` int(11) NOT NULL,PRIMARY KEY (`id`),KEY `k_1` (`t_id`))DEFAULT CHARSET=UTF8; +CREATE TABLE test2(`id` int(10) unsigned NOT NULL,`o_id` int(10) unsigned NOT NULL DEFAULT '0',`name` char(120) NOT NULL DEFAULT '',`pad` int(11) NOT NULL,PRIMARY KEY (`id`),KEY `k_1` (`o_id`))DEFAULT CHARSET=UTF8; +CREATE TABLE test3(`id` int(10) unsigned NOT NULL,`m_id` int(10) unsigned NOT NULL DEFAULT '0',`name` char(120) NOT NULL DEFAULT '',`pad` int(11) NOT NULL,PRIMARY KEY (`id`),KEY `k_1` (`m_id`))DEFAULT CHARSET=UTF8; + + +drop table if exists t4; +drop table if exists t5; +drop table if exists t6; + +CREATE TABLE t4(`id` int(10) unsigned NOT NULL,`t_id` int(10) unsigned NOT NULL DEFAULT '0',`name` char(120) NOT NULL DEFAULT '',`pad` int(11) NOT NULL,PRIMARY KEY (`id`),KEY `k_1` (`t_id`))DEFAULT CHARSET=UTF8; +CREATE TABLE t5(`id` int(10) unsigned NOT NULL,`o_id` int(10) unsigned NOT NULL DEFAULT '0',`name` char(120) NOT NULL DEFAULT '',`pad` int(11) NOT NULL,PRIMARY KEY (`id`),KEY `k_1` (`o_id`))DEFAULT CHARSET=UTF8; +CREATE TABLE t6(`id` int(10) unsigned NOT NULL,`m_id` int(10) unsigned NOT NULL DEFAULT '0',`name` char(120) NOT NULL DEFAULT '',`pad` int(11) NOT NULL,PRIMARY KEY (`id`),KEY `k_1` (`m_id`))DEFAULT CHARSET=UTF8; + +drop table if exists test4,test5,test6,test7,test8,test9; + +CREATE TABLE test4(ID INT NOT NULL,FirstName VARCHAR(20),LastName VARCHAR(20),Department VARCHAR(20),Salary INT,key `ID_index` (`ID`)); +create table test5 (id int(11),R_REGIONKEY int(11) primary key,R_NAME varchar(50),R_COMMENT varchar(50)); +create table test6(id int(11),C_NAME varchar(20),C_NATIONKEY varchar(20),C_ORDERKEY varchar(20),C_CUSTKEY varchar(20) primary key); +create table test7(id int(11),C_NAME varchar(20),C_NATIONKEY varchar(20),C_ORDERKEY varchar(20),C_CUSTKEY varchar(20) primary key); +create table test8 (id int(11),O_ORDERKEY varchar(20) primary key,O_CUSTKEY varchar(20),O_TOTALPRICE int(20),MYDATE date); +create table test9 (id int(11),O_ORDERKEY varchar(20) primary key,O_CUSTKEY varchar(20),O_TOTALPRICE int(20),MYDATE date, index ORDERS_FK1 (`O_CUSTKEY`)); diff --git a/tests/e2e/shard/case/join/0-slice1-kingshard.sql b/tests/e2e/shard/case/join/0-slice1-kingshard.sql new file mode 100644 index 00000000..3277f720 --- /dev/null +++ b/tests/e2e/shard/case/join/0-slice1-kingshard.sql @@ -0,0 +1,61 @@ +CREATE DATABASE sbtest; +USE sbtest; + +drop table if exists t_0002,t1_0002,t2_0002,t3_0002; +create table if not exists t_0002(id int(11) not null auto_increment,col1 varchar(20) default null, col2 int default null, primary key (`id`),KEY `idx1` (`col1`),KEY `idx2` (`col2`) ) ENGINE=Innodb DEFAULT CHARSET UTF8MB4; +create table if not exists t1_0002 like t_0002; +create table if not exists t2_0002 like t_0002; +create table if not exists t3_0002 like t_0002; + +drop table if exists test1_0002; +drop table if exists test2_0002; +drop table if exists test3_0002; +CREATE TABLE test1_0002(`id` int(10) unsigned NOT NULL,`t_id` int(10) unsigned NOT NULL DEFAULT '0',`name` char(120) NOT NULL DEFAULT '',`pad` int(11) NOT NULL,PRIMARY KEY (`id`),KEY `k_1` (`t_id`))DEFAULT CHARSET=UTF8; +CREATE TABLE test2_0002(`id` int(10) unsigned NOT NULL,`o_id` int(10) unsigned NOT NULL DEFAULT '0',`name` char(120) NOT NULL DEFAULT '',`pad` int(11) NOT NULL,PRIMARY KEY (`id`),KEY `k_1` (`o_id`))DEFAULT CHARSET=UTF8; +CREATE TABLE test3_0002(`id` int(10) unsigned NOT NULL,`m_id` int(10) unsigned NOT NULL DEFAULT '0',`name` char(120) NOT NULL DEFAULT '',`pad` int(11) NOT NULL,PRIMARY KEY (`id`),KEY `k_1` (`m_id`))DEFAULT CHARSET=UTF8; + +drop table if exists t4_0002; +drop table if exists t5_0002; +drop table if exists t6_0002; +CREATE TABLE t4_0002(`id` int(10) unsigned NOT NULL,`t_id` int(10) unsigned NOT NULL DEFAULT '0',`name` char(120) NOT NULL DEFAULT '',`pad` int(11) NOT NULL,PRIMARY KEY (`id`),KEY `k_1` (`t_id`))DEFAULT CHARSET=UTF8; +CREATE TABLE t5_0002(`id` int(10) unsigned NOT NULL,`o_id` int(10) unsigned NOT NULL DEFAULT '0',`name` char(120) NOT NULL DEFAULT '',`pad` int(11) NOT NULL,PRIMARY KEY (`id`),KEY `k_1` (`o_id`))DEFAULT CHARSET=UTF8; +CREATE TABLE t6_0002(`id` int(10) unsigned NOT NULL,`m_id` int(10) unsigned NOT NULL DEFAULT '0',`name` char(120) NOT NULL DEFAULT '',`pad` int(11) NOT NULL,PRIMARY KEY (`id`),KEY `k_1` (`m_id`))DEFAULT CHARSET=UTF8; + +drop table if exists test4_0002,test5_0002,test6_0002,test7_0002,test8_0002,test9_0002; +CREATE TABLE test4_0002(ID INT NOT NULL,FirstName VARCHAR(20),LastName VARCHAR(20),Department VARCHAR(20),Salary INT,key `ID_index` (`ID`)); +create table test5_0002 (id int(11),R_REGIONKEY int(11) primary key,R_NAME varchar(50),R_COMMENT varchar(50)); +create table test6_0002(id int(11),C_NAME varchar(20),C_NATIONKEY varchar(20),C_ORDERKEY varchar(20),C_CUSTKEY varchar(20) primary key); +create table test7_0002(id int(11),C_NAME varchar(20),C_NATIONKEY varchar(20),C_ORDERKEY varchar(20),C_CUSTKEY varchar(20) primary key); +create table test8_0002 (id int(11),O_ORDERKEY varchar(20) primary key,O_CUSTKEY varchar(20),O_TOTALPRICE int(20),MYDATE date); +create table test9_0002 (id int(11),O_ORDERKEY varchar(20) primary key,O_CUSTKEY varchar(20),O_TOTALPRICE int(20),MYDATE date, index ORDERS_FK1 (`O_CUSTKEY`)); + + +drop table if exists t_0003,t1_0003,t2_0003,t3_0003; +create table if not exists t_0003(id int(11) not null auto_increment,col1 varchar(20) default null, col2 int default null, primary key (`id`),KEY `idx1` (`col1`),KEY `idx2` (`col2`) ) ENGINE=Innodb DEFAULT CHARSET UTF8MB4; +create table if not exists t1_0003 like t_0003; +create table if not exists t2_0003 like t_0003; +create table if not exists t3_0003 like t_0003; + + +drop table if exists test1_0003; +drop table if exists test2_0003; +drop table if exists test3_0003; +CREATE TABLE test1_0003(`id` int(10) unsigned NOT NULL,`t_id` int(10) unsigned NOT NULL DEFAULT '0',`name` char(120) NOT NULL DEFAULT '',`pad` int(11) NOT NULL,PRIMARY KEY (`id`),KEY `k_1` (`t_id`))DEFAULT CHARSET=UTF8; +CREATE TABLE test2_0003(`id` int(10) unsigned NOT NULL,`o_id` int(10) unsigned NOT NULL DEFAULT '0',`name` char(120) NOT NULL DEFAULT '',`pad` int(11) NOT NULL,PRIMARY KEY (`id`),KEY `k_1` (`o_id`))DEFAULT CHARSET=UTF8; +CREATE TABLE test3_0003(`id` int(10) unsigned NOT NULL,`m_id` int(10) unsigned NOT NULL DEFAULT '0',`name` char(120) NOT NULL DEFAULT '',`pad` int(11) NOT NULL,PRIMARY KEY (`id`),KEY `k_1` (`m_id`))DEFAULT CHARSET=UTF8; + + +drop table if exists t4_0003; +drop table if exists t5_0003; +drop table if exists t6_0003; +CREATE TABLE t4_0003(`id` int(10) unsigned NOT NULL,`t_id` int(10) unsigned NOT NULL DEFAULT '0',`name` char(120) NOT NULL DEFAULT '',`pad` int(11) NOT NULL,PRIMARY KEY (`id`),KEY `k_1` (`t_id`))DEFAULT CHARSET=UTF8; +CREATE TABLE t5_0003(`id` int(10) unsigned NOT NULL,`o_id` int(10) unsigned NOT NULL DEFAULT '0',`name` char(120) NOT NULL DEFAULT '',`pad` int(11) NOT NULL,PRIMARY KEY (`id`),KEY `k_1` (`o_id`))DEFAULT CHARSET=UTF8; +CREATE TABLE t6_0003(`id` int(10) unsigned NOT NULL,`m_id` int(10) unsigned NOT NULL DEFAULT '0',`name` char(120) NOT NULL DEFAULT '',`pad` int(11) NOT NULL,PRIMARY KEY (`id`),KEY `k_1` (`m_id`))DEFAULT CHARSET=UTF8; + +drop table if exists test4_0003,test5_0003,test6_0003,test7_0003,test8_0003,test9_0003; +CREATE TABLE test4_0003(ID INT NOT NULL,FirstName VARCHAR(20),LastName VARCHAR(20),Department VARCHAR(20),Salary INT,key `ID_index` (`ID`)); +create table test5_0003 (id int(11),R_REGIONKEY int(11) primary key,R_NAME varchar(50),R_COMMENT varchar(50)); +create table test6_0003(id int(11),C_NAME varchar(20),C_NATIONKEY varchar(20),C_ORDERKEY varchar(20),C_CUSTKEY varchar(20) primary key); +create table test7_0003(id int(11),C_NAME varchar(20),C_NATIONKEY varchar(20),C_ORDERKEY varchar(20),C_CUSTKEY varchar(20) primary key); +create table test8_0003 (id int(11),O_ORDERKEY varchar(20) primary key,O_CUSTKEY varchar(20),O_TOTALPRICE int(20),MYDATE date); +create table test9_0003 (id int(11),O_ORDERKEY varchar(20) primary key,O_CUSTKEY varchar(20),O_TOTALPRICE int(20),MYDATE date, index ORDERS_FK1 (`O_CUSTKEY`)); diff --git a/tests/e2e/shard/case/join/0-slice1-mycat.sql b/tests/e2e/shard/case/join/0-slice1-mycat.sql new file mode 100644 index 00000000..d05a22ac --- /dev/null +++ b/tests/e2e/shard/case/join/0-slice1-mycat.sql @@ -0,0 +1,77 @@ +CREATE DATABASE sbtest_2; +USE sbtest_2; + +drop table if exists t,t1,t2,t3; + +create table if not exists t(id int(11) not null auto_increment,col1 varchar(20) default null, col2 int default null, primary key (`id`),KEY `idx1` (`col1`),KEY `idx2` (`col2`) ) ENGINE=Innodb DEFAULT CHARSET UTF8MB4; +create table if not exists t1 like t; +create table if not exists t2 like t; +create table if not exists t3 like t; + + +drop table if exists test1; +drop table if exists test2; +drop table if exists test3; + +CREATE TABLE test1(`id` int(10) unsigned NOT NULL,`t_id` int(10) unsigned NOT NULL DEFAULT '0',`name` char(120) NOT NULL DEFAULT '',`pad` int(11) NOT NULL,PRIMARY KEY (`id`),KEY `k_1` (`t_id`))DEFAULT CHARSET=UTF8; +CREATE TABLE test2(`id` int(10) unsigned NOT NULL,`o_id` int(10) unsigned NOT NULL DEFAULT '0',`name` char(120) NOT NULL DEFAULT '',`pad` int(11) NOT NULL,PRIMARY KEY (`id`),KEY `k_1` (`o_id`))DEFAULT CHARSET=UTF8; +CREATE TABLE test3(`id` int(10) unsigned NOT NULL,`m_id` int(10) unsigned NOT NULL DEFAULT '0',`name` char(120) NOT NULL DEFAULT '',`pad` int(11) NOT NULL,PRIMARY KEY (`id`),KEY `k_1` (`m_id`))DEFAULT CHARSET=UTF8; + + +drop table if exists t4; +drop table if exists t5; +drop table if exists t6; + +CREATE TABLE t4(`id` int(10) unsigned NOT NULL,`t_id` int(10) unsigned NOT NULL DEFAULT '0',`name` char(120) NOT NULL DEFAULT '',`pad` int(11) NOT NULL,PRIMARY KEY (`id`),KEY `k_1` (`t_id`))DEFAULT CHARSET=UTF8; +CREATE TABLE t5(`id` int(10) unsigned NOT NULL,`o_id` int(10) unsigned NOT NULL DEFAULT '0',`name` char(120) NOT NULL DEFAULT '',`pad` int(11) NOT NULL,PRIMARY KEY (`id`),KEY `k_1` (`o_id`))DEFAULT CHARSET=UTF8; +CREATE TABLE t6(`id` int(10) unsigned NOT NULL,`m_id` int(10) unsigned NOT NULL DEFAULT '0',`name` char(120) NOT NULL DEFAULT '',`pad` int(11) NOT NULL,PRIMARY KEY (`id`),KEY `k_1` (`m_id`))DEFAULT CHARSET=UTF8; + + +drop table if exists test4,test5,test6,test7,test8,test9; + +CREATE TABLE test4(ID INT NOT NULL,FirstName VARCHAR(20),LastName VARCHAR(20),Department VARCHAR(20),Salary INT,key `ID_index` (`ID`)); +create table test5 (id int(11),R_REGIONKEY int(11) primary key,R_NAME varchar(50),R_COMMENT varchar(50)); +create table test6(id int(11),C_NAME varchar(20),C_NATIONKEY varchar(20),C_ORDERKEY varchar(20),C_CUSTKEY varchar(20) primary key); +create table test7(id int(11),C_NAME varchar(20),C_NATIONKEY varchar(20),C_ORDERKEY varchar(20),C_CUSTKEY varchar(20) primary key); +create table test8 (id int(11),O_ORDERKEY varchar(20) primary key,O_CUSTKEY varchar(20),O_TOTALPRICE int(20),MYDATE date); +create table test9 (id int(11),O_ORDERKEY varchar(20) primary key,O_CUSTKEY varchar(20),O_TOTALPRICE int(20),MYDATE date, index ORDERS_FK1 (`O_CUSTKEY`)); + + +CREATE DATABASE IF NOT EXISTS sbtest_3; +USE sbtest_3; + + +drop table if exists t,t1,t2,t3; + +create table if not exists t(id int(11) not null auto_increment,col1 varchar(20) default null, col2 int default null, primary key (`id`),KEY `idx1` (`col1`),KEY `idx2` (`col2`) ) ENGINE=Innodb DEFAULT CHARSET UTF8MB4; +create table if not exists t1 like t; +create table if not exists t2 like t; +create table if not exists t3 like t; + + +drop table if exists test1; +drop table if exists test2; +drop table if exists test3; + +CREATE TABLE test1(`id` int(10) unsigned NOT NULL,`t_id` int(10) unsigned NOT NULL DEFAULT '0',`name` char(120) NOT NULL DEFAULT '',`pad` int(11) NOT NULL,PRIMARY KEY (`id`),KEY `k_1` (`t_id`))DEFAULT CHARSET=UTF8; +CREATE TABLE test2(`id` int(10) unsigned NOT NULL,`o_id` int(10) unsigned NOT NULL DEFAULT '0',`name` char(120) NOT NULL DEFAULT '',`pad` int(11) NOT NULL,PRIMARY KEY (`id`),KEY `k_1` (`o_id`))DEFAULT CHARSET=UTF8; +CREATE TABLE test3(`id` int(10) unsigned NOT NULL,`m_id` int(10) unsigned NOT NULL DEFAULT '0',`name` char(120) NOT NULL DEFAULT '',`pad` int(11) NOT NULL,PRIMARY KEY (`id`),KEY `k_1` (`m_id`))DEFAULT CHARSET=UTF8; + + +drop table if exists t4; +drop table if exists t5; +drop table if exists t6; + +CREATE TABLE t4(`id` int(10) unsigned NOT NULL,`t_id` int(10) unsigned NOT NULL DEFAULT '0',`name` char(120) NOT NULL DEFAULT '',`pad` int(11) NOT NULL,PRIMARY KEY (`id`),KEY `k_1` (`t_id`))DEFAULT CHARSET=UTF8; +CREATE TABLE t5(`id` int(10) unsigned NOT NULL,`o_id` int(10) unsigned NOT NULL DEFAULT '0',`name` char(120) NOT NULL DEFAULT '',`pad` int(11) NOT NULL,PRIMARY KEY (`id`),KEY `k_1` (`o_id`))DEFAULT CHARSET=UTF8; +CREATE TABLE t6(`id` int(10) unsigned NOT NULL,`m_id` int(10) unsigned NOT NULL DEFAULT '0',`name` char(120) NOT NULL DEFAULT '',`pad` int(11) NOT NULL,PRIMARY KEY (`id`),KEY `k_1` (`m_id`))DEFAULT CHARSET=UTF8; + + +drop table if exists test4,test5,test6,test7,test8,test9; + +CREATE TABLE test4(ID INT NOT NULL,FirstName VARCHAR(20),LastName VARCHAR(20),Department VARCHAR(20),Salary INT,key `ID_index` (`ID`)); +create table test5 (id int(11),R_REGIONKEY int(11) primary key,R_NAME varchar(50),R_COMMENT varchar(50)); +create table test6(id int(11),C_NAME varchar(20),C_NATIONKEY varchar(20),C_ORDERKEY varchar(20),C_CUSTKEY varchar(20) primary key); +create table test7(id int(11),C_NAME varchar(20),C_NATIONKEY varchar(20),C_ORDERKEY varchar(20),C_CUSTKEY varchar(20) primary key); +create table test8 (id int(11),O_ORDERKEY varchar(20) primary key,O_CUSTKEY varchar(20),O_TOTALPRICE int(20),MYDATE date); +create table test9 (id int(11),O_ORDERKEY varchar(20) primary key,O_CUSTKEY varchar(20),O_TOTALPRICE int(20),MYDATE date, index ORDERS_FK1 (`O_CUSTKEY`)); diff --git a/tests/e2e/shard/case/join/0-test-prepare.sql b/tests/e2e/shard/case/join/0-test-prepare.sql new file mode 100644 index 00000000..d5e4396e --- /dev/null +++ b/tests/e2e/shard/case/join/0-test-prepare.sql @@ -0,0 +1,50 @@ +CREATE DATABASE sbtest; +USE sbtest; + +drop table if exists t,t1,t2,t3; +create table if not exists t(id int(11) not null auto_increment,col1 varchar(20) default null, col2 int default null, primary key (`id`),KEY `idx1` (`col1`),KEY `idx2` (`col2`) ) ENGINE=Innodb DEFAULT CHARSET UTF8MB4; +create table if not exists t1 like t; +create table if not exists t2 like t; +create table if not exists t3 like t; + + +drop table if exists test1; +drop table if exists test2; +drop table if exists test3; +CREATE TABLE test1(`id` int(10) unsigned NOT NULL,`t_id` int(10) unsigned NOT NULL DEFAULT '0',`name` char(120) NOT NULL DEFAULT '',`pad` int(11) NOT NULL,PRIMARY KEY (`id`),KEY `k_1` (`t_id`))DEFAULT CHARSET=UTF8; +CREATE TABLE test2(`id` int(10) unsigned NOT NULL,`o_id` int(10) unsigned NOT NULL DEFAULT '0',`name` char(120) NOT NULL DEFAULT '',`pad` int(11) NOT NULL,PRIMARY KEY (`id`),KEY `k_1` (`o_id`))DEFAULT CHARSET=UTF8; +CREATE TABLE test3(`id` int(10) unsigned NOT NULL,`m_id` int(10) unsigned NOT NULL DEFAULT '0',`name` char(120) NOT NULL DEFAULT '',`pad` int(11) NOT NULL,PRIMARY KEY (`id`),KEY `k_1` (`m_id`))DEFAULT CHARSET=UTF8; + +drop table if exists t4; +drop table if exists t5; +drop table if exists t6; +CREATE TABLE t4(`id` int(10) unsigned NOT NULL,`t_id` int(10) unsigned NOT NULL DEFAULT '0',`name` char(120) NOT NULL DEFAULT '',`pad` int(11) NOT NULL,PRIMARY KEY (`id`),KEY `k_1` (`t_id`))DEFAULT CHARSET=UTF8; +CREATE TABLE t5(`id` int(10) unsigned NOT NULL,`o_id` int(10) unsigned NOT NULL DEFAULT '0',`name` char(120) NOT NULL DEFAULT '',`pad` int(11) NOT NULL,PRIMARY KEY (`id`),KEY `k_1` (`o_id`))DEFAULT CHARSET=UTF8; +CREATE TABLE t6(`id` int(10) unsigned NOT NULL,`m_id` int(10) unsigned NOT NULL DEFAULT '0',`name` char(120) NOT NULL DEFAULT '',`pad` int(11) NOT NULL,PRIMARY KEY (`id`),KEY `k_1` (`m_id`))DEFAULT CHARSET=UTF8; + + +drop table if exists test4,test5,test6,test7,test8,test9; +CREATE TABLE test4(ID INT NOT NULL,FirstName VARCHAR(20),LastName VARCHAR(20),Department VARCHAR(20),Salary INT,key `ID_index` (`ID`)); +create table test5(id int(11),R_REGIONKEY int(11) primary key,R_NAME varchar(50),R_COMMENT varchar(50)); +create table test6(id int(11),C_NAME varchar(20),C_NATIONKEY varchar(20),C_ORDERKEY varchar(20),C_CUSTKEY varchar(20) primary key); +create table test7(id int(11),C_NAME varchar(20),C_NATIONKEY varchar(20),C_ORDERKEY varchar(20),C_CUSTKEY varchar(20) primary key); +create table test8(id int(11),O_ORDERKEY varchar(20) primary key,O_CUSTKEY varchar(20),O_TOTALPRICE int(20),MYDATE date); +create table test9(id int(11),O_ORDERKEY varchar(20) primary key,O_CUSTKEY varchar(20),O_TOTALPRICE int(20),MYDATE date, index ORDERS_FK1 (`O_CUSTKEY`)); + + +insert into test1 values(1,1,'test中id为1',1),(2,2,'test_2',2),(3,3,'test中id为3',4),(4,4,'$test$4',3),(5,5,'test...5',1),(6,6,'test6',6); +insert into test2 values(1,1,'order中id为1',1),(2,2,'test_2',2),(3,3,'order中id为3',3),(4,4,'$order$4',4),(5,5,'order...5',1); +insert into test3 values(1,1,'manager中id为1',1),(2,2,'test_2',2),(3,3,'manager中id为3',3),(4,4,'$manager$4',4),(5,5,'manager...5',6); +insert into t4 values(1,1,'test中id为1',1),(2,2,'test_2',2),(3,3,'test中id为3',4),(4,4,'$test$4',3),(5,5,'test...5',1),(6,6,'test6',6); +insert into t5 values(1,1,'order中id为1',1),(2,2,'test_2',2),(3,3,'order中id为3',3),(4,4,'$order$4',4),(5,5,'order...5',1); +insert into t6 values(1,1,'manager中id为1',1),(2,2,'test_2',2),(3,3,'manager中id为3',3),(4,4,'$manager$4',4),(5,5,'manager...5',6); +INSERT INTO test4 VALUES(201,'Mazojys','Fxoj','Finance',7800),(202,'Jozzh','Lnanyo','Finance',45800),(203,'Syllauu','Dfaafk','Finance',57000),(204,'Gecrrcc','Srlkrt','Finance',62000),(205,'Jssme','Bdnaa','Development',75000),(206,'Dnnaao','Errllov','Development',55000),(207,'Tyoysww','Osk','Development',49000); +insert into test5 (id,R_REGIONKEY,R_NAME,R_COMMENT) values (1,1, 'Eastern','test001'),(3,3, 'Northern','test003'),(2,2, 'Western','test002'),(4,4, 'Southern','test004'); +insert into test6 (id,C_NAME,C_NATIONKEY,C_ORDERKEY,C_CUSTKEY) values (1,'chenxiao','NATIONKEY_001','ORDERKEY_001','CUSTKEY_003'),(3,'wangye','NATIONKEY_001','ORDERKEY_004','CUSTKEY_111'),(2,'xiaojuan','NATIONKEY_001','ORDERKEY_005','CUSTKEY_132'),(4,'chenqi','NATIONKEY_051','ORDERKEY_010','CUSTKEY_333'),(5,'marui','NATIONKEY_002','ORDERKEY_011','CUSTKEY_012'),(8,'huachen','NATIONKEY_002','ORDERKEY_007','CUSTKEY_980'),(7,'yanglu','NATIONKEY_132','ORDERKEY_006','CUSTKEY_420') +insert into test7 (id,C_NAME,C_NATIONKEY,C_ORDERKEY,C_CUSTKEY) values (1,'chenxiao','NATIONKEY_001','ORDERKEY_001','CUSTKEY_003'),(3,'wangye','NATIONKEY_001','ORDERKEY_004','CUSTKEY_111'),(2,'xiaojuan','NATIONKEY_001','ORDERKEY_005','CUSTKEY_132'),(4,'chenqi','NATIONKEY_051','ORDERKEY_010','CUSTKEY_333'),(5,'marui','NATIONKEY_002','ORDERKEY_011','CUSTKEY_012'),(8,'huachen','NATIONKEY_002','ORDERKEY_007','CUSTKEY_980'),(7,'yanglu','NATIONKEY_132','ORDERKEY_006','CUSTKEY_420'); +insert into test8 (id,O_ORDERKEY,O_CUSTKEY,O_TOTALPRICE,MYDATE) values (1,'ORDERKEY_001','CUSTKEY_003',200000,'20141022'),(2,'ORDERKEY_002','CUSTKEY_003',100000,'19920501'),(4,'ORDERKEY_004','CUSTKEY_111',500,'20080105'),(5,'ORDERKEY_005','CUSTKEY_132',100,'19920628'),(10,'ORDERKEY_010','CUSTKEY_333',88888888,'19920720'),(11,'ORDERKEY_011','CUSTKEY_012',323456,'19920822'),(7,'ORDERKEY_007','CUSTKEY_980',12000,'19920910'),(6,'ORDERKEY_006','CUSTKEY_420',231,'19921111'); +insert into test9 (id,O_ORDERKEY,O_CUSTKEY,O_TOTALPRICE,MYDATE) values (1,'ORDERKEY_001','CUSTKEY_003',200000,'20141022'),(2,'ORDERKEY_002','CUSTKEY_003',100000,'19920501'),(4,'ORDERKEY_004','CUSTKEY_111',500,'20080105'),(5,'ORDERKEY_005','CUSTKEY_132',100,'19920628'),(10,'ORDERKEY_010','CUSTKEY_333',88888888,'19920720'),(11,'ORDERKEY_011','CUSTKEY_012',323456,'19920822'),(7,'ORDERKEY_007','CUSTKEY_980',12000,'19920910'),(6,'ORDERKEY_006','CUSTKEY_420',231,'19921111'); +insert into t (id, col1, col2) values (1, 'aa', 5),(2, 'bb', 10),(3, 'cc', 15),(4, 'dd', 20),(5, 'ee', 30),(6, 'aa', 5),(7, 'bb', 10),(8, 'cc', 15),(9, 'dd', 20),(10, 'ee', 30); +insert into t1 (id, col1, col2) values (1, 'aa', 5),(2, 'bb', 10),(3, 'cc', 15),(4, 'dd', 20),(5, 'ee', 30),(6, 'aa', 5),(7, 'bb', 10),(8, 'cc', 15),(9, 'dd', 20),(10, 'ee', 30); +insert into t2 (id, col1, col2) values (1, 'aa', 5),(2, 'bb', 10),(3, 'cc', 15),(4, 'dd', 20),(5, 'ee', 30),(6, 'aa', 5),(7, 'bb', 10),(8, 'cc', 15),(9, 'dd', 20),(10, 'ee', 30); +insert into t3 (id, col1, col2) values (1, 'aa', 5),(2, 'bb', 10),(3, 'cc', 15),(4, 'dd', 20),(5, 'ee', 30),(6, 'aa', 5),(7, 'bb', 10),(8, 'cc', 15),(9, 'dd', 20),(10, 'ee', 30); diff --git a/tests/e2e/shard/case/join/kingshard/equal.sql b/tests/e2e/shard/case/join/kingshard/equal.sql new file mode 100644 index 00000000..e534ee2f --- /dev/null +++ b/tests/e2e/shard/case/join/kingshard/equal.sql @@ -0,0 +1,229 @@ +select a.id,b.id,b.pad,a.t_id from test1 a,(select * from sbtest.test2 where pad>3) b where a.t_id=b.o_id; +select test1.id,test1.t_id,test1.name,test1.pad,sbtest.test2.id,sbtest.test2.o_id,sbtest.test2.name,sbtest.test2.pad from test1 natural left join sbtest.test2; +select test1.id,test1.t_id,test1.name,test1.pad,sbtest.test2.id,sbtest.test2.o_id,sbtest.test2.name,sbtest.test2.pad from test1 natural right join sbtest.test2; +select test1.id,test1.t_id,test1.name,test1.pad,sbtest.test2.id,sbtest.test2.o_id,sbtest.test2.name,sbtest.test2.pad from test1 natural left outer join sbtest.test2; +select test1.id,test1.t_id,test1.name,test1.pad,sbtest.test2.id,sbtest.test2.o_id,sbtest.test2.name,sbtest.test2.pad from test1 natural right outer join sbtest.test2; +select a.id,a.t_id,a.name,a.pad,b.id,b.o_id,b.name,b.pad from test1 a natural left join sbtest.test2 b order by a.id; +select a.id,a.t_id,a.name,a.pad,b.id,b.o_id,b.name,b.pad from test1 a natural right join sbtest.test2 b order by b.id; +select a.id,a.t_id,a.name,a.pad,b.id,b.o_id,b.name,b.pad from test1 a natural left outer join sbtest.test2 b order by a.id; +select a.id,a.t_id,a.name,a.pad,b.id,b.o_id,b.name,b.pad from test1 a natural right outer join sbtest.test2 b order by b.id; +select a.id,a.t_id,a.name,a.pad,b.id,b.o_id,b.name,b.pad from test1 a natural left join (select * from sbtest.test2 where pad>2) b order by a.id,b.id; +select a.id,a.t_id,a.name,a.pad,b.id,b.o_id,b.name,b.pad from test1 a natural right join (select * from sbtest.test2 where pad>2) b order by a.id,b.id; +select a.id,a.t_id,a.name,a.pad,b.id,b.o_id,b.name,b.pad from test1 a natural left outer join (select * from sbtest.test2 where pad>2) b order by a.id,b.id; +select a.id,a.t_id,a.name,a.pad,b.id,b.o_id,b.name,b.pad from test1 a natural right outer join (select * from sbtest.test2 where pad>2) b order by a.id,b.id; +select a.id,a.t_id,a.name,a.pad,b.id,b.o_id,b.name,b.pad from (select * from test1 where pad>1) a natural left join (select * from sbtest.test2 where pad>3) b order by a.id,b.id; +select a.id,a.t_id,a.name,a.pad,b.id,b.o_id,b.name,b.pad from (select * from test1 where pad>1) a natural right join (select * from sbtest.test2 where pad>3) b order by a.id,b.id; +select a.id,a.t_id,a.name,a.pad,b.id,b.o_id,b.name,b.pad from (select * from test1 where pad>1) a natural left outer join (select * from sbtest.test2 where pad>3) b order by a.id,b.id; +select a.id,a.t_id,a.name,a.pad,b.id,b.o_id,b.name,b.pad from (select * from test1 where pad>1) a natural right outer join (select * from sbtest.test2 where pad>3) b order by a.id,b.id; +select distinct b.pad,a.pad from test1 a,(select * from sbtest.test2 where pad=1) b where a.t_id=b.o_id; +select count(distinct id),sum(distinct name) from test1 where id=3 or id=7; +select id,FirstName,lastname,department,salary from test4 use index(ID_index) where Department ='Finance'; +select id,FirstName,lastname,department,salary from test4 force index(ID_index) where ID= 205; +SELECT FirstName, LastName,Department = CASE Department WHEN 'F' THEN 'Financial' WHEN 'D' THEN 'Development' ELSE 'Other' END FROM test4; +select id,FirstName,lastname,department,salary from test4 where Salary >'40000' and Salary <'70000' and Department ='Finance'; +SELECT count(*), Department FROM (SELECT * FROM test4 ORDER BY FirstName DESC) AS Actions GROUP BY Department ORDER BY ID DESC; +select id,FirstName,lastname,department,salary from test4 order by ID ASC; +select Department,max(Salary) from test4 group by Department order by Department asc; +select Department,min(Salary) from test4 group by Department order by Department asc; +select Department,sum(Salary) from test4 group by Department order by Department asc; +select ID,Department,Salary from test4 order by 2,3; +select id,FirstName,lastname,department,salary from test4 order by Department ,ID desc; +SELECT Department, COUNT(Salary) FROM test4 GROUP BY Department; +SELECT Department, COUNT(Salary) FROM test4 GROUP BY Department DESC; +select Department,count(Salary) as a from test4 group by Department having a>0; +select Department from test4 having Department >3; +select Department from test4 where Department >0; +select Department,max(salary) from test4 group by Department having max(salary) >10; +select 12 as Department, Department from test4 group by Department; +select max(salary) from test4 group by department order by department asc; +select min(salary) from test4 group by department order by department asc; +select sum(salary) from test4 group by department order by department asc; +select count(salary) from test4 group by department order by department asc; +select Department,sum(Salary) a from test4 group by Department having a >=1 order by Department DESC; +select FirstName,LastName,Department,ABS(salary) from test4 order by Department; +select FirstName,LastName,Department,ACOS(salary) from test4 order by Department; +select FirstName,LastName,Department,ASIN(salary) from test4 order by Department; +select FirstName,LastName,Department,ATAN(salary) from test4 order by Department; +select FirstName,LastName,Department,ATAN(salary,100) from test4 order by Department; +select FirstName,LastName,Department,ATAN2(salary,100) from test4 order by Department; +select FirstName,LastName,Department,CEIL(salary) from test4 order by Department; +select FirstName,LastName,Department,CEILING(salary) from test4 order by Department; +select FirstName,LastName,Department,COT(salary) from test4 order by Department; +select FirstName,LastName,Department,CRC32(Department) from test4 order by Department; +select FirstName,LastName,Department,FLOOR(salary) from test4 order by Department; +select FirstName,LN(FirstName),LastName,Department from test4 order by Department; +select FirstName,LastName,Department,LOG(salary) from test4 order by Department; +select FirstName,LastName,Department,LOG2(salary) from test4 order by Department; +select FirstName,LastName,Department,LOG10(salary) from test4 order by Department; +select FirstName,LastName,Department,MOD(salary,2) from test4 order by Department; +select FirstName,LastName,Department,RADIANS(salary) from test4 order by Department; +select FirstName,LastName,Department,ROUND(salary) from test4 order by Department; +select FirstName,LastName,Department,SIGN(salary) from test4 order by Department; +select FirstName,LastName,Department,SIN(salary) from test4 order by Department; +select FirstName,LastName,Department,SQRT(salary) from test4 order by Department; +select FirstName,LastName,Department,TAN(salary) from test4 order by Department; +select FirstName,LastName,Department,TRUNCATE(salary,1) from test4 order by Department; +select FirstName,LastName,Department,TRUNCATE(salary*100,0) from test4 order by Department; +select FirstName,LastName,Department,SIN(salary) from test4 order by Department; +select id,FirstName,lastname,department,salary from test4 where Department is Null; +select id,FirstName,lastname,department,salary from test4 where Department is not Null; +select id,FirstName,lastname,department,salary from test4 where NOT (ID < 200); +select id,FirstName,lastname,department,salary from test4 where ID <300; +select id,FirstName,lastname,department,salary from test4 where ID <1; +select id,FirstName,lastname,department,salary from test4 where ID <> 0; +select id,FirstName,lastname,department,salary from test4 where ID <> 0 and ID <=1; +select id,FirstName,lastname,department,salary from test4 where ID >=205; +select id,FirstName,lastname,department,salary from test4 where ID <=205; +select id,FirstName,lastname,department,salary from test4 where ID >=205 and ID <=205; +select id,FirstName,lastname,department,salary from test4 where ID >1 and ID <=203; +select id,FirstName,lastname,department,salary from test4 where ID >=1 and ID=205; +select id,FirstName,lastname,department,salary from test4 where ID=(ID>>1)<<1; +select id,FirstName,lastname,department,salary from test4 where ID&1; +select id,FirstName,lastname,department,salary from test4 where Salary >'40000' and Salary <'70000' and Department ='Finance' order by Salary ASC; +select id,FirstName,lastname,department,salary from test4 where (Salary >'50000' and Salary <'70000') or Department ='Finance' order by Salary ASC; +select id,FirstName,lastname,department,salary from test4 where FirstName like 'J%'; +select count(*) FROM test4 WHERE Salary is null or FirstName not like '%M%'; +select id,FirstName,lastname,department,salary from test4 where FirstName in ('Mazojys','Syllauu','Tyoysww'); +select id,FirstName,lastname,department,salary from test4 where Salary between 40000 and 50000; +select sum(salary) from test4 where department = 'Finance'; +select max(salary) from test4 where department = 'Finance'; +select min(salary) from test4 where department = 'Finance'; +select sum(distinct id) from test5; +select sum(all id) from test5; +select id, R_REGIONKEY from test5; +select id,'user is user' from test5; +select id*5,'user is user',10 from test5; +select ALL id, R_REGIONKEY, R_NAME, R_COMMENT from test5; +select DISTINCT id, R_REGIONKEY, R_NAME, R_COMMENT from test5; +select DISTINCTROW id, R_REGIONKEY, R_NAME, R_COMMENT from test5; +select ALL HIGH_PRIORITY id,'ID' as detail from test5; +select id, O_ORDERKEY, O_TOTALPRICE,MYDATE from test8 where id=1; +select id, O_ORDERKEY, O_TOTALPRICE,MYDATE from test8 where id=1 and not id=1; +select id,O_ORDERKEY,O_CUSTKEY,O_TOTALPRICE,MYDATE from test8 where id=1; +select count(*) counts from test8 a where MYDATE is null; +select count(*) counts from test8 a where id is null; +select count(*) counts from test8 a where id is not null; +select count(*) counts from test8 a where not (id is null); +select count(O_ORDERKEY) counts from test8 a where O_ORDERKEY like 'ORDERKEY_00%'; +select count(O_ORDERKEY) counts from test8 a where O_ORDERKEY not like '%00%'; +select sum(O_TOTALPRICE) as sums,O_CUSTKEY,count(O_ORDERKEY) counts from test8 a where O_ORDERKEY<'ORDERKEY_010' and O_CUSTKEY between 'CUSTKEY_002' and 'CUSTKEY_300' group by o_custkey; +select sum(O_TOTALPRICE) as sums,O_CUSTKEY,count(O_ORDERKEY) counts from test8 a where O_ORDERKEY<'ORDERKEY_010' or O_CUSTKEY between 'CUSTKEY_002' and 'CUSTKEY_300' group by o_custkey; +select sum(O_TOTALPRICE) as sums,O_CUSTKEY,count(O_ORDERKEY) counts from test8 a where O_CUSTKEY in ('CUSTKEY_003','CUSTKEY_420','CUSTKEY_980') group by o_custkey; +select sum(O_TOTALPRICE) as sums,count(O_ORDERKEY) counts from test8 a where O_CUSTKEY not in ('CUSTKEY_003','CUSTKEY_420','CUSTKEY_980'); +select O_CUSTKEY,case when sum(O_TOTALPRICE)<100000 then 'D' when sum(O_TOTALPRICE)>100000 and sum(O_TOTALPRICE)<1000000 then 'C' when sum(O_TOTALPRICE)>1000000 and sum(O_TOTALPRICE)<5000000 then 'B' else 'A' end as jibie from test8 a group by O_CUSTKEY order by jibie, O_CUSTKEY limit 10; +select count(*) from test8 where MYDATE between concat(date_format('1992-05-01','%Y-%m'),'-00') and concat(date_format(date_add('1992-05-01',interval 2 month),'%Y-%m'),'-00'); +select id,sum(O_TOTALPRICE) from test8 where id>1 and id<50 group by id; +select id, O_ORDERKEY, O_TOTALPRICE,MYDATE from test8 group by id,O_ORDERKEY,MYDATE; +select count(id) as counts,date_format(MYDATE,'%Y-%m') as mouth,id from test8 where id>1 and id<50 group by 2 asc ,id desc; +select sum(O_TOTALPRICE ) as sums,id from test8 where id>1 and id<50 group by 2 asc having sums>2000000; +select sum(O_TOTALPRICE ) as sums,id from test8 where id>1 and id<50 group by 2 asc having sums>2000000; +select sum(O_TOTALPRICE ) as sums,id,count(O_ORDERKEY) counts from test8 where id>1 and id<50 group by 2 asc having count(O_ORDERKEY)>2; +select sum(O_TOTALPRICE ) as sums,id,count(O_ORDERKEY) counts from test8 where id>1 and id<50 group by 2 asc having min(O_ORDERKEY)>10 and max(O_ORDERKEY)<10000000; +select sum(O_TOTALPRICE ) from test8 where id>1 and id<50 having min(O_ORDERKEY)<10000; +select sum(O_TOTALPRICE) as sums,O_CUSTKEY,count(O_ORDERKEY) counts from test8 a where O_CUSTKEY between 'CUSTKEY_002' and 'CUSTKEY_300' group by o_custkey; +select sum(O_TOTALPRICE) as sums,O_CUSTKEY,count(O_ORDERKEY) counts from test8 a where O_CUSTKEY not between 'CUSTKEY_002' and 'CUSTKEY_300' group by o_custkey; +select sum(O_TOTALPRICE) as sums,O_CUSTKEY,count(O_ORDERKEY) counts from test8 a where not (O_CUSTKEY between 'CUSTKEY_002' and 'CUSTKEY_300') group by o_custkey; +select C_NAME from sbtest.test6 where C_NAME like 'A__A'; +select C_NAME from sbtest.test6 where C_NAME like 'm___i'; +select C_NAME from sbtest.test6 where C_NAME like 'ch___i%%'; +select C_NAME from sbtest.test6 where C_NAME like 'ch___i%%' ESCAPE 'i'; +select count(*) from sbtest.test6 where C_NAME not like 'chen%'; +select count(*) from sbtest.test6 where not (C_NAME like 'chen%'); +select C_NAME from sbtest.test6 where C_NAME like binary 'chen%'; +select C_NAME from sbtest.test6 where C_NAME like 'chen%'; +select C_NAME from sbtest.test6 where C_NAME like concat('%','AM','%'); +select C_NAME from sbtest.test6 where C_NAME like concat('%','en','%'); +select a.c_CUSTKEY,a.C_NAME,b.O_ORDERKEY from sbtest.test6 as a left join test8 b using(id) where a.C_CUSTKEY<'CUSTKEY_300'; +select a.c_CUSTKEY,a.C_NAME,b.O_ORDERKEY from sbtest.test6 as a left OUTER join test8 b using(id); +select a.c_CUSTKEY,a.C_NAME,b.O_ORDERKEY from test8 b right join sbtest.test6 as a using(id) where a.c_CUSTKEY<'CUSTKEY_300'; +select a.c_CUSTKEY,a.C_NAME,b.O_ORDERKEY from test8 b right join sbtest.test6 as a using(id); +select sum(O_TOTALPRICE) as sums,O_CUSTKEY,count(O_ORDERKEY) counts,MYDATE from test9 use index (ORDERS_FK1) where O_CUSTKEY between 'CUSTKEY_002' and 'CUSTKEY_300' group by o_custkey; +select sum(O_TOTALPRICE) as sums,O_CUSTKEY,count(O_ORDERKEY) counts from test9 use key (ORDERS_FK1) where O_CUSTKEY between 'CUSTKEY_002' and 'CUSTKEY_800' group by o_custkey; +select sum(O_TOTALPRICE) as sums,O_CUSTKEY,count(O_ORDERKEY) counts from test9 use key (ORDERS_FK1) ignore index (ORDERS_FK1) where O_CUSTKEY between 'CUSTKEY_002' and 'CUSTKEY_800' group by o_custkey; +select sum(O_TOTALPRICE) as sums,O_CUSTKEY,count(O_ORDERKEY) counts from test9 ignore key (ORDERS_FK1) force index (ORDERS_FK1) where O_CUSTKEY between 'CUSTKEY_002' and 'CUSTKEY_300' group by o_custkey; +select sum(O_TOTALPRICE) as sums,O_CUSTKEY,count(O_ORDERKEY) counts from test9 ignore key (ORDERS_FK1) force index (ORDERS_FK1) where O_CUSTKEY between 'CUSTKEY_002' and 'CUSTKEY_300' group by o_custkey; +select sum(O_TOTALPRICE) as sums,O_CUSTKEY,count(O_ORDERKEY) counts from test9 use index for order by (ORDERS_FK1) ignore index for group by (ORDERS_FK1) where O_CUSTKEY between 1 and 50 group by o_custkey; +select sum(O_TOTALPRICE) as sums,O_CUSTKEY,count(O_ORDERKEY) counts from test9 as a use index for group by (ORDERS_FK1) ignore index for join (ORDERS_FK1) where O_CUSTKEY between 'CUSTKEY_002' and 'CUSTKEY_300' group by o_custkey; +select sum(O_TOTALPRICE) as sums,O_CUSTKEY,count(O_ORDERKEY) counts from test9 a use index for join (ORDERS_FK1) ignore index for join (ORDERS_FK1) where O_CUSTKEY between 'CUSTKEY_002' and 'CUSTKEY_300' group by o_custkey; +/*comment*/ /*comment*/ select col1 /* this is a comment */ from t; +SELECT /*!40001 SQL_NO_CACHE */ * FROM t WHERE 1 limit 0, 2000; +SELECT * FROM t; +SELECT * FROM t AS u; +SELECT DISTINCT * FROM t; +SELECT DISTINCTROW * FROM t; +SELECT ALL * FROM t; +SELECT id FROM t; +SELECT * FROM t WHERE 1 = 1; +select 1 from t; +select 1 from t limit 1; +select 1 from t where not exists (select 2); +select * from sbtest.t1 where id > 4 and id <=8 order by col1 desc; +select 1 as a from t order by a; +select * from sbtest.t1 where id > 1 order by id desc limit 10; +select * from sbtest.t2 where id < 0; +select 1 as a from t where 1 < any (select 2) order by a; +SELECT * from t for update; +SELECT * from t lock in share mode; +select * from t1 right join t2 on t1.id = t2.id left join t3 on t3.id = t2.id; +select * from t1 right join t2 using (id) left join t3 using (id); +select * from t1 natural join t2; +select * from t1 natural right join t2; +select * from t1 natural left outer join t2; +select * from t1 straight_join t2 on t1.id = t2.id; +select straight_join * from t1 join t2 on t1.id = t2.id; +select straight_join * from t1 left join t2 on t1.id = t2.id; +select straight_join * from t1 right join t2 on t1.id = t2.id; +select straight_join * from t1 straight_join t2 on t1.id = t2.id; +SELECT *, CAST(col1 AS CHAR CHARACTER SET utf8) FROM t; +select max(distinct col1) from t; +select max(distinctrow col1) from t; +select max(distinct all col1) from t; +select max(distinctrow all col1) from t; +select max(col2) from t; +select min(distinct col1) from t; +select min(distinctrow col1) from t; +select min(distinct all col1) from t; +select min(col2) from t; +select sum(distinct col1) from t; +select sum(distinctrow col1) from t; +select sum(distinct all col1) from t; +select sum(distinctrow all col1) from t; +select sum(col2) from t; +select count(col1) from t; +select count(*) from t; +select count(all col1) from t; +select group_concat(col2,col1) from t group by col1; +select group_concat(distinct col2,col1) from t group by col1; +select group_concat(distinctrow col2,col1) from t group by col1; +SELECT col1, GROUP_CONCAT(DISTINCT col2 ORDER BY col2 DESC SEPARATOR ' ') FROM t GROUP BY col1; +select * from t a; +select * from t as a; +select * from t use index (primary); +select * from t use index (`primary`); +select * from t use index (); +select * from t use index (idx1); +select * from t use index (idx1, idx2); +select * from t ignore key (idx1); +select * from t force index for join (idx1); +select * from t use index for order by (idx1); +select * from t force index for group by (idx1); +select high_priority * from t; +select SQL_CACHE * from t; +select * from t; +select col1 from t1 group by col1 order by null; +select col1 from t1 group by col1 order by 1; +select a.id,b.id,b.pad,a.t_id from test1 a,(select all * from sbtest.test2) b where a.t_id=b.o_id; +select a.id,b.id,b.pad,a.t_id from test1 a,(select distinct * from sbtest.test2) b where a.t_id=b.o_id; +select id,o_id,name,pad from (select * from sbtest.test2 a group by a.id) a; +select * from (select pad,count(*) from sbtest.test2 a group by pad) a; +select a.id,b.id,b.pad,a.t_id from test1 a,(select * from sbtest.test2 having pad>3) b where a.t_id=b.o_id; +select a.id,b.id,b.pad,a.t_id from test1 a,(select * from sbtest.test2 where pad>3 order by id) b where a.t_id=b.o_id; +select a.id,b.id,b.pad,a.t_id from test1 a,(select * from sbtest.test2 where pad>3) b where a.t_id=b.o_id; +select pad,count(*) from (select * from test1 where pad>2) a group by pad; +select pad,count(*) from (select * from test1 where pad>2) a group by pad order by pad; +select count(*) from (select pad,count(*) a from test1 group by pad) a; +select a.id,b.id,b.pad,a.t_id from test1 a,(select * from sbtest.test2 where pad>3) b where a.t_id=b.o_id; +select * from (select m.id,n.pad from test1 m,sbtest.test2 n where m.id=n.id AND m.name='test中id为1' and m.pad>7 and m.pad<10)a; + +show databases like 'sbtest'; +select CURRENT_USER FROM test5; diff --git a/tests/e2e/shard/case/join/kingshard/show.sql b/tests/e2e/shard/case/join/kingshard/show.sql new file mode 100644 index 00000000..8df68ded --- /dev/null +++ b/tests/e2e/shard/case/join/kingshard/show.sql @@ -0,0 +1,30 @@ +SELECT last_insert_id(); + +# databases +show databases like 'sbtest'; + +# schemas +show schemas; +show open tables; +show open tables from sbtest; +show open tables in sbtest; +show open tables from sbtest like 'aly_o%'; + +# tables +show table status like 'aly_o%'/*allow_diff*/; +show table status/*allow_diff*/; +show tables; +show full tables; +show tables like 'aly_o%'; +show tables from sbtest; +show tables in sbtest; +show full tables from sbtest; +show full tables in sbtest; +show full tables from sbtest like 'aly%'; +show full tables in sbtest where table_type like 'base%'; + +# create +show create database sbtest; +show create schema sbtest; +show create schema if not exists sbtest; +show create database if not exists sbtest; diff --git a/tests/e2e/shard/case/join/kingshard/skip.sql b/tests/e2e/shard/case/join/kingshard/skip.sql new file mode 100644 index 00000000..dcd2eb47 --- /dev/null +++ b/tests/e2e/shard/case/join/kingshard/skip.sql @@ -0,0 +1,45 @@ +SELECT last_insert_id(); + +show databases; +show table status/*allow_diff*/; + +show index from t1; +show index in t1; +show keys from t1; +show keys in t1; + + +show columns from t1 from sbtest; +show full columns from t1 from sbtest; +show full columns from t1 from sbtest like 'n%'; +show full columns from t1 from sbtest where field like 's%'; + + +show index from t1 from sbtest; +show index in t1 in sbtest; +show index in t1 from sbtest; +show index from t1 in sbtest; +show keys from t1 from sbtest; +show keys from t1 in sbtest; +show keys in t1 in sbtest; +show keys in t1 from sbtest; + + +show index from t1; +show index in t1; +show keys from t1; +show keys in t1; +show databases; + +show columns from t1 from sbtest; +show full columns from t1 from sbtest; +show full columns from t1 from sbtest like 'n%'; +show full columns from t1 from sbtest where field like 's%'; +show index from t1 from sbtest; +show index in t1 in sbtest; +show index in t1 from sbtest; +show index from t1 in sbtest; +show keys from t1 from sbtest; +show keys from t1 in sbtest; +show keys in t1 in sbtest; +show keys in t1 from sbtest; diff --git a/tests/e2e/shard/case/join/kingshard/unequal.sql b/tests/e2e/shard/case/join/kingshard/unequal.sql new file mode 100644 index 00000000..6bac6dd2 --- /dev/null +++ b/tests/e2e/shard/case/join/kingshard/unequal.sql @@ -0,0 +1,91 @@ +select test1.id,test1.t_id,test1.name,test1.pad,sbtest.test2.id,sbtest.test2.o_id,sbtest.test2.name,sbtest.test2.pad from test1,sbtest.test2 where test1.pad=sbtest.test2.pad; +select a.id,a.t_id,a.name,a.pad,b.id,b.o_id,b.name,b.pad from test1 a,sbtest.test2 b where a.pad=b.pad; +select a.id,b.id,b.pad,a.t_id from (select test1.id,test1.pad,test1.t_id from test1 join sbtest.test2 where test1.pad=sbtest.test2.pad ) a,(select sbtest.test3.id,sbtest.test3.pad from test1 join sbtest.test3 where test1.pad=sbtest.test3.pad) b where a.pad=b.pad; +select test1.id,test1.name,a.name from test1,(select name from sbtest.test2) a; +select a.id,a.name,a.pad,b.name from test1 a inner join sbtest.test2 b order by a.id,b.id; +select a.id,a.name,a.pad,b.name from test1 a cross join sbtest.test2 b order by a.id,b.id; +select a.id,a.name,a.pad,b.name from test1 a join sbtest.test2 b order by a.id,b.id; +select a.id,a.t_id,a.name,a.pad,b.id,b.o_id,b.name,b.pad from test1 a inner join (select * from sbtest.test2 where pad>0) b order by a.id,b.id; +select a.id,a.t_id,a.name,a.pad,b.id,b.o_id,b.name,b.pad from test1 a cross join (select * from sbtest.test2 where pad>0) b order by a.id,b.id; +select a.id,a.t_id,a.name,a.pad,b.id,b.o_id,b.name,b.pad from test1 a join (select * from sbtest.test2 where pad>0) b order by a.id,b.id; +select a.id,a.t_id,a.name,a.pad,b.id,b.o_id,b.name,b.pad from (select * from test1 where pad>0) a inner join (select * from sbtest.test2 where pad>0) b order by a.id,b.id; +select a.id,a.t_id,a.name,a.pad,b.id,b.o_id,b.name,b.pad from (select * from test1 where pad>0) a cross join (select * from sbtest.test2 where pad>0) b order by a.id,b.id; +select a.id,a.t_id,a.name,a.pad,b.id,b.o_id,b.name,b.pad from (select * from test1 where pad>0) a join (select * from sbtest.test2 where pad>0) b order by a.id,b.id; +select a.id,a.t_id,a.name,a.pad,b.id,b.o_id,b.name,b.pad from test1 a join (select * from sbtest.test2 where pad>0) b on a.id0) b using(pad) order by a.id,b.id; +select a.id,a.name,a.pad,b.name from test1 a straight_join sbtest.test2 b order by a.id,b.id; +select a.id,a.t_id,a.name,a.pad,b.id,b.o_id,b.name,b.pad from test1 a straight_join (select * from sbtest.test2 where pad>0) b order by a.id,b.id; +select a.id,a.t_id,a.name,a.pad,b.id,b.o_id,b.name,b.pad from (select * from test1 where pad>0) a straight_join (select * from sbtest.test2 where pad>0) b order by a.id,b.id; +select a.id,a.t_id,a.name,a.pad,b.id,b.o_id,b.name,b.pad from test1 a straight_join (select * from sbtest.test2 where pad>0) b on a.id2) b on a.pad=b.pad order by a.id,b.id; +select a.id,a.t_id,a.name,a.pad,b.id,b.o_id,b.name,b.pad from test1 a right join (select * from sbtest.test2 where pad>2) b on a.pad=b.pad order by a.id,b.id; +select a.id,a.t_id,a.name,a.pad,b.id,b.o_id,b.name,b.pad from test1 a left outer join (select * from sbtest.test2 where pad>2) b on a.pad=b.pad order by a.id,b.id; +select a.id,a.t_id,a.name,a.pad,b.id,b.o_id,b.name,b.pad from test1 a right outer join (select * from sbtest.test2 where pad>2) b on a.pad=b.pad order by a.id,b.id; +select a.id,a.t_id,a.name,a.pad,b.id,b.o_id,b.name,b.pad from test1 a left join (select * from sbtest.test2 where pad>2) b using(pad) order by a.id,b.id; +select a.id,a.t_id,a.name,a.pad,b.id,b.o_id,b.name,b.pad from (select * from test1 where pad>1) a left join (select * from sbtest.test2 where pad>3) b on a.pad=b.pad order by a.id,b.id; +select a.id,a.t_id,a.name,a.pad,b.id,b.o_id,b.name,b.pad from (select * from test1 where pad>1) a right join (select * from sbtest.test2 where pad>3) b on a.pad=b.pad order by a.id,b.id; +select a.id,a.t_id,a.name,a.pad,b.id,b.o_id,b.name,b.pad from (select * from test1 where pad>1) a left outer join (select * from sbtest.test2 where pad>3) b on a.pad=b.pad order by a.id,b.id; +select a.id,a.t_id,a.name,a.pad,b.id,b.o_id,b.name,b.pad from (select * from test1 where pad>1) a right outer join (select * from sbtest.test2 where pad>3) b on a.pad=b.pad order by a.id,b.id; +select a.id,a.t_id,a.name,a.pad,b.id,b.o_id,b.name,b.pad from (select * from test1 where pad>1) a left join (select * from sbtest.test2 where pad>3) b using(pad) order by a.id,b.id; +select distinct a.pad from test1 a,sbtest.test2 b where a.pad=b.pad; +select a.id,a.t_id,b.o_id,b.name from (select * from test1 where id<3) a,(select * from sbtest.test2 where id>3) b; +select a.id,b.id,b.pad,a.t_id from test1 a,(select sbtest.test3.id,sbtest.test3.pad from test1 join sbtest.test3 where test1.pad=sbtest.test3.pad) b,(select * from sbtest.test2 where id>3) c where a.pad=b.pad and c.pad=b.pad; +select a.id,a.t_id,a.name,a.pad,b.id,b.o_id,b.name,b.pad from test1 a join sbtest.test2 as b order by a.id,b.id; +select a.id,a.t_id,a.name,a.pad,b.id,b.o_id,b.name,b.pad from test1 a inner join sbtest.test2 b order by a.id,b.id; +select a.id,a.t_id,a.name,a.pad,b.id,b.o_id,b.name,b.pad from test1 a cross join sbtest.test2 b order by a.id,b.id; +select a.id,a.name,a.pad,b.name from test1 a straight_join sbtest.test2 b on a.pad=b.pad; +SELECT Department, COUNT(ID) FROM test4 GROUP BY Department HAVING COUNT(ID)>3; +select id,FirstName,lastname,department,salary from test4 group by Department; +SELECT Department, MIN(Salary) FROM test4 GROUP BY Department HAVING MIN(Salary)>46000; +select Department,count(Salary) as a from test4 group by Department having a=3; +select Department,count(Salary) from test4 group by Department having count(ID) >2; +select Department,count(*) as num from test4 group by Department having count(*) >1; +select Department,count(*) as num from test4 group by Department having count(*) <=3; +select id,FirstName,lastname,department,salary from test4 limit 2,10; +select Department,count(*) as num from test4 group by Department having count(*) >=4 order by Department ASC; +select count(id) as counts,date_format(MYDATE,'%Y-%m') as mouth from test8 where id>1 and id<50 group by 2 asc; +select sum(O_TOTALPRICE) as sums,id from test8 where id>1 and id<50 group by 2 asc; +select C_ORDERKEY,C_CUSTKEY,C_NAME from test1,sbtest.test6 where C_CUSTKEY=c_CUSTKEY and C_ORDERKEY<'ORDERKEY_006'; +select count(*) from (select O_CUSTKEY,count(O_CUSTKEY) as counts from test8 group by O_CUSTKEY) as a where counts<10 group by counts; +select O_ORDERKEY,O_CUSTKEY,C_NAME from test8 join sbtest.test6 on O_CUSTKEY=c_CUSTKEY and O_ORDERKEY<'ORDERKEY_007'; +select O_ORDERKEY,O_CUSTKEY,C_NAME from test8 INNER join sbtest.test6 where O_CUSTKEY=c_CUSTKEY and O_ORDERKEY<'ORDERKEY_007'; +select O_ORDERKEY,O_CUSTKEY,C_NAME from test8 INNER join sbtest.test6 on O_CUSTKEY=c_CUSTKEY and O_ORDERKEY<'ORDERKEY_006'; +select O_ORDERKEY,O_CUSTKEY,C_NAME from test8 CROSS join sbtest.test6 on O_CUSTKEY=c_CUSTKEY and O_ORDERKEY<'ORDERKEY_006'; +select O_ORDERKEY,O_CUSTKEY,C_NAME from sbtest.test6 as a STRAIGHT_JOIN test8 b where b.O_CUSTKEY=a.c_CUSTKEY and O_ORDERKEY<'ORDERKEY_007'; +select b.O_ORDERKEY,b.O_CUSTKEY,a.C_NAME from sbtest.test6 a STRAIGHT_JOIN test8 b on b.O_CUSTKEY=a.c_CUSTKEY and b.O_ORDERKEY<'ORDERKEY_007'; +select a.c_CUSTKEY,a.C_NAME,b.O_ORDERKEY from sbtest.test6 as a left join test8 b on b.O_CUSTKEY=a.C_CUSTKEY and a.C_CUSTKEY<'CUSTKEY_300'; +select a.c_CUSTKEY,a.C_NAME,b.O_ORDERKEY from test8 b right join sbtest.test6 as a on b.O_CUSTKEY=a.C_CUSTKEY and a.c_CUSTKEY<'CUSTKEY_300'; +select sum(O_TOTALPRICE) as sums,O_CUSTKEY,count(O_ORDERKEY) counts from test9 where O_CUSTKEY between 'CUSTKEY_003' and 'CUSTKEY_500' group by 2 asc having sums>400 order by o_custkey; +select sum(O_TOTALPRICE) as sums,O_CUSTKEY,count(O_ORDERKEY) counts from test9 where O_CUSTKEY between 'CUSTKEY_003' and 'CUSTKEY_500' group by 2 asc having sums>400 order by 2; +select sum(O_TOTALPRICE) as sums,O_CUSTKEY,count(O_ORDERKEY) counts from test9 where O_CUSTKEY between 'CUSTKEY_003' and 'CUSTKEY_500' group by 2 asc having sums>400 order by count(O_ORDERKEY), sums; +select sum(O_TOTALPRICE) as sums,O_CUSTKEY,count(O_ORDERKEY) counts from test9 where O_CUSTKEY between 'CUSTKEY_003' and 'CUSTKEY_500' group by 2 asc having sums>400 order by counts asc,2 desc; +select sum(O_TOTALPRICE) as sums,O_CUSTKEY,count(O_ORDERKEY) counts from test9 where O_CUSTKEY between 'CUSTKEY_003' and 'CUSTKEY_500' group by 2 asc having sums>400 order by count(O_ORDERKEY) asc,2 desc limit 2; +select sum(O_TOTALPRICE) as sums,O_CUSTKEY,count(O_ORDERKEY) counts from test9 where O_CUSTKEY between 'CUSTKEY_003' and 'CUSTKEY_500' group by 2 asc having sums>400 order by count(O_ORDERKEY) asc,O_CUSTKEY desc limit 1,3; +select sum(O_TOTALPRICE) as sums,O_CUSTKEY,count(O_ORDERKEY) counts from test9 where O_CUSTKEY between 'CUSTKEY_003' and 'CUSTKEY_500' group by 2 asc having sums>400 order by count(O_ORDERKEY) asc,O_CUSTKEY desc limit 10 offset 1; +select a.c_CUSTKEY,a.C_NAME,b.O_ORDERKEY from sbtest.test7 as a left join test9 b ignore index for join(ORDERS_FK1) on b.O_CUSTKEY=a.c_CUSTKEY and a.c_CUSTKEY<'CUSTKEY_300'; +select a.c_CUSTKEY,a.C_NAME,b.O_ORDERKEY from sbtest.test7 as a force index for join(primary) left join test9 b ignore index for join(ORDERS_FK1) on b.O_CUSTKEY=a.c_CUSTKEY and a.c_CUSTKEY<'CUSTKEY_300'; +SELECT /*+ MAX_EXECUTION_TIME(1000) */ * FROM t1 INNER JOIN t2 where t1.col1 = t2.col1; +SELECT * FROM t1, t2; +SELECT * FROM t1 AS u, t2; +SELECT * FROM t1, t2 AS u; +SELECT * FROM t1 AS u, t2 AS v; +SELECT * FROM t, t1, t2; +SELECT * from t1, t2, t3; +select * from t1 join t2 left join t3 on t2.id = t3.id; +select count(distinct col1, col2) from t; +select count(distinctrow col1, col2) from t; +select group_concat(col2,col1 SEPARATOR ';') from t group by col1; +select * from t full, t1 `row`, t2 abs; +select * from t use index for group by (idx1) use index for order by (idx2), t2; +select col2,col1 from t group by col1 with rollup; +select coalesce(col1,'ALL'),col2,col1 from t group by col1 with rollup; +select a.id,b.id,b.pad,a.t_id from test1 a,(select * from sbtest.test2 order by id limit 3) b where a.t_id=b.o_id; +select a.id,b.id,b.pad,a.t_id from test1 a,(select * from sbtest.test2 order by id limit 3) b where a.t_id=b.o_id limit 2; +select * from (select sbtest.test3.pad from test1 left join sbtest.test3 on test1.pad=sbtest.test3.pad) a; +select a.id,b.id,b.pad,a.t_id from (select test1.id,test1.pad,test1.t_id from test1 join sbtest.test3 where test1.pad=sbtest.test3.pad ) a,(select sbtest.test2.id,sbtest.test2.pad from test1 join sbtest.test2 where test1.pad=sbtest.test2.pad) b where a.pad=b.pad; +select (select name from test1 limit 1); diff --git a/tests/e2e/shard/case/join/kingshard/unsupport.sql b/tests/e2e/shard/case/join/kingshard/unsupport.sql new file mode 100644 index 00000000..f34d64d4 --- /dev/null +++ b/tests/e2e/shard/case/join/kingshard/unsupport.sql @@ -0,0 +1,47 @@ +select a.id,b.id,b.pad,a.t_id from (select id,t_id from test1) a,(select * from sbtest.test2) b where a.t_id=b.o_id; +select test1.id,test1.t_id,test1.name,test1.pad,test2.id,test2.o_id,test2.name,test2.pad from test1 inner join test2 order by test1.id,test2.id; +select test1.id,test1.t_id,test1.name,test1.pad,test2.id,test2.o_id,test2.name,test2.pad from test1 cross join test2 order by test1.id,test2.id; +select test1.id,test1.t_id,test1.name,test1.pad,test2.id,test2.o_id,test2.name,test2.pad from test1 join test2 order by test1.id,test2.id; +select test1.id,test1.t_id,test1.name,test1.pad,sbtest.test2.id,sbtest.test2.o_id,sbtest.test2.name,sbtest.test2.pad from test1 straight_join sbtest.test2 order by test1.id,test2.id; +select test1.id,test1.t_id,test1.name,test1.pad,sbtest.test2.id,sbtest.test2.o_id,sbtest.test2.name,sbtest.test2.pad from test1 left join sbtest.test2 on test1.pad=sbtest.test2.pad order by test1.id,test2.id; +select test1.id,test1.t_id,test1.name,test1.pad,sbtest.test2.id,sbtest.test2.o_id,sbtest.test2.name,sbtest.test2.pad from test1 right join sbtest.test2 on test1.pad=sbtest.test2.pad order by test1.id,test2.id; +select test1.id,test1.t_id,test1.name,test1.pad,sbtest.test2.id,sbtest.test2.o_id,sbtest.test2.name,sbtest.test2.pad from test1 left outer join sbtest.test2 on test1.pad=sbtest.test2.pad order by test1.id,test2.id; +select test1.id,test1.t_id,test1.name,test1.pad,sbtest.test2.id,sbtest.test2.o_id,sbtest.test2.name,sbtest.test2.pad from test1 right outer join sbtest.test2 on test1.pad=sbtest.test2.pad order by test1.id,test2.id; +select test1.id,test1.t_id,test1.name,test1.pad,sbtest.test2.id,sbtest.test2.o_id,sbtest.test2.name,sbtest.test2.pad from test1 left join sbtest.test2 using(pad) order by test1.id,test2.id; +select test1.id,test1.t_id,test1.name,test1.pad,sbtest.test2.id,sbtest.test2.o_id,sbtest.test2.name,sbtest.test2.pad from test1 left join sbtest.test2 on test1.pad=sbtest.test2.pad and test1.id>3 order by test1.id,test2.id; +select id,O_ORDERKEY,O_TOTALPRICE from test8 where id>36900 and id<36902 group by O_ORDERKEY having O_ORDERKEY in (select O_ORDERKEY from test8 group by id having sum(id)>10000); +select test8.O_ORDERKEY,test8.O_CUSTKEY,C_NAME from test6 CROSS join sbtest.test8 using(id) order by test8.O_ORDERKEY,test8.O_CUSTKEY,C_NAME; +select sum(O_TOTALPRICE) as sums,O_CUSTKEY,count(O_ORDERKEY) counts from test9 where O_CUSTKEY between 'CUSTKEY_013' and 'CUSTKEY_050' group by 2 asc having O_CUSTKEY<(select max(c_custkey) from test7) order by o_custkey; +select sum(O_TOTALPRICE) as sums,O_CUSTKEY,count(O_ORDERKEY) counts from test9 where O_CUSTKEY between 'CUSTKEY_002' and 'CUSTKEY_050' group by 2 asc having O_CUSTKEY<(select max(c_custkey) from test7) order by 2; +select sum(O_TOTALPRICE) as sums,O_CUSTKEY,count(O_ORDERKEY) counts from test9 where O_CUSTKEY between 'CUSTKEY_002' and 'CUSTKEY_050' group by 2 asc having O_CUSTKEY<(select max(c_custkey) from test7) order by count(O_ORDERKEY); +select sum(O_TOTALPRICE) as sums,O_CUSTKEY,count(O_ORDERKEY) counts from test9 where O_CUSTKEY between 'CUSTKEY_002' and 'CUSTKEY_050' group by 2 asc having O_CUSTKEY<(select max(c_custkey) from test7) order by counts asc,2 desc; +select sum(O_TOTALPRICE) as sums,O_CUSTKEY,count(O_ORDERKEY) counts from test9 where O_CUSTKEY between 'CUSTKEY_002' and 'CUSTKEY_050' group by 2 asc having O_CUSTKEY<(select max(c_custkey) from test7) order by count(O_ORDERKEY) asc,2 desc limit 10; +select sum(O_TOTALPRICE) as sums,O_CUSTKEY,count(O_ORDERKEY) counts from test9 where O_CUSTKEY between 'CUSTKEY_002' and 'CUSTKEY_050' group by 2 asc having O_CUSTKEY<(select max(c_custkey) from test7) order by count(O_ORDERKEY) asc,O_CUSTKEY desc limit 1,10; +select sum(O_TOTALPRICE) as sums,O_CUSTKEY,count(O_ORDERKEY) counts from test9 where O_CUSTKEY between 'CUSTKEY_002' and 'CUSTKEY_050' group by 2 asc having O_CUSTKEY<(select max(c_custkey) from test7) order by count(O_ORDERKEY) asc,O_CUSTKEY desc limit 10 offset 1; +select UPPER((select C_NAME FROM test7 limit 1)) FROM test7 limit 1; +select O_ORDERKEY,O_CUSTKEY from test9 as a where a.O_CUSTKEY=(select min(C_CUSTKEY) from test7); +select O_ORDERKEY,O_CUSTKEY from test9 as a where a.O_CUSTKEY<=(select min(C_CUSTKEY) from test7); +select O_ORDERKEY,O_CUSTKEY from test9 as a where a.O_CUSTKEY<=(select min(C_CUSTKEY)+1 from test7); +select count(*) from sbtest.test7 as a where a.c_CUSTKEY=(select max(C_CUSTKEY) from test9 where C_CUSTKEY=a.C_CUSTKEY); +select C_CUSTKEY from sbtest.test7 as a where (select count(*) from test9 where O_CUSTKEY=a.C_CUSTKEY)=2; +select count(*) from test9 as a where a.id <> all(select id from test7); +select count(*) from test9 as a where 56000< all(select id from test7); +select count(*) from sbtest.test7 as a where 2>all(select count(*) from test9 where O_CUSTKEY=C_CUSTKEY); +select id,O_CUSTKEY,O_ORDERKEY,O_TOTALPRICE from test9 a where (a.O_ORDERKEY,O_CUSTKEY)=(select c_ORDERKEY,c_CUSTKEY from test7 where c_name='yanglu'); +select id,pad from test1 where pad>(select pad from test1 where id=2); +select id,pad from test1 where pad<(select pad from test1 where id=2); +select id,pad from test1 where pad=(select pad from test1 where id=2); +select id,pad from test1 where pad>=(select pad from test1 where id=2); +select id,pad from test1 where pad<=(select pad from test1 where id=2); +select id,pad from test1 where pad<>(select pad from test1 where id=2); +select id,pad from test1 where pad !=(select pad from test1 where id=2); +select id,t_id,name,pad from test1 where exists(select * from test1 where pad>1); +select id,t_id,name,pad from test1 where not exists(select * from test1 where pad>1); +select id,t_id,name,pad from test1 where pad=some(select id from test1 where pad>1); +select id,t_id,name,pad from test1 where pad=any(select id from test1 where pad>1); +select id,t_id,name,pad from test1 where pad !=any(select id from test1 where pad=3); +select id,t_id,name,pad from test1 where pad>(select pad from test1 where pad=2); +select id,t_id,name,pad from test1 where 2 >any(select id from test1 where pad>1); +select id,t_id,name,pad from test1 where 2<>some(select id from test1 where pad>1); +select id,t_id,name,pad from test1 where 2>all(select id from test1 where pad<1); +select co1,co2,co3 from (select id as co1,name as co2,pad as co3 from test1)as tb where co1>1; diff --git a/tests/e2e/shard/case/join/mycat/long/equal.sql b/tests/e2e/shard/case/join/mycat/long/equal.sql new file mode 100644 index 00000000..b48dde97 --- /dev/null +++ b/tests/e2e/shard/case/join/mycat/long/equal.sql @@ -0,0 +1,350 @@ +select test1.id,test1.t_id,test1.name,test1.pad,sbtest.test2.id,sbtest.test2.o_id,sbtest.test2.name,sbtest.test2.pad from test1,sbtest.test2 where test1.pad=sbtest.test2.pad; +select a.id,a.t_id,a.name,a.pad,b.id,b.o_id,b.name,b.pad from test1 a,sbtest.test2 b where a.pad=b.pad; +select a.id,b.id,b.pad,a.t_id from test1 a,(select * from sbtest.test2 where pad>3) b where a.t_id=b.o_id; +select a.id,b.id,b.pad,a.t_id from (select test1.id,test1.pad,test1.t_id from test1 join sbtest.test2 where test1.pad=sbtest.test2.pad ) a,(select sbtest.test3.id,sbtest.test3.pad from test1 join sbtest.test3 where test1.pad=sbtest.test3.pad) b where a.pad=b.pad; +select test1.id,test1.name,a.name from test1,(select name from sbtest.test2) a; +select test1.id,test1.t_id,test1.name,test1.pad,test2.id,test2.o_id,test2.name,test2.pad from test1 inner join test2 order by test1.id,test2.id; +select test1.id,test1.t_id,test1.name,test1.pad,test2.id,test2.o_id,test2.name,test2.pad from test1 cross join test2 order by test1.id,test2.id; +select test1.id,test1.t_id,test1.name,test1.pad,test2.id,test2.o_id,test2.name,test2.pad from test1 join test2 order by test1.id,test2.id; +select a.id,a.name,a.pad,b.name from test1 a inner join sbtest.test2 b order by a.id,b.id; +select a.id,a.name,a.pad,b.name from test1 a cross join sbtest.test2 b order by a.id,b.id; +select a.id,a.name,a.pad,b.name from test1 a join sbtest.test2 b order by a.id,b.id; +select a.id,a.t_id,a.name,a.pad,b.id,b.o_id,b.name,b.pad from test1 a inner join (select * from sbtest.test2 where pad>0) b order by a.id,b.id; +select a.id,a.t_id,a.name,a.pad,b.id,b.o_id,b.name,b.pad from test1 a cross join (select * from sbtest.test2 where pad>0) b order by a.id,b.id; +select a.id,a.t_id,a.name,a.pad,b.id,b.o_id,b.name,b.pad from test1 a join (select * from sbtest.test2 where pad>0) b order by a.id,b.id; +select a.id,a.t_id,a.name,a.pad,b.id,b.o_id,b.name,b.pad from (select * from test1 where pad>0) a inner join (select * from sbtest.test2 where pad>0) b order by a.id,b.id; +select a.id,a.t_id,a.name,a.pad,b.id,b.o_id,b.name,b.pad from (select * from test1 where pad>0) a cross join (select * from sbtest.test2 where pad>0) b order by a.id,b.id; +select a.id,a.t_id,a.name,a.pad,b.id,b.o_id,b.name,b.pad from (select * from test1 where pad>0) a join (select * from sbtest.test2 where pad>0) b order by a.id,b.id; +select a.id,a.t_id,a.name,a.pad,b.id,b.o_id,b.name,b.pad from test1 a join (select * from sbtest.test2 where pad>0) b on a.id0) b using(pad) order by a.id,b.id; +select test1.id,test1.t_id,test1.name,test1.pad,sbtest.test2.id,sbtest.test2.o_id,sbtest.test2.name,sbtest.test2.pad from test1 straight_join sbtest.test2 order by test1.id,test2.id; +select a.id,a.name,a.pad,b.name from test1 a straight_join sbtest.test2 b order by a.id,b.id; +select a.id,a.t_id,a.name,a.pad,b.id,b.o_id,b.name,b.pad from test1 a straight_join (select * from sbtest.test2 where pad>0) b order by a.id,b.id; +select a.id,a.t_id,a.name,a.pad,b.id,b.o_id,b.name,b.pad from (select * from test1 where pad>0) a straight_join (select * from sbtest.test2 where pad>0) b order by a.id,b.id; +select a.id,a.t_id,a.name,a.pad,b.id,b.o_id,b.name,b.pad from test1 a straight_join (select * from sbtest.test2 where pad>0) b on a.id2) b on a.pad=b.pad order by a.id,b.id; +select a.id,a.t_id,a.name,a.pad,b.id,b.o_id,b.name,b.pad from test1 a right join (select * from sbtest.test2 where pad>2) b on a.pad=b.pad order by a.id,b.id; +select a.id,a.t_id,a.name,a.pad,b.id,b.o_id,b.name,b.pad from test1 a left outer join (select * from sbtest.test2 where pad>2) b on a.pad=b.pad order by a.id,b.id; +select a.id,a.t_id,a.name,a.pad,b.id,b.o_id,b.name,b.pad from test1 a right outer join (select * from sbtest.test2 where pad>2) b on a.pad=b.pad order by a.id,b.id; +select a.id,a.t_id,a.name,a.pad,b.id,b.o_id,b.name,b.pad from test1 a left join (select * from sbtest.test2 where pad>2) b using(pad) order by a.id,b.id; +select a.id,a.t_id,a.name,a.pad,b.id,b.o_id,b.name,b.pad from (select * from test1 where pad>1) a left join (select * from sbtest.test2 where pad>3) b on a.pad=b.pad order by a.id,b.id; +select a.id,a.t_id,a.name,a.pad,b.id,b.o_id,b.name,b.pad from (select * from test1 where pad>1) a right join (select * from sbtest.test2 where pad>3) b on a.pad=b.pad order by a.id,b.id; +select a.id,a.t_id,a.name,a.pad,b.id,b.o_id,b.name,b.pad from (select * from test1 where pad>1) a left outer join (select * from sbtest.test2 where pad>3) b on a.pad=b.pad order by a.id,b.id; +select a.id,a.t_id,a.name,a.pad,b.id,b.o_id,b.name,b.pad from (select * from test1 where pad>1) a right outer join (select * from sbtest.test2 where pad>3) b on a.pad=b.pad order by a.id,b.id; +select a.id,a.t_id,a.name,a.pad,b.id,b.o_id,b.name,b.pad from (select * from test1 where pad>1) a left join (select * from sbtest.test2 where pad>3) b using(pad) order by a.id,b.id; +select test1.id,test1.t_id,test1.name,test1.pad,sbtest.test2.id,sbtest.test2.o_id,sbtest.test2.name,sbtest.test2.pad from test1 natural left join sbtest.test2; +select test1.id,test1.t_id,test1.name,test1.pad,sbtest.test2.id,sbtest.test2.o_id,sbtest.test2.name,sbtest.test2.pad from test1 natural right join sbtest.test2; +select test1.id,test1.t_id,test1.name,test1.pad,sbtest.test2.id,sbtest.test2.o_id,sbtest.test2.name,sbtest.test2.pad from test1 natural left outer join sbtest.test2; +select test1.id,test1.t_id,test1.name,test1.pad,sbtest.test2.id,sbtest.test2.o_id,sbtest.test2.name,sbtest.test2.pad from test1 natural right outer join sbtest.test2; +select a.id,a.t_id,a.name,a.pad,b.id,b.o_id,b.name,b.pad from test1 a natural left join sbtest.test2 b order by a.id; +select a.id,a.t_id,a.name,a.pad,b.id,b.o_id,b.name,b.pad from test1 a natural right join sbtest.test2 b order by b.id; +select a.id,a.t_id,a.name,a.pad,b.id,b.o_id,b.name,b.pad from test1 a natural left outer join sbtest.test2 b order by a.id; +select a.id,a.t_id,a.name,a.pad,b.id,b.o_id,b.name,b.pad from test1 a natural right outer join sbtest.test2 b order by b.id; +select a.id,a.t_id,a.name,a.pad,b.id,b.o_id,b.name,b.pad from test1 a natural left join (select * from sbtest.test2 where pad>2) b order by a.id,b.id; +select a.id,a.t_id,a.name,a.pad,b.id,b.o_id,b.name,b.pad from test1 a natural right join (select * from sbtest.test2 where pad>2) b order by a.id,b.id; +select a.id,a.t_id,a.name,a.pad,b.id,b.o_id,b.name,b.pad from test1 a natural left outer join (select * from sbtest.test2 where pad>2) b order by a.id,b.id; +select a.id,a.t_id,a.name,a.pad,b.id,b.o_id,b.name,b.pad from test1 a natural right outer join (select * from sbtest.test2 where pad>2) b order by a.id,b.id; +select a.id,a.t_id,a.name,a.pad,b.id,b.o_id,b.name,b.pad from (select * from test1 where pad>1) a natural left join (select * from sbtest.test2 where pad>3) b order by a.id,b.id; +select a.id,a.t_id,a.name,a.pad,b.id,b.o_id,b.name,b.pad from (select * from test1 where pad>1) a natural right join (select * from sbtest.test2 where pad>3) b order by a.id,b.id; +select a.id,a.t_id,a.name,a.pad,b.id,b.o_id,b.name,b.pad from (select * from test1 where pad>1) a natural left outer join (select * from sbtest.test2 where pad>3) b order by a.id,b.id; +select a.id,a.t_id,a.name,a.pad,b.id,b.o_id,b.name,b.pad from (select * from test1 where pad>1) a natural right outer join (select * from sbtest.test2 where pad>3) b order by a.id,b.id; +select test1.id,test1.t_id,test1.name,test1.pad,sbtest.test2.id,sbtest.test2.o_id,sbtest.test2.name,sbtest.test2.pad from test1 left join sbtest.test2 on test1.pad=sbtest.test2.pad and test1.id>3 order by test1.id,test2.id; +select distinct a.pad from test1 a,sbtest.test2 b where a.pad=b.pad; +select distinct b.pad,a.pad from test1 a,(select * from sbtest.test2 where pad=1) b where a.t_id=b.o_id; +select count(distinct id),sum(distinct name) from test1 where id=3 or id=7; +select a.id,a.t_id,b.o_id,b.name from (select * from test1 where id<3) a,(select * from sbtest.test2 where id>3) b; +select a.id,b.id,b.pad,a.t_id from test1 a,(select sbtest.test3.id,sbtest.test3.pad from test1 join sbtest.test3 where test1.pad=sbtest.test3.pad) b,(select * from sbtest.test2 where id>3) c where a.pad=b.pad and c.pad=b.pad; +select a.id,a.t_id,a.name,a.pad,b.id,b.o_id,b.name,b.pad from test1 a join sbtest.test2 as b order by a.id,b.id; +select a.id,a.t_id,a.name,a.pad,b.id,b.o_id,b.name,b.pad from test1 a inner join sbtest.test2 b order by a.id,b.id; +select a.id,a.t_id,a.name,a.pad,b.id,b.o_id,b.name,b.pad from test1 a cross join sbtest.test2 b order by a.id,b.id; +select a.id,a.name,a.pad,b.name from test1 a straight_join sbtest.test2 b on a.pad=b.pad; +select id,FirstName,lastname,department,salary from test4 use index(ID_index) where Department ='Finance'; +select id,FirstName,lastname,department,salary from test4 force index(ID_index) where ID= 205; +SELECT FirstName, LastName,Department = CASE Department WHEN 'F' THEN 'Financial' WHEN 'D' THEN 'Development' ELSE 'Other' END FROM test4; +select id,FirstName,lastname,department,salary from test4 where Salary >'40000' and Salary <'70000' and Department ='Finance'; +SELECT count(*), Department FROM (SELECT * FROM test4 ORDER BY FirstName DESC) AS Actions GROUP BY Department ORDER BY ID DESC; +SELECT Department, COUNT(ID) FROM test4 GROUP BY Department HAVING COUNT(ID)>3; +select id,FirstName,lastname,department,salary from test4 order by ID ASC; +select id,FirstName,lastname,department,salary from test4 group by Department; +SELECT Department, MIN(Salary) FROM test4 GROUP BY Department HAVING MIN(Salary)>46000; +select Department,max(Salary) from test4 group by Department order by Department asc; +select Department,min(Salary) from test4 group by Department order by Department asc; +select Department,sum(Salary) from test4 group by Department order by Department asc; +select ID,Department,Salary from test4 order by 2,3; +select id,FirstName,lastname,department,salary from test4 order by Department ,ID desc; +SELECT Department, COUNT(Salary) FROM test4 GROUP BY Department; +SELECT Department, COUNT(Salary) FROM test4 GROUP BY Department DESC; +select Department,count(Salary) as a from test4 group by Department having a=3; +select Department,count(Salary) as a from test4 group by Department having a>0; +select Department,count(Salary) from test4 group by Department having count(ID) >2; +select Department,count(*) as num from test4 group by Department having count(*) >1; +select Department,count(*) as num from test4 group by Department having count(*) <=3; +select Department from test4 having Department >3; +select Department from test4 where Department >0; +select Department,max(salary) from test4 group by Department having max(salary) >10; +select 12 as Department, Department from test4 group by Department; +select id,FirstName,lastname,department,salary from test4 limit 2,10; +select max(salary) from test4 group by department order by department asc; +select min(salary) from test4 group by department order by department asc; +select sum(salary) from test4 group by department order by department asc; +select count(salary) from test4 group by department order by department asc; +select Department,sum(Salary) a from test4 group by Department having a >=1 order by Department DESC; +select Department,count(*) as num from test4 group by Department having count(*) >=4 order by Department ASC; +select FirstName,LastName,Department,ABS(salary) from test4 order by Department; +select FirstName,LastName,Department,ACOS(salary) from test4 order by Department; +select FirstName,LastName,Department,ASIN(salary) from test4 order by Department; +select FirstName,LastName,Department,ATAN(salary) from test4 order by Department; +select FirstName,LastName,Department,ATAN(salary,100) from test4 order by Department; +select FirstName,LastName,Department,ATAN2(salary,100) from test4 order by Department; +select FirstName,LastName,Department,CEIL(salary) from test4 order by Department; +select FirstName,LastName,Department,CEILING(salary) from test4 order by Department; +select FirstName,LastName,Department,COT(salary) from test4 order by Department; +select FirstName,LastName,Department,CRC32(Department) from test4 order by Department; +select FirstName,LastName,Department,FLOOR(salary) from test4 order by Department; +select FirstName,LN(FirstName),LastName,Department from test4 order by Department; +select FirstName,LastName,Department,LOG(salary) from test4 order by Department; +select FirstName,LastName,Department,LOG2(salary) from test4 order by Department; +select FirstName,LastName,Department,LOG10(salary) from test4 order by Department; +select FirstName,LastName,Department,MOD(salary,2) from test4 order by Department; +select FirstName,LastName,Department,RADIANS(salary) from test4 order by Department; +select FirstName,LastName,Department,ROUND(salary) from test4 order by Department; +select FirstName,LastName,Department,SIGN(salary) from test4 order by Department; +select FirstName,LastName,Department,SIN(salary) from test4 order by Department; +select FirstName,LastName,Department,SQRT(salary) from test4 order by Department; +select FirstName,LastName,Department,TAN(salary) from test4 order by Department; +select FirstName,LastName,Department,TRUNCATE(salary,1) from test4 order by Department; +select FirstName,LastName,Department,TRUNCATE(salary*100,0) from test4 order by Department; +select FirstName,LastName,Department,SIN(salary) from test4 order by Department; +select id,FirstName,lastname,department,salary from test4 where Department is Null; +select id,FirstName,lastname,department,salary from test4 where Department is not Null; +select id,FirstName,lastname,department,salary from test4 where NOT (ID < 200); +select id,FirstName,lastname,department,salary from test4 where ID <300; +select id,FirstName,lastname,department,salary from test4 where ID <1; +select id,FirstName,lastname,department,salary from test4 where ID <> 0; +select id,FirstName,lastname,department,salary from test4 where ID <> 0 and ID <=1; +select id,FirstName,lastname,department,salary from test4 where ID >=205; +select id,FirstName,lastname,department,salary from test4 where ID <=205; +select id,FirstName,lastname,department,salary from test4 where ID >=205 and ID <=205; +select id,FirstName,lastname,department,salary from test4 where ID >1 and ID <=203; +select id,FirstName,lastname,department,salary from test4 where ID >=1 and ID=205; +select id,FirstName,lastname,department,salary from test4 where ID=(ID>>1)<<1; +select id,FirstName,lastname,department,salary from test4 where ID&1; +select id,FirstName,lastname,department,salary from test4 where Salary >'40000' and Salary <'70000' and Department ='Finance' order by Salary ASC; +select id,FirstName,lastname,department,salary from test4 where (Salary >'50000' and Salary <'70000') or Department ='Finance' order by Salary ASC; +select id,FirstName,lastname,department,salary from test4 where FirstName like 'J%'; +select count(*) FROM test4 WHERE Salary is null or FirstName not like '%M%'; +select id,FirstName,lastname,department,salary from test4 where FirstName in ('Mazojys','Syllauu','Tyoysww'); +select id,FirstName,lastname,department,salary from test4 where Salary between 40000 and 50000; +select sum(salary) from test4 where department = 'Finance'; +select max(salary) from test4 where department = 'Finance'; +select min(salary) from test4 where department = 'Finance'; +select sum(distinct id) from test5; +select sum(all id) from test5; +select id, R_REGIONKEY from test5; +select id,'user is user' from test5; +select id*5,'user is user',10 from test5; +select ALL id, R_REGIONKEY, R_NAME, R_COMMENT from test5; +select DISTINCT id, R_REGIONKEY, R_NAME, R_COMMENT from test5; +select DISTINCTROW id, R_REGIONKEY, R_NAME, R_COMMENT from test5; +select ALL HIGH_PRIORITY id,'ID' as detail from test5; +select id, O_ORDERKEY, O_TOTALPRICE,MYDATE from test8 where id=1; +select id, O_ORDERKEY, O_TOTALPRICE,MYDATE from test8 where id=1 and not id=1; +select id,O_ORDERKEY,O_CUSTKEY,O_TOTALPRICE,MYDATE from test8 where id=1; +select count(*) counts from test8 a where MYDATE is null; +select count(*) counts from test8 a where id is null; +select count(*) counts from test8 a where id is not null; +select count(*) counts from test8 a where not (id is null); +select count(O_ORDERKEY) counts from test8 a where O_ORDERKEY like 'ORDERKEY_00%'; +select count(O_ORDERKEY) counts from test8 a where O_ORDERKEY not like '%00%'; +select sum(O_TOTALPRICE) as sums,O_CUSTKEY,count(O_ORDERKEY) counts from test8 a where O_ORDERKEY<'ORDERKEY_010' and O_CUSTKEY between 'CUSTKEY_002' and 'CUSTKEY_300' group by o_custkey; +select sum(O_TOTALPRICE) as sums,O_CUSTKEY,count(O_ORDERKEY) counts from test8 a where O_ORDERKEY<'ORDERKEY_010' or O_CUSTKEY between 'CUSTKEY_002' and 'CUSTKEY_300' group by o_custkey; +select sum(O_TOTALPRICE) as sums,O_CUSTKEY,count(O_ORDERKEY) counts from test8 a where O_CUSTKEY in ('CUSTKEY_003','CUSTKEY_420','CUSTKEY_980') group by o_custkey; +select sum(O_TOTALPRICE) as sums,count(O_ORDERKEY) counts from test8 a where O_CUSTKEY not in ('CUSTKEY_003','CUSTKEY_420','CUSTKEY_980'); +select O_CUSTKEY,case when sum(O_TOTALPRICE)<100000 then 'D' when sum(O_TOTALPRICE)>100000 and sum(O_TOTALPRICE)<1000000 then 'C' when sum(O_TOTALPRICE)>1000000 and sum(O_TOTALPRICE)<5000000 then 'B' else 'A' end as jibie from test8 a group by O_CUSTKEY order by jibie, O_CUSTKEY limit 10; +select count(*) from test8 where MYDATE between concat(date_format('1992-05-01','%Y-%m'),'-00') and concat(date_format(date_add('1992-05-01',interval 2 month),'%Y-%m'),'-00'); +select id,sum(O_TOTALPRICE) from test8 where id>1 and id<50 group by id; +select id, O_ORDERKEY, O_TOTALPRICE,MYDATE from test8 group by id,O_ORDERKEY,MYDATE; +select count(id) as counts,date_format(MYDATE,'%Y-%m') as mouth,id from test8 where id>1 and id<50 group by 2 asc ,id desc; +select sum(O_TOTALPRICE ) as sums,id from test8 where id>1 and id<50 group by 2 asc having sums>2000000; +select sum(O_TOTALPRICE ) as sums,id from test8 where id>1 and id<50 group by 2 asc having sums>2000000; +select sum(O_TOTALPRICE ) as sums,id,count(O_ORDERKEY) counts from test8 where id>1 and id<50 group by 2 asc having count(O_ORDERKEY)>2; +select sum(O_TOTALPRICE ) as sums,id,count(O_ORDERKEY) counts from test8 where id>1 and id<50 group by 2 asc having min(O_ORDERKEY)>10 and max(O_ORDERKEY)<10000000; +select sum(O_TOTALPRICE ) from test8 where id>1 and id<50 having min(O_ORDERKEY)<10000; +select id,O_ORDERKEY,O_TOTALPRICE from test8 where id>36900 and id<36902 group by O_ORDERKEY having O_ORDERKEY in (select O_ORDERKEY from test8 group by id having sum(id)>10000); +select sum(O_TOTALPRICE) as sums,O_CUSTKEY,count(O_ORDERKEY) counts from test8 a where O_CUSTKEY between 'CUSTKEY_002' and 'CUSTKEY_300' group by o_custkey; +select sum(O_TOTALPRICE) as sums,O_CUSTKEY,count(O_ORDERKEY) counts from test8 a where O_CUSTKEY not between 'CUSTKEY_002' and 'CUSTKEY_300' group by o_custkey; +select sum(O_TOTALPRICE) as sums,O_CUSTKEY,count(O_ORDERKEY) counts from test8 a where not (O_CUSTKEY between 'CUSTKEY_002' and 'CUSTKEY_300') group by o_custkey; +select C_NAME from sbtest.test6 where C_NAME like 'A__A'; +select C_NAME from sbtest.test6 where C_NAME like 'm___i'; +select C_NAME from sbtest.test6 where C_NAME like 'ch___i%%'; +select C_NAME from sbtest.test6 where C_NAME like 'ch___i%%' ESCAPE 'i'; +select count(*) from sbtest.test6 where C_NAME not like 'chen%'; +select count(*) from sbtest.test6 where not (C_NAME like 'chen%'); +select C_NAME from sbtest.test6 where C_NAME like binary 'chen%'; +select C_NAME from sbtest.test6 where C_NAME like 'chen%'; +select C_NAME from sbtest.test6 where C_NAME like concat('%','AM','%'); +select C_NAME from sbtest.test6 where C_NAME like concat('%','en','%'); +select C_ORDERKEY,C_CUSTKEY,C_NAME from test1,sbtest.test6 where C_CUSTKEY=c_CUSTKEY and C_ORDERKEY<'ORDERKEY_006'; +select count(*) from (select O_CUSTKEY,count(O_CUSTKEY) as counts from test8 group by O_CUSTKEY) as a where counts<10 group by counts; +select O_ORDERKEY,O_CUSTKEY,C_NAME from test8 join sbtest.test6 on O_CUSTKEY=c_CUSTKEY and O_ORDERKEY<'ORDERKEY_007'; +select O_ORDERKEY,O_CUSTKEY,C_NAME from test8 INNER join sbtest.test6 where O_CUSTKEY=c_CUSTKEY and O_ORDERKEY<'ORDERKEY_007'; +select O_ORDERKEY,O_CUSTKEY,C_NAME from test8 INNER join sbtest.test6 on O_CUSTKEY=c_CUSTKEY and O_ORDERKEY<'ORDERKEY_006'; +select O_ORDERKEY,O_CUSTKEY,C_NAME from test8 CROSS join sbtest.test6 on O_CUSTKEY=c_CUSTKEY and O_ORDERKEY<'ORDERKEY_006'; +select test8.O_ORDERKEY,test8.O_CUSTKEY,C_NAME from test6 CROSS join sbtest.test8 using(id) order by test8.O_ORDERKEY,test8.O_CUSTKEY,C_NAME; +select O_ORDERKEY,O_CUSTKEY,C_NAME from sbtest.test6 as a STRAIGHT_JOIN test8 b where b.O_CUSTKEY=a.c_CUSTKEY and O_ORDERKEY<'ORDERKEY_007'; +select b.O_ORDERKEY,b.O_CUSTKEY,a.C_NAME from sbtest.test6 a STRAIGHT_JOIN test8 b on b.O_CUSTKEY=a.c_CUSTKEY and b.O_ORDERKEY<'ORDERKEY_007'; +select a.c_CUSTKEY,a.C_NAME,b.O_ORDERKEY from sbtest.test6 as a left join test8 b on b.O_CUSTKEY=a.C_CUSTKEY and a.C_CUSTKEY<'CUSTKEY_300'; +select a.c_CUSTKEY,a.C_NAME,b.O_ORDERKEY from sbtest.test6 as a left join test8 b using(id) where a.C_CUSTKEY<'CUSTKEY_300'; +select a.c_CUSTKEY,a.C_NAME,b.O_ORDERKEY from sbtest.test6 as a left OUTER join test8 b using(id); +select a.c_CUSTKEY,a.C_NAME,b.O_ORDERKEY from test8 b right join sbtest.test6 as a using(id) where a.c_CUSTKEY<'CUSTKEY_300'; +select a.c_CUSTKEY,a.C_NAME,b.O_ORDERKEY from test8 b right join sbtest.test6 as a using(id); +select a.c_CUSTKEY,a.C_NAME,b.O_ORDERKEY from test8 b right join sbtest.test6 as a on b.O_CUSTKEY=a.C_CUSTKEY and a.c_CUSTKEY<'CUSTKEY_300'; +select sum(O_TOTALPRICE) as sums,O_CUSTKEY,count(O_ORDERKEY) counts from test9 where O_CUSTKEY between 'CUSTKEY_013' and 'CUSTKEY_050' group by 2 asc having O_CUSTKEY<(select max(c_custkey) from test7) order by o_custkey; +select sum(O_TOTALPRICE) as sums,O_CUSTKEY,count(O_ORDERKEY) counts,MYDATE from test9 use index (ORDERS_FK1) where O_CUSTKEY between 'CUSTKEY_002' and 'CUSTKEY_300' group by o_custkey; +select sum(O_TOTALPRICE) as sums,O_CUSTKEY,count(O_ORDERKEY) counts from test9 use key (ORDERS_FK1) where O_CUSTKEY between 'CUSTKEY_002' and 'CUSTKEY_800' group by o_custkey; +select sum(O_TOTALPRICE) as sums,O_CUSTKEY,count(O_ORDERKEY) counts from test9 use key (ORDERS_FK1) ignore index (ORDERS_FK1) where O_CUSTKEY between 'CUSTKEY_002' and 'CUSTKEY_800' group by o_custkey; +select sum(O_TOTALPRICE) as sums,O_CUSTKEY,count(O_ORDERKEY) counts from test9 ignore key (ORDERS_FK1) force index (ORDERS_FK1) where O_CUSTKEY between 'CUSTKEY_002' and 'CUSTKEY_300' group by o_custkey; +select sum(O_TOTALPRICE) as sums,O_CUSTKEY,count(O_ORDERKEY) counts from test9 ignore key (ORDERS_FK1) force index (ORDERS_FK1) where O_CUSTKEY between 'CUSTKEY_002' and 'CUSTKEY_300' group by o_custkey; +select sum(O_TOTALPRICE) as sums,O_CUSTKEY,count(O_ORDERKEY) counts from test9 use index for order by (ORDERS_FK1) ignore index for group by (ORDERS_FK1) where O_CUSTKEY between 1 and 50 group by o_custkey; +select sum(O_TOTALPRICE) as sums,O_CUSTKEY,count(O_ORDERKEY) counts from test9 as a use index for group by (ORDERS_FK1) ignore index for join (ORDERS_FK1) where O_CUSTKEY between 'CUSTKEY_002' and 'CUSTKEY_300' group by o_custkey; +select sum(O_TOTALPRICE) as sums,O_CUSTKEY,count(O_ORDERKEY) counts from test9 a use index for join (ORDERS_FK1) ignore index for join (ORDERS_FK1) where O_CUSTKEY between 'CUSTKEY_002' and 'CUSTKEY_300' group by o_custkey; +select a.c_CUSTKEY,a.C_NAME,b.O_ORDERKEY from sbtest.test7 as a left join test9 b ignore index for join(ORDERS_FK1) on b.O_CUSTKEY=a.c_CUSTKEY and a.c_CUSTKEY<'CUSTKEY_300'; +select a.c_CUSTKEY,a.C_NAME,b.O_ORDERKEY from sbtest.test7 as a force index for join(primary) left join test9 b ignore index for join(ORDERS_FK1) on b.O_CUSTKEY=a.c_CUSTKEY and a.c_CUSTKEY<'CUSTKEY_300'; +select UPPER((select C_NAME FROM test7 limit 1)) FROM test7 limit 1; +select O_ORDERKEY,O_CUSTKEY from test9 as a where a.O_CUSTKEY=(select min(C_CUSTKEY) from test7); +select O_ORDERKEY,O_CUSTKEY from test9 as a where a.O_CUSTKEY<=(select min(C_CUSTKEY) from test7); +select O_ORDERKEY,O_CUSTKEY from test9 as a where a.O_CUSTKEY<=(select min(C_CUSTKEY)+1 from test7); +select count(*) from sbtest.test7 as a where a.c_CUSTKEY=(select max(C_CUSTKEY) from test9 where C_CUSTKEY=a.C_CUSTKEY); +select C_CUSTKEY from sbtest.test7 as a where (select count(*) from test9 where O_CUSTKEY=a.C_CUSTKEY)=2; +select count(*) from test9 as a where a.id <> all(select id from test7); +select count(*) from test9 as a where 56000< all(select id from test7); +select count(*) from sbtest.test7 as a where 2>all(select count(*) from test9 where O_CUSTKEY=C_CUSTKEY); +select id,O_CUSTKEY,O_ORDERKEY,O_TOTALPRICE from test9 a where (a.O_ORDERKEY,O_CUSTKEY)=(select c_ORDERKEY,c_CUSTKEY from test7 where c_name='yanglu'); +SELECT /*+ MAX_EXECUTION_TIME(1000) */ * FROM t1 INNER JOIN t2 where t1.col1 = t2.col1; +/*comment*/ /*comment*/ select col1 /* this is a comment */ from t; +SELECT /*!40001 SQL_NO_CACHE */ * FROM t WHERE 1 limit 0, 2000; +SELECT * FROM t; +SELECT * FROM t AS u; +SELECT * FROM t1, t2; +SELECT * FROM t1 AS u, t2; +SELECT * FROM t1, t2 AS u; +SELECT * FROM t1 AS u, t2 AS v; +SELECT * FROM t, t1, t2; +SELECT DISTINCT * FROM t; +SELECT DISTINCTROW * FROM t; +SELECT ALL * FROM t; +SELECT id FROM t; +SELECT * FROM t WHERE 1 = 1; +select 1 from t; +select 1 from t limit 1; +select 1 from t where not exists (select 2); +select * from sbtest.t1 where id > 4 and id <=8 order by col1 desc; +select 1 as a from t order by a; +select * from sbtest.t1 where id > 1 order by id desc limit 10; +select * from sbtest.t2 where id < 0; +select 1 as a from t where 1 < any (select 2) order by a; +SELECT * from t for update; +SELECT * from t lock in share mode; +SELECT * from t1, t2, t3; +select * from t1 join t2 left join t3 on t2.id = t3.id; +select * from t1 right join t2 on t1.id = t2.id left join t3 on t3.id = t2.id; +select * from t1 right join t2 using (id) left join t3 using (id); +select * from t1 natural join t2; +select * from t1 natural right join t2; +select * from t1 natural left outer join t2; +select * from t1 straight_join t2 on t1.id = t2.id; +select straight_join * from t1 join t2 on t1.id = t2.id; +select straight_join * from t1 left join t2 on t1.id = t2.id; +select straight_join * from t1 right join t2 on t1.id = t2.id; +select straight_join * from t1 straight_join t2 on t1.id = t2.id; +SELECT *, CAST(col1 AS CHAR CHARACTER SET utf8) FROM t; +select max(distinct col1) from t; +select max(distinctrow col1) from t; +select max(distinct all col1) from t; +select max(distinctrow all col1) from t; +select max(col2) from t; +select min(distinct col1) from t; +select min(distinctrow col1) from t; +select min(distinct all col1) from t; +select min(col2) from t; +select sum(distinct col1) from t; +select sum(distinctrow col1) from t; +select sum(distinct all col1) from t; +select sum(distinctrow all col1) from t; +select sum(col2) from t; +select count(col1) from t; +select count(*) from t; +select count(distinct col1, col2) from t; +select count(distinctrow col1, col2) from t; +select count(all col1) from t; +select group_concat(col2,col1) from t group by col1; +select group_concat(col2,col1 SEPARATOR ';') from t group by col1; +select group_concat(distinct col2,col1) from t group by col1; +select group_concat(distinctrow col2,col1) from t group by col1; +SELECT col1, GROUP_CONCAT(DISTINCT col2 ORDER BY col2 DESC SEPARATOR ' ') FROM t GROUP BY col1; +select * from t a; +select * from t as a; +select * from t full, t1 `row`, t2 abs; +select * from t use index (primary); +select * from t use index (`primary`); +select * from t use index (); +select * from t use index (idx1); +select * from t use index (idx1, idx2); +select * from t ignore key (idx1); +select * from t force index for join (idx1); +select * from t use index for order by (idx1); +select * from t force index for group by (idx1); +select * from t use index for group by (idx1) use index for order by (idx2), t2; +select high_priority * from t; +select SQL_CACHE * from t; +select * from t; +select col2,col1 from t group by col1 with rollup; +select coalesce(col1,'ALL'),col2,col1 from t group by col1 with rollup; +select col1 from t1 group by col1 order by null; +select col1 from t1 group by col1 order by 1; +select a.id,b.id,b.pad,a.t_id from test1 a,(select all * from sbtest.test2) b where a.t_id=b.o_id; +select a.id,b.id,b.pad,a.t_id from test1 a,(select distinct * from sbtest.test2) b where a.t_id=b.o_id; +select id,o_id,name,pad from (select * from sbtest.test2 a group by a.id) a; +select * from (select pad,count(*) from sbtest.test2 a group by pad) a; +select a.id,b.id,b.pad,a.t_id from test1 a,(select * from sbtest.test2 having pad>3) b where a.t_id=b.o_id; +select a.id,b.id,b.pad,a.t_id from test1 a,(select * from sbtest.test2 where pad>3 order by id) b where a.t_id=b.o_id; +select a.id,b.id,b.pad,a.t_id from test1 a,(select * from sbtest.test2 order by id limit 3) b where a.t_id=b.o_id; +select a.id,b.id,b.pad,a.t_id from test1 a,(select * from sbtest.test2 order by id limit 3) b where a.t_id=b.o_id limit 2; +select a.id,b.id,b.pad,a.t_id from test1 a,(select * from sbtest.test2 where pad>3) b where a.t_id=b.o_id; +select * from (select sbtest.test3.pad from test1 left join sbtest.test3 on test1.pad=sbtest.test3.pad) a; +select pad,count(*) from (select * from test1 where pad>2) a group by pad; +select pad,count(*) from (select * from test1 where pad>2) a group by pad order by pad; +select count(*) from (select pad,count(*) a from test1 group by pad) a; +select a.id,b.id,b.pad,a.t_id from test1 a,(select * from sbtest.test2 where pad>3) b where a.t_id=b.o_id; +select id,pad from test1 where pad>(select pad from test1 where id=2); +select id,pad from test1 where pad<(select pad from test1 where id=2); +select id,pad from test1 where pad=(select pad from test1 where id=2); +select id,pad from test1 where pad>=(select pad from test1 where id=2); +select id,pad from test1 where pad<=(select pad from test1 where id=2); +select id,pad from test1 where pad<>(select pad from test1 where id=2); +select id,pad from test1 where pad !=(select pad from test1 where id=2); +select id,t_id,name,pad from test1 where exists(select * from test1 where pad>1); +select id,t_id,name,pad from test1 where not exists(select * from test1 where pad>1); +select id,t_id,name,pad from test1 where pad=some(select id from test1 where pad>1); +select id,t_id,name,pad from test1 where pad=any(select id from test1 where pad>1); +select id,t_id,name,pad from test1 where pad !=any(select id from test1 where pad=3); +select a.id,b.id,b.pad,a.t_id from (select test1.id,test1.pad,test1.t_id from test1 join sbtest.test3 where test1.pad=sbtest.test3.pad ) a,(select sbtest.test2.id,sbtest.test2.pad from test1 join sbtest.test2 where test1.pad=sbtest.test2.pad) b where a.pad=b.pad; +select id,t_id,name,pad from test1 where pad>(select pad from test1 where pad=2); +select id,t_id,name,pad from test1 where 2 >any(select id from test1 where pad>1); +select id,t_id,name,pad from test1 where 2<>some(select id from test1 where pad>1); +select id,t_id,name,pad from test1 where 2>all(select id from test1 where pad<1); +select * from (select m.id,n.pad from test1 m,sbtest.test2 n where m.id=n.id AND m.name='test中id为1' and m.pad>7 and m.pad<10)a; + +select a.id,b.id,b.pad,a.t_id from (select id,t_id from test1) a,(select * from sbtest.test2) b where a.t_id=b.o_id; +select co1,co2,co3 from (select id as co1,name as co2,pad as co3 from test1)as tb where co1>1; +select CURRENT_USER FROM test5; diff --git a/tests/e2e/shard/case/join/mycat/long/show.sql b/tests/e2e/shard/case/join/mycat/long/show.sql new file mode 100644 index 00000000..83b90b8f --- /dev/null +++ b/tests/e2e/shard/case/join/mycat/long/show.sql @@ -0,0 +1,54 @@ +# databases +show databases like 'sbtest'; + +# schemas +show schemas; +show open tables; +show open tables from sbtest; +show open tables in sbtest; +show open tables from sbtest like 'aly_o%'; + +# tables +show table status like 'aly_o%'/*allow_diff*/; +show table status/*allow_diff*/; +show tables; +show full tables; +show tables like 'aly_o%'; +show tables from sbtest_0; +show tables in sbtest_0; +show full tables from sbtest_0; +show full tables in sbtest_0; +show full tables from sbtest_0 like 'aly%'; +show full tables in sbtest_0 where table_type like 'base%'; + + +# columns +show columns in t1; +show columns from t1; +show full columns from t1; +show columns from t1 from sbtest_0; +show full columns from t1 from sbtest_0; +show full columns from t1 from sbtest_0 like 'n%'; +show full columns from t1 from sbtest_0 where field like 's%'; + +# index +show index from t1; +show index in t1; +show index from t1 from sbtest_0; +show index in t1 in sbtest_0; +show index in t1 from sbtest_0; +show index from t1 in sbtest_0; + +# keys +show keys from t1; +show keys in t1; +show keys from t1 from sbtest_0; +show keys from t1 in sbtest_0; +show keys in t1 in sbtest_0; +show keys in t1 from sbtest_0; + +# create +show create database sbtest_0; +show create schema sbtest_0; +show create schema if not exists sbtest_0; +show create database if not exists sbtest_0; diff --git a/tests/e2e/shard/case/join/mycat/long/skip.sql b/tests/e2e/shard/case/join/mycat/long/skip.sql new file mode 100644 index 00000000..1736b1c3 --- /dev/null +++ b/tests/e2e/shard/case/join/mycat/long/skip.sql @@ -0,0 +1,57 @@ +SELECT last_insert_id(); + +# databases +show databases; +show databases like 'sbtest'; + +# schemas +show schemas; +show open tables; +show open tables from sbtest; +show open tables in sbtest; +show open tables from sbtest like 'aly_o%'; + +# tables +show table status like 'aly_o%'/*allow_diff*/; +show table status/*allow_diff*/; +show tables; +show full tables; +show tables like 'aly_o%'; +show tables from sbtest; +show tables in sbtest; +show full tables from sbtest; +show full tables in sbtest; +show full tables from sbtest like 'aly%'; +show full tables in sbtest where table_type like 'base%'; + + +# columns +show columns in t1; +show columns from t1; +show full columns from t1; +show columns from t1 from sbtest; +show full columns from t1 from sbtest; +show full columns from t1 from sbtest like 'n%'; +show full columns from t1 from sbtest where field like 's%'; + +# index +show index from t1; +show index in t1; +show index from t1 from sbtest; +show index in t1 in sbtest; +show index in t1 from sbtest; +show index from t1 in sbtest; + +# keys +show keys from t1; +show keys in t1; +show keys from t1 from sbtest; +show keys from t1 in sbtest; +show keys in t1 in sbtest; +show keys in t1 from sbtest; + +# create +show create database sbtest; +show create schema sbtest; +show create schema if not exists sbtest; +show create database if not exists sbtest; diff --git a/tests/e2e/shard/case/join/mycat/long/unequal.sql b/tests/e2e/shard/case/join/mycat/long/unequal.sql new file mode 100644 index 00000000..1810a1ac --- /dev/null +++ b/tests/e2e/shard/case/join/mycat/long/unequal.sql @@ -0,0 +1,16 @@ +select count(id) as counts,date_format(MYDATE,'%Y-%m') as mouth from test8 where id>1 and id<50 group by 2 asc; +select sum(O_TOTALPRICE) as sums,id from test8 where id>1 and id<50 group by 2 asc; +select sum(O_TOTALPRICE) as sums,O_CUSTKEY,count(O_ORDERKEY) counts from test9 where O_CUSTKEY between 'CUSTKEY_003' and 'CUSTKEY_500' group by 2 asc having sums>400 order by o_custkey; +select sum(O_TOTALPRICE) as sums,O_CUSTKEY,count(O_ORDERKEY) counts from test9 where O_CUSTKEY between 'CUSTKEY_003' and 'CUSTKEY_500' group by 2 asc having sums>400 order by 2; +select sum(O_TOTALPRICE) as sums,O_CUSTKEY,count(O_ORDERKEY) counts from test9 where O_CUSTKEY between 'CUSTKEY_003' and 'CUSTKEY_500' group by 2 asc having sums>400 order by count(O_ORDERKEY), sums; +select sum(O_TOTALPRICE) as sums,O_CUSTKEY,count(O_ORDERKEY) counts from test9 where O_CUSTKEY between 'CUSTKEY_003' and 'CUSTKEY_500' group by 2 asc having sums>400 order by counts asc,2 desc; +select sum(O_TOTALPRICE) as sums,O_CUSTKEY,count(O_ORDERKEY) counts from test9 where O_CUSTKEY between 'CUSTKEY_002' and 'CUSTKEY_050' group by 2 asc having O_CUSTKEY<(select max(c_custkey) from test7) order by 2; +select sum(O_TOTALPRICE) as sums,O_CUSTKEY,count(O_ORDERKEY) counts from test9 where O_CUSTKEY between 'CUSTKEY_002' and 'CUSTKEY_050' group by 2 asc having O_CUSTKEY<(select max(c_custkey) from test7) order by count(O_ORDERKEY); +select sum(O_TOTALPRICE) as sums,O_CUSTKEY,count(O_ORDERKEY) counts from test9 where O_CUSTKEY between 'CUSTKEY_002' and 'CUSTKEY_050' group by 2 asc having O_CUSTKEY<(select max(c_custkey) from test7) order by counts asc,2 desc; +select sum(O_TOTALPRICE) as sums,O_CUSTKEY,count(O_ORDERKEY) counts from test9 where O_CUSTKEY between 'CUSTKEY_003' and 'CUSTKEY_500' group by 2 asc having sums>400 order by count(O_ORDERKEY) asc,2 desc limit 2; +select sum(O_TOTALPRICE) as sums,O_CUSTKEY,count(O_ORDERKEY) counts from test9 where O_CUSTKEY between 'CUSTKEY_003' and 'CUSTKEY_500' group by 2 asc having sums>400 order by count(O_ORDERKEY) asc,O_CUSTKEY desc limit 1,3; +select sum(O_TOTALPRICE) as sums,O_CUSTKEY,count(O_ORDERKEY) counts from test9 where O_CUSTKEY between 'CUSTKEY_003' and 'CUSTKEY_500' group by 2 asc having sums>400 order by count(O_ORDERKEY) asc,O_CUSTKEY desc limit 10 offset 1; +select sum(O_TOTALPRICE) as sums,O_CUSTKEY,count(O_ORDERKEY) counts from test9 where O_CUSTKEY between 'CUSTKEY_002' and 'CUSTKEY_050' group by 2 asc having O_CUSTKEY<(select max(c_custkey) from test7) order by count(O_ORDERKEY) asc,2 desc limit 10; +select sum(O_TOTALPRICE) as sums,O_CUSTKEY,count(O_ORDERKEY) counts from test9 where O_CUSTKEY between 'CUSTKEY_002' and 'CUSTKEY_050' group by 2 asc having O_CUSTKEY<(select max(c_custkey) from test7) order by count(O_ORDERKEY) asc,O_CUSTKEY desc limit 1,10; +select sum(O_TOTALPRICE) as sums,O_CUSTKEY,count(O_ORDERKEY) counts from test9 where O_CUSTKEY between 'CUSTKEY_002' and 'CUSTKEY_050' group by 2 asc having O_CUSTKEY<(select max(c_custkey) from test7) order by count(O_ORDERKEY) asc,O_CUSTKEY desc limit 10 offset 1; +select (select name from test1 limit 1); diff --git a/tests/e2e/shard/case/join/mycat/long/unsupport.sql b/tests/e2e/shard/case/join/mycat/long/unsupport.sql new file mode 100644 index 00000000..8b137891 --- /dev/null +++ b/tests/e2e/shard/case/join/mycat/long/unsupport.sql @@ -0,0 +1 @@ + diff --git a/tests/e2e/shard/case/join/mycat/mod/equal.sql b/tests/e2e/shard/case/join/mycat/mod/equal.sql new file mode 100644 index 00000000..f40fa2ef --- /dev/null +++ b/tests/e2e/shard/case/join/mycat/mod/equal.sql @@ -0,0 +1,239 @@ +select a.id,b.id,b.pad,a.t_id from test1 a,(select * from sbtest.test2 where pad>3) b where a.t_id=b.o_id; +select test1.id,test1.t_id,test1.name,test1.pad,sbtest.test2.id,sbtest.test2.o_id,sbtest.test2.name,sbtest.test2.pad from test1 natural left join sbtest.test2; +select test1.id,test1.t_id,test1.name,test1.pad,sbtest.test2.id,sbtest.test2.o_id,sbtest.test2.name,sbtest.test2.pad from test1 natural right join sbtest.test2; +select test1.id,test1.t_id,test1.name,test1.pad,sbtest.test2.id,sbtest.test2.o_id,sbtest.test2.name,sbtest.test2.pad from test1 natural left outer join sbtest.test2; +select test1.id,test1.t_id,test1.name,test1.pad,sbtest.test2.id,sbtest.test2.o_id,sbtest.test2.name,sbtest.test2.pad from test1 natural right outer join sbtest.test2; +select a.id,a.t_id,a.name,a.pad,b.id,b.o_id,b.name,b.pad from test1 a natural left join sbtest.test2 b order by a.id; +select a.id,a.t_id,a.name,a.pad,b.id,b.o_id,b.name,b.pad from test1 a natural right join sbtest.test2 b order by b.id; +select a.id,a.t_id,a.name,a.pad,b.id,b.o_id,b.name,b.pad from test1 a natural left outer join sbtest.test2 b order by a.id; +select a.id,a.t_id,a.name,a.pad,b.id,b.o_id,b.name,b.pad from test1 a natural right outer join sbtest.test2 b order by b.id; +select a.id,a.t_id,a.name,a.pad,b.id,b.o_id,b.name,b.pad from test1 a natural left join (select * from sbtest.test2 where pad>2) b order by a.id,b.id; +select a.id,a.t_id,a.name,a.pad,b.id,b.o_id,b.name,b.pad from test1 a natural right join (select * from sbtest.test2 where pad>2) b order by a.id,b.id; +select a.id,a.t_id,a.name,a.pad,b.id,b.o_id,b.name,b.pad from test1 a natural left outer join (select * from sbtest.test2 where pad>2) b order by a.id,b.id; +select a.id,a.t_id,a.name,a.pad,b.id,b.o_id,b.name,b.pad from test1 a natural right outer join (select * from sbtest.test2 where pad>2) b order by a.id,b.id; +select a.id,a.t_id,a.name,a.pad,b.id,b.o_id,b.name,b.pad from (select * from test1 where pad>1) a natural left join (select * from sbtest.test2 where pad>3) b order by a.id,b.id; +select a.id,a.t_id,a.name,a.pad,b.id,b.o_id,b.name,b.pad from (select * from test1 where pad>1) a natural right join (select * from sbtest.test2 where pad>3) b order by a.id,b.id; +select a.id,a.t_id,a.name,a.pad,b.id,b.o_id,b.name,b.pad from (select * from test1 where pad>1) a natural left outer join (select * from sbtest.test2 where pad>3) b order by a.id,b.id; +select a.id,a.t_id,a.name,a.pad,b.id,b.o_id,b.name,b.pad from (select * from test1 where pad>1) a natural right outer join (select * from sbtest.test2 where pad>3) b order by a.id,b.id; +select distinct b.pad,a.pad from test1 a,(select * from sbtest.test2 where pad=1) b where a.t_id=b.o_id; +select count(distinct id),sum(distinct name) from test1 where id=3 or id=7; +select id,FirstName,lastname,department,salary from test4 use index(ID_index) where Department ='Finance'; +select id,FirstName,lastname,department,salary from test4 force index(ID_index) where ID= 205; +SELECT FirstName, LastName,Department = CASE Department WHEN 'F' THEN 'Financial' WHEN 'D' THEN 'Development' ELSE 'Other' END FROM test4; +select id,FirstName,lastname,department,salary from test4 where Salary >'40000' and Salary <'70000' and Department ='Finance'; +SELECT count(*), Department FROM (SELECT * FROM test4 ORDER BY FirstName DESC) AS Actions GROUP BY Department ORDER BY ID DESC; +select id,FirstName,lastname,department,salary from test4 order by ID ASC; +select Department,max(Salary) from test4 group by Department order by Department asc; +select Department,min(Salary) from test4 group by Department order by Department asc; +select Department,sum(Salary) from test4 group by Department order by Department asc; +select ID,Department,Salary from test4 order by 2,3; +select id,FirstName,lastname,department,salary from test4 order by Department ,ID desc; +SELECT Department, COUNT(Salary) FROM test4 GROUP BY Department; +SELECT Department, COUNT(Salary) FROM test4 GROUP BY Department DESC; +select Department,count(Salary) as a from test4 group by Department having a>0; +select Department from test4 having Department >3; +select Department from test4 where Department >0; +select Department,max(salary) from test4 group by Department having max(salary) >10; +select 12 as Department, Department from test4 group by Department; +select max(salary) from test4 group by department order by department asc; +select min(salary) from test4 group by department order by department asc; +select sum(salary) from test4 group by department order by department asc; +select count(salary) from test4 group by department order by department asc; +select Department,sum(Salary) a from test4 group by Department having a >=1 order by Department DESC; +select FirstName,LastName,Department,ABS(salary) from test4 order by Department; +select FirstName,LastName,Department,ACOS(salary) from test4 order by Department; +select FirstName,LastName,Department,ASIN(salary) from test4 order by Department; +select FirstName,LastName,Department,ATAN(salary) from test4 order by Department; +select FirstName,LastName,Department,ATAN(salary,100) from test4 order by Department; +select FirstName,LastName,Department,ATAN2(salary,100) from test4 order by Department; +select FirstName,LastName,Department,CEIL(salary) from test4 order by Department; +select FirstName,LastName,Department,CEILING(salary) from test4 order by Department; +select FirstName,LastName,Department,COT(salary) from test4 order by Department; +select FirstName,LastName,Department,CRC32(Department) from test4 order by Department; +select FirstName,LastName,Department,FLOOR(salary) from test4 order by Department; +select FirstName,LN(FirstName),LastName,Department from test4 order by Department; +select FirstName,LastName,Department,LOG(salary) from test4 order by Department; +select FirstName,LastName,Department,LOG2(salary) from test4 order by Department; +select FirstName,LastName,Department,LOG10(salary) from test4 order by Department; +select FirstName,LastName,Department,MOD(salary,2) from test4 order by Department; +select FirstName,LastName,Department,RADIANS(salary) from test4 order by Department; +select FirstName,LastName,Department,ROUND(salary) from test4 order by Department; +select FirstName,LastName,Department,SIGN(salary) from test4 order by Department; +select FirstName,LastName,Department,SIN(salary) from test4 order by Department; +select FirstName,LastName,Department,SQRT(salary) from test4 order by Department; +select FirstName,LastName,Department,TAN(salary) from test4 order by Department; +select FirstName,LastName,Department,TRUNCATE(salary,1) from test4 order by Department; +select FirstName,LastName,Department,TRUNCATE(salary*100,0) from test4 order by Department; +select FirstName,LastName,Department,SIN(salary) from test4 order by Department; +select id,FirstName,lastname,department,salary from test4 where Department is Null; +select id,FirstName,lastname,department,salary from test4 where Department is not Null; +select id,FirstName,lastname,department,salary from test4 where NOT (ID < 200); +select id,FirstName,lastname,department,salary from test4 where ID <300; +select id,FirstName,lastname,department,salary from test4 where ID <1; +select id,FirstName,lastname,department,salary from test4 where ID <> 0; +select id,FirstName,lastname,department,salary from test4 where ID <> 0 and ID <=1; +select id,FirstName,lastname,department,salary from test4 where ID >=205; +select id,FirstName,lastname,department,salary from test4 where ID <=205; +select id,FirstName,lastname,department,salary from test4 where ID >=205 and ID <=205; +select id,FirstName,lastname,department,salary from test4 where ID >1 and ID <=203; +select id,FirstName,lastname,department,salary from test4 where ID >=1 and ID=205; +select id,FirstName,lastname,department,salary from test4 where ID=(ID>>1)<<1; +select id,FirstName,lastname,department,salary from test4 where ID&1; +select id,FirstName,lastname,department,salary from test4 where Salary >'40000' and Salary <'70000' and Department ='Finance' order by Salary ASC; +select id,FirstName,lastname,department,salary from test4 where (Salary >'50000' and Salary <'70000') or Department ='Finance' order by Salary ASC; +select id,FirstName,lastname,department,salary from test4 where FirstName like 'J%'; +select count(*) FROM test4 WHERE Salary is null or FirstName not like '%M%'; +select id,FirstName,lastname,department,salary from test4 where FirstName in ('Mazojys','Syllauu','Tyoysww'); +select id,FirstName,lastname,department,salary from test4 where Salary between 40000 and 50000; +select sum(salary) from test4 where department = 'Finance'; +select max(salary) from test4 where department = 'Finance'; +select min(salary) from test4 where department = 'Finance'; +select sum(distinct id) from test5; +select sum(all id) from test5; +select id, R_REGIONKEY from test5; +select id,'user is user' from test5; +select id*5,'user is user',10 from test5; +select ALL id, R_REGIONKEY, R_NAME, R_COMMENT from test5; +select DISTINCT id, R_REGIONKEY, R_NAME, R_COMMENT from test5; +select DISTINCTROW id, R_REGIONKEY, R_NAME, R_COMMENT from test5; +select ALL HIGH_PRIORITY id,'ID' as detail from test5; +select id, O_ORDERKEY, O_TOTALPRICE,MYDATE from test8 where id=1; +select id, O_ORDERKEY, O_TOTALPRICE,MYDATE from test8 where id=1 and not id=1; +select id,O_ORDERKEY,O_CUSTKEY,O_TOTALPRICE,MYDATE from test8 where id=1; +select count(*) counts from test8 a where MYDATE is null; +select count(*) counts from test8 a where id is null; +select count(*) counts from test8 a where id is not null; +select count(*) counts from test8 a where not (id is null); +select count(O_ORDERKEY) counts from test8 a where O_ORDERKEY like 'ORDERKEY_00%'; +select count(O_ORDERKEY) counts from test8 a where O_ORDERKEY not like '%00%'; +select sum(O_TOTALPRICE) as sums,O_CUSTKEY,count(O_ORDERKEY) counts from test8 a where O_ORDERKEY<'ORDERKEY_010' and O_CUSTKEY between 'CUSTKEY_002' and 'CUSTKEY_300' group by o_custkey; +select sum(O_TOTALPRICE) as sums,O_CUSTKEY,count(O_ORDERKEY) counts from test8 a where O_ORDERKEY<'ORDERKEY_010' or O_CUSTKEY between 'CUSTKEY_002' and 'CUSTKEY_300' group by o_custkey; +select sum(O_TOTALPRICE) as sums,O_CUSTKEY,count(O_ORDERKEY) counts from test8 a where O_CUSTKEY in ('CUSTKEY_003','CUSTKEY_420','CUSTKEY_980') group by o_custkey; +select sum(O_TOTALPRICE) as sums,count(O_ORDERKEY) counts from test8 a where O_CUSTKEY not in ('CUSTKEY_003','CUSTKEY_420','CUSTKEY_980'); +select O_CUSTKEY,case when sum(O_TOTALPRICE)<100000 then 'D' when sum(O_TOTALPRICE)>100000 and sum(O_TOTALPRICE)<1000000 then 'C' when sum(O_TOTALPRICE)>1000000 and sum(O_TOTALPRICE)<5000000 then 'B' else 'A' end as jibie from test8 a group by O_CUSTKEY order by jibie, O_CUSTKEY limit 10; +select count(*) from test8 where MYDATE between concat(date_format('1992-05-01','%Y-%m'),'-00') and concat(date_format(date_add('1992-05-01',interval 2 month),'%Y-%m'),'-00'); +select id,sum(O_TOTALPRICE) from test8 where id>1 and id<50 group by id; +select id, O_ORDERKEY, O_TOTALPRICE,MYDATE from test8 group by id,O_ORDERKEY,MYDATE; +select count(id) as counts,date_format(MYDATE,'%Y-%m') as mouth,id from test8 where id>1 and id<50 group by 2 asc ,id desc; +select sum(O_TOTALPRICE ) as sums,id from test8 where id>1 and id<50 group by 2 asc having sums>2000000; +select sum(O_TOTALPRICE ) as sums,id from test8 where id>1 and id<50 group by 2 asc having sums>2000000; +select sum(O_TOTALPRICE ) as sums,id,count(O_ORDERKEY) counts from test8 where id>1 and id<50 group by 2 asc having count(O_ORDERKEY)>2; +select sum(O_TOTALPRICE ) as sums,id,count(O_ORDERKEY) counts from test8 where id>1 and id<50 group by 2 asc having min(O_ORDERKEY)>10 and max(O_ORDERKEY)<10000000; +select sum(O_TOTALPRICE ) from test8 where id>1 and id<50 having min(O_ORDERKEY)<10000; +select id,O_ORDERKEY,O_TOTALPRICE from test8 where id>36900 and id<36902 group by O_ORDERKEY having O_ORDERKEY in (select O_ORDERKEY from test8 group by id having sum(id)>10000); +select sum(O_TOTALPRICE) as sums,O_CUSTKEY,count(O_ORDERKEY) counts from test8 a where O_CUSTKEY between 'CUSTKEY_002' and 'CUSTKEY_300' group by o_custkey; +select sum(O_TOTALPRICE) as sums,O_CUSTKEY,count(O_ORDERKEY) counts from test8 a where O_CUSTKEY not between 'CUSTKEY_002' and 'CUSTKEY_300' group by o_custkey; +select sum(O_TOTALPRICE) as sums,O_CUSTKEY,count(O_ORDERKEY) counts from test8 a where not (O_CUSTKEY between 'CUSTKEY_002' and 'CUSTKEY_300') group by o_custkey; +select C_NAME from sbtest.test6 where C_NAME like 'A__A'; +select C_NAME from sbtest.test6 where C_NAME like 'm___i'; +select C_NAME from sbtest.test6 where C_NAME like 'ch___i%%'; +select C_NAME from sbtest.test6 where C_NAME like 'ch___i%%' ESCAPE 'i'; +select count(*) from sbtest.test6 where C_NAME not like 'chen%'; +select count(*) from sbtest.test6 where not (C_NAME like 'chen%'); +select C_NAME from sbtest.test6 where C_NAME like binary 'chen%'; +select C_NAME from sbtest.test6 where C_NAME like 'chen%'; +select C_NAME from sbtest.test6 where C_NAME like concat('%','AM','%'); +select C_NAME from sbtest.test6 where C_NAME like concat('%','en','%'); +select test8.O_ORDERKEY,test8.O_CUSTKEY,C_NAME from test6 CROSS join sbtest.test8 using(id) order by test8.O_ORDERKEY,test8.O_CUSTKEY,C_NAME; +select a.c_CUSTKEY,a.C_NAME,b.O_ORDERKEY from sbtest.test6 as a left join test8 b using(id) where a.C_CUSTKEY<'CUSTKEY_300'; +select a.c_CUSTKEY,a.C_NAME,b.O_ORDERKEY from sbtest.test6 as a left OUTER join test8 b using(id); +select a.c_CUSTKEY,a.C_NAME,b.O_ORDERKEY from test8 b right join sbtest.test6 as a using(id) where a.c_CUSTKEY<'CUSTKEY_300'; +select a.c_CUSTKEY,a.C_NAME,b.O_ORDERKEY from test8 b right join sbtest.test6 as a using(id); +select sum(O_TOTALPRICE) as sums,O_CUSTKEY,count(O_ORDERKEY) counts from test9 where O_CUSTKEY between 'CUSTKEY_013' and 'CUSTKEY_050' group by 2 asc having O_CUSTKEY<(select max(c_custkey) from test7) order by o_custkey; +select sum(O_TOTALPRICE) as sums,O_CUSTKEY,count(O_ORDERKEY) counts,MYDATE from test9 use index (ORDERS_FK1) where O_CUSTKEY between 'CUSTKEY_002' and 'CUSTKEY_300' group by o_custkey; +select sum(O_TOTALPRICE) as sums,O_CUSTKEY,count(O_ORDERKEY) counts from test9 use key (ORDERS_FK1) where O_CUSTKEY between 'CUSTKEY_002' and 'CUSTKEY_800' group by o_custkey; +select sum(O_TOTALPRICE) as sums,O_CUSTKEY,count(O_ORDERKEY) counts from test9 use key (ORDERS_FK1) ignore index (ORDERS_FK1) where O_CUSTKEY between 'CUSTKEY_002' and 'CUSTKEY_800' group by o_custkey; +select sum(O_TOTALPRICE) as sums,O_CUSTKEY,count(O_ORDERKEY) counts from test9 ignore key (ORDERS_FK1) force index (ORDERS_FK1) where O_CUSTKEY between 'CUSTKEY_002' and 'CUSTKEY_300' group by o_custkey; +select sum(O_TOTALPRICE) as sums,O_CUSTKEY,count(O_ORDERKEY) counts from test9 ignore key (ORDERS_FK1) force index (ORDERS_FK1) where O_CUSTKEY between 'CUSTKEY_002' and 'CUSTKEY_300' group by o_custkey; +select sum(O_TOTALPRICE) as sums,O_CUSTKEY,count(O_ORDERKEY) counts from test9 use index for order by (ORDERS_FK1) ignore index for group by (ORDERS_FK1) where O_CUSTKEY between 1 and 50 group by o_custkey; +select sum(O_TOTALPRICE) as sums,O_CUSTKEY,count(O_ORDERKEY) counts from test9 as a use index for group by (ORDERS_FK1) ignore index for join (ORDERS_FK1) where O_CUSTKEY between 'CUSTKEY_002' and 'CUSTKEY_300' group by o_custkey; +select sum(O_TOTALPRICE) as sums,O_CUSTKEY,count(O_ORDERKEY) counts from test9 a use index for join (ORDERS_FK1) ignore index for join (ORDERS_FK1) where O_CUSTKEY between 'CUSTKEY_002' and 'CUSTKEY_300' group by o_custkey; +select O_ORDERKEY,O_CUSTKEY from test9 as a where a.O_CUSTKEY<=(select min(C_CUSTKEY)+1 from test7); +select count(*) from test9 as a where a.id <> all(select id from test7); +select count(*) from test9 as a where 56000< all(select id from test7); +/*comment*/ /*comment*/ select col1 /* this is a comment */ from t; +SELECT /*!40001 SQL_NO_CACHE */ * FROM t WHERE 1 limit 0, 2000; +SELECT * FROM t; +SELECT * FROM t AS u; +SELECT DISTINCT * FROM t; +SELECT DISTINCTROW * FROM t; +SELECT ALL * FROM t; +SELECT id FROM t; +SELECT * FROM t WHERE 1 = 1; +select 1 from t; +select 1 from t limit 1; +select 1 from t where not exists (select 2); +select * from sbtest.t1 where id > 4 and id <=8 order by col1 desc; +select 1 as a from t order by a; +select * from sbtest.t1 where id > 1 order by id desc limit 10; +select * from sbtest.t2 where id < 0; +select 1 as a from t where 1 < any (select 2) order by a; +SELECT * from t for update; +SELECT * from t lock in share mode; +select * from t1 right join t2 on t1.id = t2.id left join t3 on t3.id = t2.id; +select * from t1 right join t2 using (id) left join t3 using (id); +select * from t1 natural join t2; +select * from t1 natural right join t2; +select * from t1 natural left outer join t2; +select * from t1 straight_join t2 on t1.id = t2.id; +select straight_join * from t1 join t2 on t1.id = t2.id; +select straight_join * from t1 left join t2 on t1.id = t2.id; +select straight_join * from t1 right join t2 on t1.id = t2.id; +select straight_join * from t1 straight_join t2 on t1.id = t2.id; +SELECT *, CAST(col1 AS CHAR CHARACTER SET utf8) FROM t; +select max(distinct col1) from t; +select max(distinctrow col1) from t; +select max(distinct all col1) from t; +select max(distinctrow all col1) from t; +select max(col2) from t; +select min(distinct col1) from t; +select min(distinctrow col1) from t; +select min(distinct all col1) from t; +select min(col2) from t; +select sum(distinct col1) from t; +select sum(distinctrow col1) from t; +select sum(distinct all col1) from t; +select sum(distinctrow all col1) from t; +select sum(col2) from t; +select count(col1) from t; +select count(*) from t; +select count(all col1) from t; +select group_concat(col2,col1) from t group by col1; +select group_concat(distinct col2,col1) from t group by col1; +select group_concat(distinctrow col2,col1) from t group by col1; +SELECT col1, GROUP_CONCAT(DISTINCT col2 ORDER BY col2 DESC SEPARATOR ' ') FROM t GROUP BY col1; +select * from t a; +select * from t as a; +select * from t use index (primary); +select * from t use index (`primary`); +select * from t use index (); +select * from t use index (idx1); +select * from t use index (idx1, idx2); +select * from t ignore key (idx1); +select * from t force index for join (idx1); +select * from t use index for order by (idx1); +select * from t force index for group by (idx1); +select high_priority * from t; +select SQL_CACHE * from t; +select * from t; +select col1 from t1 group by col1 order by null; +select col1 from t1 group by col1 order by 1; +select a.id,b.id,b.pad,a.t_id from test1 a,(select all * from sbtest.test2) b where a.t_id=b.o_id; +select a.id,b.id,b.pad,a.t_id from test1 a,(select distinct * from sbtest.test2) b where a.t_id=b.o_id; +select id,o_id,name,pad from (select * from sbtest.test2 a group by a.id) a; +select * from (select pad,count(*) from sbtest.test2 a group by pad) a; +select a.id,b.id,b.pad,a.t_id from test1 a,(select * from sbtest.test2 having pad>3) b where a.t_id=b.o_id; +select a.id,b.id,b.pad,a.t_id from test1 a,(select * from sbtest.test2 where pad>3 order by id) b where a.t_id=b.o_id; +select a.id,b.id,b.pad,a.t_id from test1 a,(select * from sbtest.test2 where pad>3) b where a.t_id=b.o_id; +select pad,count(*) from (select * from test1 where pad>2) a group by pad; +select pad,count(*) from (select * from test1 where pad>2) a group by pad order by pad; +select count(*) from (select pad,count(*) a from test1 group by pad) a; +select a.id,b.id,b.pad,a.t_id from test1 a,(select * from sbtest.test2 where pad>3) b where a.t_id=b.o_id; +select id,pad from test1 where pad=(select pad from test1 where id=2); +select id,t_id,name,pad from test1 where 2 >any(select id from test1 where pad>1); +select id,t_id,name,pad from test1 where 2>all(select id from test1 where pad<1); +select * from (select m.id,n.pad from test1 m,sbtest.test2 n where m.id=n.id AND m.name='test中id为1' and m.pad>7 and m.pad<10)a; + +select a.id,b.id,b.pad,a.t_id from (select id,t_id from test1) a,(select * from sbtest.test2) b where a.t_id=b.o_id; +select co1,co2,co3 from (select id as co1,name as co2,pad as co3 from test1)as tb where co1>1; +select CURRENT_USER FROM test5; diff --git a/tests/e2e/shard/case/join/mycat/mod/show.sql b/tests/e2e/shard/case/join/mycat/mod/show.sql new file mode 100644 index 00000000..83b90b8f --- /dev/null +++ b/tests/e2e/shard/case/join/mycat/mod/show.sql @@ -0,0 +1,54 @@ +# databases +show databases like 'sbtest'; + +# schemas +show schemas; +show open tables; +show open tables from sbtest; +show open tables in sbtest; +show open tables from sbtest like 'aly_o%'; + +# tables +show table status like 'aly_o%'/*allow_diff*/; +show table status/*allow_diff*/; +show tables; +show full tables; +show tables like 'aly_o%'; +show tables from sbtest_0; +show tables in sbtest_0; +show full tables from sbtest_0; +show full tables in sbtest_0; +show full tables from sbtest_0 like 'aly%'; +show full tables in sbtest_0 where table_type like 'base%'; + + +# columns +show columns in t1; +show columns from t1; +show full columns from t1; +show columns from t1 from sbtest_0; +show full columns from t1 from sbtest_0; +show full columns from t1 from sbtest_0 like 'n%'; +show full columns from t1 from sbtest_0 where field like 's%'; + +# index +show index from t1; +show index in t1; +show index from t1 from sbtest_0; +show index in t1 in sbtest_0; +show index in t1 from sbtest_0; +show index from t1 in sbtest_0; + +# keys +show keys from t1; +show keys in t1; +show keys from t1 from sbtest_0; +show keys from t1 in sbtest_0; +show keys in t1 in sbtest_0; +show keys in t1 from sbtest_0; + +# create +show create database sbtest_0; +show create schema sbtest_0; +show create schema if not exists sbtest_0; +show create database if not exists sbtest_0; diff --git a/tests/e2e/shard/case/join/mycat/mod/skip.sql b/tests/e2e/shard/case/join/mycat/mod/skip.sql new file mode 100644 index 00000000..1736b1c3 --- /dev/null +++ b/tests/e2e/shard/case/join/mycat/mod/skip.sql @@ -0,0 +1,57 @@ +SELECT last_insert_id(); + +# databases +show databases; +show databases like 'sbtest'; + +# schemas +show schemas; +show open tables; +show open tables from sbtest; +show open tables in sbtest; +show open tables from sbtest like 'aly_o%'; + +# tables +show table status like 'aly_o%'/*allow_diff*/; +show table status/*allow_diff*/; +show tables; +show full tables; +show tables like 'aly_o%'; +show tables from sbtest; +show tables in sbtest; +show full tables from sbtest; +show full tables in sbtest; +show full tables from sbtest like 'aly%'; +show full tables in sbtest where table_type like 'base%'; + + +# columns +show columns in t1; +show columns from t1; +show full columns from t1; +show columns from t1 from sbtest; +show full columns from t1 from sbtest; +show full columns from t1 from sbtest like 'n%'; +show full columns from t1 from sbtest where field like 's%'; + +# index +show index from t1; +show index in t1; +show index from t1 from sbtest; +show index in t1 in sbtest; +show index in t1 from sbtest; +show index from t1 in sbtest; + +# keys +show keys from t1; +show keys in t1; +show keys from t1 from sbtest; +show keys from t1 in sbtest; +show keys in t1 in sbtest; +show keys in t1 from sbtest; + +# create +show create database sbtest; +show create schema sbtest; +show create schema if not exists sbtest; +show create database if not exists sbtest; diff --git a/tests/e2e/shard/case/join/mycat/mod/unequal.sql b/tests/e2e/shard/case/join/mycat/mod/unequal.sql new file mode 100644 index 00000000..8742e93b --- /dev/null +++ b/tests/e2e/shard/case/join/mycat/mod/unequal.sql @@ -0,0 +1,127 @@ +select test1.id,test1.t_id,test1.name,test1.pad,sbtest.test2.id,sbtest.test2.o_id,sbtest.test2.name,sbtest.test2.pad from test1,sbtest.test2 where test1.pad=sbtest.test2.pad; +select a.id,a.t_id,a.name,a.pad,b.id,b.o_id,b.name,b.pad from test1 a,sbtest.test2 b where a.pad=b.pad; +select a.id,b.id,b.pad,a.t_id from (select test1.id,test1.pad,test1.t_id from test1 join sbtest.test2 where test1.pad=sbtest.test2.pad ) a,(select sbtest.test3.id,sbtest.test3.pad from test1 join sbtest.test3 where test1.pad=sbtest.test3.pad) b where a.pad=b.pad; +select test1.id,test1.name,a.name from test1,(select name from sbtest.test2) a; +select test1.id,test1.t_id,test1.name,test1.pad,test2.id,test2.o_id,test2.name,test2.pad from test1 inner join test2 order by test1.id,test2.id; +select test1.id,test1.t_id,test1.name,test1.pad,test2.id,test2.o_id,test2.name,test2.pad from test1 cross join test2 order by test1.id,test2.id; +select test1.id,test1.t_id,test1.name,test1.pad,test2.id,test2.o_id,test2.name,test2.pad from test1 join test2 order by test1.id,test2.id; +select a.id,a.name,a.pad,b.name from test1 a inner join sbtest.test2 b order by a.id,b.id; +select a.id,a.name,a.pad,b.name from test1 a cross join sbtest.test2 b order by a.id,b.id; +select a.id,a.name,a.pad,b.name from test1 a join sbtest.test2 b order by a.id,b.id; +select a.id,a.t_id,a.name,a.pad,b.id,b.o_id,b.name,b.pad from test1 a inner join (select * from sbtest.test2 where pad>0) b order by a.id,b.id; +select a.id,a.t_id,a.name,a.pad,b.id,b.o_id,b.name,b.pad from test1 a cross join (select * from sbtest.test2 where pad>0) b order by a.id,b.id; +select a.id,a.t_id,a.name,a.pad,b.id,b.o_id,b.name,b.pad from test1 a join (select * from sbtest.test2 where pad>0) b order by a.id,b.id; +select a.id,a.t_id,a.name,a.pad,b.id,b.o_id,b.name,b.pad from (select * from test1 where pad>0) a inner join (select * from sbtest.test2 where pad>0) b order by a.id,b.id; +select a.id,a.t_id,a.name,a.pad,b.id,b.o_id,b.name,b.pad from (select * from test1 where pad>0) a cross join (select * from sbtest.test2 where pad>0) b order by a.id,b.id; +select a.id,a.t_id,a.name,a.pad,b.id,b.o_id,b.name,b.pad from (select * from test1 where pad>0) a join (select * from sbtest.test2 where pad>0) b order by a.id,b.id; +select a.id,a.t_id,a.name,a.pad,b.id,b.o_id,b.name,b.pad from test1 a join (select * from sbtest.test2 where pad>0) b on a.id0) b using(pad) order by a.id,b.id; +select test1.id,test1.t_id,test1.name,test1.pad,sbtest.test2.id,sbtest.test2.o_id,sbtest.test2.name,sbtest.test2.pad from test1 straight_join sbtest.test2 order by test1.id,test2.id; +select a.id,a.name,a.pad,b.name from test1 a straight_join sbtest.test2 b order by a.id,b.id; +select a.id,a.t_id,a.name,a.pad,b.id,b.o_id,b.name,b.pad from test1 a straight_join (select * from sbtest.test2 where pad>0) b order by a.id,b.id; +select a.id,a.t_id,a.name,a.pad,b.id,b.o_id,b.name,b.pad from (select * from test1 where pad>0) a straight_join (select * from sbtest.test2 where pad>0) b order by a.id,b.id; +select a.id,a.t_id,a.name,a.pad,b.id,b.o_id,b.name,b.pad from test1 a straight_join (select * from sbtest.test2 where pad>0) b on a.id2) b on a.pad=b.pad order by a.id,b.id; +select a.id,a.t_id,a.name,a.pad,b.id,b.o_id,b.name,b.pad from test1 a right join (select * from sbtest.test2 where pad>2) b on a.pad=b.pad order by a.id,b.id; +select a.id,a.t_id,a.name,a.pad,b.id,b.o_id,b.name,b.pad from test1 a left outer join (select * from sbtest.test2 where pad>2) b on a.pad=b.pad order by a.id,b.id; +select a.id,a.t_id,a.name,a.pad,b.id,b.o_id,b.name,b.pad from test1 a right outer join (select * from sbtest.test2 where pad>2) b on a.pad=b.pad order by a.id,b.id; +select a.id,a.t_id,a.name,a.pad,b.id,b.o_id,b.name,b.pad from test1 a left join (select * from sbtest.test2 where pad>2) b using(pad) order by a.id,b.id; +select a.id,a.t_id,a.name,a.pad,b.id,b.o_id,b.name,b.pad from (select * from test1 where pad>1) a left join (select * from sbtest.test2 where pad>3) b on a.pad=b.pad order by a.id,b.id; +select a.id,a.t_id,a.name,a.pad,b.id,b.o_id,b.name,b.pad from (select * from test1 where pad>1) a right join (select * from sbtest.test2 where pad>3) b on a.pad=b.pad order by a.id,b.id; +select a.id,a.t_id,a.name,a.pad,b.id,b.o_id,b.name,b.pad from (select * from test1 where pad>1) a left outer join (select * from sbtest.test2 where pad>3) b on a.pad=b.pad order by a.id,b.id; +select a.id,a.t_id,a.name,a.pad,b.id,b.o_id,b.name,b.pad from (select * from test1 where pad>1) a right outer join (select * from sbtest.test2 where pad>3) b on a.pad=b.pad order by a.id,b.id; +select a.id,a.t_id,a.name,a.pad,b.id,b.o_id,b.name,b.pad from (select * from test1 where pad>1) a left join (select * from sbtest.test2 where pad>3) b using(pad) order by a.id,b.id; +select test1.id,test1.t_id,test1.name,test1.pad,sbtest.test2.id,sbtest.test2.o_id,sbtest.test2.name,sbtest.test2.pad from test1 left join sbtest.test2 on test1.pad=sbtest.test2.pad and test1.id>3 order by test1.id,test2.id; +select distinct a.pad from test1 a,sbtest.test2 b where a.pad=b.pad; +select a.id,a.t_id,b.o_id,b.name from (select * from test1 where id<3) a,(select * from sbtest.test2 where id>3) b; +select a.id,b.id,b.pad,a.t_id from test1 a,(select sbtest.test3.id,sbtest.test3.pad from test1 join sbtest.test3 where test1.pad=sbtest.test3.pad) b,(select * from sbtest.test2 where id>3) c where a.pad=b.pad and c.pad=b.pad; +select a.id,a.t_id,a.name,a.pad,b.id,b.o_id,b.name,b.pad from test1 a join sbtest.test2 as b order by a.id,b.id; +select a.id,a.t_id,a.name,a.pad,b.id,b.o_id,b.name,b.pad from test1 a inner join sbtest.test2 b order by a.id,b.id; +select a.id,a.t_id,a.name,a.pad,b.id,b.o_id,b.name,b.pad from test1 a cross join sbtest.test2 b order by a.id,b.id; +select a.id,a.name,a.pad,b.name from test1 a straight_join sbtest.test2 b on a.pad=b.pad; +SELECT Department, COUNT(ID) FROM test4 GROUP BY Department HAVING COUNT(ID)>3; +select id,FirstName,lastname,department,salary from test4 group by Department; +SELECT Department, MIN(Salary) FROM test4 GROUP BY Department HAVING MIN(Salary)>46000; +select Department,count(Salary) as a from test4 group by Department having a=3; +select Department,count(Salary) from test4 group by Department having count(ID) >2; +select Department,count(*) as num from test4 group by Department having count(*) >1; +select Department,count(*) as num from test4 group by Department having count(*) <=3; +select id,FirstName,lastname,department,salary from test4 limit 2,10; +select Department,count(*) as num from test4 group by Department having count(*) >=4 order by Department ASC; +select count(id) as counts,date_format(MYDATE,'%Y-%m') as mouth from test8 where id>1 and id<50 group by 2 asc; +select sum(O_TOTALPRICE) as sums,id from test8 where id>1 and id<50 group by 2 asc; +select C_ORDERKEY,C_CUSTKEY,C_NAME from test1,sbtest.test6 where C_CUSTKEY=c_CUSTKEY and C_ORDERKEY<'ORDERKEY_006'; +select count(*) from (select O_CUSTKEY,count(O_CUSTKEY) as counts from test8 group by O_CUSTKEY) as a where counts<10 group by counts; +select O_ORDERKEY,O_CUSTKEY,C_NAME from test8 join sbtest.test6 on O_CUSTKEY=c_CUSTKEY and O_ORDERKEY<'ORDERKEY_007'; +select O_ORDERKEY,O_CUSTKEY,C_NAME from test8 INNER join sbtest.test6 where O_CUSTKEY=c_CUSTKEY and O_ORDERKEY<'ORDERKEY_007'; +select O_ORDERKEY,O_CUSTKEY,C_NAME from test8 INNER join sbtest.test6 on O_CUSTKEY=c_CUSTKEY and O_ORDERKEY<'ORDERKEY_006'; +select O_ORDERKEY,O_CUSTKEY,C_NAME from test8 CROSS join sbtest.test6 on O_CUSTKEY=c_CUSTKEY and O_ORDERKEY<'ORDERKEY_006'; +select O_ORDERKEY,O_CUSTKEY,C_NAME from sbtest.test6 as a STRAIGHT_JOIN test8 b where b.O_CUSTKEY=a.c_CUSTKEY and O_ORDERKEY<'ORDERKEY_007'; +select b.O_ORDERKEY,b.O_CUSTKEY,a.C_NAME from sbtest.test6 a STRAIGHT_JOIN test8 b on b.O_CUSTKEY=a.c_CUSTKEY and b.O_ORDERKEY<'ORDERKEY_007'; +select a.c_CUSTKEY,a.C_NAME,b.O_ORDERKEY from sbtest.test6 as a left join test8 b on b.O_CUSTKEY=a.C_CUSTKEY and a.C_CUSTKEY<'CUSTKEY_300'; +select a.c_CUSTKEY,a.C_NAME,b.O_ORDERKEY from test8 b right join sbtest.test6 as a on b.O_CUSTKEY=a.C_CUSTKEY and a.c_CUSTKEY<'CUSTKEY_300'; +select sum(O_TOTALPRICE) as sums,O_CUSTKEY,count(O_ORDERKEY) counts from test9 where O_CUSTKEY between 'CUSTKEY_003' and 'CUSTKEY_500' group by 2 asc having sums>400 order by o_custkey; +select sum(O_TOTALPRICE) as sums,O_CUSTKEY,count(O_ORDERKEY) counts from test9 where O_CUSTKEY between 'CUSTKEY_003' and 'CUSTKEY_500' group by 2 asc having sums>400 order by 2; +select sum(O_TOTALPRICE) as sums,O_CUSTKEY,count(O_ORDERKEY) counts from test9 where O_CUSTKEY between 'CUSTKEY_003' and 'CUSTKEY_500' group by 2 asc having sums>400 order by count(O_ORDERKEY), sums; +select sum(O_TOTALPRICE) as sums,O_CUSTKEY,count(O_ORDERKEY) counts from test9 where O_CUSTKEY between 'CUSTKEY_003' and 'CUSTKEY_500' group by 2 asc having sums>400 order by counts asc,2 desc; +select sum(O_TOTALPRICE) as sums,O_CUSTKEY,count(O_ORDERKEY) counts from test9 where O_CUSTKEY between 'CUSTKEY_002' and 'CUSTKEY_050' group by 2 asc having O_CUSTKEY<(select max(c_custkey) from test7) order by 2; +select sum(O_TOTALPRICE) as sums,O_CUSTKEY,count(O_ORDERKEY) counts from test9 where O_CUSTKEY between 'CUSTKEY_002' and 'CUSTKEY_050' group by 2 asc having O_CUSTKEY<(select max(c_custkey) from test7) order by count(O_ORDERKEY); +select sum(O_TOTALPRICE) as sums,O_CUSTKEY,count(O_ORDERKEY) counts from test9 where O_CUSTKEY between 'CUSTKEY_002' and 'CUSTKEY_050' group by 2 asc having O_CUSTKEY<(select max(c_custkey) from test7) order by counts asc,2 desc; +select sum(O_TOTALPRICE) as sums,O_CUSTKEY,count(O_ORDERKEY) counts from test9 where O_CUSTKEY between 'CUSTKEY_003' and 'CUSTKEY_500' group by 2 asc having sums>400 order by count(O_ORDERKEY) asc,2 desc limit 2; +select sum(O_TOTALPRICE) as sums,O_CUSTKEY,count(O_ORDERKEY) counts from test9 where O_CUSTKEY between 'CUSTKEY_003' and 'CUSTKEY_500' group by 2 asc having sums>400 order by count(O_ORDERKEY) asc,O_CUSTKEY desc limit 1,3; +select sum(O_TOTALPRICE) as sums,O_CUSTKEY,count(O_ORDERKEY) counts from test9 where O_CUSTKEY between 'CUSTKEY_003' and 'CUSTKEY_500' group by 2 asc having sums>400 order by count(O_ORDERKEY) asc,O_CUSTKEY desc limit 10 offset 1; +select sum(O_TOTALPRICE) as sums,O_CUSTKEY,count(O_ORDERKEY) counts from test9 where O_CUSTKEY between 'CUSTKEY_002' and 'CUSTKEY_050' group by 2 asc having O_CUSTKEY<(select max(c_custkey) from test7) order by count(O_ORDERKEY) asc,2 desc limit 10; +select sum(O_TOTALPRICE) as sums,O_CUSTKEY,count(O_ORDERKEY) counts from test9 where O_CUSTKEY between 'CUSTKEY_002' and 'CUSTKEY_050' group by 2 asc having O_CUSTKEY<(select max(c_custkey) from test7) order by count(O_ORDERKEY) asc,O_CUSTKEY desc limit 1,10; +select sum(O_TOTALPRICE) as sums,O_CUSTKEY,count(O_ORDERKEY) counts from test9 where O_CUSTKEY between 'CUSTKEY_002' and 'CUSTKEY_050' group by 2 asc having O_CUSTKEY<(select max(c_custkey) from test7) order by count(O_ORDERKEY) asc,O_CUSTKEY desc limit 10 offset 1; +select a.c_CUSTKEY,a.C_NAME,b.O_ORDERKEY from sbtest.test7 as a left join test9 b ignore index for join(ORDERS_FK1) on b.O_CUSTKEY=a.c_CUSTKEY and a.c_CUSTKEY<'CUSTKEY_300'; +select a.c_CUSTKEY,a.C_NAME,b.O_ORDERKEY from sbtest.test7 as a force index for join(primary) left join test9 b ignore index for join(ORDERS_FK1) on b.O_CUSTKEY=a.c_CUSTKEY and a.c_CUSTKEY<'CUSTKEY_300'; +select UPPER((select C_NAME FROM test7 limit 1)) FROM test7 limit 1; +select O_ORDERKEY,O_CUSTKEY from test9 as a where a.O_CUSTKEY=(select min(C_CUSTKEY) from test7); +select O_ORDERKEY,O_CUSTKEY from test9 as a where a.O_CUSTKEY<=(select min(C_CUSTKEY) from test7); +select count(*) from sbtest.test7 as a where a.c_CUSTKEY=(select max(C_CUSTKEY) from test9 where C_CUSTKEY=a.C_CUSTKEY); +select C_CUSTKEY from sbtest.test7 as a where (select count(*) from test9 where O_CUSTKEY=a.C_CUSTKEY)=2; +select count(*) from sbtest.test7 as a where 2>all(select count(*) from test9 where O_CUSTKEY=C_CUSTKEY); +select id,O_CUSTKEY,O_ORDERKEY,O_TOTALPRICE from test9 a where (a.O_ORDERKEY,O_CUSTKEY)=(select c_ORDERKEY,c_CUSTKEY from test7 where c_name='yanglu'); +SELECT /*+ MAX_EXECUTION_TIME(1000) */ * FROM t1 INNER JOIN t2 where t1.col1 = t2.col1; +SELECT * FROM t1, t2; +SELECT * FROM t1 AS u, t2; +SELECT * FROM t1, t2 AS u; +SELECT * FROM t1 AS u, t2 AS v; +SELECT * FROM t, t1, t2; +SELECT * from t1, t2, t3; +select * from t1 join t2 left join t3 on t2.id = t3.id; +select count(distinct col1, col2) from t; +select count(distinctrow col1, col2) from t; +select group_concat(col2,col1 SEPARATOR ';') from t group by col1; +select * from t full, t1 `row`, t2 abs; +select * from t use index for group by (idx1) use index for order by (idx2), t2; +select col2,col1 from t group by col1 with rollup; +select coalesce(col1,'ALL'),col2,col1 from t group by col1 with rollup; +select a.id,b.id,b.pad,a.t_id from test1 a,(select * from sbtest.test2 order by id limit 3) b where a.t_id=b.o_id; +select a.id,b.id,b.pad,a.t_id from test1 a,(select * from sbtest.test2 order by id limit 3) b where a.t_id=b.o_id limit 2; +select * from (select sbtest.test3.pad from test1 left join sbtest.test3 on test1.pad=sbtest.test3.pad) a; +select id,pad from test1 where pad>(select pad from test1 where id=2); +select id,pad from test1 where pad<(select pad from test1 where id=2); +select id,pad from test1 where pad>=(select pad from test1 where id=2); +select id,pad from test1 where pad<=(select pad from test1 where id=2); +select id,pad from test1 where pad<>(select pad from test1 where id=2); +select id,pad from test1 where pad !=(select pad from test1 where id=2); +select id,t_id,name,pad from test1 where exists(select * from test1 where pad>1); +select id,t_id,name,pad from test1 where not exists(select * from test1 where pad>1); +select id,t_id,name,pad from test1 where pad=some(select id from test1 where pad>1); +select id,t_id,name,pad from test1 where pad=any(select id from test1 where pad>1); +select id,t_id,name,pad from test1 where pad !=any(select id from test1 where pad=3); +select a.id,b.id,b.pad,a.t_id from (select test1.id,test1.pad,test1.t_id from test1 join sbtest.test3 where test1.pad=sbtest.test3.pad ) a,(select sbtest.test2.id,sbtest.test2.pad from test1 join sbtest.test2 where test1.pad=sbtest.test2.pad) b where a.pad=b.pad; +select id,t_id,name,pad from test1 where pad>(select pad from test1 where pad=2); +select (select name from test1 limit 1); +select id,t_id,name,pad from test1 where 2<>some(select id from test1 where pad>1); diff --git a/tests/e2e/shard/case/join/mycat/mod/unsupport.sql b/tests/e2e/shard/case/join/mycat/mod/unsupport.sql new file mode 100644 index 00000000..8b137891 --- /dev/null +++ b/tests/e2e/shard/case/join/mycat/mod/unsupport.sql @@ -0,0 +1 @@ + diff --git a/tests/e2e/shard/case/join/mycat/murmur/equal.sql b/tests/e2e/shard/case/join/mycat/murmur/equal.sql new file mode 100644 index 00000000..ee35d8e1 --- /dev/null +++ b/tests/e2e/shard/case/join/mycat/murmur/equal.sql @@ -0,0 +1,247 @@ +select a.id,b.id,b.pad,a.t_id from test1 a,(select * from sbtest.test2 where pad>3) b where a.t_id=b.o_id; +select test1.id,test1.t_id,test1.name,test1.pad,sbtest.test2.id,sbtest.test2.o_id,sbtest.test2.name,sbtest.test2.pad from test1 natural left join sbtest.test2; +select test1.id,test1.t_id,test1.name,test1.pad,sbtest.test2.id,sbtest.test2.o_id,sbtest.test2.name,sbtest.test2.pad from test1 natural right join sbtest.test2; +select test1.id,test1.t_id,test1.name,test1.pad,sbtest.test2.id,sbtest.test2.o_id,sbtest.test2.name,sbtest.test2.pad from test1 natural left outer join sbtest.test2; +select test1.id,test1.t_id,test1.name,test1.pad,sbtest.test2.id,sbtest.test2.o_id,sbtest.test2.name,sbtest.test2.pad from test1 natural right outer join sbtest.test2; +select a.id,a.t_id,a.name,a.pad,b.id,b.o_id,b.name,b.pad from test1 a natural left join sbtest.test2 b order by a.id; +select a.id,a.t_id,a.name,a.pad,b.id,b.o_id,b.name,b.pad from test1 a natural right join sbtest.test2 b order by b.id; +select a.id,a.t_id,a.name,a.pad,b.id,b.o_id,b.name,b.pad from test1 a natural left outer join sbtest.test2 b order by a.id; +select a.id,a.t_id,a.name,a.pad,b.id,b.o_id,b.name,b.pad from test1 a natural right outer join sbtest.test2 b order by b.id; +select a.id,a.t_id,a.name,a.pad,b.id,b.o_id,b.name,b.pad from test1 a natural left join (select * from sbtest.test2 where pad>2) b order by a.id,b.id; +select a.id,a.t_id,a.name,a.pad,b.id,b.o_id,b.name,b.pad from test1 a natural right join (select * from sbtest.test2 where pad>2) b order by a.id,b.id; +select a.id,a.t_id,a.name,a.pad,b.id,b.o_id,b.name,b.pad from test1 a natural left outer join (select * from sbtest.test2 where pad>2) b order by a.id,b.id; +select a.id,a.t_id,a.name,a.pad,b.id,b.o_id,b.name,b.pad from test1 a natural right outer join (select * from sbtest.test2 where pad>2) b order by a.id,b.id; +select a.id,a.t_id,a.name,a.pad,b.id,b.o_id,b.name,b.pad from (select * from test1 where pad>1) a natural left join (select * from sbtest.test2 where pad>3) b order by a.id,b.id; +select a.id,a.t_id,a.name,a.pad,b.id,b.o_id,b.name,b.pad from (select * from test1 where pad>1) a natural right join (select * from sbtest.test2 where pad>3) b order by a.id,b.id; +select a.id,a.t_id,a.name,a.pad,b.id,b.o_id,b.name,b.pad from (select * from test1 where pad>1) a natural left outer join (select * from sbtest.test2 where pad>3) b order by a.id,b.id; +select a.id,a.t_id,a.name,a.pad,b.id,b.o_id,b.name,b.pad from (select * from test1 where pad>1) a natural right outer join (select * from sbtest.test2 where pad>3) b order by a.id,b.id; +select distinct b.pad,a.pad from test1 a,(select * from sbtest.test2 where pad=1) b where a.t_id=b.o_id; +select count(distinct id),sum(distinct name) from test1 where id=3 or id=7; +select id,FirstName,lastname,department,salary from test4 use index(ID_index) where Department ='Finance'; +select id,FirstName,lastname,department,salary from test4 force index(ID_index) where ID= 205; +SELECT FirstName, LastName,Department = CASE Department WHEN 'F' THEN 'Financial' WHEN 'D' THEN 'Development' ELSE 'Other' END FROM test4; +select id,FirstName,lastname,department,salary from test4 where Salary >'40000' and Salary <'70000' and Department ='Finance'; +SELECT count(*), Department FROM (SELECT * FROM test4 ORDER BY FirstName DESC) AS Actions GROUP BY Department ORDER BY ID DESC; +select id,FirstName,lastname,department,salary from test4 order by ID ASC; +SELECT Department, MIN(Salary) FROM test4 GROUP BY Department HAVING MIN(Salary)>46000; +select Department,max(Salary) from test4 group by Department order by Department asc; +select Department,min(Salary) from test4 group by Department order by Department asc; +select Department,sum(Salary) from test4 group by Department order by Department asc; +select ID,Department,Salary from test4 order by 2,3; +select id,FirstName,lastname,department,salary from test4 order by Department ,ID desc; +SELECT Department, COUNT(Salary) FROM test4 GROUP BY Department; +SELECT Department, COUNT(Salary) FROM test4 GROUP BY Department DESC; +select Department,count(Salary) as a from test4 group by Department having a>0; +select Department from test4 having Department >3; +select Department from test4 where Department >0; +select Department,max(salary) from test4 group by Department having max(salary) >10; +select 12 as Department, Department from test4 group by Department; +select max(salary) from test4 group by department order by department asc; +select min(salary) from test4 group by department order by department asc; +select sum(salary) from test4 group by department order by department asc; +select count(salary) from test4 group by department order by department asc; +select Department,sum(Salary) a from test4 group by Department having a >=1 order by Department DESC; +select FirstName,LastName,Department,ABS(salary) from test4 order by Department; +select FirstName,LastName,Department,ACOS(salary) from test4 order by Department; +select FirstName,LastName,Department,ASIN(salary) from test4 order by Department; +select FirstName,LastName,Department,ATAN(salary) from test4 order by Department; +select FirstName,LastName,Department,ATAN(salary,100) from test4 order by Department; +select FirstName,LastName,Department,ATAN2(salary,100) from test4 order by Department; +select FirstName,LastName,Department,CEIL(salary) from test4 order by Department; +select FirstName,LastName,Department,CEILING(salary) from test4 order by Department; +select FirstName,LastName,Department,COT(salary) from test4 order by Department; +select FirstName,LastName,Department,CRC32(Department) from test4 order by Department; +select FirstName,LastName,Department,FLOOR(salary) from test4 order by Department; +select FirstName,LN(FirstName),LastName,Department from test4 order by Department; +select FirstName,LastName,Department,LOG(salary) from test4 order by Department; +select FirstName,LastName,Department,LOG2(salary) from test4 order by Department; +select FirstName,LastName,Department,LOG10(salary) from test4 order by Department; +select FirstName,LastName,Department,MOD(salary,2) from test4 order by Department; +select FirstName,LastName,Department,RADIANS(salary) from test4 order by Department; +select FirstName,LastName,Department,ROUND(salary) from test4 order by Department; +select FirstName,LastName,Department,SIGN(salary) from test4 order by Department; +select FirstName,LastName,Department,SIN(salary) from test4 order by Department; +select FirstName,LastName,Department,SQRT(salary) from test4 order by Department; +select FirstName,LastName,Department,TAN(salary) from test4 order by Department; +select FirstName,LastName,Department,TRUNCATE(salary,1) from test4 order by Department; +select FirstName,LastName,Department,TRUNCATE(salary*100,0) from test4 order by Department; +select FirstName,LastName,Department,SIN(salary) from test4 order by Department; +select id,FirstName,lastname,department,salary from test4 where Department is Null; +select id,FirstName,lastname,department,salary from test4 where Department is not Null; +select id,FirstName,lastname,department,salary from test4 where NOT (ID < 200); +select id,FirstName,lastname,department,salary from test4 where ID <300; +select id,FirstName,lastname,department,salary from test4 where ID <1; +select id,FirstName,lastname,department,salary from test4 where ID <> 0; +select id,FirstName,lastname,department,salary from test4 where ID <> 0 and ID <=1; +select id,FirstName,lastname,department,salary from test4 where ID >=205; +select id,FirstName,lastname,department,salary from test4 where ID <=205; +select id,FirstName,lastname,department,salary from test4 where ID >=205 and ID <=205; +select id,FirstName,lastname,department,salary from test4 where ID >1 and ID <=203; +select id,FirstName,lastname,department,salary from test4 where ID >=1 and ID=205; +select id,FirstName,lastname,department,salary from test4 where ID=(ID>>1)<<1; +select id,FirstName,lastname,department,salary from test4 where ID&1; +select id,FirstName,lastname,department,salary from test4 where Salary >'40000' and Salary <'70000' and Department ='Finance' order by Salary ASC; +select id,FirstName,lastname,department,salary from test4 where (Salary >'50000' and Salary <'70000') or Department ='Finance' order by Salary ASC; +select id,FirstName,lastname,department,salary from test4 where FirstName like 'J%'; +select count(*) FROM test4 WHERE Salary is null or FirstName not like '%M%'; +select id,FirstName,lastname,department,salary from test4 where FirstName in ('Mazojys','Syllauu','Tyoysww'); +select id,FirstName,lastname,department,salary from test4 where Salary between 40000 and 50000; +select sum(salary) from test4 where department = 'Finance'; +select max(salary) from test4 where department = 'Finance'; +select min(salary) from test4 where department = 'Finance'; +select sum(distinct id) from test5; +select sum(all id) from test5; +select id, R_REGIONKEY from test5; +select id,'user is user' from test5; +select id*5,'user is user',10 from test5; +select ALL id, R_REGIONKEY, R_NAME, R_COMMENT from test5; +select DISTINCT id, R_REGIONKEY, R_NAME, R_COMMENT from test5; +select DISTINCTROW id, R_REGIONKEY, R_NAME, R_COMMENT from test5; +select ALL HIGH_PRIORITY id,'ID' as detail from test5; +select id, O_ORDERKEY, O_TOTALPRICE,MYDATE from test8 where id=1; +select id, O_ORDERKEY, O_TOTALPRICE,MYDATE from test8 where id=1 and not id=1; +select id,O_ORDERKEY,O_CUSTKEY,O_TOTALPRICE,MYDATE from test8 where id=1; +select count(*) counts from test8 a where MYDATE is null; +select count(*) counts from test8 a where id is null; +select count(*) counts from test8 a where id is not null; +select count(*) counts from test8 a where not (id is null); +select count(O_ORDERKEY) counts from test8 a where O_ORDERKEY like 'ORDERKEY_00%'; +select count(O_ORDERKEY) counts from test8 a where O_ORDERKEY not like '%00%'; +select sum(O_TOTALPRICE) as sums,O_CUSTKEY,count(O_ORDERKEY) counts from test8 a where O_ORDERKEY<'ORDERKEY_010' and O_CUSTKEY between 'CUSTKEY_002' and 'CUSTKEY_300' group by o_custkey; +select sum(O_TOTALPRICE) as sums,O_CUSTKEY,count(O_ORDERKEY) counts from test8 a where O_ORDERKEY<'ORDERKEY_010' or O_CUSTKEY between 'CUSTKEY_002' and 'CUSTKEY_300' group by o_custkey; +select sum(O_TOTALPRICE) as sums,O_CUSTKEY,count(O_ORDERKEY) counts from test8 a where O_CUSTKEY in ('CUSTKEY_003','CUSTKEY_420','CUSTKEY_980') group by o_custkey; +select sum(O_TOTALPRICE) as sums,count(O_ORDERKEY) counts from test8 a where O_CUSTKEY not in ('CUSTKEY_003','CUSTKEY_420','CUSTKEY_980'); +select O_CUSTKEY,case when sum(O_TOTALPRICE)<100000 then 'D' when sum(O_TOTALPRICE)>100000 and sum(O_TOTALPRICE)<1000000 then 'C' when sum(O_TOTALPRICE)>1000000 and sum(O_TOTALPRICE)<5000000 then 'B' else 'A' end as jibie from test8 a group by O_CUSTKEY order by jibie, O_CUSTKEY limit 10; +select count(*) from test8 where MYDATE between concat(date_format('1992-05-01','%Y-%m'),'-00') and concat(date_format(date_add('1992-05-01',interval 2 month),'%Y-%m'),'-00'); +select id,sum(O_TOTALPRICE) from test8 where id>1 and id<50 group by id; +select id, O_ORDERKEY, O_TOTALPRICE,MYDATE from test8 group by id,O_ORDERKEY,MYDATE; +select count(id) as counts,date_format(MYDATE,'%Y-%m') as mouth,id from test8 where id>1 and id<50 group by 2 asc ,id desc; +select sum(O_TOTALPRICE ) as sums,id from test8 where id>1 and id<50 group by 2 asc having sums>2000000; +select sum(O_TOTALPRICE ) as sums,id from test8 where id>1 and id<50 group by 2 asc having sums>2000000; +select sum(O_TOTALPRICE ) as sums,id,count(O_ORDERKEY) counts from test8 where id>1 and id<50 group by 2 asc having count(O_ORDERKEY)>2; +select sum(O_TOTALPRICE ) as sums,id,count(O_ORDERKEY) counts from test8 where id>1 and id<50 group by 2 asc having min(O_ORDERKEY)>10 and max(O_ORDERKEY)<10000000; +select sum(O_TOTALPRICE ) from test8 where id>1 and id<50 having min(O_ORDERKEY)<10000; +select id,O_ORDERKEY,O_TOTALPRICE from test8 where id>36900 and id<36902 group by O_ORDERKEY having O_ORDERKEY in (select O_ORDERKEY from test8 group by id having sum(id)>10000); +select sum(O_TOTALPRICE) as sums,O_CUSTKEY,count(O_ORDERKEY) counts from test8 a where O_CUSTKEY between 'CUSTKEY_002' and 'CUSTKEY_300' group by o_custkey; +select sum(O_TOTALPRICE) as sums,O_CUSTKEY,count(O_ORDERKEY) counts from test8 a where O_CUSTKEY not between 'CUSTKEY_002' and 'CUSTKEY_300' group by o_custkey; +select sum(O_TOTALPRICE) as sums,O_CUSTKEY,count(O_ORDERKEY) counts from test8 a where not (O_CUSTKEY between 'CUSTKEY_002' and 'CUSTKEY_300') group by o_custkey; +select C_NAME from sbtest.test6 where C_NAME like 'A__A'; +select C_NAME from sbtest.test6 where C_NAME like 'm___i'; +select C_NAME from sbtest.test6 where C_NAME like 'ch___i%%'; +select C_NAME from sbtest.test6 where C_NAME like 'ch___i%%' ESCAPE 'i'; +select count(*) from sbtest.test6 where C_NAME not like 'chen%'; +select count(*) from sbtest.test6 where not (C_NAME like 'chen%'); +select C_NAME from sbtest.test6 where C_NAME like binary 'chen%'; +select C_NAME from sbtest.test6 where C_NAME like 'chen%'; +select C_NAME from sbtest.test6 where C_NAME like concat('%','AM','%'); +select C_NAME from sbtest.test6 where C_NAME like concat('%','en','%'); +select count(*) from (select O_CUSTKEY,count(O_CUSTKEY) as counts from test8 group by O_CUSTKEY) as a where counts<10 group by counts; +select test8.O_ORDERKEY,test8.O_CUSTKEY,C_NAME from test6 CROSS join sbtest.test8 using(id) order by test8.O_ORDERKEY,test8.O_CUSTKEY,C_NAME; +select a.c_CUSTKEY,a.C_NAME,b.O_ORDERKEY from sbtest.test6 as a left join test8 b using(id) where a.C_CUSTKEY<'CUSTKEY_300'; +select a.c_CUSTKEY,a.C_NAME,b.O_ORDERKEY from sbtest.test6 as a left OUTER join test8 b using(id); +select a.c_CUSTKEY,a.C_NAME,b.O_ORDERKEY from test8 b right join sbtest.test6 as a using(id) where a.c_CUSTKEY<'CUSTKEY_300'; +select a.c_CUSTKEY,a.C_NAME,b.O_ORDERKEY from test8 b right join sbtest.test6 as a using(id); +select sum(O_TOTALPRICE) as sums,O_CUSTKEY,count(O_ORDERKEY) counts from test9 where O_CUSTKEY between 'CUSTKEY_013' and 'CUSTKEY_050' group by 2 asc having O_CUSTKEY<(select max(c_custkey) from test7) order by o_custkey; +select sum(O_TOTALPRICE) as sums,O_CUSTKEY,count(O_ORDERKEY) counts,MYDATE from test9 use index (ORDERS_FK1) where O_CUSTKEY between 'CUSTKEY_002' and 'CUSTKEY_300' group by o_custkey; +select sum(O_TOTALPRICE) as sums,O_CUSTKEY,count(O_ORDERKEY) counts from test9 use key (ORDERS_FK1) where O_CUSTKEY between 'CUSTKEY_002' and 'CUSTKEY_800' group by o_custkey; +select sum(O_TOTALPRICE) as sums,O_CUSTKEY,count(O_ORDERKEY) counts from test9 use key (ORDERS_FK1) ignore index (ORDERS_FK1) where O_CUSTKEY between 'CUSTKEY_002' and 'CUSTKEY_800' group by o_custkey; +select sum(O_TOTALPRICE) as sums,O_CUSTKEY,count(O_ORDERKEY) counts from test9 ignore key (ORDERS_FK1) force index (ORDERS_FK1) where O_CUSTKEY between 'CUSTKEY_002' and 'CUSTKEY_300' group by o_custkey; +select sum(O_TOTALPRICE) as sums,O_CUSTKEY,count(O_ORDERKEY) counts from test9 ignore key (ORDERS_FK1) force index (ORDERS_FK1) where O_CUSTKEY between 'CUSTKEY_002' and 'CUSTKEY_300' group by o_custkey; +select sum(O_TOTALPRICE) as sums,O_CUSTKEY,count(O_ORDERKEY) counts from test9 use index for order by (ORDERS_FK1) ignore index for group by (ORDERS_FK1) where O_CUSTKEY between 1 and 50 group by o_custkey; +select sum(O_TOTALPRICE) as sums,O_CUSTKEY,count(O_ORDERKEY) counts from test9 as a use index for group by (ORDERS_FK1) ignore index for join (ORDERS_FK1) where O_CUSTKEY between 'CUSTKEY_002' and 'CUSTKEY_300' group by o_custkey; +select sum(O_TOTALPRICE) as sums,O_CUSTKEY,count(O_ORDERKEY) counts from test9 a use index for join (ORDERS_FK1) ignore index for join (ORDERS_FK1) where O_CUSTKEY between 'CUSTKEY_002' and 'CUSTKEY_300' group by o_custkey; +select O_ORDERKEY,O_CUSTKEY from test9 as a where a.O_CUSTKEY=(select min(C_CUSTKEY) from test7); +select O_ORDERKEY,O_CUSTKEY from test9 as a where a.O_CUSTKEY<=(select min(C_CUSTKEY)+1 from test7); +select C_CUSTKEY from sbtest.test7 as a where (select count(*) from test9 where O_CUSTKEY=a.C_CUSTKEY)=2; +select count(*) from test9 as a where a.id <> all(select id from test7); +select count(*) from test9 as a where 56000< all(select id from test7); +select count(*) from sbtest.test7 as a where 2>all(select count(*) from test9 where O_CUSTKEY=C_CUSTKEY); +/*comment*/ /*comment*/ select col1 /* this is a comment */ from t; +SELECT /*!40001 SQL_NO_CACHE */ * FROM t WHERE 1 limit 0, 2000; +SELECT * FROM t; +SELECT * FROM t AS u; +SELECT DISTINCT * FROM t; +SELECT DISTINCTROW * FROM t; +SELECT ALL * FROM t; +SELECT id FROM t; +SELECT * FROM t WHERE 1 = 1; +select 1 from t; +select 1 from t limit 1; +select 1 from t where not exists (select 2); +select * from sbtest.t1 where id > 4 and id <=8 order by col1 desc; +select 1 as a from t order by a; +select * from sbtest.t1 where id > 1 order by id desc limit 10; +select * from sbtest.t2 where id < 0; +select 1 as a from t where 1 < any (select 2) order by a; +SELECT * from t for update; +SELECT * from t lock in share mode; +select * from t1 right join t2 on t1.id = t2.id left join t3 on t3.id = t2.id; +select * from t1 right join t2 using (id) left join t3 using (id); +select * from t1 natural join t2; +select * from t1 natural right join t2; +select * from t1 natural left outer join t2; +select * from t1 straight_join t2 on t1.id = t2.id; +select straight_join * from t1 join t2 on t1.id = t2.id; +select straight_join * from t1 left join t2 on t1.id = t2.id; +select straight_join * from t1 right join t2 on t1.id = t2.id; +select straight_join * from t1 straight_join t2 on t1.id = t2.id; +SELECT *, CAST(col1 AS CHAR CHARACTER SET utf8) FROM t; +select max(distinct col1) from t; +select max(distinctrow col1) from t; +select max(distinct all col1) from t; +select max(distinctrow all col1) from t; +select max(col2) from t; +select min(distinct col1) from t; +select min(distinctrow col1) from t; +select min(distinct all col1) from t; +select min(col2) from t; +select sum(distinct col1) from t; +select sum(distinctrow col1) from t; +select sum(distinct all col1) from t; +select sum(distinctrow all col1) from t; +select sum(col2) from t; +select count(col1) from t; +select count(*) from t; +select count(all col1) from t; +select group_concat(col2,col1) from t group by col1; +select group_concat(distinct col2,col1) from t group by col1; +select group_concat(distinctrow col2,col1) from t group by col1; +SELECT col1, GROUP_CONCAT(DISTINCT col2 ORDER BY col2 DESC SEPARATOR ' ') FROM t GROUP BY col1; +select * from t a; +select * from t as a; +select * from t use index (primary); +select * from t use index (`primary`); +select * from t use index (); +select * from t use index (idx1); +select * from t use index (idx1, idx2); +select * from t ignore key (idx1); +select * from t force index for join (idx1); +select * from t use index for order by (idx1); +select * from t force index for group by (idx1); +select high_priority * from t; +select SQL_CACHE * from t; +select * from t; +select col2,col1 from t group by col1 with rollup; +select coalesce(col1,'ALL'),col2,col1 from t group by col1 with rollup; +select col1 from t1 group by col1 order by null; +select col1 from t1 group by col1 order by 1; +select a.id,b.id,b.pad,a.t_id from test1 a,(select all * from sbtest.test2) b where a.t_id=b.o_id; +select a.id,b.id,b.pad,a.t_id from test1 a,(select distinct * from sbtest.test2) b where a.t_id=b.o_id; +select id,o_id,name,pad from (select * from sbtest.test2 a group by a.id) a; +select a.id,b.id,b.pad,a.t_id from test1 a,(select * from sbtest.test2 having pad>3) b where a.t_id=b.o_id; +select a.id,b.id,b.pad,a.t_id from test1 a,(select * from sbtest.test2 where pad>3 order by id) b where a.t_id=b.o_id; +select a.id,b.id,b.pad,a.t_id from test1 a,(select * from sbtest.test2 where pad>3) b where a.t_id=b.o_id; +select pad,count(*) from (select * from test1 where pad>2) a group by pad; +select pad,count(*) from (select * from test1 where pad>2) a group by pad order by pad; +select a.id,b.id,b.pad,a.t_id from test1 a,(select * from sbtest.test2 where pad>3) b where a.t_id=b.o_id; +select id,pad from test1 where pad=(select pad from test1 where id=2); +select id,t_id,name,pad from test1 where exists(select * from test1 where pad>1); +select id,t_id,name,pad from test1 where not exists(select * from test1 where pad>1); +select id,t_id,name,pad from test1 where 2 >any(select id from test1 where pad>1); +select id,t_id,name,pad from test1 where 2<>some(select id from test1 where pad>1); +select id,t_id,name,pad from test1 where 2>all(select id from test1 where pad<1); +select * from (select m.id,n.pad from test1 m,sbtest.test2 n where m.id=n.id AND m.name='test中id为1' and m.pad>7 and m.pad<10)a; + +select a.id,b.id,b.pad,a.t_id from (select id,t_id from test1) a,(select * from sbtest.test2) b where a.t_id=b.o_id; +select co1,co2,co3 from (select id as co1,name as co2,pad as co3 from test1)as tb where co1>1; +select CURRENT_USER FROM test5; diff --git a/tests/e2e/shard/case/join/mycat/murmur/show.sql b/tests/e2e/shard/case/join/mycat/murmur/show.sql new file mode 100644 index 00000000..83b90b8f --- /dev/null +++ b/tests/e2e/shard/case/join/mycat/murmur/show.sql @@ -0,0 +1,54 @@ +# databases +show databases like 'sbtest'; + +# schemas +show schemas; +show open tables; +show open tables from sbtest; +show open tables in sbtest; +show open tables from sbtest like 'aly_o%'; + +# tables +show table status like 'aly_o%'/*allow_diff*/; +show table status/*allow_diff*/; +show tables; +show full tables; +show tables like 'aly_o%'; +show tables from sbtest_0; +show tables in sbtest_0; +show full tables from sbtest_0; +show full tables in sbtest_0; +show full tables from sbtest_0 like 'aly%'; +show full tables in sbtest_0 where table_type like 'base%'; + + +# columns +show columns in t1; +show columns from t1; +show full columns from t1; +show columns from t1 from sbtest_0; +show full columns from t1 from sbtest_0; +show full columns from t1 from sbtest_0 like 'n%'; +show full columns from t1 from sbtest_0 where field like 's%'; + +# index +show index from t1; +show index in t1; +show index from t1 from sbtest_0; +show index in t1 in sbtest_0; +show index in t1 from sbtest_0; +show index from t1 in sbtest_0; + +# keys +show keys from t1; +show keys in t1; +show keys from t1 from sbtest_0; +show keys from t1 in sbtest_0; +show keys in t1 in sbtest_0; +show keys in t1 from sbtest_0; + +# create +show create database sbtest_0; +show create schema sbtest_0; +show create schema if not exists sbtest_0; +show create database if not exists sbtest_0; diff --git a/tests/e2e/shard/case/join/mycat/murmur/skip.sql b/tests/e2e/shard/case/join/mycat/murmur/skip.sql new file mode 100644 index 00000000..1736b1c3 --- /dev/null +++ b/tests/e2e/shard/case/join/mycat/murmur/skip.sql @@ -0,0 +1,57 @@ +SELECT last_insert_id(); + +# databases +show databases; +show databases like 'sbtest'; + +# schemas +show schemas; +show open tables; +show open tables from sbtest; +show open tables in sbtest; +show open tables from sbtest like 'aly_o%'; + +# tables +show table status like 'aly_o%'/*allow_diff*/; +show table status/*allow_diff*/; +show tables; +show full tables; +show tables like 'aly_o%'; +show tables from sbtest; +show tables in sbtest; +show full tables from sbtest; +show full tables in sbtest; +show full tables from sbtest like 'aly%'; +show full tables in sbtest where table_type like 'base%'; + + +# columns +show columns in t1; +show columns from t1; +show full columns from t1; +show columns from t1 from sbtest; +show full columns from t1 from sbtest; +show full columns from t1 from sbtest like 'n%'; +show full columns from t1 from sbtest where field like 's%'; + +# index +show index from t1; +show index in t1; +show index from t1 from sbtest; +show index in t1 in sbtest; +show index in t1 from sbtest; +show index from t1 in sbtest; + +# keys +show keys from t1; +show keys in t1; +show keys from t1 from sbtest; +show keys from t1 in sbtest; +show keys in t1 in sbtest; +show keys in t1 from sbtest; + +# create +show create database sbtest; +show create schema sbtest; +show create schema if not exists sbtest; +show create database if not exists sbtest; diff --git a/tests/e2e/shard/case/join/mycat/murmur/unequal.sql b/tests/e2e/shard/case/join/mycat/murmur/unequal.sql new file mode 100644 index 00000000..4b50b6f3 --- /dev/null +++ b/tests/e2e/shard/case/join/mycat/murmur/unequal.sql @@ -0,0 +1,119 @@ +select test1.id,test1.t_id,test1.name,test1.pad,sbtest.test2.id,sbtest.test2.o_id,sbtest.test2.name,sbtest.test2.pad from test1,sbtest.test2 where test1.pad=sbtest.test2.pad; +select a.id,a.t_id,a.name,a.pad,b.id,b.o_id,b.name,b.pad from test1 a,sbtest.test2 b where a.pad=b.pad; +select a.id,b.id,b.pad,a.t_id from (select test1.id,test1.pad,test1.t_id from test1 join sbtest.test2 where test1.pad=sbtest.test2.pad ) a,(select sbtest.test3.id,sbtest.test3.pad from test1 join sbtest.test3 where test1.pad=sbtest.test3.pad) b where a.pad=b.pad; +select test1.id,test1.name,a.name from test1,(select name from sbtest.test2) a; +select test1.id,test1.t_id,test1.name,test1.pad,test2.id,test2.o_id,test2.name,test2.pad from test1 inner join test2 order by test1.id,test2.id; +select test1.id,test1.t_id,test1.name,test1.pad,test2.id,test2.o_id,test2.name,test2.pad from test1 cross join test2 order by test1.id,test2.id; +select test1.id,test1.t_id,test1.name,test1.pad,test2.id,test2.o_id,test2.name,test2.pad from test1 join test2 order by test1.id,test2.id; +select a.id,a.name,a.pad,b.name from test1 a inner join sbtest.test2 b order by a.id,b.id; +select a.id,a.name,a.pad,b.name from test1 a cross join sbtest.test2 b order by a.id,b.id; +select a.id,a.name,a.pad,b.name from test1 a join sbtest.test2 b order by a.id,b.id; +select a.id,a.t_id,a.name,a.pad,b.id,b.o_id,b.name,b.pad from test1 a inner join (select * from sbtest.test2 where pad>0) b order by a.id,b.id; +select a.id,a.t_id,a.name,a.pad,b.id,b.o_id,b.name,b.pad from test1 a cross join (select * from sbtest.test2 where pad>0) b order by a.id,b.id; +select a.id,a.t_id,a.name,a.pad,b.id,b.o_id,b.name,b.pad from test1 a join (select * from sbtest.test2 where pad>0) b order by a.id,b.id; +select a.id,a.t_id,a.name,a.pad,b.id,b.o_id,b.name,b.pad from (select * from test1 where pad>0) a inner join (select * from sbtest.test2 where pad>0) b order by a.id,b.id; +select a.id,a.t_id,a.name,a.pad,b.id,b.o_id,b.name,b.pad from (select * from test1 where pad>0) a cross join (select * from sbtest.test2 where pad>0) b order by a.id,b.id; +select a.id,a.t_id,a.name,a.pad,b.id,b.o_id,b.name,b.pad from (select * from test1 where pad>0) a join (select * from sbtest.test2 where pad>0) b order by a.id,b.id; +select a.id,a.t_id,a.name,a.pad,b.id,b.o_id,b.name,b.pad from test1 a join (select * from sbtest.test2 where pad>0) b on a.id0) b using(pad) order by a.id,b.id; +select test1.id,test1.t_id,test1.name,test1.pad,sbtest.test2.id,sbtest.test2.o_id,sbtest.test2.name,sbtest.test2.pad from test1 straight_join sbtest.test2 order by test1.id,test2.id; +select a.id,a.name,a.pad,b.name from test1 a straight_join sbtest.test2 b order by a.id,b.id; +select a.id,a.t_id,a.name,a.pad,b.id,b.o_id,b.name,b.pad from test1 a straight_join (select * from sbtest.test2 where pad>0) b order by a.id,b.id; +select a.id,a.t_id,a.name,a.pad,b.id,b.o_id,b.name,b.pad from (select * from test1 where pad>0) a straight_join (select * from sbtest.test2 where pad>0) b order by a.id,b.id; +select a.id,a.t_id,a.name,a.pad,b.id,b.o_id,b.name,b.pad from test1 a straight_join (select * from sbtest.test2 where pad>0) b on a.id2) b on a.pad=b.pad order by a.id,b.id; +select a.id,a.t_id,a.name,a.pad,b.id,b.o_id,b.name,b.pad from test1 a right join (select * from sbtest.test2 where pad>2) b on a.pad=b.pad order by a.id,b.id; +select a.id,a.t_id,a.name,a.pad,b.id,b.o_id,b.name,b.pad from test1 a left outer join (select * from sbtest.test2 where pad>2) b on a.pad=b.pad order by a.id,b.id; +select a.id,a.t_id,a.name,a.pad,b.id,b.o_id,b.name,b.pad from test1 a right outer join (select * from sbtest.test2 where pad>2) b on a.pad=b.pad order by a.id,b.id; +select a.id,a.t_id,a.name,a.pad,b.id,b.o_id,b.name,b.pad from test1 a left join (select * from sbtest.test2 where pad>2) b using(pad) order by a.id,b.id; +select a.id,a.t_id,a.name,a.pad,b.id,b.o_id,b.name,b.pad from (select * from test1 where pad>1) a left join (select * from sbtest.test2 where pad>3) b on a.pad=b.pad order by a.id,b.id; +select a.id,a.t_id,a.name,a.pad,b.id,b.o_id,b.name,b.pad from (select * from test1 where pad>1) a right join (select * from sbtest.test2 where pad>3) b on a.pad=b.pad order by a.id,b.id; +select a.id,a.t_id,a.name,a.pad,b.id,b.o_id,b.name,b.pad from (select * from test1 where pad>1) a left outer join (select * from sbtest.test2 where pad>3) b on a.pad=b.pad order by a.id,b.id; +select a.id,a.t_id,a.name,a.pad,b.id,b.o_id,b.name,b.pad from (select * from test1 where pad>1) a right outer join (select * from sbtest.test2 where pad>3) b on a.pad=b.pad order by a.id,b.id; +select a.id,a.t_id,a.name,a.pad,b.id,b.o_id,b.name,b.pad from (select * from test1 where pad>1) a left join (select * from sbtest.test2 where pad>3) b using(pad) order by a.id,b.id; +select test1.id,test1.t_id,test1.name,test1.pad,sbtest.test2.id,sbtest.test2.o_id,sbtest.test2.name,sbtest.test2.pad from test1 left join sbtest.test2 on test1.pad=sbtest.test2.pad and test1.id>3 order by test1.id,test2.id; +select distinct a.pad from test1 a,sbtest.test2 b where a.pad=b.pad; +select a.id,a.t_id,b.o_id,b.name from (select * from test1 where id<3) a,(select * from sbtest.test2 where id>3) b; +select a.id,b.id,b.pad,a.t_id from test1 a,(select sbtest.test3.id,sbtest.test3.pad from test1 join sbtest.test3 where test1.pad=sbtest.test3.pad) b,(select * from sbtest.test2 where id>3) c where a.pad=b.pad and c.pad=b.pad; +select a.id,a.t_id,a.name,a.pad,b.id,b.o_id,b.name,b.pad from test1 a join sbtest.test2 as b order by a.id,b.id; +select a.id,a.t_id,a.name,a.pad,b.id,b.o_id,b.name,b.pad from test1 a inner join sbtest.test2 b order by a.id,b.id; +select a.id,a.t_id,a.name,a.pad,b.id,b.o_id,b.name,b.pad from test1 a cross join sbtest.test2 b order by a.id,b.id; +select a.id,a.name,a.pad,b.name from test1 a straight_join sbtest.test2 b on a.pad=b.pad; +SELECT Department, COUNT(ID) FROM test4 GROUP BY Department HAVING COUNT(ID)>3; +select id,FirstName,lastname,department,salary from test4 group by Department; +select Department,count(Salary) as a from test4 group by Department having a=3; +select Department,count(Salary) from test4 group by Department having count(ID) >2; +select Department,count(*) as num from test4 group by Department having count(*) >1; +select Department,count(*) as num from test4 group by Department having count(*) <=3; +select id,FirstName,lastname,department,salary from test4 limit 2,10; +select Department,count(*) as num from test4 group by Department having count(*) >=4 order by Department ASC; +select count(id) as counts,date_format(MYDATE,'%Y-%m') as mouth from test8 where id>1 and id<50 group by 2 asc; +select sum(O_TOTALPRICE) as sums,id from test8 where id>1 and id<50 group by 2 asc; +select C_ORDERKEY,C_CUSTKEY,C_NAME from test1,sbtest.test6 where C_CUSTKEY=c_CUSTKEY and C_ORDERKEY<'ORDERKEY_006'; +select O_ORDERKEY,O_CUSTKEY,C_NAME from test8 join sbtest.test6 on O_CUSTKEY=c_CUSTKEY and O_ORDERKEY<'ORDERKEY_007'; +select O_ORDERKEY,O_CUSTKEY,C_NAME from test8 INNER join sbtest.test6 where O_CUSTKEY=c_CUSTKEY and O_ORDERKEY<'ORDERKEY_007'; +select O_ORDERKEY,O_CUSTKEY,C_NAME from test8 INNER join sbtest.test6 on O_CUSTKEY=c_CUSTKEY and O_ORDERKEY<'ORDERKEY_006'; +select O_ORDERKEY,O_CUSTKEY,C_NAME from test8 CROSS join sbtest.test6 on O_CUSTKEY=c_CUSTKEY and O_ORDERKEY<'ORDERKEY_006'; +select O_ORDERKEY,O_CUSTKEY,C_NAME from sbtest.test6 as a STRAIGHT_JOIN test8 b where b.O_CUSTKEY=a.c_CUSTKEY and O_ORDERKEY<'ORDERKEY_007'; +select b.O_ORDERKEY,b.O_CUSTKEY,a.C_NAME from sbtest.test6 a STRAIGHT_JOIN test8 b on b.O_CUSTKEY=a.c_CUSTKEY and b.O_ORDERKEY<'ORDERKEY_007'; +select a.c_CUSTKEY,a.C_NAME,b.O_ORDERKEY from sbtest.test6 as a left join test8 b on b.O_CUSTKEY=a.C_CUSTKEY and a.C_CUSTKEY<'CUSTKEY_300'; +select a.c_CUSTKEY,a.C_NAME,b.O_ORDERKEY from test8 b right join sbtest.test6 as a on b.O_CUSTKEY=a.C_CUSTKEY and a.c_CUSTKEY<'CUSTKEY_300'; +select sum(O_TOTALPRICE) as sums,O_CUSTKEY,count(O_ORDERKEY) counts from test9 where O_CUSTKEY between 'CUSTKEY_003' and 'CUSTKEY_500' group by 2 asc having sums>400 order by o_custkey; +select sum(O_TOTALPRICE) as sums,O_CUSTKEY,count(O_ORDERKEY) counts from test9 where O_CUSTKEY between 'CUSTKEY_003' and 'CUSTKEY_500' group by 2 asc having sums>400 order by 2; +select sum(O_TOTALPRICE) as sums,O_CUSTKEY,count(O_ORDERKEY) counts from test9 where O_CUSTKEY between 'CUSTKEY_003' and 'CUSTKEY_500' group by 2 asc having sums>400 order by count(O_ORDERKEY), sums; +select sum(O_TOTALPRICE) as sums,O_CUSTKEY,count(O_ORDERKEY) counts from test9 where O_CUSTKEY between 'CUSTKEY_003' and 'CUSTKEY_500' group by 2 asc having sums>400 order by counts asc,2 desc; +select sum(O_TOTALPRICE) as sums,O_CUSTKEY,count(O_ORDERKEY) counts from test9 where O_CUSTKEY between 'CUSTKEY_002' and 'CUSTKEY_050' group by 2 asc having O_CUSTKEY<(select max(c_custkey) from test7) order by 2; +select sum(O_TOTALPRICE) as sums,O_CUSTKEY,count(O_ORDERKEY) counts from test9 where O_CUSTKEY between 'CUSTKEY_002' and 'CUSTKEY_050' group by 2 asc having O_CUSTKEY<(select max(c_custkey) from test7) order by count(O_ORDERKEY); +select sum(O_TOTALPRICE) as sums,O_CUSTKEY,count(O_ORDERKEY) counts from test9 where O_CUSTKEY between 'CUSTKEY_002' and 'CUSTKEY_050' group by 2 asc having O_CUSTKEY<(select max(c_custkey) from test7) order by counts asc,2 desc; +select sum(O_TOTALPRICE) as sums,O_CUSTKEY,count(O_ORDERKEY) counts from test9 where O_CUSTKEY between 'CUSTKEY_003' and 'CUSTKEY_500' group by 2 asc having sums>400 order by count(O_ORDERKEY) asc,2 desc limit 2; +select sum(O_TOTALPRICE) as sums,O_CUSTKEY,count(O_ORDERKEY) counts from test9 where O_CUSTKEY between 'CUSTKEY_003' and 'CUSTKEY_500' group by 2 asc having sums>400 order by count(O_ORDERKEY) asc,O_CUSTKEY desc limit 1,3; +select sum(O_TOTALPRICE) as sums,O_CUSTKEY,count(O_ORDERKEY) counts from test9 where O_CUSTKEY between 'CUSTKEY_003' and 'CUSTKEY_500' group by 2 asc having sums>400 order by count(O_ORDERKEY) asc,O_CUSTKEY desc limit 10 offset 1; +select sum(O_TOTALPRICE) as sums,O_CUSTKEY,count(O_ORDERKEY) counts from test9 where O_CUSTKEY between 'CUSTKEY_002' and 'CUSTKEY_050' group by 2 asc having O_CUSTKEY<(select max(c_custkey) from test7) order by count(O_ORDERKEY) asc,2 desc limit 10; +select sum(O_TOTALPRICE) as sums,O_CUSTKEY,count(O_ORDERKEY) counts from test9 where O_CUSTKEY between 'CUSTKEY_002' and 'CUSTKEY_050' group by 2 asc having O_CUSTKEY<(select max(c_custkey) from test7) order by count(O_ORDERKEY) asc,O_CUSTKEY desc limit 1,10; +select sum(O_TOTALPRICE) as sums,O_CUSTKEY,count(O_ORDERKEY) counts from test9 where O_CUSTKEY between 'CUSTKEY_002' and 'CUSTKEY_050' group by 2 asc having O_CUSTKEY<(select max(c_custkey) from test7) order by count(O_ORDERKEY) asc,O_CUSTKEY desc limit 10 offset 1; +select a.c_CUSTKEY,a.C_NAME,b.O_ORDERKEY from sbtest.test7 as a left join test9 b ignore index for join(ORDERS_FK1) on b.O_CUSTKEY=a.c_CUSTKEY and a.c_CUSTKEY<'CUSTKEY_300'; +select a.c_CUSTKEY,a.C_NAME,b.O_ORDERKEY from sbtest.test7 as a force index for join(primary) left join test9 b ignore index for join(ORDERS_FK1) on b.O_CUSTKEY=a.c_CUSTKEY and a.c_CUSTKEY<'CUSTKEY_300'; +select UPPER((select C_NAME FROM test7 limit 1)) FROM test7 limit 1; +select O_ORDERKEY,O_CUSTKEY from test9 as a where a.O_CUSTKEY<=(select min(C_CUSTKEY) from test7); +select count(*) from sbtest.test7 as a where a.c_CUSTKEY=(select max(C_CUSTKEY) from test9 where C_CUSTKEY=a.C_CUSTKEY); +select id,O_CUSTKEY,O_ORDERKEY,O_TOTALPRICE from test9 a where (a.O_ORDERKEY,O_CUSTKEY)=(select c_ORDERKEY,c_CUSTKEY from test7 where c_name='yanglu'); +SELECT /*+ MAX_EXECUTION_TIME(1000) */ * FROM t1 INNER JOIN t2 where t1.col1 = t2.col1; +SELECT * FROM t1, t2; +SELECT * FROM t1 AS u, t2; +SELECT * FROM t1, t2 AS u; +SELECT * FROM t1 AS u, t2 AS v; +SELECT * FROM t, t1, t2; +SELECT * from t1, t2, t3; +select * from t1 join t2 left join t3 on t2.id = t3.id; +select count(distinct col1, col2) from t; +select count(distinctrow col1, col2) from t; +select group_concat(col2,col1 SEPARATOR ';') from t group by col1; +select * from t full, t1 `row`, t2 abs; +select * from t use index for group by (idx1) use index for order by (idx2), t2; +select * from (select pad,count(*) from sbtest.test2 a group by pad) a; +select a.id,b.id,b.pad,a.t_id from test1 a,(select * from sbtest.test2 order by id limit 3) b where a.t_id=b.o_id; +select a.id,b.id,b.pad,a.t_id from test1 a,(select * from sbtest.test2 order by id limit 3) b where a.t_id=b.o_id limit 2; +select * from (select sbtest.test3.pad from test1 left join sbtest.test3 on test1.pad=sbtest.test3.pad) a; +select count(*) from (select pad,count(*) a from test1 group by pad) a; +select id,pad from test1 where pad>(select pad from test1 where id=2); +select id,pad from test1 where pad<(select pad from test1 where id=2); +select id,pad from test1 where pad>=(select pad from test1 where id=2); +select id,pad from test1 where pad<=(select pad from test1 where id=2); +select id,pad from test1 where pad<>(select pad from test1 where id=2); +select id,pad from test1 where pad !=(select pad from test1 where id=2); +select id,t_id,name,pad from test1 where pad=some(select id from test1 where pad>1); +select id,t_id,name,pad from test1 where pad=any(select id from test1 where pad>1); +select id,t_id,name,pad from test1 where pad !=any(select id from test1 where pad=3); +select a.id,b.id,b.pad,a.t_id from (select test1.id,test1.pad,test1.t_id from test1 join sbtest.test3 where test1.pad=sbtest.test3.pad ) a,(select sbtest.test2.id,sbtest.test2.pad from test1 join sbtest.test2 where test1.pad=sbtest.test2.pad) b where a.pad=b.pad; +select id,t_id,name,pad from test1 where pad>(select pad from test1 where pad=2); +select (select name from test1 limit 1); diff --git a/tests/e2e/shard/case/join/mycat/murmur/unsupport.sql b/tests/e2e/shard/case/join/mycat/murmur/unsupport.sql new file mode 100644 index 00000000..8b137891 --- /dev/null +++ b/tests/e2e/shard/case/join/mycat/murmur/unsupport.sql @@ -0,0 +1 @@ + diff --git a/tests/e2e/shard/case/join/mycat/string/equal.sql b/tests/e2e/shard/case/join/mycat/string/equal.sql new file mode 100644 index 00000000..8b2fa2f7 --- /dev/null +++ b/tests/e2e/shard/case/join/mycat/string/equal.sql @@ -0,0 +1,331 @@ +select test1.id,test1.t_id,test1.name,test1.pad,sbtest.test2.id,sbtest.test2.o_id,sbtest.test2.name,sbtest.test2.pad from test1,sbtest.test2 where test1.pad=sbtest.test2.pad; +select a.id,a.t_id,a.name,a.pad,b.id,b.o_id,b.name,b.pad from test1 a,sbtest.test2 b where a.pad=b.pad; +select a.id,b.id,b.pad,a.t_id from test1 a,(select * from sbtest.test2 where pad>3) b where a.t_id=b.o_id; +select a.id,b.id,b.pad,a.t_id from (select test1.id,test1.pad,test1.t_id from test1 join sbtest.test2 where test1.pad=sbtest.test2.pad ) a,(select sbtest.test3.id,sbtest.test3.pad from test1 join sbtest.test3 where test1.pad=sbtest.test3.pad) b where a.pad=b.pad; +select test1.id,test1.name,a.name from test1,(select name from sbtest.test2) a; +select test1.id,test1.t_id,test1.name,test1.pad,test2.id,test2.o_id,test2.name,test2.pad from test1 inner join test2 order by test1.id,test2.id; +select test1.id,test1.t_id,test1.name,test1.pad,test2.id,test2.o_id,test2.name,test2.pad from test1 cross join test2 order by test1.id,test2.id; +select test1.id,test1.t_id,test1.name,test1.pad,test2.id,test2.o_id,test2.name,test2.pad from test1 join test2 order by test1.id,test2.id; +select a.id,a.name,a.pad,b.name from test1 a inner join sbtest.test2 b order by a.id,b.id; +select a.id,a.name,a.pad,b.name from test1 a cross join sbtest.test2 b order by a.id,b.id; +select a.id,a.name,a.pad,b.name from test1 a join sbtest.test2 b order by a.id,b.id; +select a.id,a.t_id,a.name,a.pad,b.id,b.o_id,b.name,b.pad from test1 a inner join (select * from sbtest.test2 where pad>0) b order by a.id,b.id; +select a.id,a.t_id,a.name,a.pad,b.id,b.o_id,b.name,b.pad from test1 a cross join (select * from sbtest.test2 where pad>0) b order by a.id,b.id; +select a.id,a.t_id,a.name,a.pad,b.id,b.o_id,b.name,b.pad from test1 a join (select * from sbtest.test2 where pad>0) b order by a.id,b.id; +select a.id,a.t_id,a.name,a.pad,b.id,b.o_id,b.name,b.pad from (select * from test1 where pad>0) a inner join (select * from sbtest.test2 where pad>0) b order by a.id,b.id; +select a.id,a.t_id,a.name,a.pad,b.id,b.o_id,b.name,b.pad from (select * from test1 where pad>0) a cross join (select * from sbtest.test2 where pad>0) b order by a.id,b.id; +select a.id,a.t_id,a.name,a.pad,b.id,b.o_id,b.name,b.pad from (select * from test1 where pad>0) a join (select * from sbtest.test2 where pad>0) b order by a.id,b.id; +select a.id,a.t_id,a.name,a.pad,b.id,b.o_id,b.name,b.pad from test1 a join (select * from sbtest.test2 where pad>0) b on a.id0) b using(pad) order by a.id,b.id; +select test1.id,test1.t_id,test1.name,test1.pad,sbtest.test2.id,sbtest.test2.o_id,sbtest.test2.name,sbtest.test2.pad from test1 straight_join sbtest.test2 order by test1.id,test2.id; +select a.id,a.name,a.pad,b.name from test1 a straight_join sbtest.test2 b order by a.id,b.id; +select a.id,a.t_id,a.name,a.pad,b.id,b.o_id,b.name,b.pad from test1 a straight_join (select * from sbtest.test2 where pad>0) b order by a.id,b.id; +select a.id,a.t_id,a.name,a.pad,b.id,b.o_id,b.name,b.pad from (select * from test1 where pad>0) a straight_join (select * from sbtest.test2 where pad>0) b order by a.id,b.id; +select a.id,a.t_id,a.name,a.pad,b.id,b.o_id,b.name,b.pad from test1 a straight_join (select * from sbtest.test2 where pad>0) b on a.id2) b on a.pad=b.pad order by a.id,b.id; +select a.id,a.t_id,a.name,a.pad,b.id,b.o_id,b.name,b.pad from test1 a right join (select * from sbtest.test2 where pad>2) b on a.pad=b.pad order by a.id,b.id; +select a.id,a.t_id,a.name,a.pad,b.id,b.o_id,b.name,b.pad from test1 a left outer join (select * from sbtest.test2 where pad>2) b on a.pad=b.pad order by a.id,b.id; +select a.id,a.t_id,a.name,a.pad,b.id,b.o_id,b.name,b.pad from test1 a right outer join (select * from sbtest.test2 where pad>2) b on a.pad=b.pad order by a.id,b.id; +select a.id,a.t_id,a.name,a.pad,b.id,b.o_id,b.name,b.pad from test1 a left join (select * from sbtest.test2 where pad>2) b using(pad) order by a.id,b.id; +select a.id,a.t_id,a.name,a.pad,b.id,b.o_id,b.name,b.pad from (select * from test1 where pad>1) a left join (select * from sbtest.test2 where pad>3) b on a.pad=b.pad order by a.id,b.id; +select a.id,a.t_id,a.name,a.pad,b.id,b.o_id,b.name,b.pad from (select * from test1 where pad>1) a right join (select * from sbtest.test2 where pad>3) b on a.pad=b.pad order by a.id,b.id; +select a.id,a.t_id,a.name,a.pad,b.id,b.o_id,b.name,b.pad from (select * from test1 where pad>1) a left outer join (select * from sbtest.test2 where pad>3) b on a.pad=b.pad order by a.id,b.id; +select a.id,a.t_id,a.name,a.pad,b.id,b.o_id,b.name,b.pad from (select * from test1 where pad>1) a right outer join (select * from sbtest.test2 where pad>3) b on a.pad=b.pad order by a.id,b.id; +select a.id,a.t_id,a.name,a.pad,b.id,b.o_id,b.name,b.pad from (select * from test1 where pad>1) a left join (select * from sbtest.test2 where pad>3) b using(pad) order by a.id,b.id; +select test1.id,test1.t_id,test1.name,test1.pad,sbtest.test2.id,sbtest.test2.o_id,sbtest.test2.name,sbtest.test2.pad from test1 natural left join sbtest.test2; +select test1.id,test1.t_id,test1.name,test1.pad,sbtest.test2.id,sbtest.test2.o_id,sbtest.test2.name,sbtest.test2.pad from test1 natural right join sbtest.test2; +select test1.id,test1.t_id,test1.name,test1.pad,sbtest.test2.id,sbtest.test2.o_id,sbtest.test2.name,sbtest.test2.pad from test1 natural left outer join sbtest.test2; +select test1.id,test1.t_id,test1.name,test1.pad,sbtest.test2.id,sbtest.test2.o_id,sbtest.test2.name,sbtest.test2.pad from test1 natural right outer join sbtest.test2; +select a.id,a.t_id,a.name,a.pad,b.id,b.o_id,b.name,b.pad from test1 a natural left join sbtest.test2 b order by a.id; +select a.id,a.t_id,a.name,a.pad,b.id,b.o_id,b.name,b.pad from test1 a natural right join sbtest.test2 b order by b.id; +select a.id,a.t_id,a.name,a.pad,b.id,b.o_id,b.name,b.pad from test1 a natural left outer join sbtest.test2 b order by a.id; +select a.id,a.t_id,a.name,a.pad,b.id,b.o_id,b.name,b.pad from test1 a natural right outer join sbtest.test2 b order by b.id; +select a.id,a.t_id,a.name,a.pad,b.id,b.o_id,b.name,b.pad from test1 a natural left join (select * from sbtest.test2 where pad>2) b order by a.id,b.id; +select a.id,a.t_id,a.name,a.pad,b.id,b.o_id,b.name,b.pad from test1 a natural right join (select * from sbtest.test2 where pad>2) b order by a.id,b.id; +select a.id,a.t_id,a.name,a.pad,b.id,b.o_id,b.name,b.pad from test1 a natural left outer join (select * from sbtest.test2 where pad>2) b order by a.id,b.id; +select a.id,a.t_id,a.name,a.pad,b.id,b.o_id,b.name,b.pad from test1 a natural right outer join (select * from sbtest.test2 where pad>2) b order by a.id,b.id; +select a.id,a.t_id,a.name,a.pad,b.id,b.o_id,b.name,b.pad from (select * from test1 where pad>1) a natural left join (select * from sbtest.test2 where pad>3) b order by a.id,b.id; +select a.id,a.t_id,a.name,a.pad,b.id,b.o_id,b.name,b.pad from (select * from test1 where pad>1) a natural right join (select * from sbtest.test2 where pad>3) b order by a.id,b.id; +select a.id,a.t_id,a.name,a.pad,b.id,b.o_id,b.name,b.pad from (select * from test1 where pad>1) a natural left outer join (select * from sbtest.test2 where pad>3) b order by a.id,b.id; +select a.id,a.t_id,a.name,a.pad,b.id,b.o_id,b.name,b.pad from (select * from test1 where pad>1) a natural right outer join (select * from sbtest.test2 where pad>3) b order by a.id,b.id; +select test1.id,test1.t_id,test1.name,test1.pad,sbtest.test2.id,sbtest.test2.o_id,sbtest.test2.name,sbtest.test2.pad from test1 left join sbtest.test2 on test1.pad=sbtest.test2.pad and test1.id>3 order by test1.id,test2.id; +select distinct a.pad from test1 a,sbtest.test2 b where a.pad=b.pad; +select distinct b.pad,a.pad from test1 a,(select * from sbtest.test2 where pad=1) b where a.t_id=b.o_id; +select count(distinct id),sum(distinct name) from test1 where id=3 or id=7; +select a.id,a.t_id,b.o_id,b.name from (select * from test1 where id<3) a,(select * from sbtest.test2 where id>3) b; +select a.id,b.id,b.pad,a.t_id from test1 a,(select sbtest.test3.id,sbtest.test3.pad from test1 join sbtest.test3 where test1.pad=sbtest.test3.pad) b,(select * from sbtest.test2 where id>3) c where a.pad=b.pad and c.pad=b.pad; +select a.id,a.t_id,a.name,a.pad,b.id,b.o_id,b.name,b.pad from test1 a join sbtest.test2 as b order by a.id,b.id; +select a.id,a.t_id,a.name,a.pad,b.id,b.o_id,b.name,b.pad from test1 a inner join sbtest.test2 b order by a.id,b.id; +select a.id,a.t_id,a.name,a.pad,b.id,b.o_id,b.name,b.pad from test1 a cross join sbtest.test2 b order by a.id,b.id; +select a.id,a.name,a.pad,b.name from test1 a straight_join sbtest.test2 b on a.pad=b.pad; +select id,FirstName,lastname,department,salary from test4 use index(ID_index) where Department ='Finance'; +select id,FirstName,lastname,department,salary from test4 force index(ID_index) where ID= 205; +SELECT FirstName, LastName,Department = CASE Department WHEN 'F' THEN 'Financial' WHEN 'D' THEN 'Development' ELSE 'Other' END FROM test4; +select id,FirstName,lastname,department,salary from test4 where Salary >'40000' and Salary <'70000' and Department ='Finance'; +SELECT count(*), Department FROM (SELECT * FROM test4 ORDER BY FirstName DESC) AS Actions GROUP BY Department ORDER BY ID DESC; +SELECT Department, COUNT(ID) FROM test4 GROUP BY Department HAVING COUNT(ID)>3; +select id,FirstName,lastname,department,salary from test4 order by ID ASC; +select id,FirstName,lastname,department,salary from test4 group by Department; +SELECT Department, MIN(Salary) FROM test4 GROUP BY Department HAVING MIN(Salary)>46000; +select Department,max(Salary) from test4 group by Department order by Department asc; +select Department,min(Salary) from test4 group by Department order by Department asc; +select Department,sum(Salary) from test4 group by Department order by Department asc; +select ID,Department,Salary from test4 order by 2,3; +select id,FirstName,lastname,department,salary from test4 order by Department ,ID desc; +SELECT Department, COUNT(Salary) FROM test4 GROUP BY Department; +SELECT Department, COUNT(Salary) FROM test4 GROUP BY Department DESC; +select Department,count(Salary) as a from test4 group by Department having a=3; +select Department,count(Salary) as a from test4 group by Department having a>0; +select Department,count(Salary) from test4 group by Department having count(ID) >2; +select Department,count(*) as num from test4 group by Department having count(*) >1; +select Department,count(*) as num from test4 group by Department having count(*) <=3; +select Department from test4 having Department >3; +select Department from test4 where Department >0; +select Department,max(salary) from test4 group by Department having max(salary) >10; +select 12 as Department, Department from test4 group by Department; +select id,FirstName,lastname,department,salary from test4 limit 2,10; +select max(salary) from test4 group by department order by department asc; +select min(salary) from test4 group by department order by department asc; +select sum(salary) from test4 group by department order by department asc; +select count(salary) from test4 group by department order by department asc; +select Department,sum(Salary) a from test4 group by Department having a >=1 order by Department DESC; +select Department,count(*) as num from test4 group by Department having count(*) >=4 order by Department ASC; +select FirstName,LastName,Department,ABS(salary) from test4 order by Department; +select FirstName,LastName,Department,ACOS(salary) from test4 order by Department; +select FirstName,LastName,Department,ASIN(salary) from test4 order by Department; +select FirstName,LastName,Department,ATAN(salary) from test4 order by Department; +select FirstName,LastName,Department,ATAN(salary,100) from test4 order by Department; +select FirstName,LastName,Department,ATAN2(salary,100) from test4 order by Department; +select FirstName,LastName,Department,CEIL(salary) from test4 order by Department; +select FirstName,LastName,Department,CEILING(salary) from test4 order by Department; +select FirstName,LastName,Department,COT(salary) from test4 order by Department; +select FirstName,LastName,Department,CRC32(Department) from test4 order by Department; +select FirstName,LastName,Department,FLOOR(salary) from test4 order by Department; +select FirstName,LN(FirstName),LastName,Department from test4 order by Department; +select FirstName,LastName,Department,LOG(salary) from test4 order by Department; +select FirstName,LastName,Department,LOG2(salary) from test4 order by Department; +select FirstName,LastName,Department,LOG10(salary) from test4 order by Department; +select FirstName,LastName,Department,MOD(salary,2) from test4 order by Department; +select FirstName,LastName,Department,RADIANS(salary) from test4 order by Department; +select FirstName,LastName,Department,ROUND(salary) from test4 order by Department; +select FirstName,LastName,Department,SIGN(salary) from test4 order by Department; +select FirstName,LastName,Department,SIN(salary) from test4 order by Department; +select FirstName,LastName,Department,SQRT(salary) from test4 order by Department; +select FirstName,LastName,Department,TAN(salary) from test4 order by Department; +select FirstName,LastName,Department,TRUNCATE(salary,1) from test4 order by Department; +select FirstName,LastName,Department,TRUNCATE(salary*100,0) from test4 order by Department; +select FirstName,LastName,Department,SIN(salary) from test4 order by Department; +select id,FirstName,lastname,department,salary from test4 where Department is Null; +select id,FirstName,lastname,department,salary from test4 where Department is not Null; +select id,FirstName,lastname,department,salary from test4 where NOT (ID < 200); +select id,FirstName,lastname,department,salary from test4 where ID <300; +select id,FirstName,lastname,department,salary from test4 where ID <1; +select id,FirstName,lastname,department,salary from test4 where ID <> 0; +select id,FirstName,lastname,department,salary from test4 where ID <> 0 and ID <=1; +select id,FirstName,lastname,department,salary from test4 where ID >=205; +select id,FirstName,lastname,department,salary from test4 where ID <=205; +select id,FirstName,lastname,department,salary from test4 where ID >=205 and ID <=205; +select id,FirstName,lastname,department,salary from test4 where ID >1 and ID <=203; +select id,FirstName,lastname,department,salary from test4 where ID >=1 and ID=205; +select id,FirstName,lastname,department,salary from test4 where ID=(ID>>1)<<1; +select id,FirstName,lastname,department,salary from test4 where ID&1; +select id,FirstName,lastname,department,salary from test4 where Salary >'40000' and Salary <'70000' and Department ='Finance' order by Salary ASC; +select id,FirstName,lastname,department,salary from test4 where (Salary >'50000' and Salary <'70000') or Department ='Finance' order by Salary ASC; +select id,FirstName,lastname,department,salary from test4 where FirstName like 'J%'; +select count(*) FROM test4 WHERE Salary is null or FirstName not like '%M%'; +select id,FirstName,lastname,department,salary from test4 where FirstName in ('Mazojys','Syllauu','Tyoysww'); +select id,FirstName,lastname,department,salary from test4 where Salary between 40000 and 50000; +select sum(salary) from test4 where department = 'Finance'; +select max(salary) from test4 where department = 'Finance'; +select min(salary) from test4 where department = 'Finance'; +select sum(distinct id) from test5; +select sum(all id) from test5; +select id, R_REGIONKEY from test5; +select id,'user is user' from test5; +select id*5,'user is user',10 from test5; +select ALL id, R_REGIONKEY, R_NAME, R_COMMENT from test5; +select DISTINCT id, R_REGIONKEY, R_NAME, R_COMMENT from test5; +select DISTINCTROW id, R_REGIONKEY, R_NAME, R_COMMENT from test5; +select ALL HIGH_PRIORITY id,'ID' as detail from test5; +select id, O_ORDERKEY, O_TOTALPRICE,MYDATE from test8 where id=1; +select id, O_ORDERKEY, O_TOTALPRICE,MYDATE from test8 where id=1 and not id=1; +select id,O_ORDERKEY,O_CUSTKEY,O_TOTALPRICE,MYDATE from test8 where id=1; +select count(*) counts from test8 a where MYDATE is null; +select count(*) counts from test8 a where id is null; +select count(*) counts from test8 a where id is not null; +select count(*) counts from test8 a where not (id is null); +select count(O_ORDERKEY) counts from test8 a where O_ORDERKEY like 'ORDERKEY_00%'; +select count(O_ORDERKEY) counts from test8 a where O_ORDERKEY not like '%00%'; +select sum(O_TOTALPRICE) as sums,O_CUSTKEY,count(O_ORDERKEY) counts from test8 a where O_ORDERKEY<'ORDERKEY_010' and O_CUSTKEY between 'CUSTKEY_002' and 'CUSTKEY_300' group by o_custkey; +select sum(O_TOTALPRICE) as sums,O_CUSTKEY,count(O_ORDERKEY) counts from test8 a where O_ORDERKEY<'ORDERKEY_010' or O_CUSTKEY between 'CUSTKEY_002' and 'CUSTKEY_300' group by o_custkey; +select sum(O_TOTALPRICE) as sums,O_CUSTKEY,count(O_ORDERKEY) counts from test8 a where O_CUSTKEY in ('CUSTKEY_003','CUSTKEY_420','CUSTKEY_980') group by o_custkey; +select sum(O_TOTALPRICE) as sums,count(O_ORDERKEY) counts from test8 a where O_CUSTKEY not in ('CUSTKEY_003','CUSTKEY_420','CUSTKEY_980'); +select O_CUSTKEY,case when sum(O_TOTALPRICE)<100000 then 'D' when sum(O_TOTALPRICE)>100000 and sum(O_TOTALPRICE)<1000000 then 'C' when sum(O_TOTALPRICE)>1000000 and sum(O_TOTALPRICE)<5000000 then 'B' else 'A' end as jibie from test8 a group by O_CUSTKEY order by jibie, O_CUSTKEY limit 10; +select count(*) from test8 where MYDATE between concat(date_format('1992-05-01','%Y-%m'),'-00') and concat(date_format(date_add('1992-05-01',interval 2 month),'%Y-%m'),'-00'); +select id,sum(O_TOTALPRICE) from test8 where id>1 and id<50 group by id; +select id, O_ORDERKEY, O_TOTALPRICE,MYDATE from test8 group by id,O_ORDERKEY,MYDATE; +select count(id) as counts,date_format(MYDATE,'%Y-%m') as mouth,id from test8 where id>1 and id<50 group by 2 asc ,id desc; +select sum(O_TOTALPRICE ) as sums,id from test8 where id>1 and id<50 group by 2 asc having sums>2000000; +select sum(O_TOTALPRICE ) as sums,id from test8 where id>1 and id<50 group by 2 asc having sums>2000000; +select sum(O_TOTALPRICE ) as sums,id,count(O_ORDERKEY) counts from test8 where id>1 and id<50 group by 2 asc having count(O_ORDERKEY)>2; +select sum(O_TOTALPRICE ) as sums,id,count(O_ORDERKEY) counts from test8 where id>1 and id<50 group by 2 asc having min(O_ORDERKEY)>10 and max(O_ORDERKEY)<10000000; +select sum(O_TOTALPRICE ) from test8 where id>1 and id<50 having min(O_ORDERKEY)<10000; +select id,O_ORDERKEY,O_TOTALPRICE from test8 where id>36900 and id<36902 group by O_ORDERKEY having O_ORDERKEY in (select O_ORDERKEY from test8 group by id having sum(id)>10000); +select sum(O_TOTALPRICE) as sums,O_CUSTKEY,count(O_ORDERKEY) counts from test8 a where O_CUSTKEY between 'CUSTKEY_002' and 'CUSTKEY_300' group by o_custkey; +select sum(O_TOTALPRICE) as sums,O_CUSTKEY,count(O_ORDERKEY) counts from test8 a where O_CUSTKEY not between 'CUSTKEY_002' and 'CUSTKEY_300' group by o_custkey; +select sum(O_TOTALPRICE) as sums,O_CUSTKEY,count(O_ORDERKEY) counts from test8 a where not (O_CUSTKEY between 'CUSTKEY_002' and 'CUSTKEY_300') group by o_custkey; +select C_NAME from sbtest.test6 where C_NAME like 'A__A'; +select C_NAME from sbtest.test6 where C_NAME like 'm___i'; +select C_NAME from sbtest.test6 where C_NAME like 'ch___i%%'; +select C_NAME from sbtest.test6 where C_NAME like 'ch___i%%' ESCAPE 'i'; +select count(*) from sbtest.test6 where C_NAME not like 'chen%'; +select count(*) from sbtest.test6 where not (C_NAME like 'chen%'); +select C_NAME from sbtest.test6 where C_NAME like binary 'chen%'; +select C_NAME from sbtest.test6 where C_NAME like 'chen%'; +select C_NAME from sbtest.test6 where C_NAME like concat('%','AM','%'); +select C_NAME from sbtest.test6 where C_NAME like concat('%','en','%'); +select C_ORDERKEY,C_CUSTKEY,C_NAME from test1,sbtest.test6 where C_CUSTKEY=c_CUSTKEY and C_ORDERKEY<'ORDERKEY_006'; +select count(*) from (select O_CUSTKEY,count(O_CUSTKEY) as counts from test8 group by O_CUSTKEY) as a where counts<10 group by counts; +select O_ORDERKEY,O_CUSTKEY,C_NAME from test8 join sbtest.test6 on O_CUSTKEY=c_CUSTKEY and O_ORDERKEY<'ORDERKEY_007'; +select O_ORDERKEY,O_CUSTKEY,C_NAME from test8 INNER join sbtest.test6 where O_CUSTKEY=c_CUSTKEY and O_ORDERKEY<'ORDERKEY_007'; +select O_ORDERKEY,O_CUSTKEY,C_NAME from test8 INNER join sbtest.test6 on O_CUSTKEY=c_CUSTKEY and O_ORDERKEY<'ORDERKEY_006'; +select O_ORDERKEY,O_CUSTKEY,C_NAME from test8 CROSS join sbtest.test6 on O_CUSTKEY=c_CUSTKEY and O_ORDERKEY<'ORDERKEY_006'; +select test8.O_ORDERKEY,test8.O_CUSTKEY,C_NAME from test6 CROSS join sbtest.test8 using(id) order by test8.O_ORDERKEY,test8.O_CUSTKEY,C_NAME; +select O_ORDERKEY,O_CUSTKEY,C_NAME from sbtest.test6 as a STRAIGHT_JOIN test8 b where b.O_CUSTKEY=a.c_CUSTKEY and O_ORDERKEY<'ORDERKEY_007'; +select b.O_ORDERKEY,b.O_CUSTKEY,a.C_NAME from sbtest.test6 a STRAIGHT_JOIN test8 b on b.O_CUSTKEY=a.c_CUSTKEY and b.O_ORDERKEY<'ORDERKEY_007'; +select a.c_CUSTKEY,a.C_NAME,b.O_ORDERKEY from sbtest.test6 as a left join test8 b using(id) where a.C_CUSTKEY<'CUSTKEY_300'; +select a.c_CUSTKEY,a.C_NAME,b.O_ORDERKEY from sbtest.test6 as a left OUTER join test8 b using(id); +select a.c_CUSTKEY,a.C_NAME,b.O_ORDERKEY from test8 b right join sbtest.test6 as a using(id) where a.c_CUSTKEY<'CUSTKEY_300'; +select a.c_CUSTKEY,a.C_NAME,b.O_ORDERKEY from test8 b right join sbtest.test6 as a using(id); +select sum(O_TOTALPRICE) as sums,O_CUSTKEY,count(O_ORDERKEY) counts from test9 where O_CUSTKEY between 'CUSTKEY_013' and 'CUSTKEY_050' group by 2 asc having O_CUSTKEY<(select max(c_custkey) from test7) order by o_custkey; +select sum(O_TOTALPRICE) as sums,O_CUSTKEY,count(O_ORDERKEY) counts,MYDATE from test9 use index (ORDERS_FK1) where O_CUSTKEY between 'CUSTKEY_002' and 'CUSTKEY_300' group by o_custkey; +select sum(O_TOTALPRICE) as sums,O_CUSTKEY,count(O_ORDERKEY) counts from test9 use key (ORDERS_FK1) where O_CUSTKEY between 'CUSTKEY_002' and 'CUSTKEY_800' group by o_custkey; +select sum(O_TOTALPRICE) as sums,O_CUSTKEY,count(O_ORDERKEY) counts from test9 use key (ORDERS_FK1) ignore index (ORDERS_FK1) where O_CUSTKEY between 'CUSTKEY_002' and 'CUSTKEY_800' group by o_custkey; +select sum(O_TOTALPRICE) as sums,O_CUSTKEY,count(O_ORDERKEY) counts from test9 ignore key (ORDERS_FK1) force index (ORDERS_FK1) where O_CUSTKEY between 'CUSTKEY_002' and 'CUSTKEY_300' group by o_custkey; +select sum(O_TOTALPRICE) as sums,O_CUSTKEY,count(O_ORDERKEY) counts from test9 ignore key (ORDERS_FK1) force index (ORDERS_FK1) where O_CUSTKEY between 'CUSTKEY_002' and 'CUSTKEY_300' group by o_custkey; +select sum(O_TOTALPRICE) as sums,O_CUSTKEY,count(O_ORDERKEY) counts from test9 use index for order by (ORDERS_FK1) ignore index for group by (ORDERS_FK1) where O_CUSTKEY between 1 and 50 group by o_custkey; +select sum(O_TOTALPRICE) as sums,O_CUSTKEY,count(O_ORDERKEY) counts from test9 as a use index for group by (ORDERS_FK1) ignore index for join (ORDERS_FK1) where O_CUSTKEY between 'CUSTKEY_002' and 'CUSTKEY_300' group by o_custkey; +select sum(O_TOTALPRICE) as sums,O_CUSTKEY,count(O_ORDERKEY) counts from test9 a use index for join (ORDERS_FK1) ignore index for join (ORDERS_FK1) where O_CUSTKEY between 'CUSTKEY_002' and 'CUSTKEY_300' group by o_custkey; +select UPPER((select C_NAME FROM test7 limit 1)) FROM test7 limit 1; +select O_ORDERKEY,O_CUSTKEY from test9 as a where a.O_CUSTKEY=(select min(C_CUSTKEY) from test7); +select O_ORDERKEY,O_CUSTKEY from test9 as a where a.O_CUSTKEY<=(select min(C_CUSTKEY) from test7); +select count(*) from sbtest.test7 as a where a.c_CUSTKEY=(select max(C_CUSTKEY) from test9 where C_CUSTKEY=a.C_CUSTKEY); +select C_CUSTKEY from sbtest.test7 as a where (select count(*) from test9 where O_CUSTKEY=a.C_CUSTKEY)=2; +select count(*) from test9 as a where a.id <> all(select id from test7); +select count(*) from sbtest.test7 as a where 2>all(select count(*) from test9 where O_CUSTKEY=C_CUSTKEY); +select id,O_CUSTKEY,O_ORDERKEY,O_TOTALPRICE from test9 a where (a.O_ORDERKEY,O_CUSTKEY)=(select c_ORDERKEY,c_CUSTKEY from test7 where c_name='yanglu'); +/*comment*/ /*comment*/ select col1 /* this is a comment */ from t; +SELECT /*!40001 SQL_NO_CACHE */ * FROM t WHERE 1 limit 0, 2000; +SELECT * FROM t; +SELECT * FROM t AS u; +SELECT DISTINCT * FROM t; +SELECT DISTINCTROW * FROM t; +SELECT ALL * FROM t; +SELECT id FROM t; +SELECT * FROM t WHERE 1 = 1; +select 1 from t; +select 1 from t limit 1; +select 1 from t where not exists (select 2); +select * from sbtest.t1 where id > 4 and id <=8 order by col1 desc; +select 1 as a from t order by a; +select * from sbtest.t1 where id > 1 order by id desc limit 10; +select * from sbtest.t2 where id < 0; +select 1 as a from t where 1 < any (select 2) order by a; +SELECT * from t for update; +SELECT * from t lock in share mode; +select * from t1 right join t2 on t1.id = t2.id left join t3 on t3.id = t2.id; +select * from t1 right join t2 using (id) left join t3 using (id); +select * from t1 natural join t2; +select * from t1 natural right join t2; +select * from t1 natural left outer join t2; +select * from t1 straight_join t2 on t1.id = t2.id; +select straight_join * from t1 join t2 on t1.id = t2.id; +select straight_join * from t1 left join t2 on t1.id = t2.id; +select straight_join * from t1 right join t2 on t1.id = t2.id; +select straight_join * from t1 straight_join t2 on t1.id = t2.id; +SELECT *, CAST(col1 AS CHAR CHARACTER SET utf8) FROM t; +select max(distinct col1) from t; +select max(distinctrow col1) from t; +select max(distinct all col1) from t; +select max(distinctrow all col1) from t; +select max(col2) from t; +select min(distinct col1) from t; +select min(distinctrow col1) from t; +select min(distinct all col1) from t; +select min(col2) from t; +select sum(distinct col1) from t; +select sum(distinctrow col1) from t; +select sum(distinct all col1) from t; +select sum(distinctrow all col1) from t; +select sum(col2) from t; +select count(col1) from t; +select count(*) from t; +select count(all col1) from t; +select group_concat(col2,col1) from t group by col1; +select group_concat(distinct col2,col1) from t group by col1; +select group_concat(distinctrow col2,col1) from t group by col1; +SELECT col1, GROUP_CONCAT(DISTINCT col2 ORDER BY col2 DESC SEPARATOR ' ') FROM t GROUP BY col1; +select * from t a; +select * from t as a; +select * from t use index (primary); +select * from t use index (`primary`); +select * from t use index (); +select * from t use index (idx1); +select * from t use index (idx1, idx2); +select * from t ignore key (idx1); +select * from t force index for join (idx1); +select * from t use index for order by (idx1); +select * from t force index for group by (idx1); +select high_priority * from t; +select SQL_CACHE * from t; +select * from t; +select col2,col1 from t group by col1 with rollup; +select coalesce(col1,'ALL'),col2,col1 from t group by col1 with rollup; +select col1 from t1 group by col1 order by null; +select col1 from t1 group by col1 order by 1; +select a.id,b.id,b.pad,a.t_id from test1 a,(select all * from sbtest.test2) b where a.t_id=b.o_id; +select a.id,b.id,b.pad,a.t_id from test1 a,(select distinct * from sbtest.test2) b where a.t_id=b.o_id; +select id,o_id,name,pad from (select * from sbtest.test2 a group by a.id) a; +select * from (select pad,count(*) from sbtest.test2 a group by pad) a; +select a.id,b.id,b.pad,a.t_id from test1 a,(select * from sbtest.test2 having pad>3) b where a.t_id=b.o_id; +select a.id,b.id,b.pad,a.t_id from test1 a,(select * from sbtest.test2 where pad>3 order by id) b where a.t_id=b.o_id; +select a.id,b.id,b.pad,a.t_id from test1 a,(select * from sbtest.test2 order by id limit 3) b where a.t_id=b.o_id; +select a.id,b.id,b.pad,a.t_id from test1 a,(select * from sbtest.test2 order by id limit 3) b where a.t_id=b.o_id limit 2; +select a.id,b.id,b.pad,a.t_id from test1 a,(select * from sbtest.test2 where pad>3) b where a.t_id=b.o_id; +select * from (select sbtest.test3.pad from test1 left join sbtest.test3 on test1.pad=sbtest.test3.pad) a; +select pad,count(*) from (select * from test1 where pad>2) a group by pad; +select pad,count(*) from (select * from test1 where pad>2) a group by pad order by pad; +select count(*) from (select pad,count(*) a from test1 group by pad) a; +select a.id,b.id,b.pad,a.t_id from test1 a,(select * from sbtest.test2 where pad>3) b where a.t_id=b.o_id; +select id,pad from test1 where pad>(select pad from test1 where id=2); +select id,pad from test1 where pad<(select pad from test1 where id=2); +select id,pad from test1 where pad=(select pad from test1 where id=2); +select id,pad from test1 where pad>=(select pad from test1 where id=2); +select id,pad from test1 where pad<=(select pad from test1 where id=2); +select id,pad from test1 where pad<>(select pad from test1 where id=2); +select id,pad from test1 where pad !=(select pad from test1 where id=2); +select id,t_id,name,pad from test1 where exists(select * from test1 where pad>1); +select id,t_id,name,pad from test1 where not exists(select * from test1 where pad>1); +select id,t_id,name,pad from test1 where pad=some(select id from test1 where pad>1); +select id,t_id,name,pad from test1 where pad=any(select id from test1 where pad>1); +select id,t_id,name,pad from test1 where pad !=any(select id from test1 where pad=3); +select a.id,b.id,b.pad,a.t_id from (select test1.id,test1.pad,test1.t_id from test1 join sbtest.test3 where test1.pad=sbtest.test3.pad ) a,(select sbtest.test2.id,sbtest.test2.pad from test1 join sbtest.test2 where test1.pad=sbtest.test2.pad) b where a.pad=b.pad; +select id,t_id,name,pad from test1 where pad>(select pad from test1 where pad=2); +select id,t_id,name,pad from test1 where 2 >any(select id from test1 where pad>1); +select id,t_id,name,pad from test1 where 2<>some(select id from test1 where pad>1); +select id,t_id,name,pad from test1 where 2>all(select id from test1 where pad<1); +select * from (select m.id,n.pad from test1 m,sbtest.test2 n where m.id=n.id AND m.name='test中id为1' and m.pad>7 and m.pad<10)a; + +select a.id,b.id,b.pad,a.t_id from (select id,t_id from test1) a,(select * from sbtest.test2) b where a.t_id=b.o_id; +select co1,co2,co3 from (select id as co1,name as co2,pad as co3 from test1)as tb where co1>1; +select CURRENT_USER FROM test5; diff --git a/tests/e2e/shard/case/join/mycat/string/show.sql b/tests/e2e/shard/case/join/mycat/string/show.sql new file mode 100644 index 00000000..83b90b8f --- /dev/null +++ b/tests/e2e/shard/case/join/mycat/string/show.sql @@ -0,0 +1,54 @@ +# databases +show databases like 'sbtest'; + +# schemas +show schemas; +show open tables; +show open tables from sbtest; +show open tables in sbtest; +show open tables from sbtest like 'aly_o%'; + +# tables +show table status like 'aly_o%'/*allow_diff*/; +show table status/*allow_diff*/; +show tables; +show full tables; +show tables like 'aly_o%'; +show tables from sbtest_0; +show tables in sbtest_0; +show full tables from sbtest_0; +show full tables in sbtest_0; +show full tables from sbtest_0 like 'aly%'; +show full tables in sbtest_0 where table_type like 'base%'; + + +# columns +show columns in t1; +show columns from t1; +show full columns from t1; +show columns from t1 from sbtest_0; +show full columns from t1 from sbtest_0; +show full columns from t1 from sbtest_0 like 'n%'; +show full columns from t1 from sbtest_0 where field like 's%'; + +# index +show index from t1; +show index in t1; +show index from t1 from sbtest_0; +show index in t1 in sbtest_0; +show index in t1 from sbtest_0; +show index from t1 in sbtest_0; + +# keys +show keys from t1; +show keys in t1; +show keys from t1 from sbtest_0; +show keys from t1 in sbtest_0; +show keys in t1 in sbtest_0; +show keys in t1 from sbtest_0; + +# create +show create database sbtest_0; +show create schema sbtest_0; +show create schema if not exists sbtest_0; +show create database if not exists sbtest_0; diff --git a/tests/e2e/shard/case/join/mycat/string/skip.sql b/tests/e2e/shard/case/join/mycat/string/skip.sql new file mode 100644 index 00000000..1736b1c3 --- /dev/null +++ b/tests/e2e/shard/case/join/mycat/string/skip.sql @@ -0,0 +1,57 @@ +SELECT last_insert_id(); + +# databases +show databases; +show databases like 'sbtest'; + +# schemas +show schemas; +show open tables; +show open tables from sbtest; +show open tables in sbtest; +show open tables from sbtest like 'aly_o%'; + +# tables +show table status like 'aly_o%'/*allow_diff*/; +show table status/*allow_diff*/; +show tables; +show full tables; +show tables like 'aly_o%'; +show tables from sbtest; +show tables in sbtest; +show full tables from sbtest; +show full tables in sbtest; +show full tables from sbtest like 'aly%'; +show full tables in sbtest where table_type like 'base%'; + + +# columns +show columns in t1; +show columns from t1; +show full columns from t1; +show columns from t1 from sbtest; +show full columns from t1 from sbtest; +show full columns from t1 from sbtest like 'n%'; +show full columns from t1 from sbtest where field like 's%'; + +# index +show index from t1; +show index in t1; +show index from t1 from sbtest; +show index in t1 in sbtest; +show index in t1 from sbtest; +show index from t1 in sbtest; + +# keys +show keys from t1; +show keys in t1; +show keys from t1 from sbtest; +show keys from t1 in sbtest; +show keys in t1 in sbtest; +show keys in t1 from sbtest; + +# create +show create database sbtest; +show create schema sbtest; +show create schema if not exists sbtest; +show create database if not exists sbtest; diff --git a/tests/e2e/shard/case/join/mycat/string/unequal.sql b/tests/e2e/shard/case/join/mycat/string/unequal.sql new file mode 100644 index 00000000..da1512c8 --- /dev/null +++ b/tests/e2e/shard/case/join/mycat/string/unequal.sql @@ -0,0 +1,35 @@ +select count(id) as counts,date_format(MYDATE,'%Y-%m') as mouth from test8 where id>1 and id<50 group by 2 asc; +select sum(O_TOTALPRICE) as sums,id from test8 where id>1 and id<50 group by 2 asc; +select a.c_CUSTKEY,a.C_NAME,b.O_ORDERKEY from sbtest.test6 as a left join test8 b on b.O_CUSTKEY=a.C_CUSTKEY and a.C_CUSTKEY<'CUSTKEY_300'; +select a.c_CUSTKEY,a.C_NAME,b.O_ORDERKEY from test8 b right join sbtest.test6 as a on b.O_CUSTKEY=a.C_CUSTKEY and a.c_CUSTKEY<'CUSTKEY_300'; +select sum(O_TOTALPRICE) as sums,O_CUSTKEY,count(O_ORDERKEY) counts from test9 where O_CUSTKEY between 'CUSTKEY_003' and 'CUSTKEY_500' group by 2 asc having sums>400 order by o_custkey; +select sum(O_TOTALPRICE) as sums,O_CUSTKEY,count(O_ORDERKEY) counts from test9 where O_CUSTKEY between 'CUSTKEY_003' and 'CUSTKEY_500' group by 2 asc having sums>400 order by 2; +select sum(O_TOTALPRICE) as sums,O_CUSTKEY,count(O_ORDERKEY) counts from test9 where O_CUSTKEY between 'CUSTKEY_003' and 'CUSTKEY_500' group by 2 asc having sums>400 order by count(O_ORDERKEY), sums; +select sum(O_TOTALPRICE) as sums,O_CUSTKEY,count(O_ORDERKEY) counts from test9 where O_CUSTKEY between 'CUSTKEY_003' and 'CUSTKEY_500' group by 2 asc having sums>400 order by counts asc,2 desc; +select sum(O_TOTALPRICE) as sums,O_CUSTKEY,count(O_ORDERKEY) counts from test9 where O_CUSTKEY between 'CUSTKEY_002' and 'CUSTKEY_050' group by 2 asc having O_CUSTKEY<(select max(c_custkey) from test7) order by 2; +select sum(O_TOTALPRICE) as sums,O_CUSTKEY,count(O_ORDERKEY) counts from test9 where O_CUSTKEY between 'CUSTKEY_002' and 'CUSTKEY_050' group by 2 asc having O_CUSTKEY<(select max(c_custkey) from test7) order by count(O_ORDERKEY); +select sum(O_TOTALPRICE) as sums,O_CUSTKEY,count(O_ORDERKEY) counts from test9 where O_CUSTKEY between 'CUSTKEY_002' and 'CUSTKEY_050' group by 2 asc having O_CUSTKEY<(select max(c_custkey) from test7) order by counts asc,2 desc; +select sum(O_TOTALPRICE) as sums,O_CUSTKEY,count(O_ORDERKEY) counts from test9 where O_CUSTKEY between 'CUSTKEY_003' and 'CUSTKEY_500' group by 2 asc having sums>400 order by count(O_ORDERKEY) asc,2 desc limit 2; +select sum(O_TOTALPRICE) as sums,O_CUSTKEY,count(O_ORDERKEY) counts from test9 where O_CUSTKEY between 'CUSTKEY_003' and 'CUSTKEY_500' group by 2 asc having sums>400 order by count(O_ORDERKEY) asc,O_CUSTKEY desc limit 1,3; +select sum(O_TOTALPRICE) as sums,O_CUSTKEY,count(O_ORDERKEY) counts from test9 where O_CUSTKEY between 'CUSTKEY_003' and 'CUSTKEY_500' group by 2 asc having sums>400 order by count(O_ORDERKEY) asc,O_CUSTKEY desc limit 10 offset 1; +select sum(O_TOTALPRICE) as sums,O_CUSTKEY,count(O_ORDERKEY) counts from test9 where O_CUSTKEY between 'CUSTKEY_002' and 'CUSTKEY_050' group by 2 asc having O_CUSTKEY<(select max(c_custkey) from test7) order by count(O_ORDERKEY) asc,2 desc limit 10; +select sum(O_TOTALPRICE) as sums,O_CUSTKEY,count(O_ORDERKEY) counts from test9 where O_CUSTKEY between 'CUSTKEY_002' and 'CUSTKEY_050' group by 2 asc having O_CUSTKEY<(select max(c_custkey) from test7) order by count(O_ORDERKEY) asc,O_CUSTKEY desc limit 1,10; +select sum(O_TOTALPRICE) as sums,O_CUSTKEY,count(O_ORDERKEY) counts from test9 where O_CUSTKEY between 'CUSTKEY_002' and 'CUSTKEY_050' group by 2 asc having O_CUSTKEY<(select max(c_custkey) from test7) order by count(O_ORDERKEY) asc,O_CUSTKEY desc limit 10 offset 1; +select a.c_CUSTKEY,a.C_NAME,b.O_ORDERKEY from sbtest.test7 as a left join test9 b ignore index for join(ORDERS_FK1) on b.O_CUSTKEY=a.c_CUSTKEY and a.c_CUSTKEY<'CUSTKEY_300'; +select a.c_CUSTKEY,a.C_NAME,b.O_ORDERKEY from sbtest.test7 as a force index for join(primary) left join test9 b ignore index for join(ORDERS_FK1) on b.O_CUSTKEY=a.c_CUSTKEY and a.c_CUSTKEY<'CUSTKEY_300'; +select O_ORDERKEY,O_CUSTKEY from test9 as a where a.O_CUSTKEY<=(select min(C_CUSTKEY)+1 from test7); +select count(*) from test9 as a where 56000< all(select id from test7); +SELECT /*+ MAX_EXECUTION_TIME(1000) */ * FROM t1 INNER JOIN t2 where t1.col1 = t2.col1; +SELECT * FROM t1, t2; +SELECT * FROM t1 AS u, t2; +SELECT * FROM t1, t2 AS u; +SELECT * FROM t1 AS u, t2 AS v; +SELECT * FROM t, t1, t2; +SELECT * from t1, t2, t3; +select * from t1 join t2 left join t3 on t2.id = t3.id; +select count(distinct col1, col2) from t; +select count(distinctrow col1, col2) from t; +select group_concat(col2,col1 SEPARATOR ';') from t group by col1; +select * from t full, t1 `row`, t2 abs; +select * from t use index for group by (idx1) use index for order by (idx2), t2; +select (select name from test1 limit 1); diff --git a/tests/e2e/shard/case/join/mycat/string/unsupport.sql b/tests/e2e/shard/case/join/mycat/string/unsupport.sql new file mode 100644 index 00000000..8b137891 --- /dev/null +++ b/tests/e2e/shard/case/join/mycat/string/unsupport.sql @@ -0,0 +1 @@ + diff --git a/tests/e2e/shard/kingshard_hash.go b/tests/e2e/shard/kingshard_hash.go new file mode 100644 index 00000000..70a31902 --- /dev/null +++ b/tests/e2e/shard/kingshard_hash.go @@ -0,0 +1,158 @@ +// Copyright 2024 The Gaea Authors. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package shard + +import ( + "database/sql" + "fmt" + "path/filepath" + + "github.com/XiaoMi/Gaea/tests/e2e/config" + "github.com/XiaoMi/Gaea/tests/e2e/util" + + "github.com/onsi/ginkgo/v2" +) + +var _ = ginkgo.Describe("shard join support test in king shard hash ", func() { + e2eMgr := config.NewE2eManager() + sliceTest := e2eMgr.NsSlices[config.SliceSingleTestMaster] + sliceMulti := e2eMgr.NsSlices[config.SliceDualMaster] + ginkgo.BeforeEach(func() { + // 注册 + ns, err := config.ParseNamespaceTmpl(config.KingShardHashNamespaceTmpl, sliceMulti) + util.ExpectNoError(err) + err = e2eMgr.ModifyNamespace(ns) + util.ExpectNoError(err) + // AdminConn 可以DROP/CREATE + multiMasterA, err := sliceMulti.GetMasterAdminConn(0) + util.ExpectNoError(err) + util.ExpectNoError(util.CleanUpDatabases(multiMasterA)) + // AdminConn 可以DROP/CREATE + multiMasterB, err := sliceMulti.GetMasterAdminConn(1) + util.ExpectNoError(err) + util.ExpectNoError(util.CleanUpDatabases(multiMasterB)) + // AdminConn 可以DROP/CREATE + singleMaster, err := sliceTest.GetMasterAdminConn(0) + util.ExpectNoError(err) + util.ExpectNoError(util.CleanUpDatabases(singleMaster)) + // 获取gaea连接 + gaeaConn, err := e2eMgr.GetReadWriteGaeaUserDBConn("sbtest") + util.ExpectNoError(err) + + prepareCases := []struct { + DB *sql.DB + file string + }{ + { + DB: multiMasterA, + file: filepath.Join(e2eMgr.BasePath, "shard/case/join/0-slice0-kingshard.sql"), + }, + { + DB: multiMasterB, + file: filepath.Join(e2eMgr.BasePath, "shard/case/join/0-slice1-kingshard.sql"), + }, + { + DB: singleMaster, + file: filepath.Join(e2eMgr.BasePath, "shard/case/join/0-test-prepare.sql"), + }, + { + DB: gaeaConn, + file: filepath.Join(e2eMgr.BasePath, "shard/case/join/0-gaea-prepare.sql"), + }, + } + for _, v := range prepareCases { + sqls, err := util.GetSqlFromFile(v.file) + util.ExpectNoError(err) + for _, sql := range sqls { + _, err = util.MysqlExec(v.DB, sql) + util.ExpectNoError(err) + } + } + + }) + + ginkgo.Context("shard support test", func() { + ginkgo.It("When testing sql support", func() { + singleMaster, err := sliceTest.GetMasterCommonDBConn(0, "sbtest") + util.ExpectNoError(err) + defaultShardConn, err := sliceMulti.GetMasterCommonDBConn(0, "sbtest") + util.ExpectNoError(err) + gaeaConn, err := e2eMgr.GetReadWriteGaeaUserDBConn("sbtest") + util.ExpectNoError(err) + cases := []struct { + path string + resultType util.ResultType + gaeaConn *sql.DB + comparisonConn *sql.DB + }{ + { + filepath.Join(e2eMgr.BasePath, "shard/case/join/kingshard/equal.sql"), + util.Equal, + gaeaConn, + singleMaster, + }, + { + filepath.Join(e2eMgr.BasePath, "shard/case/join/kingshard/show.sql"), + util.Equal, + gaeaConn, + defaultShardConn, + }, + { + filepath.Join(e2eMgr.BasePath, "shard/case/join/kingshard/unequal.sql"), + util.UnEqual, + gaeaConn, + singleMaster, + }, + { + filepath.Join(e2eMgr.BasePath, "shard/case/join/kingshard/unsupport.sql"), + util.UnSupport, + gaeaConn, + singleMaster, + }, + } + for _, c := range cases { + sqls, err := util.GetSqlFromFile(c.path) + util.ExpectNoError(err) + for _, sql := range sqls { + switch c.resultType { + case util.Equal: + gaeaRes, err := util.MysqlQuery(c.gaeaConn, sql) + util.ExpectNoError(err, fmt.Sprintf("gaea exec equal sql err:%v, err:%v\n", sql, err)) + mysqlRes, err := util.MysqlQuery(c.comparisonConn, sql) + util.ExpectNoError(err, fmt.Sprintf("mysql exec equal sql err:%v, err:%v\n", sql, err)) + _, err = util.CompareIgnoreSort(gaeaRes, mysqlRes) + util.ExpectNoError(err, fmt.Sprintf("compare equal sql get uneuqal res.sql:%v, err:%v\n", sql, err)) + case util.UnSupport: + _, err := util.MysqlQuery(c.comparisonConn, sql) + util.ExpectNoError(err, fmt.Sprintf("mysql exec unsupport sql err:%v, err:%v\n", sql, err)) + gaeaRes, err := util.MysqlQuery(c.gaeaConn, sql) + util.ExpectError(err, fmt.Sprintf("gaea exec unsupport sql get no error, sql:%v,res:%v\n", sql, gaeaRes)) + case util.UnEqual: + gaeaRes, err := util.MysqlQuery(c.gaeaConn, sql) + util.ExpectNoError(err, fmt.Sprintf("gaea exec unequal sql err:%v, err:%v\n", sql, err)) + mysqlRes, err := util.MysqlQuery(c.comparisonConn, sql) + util.ExpectNoError(err, fmt.Sprintf("mysql exec unequal sql err.sql:%v, err:%v\n", sql, err)) + _, err = util.CompareIgnoreSort(gaeaRes, mysqlRes) + util.ExpectError(err, fmt.Sprintf("compare unequal sql get equal res.sql:%v, err:%v\n", sql, err), gaeaRes, mysqlRes) + } + } + } + }) + }) + + ginkgo.AfterEach(func() { + e2eMgr.Clean() + }) +}) diff --git a/tests/e2e/shard/kingshard_mod.go b/tests/e2e/shard/kingshard_mod.go new file mode 100644 index 00000000..cb2df6d4 --- /dev/null +++ b/tests/e2e/shard/kingshard_mod.go @@ -0,0 +1,158 @@ +// Copyright 2024 The Gaea Authors. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package shard + +import ( + "database/sql" + "fmt" + "path/filepath" + + "github.com/XiaoMi/Gaea/tests/e2e/config" + "github.com/XiaoMi/Gaea/tests/e2e/util" + + "github.com/onsi/ginkgo/v2" +) + +var _ = ginkgo.Describe("shard join support test in king shard mod", func() { + e2eMgr := config.NewE2eManager() + sliceTest := e2eMgr.NsSlices[config.SliceSingleTestMaster] + sliceMulti := e2eMgr.NsSlices[config.SliceDualMaster] + ginkgo.BeforeEach(func() { + // 注册 + ns, err := config.ParseNamespaceTmpl(config.KingShardModNamespaceTmpl, sliceMulti) + util.ExpectNoError(err) + err = e2eMgr.ModifyNamespace(ns) + util.ExpectNoError(err) + // AdminConn 可以DROP/CREATE + multiMasterA, err := sliceMulti.GetMasterAdminConn(0) + util.ExpectNoError(err) + util.ExpectNoError(util.CleanUpDatabases(multiMasterA)) + // AdminConn 可以DROP/CREATE + multiMasterB, err := sliceMulti.GetMasterAdminConn(1) + util.ExpectNoError(err) + util.ExpectNoError(util.CleanUpDatabases(multiMasterB)) + // AdminConn 可以DROP/CREATE + singleMaster, err := sliceTest.GetMasterAdminConn(0) + util.ExpectNoError(err) + util.ExpectNoError(util.CleanUpDatabases(singleMaster)) + // 获取gaea连接 + gaeaConn, err := e2eMgr.GetReadWriteGaeaUserDBConn("sbtest") + util.ExpectNoError(err) + + prepareCases := []struct { + DB *sql.DB + file string + }{ + { + DB: multiMasterA, + file: filepath.Join(e2eMgr.BasePath, "shard/case/join/0-slice0-kingshard.sql"), + }, + { + DB: multiMasterB, + file: filepath.Join(e2eMgr.BasePath, "shard/case/join/0-slice1-kingshard.sql"), + }, + { + DB: singleMaster, + file: filepath.Join(e2eMgr.BasePath, "shard/case/join/0-test-prepare.sql"), + }, + { + DB: gaeaConn, + file: filepath.Join(e2eMgr.BasePath, "shard/case/join/0-gaea-prepare.sql"), + }, + } + for _, v := range prepareCases { + sqls, err := util.GetSqlFromFile(v.file) + util.ExpectNoError(err) + for _, sql := range sqls { + _, err = util.MysqlExec(v.DB, sql) + util.ExpectNoError(err) + } + } + + }) + + ginkgo.Context("shard support test", func() { + ginkgo.It("When testing sql support", func() { + singleMaster, err := sliceTest.GetMasterCommonDBConn(0, "sbtest") + util.ExpectNoError(err) + defaultShardConn, err := sliceMulti.GetMasterCommonDBConn(0, "sbtest") + util.ExpectNoError(err) + gaeaConn, err := e2eMgr.GetReadWriteGaeaUserDBConn("sbtest") + util.ExpectNoError(err) + + cases := []struct { + path string + resultType util.ResultType + gaeaConn *sql.DB + comparisonConn *sql.DB + }{ + { + filepath.Join(e2eMgr.BasePath, "shard/case/join/kingshard/equal.sql"), + util.Equal, + gaeaConn, + singleMaster, + }, + { + filepath.Join(e2eMgr.BasePath, "shard/case/join/kingshard/show.sql"), + util.Equal, + gaeaConn, + defaultShardConn, + }, + { + filepath.Join(e2eMgr.BasePath, "shard/case/join/kingshard/unequal.sql"), + util.UnEqual, + gaeaConn, + singleMaster, + }, + { + filepath.Join(e2eMgr.BasePath, "shard/case/join/kingshard/unsupport.sql"), + util.UnSupport, + gaeaConn, + singleMaster, + }, + } + for _, c := range cases { + sqls, err := util.GetSqlFromFile(c.path) + util.ExpectNoError(err) + for _, sql := range sqls { + switch c.resultType { + case util.Equal: + gaeaRes, err := util.MysqlQuery(c.gaeaConn, sql) + util.ExpectNoError(err, fmt.Sprintf("gaea exec equal sql err:%v, err:%v\n", sql, err)) + mysqlRes, err := util.MysqlQuery(c.comparisonConn, sql) + util.ExpectNoError(err, fmt.Sprintf("mysql exec equal sql err:%v, err:%v\n", sql, err)) + _, err = util.CompareIgnoreSort(gaeaRes, mysqlRes) + util.ExpectNoError(err, fmt.Sprintf("compare equal sql get uneuqal res.sql:%v, err:%v\n", sql, err)) + case util.UnSupport: + _, err := util.MysqlQuery(c.comparisonConn, sql) + util.ExpectNoError(err, fmt.Sprintf("mysql exec unsupport sql err:%v, err:%v\n", sql, err)) + gaeaRes, err := util.MysqlQuery(c.gaeaConn, sql) + util.ExpectError(err, fmt.Sprintf("gaea exec unsupport sql get no error, sql:%v,res:%v\n", sql, gaeaRes)) + case util.UnEqual: + gaeaRes, err := util.MysqlQuery(c.gaeaConn, sql) + util.ExpectNoError(err, fmt.Sprintf("gaea exec unequal sql err:%v, err:%v\n", sql, err)) + mysqlRes, err := util.MysqlQuery(c.comparisonConn, sql) + util.ExpectNoError(err, fmt.Sprintf("mysql exec unequal sql err.sql:%v, err:%v\n", sql, err)) + _, err = util.CompareIgnoreSort(gaeaRes, mysqlRes) + util.ExpectError(err, fmt.Sprintf("compare unequal sql get equal res.sql:%v, err:%v\n", sql, err), gaeaRes, mysqlRes) + } + } + } + }) + }) + ginkgo.AfterEach(func() { + e2eMgr.Clean() + }) +}) diff --git a/tests/e2e/shard/mycat_long.go b/tests/e2e/shard/mycat_long.go new file mode 100644 index 00000000..d6024e5c --- /dev/null +++ b/tests/e2e/shard/mycat_long.go @@ -0,0 +1,161 @@ +// Copyright 2024 The Gaea Authors. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package shard + +import ( + "database/sql" + "fmt" + "path/filepath" + + "github.com/XiaoMi/Gaea/tests/e2e/config" + "github.com/XiaoMi/Gaea/tests/e2e/util" + + "github.com/onsi/ginkgo/v2" +) + +var _ = ginkgo.Describe("shard join support test in mycat long", func() { + e2eMgr := config.NewE2eManager() + sliceTest := e2eMgr.NsSlices[config.SliceSingleTestMaster] + sliceMulti := e2eMgr.NsSlices[config.SliceDualMaster] + ginkgo.BeforeEach(func() { + // 注册 + ns, err := config.ParseNamespaceTmpl(config.MycatLongNamespaceTmpl, sliceMulti) + util.ExpectNoError(err) + err = e2eMgr.ModifyNamespace(ns) + util.ExpectNoError(err) + + // AdminConn 可以DROP/CREATE + multiMasterA, err := sliceMulti.GetMasterAdminConn(0) + util.ExpectNoError(err) + util.ExpectNoError(util.CleanUpDatabases(multiMasterA)) + + // AdminConn 可以DROP/CREATE + multiMasterB, err := sliceMulti.GetMasterAdminConn(1) + util.ExpectNoError(err) + util.ExpectNoError(util.CleanUpDatabases(multiMasterB)) + // AdminConn 可以DROP/CREATE + singleMaster, err := sliceTest.GetMasterAdminConn(0) + util.ExpectNoError(err) + util.ExpectNoError(util.CleanUpDatabases(singleMaster)) + // 获取gaea连接 + gaeaConn, err := e2eMgr.GetReadWriteGaeaUserDBConn("sbtest") + util.ExpectNoError(err) + + prepareCases := []struct { + DB *sql.DB + file string + }{ + { + DB: multiMasterA, + file: filepath.Join(e2eMgr.BasePath, "shard/case/join/0-slice0-mycat.sql"), + }, + { + DB: multiMasterB, + file: filepath.Join(e2eMgr.BasePath, "shard/case/join/0-slice1-mycat.sql"), + }, + { + DB: singleMaster, + file: filepath.Join(e2eMgr.BasePath, "shard/case/join/0-test-prepare.sql"), + }, + { + DB: gaeaConn, + file: filepath.Join(e2eMgr.BasePath, "shard/case/join/0-gaea-prepare.sql"), + }, + } + for _, v := range prepareCases { + sqls, err := util.GetSqlFromFile(v.file) + util.ExpectNoError(err) + for _, sql := range sqls { + _, err = util.MysqlExec(v.DB, sql) + util.ExpectNoError(err) + } + } + + }) + + ginkgo.Context("shard support test", func() { + ginkgo.It("When testing sql support", func() { + // gaea使用的ns中的用户是普通权限的用户 + singleMaster, err := sliceTest.GetMasterCommonDBConn(0, "sbtest") + util.ExpectNoError(err) + defaultShardConn, err := sliceMulti.GetMasterCommonDBConn(0, "sbtest_0") + util.ExpectNoError(err) + gaeaConn, err := e2eMgr.GetReadWriteGaeaUserDBConn("sbtest") + util.ExpectNoError(err) + + cases := []struct { + path string + resultType util.ResultType + gaeaConn *sql.DB + comparisonConn *sql.DB + }{ + { + filepath.Join(e2eMgr.BasePath, "shard/case/join/mycat/long/equal.sql"), + util.Equal, + gaeaConn, + singleMaster, + }, + { + filepath.Join(e2eMgr.BasePath, "shard/case/join/mycat/long/show.sql"), + util.Equal, + gaeaConn, + defaultShardConn, + }, + { + filepath.Join(e2eMgr.BasePath, "shard/case/join/mycat/long/unequal.sql"), + util.UnEqual, + gaeaConn, + singleMaster, + }, + { + filepath.Join(e2eMgr.BasePath, "shard/case/join/mycat/long/unsupport.sql"), + util.UnSupport, + gaeaConn, + singleMaster, + }, + } + for _, c := range cases { + sqls, err := util.GetSqlFromFile(c.path) + util.ExpectNoError(err) + for _, sql := range sqls { + switch c.resultType { + case util.Equal: + gaeaRes, err := util.MysqlQuery(c.gaeaConn, sql) + util.ExpectNoError(err, fmt.Sprintf("gaea exec equal sql err:%v, err:%v\n", sql, err)) + mysqlRes, err := util.MysqlQuery(c.comparisonConn, sql) + util.ExpectNoError(err, fmt.Sprintf("mysql exec equal sql err:%v, err:%v\n", sql, err)) + _, err = util.CompareIgnoreSort(gaeaRes, mysqlRes) + util.ExpectNoError(err, fmt.Sprintf("compare equal sql get uneuqal res.sql:%v, err:%v\n", sql, err)) + case util.UnSupport: + _, err := util.MysqlQuery(c.comparisonConn, sql) + util.ExpectNoError(err, fmt.Sprintf("mysql exec unsupport sql err:%v, err:%v\n", sql, err)) + gaeaRes, err := util.MysqlQuery(c.gaeaConn, sql) + util.ExpectError(err, fmt.Sprintf("gaea exec unsupport sql get no error, sql:%v,res:%v\n", sql, gaeaRes)) + case util.UnEqual: + gaeaRes, err := util.MysqlQuery(c.gaeaConn, sql) + util.ExpectNoError(err, fmt.Sprintf("gaea exec unequal sql err:%v, err:%v\n", sql, err)) + mysqlRes, err := util.MysqlQuery(c.comparisonConn, sql) + util.ExpectNoError(err, fmt.Sprintf("mysql exec unequal sql err.sql:%v, err:%v\n", sql, err)) + _, err = util.CompareIgnoreSort(gaeaRes, mysqlRes) + util.ExpectError(err, fmt.Sprintf("compare unequal sql get equal res.sql:%v, err:%v\n", sql, err), gaeaRes, mysqlRes) + } + } + } + }) + }) + ginkgo.AfterEach(func() { + e2eMgr.Clean() + }) +}) diff --git a/tests/e2e/shard/mycat_mod.go b/tests/e2e/shard/mycat_mod.go new file mode 100644 index 00000000..8c3048d0 --- /dev/null +++ b/tests/e2e/shard/mycat_mod.go @@ -0,0 +1,157 @@ +// Copyright 2024 The Gaea Authors. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package shard + +import ( + "database/sql" + "fmt" + "path/filepath" + + "github.com/XiaoMi/Gaea/tests/e2e/config" + "github.com/XiaoMi/Gaea/tests/e2e/util" + "github.com/onsi/ginkgo/v2" +) + +var _ = ginkgo.Describe("shard join support test in mycat mod", func() { + e2eMgr := config.NewE2eManager() + sliceTest := e2eMgr.NsSlices[config.SliceSingleTestMaster] + sliceMulti := e2eMgr.NsSlices[config.SliceDualMaster] + ginkgo.BeforeEach(func() { + // 注册 + ns, err := config.ParseNamespaceTmpl(config.MycatModNamespaceTmpl, sliceMulti) + util.ExpectNoError(err) + err = e2eMgr.ModifyNamespace(ns) + util.ExpectNoError(err) + + // AdminConn 可以DROP/CREATE + multiMasterA, err := sliceMulti.GetMasterAdminConn(0) + util.ExpectNoError(err) + util.ExpectNoError(util.CleanUpDatabases(multiMasterA)) + // AdminConn 可以DROP/CREATE + multiMasterB, err := sliceMulti.GetMasterAdminConn(1) + util.ExpectNoError(err) + util.ExpectNoError(util.CleanUpDatabases(multiMasterB)) + // AdminConn 可以DROP/CREATE + singleMaster, err := sliceTest.GetMasterAdminConn(0) + util.ExpectNoError(err) + util.ExpectNoError(util.CleanUpDatabases(singleMaster)) + // 获取gaea连接 + gaeaConn, err := e2eMgr.GetReadWriteGaeaUserDBConn("sbtest") + util.ExpectNoError(err) + + prepareCases := []struct { + DB *sql.DB + file string + }{ + { + DB: multiMasterA, + file: filepath.Join(e2eMgr.BasePath, "shard/case/join/0-slice0-mycat.sql"), + }, + { + DB: multiMasterB, + file: filepath.Join(e2eMgr.BasePath, "shard/case/join/0-slice1-mycat.sql"), + }, + { + DB: singleMaster, + file: filepath.Join(e2eMgr.BasePath, "shard/case/join/0-test-prepare.sql"), + }, + { + DB: gaeaConn, + file: filepath.Join(e2eMgr.BasePath, "shard/case/join/0-gaea-prepare.sql"), + }, + } + for _, v := range prepareCases { + sqls, err := util.GetSqlFromFile(v.file) + util.ExpectNoError(err) + for _, sql := range sqls { + _, err = util.MysqlExec(v.DB, sql) + util.ExpectNoError(err) + } + } + }) + + ginkgo.Context("shard support test", func() { + ginkgo.It("When testing sql support", func() { + // gaea使用的ns中的用户是普通权限的用户 + singleMaster, err := sliceTest.GetMasterCommonDBConn(0, "sbtest") + util.ExpectNoError(err) + defaultShardConn, err := sliceMulti.GetMasterCommonDBConn(0, "sbtest_0") + util.ExpectNoError(err) + gaeaConn, err := e2eMgr.GetReadWriteGaeaUserDBConn("sbtest") + util.ExpectNoError(err) + cases := []struct { + path string + resultType util.ResultType + gaeaConn *sql.DB + comparisonConn *sql.DB + }{ + { + filepath.Join(e2eMgr.BasePath, "shard/case/join/mycat/mod/equal.sql"), + util.Equal, + gaeaConn, + singleMaster, + }, + { + filepath.Join(e2eMgr.BasePath, "shard/case/join/mycat/mod/show.sql"), + util.Equal, + gaeaConn, + defaultShardConn, + }, + { + filepath.Join(e2eMgr.BasePath, "shard/case/join/mycat/mod/unequal.sql"), + util.UnEqual, + gaeaConn, + singleMaster, + }, + { + filepath.Join(e2eMgr.BasePath, "shard/case/join/mycat/mod/unsupport.sql"), + util.UnSupport, + gaeaConn, + singleMaster, + }, + } + for _, c := range cases { + sqls, err := util.GetSqlFromFile(c.path) + util.ExpectNoError(err) + for _, sql := range sqls { + switch c.resultType { + case util.Equal: + gaeaRes, err := util.MysqlQuery(c.gaeaConn, sql) + util.ExpectNoError(err, fmt.Sprintf("gaea exec equal sql err:%v, err:%v\n", sql, err)) + mysqlRes, err := util.MysqlQuery(c.comparisonConn, sql) + util.ExpectNoError(err, fmt.Sprintf("mysql exec equal sql err:%v, err:%v\n", sql, err)) + _, err = util.CompareIgnoreSort(gaeaRes, mysqlRes) + util.ExpectNoError(err, fmt.Sprintf("compare equal sql get uneuqal res.sql:%v, err:%v\n", sql, err)) + case util.UnSupport: + _, err := util.MysqlQuery(c.comparisonConn, sql) + util.ExpectNoError(err, fmt.Sprintf("mysql exec unsupport sql err:%v, err:%v\n", sql, err)) + gaeaRes, err := util.MysqlQuery(c.gaeaConn, sql) + util.ExpectError(err, fmt.Sprintf("gaea exec unsupport sql get no error, sql:%v,res:%v\n", sql, gaeaRes)) + case util.UnEqual: + gaeaRes, err := util.MysqlQuery(c.gaeaConn, sql) + util.ExpectNoError(err, fmt.Sprintf("gaea exec unequal sql err:%v, err:%v\n", sql, err)) + mysqlRes, err := util.MysqlQuery(c.comparisonConn, sql) + util.ExpectNoError(err, fmt.Sprintf("mysql exec unequal sql err.sql:%v, err:%v\n", sql, err)) + _, err = util.CompareIgnoreSort(gaeaRes, mysqlRes) + util.ExpectError(err, fmt.Sprintf("compare unequal sql get equal res.sql:%v, err:%v\n", sql, err), gaeaRes, mysqlRes) + } + } + } + }) + }) + ginkgo.AfterEach(func() { + e2eMgr.Clean() + }) +}) diff --git a/tests/e2e/shard/mycat_murmur.go b/tests/e2e/shard/mycat_murmur.go new file mode 100644 index 00000000..25d58414 --- /dev/null +++ b/tests/e2e/shard/mycat_murmur.go @@ -0,0 +1,160 @@ +// Copyright 2024 The Gaea Authors. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package shard + +import ( + "database/sql" + "fmt" + "path/filepath" + + "github.com/XiaoMi/Gaea/tests/e2e/config" + "github.com/XiaoMi/Gaea/tests/e2e/util" + + "github.com/onsi/ginkgo/v2" +) + +var _ = ginkgo.Describe("shard join support test in mycat murmur", func() { + e2eMgr := config.NewE2eManager() + sliceTest := e2eMgr.NsSlices[config.SliceSingleTestMaster] + sliceMulti := e2eMgr.NsSlices[config.SliceDualMaster] + ginkgo.BeforeEach(func() { + // 注册 + ns, err := config.ParseNamespaceTmpl(config.MycatMurmurNamespaceTmpl, sliceMulti) + util.ExpectNoError(err) + err = e2eMgr.ModifyNamespace(ns) + util.ExpectNoError(err) + // AdminConn 可以DROP/CREATE + multiMasterA, err := sliceMulti.GetMasterAdminConn(0) + util.ExpectNoError(err) + util.ExpectNoError(util.CleanUpDatabases(multiMasterA)) + // AdminConn 可以DROP/CREATE + multiMasterB, err := sliceMulti.GetMasterAdminConn(1) + util.ExpectNoError(err) + util.ExpectNoError(util.CleanUpDatabases(multiMasterB)) + // AdminConn 可以DROP/CREATE + singleMaster, err := sliceTest.GetMasterAdminConn(0) + util.ExpectNoError(err) + util.ExpectNoError(util.CleanUpDatabases(singleMaster)) + // 获取gaea连接 + gaeaConn, err := e2eMgr.GetReadWriteGaeaUserDBConn("sbtest") + util.ExpectNoError(err) + + prepareCases := []struct { + DB *sql.DB + file string + }{ + { + DB: multiMasterA, + file: filepath.Join(e2eMgr.BasePath, "shard/case/join/0-slice0-mycat.sql"), + }, + { + DB: multiMasterB, + file: filepath.Join(e2eMgr.BasePath, "shard/case/join/0-slice1-mycat.sql"), + }, + { + DB: singleMaster, + file: filepath.Join(e2eMgr.BasePath, "shard/case/join/0-test-prepare.sql"), + }, + { + DB: gaeaConn, + file: filepath.Join(e2eMgr.BasePath, "shard/case/join/0-gaea-prepare.sql"), + }, + } + for _, v := range prepareCases { + sqls, err := util.GetSqlFromFile(v.file) + util.ExpectNoError(err) + for _, sql := range sqls { + _, err = util.MysqlExec(v.DB, sql) + util.ExpectNoError(err) + } + } + + }) + + ginkgo.Context("shard support test", func() { + ginkgo.It("When testing sql support", func() { + // gaea使用的ns中的用户是普通权限的用户 + singleMaster, err := sliceTest.GetMasterCommonDBConn(0, "sbtest") + util.ExpectNoError(err) + defaultShardConn, err := sliceMulti.GetMasterCommonDBConn(0, "sbtest_0") + util.ExpectNoError(err) + gaeaConn, err := e2eMgr.GetReadWriteGaeaUserDBConn("sbtest") + util.ExpectNoError(err) + + cases := []struct { + path string + resultType util.ResultType + gaeaConn *sql.DB + comparisonConn *sql.DB + }{ + { + filepath.Join(e2eMgr.BasePath, "shard/case/join/mycat/murmur/equal.sql"), + util.Equal, + gaeaConn, + singleMaster, + }, + + { + filepath.Join(e2eMgr.BasePath, "shard/case/join/mycat/murmur/show.sql"), + util.Equal, + gaeaConn, + defaultShardConn, + }, + { + filepath.Join(e2eMgr.BasePath, "shard/case/join/mycat/murmur/unequal.sql"), + util.UnEqual, + gaeaConn, + singleMaster, + }, + { + filepath.Join(e2eMgr.BasePath, "shard/case/join/mycat/murmur/unsupport.sql"), + util.UnSupport, + gaeaConn, + singleMaster, + }, + } + for _, c := range cases { + sqls, err := util.GetSqlFromFile(c.path) + util.ExpectNoError(err) + for _, sql := range sqls { + switch c.resultType { + case util.Equal: + gaeaRes, err := util.MysqlQuery(c.gaeaConn, sql) + util.ExpectNoError(err, fmt.Sprintf("gaea exec equal sql err:%v, err:%v\n", sql, err)) + mysqlRes, err := util.MysqlQuery(c.comparisonConn, sql) + util.ExpectNoError(err, fmt.Sprintf("mysql exec equal sql err:%v, err:%v\n", sql, err)) + _, err = util.CompareIgnoreSort(gaeaRes, mysqlRes) + util.ExpectNoError(err, fmt.Sprintf("compare equal sql get uneuqal res.sql:%v, err:%v\n", sql, err)) + case util.UnSupport: + _, err := util.MysqlQuery(c.comparisonConn, sql) + util.ExpectNoError(err, fmt.Sprintf("mysql exec unsupport sql err:%v, err:%v\n", sql, err)) + gaeaRes, err := util.MysqlQuery(c.gaeaConn, sql) + util.ExpectError(err, fmt.Sprintf("gaea exec unsupport sql get no error, sql:%v,res:%v\n", sql, gaeaRes)) + case util.UnEqual: + gaeaRes, err := util.MysqlQuery(c.gaeaConn, sql) + util.ExpectNoError(err, fmt.Sprintf("gaea exec unequal sql err:%v, err:%v\n", sql, err)) + mysqlRes, err := util.MysqlQuery(c.comparisonConn, sql) + util.ExpectNoError(err, fmt.Sprintf("mysql exec unequal sql err.sql:%v, err:%v\n", sql, err)) + _, err = util.CompareIgnoreSort(gaeaRes, mysqlRes) + util.ExpectError(err, fmt.Sprintf("compare unequal sql get equal res.sql:%v, err:%v\n", sql, err), gaeaRes, mysqlRes) + } + } + } + }) + }) + ginkgo.AfterEach(func() { + e2eMgr.Clean() + }) +}) diff --git a/tests/e2e/shard/mycat_string.go b/tests/e2e/shard/mycat_string.go new file mode 100644 index 00000000..9b584a51 --- /dev/null +++ b/tests/e2e/shard/mycat_string.go @@ -0,0 +1,158 @@ +// Copyright 2024 The Gaea Authors. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package shard + +import ( + "database/sql" + "fmt" + "path/filepath" + + "github.com/XiaoMi/Gaea/tests/e2e/config" + "github.com/XiaoMi/Gaea/tests/e2e/util" + + "github.com/onsi/ginkgo/v2" +) + +var _ = ginkgo.Describe("shard join support test in mycat string", func() { + e2eMgr := config.NewE2eManager() + sliceTest := e2eMgr.NsSlices[config.SliceSingleTestMaster] + sliceMulti := e2eMgr.NsSlices[config.SliceDualMaster] + ginkgo.BeforeEach(func() { + // 注册 + ns, err := config.ParseNamespaceTmpl(config.MycatStringNamespaceTmpl, sliceMulti) + util.ExpectNoError(err) + err = e2eMgr.ModifyNamespace(ns) + util.ExpectNoError(err) + // AdminConn 可以DROP/CREATE + multiMasterA, err := sliceMulti.GetMasterAdminConn(0) + util.ExpectNoError(err) + util.ExpectNoError(util.CleanUpDatabases(multiMasterA)) + // AdminConn 可以DROP/CREATE + multiMasterB, err := sliceMulti.GetMasterAdminConn(1) + util.ExpectNoError(err) + util.ExpectNoError(util.CleanUpDatabases(multiMasterB)) + // AdminConn 可以DROP/CREATE + singleMaster, err := sliceTest.GetMasterAdminConn(0) + util.ExpectNoError(err) + util.ExpectNoError(util.CleanUpDatabases(singleMaster)) + // 获取gaea连接 + gaeaConn, err := e2eMgr.GetReadWriteGaeaUserDBConn("sbtest") + util.ExpectNoError(err) + + prepareCases := []struct { + DB *sql.DB + file string + }{ + { + DB: multiMasterA, + file: filepath.Join(e2eMgr.BasePath, "shard/case/join/0-slice0-mycat.sql"), + }, + { + DB: multiMasterB, + file: filepath.Join(e2eMgr.BasePath, "shard/case/join/0-slice1-mycat.sql"), + }, + { + DB: singleMaster, + file: filepath.Join(e2eMgr.BasePath, "shard/case/join/0-test-prepare.sql"), + }, + { + DB: gaeaConn, + file: filepath.Join(e2eMgr.BasePath, "shard/case/join/0-gaea-prepare.sql"), + }, + } + for _, v := range prepareCases { + sqls, err := util.GetSqlFromFile(v.file) + util.ExpectNoError(err) + for _, sql := range sqls { + _, err = util.MysqlExec(v.DB, sql) + util.ExpectNoError(err) + } + } + + }) + ginkgo.Context("shard support test", func() { + ginkgo.It("When testing sql support", func() { + // gaea使用的ns中的用户是普通权限的用户 + singleMaster, err := sliceTest.GetMasterCommonDBConn(0, "sbtest") + util.ExpectNoError(err) + defaultShardConn, err := sliceMulti.GetMasterCommonDBConn(0, "sbtest_0") + util.ExpectNoError(err) + gaeaConn, err := e2eMgr.GetReadWriteGaeaUserDBConn("sbtest") + util.ExpectNoError(err) + + cases := []struct { + path string + resultType util.ResultType + gaeaConn *sql.DB + comparisonConn *sql.DB + }{ + { + filepath.Join(e2eMgr.BasePath, "shard/case/join/mycat/string/equal.sql"), + util.Equal, + gaeaConn, + singleMaster, + }, + { + filepath.Join(e2eMgr.BasePath, "shard/case/join/mycat/string/show.sql"), + util.Equal, + gaeaConn, + defaultShardConn, + }, + { + filepath.Join(e2eMgr.BasePath, "shard/case/join/mycat/string/unequal.sql"), + util.UnEqual, + gaeaConn, + singleMaster, + }, + { + filepath.Join(e2eMgr.BasePath, "shard/case/join/mycat/string/unsupport.sql"), + util.UnSupport, + gaeaConn, + singleMaster, + }, + } + for _, c := range cases { + sqls, err := util.GetSqlFromFile(c.path) + util.ExpectNoError(err) + for _, sql := range sqls { + switch c.resultType { + case util.Equal: + gaeaRes, err := util.MysqlQuery(c.gaeaConn, sql) + util.ExpectNoError(err, fmt.Sprintf("gaea exec equal sql err:%v, err:%v\n", sql, err)) + mysqlRes, err := util.MysqlQuery(c.comparisonConn, sql) + util.ExpectNoError(err, fmt.Sprintf("mysql exec equal sql err:%v, err:%v\n", sql, err)) + _, err = util.CompareIgnoreSort(gaeaRes, mysqlRes) + util.ExpectNoError(err, fmt.Sprintf("compare equal sql get uneuqal res.sql:%v, err:%v\n", sql, err)) + case util.UnSupport: + _, err := util.MysqlQuery(c.comparisonConn, sql) + util.ExpectNoError(err, fmt.Sprintf("mysql exec unsupport sql err:%v, err:%v\n", sql, err)) + gaeaRes, err := util.MysqlQuery(c.gaeaConn, sql) + util.ExpectError(err, fmt.Sprintf("gaea exec unsupport sql get no error, sql:%v,res:%v\n", sql, gaeaRes)) + case util.UnEqual: + gaeaRes, err := util.MysqlQuery(c.gaeaConn, sql) + util.ExpectNoError(err, fmt.Sprintf("gaea exec unequal sql err:%v, err:%v\n", sql, err)) + mysqlRes, err := util.MysqlQuery(c.comparisonConn, sql) + util.ExpectNoError(err, fmt.Sprintf("mysql exec unequal sql err.sql:%v, err:%v\n", sql, err)) + _, err = util.CompareIgnoreSort(gaeaRes, mysqlRes) + util.ExpectError(err, fmt.Sprintf("compare unequal sql get equal res.sql:%v, err:%v\n", sql, err), gaeaRes, mysqlRes) + } + } + } + }) + }) + ginkgo.AfterEach(func() { + e2eMgr.Clean() + }) +}) diff --git a/tests/e2e/shard/shard.go b/tests/e2e/shard/shard.go new file mode 100644 index 00000000..03261f64 --- /dev/null +++ b/tests/e2e/shard/shard.go @@ -0,0 +1,75 @@ +// Copyright 2024 The Gaea Authors. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package shard + +import ( + "fmt" + "path/filepath" + + "github.com/XiaoMi/Gaea/tests/e2e/config" + "github.com/XiaoMi/Gaea/tests/e2e/util" + "github.com/onsi/ginkgo/v2" +) + +var _ = ginkgo.Describe("shard_dml_support_test", func() { + e2eMgr := config.NewE2eManager() + sliceMulti := e2eMgr.NsSlices[config.SliceDualMaster] + planManagers := []*config.PlanManager{} + gaeaConn, err := e2eMgr.GetReadWriteGaeaUserConn() + util.ExpectNoError(err) + + ginkgo.BeforeEach(func() { + // 注册 + ns, err := config.ParseNamespaceTmpl(config.ShardNamespaceTmpl, sliceMulti) + util.ExpectNoError(err) + err = e2eMgr.ModifyNamespace(ns) + util.ExpectNoError(err) + + ginkgo.By("init case path") + casesPath, err := config.GetJSONFilesFromDir(filepath.Join(e2eMgr.BasePath, "shard/case/dml")) + util.ExpectNoError(err) + + ginkgo.By("get sql plan") + clusterConn, err := sliceMulti.GetLocalSliceConn() + util.ExpectNoError(err) + + for _, v := range casesPath { + p := &config.PlanManager{ + PlanPath: v, + MysqlClusterConn: clusterConn, + GaeaDB: gaeaConn, + } + ginkgo.By(fmt.Sprintf("plan %s init", v)) + planManagers = append(planManagers, p) + } + + }) + ginkgo.Context("shard support test", func() { + ginkgo.It("shard support", func() { + for _, p := range planManagers { + err = p.Init() + util.ExpectNoError(err) + err := p.Run() + util.ExpectNoError(err) + } + }) + }) + ginkgo.AfterEach(func() { + for _, p := range planManagers { + p.MysqlClusterConnClose() + } + e2eMgr.Clean() + }) +}) diff --git a/tests/e2e/unshard/case/dml/delete.json b/tests/e2e/unshard/case/dml/delete.json new file mode 100644 index 00000000..b7f09b04 --- /dev/null +++ b/tests/e2e/unshard/case/dml/delete.json @@ -0,0 +1,221 @@ +{ + "execCases": [ + { + "description": "Test case for DELETE with ORDER BY and LIMIT", + "setUp": [ + { + "slice": "slice-0", + "sql": "DROP DATABASE IF EXISTS db_test_delete" + }, + { + "slice": "slice-0", + "sql": "CREATE DATABASE db_test_delete" + }, + { + "slice": "slice-0", + "sql": "USE db_test_delete" + }, + { + "slice": "slice-0", + "sql": "CREATE TABLE tbl1 (id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(50), age INT)" + }, + { + "slice": "slice-0", + "sql": "CREATE TABLE tbl2 (id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(50), age INT, ref_id INT)" + } + ], + "gaeaActions": [ + { + "sql": "USE db_test_delete", + "execType": "Default" + }, + { + "sql": "INSERT INTO tbl1 (name, age) VALUES ('User1', 30), ('User2', 29), ('User3', 28), ('User4', 27)", + "execType": "Default" + }, + { + "sql": "INSERT INTO tbl2 (name, age, ref_id) VALUES ('User1', 30, 1), ('User2', 29, 2), ('User3', 28, 3), ('User4', 27, 4)", + "execType": "Default" + }, + { + "sql": "DELETE FROM tbl1 ORDER BY age DESC LIMIT 2", + "execType": "Default" + } + ], + "masterCheckSQL": [ + { + "slice": "slice-0", + "db": "db_test_delete", + "name": "Check master after DELETE with ORDER BY and LIMIT", + "sql": "SELECT * FROM tbl1 WHERE name IN ('User1', 'User2')", + "execType": "Query", + "expect": [] + }, + { + "slice": "slice-0", + "db": "db_test_delete", + "name": "Check master after DELETE with ORDER BY and LIMIT", + "sql": "SELECT * FROM tbl1 WHERE name IN ('User3', 'User4')", + "execType": "Query", + "expect": [ + ["3","User3","28"], + ["4","User4","27"] + ] + }, + { + "slice": "slice-0", + "db": "db_test_delete", + "name": "Check master after DELETE with ORDER BY and LIMIT", + "sql": "SELECT * FROM tbl2 WHERE name IN ('User3', 'User4')", + "execType": "Query", + "expect": [ + + ["3","User3","28","3"], + ["4","User4","27","4"] + ] + } + ], + "tearDown": [ + { + "slice": "slice-0", + "sql": "DROP DATABASE IF EXISTS db_test_delete" + } + ] + }, + { + "description": "Test case for multi-table DELETE", + "setUp": [ + { + "slice": "slice-0", + "sql": "DROP DATABASE IF EXISTS db_test_delete" + }, + { + "slice": "slice-0", + "sql": "CREATE DATABASE db_test_delete" + }, + { + "slice": "slice-0", + "sql": "USE db_test_delete" + }, + { + "slice": "slice-0", + "sql": "CREATE TABLE tbl1 (id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(50), age INT)" + }, + { + "slice": "slice-0", + "sql": "CREATE TABLE tbl2 (id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(50), age INT, ref_id INT)" + } + ], + "gaeaActions": [ + { + "sql": "USE db_test_delete", + "execType": "Default" + }, + { + "sql": "INSERT INTO tbl1 (name, age) VALUES ('User1', 30), ('User2', 29), ('User3', 28), ('User4', 27)", + "execType": "Default" + }, + { + "sql": "INSERT INTO tbl2 (name, age, ref_id) VALUES ('User1', 30, 1), ('User2', 29, 2), ('User3', 28, 3), ('User4', 27, 4)", + "execType": "Default" + }, + { + "sql": "DELETE tbl1, tbl2 FROM tbl1 INNER JOIN tbl2 ON tbl1.id = tbl2.id WHERE tbl1.age >=28", + "execType": "Default" + } + ], + "masterCheckSQL": [ + { + "slice": "slice-0", + "db": "db_test_delete", + "name": "Check master after multi-table DELETE for tbl1", + "sql": "SELECT * FROM tbl1 WHERE name IN ('User3')", + "execType": "Query", + "expect": [] + }, + { + "slice": "slice-0", + "db": "db_test_delete", + "name": "Check master after multi-table DELETE for tbl2", + "sql": "SELECT * FROM tbl2 WHERE name IN ('User3')", + "execType": "Query", + "expect": [] + } + ], + "tearDown": [ + { + "slice": "slice-0", + "sql": "DROP DATABASE IF EXISTS db_test_delete" + } + ] + }, + { + "description": "Test case for multi-table DELETE using USING", + "setUp": [ + { + "slice": "slice-0", + "sql": "DROP DATABASE IF EXISTS db_test_delete" + }, + { + "slice": "slice-0", + "sql": "CREATE DATABASE db_test_delete" + }, + { + "slice": "slice-0", + "sql": "USE db_test_delete" + }, + { + "slice": "slice-0", + "sql": "CREATE TABLE tbl1 (id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(50), age INT)" + }, + { + "slice": "slice-0", + "sql": "CREATE TABLE tbl2 (id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(50), age INT, ref_id INT)" + } + ], + "gaeaActions": [ + { + "sql": "USE db_test_delete", + "execType": "Default" + }, + { + "sql": "INSERT INTO tbl1 (name, age) VALUES ('User1', 30), ('User2', 29), ('User3', 28), ('User4', 27)", + "execType": "Default" + }, + { + "sql": "INSERT INTO tbl2 (name, age, ref_id) VALUES ('User1', 30, 1), ('User2', 29, 2), ('User3', 28, 3), ('User4', 27, 4)", + "execType": "Default" + }, + { + "sql": "DELETE FROM tbl1, tbl2 USING tbl1 INNER JOIN tbl2 ON tbl1.id = tbl2.id WHERE tbl2.age >= 26", + "execType": "Default" + } + ], + "masterCheckSQL": [ + { + "slice": "slice-0", + "db": "db_test_delete", + "name": "Check master after multi-table DELETE using USING for tbl1", + "sql": "SELECT * FROM tbl1", + "execType": "Query", + "expect": [] + }, + { + "slice": "slice-0", + "db": "db_test_delete", + "name": "Check master after multi-table DELETE using USING for tbl2", + "sql": "SELECT * FROM tbl2 WHERE name IN ('User4')", + "execType": "Query", + "expect": [] + } + ], + "tearDown": [ + { + "slice": "slice-0", + "sql": "DROP DATABASE IF EXISTS db_test_delete" + } + ] + } + ] + } + diff --git a/tests/e2e/unshard/case/dml/insert.json b/tests/e2e/unshard/case/dml/insert.json new file mode 100644 index 00000000..0a1127f3 --- /dev/null +++ b/tests/e2e/unshard/case/dml/insert.json @@ -0,0 +1,113 @@ +{ + "execCases": [ + { + "description": "Test basic insert operations and their validations", + "setUp": [ + { + "slice": "slice-0", + "sql": "DROP DATABASE IF EXISTS db_test_insert" + }, + { + "slice": "slice-0", + "sql": "CREATE DATABASE db_test_insert" + }, + { + "slice": "slice-0", + "sql": "USE db_test_insert" + }, + { + "slice": "slice-0", + "sql": "CREATE TABLE tbl_test_insert (id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(50), age INT, UNIQUE KEY unique_name (name))" + } + ], + "gaeaActions": [ + { + "sql": "USE db_test_insert", + "execType": "Default" + }, + { + "sql": "INSERT INTO tbl_test_insert (name, age) VALUES ('User1', 30)", + "execType": "Default" + }, + { + "sql": "INSERT LOW_PRIORITY INTO tbl_test_insert (name, age) VALUES ('User2', 25)", + "execType": "Default" + }, + { + "sql": "INSERT IGNORE INTO tbl_test_insert (name, age) VALUES ('User1', 31)", + "execType": "Default" + }, + { + "sql": "INSERT INTO tbl_test_insert SET name = 'User3', age = 20", + "execType": "Default" + }, + { + "sql": "INSERT INTO tbl_test_insert (name, age) VALUES ('User1', 32) ON DUPLICATE KEY UPDATE age = 32", + "execType": "Default" + }, + { + "sql": "INSERT INTO tbl_test_insert (name, age) SELECT 'User4', age FROM tbl_test_insert WHERE name = 'User3'", + "execType": "Default" + } + ], + "masterCheckSQL": [ + { + "slice": "slice-0", + "db": "db_test_insert", + "name": "Check age for User1 after operations", + "sql": "SELECT age FROM tbl_test_insert WHERE name = 'User1'", + "execType": "Query", + "expect": [ + ["32"] + ] + }, + { + "slice": "slice-0", + "db": "db_test_insert", + "name": "Ensure User1's age is not 31", + "sql": "SELECT COUNT(*) FROM tbl_test_insert WHERE name = 'User1' AND age = 31", + "execType": "Query", + "expect": [ + ["0"] + ] + }, + { + "slice": "slice-0", + "db": "db_test_insert", + "name": "Check age for User2 after operations", + "sql": "SELECT age FROM tbl_test_insert WHERE name = 'User2'", + "execType": "Query", + "expect": [ + ["25"] + ] + }, + { + "slice": "slice-0", + "db": "db_test_insert", + "name": "Check age for User3 after operations", + "sql": "SELECT age FROM tbl_test_insert WHERE name = 'User3'", + "execType": "Query", + "expect": [ + ["20"] + ] + }, + { + "slice": "slice-0", + "db": "db_test_insert", + "name": "Check age for User4 after operations", + "sql": "SELECT age FROM tbl_test_insert WHERE name = 'User4'", + "execType": "Query", + "expect": [ + ["20"] + ] + } + ], + "tearDown": [ + { + "slice": "slice-0", + "sql": "DROP DATABASE IF EXISTS db_test_insert" + } + ] + } + ] +} diff --git a/tests/e2e/unshard/case/dml/replace.json b/tests/e2e/unshard/case/dml/replace.json new file mode 100644 index 00000000..cd95b871 --- /dev/null +++ b/tests/e2e/unshard/case/dml/replace.json @@ -0,0 +1,107 @@ +{ + "execCases": [ + { + "description": "Test replace operations", + "setUp": [ + { + "slice": "slice-0", + "sql": "DROP DATABASE IF EXISTS db_test_replace" + }, + { + "slice": "slice-0", + "sql": "CREATE DATABASE db_test_replace" + }, + { + "slice": "slice-0", + "sql": "USE db_test_replace" + }, + { + "slice": "slice-0", + "sql": "CREATE TABLE tbl_test_replace (id INT PRIMARY KEY, name VARCHAR(50), age INT)" + }, + { + "slice": "slice-0", + "sql": "CREATE TABLE tbl_temp_replace (id INT, name VARCHAR(50), age INT)" + } + ], + "gaeaActions": [ + { + "sql": "USE db_test_replace", + "execType": "Default" + }, + { + "sql": "INSERT INTO tbl_test_replace VALUES (1, 'User1', 35)", + "execType": "Default" + }, + { + "sql": "INSERT INTO tbl_temp_replace VALUES (1, 'User1', 35)", + "execType": "Default" + }, + { + "sql": "REPLACE INTO tbl_test_replace (id, name, age) VALUES (1, 'newUser1', 35)", + "execType": "Default" + }, + { + "sql": "REPLACE INTO tbl_test_replace SET id = 2, name = 'User2', age = 30", + "execType": "Default" + }, + { + "sql": "REPLACE INTO tbl_test_replace (id, name, age) SELECT id, name, age FROM tbl_temp_replace WHERE id = 1", + "execType": "Default" + }, + { + "sql": "REPLACE LOW_PRIORITY INTO tbl_test_replace SET id = 1, name = 'User1', age = 40", + "execType": "Default" + } + ], + "masterCheckSQL": [ + { + "slice": "slice-0", + "db": "db_test_replace", + "name": "Ensure User1's name is correctly replaced", + "sql": "SELECT name FROM tbl_test_replace WHERE id = 1", + "execType": "Query", + "expect": [ + ["User1"] + ] + }, + { + "slice": "slice-0", + "db": "db_test_replace", + "name": "Ensure User2's name remains unchanged", + "sql": "SELECT name FROM tbl_test_replace WHERE id = 2", + "execType": "Query", + "expect": [ + ["User2"] + ] + }, + { + "slice": "slice-0", + "db": "db_test_replace", + "name": "Check replace with SELECT statement", + "sql": "SELECT name FROM tbl_test_replace WHERE id = 1", + "execType": "Query", + "expect": [ + ["User1"] + ] + }, + { + "slice": "slice-0", + "db": "db_test_replace", + "name": "Check replace with LOW_PRIORITY keyword", + "sql": "SELECT age FROM tbl_test_replace WHERE id = 1", + "execType": "Query", + "expect": [ + ["40"] + ] + } + ], + "tearDown": [ + { + "slice": "slice-0", + "sql": "DROP TABLE IF EXISTS db_test_replace" + } + ] + } + ] +} diff --git a/tests/e2e/unshard/case/dml/select.json b/tests/e2e/unshard/case/dml/select.json new file mode 100644 index 00000000..27beb866 --- /dev/null +++ b/tests/e2e/unshard/case/dml/select.json @@ -0,0 +1,211 @@ +{ + "execCases": [ + { + "description": "Testing SELECT variations", + "setUp": [ + { + "slice": "slice-0", + "sql": "DROP DATABASE IF EXISTS db_test_select" + }, + { + "slice": "slice-0", + "sql": "CREATE DATABASE db_test_select" + }, + { + "slice": "slice-0", + "sql": "USE db_test_select" + }, + { + "slice": "slice-0", + "sql": "CREATE TABLE tbl_test (id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(50), age INT, score FLOAT)" + }, + { + "slice": "slice-0", + "sql": "CREATE TABLE tbl_another (id INT PRIMARY KEY AUTO_INCREMENT, user_id INT, description TEXT)" + }, + { + "slice": "slice-0", + "sql": "CREATE TABLE t_order (order_id INT PRIMARY KEY AUTO_INCREMENT, user_id INT, order_description VARCHAR(255))" + }, + { + "slice": "slice-0", + "sql": "CREATE TABLE t_order_item (item_id INT PRIMARY KEY AUTO_INCREMENT, order_id INT, product_name VARCHAR(255), user_id INT)" + } + ], + "gaeaActions": [ + { + "sql": "USE db_test_select", + "execType": "Default" + }, + { + "sql": "INSERT INTO tbl_test (name, age, score) VALUES ('User1', 30, 80.5), ('User2', 20, 72.0), ('User3', 10, 90.2)", + "execType": "Default" + }, + { + "sql": "INSERT INTO tbl_another (user_id, description) VALUES (1, 'Description for User1')", + "execType": "Default" + }, + { + "sql": "SELECT name FROM tbl_test WHERE age =30 GROUP BY name", + "execType": "Default" + }, + { + "sql": "SELECT DISTINCT name FROM tbl_test WHERE age = 20 GROUP BY name", + "execType": "Default" + }, + { + "sql": "SELECT name FROM tbl_test WHERE age =10 GROUP BY name HAVING name = 'User3'", + "execType": "Default" + }, + { + "sql": "SELECT name, AVG(score) as avg_score FROM tbl_test WHERE age = 10 GROUP BY name ORDER BY avg_score DESC LIMIT 5 OFFSET 0", + "execType": "Default" + }, + { + "sql": "SELECT DISTINCTROW name FROM tbl_test WHERE age = 10", + "execType": "Default" + }, + { + "sql": "SELECT HIGH_PRIORITY name FROM tbl_test WHERE age = 10", + "execType": "Default" + }, + { + "sql": "SELECT STRAIGHT_JOIN t.name FROM tbl_test t JOIN tbl_another a ON t.id = a.user_id", + "execType": "Default" + }, + { + "sql": "SELECT name FROM tbl_test WHERE age = 10 LOCK IN SHARE MODE", + "execType": "Default" + }, + { + "sql": "INSERT INTO t_order (user_id, order_description) VALUES (1, 'Order 1'), (2, 'Order 2')", + "execType": "Default" + }, + { + "sql": "INSERT INTO t_order_item (order_id, product_name, user_id) VALUES (1, 'Product A', 1), (2, 'Product B', 2)", + "execType": "Default" + }, + { + "sql": "SELECT product_name FROM t_order o INNER JOIN t_order_item i ON o.order_id = i.order_id WHERE o.order_id = 1", + "execType": "Default" + }, + { + "sql": "SELECT product_name FROM t_order o LEFT JOIN t_order_item i ON o.order_id = i.order_id WHERE o.order_id = 1", + "execType": "Default" + }, + { + "sql": "SELECT product_name FROM t_order o RIGHT JOIN t_order_item i ON o.order_id = i.order_id WHERE o.order_id = 1", + "execType": "Default" + } + ], + "masterCheckSQL": [ + { + "slice": "slice-0", + "db": "db_test_select", + "name": "Check result for GROUP BY", + "sql": "SELECT name FROM tbl_test WHERE age =30 GROUP BY name", + "execType": "Query", + "expect": [ + ["User1"] + ] + }, + { + "slice": "slice-0", + "db": "db_test_select", + "name": "Check result for DISTINCT GROUP BY", + "sql": "SELECT DISTINCT name FROM tbl_test WHERE age = 20 GROUP BY name", + "execType": "Query", + "expect": [ + ["User2"] + ] + }, + { + "slice": "slice-0", + "db": "db_test_select", + "name": "Check result for DISTINCT GROUP BY HAVING", + "sql": "SELECT name FROM tbl_test WHERE age =10 GROUP BY name HAVING name = 'User3'", + "execType": "Query", + "expect": [ + ["User3"] + ] + }, + { + "slice": "slice-0", + "db": "db_test_select", + "name": "Check result for GROUP BY ORDER BY LIMIT OFFSET", + "sql": "SELECT name FROM tbl_test WHERE age = 10", + "execType": "Query", + "expect": [ + ["User3"] + ] + }, + { + "slice": "slice-0", + "db": "db_test_select", + "name": "Check result for DISTINCTROW", + "sql": "SELECT DISTINCTROW name FROM tbl_test WHERE age = 10", + "execType": "Query", + "expect": [ + ["User3"] + ] + }, + { + "slice": "slice-0", + "db": "db_test_select", + "name": "Check result for HIGH_PRIORITY", + "sql": "SELECT HIGH_PRIORITY name FROM tbl_test WHERE age = 10", + "execType": "Query", + "expect": [ + ["User3"] + ] + }, + { + "slice": "slice-0", + "db": "db_test_select", + "name": "Check result for STRAIGHT_JOIN", + "sql": "SELECT STRAIGHT_JOIN t.name FROM tbl_test t JOIN tbl_another a ON t.id = a.user_id", + "execType": "Query", + "expect": [ + ["User1"] + ] + }, + { + "slice": "slice-0", + "db": "db_test_select", + "name": "Check result for LOCK IN SHARE MODE (1)", + "sql": "SELECT name FROM tbl_test WHERE age = 10 LOCK IN SHARE MODE", + "execType": "Query", + "expect": [ + ["User3"] + ] + }, + { + "slice": "slice-0", + "db": "db_test_select", + "name": "Check result for LOCK IN SHARE MODE (2)", + "sql": "SELECT name FROM tbl_test WHERE age = 10 LOCK IN SHARE MODE", + "execType": "Query", + "expect": [ + ["User3"] + ] + }, + { + "slice": "slice-0", + "db": "db_test_select", + "name": "Check result for INNER JOIN", + "sql": "SELECT product_name FROM t_order o INNER JOIN t_order_item i ON o.order_id = i.order_id WHERE o.order_id = 1", + "execType": "Query", + "expect": [ + ["Product A"] + ] + } + ], + "tearDown": [ + { + "slice": "slice-0", + "sql": "DROP DATABASE IF EXISTS db_test_select" + } + ] + } + ] +} diff --git a/tests/e2e/unshard/case/dml/sql.json b/tests/e2e/unshard/case/dml/sql.json new file mode 100644 index 00000000..26f3d581 --- /dev/null +++ b/tests/e2e/unshard/case/dml/sql.json @@ -0,0 +1,58 @@ +{ + "execCases": [ + { + "description": "Test case 1 description", + "setUp": [ + { + "slice": "slice-0", + "sql": "DROP DATABASE IF EXISTS db_test" + }, + { + "slice": "slice-0", + "sql": "CREATE DATABASE db_test" + }, + { + "slice": "slice-0", + "sql": "USE db_test" + }, + { + "slice": "slice-0", + "sql": "CREATE TABLE tbl_users (col1 INT AUTO_INCREMENT, col2 VARCHAR(20), PRIMARY KEY (col1))" + } + ], + "gaeaActions": [ + { + "sql":"USE db_test", + "execType": "Default" + }, + { + "sql": "INSERT INTO tbl_users (col2) VALUES ('test')", + "execType": "Default" + }, + { + "sql": "UPDATE tbl_users SET col2='updated' WHERE col1=1", + "execType": "Default" + } + ], + "masterCheckSQL": [ + { + "slice": "slice-0", + "db": "db_test", + "name": "Check master after insert and update", + "sql": "SELECT col2 FROM tbl_users WHERE col1=1", + "execType": "Query", + "expect": [ + ["updated"] + ] + } + ], + "tearDown": [ + { + "slice": "slice-0", + "sql": "DROP DATABASE IF EXISTS db_test" + } + ] + } + ] + } + diff --git a/tests/e2e/unshard/case/dml/update.json b/tests/e2e/unshard/case/dml/update.json new file mode 100644 index 00000000..530a1a37 --- /dev/null +++ b/tests/e2e/unshard/case/dml/update.json @@ -0,0 +1,95 @@ +{ + "execCases": [ + { + "description": "Testing UPDATE LOW_PRIORITY IGNORE", + "setUp": [ + { + "slice": "slice-0", + "sql": "DROP DATABASE IF EXISTS db_test_update" + }, + { + "slice": "slice-0", + "sql": "CREATE DATABASE db_test_update" + }, + { + "slice": "slice-0", + "sql": "USE db_test_update" + }, + { + "slice": "slice-0", + "sql": "CREATE TABLE tbl_test_update (id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(50), age INT, score FLOAT)" + } + ], + "gaeaActions": [ + { + "sql": "USE db_test_update", + "execType": "Default" + }, + { + "sql": "INSERT INTO tbl_test_update (name, age, score) VALUES ('User1', 30, 80.0), ('User2', 31, 70.0)", + "execType": "Default" + }, + { + "sql": "UPDATE LOW_PRIORITY IGNORE tbl_test_update SET age = 31 WHERE id = 1", + "execType": "Default" + }, + { + "sql": "UPDATE tbl_test_update SET name = 'newUser1' WHERE id = 1", + "execType": "Default" + }, + { + "sql": "UPDATE tbl_test_update SET score = 80.0 WHERE name = 'User2' ORDER BY score DESC LIMIT 1", + "execType": "Default" + } + ], + "masterCheckSQL": [ + { + "slice": "slice-0", + "db": "db_test_update", + "name": "Check result for LOW_PRIORITY IGNORE", + "sql": "SELECT age FROM tbl_test_update WHERE name = 'newUser1'", + "execType": "Query", + "expect": [ + ["31"] + ] + }, + { + "slice": "slice-0", + "db": "db_test_update", + "name": "Ensure User2's age remains unchanged", + "sql": "SELECT age FROM tbl_test_update WHERE id = 2", + "execType": "Query", + "expect": [ + ["31"] + ] + }, + { + "slice": "slice-0", + "db": "db_test_update", + "name": "Check result for ORDER BY LIMIT", + "sql": "SELECT score FROM tbl_test_update WHERE name = 'User2'", + "execType": "Query", + "expect": [ + ["80"] + ] + }, + { + "slice": "slice-0", + "db": "db_test_update", + "name": "Ensure User1's name is correctly updated", + "sql": "SELECT name FROM tbl_test_update WHERE id = 1", + "execType": "Query", + "expect": [ + ["newUser1"] + ] + } + ], + "tearDown": [ + { + "slice": "slice-0", + "sql": "DROP DATABASE IF EXISTS db_test_update" + } + ] + } + ] +} diff --git a/tests/e2e/unshard/case/join/0-prepare.sql b/tests/e2e/unshard/case/join/0-prepare.sql new file mode 100644 index 00000000..b3088b9e --- /dev/null +++ b/tests/e2e/unshard/case/join/0-prepare.sql @@ -0,0 +1,57 @@ + +drop database if exists sbtest1; +create database sbtest1; +use sbtest1; + +drop table if exists t,t1,t2,t3; +create table if not exists t(id int(11) not null auto_increment,col1 varchar(20) default null, col2 int default null, primary key (`id`),KEY `idx1` (`col1`),KEY `idx2` (`col2`) ) ENGINE=Innodb DEFAULT CHARSET UTF8MB4; +create table if not exists t1 like t; +create table if not exists t2 like t; +create table if not exists t3 like t; + +insert into t (id, col1, col2) values (1, 'aa', 5),(2, 'bb', 10),(3, 'cc', 15),(4, 'dd', 20),(5, 'ee', 30),(6, 'aa', 5),(7, 'bb', 10),(8, 'cc', 15),(9, 'dd', 20),(10, 'ee', 30); +insert into t1 (id, col1, col2) values (1, 'aa', 5),(2, 'bb', 10),(3, 'cc', 15),(4, 'dd', 20),(5, 'ee', 30),(6, 'aa', 5),(7, 'bb', 10),(8, 'cc', 15),(9, 'dd', 20),(10, 'ee', 30); +insert into t2 (id, col1, col2) values (1, 'aa', 5),(2, 'bb', 10),(3, 'cc', 15),(4, 'dd', 20),(5, 'ee', 30),(6, 'aa', 5),(7, 'bb', 10),(8, 'cc', 15),(9, 'dd', 20),(10, 'ee', 30); +insert into t3 (id, col1, col2) values (1, 'aa', 5),(2, 'bb', 10),(3, 'cc', 15),(4, 'dd', 20),(5, 'ee', 30),(6, 'aa', 5),(7, 'bb', 10),(8, 'cc', 15),(9, 'dd', 20),(10, 'ee', 30); + + + +drop table if exists test1; +drop table if exists test2; +drop table if exists test3; +CREATE TABLE test1(`id` int(10) unsigned NOT NULL,`t_id` int(10) unsigned NOT NULL DEFAULT '0',`name` char(120) NOT NULL DEFAULT '',`pad` int(11) NOT NULL,PRIMARY KEY (`id`),KEY `k_1` (`t_id`))DEFAULT CHARSET=UTF8; +CREATE TABLE test2(`id` int(10) unsigned NOT NULL,`o_id` int(10) unsigned NOT NULL DEFAULT '0',`name` char(120) NOT NULL DEFAULT '',`pad` int(11) NOT NULL,PRIMARY KEY (`id`),KEY `k_1` (`o_id`))DEFAULT CHARSET=UTF8; +CREATE TABLE test3(`id` int(10) unsigned NOT NULL,`m_id` int(10) unsigned NOT NULL DEFAULT '0',`name` char(120) NOT NULL DEFAULT '',`pad` int(11) NOT NULL,PRIMARY KEY (`id`),KEY `k_1` (`m_id`))DEFAULT CHARSET=UTF8; +insert into test1 values(1,1,'test中id为1',1),(2,2,'test_2',2),(3,3,'test中id为3',4),(4,4,'$test$4',3),(5,5,'test...5',1),(6,6,'test6',6); +insert into test2 values(1,1,'order中id为1',1),(2,2,'test_2',2),(3,3,'order中id为3',3),(4,4,'$order$4',4),(5,5,'order...5',1); +insert into test3 values(1,1,'manager中id为1',1),(2,2,'test_2',2),(3,3,'manager中id为3',3),(4,4,'$manager$4',4),(5,5,'manager...5',6); + +drop table if exists noshard_t1; +drop table if exists noshard_t2; +drop table if exists noshard_t3; +CREATE TABLE noshard_t1(`id` int(10) unsigned NOT NULL,`t_id` int(10) unsigned NOT NULL DEFAULT '0',`name` char(120) NOT NULL DEFAULT '',`pad` int(11) NOT NULL,PRIMARY KEY (`id`),KEY `k_1` (`t_id`))DEFAULT CHARSET=UTF8; +CREATE TABLE noshard_t2(`id` int(10) unsigned NOT NULL,`o_id` int(10) unsigned NOT NULL DEFAULT '0',`name` char(120) NOT NULL DEFAULT '',`pad` int(11) NOT NULL,PRIMARY KEY (`id`),KEY `k_1` (`o_id`))DEFAULT CHARSET=UTF8; +CREATE TABLE noshard_t3(`id` int(10) unsigned NOT NULL,`m_id` int(10) unsigned NOT NULL DEFAULT '0',`name` char(120) NOT NULL DEFAULT '',`pad` int(11) NOT NULL,PRIMARY KEY (`id`),KEY `k_1` (`m_id`))DEFAULT CHARSET=UTF8; +insert into noshard_t1 values(1,1,'test中id为1',1),(2,2,'test_2',2),(3,3,'test中id为3',4),(4,4,'$test$4',3),(5,5,'test...5',1),(6,6,'test6',6); +insert into noshard_t2 values(1,1,'order中id为1',1),(2,2,'test_2',2),(3,3,'order中id为3',3),(4,4,'$order$4',4),(5,5,'order...5',1); +insert into noshard_t3 values(1,1,'manager中id为1',1),(2,2,'test_2',2),(3,3,'manager中id为3',3),(4,4,'$manager$4',4),(5,5,'manager...5',6); + + +drop table if exists test4,test5,test6,test7,test8,test9; + +CREATE TABLE test4(ID INT NOT NULL,FirstName VARCHAR(20),LastName VARCHAR(20),Department VARCHAR(20),Salary INT,key `ID_index` (`ID`)); +INSERT INTO test4 VALUES(201,'Mazojys','Fxoj','Finance',7800),(202,'Jozzh','Lnanyo','Finance',45800),(203,'Syllauu','Dfaafk','Finance',57000),(204,'Gecrrcc','Srlkrt','Finance',62000),(205,'Jssme','Bdnaa','Development',75000),(206,'Dnnaao','Errllov','Development',55000),(207,'Tyoysww','Osk','Development',49000); + +create table test5 (id int(11),R_REGIONKEY int(11) primary key,R_NAME varchar(50),R_COMMENT varchar(50)); +insert into test5 (id,R_REGIONKEY,R_NAME,R_COMMENT) values (1,1, 'Eastern','test001'),(3,3, 'Northern','test003'),(2,2, 'Western','test002'),(4,4, 'Southern','test004'); + +create table test6(id int(11),C_NAME varchar(20),C_NATIONKEY varchar(20),C_ORDERKEY varchar(20),C_CUSTKEY varchar(20) primary key); +insert into test6 (id,C_NAME,C_NATIONKEY,C_ORDERKEY,C_CUSTKEY) values (1,'chenxiao','NATIONKEY_001','ORDERKEY_001','CUSTKEY_003'),(3,'wangye','NATIONKEY_001','ORDERKEY_004','CUSTKEY_111'),(2,'xiaojuan','NATIONKEY_001','ORDERKEY_005','CUSTKEY_132'),(4,'chenqi','NATIONKEY_051','ORDERKEY_010','CUSTKEY_333'),(5,'marui','NATIONKEY_002','ORDERKEY_011','CUSTKEY_012'),(8,'huachen','NATIONKEY_002','ORDERKEY_007','CUSTKEY_980'),(7,'yanglu','NATIONKEY_132','ORDERKEY_006','CUSTKEY_420'); + +create table test8 (id int(11),O_ORDERKEY varchar(20) primary key,O_CUSTKEY varchar(20),O_TOTALPRICE int(20),MYDATE date); +insert into test8 (id,O_ORDERKEY,O_CUSTKEY,O_TOTALPRICE,MYDATE) values (1,'ORDERKEY_001','CUSTKEY_003',200000,'20141022'),(2,'ORDERKEY_002','CUSTKEY_003',100000,'19920501'),(4,'ORDERKEY_004','CUSTKEY_111',500,'20080105'),(5,'ORDERKEY_005','CUSTKEY_132',100,'19920628'),(10,'ORDERKEY_010','CUSTKEY_333',88888888,'19920720'),(11,'ORDERKEY_011','CUSTKEY_012',323456,'19920822'),(7,'ORDERKEY_007','CUSTKEY_980',12000,'19920910'),(6,'ORDERKEY_006','CUSTKEY_420',231,'19921111'); + +create table test9 (id int(11),O_ORDERKEY varchar(20) primary key,O_CUSTKEY varchar(20),O_TOTALPRICE int(20),MYDATE date, index ORDERS_FK1 (`O_CUSTKEY`)); +create table test7(id int(11),C_NAME varchar(20),C_NATIONKEY varchar(20),C_ORDERKEY varchar(20),C_CUSTKEY varchar(20) primary key); +insert into test9 (id,O_ORDERKEY,O_CUSTKEY,O_TOTALPRICE,MYDATE) values (1,'ORDERKEY_001','CUSTKEY_003',200000,'20141022'),(2,'ORDERKEY_002','CUSTKEY_003',100000,'19920501'),(4,'ORDERKEY_004','CUSTKEY_111',500,'20080105'),(5,'ORDERKEY_005','CUSTKEY_132',100,'19920628'),(10,'ORDERKEY_010','CUSTKEY_333',88888888,'19920720'),(11,'ORDERKEY_011','CUSTKEY_012',323456,'19920822'),(7,'ORDERKEY_007','CUSTKEY_980',12000,'19920910'),(6,'ORDERKEY_006','CUSTKEY_420',231,'19921111'); +insert into test7 (id,C_NAME,C_NATIONKEY,C_ORDERKEY,C_CUSTKEY) values (1,'chenxiao','NATIONKEY_001','ORDERKEY_001','CUSTKEY_003'),(3,'wangye','NATIONKEY_001','ORDERKEY_004','CUSTKEY_111'),(2,'xiaojuan','NATIONKEY_001','ORDERKEY_005','CUSTKEY_132'),(4,'chenqi','NATIONKEY_051','ORDERKEY_010','CUSTKEY_333'),(5,'marui','NATIONKEY_002','ORDERKEY_011','CUSTKEY_012'),(8,'huachen','NATIONKEY_002','ORDERKEY_007','CUSTKEY_980'),(7,'yanglu','NATIONKEY_132','ORDERKEY_006','CUSTKEY_420'); diff --git a/tests/e2e/unshard/case/join/1-clean.sql b/tests/e2e/unshard/case/join/1-clean.sql new file mode 100644 index 00000000..a33067f0 --- /dev/null +++ b/tests/e2e/unshard/case/join/1-clean.sql @@ -0,0 +1,15 @@ +//Attention, You may need to name the clean sql files with '1-clean.sql' and thus ensure clean files will +//be executed at end +drop table t,t1,t2,t3; + +# for test_join.sql +drop table if exists test1,test2,test3; + +# test_reference_no_sharding.sql +drop table if exists noshard_t1,noshard_t2,noshard_t3; + +# +drop table if exists test1,test2,test3; + +# +drop table if exists test4,test5,test6,test7,est8,test9; diff --git a/tests/e2e/unshard/case/join/skip.sql b/tests/e2e/unshard/case/join/skip.sql new file mode 100644 index 00000000..d12395b7 --- /dev/null +++ b/tests/e2e/unshard/case/join/skip.sql @@ -0,0 +1,27 @@ +# un equal +SHOW STATUS LIKE 'Up%'; +SHOW GLOBAL VARIABLES; +SHOW VARIABLES; +SHOW STATUS; +SHOW GLOBAL STATUS; +SHOW SESSION STATUS; +SELECT CONNECTION_ID(); +SELECT ROW_COUNT(); +SELECT GET_LOCK('lock1',10); +SELECT /*+ MAX_EXECUTION_TIME(1000) */ * FROM t1 INNER JOIN t2 where t1.col1 = t2.col1; +(select a.id,a.t_id,a.name,a.pad from test1 a where a.pad=1) union (select c.id,c.o_id,c.name,c.pad from sbtest1.test2 c where c.pad=1) order by id limit 10/*allow_diff_sequence*/ + +# no privileges +SHOW GRANTS; +SHOW GRANTS FOR current_user(); +SHOW GRANTS FOR current_user; +SHOW EVENTS FROM t WHERE definer = 'current_user'; + +# not equal +show full columns in t; +SELECT USER(); +SELECT CURRENT_USER(); +SELECT CURRENT_USER; +SELECT SESSION_USER(); +SELECT SYSTEM_USER(); +SHOW STATUS WHERE Variable_name LIKE 'Up%'; diff --git a/tests/e2e/unshard/case/join/test_join.sql b/tests/e2e/unshard/case/join/test_join.sql new file mode 100644 index 00000000..3d9419b2 --- /dev/null +++ b/tests/e2e/unshard/case/join/test_join.sql @@ -0,0 +1,94 @@ +# test join +select test1.id,test1.t_id,test1.name,test1.pad,sbtest1.test2.id,sbtest1.test2.o_id,sbtest1.test2.name,sbtest1.test2.pad from test1,sbtest1.test2 where test1.pad=sbtest1.test2.pad +select a.id,a.t_id,a.name,a.pad,b.id,b.o_id,b.name,b.pad from test1 a,sbtest1.test2 b where a.pad=b.pad +select a.id,b.id,b.pad,a.t_id from test1 a,(select * from sbtest1.test2 where pad>3) b where a.t_id=b.o_id +select a.id,b.id,b.pad,a.t_id from (select id,t_id from test1) a,(select * from sbtest1.test2) b where a.t_id=b.o_id +select a.id,b.id,b.pad,a.t_id from (select test1.id,test1.pad,test1.t_id from test1 join sbtest1.test2 where test1.pad=sbtest1.test2.pad ) a,(select sbtest1.test3.id,sbtest1.test3.pad from test1 join sbtest1.test3 where test1.pad=sbtest1.test3.pad) b where a.pad=b.pad +select test1.id,test1.name,a.name from test1,(select name from sbtest1.test2) a +select test1.id,test1.t_id,test1.name,test1.pad,sbtest1.test2.id,sbtest1.test2.o_id,sbtest1.test2.name,sbtest1.test2.pad from test1 inner join sbtest1.test2 order by test1.id,sbtest1.test2.id +select test1.id,test1.t_id,test1.name,test1.pad,sbtest1.test2.id,sbtest1.test2.o_id,sbtest1.test2.name,sbtest1.test2.pad from test1 cross join sbtest1.test2 order by test1.id,sbtest1.test2.id +select test1.id,test1.t_id,test1.name,test1.pad,sbtest1.test2.id,sbtest1.test2.o_id,sbtest1.test2.name,sbtest1.test2.pad from test1 join sbtest1.test2 order by test1.id,sbtest1.test2.id +select a.id,a.name,a.pad,b.name from test1 a inner join sbtest1.test2 b order by a.id,b.id +select a.id,a.name,a.pad,b.name from test1 a cross join sbtest1.test2 b order by a.id,b.id +select a.id,a.name,a.pad,b.name from test1 a join sbtest1.test2 b order by a.id,b.id +select a.id,a.t_id,a.name,a.pad,b.id,b.o_id,b.name,b.pad from test1 a inner join (select * from sbtest1.test2 where pad>0) b order by a.id,b.id +select a.id,a.t_id,a.name,a.pad,b.id,b.o_id,b.name,b.pad from test1 a cross join (select * from sbtest1.test2 where pad>0) b order by a.id,b.id +select a.id,a.t_id,a.name,a.pad,b.id,b.o_id,b.name,b.pad from test1 a join (select * from sbtest1.test2 where pad>0) b order by a.id,b.id +select a.id,a.t_id,a.name,a.pad,b.id,b.o_id,b.name,b.pad from (select * from test1 where pad>0) a inner join (select * from sbtest1.test2 where pad>0) b order by a.id,b.id +select a.id,a.t_id,a.name,a.pad,b.id,b.o_id,b.name,b.pad from (select * from test1 where pad>0) a cross join (select * from sbtest1.test2 where pad>0) b order by a.id,b.id +select a.id,a.t_id,a.name,a.pad,b.id,b.o_id,b.name,b.pad from (select * from test1 where pad>0) a join (select * from sbtest1.test2 where pad>0) b order by a.id,b.id +select a.id,a.t_id,a.name,a.pad,b.id,b.o_id,b.name,b.pad from test1 a join (select * from sbtest1.test2 where pad>0) b on a.id0) b using(pad) order by a.id,b.id +select test1.id,test1.t_id,test1.name,test1.pad,sbtest1.test2.id,sbtest1.test2.o_id,sbtest1.test2.name,sbtest1.test2.pad from test1 straight_join sbtest1.test2 order by test1.id,sbtest1.test2.id +select a.id,a.name,a.pad,b.name from test1 a straight_join sbtest1.test2 b order by a.id,b.id +select a.id,a.t_id,a.name,a.pad,b.id,b.o_id,b.name,b.pad from test1 a straight_join (select * from sbtest1.test2 where pad>0) b order by a.id,b.id +select a.id,a.t_id,a.name,a.pad,b.id,b.o_id,b.name,b.pad from (select * from test1 where pad>0) a straight_join (select * from sbtest1.test2 where pad>0) b order by a.id,b.id +select a.id,a.t_id,a.name,a.pad,b.id,b.o_id,b.name,b.pad from test1 a straight_join (select * from sbtest1.test2 where pad>0) b on a.id2) b on a.pad=b.pad order by a.id,b.id +select a.id,a.t_id,a.name,a.pad,b.id,b.o_id,b.name,b.pad from test1 a right join (select * from sbtest1.test2 where pad>2) b on a.pad=b.pad order by a.id,b.id +select a.id,a.t_id,a.name,a.pad,b.id,b.o_id,b.name,b.pad from test1 a left outer join (select * from sbtest1.test2 where pad>2) b on a.pad=b.pad order by a.id,b.id +select a.id,a.t_id,a.name,a.pad,b.id,b.o_id,b.name,b.pad from test1 a right outer join (select * from sbtest1.test2 where pad>2) b on a.pad=b.pad order by a.id,b.id +select a.id,a.t_id,a.name,a.pad,b.id,b.o_id,b.name,b.pad from test1 a left join (select * from sbtest1.test2 where pad>2) b using(pad) order by a.id,b.id +select a.id,a.t_id,a.name,a.pad,b.id,b.o_id,b.name,b.pad from (select * from test1 where pad>1) a left join (select * from sbtest1.test2 where pad>3) b on a.pad=b.pad order by a.id,b.id +select a.id,a.t_id,a.name,a.pad,b.id,b.o_id,b.name,b.pad from (select * from test1 where pad>1) a right join (select * from sbtest1.test2 where pad>3) b on a.pad=b.pad order by a.id,b.id +select a.id,a.t_id,a.name,a.pad,b.id,b.o_id,b.name,b.pad from (select * from test1 where pad>1) a left outer join (select * from sbtest1.test2 where pad>3) b on a.pad=b.pad order by a.id,b.id +select a.id,a.t_id,a.name,a.pad,b.id,b.o_id,b.name,b.pad from (select * from test1 where pad>1) a right outer join (select * from sbtest1.test2 where pad>3) b on a.pad=b.pad order by a.id,b.id +select a.id,a.t_id,a.name,a.pad,b.id,b.o_id,b.name,b.pad from (select * from test1 where pad>1) a left join (select * from sbtest1.test2 where pad>3) b using(pad) order by a.id,b.id +select test1.id,test1.t_id,test1.name,test1.pad,sbtest1.test2.id,sbtest1.test2.o_id,sbtest1.test2.name,sbtest1.test2.pad from test1 natural left join sbtest1.test2 +select test1.id,test1.t_id,test1.name,test1.pad,sbtest1.test2.id,sbtest1.test2.o_id,sbtest1.test2.name,sbtest1.test2.pad from test1 natural right join sbtest1.test2 +select test1.id,test1.t_id,test1.name,test1.pad,sbtest1.test2.id,sbtest1.test2.o_id,sbtest1.test2.name,sbtest1.test2.pad from test1 natural left outer join sbtest1.test2 +select test1.id,test1.t_id,test1.name,test1.pad,sbtest1.test2.id,sbtest1.test2.o_id,sbtest1.test2.name,sbtest1.test2.pad from test1 natural right outer join sbtest1.test2 +select a.id,a.t_id,a.name,a.pad,b.id,b.o_id,b.name,b.pad from test1 a natural left join sbtest1.test2 b order by a.id +select a.id,a.t_id,a.name,a.pad,b.id,b.o_id,b.name,b.pad from test1 a natural right join sbtest1.test2 b order by b.id +select a.id,a.t_id,a.name,a.pad,b.id,b.o_id,b.name,b.pad from test1 a natural left outer join sbtest1.test2 b order by a.id +select a.id,a.t_id,a.name,a.pad,b.id,b.o_id,b.name,b.pad from test1 a natural right outer join sbtest1.test2 b order by b.id +select a.id,a.t_id,a.name,a.pad,b.id,b.o_id,b.name,b.pad from test1 a natural left join (select * from sbtest1.test2 where pad>2) b order by a.id,b.id +select a.id,a.t_id,a.name,a.pad,b.id,b.o_id,b.name,b.pad from test1 a natural right join (select * from sbtest1.test2 where pad>2) b order by a.id,b.id +select a.id,a.t_id,a.name,a.pad,b.id,b.o_id,b.name,b.pad from test1 a natural left outer join (select * from sbtest1.test2 where pad>2) b order by a.id,b.id +select a.id,a.t_id,a.name,a.pad,b.id,b.o_id,b.name,b.pad from test1 a natural right outer join (select * from sbtest1.test2 where pad>2) b order by a.id,b.id +select a.id,a.t_id,a.name,a.pad,b.id,b.o_id,b.name,b.pad from (select * from test1 where pad>1) a natural left join (select * from sbtest1.test2 where pad>3) b order by a.id,b.id +select a.id,a.t_id,a.name,a.pad,b.id,b.o_id,b.name,b.pad from (select * from test1 where pad>1) a natural right join (select * from sbtest1.test2 where pad>3) b order by a.id,b.id +select a.id,a.t_id,a.name,a.pad,b.id,b.o_id,b.name,b.pad from (select * from test1 where pad>1) a natural left outer join (select * from sbtest1.test2 where pad>3) b order by a.id,b.id +select a.id,a.t_id,a.name,a.pad,b.id,b.o_id,b.name,b.pad from (select * from test1 where pad>1) a natural right outer join (select * from sbtest1.test2 where pad>3) b order by a.id,b.id +select test1.id,test1.t_id,test1.name,test1.pad,sbtest1.test2.id,sbtest1.test2.o_id,sbtest1.test2.name,sbtest1.test2.pad from test1 left join sbtest1.test2 on test1.pad=sbtest1.test2.pad and test1.id>3 order by test1.id,sbtest1.test2.id +(select pad from test1) union distinct (select pad from sbtest1.test2) +(select test1.id,test1.t_id,test1.name,test1.pad from test1 where id=2) union distinct (select sbtest1.test2.id,sbtest1.test2.o_id,sbtest1.test2.name,sbtest1.test2.pad from sbtest1.test2 where id=2) +select distinct a.pad from test1 a,sbtest1.test2 b where a.pad=b.pad +select distinct b.pad,a.pad from test1 a,(select * from sbtest1.test2 where pad=1) b where a.t_id=b.o_id +select count(distinct pad,name),avg(distinct t_id) from test1 +select count(distinct id),sum(distinct name) from test1 where id=3 or id=7 + +# + +select a.id,a.t_id,b.o_id,b.name from (select * from test1 where id<3) a,(select * from sbtest1.test2 where id>3) b +select a.id,b.id,b.pad,a.t_id from test1 a,(select sbtest1.test3.id,sbtest1.test3.pad from test1 join sbtest1.test3 where test1.pad=sbtest1.test3.pad) b,(select * from sbtest1.test2 where id>3) c where a.pad=b.pad and c.pad=b.pad + + +#join table +# test_global reference +select a.id,a.t_id,a.name,a.pad,b.id,b.o_id,b.name,b.pad from test1 a join sbtest1.test2 as b order by a.id,b.id +select a.id,a.t_id,a.name,a.pad,b.id,b.o_id,b.name,b.pad from test1 a inner join sbtest1.test2 b order by a.id,b.id +select a.id,a.t_id,a.name,a.pad,b.id,b.o_id,b.name,b.pad from test1 a cross join sbtest1.test2 b order by a.id,b.id +select a.id,a.name,a.pad,b.name from test1 a straight_join sbtest1.test2 b on a.pad=b.pad +# +#SELECT ... UNION [ALL | DISTINCT] SELECT ... [UNION [ALL | DISTINCT] SELECT ...] +# +select a.id,a.t_id,a.name,a.pad from test1 a union all select b.id,b.m_id,b.name,b.pad from sbtest1.test3 b union all select c.id,c.o_id,c.name,c.pad from sbtest1.test2 c +select a.id,a.t_id,a.name,a.pad from test1 a union distinct select b.id,b.m_id,b.name,b.pad from sbtest1.test3 b union distinct select c.id,c.o_id,c.name,c.pad from sbtest1.test2 c +(select name from test1 where pad=1 order by id limit 10) union all (select name from sbtest1.test2 where pad=1 order by id limit 10)/*allow_diff_sequence*/ +(select name from test1 where pad=1 order by id limit 10) union distinct (select name from sbtest1.test2 where pad=1 order by id limit 10)/*allow_diff_sequence*/ + +(select name as sort_a from test1 where pad=1) union (select name from sbtest1.test2 where pad=1) order by sort_a limit 10/*allow_diff_sequence*/ +(select name as sort_a,pad from test1 where pad=1) union (select name,pad from sbtest1.test2 where pad=1) order by sort_a,pad limit 10/*allow_diff_sequence*/ +#-- case union,from issue #275 +(select * from test1 where id=2) union (select * from sbtest1.test2 where id=2); diff --git a/tests/e2e/unshard/case/join/test_join_unsharding.sql b/tests/e2e/unshard/case/join/test_join_unsharding.sql new file mode 100644 index 00000000..dc18b523 --- /dev/null +++ b/tests/e2e/unshard/case/join/test_join_unsharding.sql @@ -0,0 +1,159 @@ +# test join nosharding +select * from noshard_t1,noshard_t2 where noshard_t1.pad=noshard_t2.pad +select * from noshard_t1 a,noshard_t2 b where a.pad=b.pad +select a.id,b.id,b.pad,a.t_id from noshard_t1 a,(select * from noshard_t2 where pad>3) b where a.t_id=b.o_id +select a.id,b.id,b.pad,a.t_id from (select id,t_id from noshard_t1) a,(select * from noshard_t2) b where a.t_id=b.o_id +select a.id,b.id,b.pad,a.t_id from (select noshard_t1.id,noshard_t1.pad,noshard_t1.t_id from noshard_t1 join noshard_t2 where noshard_t1.pad=noshard_t2.pad ) a,(select noshard_t3.id,noshard_t3.pad from noshard_t1 join noshard_t3 where noshard_t1.pad=noshard_t3.pad) b where a.pad=b.pad +select noshard_t1.id,noshard_t1.name,a.name from noshard_t1,(select name from noshard_t2) a +select * from noshard_t1 inner join noshard_t2 order by noshard_t1.id,noshard_t2.id +select * from noshard_t1 cross join noshard_t2 order by noshard_t1.id,noshard_t2.id +select * from noshard_t1 join noshard_t2 order by noshard_t1.id,noshard_t2.id +select a.id,a.name,a.pad,b.name from noshard_t1 a inner join noshard_t2 b order by a.id,b.id +select a.id,a.name,a.pad,b.name from noshard_t1 a cross join noshard_t2 b order by a.id,b.id +select a.id,a.name,a.pad,b.name from noshard_t1 a join noshard_t2 b order by a.id,b.id +select * from noshard_t1 a inner join (select * from noshard_t2 where pad>0) b order by a.id,b.id +select * from noshard_t1 a cross join (select * from noshard_t2 where pad>0) b order by a.id,b.id +select * from noshard_t1 a join (select * from noshard_t2 where pad>0) b order by a.id,b.id +select * from (select * from noshard_t1 where pad>0) a inner join (select * from noshard_t2 where pad>0) b order by a.id,b.id +select * from (select * from noshard_t1 where pad>0) a cross join (select * from noshard_t2 where pad>0) b order by a.id,b.id +select * from (select * from noshard_t1 where pad>0) a join (select * from noshard_t2 where pad>0) b order by a.id,b.id +select * from noshard_t1 a join (select * from noshard_t2 where pad>0) b on a.id0) b using(pad) order by a.id,b.id +select * from noshard_t1 straight_join noshard_t2 order by noshard_t1.id,noshard_t2.id +select a.id,a.name,a.pad,b.name from noshard_t1 a straight_join noshard_t2 b order by a.id,b.id +select * from noshard_t1 a straight_join (select * from noshard_t2 where pad>0) b order by a.id,b.id +select * from (select * from noshard_t1 where pad>0) a straight_join (select * from noshard_t2 where pad>0) b order by a.id,b.id +select * from noshard_t1 a straight_join (select * from noshard_t2 where pad>0) b on a.id2) b on a.pad=b.pad order by a.id,b.id +select * from noshard_t1 a right join (select * from noshard_t2 where pad>2) b on a.pad=b.pad order by a.id,b.id +select * from noshard_t1 a left outer join (select * from noshard_t2 where pad>2) b on a.pad=b.pad order by a.id,b.id +select * from noshard_t1 a right outer join (select * from noshard_t2 where pad>2) b on a.pad=b.pad order by a.id,b.id +select * from noshard_t1 a left join (select * from noshard_t2 where pad>2) b using(pad) order by a.id,b.id +select * from (select * from noshard_t1 where pad>1) a left join (select * from noshard_t2 where pad>3) b on a.pad=b.pad order by a.id,b.id +select * from (select * from noshard_t1 where pad>1) a right join (select * from noshard_t2 where pad>3) b on a.pad=b.pad order by a.id,b.id +select * from (select * from noshard_t1 where pad>1) a left outer join (select * from noshard_t2 where pad>3) b on a.pad=b.pad order by a.id,b.id +select * from (select * from noshard_t1 where pad>1) a right outer join (select * from noshard_t2 where pad>3) b on a.pad=b.pad order by a.id,b.id +select * from (select * from noshard_t1 where pad>1) a left join (select * from noshard_t2 where pad>3) b using(pad) order by a.id,b.id +select * from noshard_t1 natural left join noshard_t2 +select * from noshard_t1 natural right join noshard_t2 +select * from noshard_t1 natural left outer join noshard_t2 +select * from noshard_t1 natural right outer join noshard_t2 +select * from noshard_t1 a natural left join noshard_t2 b order by a.id,b.id +select * from noshard_t1 a natural right join noshard_t2 b order by a.id,b.id +select * from noshard_t1 a natural left outer join noshard_t2 b order by a.id,b.id +select * from noshard_t1 a natural right outer join noshard_t2 b order by a.id,b.id +select * from noshard_t1 a natural left join (select * from noshard_t2 where pad>2) b order by a.id,b.id +select * from noshard_t1 a natural right join (select * from noshard_t2 where pad>2) b order by a.id,b.id +select * from noshard_t1 a natural left outer join (select * from noshard_t2 where pad>2) b order by a.id,b.id +select * from noshard_t1 a natural right outer join (select * from noshard_t2 where pad>2) b order by a.id,b.id +select * from (select * from noshard_t1 where pad>1) a natural left join (select * from noshard_t2 where pad>3) b order by a.id,b.id +select * from (select * from noshard_t1 where pad>1) a natural right join (select * from noshard_t2 where pad>3) b order by a.id,b.id +select * from (select * from noshard_t1 where pad>1) a natural left outer join (select * from noshard_t2 where pad>3) b order by a.id,b.id +select * from (select * from noshard_t1 where pad>1) a natural right outer join (select * from noshard_t2 where pad>3) b order by a.id,b.id +select * from noshard_t1 left join noshard_t2 on noshard_t1.pad=noshard_t2.pad and noshard_t1.id>3 order by noshard_t1.id,noshard_t2.id + # +#distinct(special_scene) +# +(select pad from noshard_t1) union distinct (select pad from noshard_t2) + (select * from noshard_t1 where id=2) union distinct (select * from noshard_t2 where id=2) +select distinct a.pad from noshard_t1 a,noshard_t2 b where a.pad=b.pad +select distinct b.pad,a.pad from noshard_t1 a,(select * from noshard_t2 where pad=1) b where a.t_id=b.o_id +select count(distinct pad,name),avg(distinct t_id) from noshard_t1 +select count(distinct id),sum(distinct name) from noshard_t1 where id=3 or id=7 + + +# test_join_subquery_mixed +select * from (select a.id, t_id, a.name, a.pad from noshard_t1 a join noshard_t3 b on a.id = b.id union select * from noshard_t2) as c order by id,name; +select id, t_id, name,pad from (select a.id,t_id, b.name,b.pad from noshard_t1 a join noshard_t3 b on a.id = b.id) as c union select * from noshard_t2 order by id, name; +select * from (select * from ( select a.id, t_id, a.name,a.pad from noshard_t1 a join noshard_t2 b on a.id=b.id union (select * from noshard_t2 where id in (select id from noshard_t3))) as d UNION select * from noshard_t3) as c order by c.id,c.name; + + +# test_reference_no_sharding +select * from noshard_t1 a,noshard_t2 b +select * from (select * from noshard_t1 where id<3) a,(select * from noshard_t2 where id>3) b +select a.id,b.id,b.pad,a.t_id from noshard_t1 a,(select noshard_t3.id,noshard_t3.pad from noshard_t1 join noshard_t3 where noshard_t1.pad=noshard_t3.pad) b,(select * from noshard_t2 where id>3) c where a.pad=b.pad and c.pad=b.pad +# +#join table +select * from noshard_t1 a join noshard_t2 as b order by a.id,b.id +select * from noshard_t1 a inner join noshard_t2 b order by a.id,b.id +select * from noshard_t1 a cross join noshard_t2 b order by a.id,b.id +select a.id,a.name,a.pad,b.name from noshard_t1 a straight_join noshard_t2 b on a.pad=b.pad + # + #SELECT ... UNION [ALL | DISTINCT] SELECT ... [UNION [ALL | DISTINCT] SELECT ...] + # +select * from noshard_t1 union all select * from noshard_t3 union all select * from noshard_t2 +select * from noshard_t1 union distinct select * from noshard_t3 union distinct select * from noshard_t2 + (select name from noshard_t1 where pad=1 order by id limit 10) union all (select name from noshard_t2 where pad=1 order by id limit 10)/*allow_diff_sequence*/ + (select name from noshard_t1 where pad=1 order by id limit 10) union distinct (select name from noshard_t2 where pad=1 order by id limit 10)/*allow_diff_sequence*/ + (select * from noshard_t1 where pad=1) union (select * from noshard_t2 where pad=1) order by name limit 10 + (select name as sort_a from noshard_t1 where pad=1) union (select name from noshard_t2 where pad=1) order by sort_a limit 10 + (select name as sort_a,pad from noshard_t1 where pad=1) union (select name,pad from noshard_t2 where pad=1) order by sort_a,pad limit 10 + + +# test_subquery_no_sharding +select a.id,b.id,b.pad,a.t_id from noshard_t1 a,(select all * from noshard_t2) b where a.t_id=b.o_id; +select a.id,b.id,b.pad,a.t_id from noshard_t1 a,(select distinct * from noshard_t2) b where a.t_id=b.o_id; +select * from (select * from noshard_t2 a group by a.id) a; +select * from (select pad,count(*) from noshard_t2 a group by pad) a; +select a.id,b.id,b.pad,a.t_id from noshard_t1 a,(select * from noshard_t2 having pad>3) b where a.t_id=b.o_id; +select a.id,b.id,b.pad,a.t_id from noshard_t1 a,(select * from noshard_t2 where pad>3 order by id) b where a.t_id=b.o_id; +select a.id,b.id,b.pad,a.t_id from noshard_t1 a,(select * from noshard_t2 order by id limit 3) b where a.t_id=b.o_id; +select a.id,b.id,b.pad,a.t_id from noshard_t1 a,(select * from noshard_t2 order by id limit 3) b where a.t_id=b.o_id limit 2; +select a.id,b.id,b.pad,a.t_id from noshard_t1 a,(select * from noshard_t2 where pad>3) b where a.t_id=b.o_id; +select * from (select noshard_t2.pad from noshard_t1 left join noshard_t2 on noshard_t1.pad=noshard_t2.pad) a; +select * from (select * from noshard_t1 union select * from noshard_t2) a where a.id >3; +select id,pad from noshard_t1 where pad=(select min(id) from noshard_t2); +select id,pad,name from (select * from noshard_t1 where pad>2) a where id<5; +select pad,count(*) from (select * from noshard_t1 where pad>2) a group by pad; +select pad,count(*) from (select * from noshard_t1 where pad>2) a group by pad order by pad; +select count(*) from (select pad,count(*) a from noshard_t1 group by pad) a; +select * from noshard_t1 where pad<(select pad from noshard_t2 where id=3); +select * from noshard_t1 having pad<(select pad from noshard_t2 where id=3); +select a.id,b.id,b.pad,a.t_id from noshard_t1 a,(select * from noshard_t2 where pad>3) b where a.t_id=b.o_id; +select id,name,(select count(*) from noshard_t2) count from noshard_t1; +select * from noshard_t1 where pad like (select pad from noshard_t2 where id=3); +select id,pad from noshard_t1 where pad>(select pad from noshard_t1 where id=2); +select id,pad from noshard_t1 where pad<(select pad from noshard_t1 where id=2); +select id,pad from noshard_t1 where pad=(select pad from noshard_t1 where id=2); +select id,pad from noshard_t1 where pad>=(select pad from noshard_t1 where id=2); +select id,pad from noshard_t1 where pad<=(select pad from noshard_t1 where id=2); +select id,pad from noshard_t1 where pad<>(select pad from noshard_t1 where id=2); +select id,pad from noshard_t1 where pad !=(select pad from noshard_t1 where id=2); +select * from noshard_t1 where exists(select * from noshard_t1 where pad>1); +select * from noshard_t1 where not exists(select * from noshard_t1 where pad>1); +select * from noshard_t1 where pad not in(select id from noshard_t1 where pad>1); +select * from noshard_t1 where pad in(select id from noshard_t1 where pad>1); +select * from noshard_t1 where pad=some(select id from noshard_t1 where pad>1); +select * from noshard_t1 where pad=any(select id from noshard_t1 where pad>1); +select * from noshard_t1 where pad !=any(select id from noshard_t1 where pad=3); +select a.id,b.id,b.pad,a.t_id from (select noshard_t1.id,noshard_t1.pad,noshard_t1.t_id from noshard_t1 join noshard_t2 where noshard_t1.pad=noshard_t2.pad ) a,(select noshard_t3.id,noshard_t3.pad from noshard_t1 join noshard_t3 where noshard_t1.pad=noshard_t3.pad) b where a.pad=b.pad; +select * from noshard_t1 where pad>(select pad from noshard_t1 where pad=2); +select * from noshard_t1,(select * from noshard_t1 where id>3 union select * from noshard_t2 where id<2) a where a.id >3 and noshard_t1.pad=a.pad; +select count(*) from (select * from noshard_t1 where pad=(select pad from noshard_t2 where id=1)) a; + +#Second supplement +select (select name from noshard_t1 limit 1) +select * from noshard_t1 where 'test_2'=(select name from noshard_t2 where id=2) +select * from noshard_t1 where 5=(select count(*) from noshard_t2) +select * from noshard_t1 where 'test_2' like(select name from noshard_t2 where id=2) +select * from noshard_t1 where 2 >any(select id from noshard_t1 where pad>1) +select * from noshard_t1 where 2 in(select id from noshard_t1 where pad>1) +select * from noshard_t1 where 2<>some(select id from noshard_t1 where pad>1) +select * from noshard_t1 where 2>all(select id from noshard_t1 where pad<1) +select * from noshard_t1 where (id,pad)=(select id,pad from noshard_t2 limit 1) +select * from noshard_t1 where row(id,pad)=(select id,pad from noshard_t2 limit 1) +select id,name,pad from noshard_t1 where (id,pad)in(select id,pad from noshard_t2) +select id,name,pad from noshard_t1 where (1,1)in(select id,pad from noshard_t2) +SELECT pad FROM noshard_t1 AS x WHERE x.id = (SELECT pad FROM noshard_t2 AS y WHERE x.id = (SELECT pad FROM noshard_t3 WHERE y.id = noshard_t3.id)) +select co1,co2,co3 from (select id as co1,name as co2,pad as co3 from noshard_t1)as tb where co1>1 +select avg(sum_column1) from (select sum(id) as sum_column1 from noshard_t1 group by pad) as t1 diff --git a/tests/e2e/unshard/case/join/test_select_global_old.sql b/tests/e2e/unshard/case/join/test_select_global_old.sql new file mode 100644 index 00000000..4fb882ae --- /dev/null +++ b/tests/e2e/unshard/case/join/test_select_global_old.sql @@ -0,0 +1,249 @@ + +select id,FirstName,lastname,department,salary from test4 use index(ID_index) where Department ='Finance' +select id,FirstName,lastname,department,salary from test4 force index(ID_index) where ID= 205 +SELECT FirstName, LastName,Department = CASE Department WHEN 'F' THEN 'Financial' WHEN 'D' THEN 'Development' ELSE 'Other' END FROM test4 +select id,FirstName,lastname,department,salary from test4 where Salary >'40000' and Salary <'70000' and Department ='Finance' +SELECT count(*), Department FROM (SELECT * FROM test4 ORDER BY FirstName DESC) AS Actions GROUP BY Department ORDER BY ID DESC +SELECT id,FirstName,lastname,department,salary FROM test4 ORDER BY FIELD( ID, 203, 207,206) +SELECT Department, COUNT(ID) FROM test4 GROUP BY Department HAVING COUNT(ID)>3 +select id,FirstName,lastname,department,salary from test4 order by ID ASC +select id,FirstName,lastname,department,salary from test4 group by Department +SELECT Department, MIN(Salary) FROM test4 GROUP BY Department HAVING MIN(Salary)>46000 +select Department,max(Salary) from test4 group by Department order by Department asc +select Department,min(Salary) from test4 group by Department order by Department asc +select Department,avg(Salary) from test4 group by Department order by Department asc +select Department,sum(Salary) from test4 group by Department order by Department asc +select ID,Department,Salary from test4 order by 2,3 +select id,FirstName,lastname,department,salary from test4 order by Department ,ID desc +SELECT Department, COUNT(Salary) FROM test4 GROUP BY Department +SELECT Department, COUNT(Salary) FROM test4 GROUP BY Department DESC +select Department,count(Salary) as a from test4 group by Department having a=3 +select Department,count(Salary) as a from test4 group by Department having a>0 +select Department,count(Salary) from test4 group by Department having count(ID) >2 +select Department,count(*) as num from test4 group by Department having count(*) >1 +select Department,count(*) as num from test4 group by Department having count(*) <=3 +select Department from test4 having Department >3 +select Department from test4 where Department >0 +select Department,max(salary) from test4 group by Department having max(salary) >10 +select 12 as Department, Department from test4 group by Department +select id,FirstName,lastname,department,salary from test4 limit 2,10 +select id,FirstName,lastname,department,salary from test4 order by FirstName in ('Syllauu','Dnnaao') desc +select max(salary) from test4 group by department order by department asc +select min(salary) from test4 group by department order by department asc +select avg(salary) from test4 group by department order by department asc +select sum(salary) from test4 group by department order by department asc +select count(salary) from test4 group by department order by department asc +select Department,sum(Salary) a from test4 group by Department having a >=1 order by Department DESC +select Department,count(*) as num from test4 group by Department having count(*) >=4 order by Department ASC +select FirstName,LastName,Department,ABS(salary) from test4 order by Department +select FirstName,LastName,Department,ACOS(salary) from test4 order by Department +select FirstName,LastName,Department,ASIN(salary) from test4 order by Department +select FirstName,LastName,Department,ATAN(salary) from test4 order by Department +select FirstName,LastName,Department,ATAN(salary,100) from test4 order by Department +select FirstName,LastName,Department,ATAN2(salary,100) from test4 order by Department +select FirstName,LastName,Department,CEIL(salary) from test4 order by Department +select FirstName,LastName,Department,CEILING(salary) from test4 order by Department +select FirstName,LastName,Department,COT(salary) from test4 order by Department +select FirstName,LastName,Department,CRC32(Department) from test4 order by Department +select FirstName,LastName,Department,FLOOR(salary) from test4 order by Department +select FirstName,LN(FirstName),LastName,Department from test4 order by Department +select FirstName,LastName,Department,LOG(salary) from test4 order by Department +select FirstName,LastName,Department,LOG2(salary) from test4 order by Department +select FirstName,LastName,Department,LOG10(salary) from test4 order by Department +select FirstName,LastName,Department,MOD(salary,2) from test4 order by Department +select FirstName,LastName,Department,RADIANS(salary) from test4 order by Department +select FirstName,LastName,Department,ROUND(salary) from test4 order by Department +select FirstName,LastName,Department,SIGN(salary) from test4 order by Department +select FirstName,LastName,Department,SIN(salary) from test4 order by Department +select FirstName,LastName,Department,SQRT(salary) from test4 order by Department +select FirstName,LastName,Department,TAN(salary) from test4 order by Department +select FirstName,LastName,Department,TRUNCATE(salary,1) from test4 order by Department +select FirstName,LastName,Department,TRUNCATE(salary*100,0) from test4 order by Department +select FirstName,LastName,Department,SIN(salary) from test4 order by Department +select id,FirstName,lastname,department,salary from test4 where Department is Null +select id,FirstName,lastname,department,salary from test4 where Department is not Null +select id,FirstName,lastname,department,salary from test4 where NOT (ID < 200) +select id,FirstName,lastname,department,salary from test4 where ID <300 +select id,FirstName,lastname,department,salary from test4 where ID <1 +select id,FirstName,lastname,department,salary from test4 where ID <> 0 +select id,FirstName,lastname,department,salary from test4 where ID <> 0 and ID <=1 +select id,FirstName,lastname,department,salary from test4 where ID >=205 +select id,FirstName,lastname,department,salary from test4 where ID <=205 +select id,FirstName,lastname,department,salary from test4 where ID >=205 and ID <=205 +select id,FirstName,lastname,department,salary from test4 where ID >1 and ID <=203 +select id,FirstName,lastname,department,salary from test4 where ID >=1 and ID=205 +select id,FirstName,lastname,department,salary from test4 where ID=(ID>>1)<<1 +select id,FirstName,lastname,department,salary from test4 where ID&1 +select id,FirstName,lastname,department,salary from test4 where Salary >'40000' and Salary <'70000' and Department ='Finance' order by Salary ASC +select id,FirstName,lastname,department,salary from test4 where (Salary >'50000' and Salary <'70000') or Department ='Finance' order by Salary ASC +select id,FirstName,lastname,department,salary from test4 where FirstName like 'J%' +select count(*) FROM test4 WHERE Salary is null or FirstName not like '%M%' +SELECT id,FirstName,lastname,department,salary FROM test4 WHERE ID IN (SELECT ID FROM test4 WHERE ID >0) +SELECT distinct salary,id,FirstName,lastname,department FROM test4 WHERE ID IN ( SELECT ID FROM test4 WHERE ID >0) +select id,FirstName,lastname,department,salary from test4 where FirstName in ('Mazojys','Syllauu','Tyoysww') +select id,FirstName,lastname,department,salary from test4 where Salary between 40000 and 50000 +select sum(salary) from test4 where department = 'Finance' +select max(salary) from test4 where department = 'Finance' +select min(salary) from test4 where department = 'Finance' +select avg(salary) from test4 where department = 'Finance' + +select sum(distinct id) from test5 +select sum(all id) from test5 +select id, R_REGIONKEY from test5 +select id,'user is user' from test5 +select id*5,'user is user',10 from test5 +select ALL id, R_REGIONKEY, R_NAME, R_COMMENT from test5 +select DISTINCT id, R_REGIONKEY, R_NAME, R_COMMENT from test5 +select DISTINCTROW id, R_REGIONKEY, R_NAME, R_COMMENT from test5 +select ALL HIGH_PRIORITY id,'ID' as detail from test5 + +select id, O_ORDERKEY, O_TOTALPRICE,MYDATE from test8 where id=1 + ## TODO BUG EXISTS here +##select id, O_ORDERKEY, O_TOTALPRICE,MYDATE from test8 where id=1 or not id=1 +select id, O_ORDERKEY, O_TOTALPRICE,MYDATE from test8 where id=1 and not id=1 +select id,O_ORDERKEY,O_CUSTKEY,O_TOTALPRICE,MYDATE from test8 where id=1 +select count(*) counts from test8 a where MYDATE is null +select count(*) counts from test8 a where id is null +select count(*) counts from test8 a where id is not null +select count(*) counts from test8 a where not (id is null) +select count(O_ORDERKEY) counts from test8 a where O_ORDERKEY like 'ORDERKEY_00%' +select count(O_ORDERKEY) counts from test8 a where O_ORDERKEY not like '%00%' +select sum(O_TOTALPRICE) as sums,O_CUSTKEY,count(O_ORDERKEY) counts from test8 a where O_ORDERKEY<'ORDERKEY_010' and O_CUSTKEY between 'CUSTKEY_002' and 'CUSTKEY_300' group by o_custkey +select sum(O_TOTALPRICE) as sums,O_CUSTKEY,count(O_ORDERKEY) counts from test8 a where O_ORDERKEY<'ORDERKEY_010' or O_CUSTKEY between 'CUSTKEY_002' and 'CUSTKEY_300' group by o_custkey +select sum(O_TOTALPRICE) as sums,O_CUSTKEY,count(O_ORDERKEY) counts from test8 a where O_CUSTKEY in ('CUSTKEY_003','CUSTKEY_420','CUSTKEY_980') group by o_custkey +select sum(O_TOTALPRICE) as sums,count(O_ORDERKEY) counts from test8 a where O_CUSTKEY not in ('CUSTKEY_003','CUSTKEY_420','CUSTKEY_980') + #select ALL HIGH_PRIORITY STRAIGHT_JOIN SQL_SMALL_RESULT id,O_ORDERKEY,O_CUSTKEY,O_TOTALPRICE,MYDATE from test8 where id=1 +select O_CUSTKEY,case when sum(O_TOTALPRICE)<100000 then 'D' when sum(O_TOTALPRICE)>100000 and sum(O_TOTALPRICE)<1000000 then 'C' when sum(O_TOTALPRICE)>1000000 and sum(O_TOTALPRICE)<5000000 then 'B' else 'A' end as jibie from test8 a group by O_CUSTKEY order by jibie, O_CUSTKEY limit 10 + +## TODO BUG EXISTS here +#select sum(O_TOTALPRICE) as sums,count(O_ORDERKEY) counts from test8 a where not O_CUSTKEY ='CUSTKEY_003' + + ##select ALL HIGH_PRIORITY STRAIGHT_JOIN SQL_SMALL_RESULT SQL_BIG_RESULT id,O_ORDERKEY,O_CUSTKEY,O_TOTALPRICE,MYDATE from test8 where id=1 +select count(*) from test8 where MYDATE between concat(date_format('1992-05-01','%Y-%m'),'-00') and concat(date_format(date_add('1992-05-01',interval 2 month),'%Y-%m'),'-00') + ##select ALL HIGH_PRIORITY STRAIGHT_JOIN SQL_SMALL_RESULT SQL_BIG_RESULT SQL_BUFFER_RESULT count(*) from test8 where mydate between concat(date_format('1992-05-01','%Y-%m'),'-00') and concat(date_format(date_add('1992-05-01',interval 2 month),'%Y-%m'),'-00') +select id,sum(O_TOTALPRICE) from test8 where id>1 and id<50 group by id + ##select ALL HIGH_PRIORITY STRAIGHT_JOIN SQL_SMALL_RESULT SQL_BIG_RESULT SQL_BUFFER_RESULT SQL_CACHE id,sum(O_TOTALPRICE) from test8 where id>1 and id<50 group by id +select count(id) as counts,date_format(MYDATE,'%Y-%m') as mouth from test8 where id>1 and id<50 group by date_format(id,'%Y-%m') + ##select ALL HIGH_PRIORITY STRAIGHT_JOIN SQL_SMALL_RESULT SQL_BIG_RESULT SQL_BUFFER_RESULT SQL_CACHE SQL_CALC_FOUND_ROWS count(id) as counts,date_format(MYDATE,'%Y-%m') as mouth from test8 where id>1 and id<50 group by date_format(MYDATE,'%Y-%m') +select count(id) as counts,date_format(MYDATE,'%Y-%m') as mouth from test8 where id>1 and id<50 group by 2 asc +select id, O_ORDERKEY, O_TOTALPRICE,MYDATE from test8 group by id,O_ORDERKEY,MYDATE + ##select ALL HIGH_PRIORITY STRAIGHT_JOIN SQL_SMALL_RESULT SQL_BIG_RESULT SQL_BUFFER_RESULT SQL_CACHE SQL_CALC_FOUND_ROWS count(id) as counts,date_format(MYDATE,'%Y-%m') as mouth from test8 where id>1 and id<50 group by 2 asc +select count(id) as counts,date_format(MYDATE,'%Y-%m') as mouth,id from test8 where id>1 and id<50 group by 2 asc ,id desc +##select ALL HIGH_PRIORITY STRAIGHT_JOIN SQL_SMALL_RESULT SQL_BIG_RESULT SQL_BUFFER_RESULT SQL_CACHE SQL_CALC_FOUND_ROWS count(id) as counts,date_format(MYDATE,'%Y-%m') as mouth,id from test8 where id>1 and id<50 group by 2 asc ,id desc +select sum(O_TOTALPRICE) as sums,id from test8 where id>1 and id<50 group by 2 asc +##select ALL HIGH_PRIORITY STRAIGHT_JOIN SQL_SMALL_RESULT SQL_BIG_RESULT SQL_BUFFER_RESULT SQL_CACHE SQL_CALC_FOUND_ROWS sum(O_TOTALPRICE) as sums,id from test8 where id>1 and id<50 group by 2 asc +select sum(O_TOTALPRICE ) as sums,id from test8 where id>1 and id<50 group by 2 asc having sums>2000000 +select sum(O_TOTALPRICE ) as sums,id from test8 where id>1 and id<50 group by 2 asc having sums>2000000 + ##select ALL HIGH_PRIORITY STRAIGHT_JOIN SQL_SMALL_RESULT SQL_BIG_RESULT SQL_BUFFER_RESULT SQL_CACHE SQL_CALC_FOUND_ROWS sum(O_TOTALPRICE ) as sums,id from test8 where id>1 and id<50 group by 2 asc having sums>2000000 +select sum(O_TOTALPRICE ) as sums,id,count(O_ORDERKEY) counts from test8 where id>1 and id<50 group by 2 asc having count(O_ORDERKEY)>2 + ##select ALL HIGH_PRIORITY STRAIGHT_JOIN SQL_SMALL_RESULT SQL_BIG_RESULT SQL_BUFFER_RESULT SQL_CACHE SQL_CALC_FOUND_ROWS sum(O_TOTALPRICE ) as sums,id,count(O_ORDERKEY) counts from test8 where id>1 and id<50 group by 2 asc having count(O_ORDERKEY)>2 +select sum(O_TOTALPRICE ) as sums,id,count(O_ORDERKEY) counts from test8 where id>1 and id<50 group by 2 asc having min(O_ORDERKEY)>10 and max(O_ORDERKEY)<10000000 +select sum(O_TOTALPRICE ) from test8 where id>1 and id<50 having min(O_ORDERKEY)<10000 +select id,O_ORDERKEY,O_TOTALPRICE from test8 where id>36900 and id<36902 group by O_ORDERKEY having O_ORDERKEY in (select O_ORDERKEY from test8 group by id having sum(id)>10000) +select sum(O_TOTALPRICE) as sums,O_CUSTKEY,count(O_ORDERKEY) counts from test8 a where O_CUSTKEY between 'CUSTKEY_002' and 'CUSTKEY_300' group by o_custkey +select sum(O_TOTALPRICE) as sums,O_CUSTKEY,count(O_ORDERKEY) counts from test8 a where O_CUSTKEY not between 'CUSTKEY_002' and 'CUSTKEY_300' group by o_custkey +select sum(O_TOTALPRICE) as sums,O_CUSTKEY,count(O_ORDERKEY) counts from test8 a where not (O_CUSTKEY between 'CUSTKEY_002' and 'CUSTKEY_300') group by o_custkey + +select C_NAME from sbtest1.test6 where C_NAME like 'A__A' +select C_NAME from sbtest1.test6 where C_NAME like 'm___i' +select C_NAME from sbtest1.test6 where C_NAME like 'ch___i%%' +select C_NAME from sbtest1.test6 where C_NAME like 'ch___i%%' ESCAPE 'i' +select count(*) from sbtest1.test6 where C_NAME not like 'chen%' +select count(*) from sbtest1.test6 where not (C_NAME like 'chen%') +select C_NAME from sbtest1.test6 where C_NAME like binary 'chen%' +select C_NAME from sbtest1.test6 where C_NAME like 'chen%' +select C_NAME from sbtest1.test6 where C_NAME like concat('%','AM','%') +select C_NAME from sbtest1.test6 where C_NAME like concat('%','en','%') +select O_CUSTKEY,O_ORDERKEY from test8 a where O_CUSTKEY ='CUSTKEY_003' union select O_CUSTKEY,O_ORDERKEY from test8 a where O_CUSTKEY ='CUSTKEY_132' + (select O_CUSTKEY,O_ORDERKEY from test8 a where O_CUSTKEY ='CUSTKEY_003' order by O_ORDERKEY) union (select O_CUSTKEY,O_ORDERKEY from test8 a where O_CUSTKEY ='CUSTKEY_132' order by O_ORDERKEY) +select O_CUSTKEY,O_ORDERKEY from test8 a where O_CUSTKEY ='CUSTKEY_003' union select O_CUSTKEY,O_ORDERKEY from test8 a where O_CUSTKEY ='CUSTKEY_132' order by O_ORDERKEY +select O_CUSTKEY,O_ORDERKEY from test8 a where O_CUSTKEY ='CUSTKEY_003' union select O_CUSTKEY,O_ORDERKEY from test8 a where O_CUSTKEY ='CUSTKEY_132' order by 1, O_ORDERKEY desc/*allow_diff_sequence*/ +select O_CUSTKEY,O_ORDERKEY from test8 a where O_CUSTKEY ='CUSTKEY_003' union select O_CUSTKEY,O_ORDERKEY from test8 a where O_CUSTKEY ='CUSTKEY_132' order by 2,1 + (select O_CUSTKEY,O_ORDERKEY from test8 a where O_CUSTKEY ='CUSTKEY_330') union all (select O_CUSTKEY,O_ORDERKEY from test8 a where O_CUSTKEY ='CUSTKEY_420') union (select O_CUSTKEY,O_ORDERKEY from test8 a where O_CUSTKEY<'CUSTKEY_200') order by 2,1/*allow_diff_sequence*/; +(select O_CUSTKEY,O_ORDERKEY from test8 a where O_CUSTKEY ='CUSTKEY_003') union (select O_CUSTKEY,O_ORDERKEY from test8 a where O_CUSTKEY ='CUSTKEY_132') order by O_ORDERKEY; +(select O_CUSTKEY,O_ORDERKEY from test8 a where O_CUSTKEY ='CUSTKEY_003') union all (select O_CUSTKEY,O_ORDERKEY from test8 a where O_CUSTKEY ='CUSTKEY_132') order by O_ORDERKEY limit 5; +(select O_CUSTKEY,O_ORDERKEY from test8 a where O_CUSTKEY ='CUSTKEY_003' order by O_ORDERKEY limit 5) union all (select O_CUSTKEY,O_ORDERKEY from test8 a where O_CUSTKEY ='CUSTKEY_980' order by O_ORDERKEY limit 5); +(select O_CUSTKEY,O_ORDERKEY from test8 a where O_CUSTKEY ='CUSTKEY_003') union all (select O_CUSTKEY,O_ORDERKEY from test8 a where O_CUSTKEY ='CUSTKEY_132') order by O_ORDERKEY limit 5 +(select O_CUSTKEY,O_ORDERKEY from test8 a where O_CUSTKEY ='CUSTKEY_132') union DISTINCT (select O_CUSTKEY,O_ORDERKEY from test8 a where O_CUSTKEY ='CUSTKEY_003') order by O_ORDERKEY limit 5 +select C_ORDERKEY,C_CUSTKEY,C_NAME from test1,sbtest1.test6 where C_CUSTKEY=c_CUSTKEY and C_ORDERKEY<'ORDERKEY_006' +select count(*) from test6 as a where a.id >= any(select id from sbtest1.test6) +select count(*) from test6 as a where a.id >= any(select avg(id) from sbtest1.test6 group by id) +select count(*) from test6 as a where a.id in(select id from sbtest1.test6) +select count(*) from test6 as a where a.id not in(select id from sbtest1.test6) +select count(*) from test6 as a where not (a.id in(select id from sbtest1.test6)) +select count(*) from test6 as a where a.id not in(select id from sbtest1.test6 where C_ORDERKEY in(1,2)) +select count(*) from test6 as a where not (a.id in(select id from sbtest1.test6 where C_ORDERKEY in(1,2))) +select count(*) from test6 as a where a.id =some(select id from sbtest1.test6) +select count(*) from test6 as a where a.id != any(select id from sbtest1.test6) +select count(*) from (select O_CUSTKEY,count(O_CUSTKEY) as counts from test8 group by O_CUSTKEY) as a where counts<10 group by counts +select O_ORDERKEY,O_CUSTKEY,C_NAME from test8 join sbtest1.test6 on O_CUSTKEY=c_CUSTKEY and O_ORDERKEY<'ORDERKEY_007' +select O_ORDERKEY,O_CUSTKEY,C_NAME from test8 INNER join sbtest1.test6 where O_CUSTKEY=c_CUSTKEY and O_ORDERKEY<'ORDERKEY_007' +select O_ORDERKEY,O_CUSTKEY,C_NAME from test8 INNER join sbtest1.test6 on O_CUSTKEY=c_CUSTKEY and O_ORDERKEY<'ORDERKEY_006' +select O_ORDERKEY,O_CUSTKEY,C_NAME from test8 CROSS join sbtest1.test6 on O_CUSTKEY=c_CUSTKEY and O_ORDERKEY<'ORDERKEY_006' +select test8.O_ORDERKEY,test8.O_CUSTKEY,C_NAME from test6 CROSS join sbtest1.test8 using(id) order by test8.O_ORDERKEY,test8.O_CUSTKEY,C_NAME +select O_ORDERKEY,O_CUSTKEY,C_NAME from sbtest1.test6 as a STRAIGHT_JOIN test8 b where b.O_CUSTKEY=a.c_CUSTKEY and O_ORDERKEY<'ORDERKEY_007' +select b.O_ORDERKEY,b.O_CUSTKEY,a.C_NAME from sbtest1.test6 a STRAIGHT_JOIN test8 b on b.O_CUSTKEY=a.c_CUSTKEY and b.O_ORDERKEY<'ORDERKEY_007' +select a.c_CUSTKEY,a.C_NAME,b.O_ORDERKEY from sbtest1.test6 as a left join test8 b on b.O_CUSTKEY=a.C_CUSTKEY and a.C_CUSTKEY<'CUSTKEY_300' +select a.c_CUSTKEY,a.C_NAME,b.O_ORDERKEY from sbtest1.test6 as a left join test8 b using(id) where a.C_CUSTKEY<'CUSTKEY_300' +select a.c_CUSTKEY,a.C_NAME,b.O_ORDERKEY from sbtest1.test6 as a left OUTER join test8 b using(id) +select a.c_CUSTKEY,a.C_NAME,b.O_ORDERKEY from test8 b right join sbtest1.test6 as a using(id) where a.c_CUSTKEY<'CUSTKEY_300' +select a.c_CUSTKEY,a.C_NAME,b.O_ORDERKEY from test8 b right join sbtest1.test6 as a using(id) +select a.c_CUSTKEY,a.C_NAME,b.O_ORDERKEY from test8 b right join sbtest1.test6 as a on b.O_CUSTKEY=a.C_CUSTKEY and a.c_CUSTKEY<'CUSTKEY_300' + + +select sum(O_TOTALPRICE) as sums,O_CUSTKEY,count(O_ORDERKEY) counts from test9 where O_CUSTKEY between 'CUSTKEY_003' and 'CUSTKEY_500' group by 2 asc having sums>400 order by o_custkey + ##select ALL HIGH_PRIORITY STRAIGHT_JOIN SQL_SMALL_RESULT SQL_BIG_RESULT SQL_BUFFER_RESULT SQL_CACHE SQL_CALC_FOUND_ROWS sum(O_TOTALPRICE) as sums,O_CUSTKEY,count(O_ORDERKEY) counts from test9 where O_CUSTKEY between 'CUSTKEY_003' and 'CUSTKEY_500' group by 2 asc having sums>400 order by o_custkey +select sum(O_TOTALPRICE) as sums,O_CUSTKEY,count(O_ORDERKEY) counts from test9 where O_CUSTKEY between 'CUSTKEY_003' and 'CUSTKEY_500' group by 2 asc having sums>400 order by 2 + ##select ALL HIGH_PRIORITY STRAIGHT_JOIN SQL_SMALL_RESULT SQL_BIG_RESULT SQL_BUFFER_RESULT SQL_CACHE SQL_CALC_FOUND_ROWS sum(O_TOTALPRICE) as sums,O_CUSTKEY,count(O_ORDERKEY) counts from test9 where O_CUSTKEY between 'CUSTKEY_003' and 'CUSTKEY_500' group by 2 asc having sums>400 order by 2 +select sum(O_TOTALPRICE) as sums,O_CUSTKEY,count(O_ORDERKEY) counts from test9 where O_CUSTKEY between 'CUSTKEY_003' and 'CUSTKEY_500' group by 2 asc having sums>400 order by count(O_ORDERKEY), sums + ##select ALL HIGH_PRIORITY STRAIGHT_JOIN SQL_SMALL_RESULT SQL_BIG_RESULT SQL_BUFFER_RESULT SQL_CACHE SQL_CALC_FOUND_ROWS sum(O_TOTALPRICE) as sums,O_CUSTKEY,count(O_ORDERKEY) counts from test9 where O_CUSTKEY between 'CUSTKEY_003' and 'CUSTKEY_500' group by 2 asc having sums>400 order by count(O_ORDERKEY),sums +select sum(O_TOTALPRICE) as sums,O_CUSTKEY,count(O_ORDERKEY) counts from test9 where O_CUSTKEY between 'CUSTKEY_003' and 'CUSTKEY_500' group by 2 asc having sums>400 order by (select C_ORDERKEY from sbtest1.test7 where c_custkey=o_custkey) asc + ##select ALL HIGH_PRIORITY STRAIGHT_JOIN SQL_SMALL_RESULT SQL_BIG_RESULT SQL_BUFFER_RESULT SQL_CACHE SQL_CALC_FOUND_ROWS sum(O_TOTALPRICE) as sums,O_CUSTKEY,count(O_ORDERKEY) counts from test9 where O_CUSTKEY between 'CUSTKEY_003' and 'CUSTKEY_500' group by 2 asc having sums>400 order by (select C_ORDERKEY from sbtest1.test7 where c_custkey=o_custkey) asc +select sum(O_TOTALPRICE) as sums,O_CUSTKEY,count(O_ORDERKEY) counts from test9 where O_CUSTKEY between 'CUSTKEY_003' and 'CUSTKEY_500' group by 2 asc having sums>400 order by counts asc,2 desc + ##select ALL HIGH_PRIORITY STRAIGHT_JOIN SQL_SMALL_RESULT SQL_BIG_RESULT SQL_BUFFER_RESULT SQL_CACHE SQL_CALC_FOUND_ROWS sum(O_TOTALPRICE) as sums,O_CUSTKEY,count(O_ORDERKEY) counts from test9 where O_CUSTKEY between 'CUSTKEY_003' and 'CUSTKEY_500' group by 2 asc having sums>400 order by counts asc,2 desc +select sum(O_TOTALPRICE) as sums,O_CUSTKEY,count(O_ORDERKEY) counts from test9 where O_CUSTKEY between 'CUSTKEY_013' and 'CUSTKEY_050' group by 2 asc having O_CUSTKEY<(select max(c_custkey) from sbtest1.test7) order by o_custkey + ##select ALL HIGH_PRIORITY STRAIGHT_JOIN SQL_SMALL_RESULT SQL_BIG_RESULT SQL_BUFFER_RESULT SQL_CACHE SQL_CALC_FOUND_ROWS sum(O_TOTALPRICE) as sums,O_CUSTKEY,count(O_ORDERKEY) counts from test9 where O_CUSTKEY between 'CUSTKEY_012' and 'CUSTKEY_050' group by 2 asc having O_CUSTKEY<(select max(c_custkey) from sbtest1.test7) order by o_custkey +select sum(O_TOTALPRICE) as sums,O_CUSTKEY,count(O_ORDERKEY) counts from test9 where O_CUSTKEY between 'CUSTKEY_002' and 'CUSTKEY_050' group by 2 asc having O_CUSTKEY<(select max(c_custkey) from sbtest1.test7) order by 2 + ##select ALL HIGH_PRIORITY STRAIGHT_JOIN SQL_SMALL_RESULT SQL_BIG_RESULT SQL_BUFFER_RESULT SQL_CACHE SQL_CALC_FOUND_ROWS sum(O_TOTALPRICE) as sums,O_CUSTKEY,count(O_ORDERKEY) counts from test9 where O_CUSTKEY between 'CUSTKEY_002' and 'CUSTKEY_050' group by 2 asc having O_CUSTKEY<(select max(c_custkey) from sbtest1.test7) order by 2 +select sum(O_TOTALPRICE) as sums,O_CUSTKEY,count(O_ORDERKEY) counts from test9 where O_CUSTKEY between 'CUSTKEY_002' and 'CUSTKEY_050' group by 2 asc having O_CUSTKEY<(select max(c_custkey) from sbtest1.test7) order by count(O_ORDERKEY) + ##select ALL HIGH_PRIORITY STRAIGHT_JOIN SQL_SMALL_RESULT SQL_BIG_RESULT SQL_BUFFER_RESULT SQL_CACHE SQL_CALC_FOUND_ROWS sum(O_TOTALPRICE) as sums,O_CUSTKEY,count(O_ORDERKEY) counts from test9 where O_CUSTKEY between 'CUSTKEY_002' and 'CUSTKEY_050' group by 2 asc having O_CUSTKEY<(select max(c_custkey) from sbtest1.test7) order by count(O_ORDERKEY) +select sum(O_TOTALPRICE) as sums,O_CUSTKEY,count(O_ORDERKEY) counts from test9 where O_CUSTKEY between 'CUSTKEY_002' and 'CUSTKEY_050' group by 2 asc having O_CUSTKEY<(select max(c_custkey) from sbtest1.test7) order by (select C_ORDERKEY from sbtest1.test7 where c_custkey=o_custkey) asc + ##select ALL HIGH_PRIORITY STRAIGHT_JOIN SQL_SMALL_RESULT SQL_BIG_RESULT SQL_BUFFER_RESULT SQL_CACHE SQL_CALC_FOUND_ROWS sum(O_TOTALPRICE) as sums,O_CUSTKEY,count(O_ORDERKEY) counts from test9 where O_CUSTKEY between 'CUSTKEY_002' and 'CUSTKEY_050' group by 2 asc having O_CUSTKEY<(select max(c_custkey) from sbtest1.test7) order by (select C_ORDERKEY from sbtest1.test7 where c_custkey=o_custkey) asc +select sum(O_TOTALPRICE) as sums,O_CUSTKEY,count(O_ORDERKEY) counts from test9 where O_CUSTKEY between 'CUSTKEY_002' and 'CUSTKEY_050' group by 2 asc having O_CUSTKEY<(select max(c_custkey) from sbtest1.test7) order by counts asc,2 desc + ##select ALL HIGH_PRIORITY STRAIGHT_JOIN SQL_SMALL_RESULT SQL_BIG_RESULT SQL_BUFFER_RESULT SQL_CACHE SQL_CALC_FOUND_ROWS sum(O_TOTALPRICE) as sums,O_CUSTKEY,count(O_ORDERKEY) counts from test9 where O_CUSTKEY between 'CUSTKEY_002' and 'CUSTKEY_050' group by 2 asc having O_CUSTKEY<(select max(c_custkey) from sbtest1.test7) order by counts asc,2 desc +select sum(O_TOTALPRICE) as sums,O_CUSTKEY,count(O_ORDERKEY) counts from test9 where O_CUSTKEY between 'CUSTKEY_003' and 'CUSTKEY_500' group by 2 asc having sums>400 order by count(O_ORDERKEY) asc,2 desc limit 2 + ##select ALL HIGH_PRIORITY STRAIGHT_JOIN SQL_SMALL_RESULT SQL_BIG_RESULT SQL_BUFFER_RESULT SQL_CACHE SQL_CALC_FOUND_ROWS sum(O_TOTALPRICE) as sums,O_CUSTKEY,count(O_ORDERKEY) counts from test9 where O_CUSTKEY between 'CUSTKEY_003' and 'CUSTKEY_500' group by 2 asc having sums>400 order by count(O_ORDERKEY) asc,2 desc limit 2 +select sum(O_TOTALPRICE) as sums,O_CUSTKEY,count(O_ORDERKEY) counts from test9 where O_CUSTKEY between 'CUSTKEY_003' and 'CUSTKEY_500' group by 2 asc having sums>400 order by count(O_ORDERKEY) asc,O_CUSTKEY desc limit 1,3 + ##select ALL HIGH_PRIORITY STRAIGHT_JOIN SQL_SMALL_RESULT SQL_BIG_RESULT SQL_BUFFER_RESULT SQL_CACHE SQL_CALC_FOUND_ROWS sum(O_TOTALPRICE) as sums,O_CUSTKEY,count(O_ORDERKEY) counts from test9 where O_CUSTKEY between 'CUSTKEY_003' and 'CUSTKEY_500' group by 2 asc having sums>400 order by count(O_ORDERKEY) asc,O_CUSTKEY desc limit 1,3 +select sum(O_TOTALPRICE) as sums,O_CUSTKEY,count(O_ORDERKEY) counts from test9 where O_CUSTKEY between 'CUSTKEY_003' and 'CUSTKEY_500' group by 2 asc having sums>400 order by count(O_ORDERKEY) asc,O_CUSTKEY desc limit 10 offset 1 + ##select ALL HIGH_PRIORITY STRAIGHT_JOIN SQL_SMALL_RESULT SQL_BIG_RESULT SQL_BUFFER_RESULT SQL_CACHE SQL_CALC_FOUND_ROWS sum(O_TOTALPRICE) as sums,O_CUSTKEY,count(O_ORDERKEY) counts from test9 where O_CUSTKEY between'CUSTKEY_003' and 'CUSTKEY_500' group by 2 asc having sums>400 order by count(O_ORDERKEY) asc,O_CUSTKEY desc limit 10 offset 1 +select sum(O_TOTALPRICE) as sums,O_CUSTKEY,count(O_ORDERKEY) counts from test9 where O_CUSTKEY between 'CUSTKEY_002' and 'CUSTKEY_050' group by 2 asc having O_CUSTKEY<(select max(c_custkey) from sbtest1.test7) order by count(O_ORDERKEY) asc,2 desc limit 10 + ##select ALL HIGH_PRIORITY STRAIGHT_JOIN SQL_SMALL_RESULT SQL_BIG_RESULT SQL_BUFFER_RESULT SQL_CACHE SQL_CALC_FOUND_ROWS sum(O_TOTALPRICE) as sums,O_CUSTKEY,count(O_ORDERKEY) counts from test9 where O_CUSTKEY between 'CUSTKEY_002' and 'CUSTKEY_050' group by 2 asc having O_CUSTKEY<(select max(c_custkey) from sbtest1.test7) order by count(O_ORDERKEY) asc,2 desc limit 10 +select sum(O_TOTALPRICE) as sums,O_CUSTKEY,count(O_ORDERKEY) counts from test9 where O_CUSTKEY between 'CUSTKEY_002' and 'CUSTKEY_050' group by 2 asc having O_CUSTKEY<(select max(c_custkey) from sbtest1.test7) order by count(O_ORDERKEY) asc,O_CUSTKEY desc limit 1,10 + ##select ALL HIGH_PRIORITY STRAIGHT_JOIN SQL_SMALL_RESULT SQL_BIG_RESULT SQL_BUFFER_RESULT SQL_CACHE SQL_CALC_FOUND_ROWS sum(O_TOTALPRICE) as sums,O_CUSTKEY,count(O_ORDERKEY) counts from test9 where O_CUSTKEY between 'CUSTKEY_002' and 'CUSTKEY_050' group by 2 asc having O_CUSTKEY<(select max(c_custkey) from sbtest1.test7) order by count(O_ORDERKEY) asc,O_CUSTKEY desc limit 1,10 +select sum(O_TOTALPRICE) as sums,O_CUSTKEY,count(O_ORDERKEY) counts from test9 where O_CUSTKEY between 'CUSTKEY_002' and 'CUSTKEY_050' group by 2 asc having O_CUSTKEY<(select max(c_custkey) from sbtest1.test7) order by count(O_ORDERKEY) asc,O_CUSTKEY desc limit 10 offset 1 + ##select ALL HIGH_PRIORITY STRAIGHT_JOIN SQL_SMALL_RESULT SQL_BIG_RESULT SQL_BUFFER_RESULT SQL_CACHE SQL_CALC_FOUND_ROWS sum(O_TOTALPRICE) as sums,O_CUSTKEY,count(O_ORDERKEY) counts from test9 where O_CUSTKEY between 'CUSTKEY_002' and 'CUSTKEY_050' group by 2 asc having O_CUSTKEY<(select max(c_custkey) from sbtest1.test7) order by count(O_ORDERKEY) asc,O_CUSTKEY desc limit 10 offset 1 +select sum(O_TOTALPRICE) as sums,O_CUSTKEY,count(O_ORDERKEY) counts,MYDATE from test9 use index (ORDERS_FK1) where O_CUSTKEY between 'CUSTKEY_002' and 'CUSTKEY_300' group by o_custkey +select sum(O_TOTALPRICE) as sums,O_CUSTKEY,count(O_ORDERKEY) counts from test9 use key (ORDERS_FK1) where O_CUSTKEY between 'CUSTKEY_002' and 'CUSTKEY_800' group by o_custkey +select sum(O_TOTALPRICE) as sums,O_CUSTKEY,count(O_ORDERKEY) counts from test9 use key (ORDERS_FK1) ignore index (ORDERS_FK1) where O_CUSTKEY between 'CUSTKEY_002' and 'CUSTKEY_800' group by o_custkey +select sum(O_TOTALPRICE) as sums,O_CUSTKEY,count(O_ORDERKEY) counts from test9 ignore key (ORDERS_FK1) force index (ORDERS_FK1) where O_CUSTKEY between 'CUSTKEY_002' and 'CUSTKEY_300' group by o_custkey +select sum(O_TOTALPRICE) as sums,O_CUSTKEY,count(O_ORDERKEY) counts from test9 ignore key (ORDERS_FK1) force index (ORDERS_FK1) where O_CUSTKEY between 'CUSTKEY_002' and 'CUSTKEY_300' group by o_custkey +select sum(O_TOTALPRICE) as sums,O_CUSTKEY,count(O_ORDERKEY) counts from test9 use index for order by (ORDERS_FK1) ignore index for group by (ORDERS_FK1) where O_CUSTKEY between 1 and 50 group by o_custkey +select sum(O_TOTALPRICE) as sums,O_CUSTKEY,count(O_ORDERKEY) counts from test9 as a use index for group by (ORDERS_FK1) ignore index for join (ORDERS_FK1) where O_CUSTKEY between 'CUSTKEY_002' and 'CUSTKEY_300' group by o_custkey +select sum(O_TOTALPRICE) as sums,O_CUSTKEY,count(O_ORDERKEY) counts from test9 a use index for join (ORDERS_FK1) ignore index for join (ORDERS_FK1) where O_CUSTKEY between 'CUSTKEY_002' and 'CUSTKEY_300' group by o_custkey +select a.c_CUSTKEY,a.C_NAME,b.O_ORDERKEY from sbtest1.test7 as a left join test9 b ignore index for join(ORDERS_FK1) on b.O_CUSTKEY=a.c_CUSTKEY and a.c_CUSTKEY<'CUSTKEY_300' +select a.c_CUSTKEY,a.C_NAME,b.O_ORDERKEY from sbtest1.test7 as a force index for join(primary) left join test9 b ignore index for join(ORDERS_FK1) on b.O_CUSTKEY=a.c_CUSTKEY and a.c_CUSTKEY<'CUSTKEY_300' +select UPPER((select C_NAME FROM sbtest1.test7 limit 1)) FROM sbtest1.test7 limit 1 +select O_ORDERKEY,O_CUSTKEY from test9 as a where a.O_CUSTKEY=(select min(C_CUSTKEY) from sbtest1.test7) +select O_ORDERKEY,O_CUSTKEY from test9 as a where a.O_CUSTKEY<=(select min(C_CUSTKEY) from sbtest1.test7) +select O_ORDERKEY,O_CUSTKEY from test9 as a where a.O_CUSTKEY<=(select min(C_CUSTKEY)+1 from sbtest1.test7) +select count(*) from sbtest1.test7 as a where a.c_CUSTKEY=(select max(C_CUSTKEY) from test9 where C_CUSTKEY=a.C_CUSTKEY) +select C_CUSTKEY from sbtest1.test7 as a where (select count(*) from test9 where O_CUSTKEY=a.C_CUSTKEY)=2 +select count(*) from test9 as a where a.id <> all(select id from sbtest1.test7) +select count(*) from test9 as a where 56000< all(select id from sbtest1.test7) +select count(*) from sbtest1.test7 as a where 2>all(select count(*) from test9 where O_CUSTKEY=C_CUSTKEY) +select id,O_CUSTKEY,O_ORDERKEY,O_TOTALPRICE from test9 a where (a.O_ORDERKEY,O_CUSTKEY)=(select c_ORDERKEY,c_CUSTKEY from sbtest1.test7 where c_name='yanglu') +select id,O_CUSTKEY,O_ORDERKEY,O_TOTALPRICE from test9 a where (a.O_ORDERKEY,a.O_CUSTKEY) in (select c_ORDERKEY,c_CUSTKEY from sbtest1.test7) order by id,O_ORDERKEY,O_CUSTKEY,O_TOTALPRICE,MYDATE +select id,O_CUSTKEY,O_ORDERKEY,O_TOTALPRICE from test9 a where exists(select * from sbtest1.test7 where a.O_CUSTKEY=sbtest1.test7.C_CUSTKEY) +select distinct O_ORDERKEY,O_CUSTKEY from test9 a where exists(select * from sbtest1.test7 where a.O_CUSTKEY=sbtest1.test7.C_CUSTKEY) +select count(*) from test9 a where not exists(select * from sbtest1.test7 where a.O_CUSTKEY=sbtest1.test7.C_CUSTKEY) diff --git a/tests/e2e/unshard/case/join/test_show.sql b/tests/e2e/unshard/case/join/test_show.sql new file mode 100644 index 00000000..c510de94 --- /dev/null +++ b/tests/e2e/unshard/case/join/test_show.sql @@ -0,0 +1,46 @@ +show columns in t1; +show columns from t1; +show full columns from t1; +show columns from t1 from sbtest1/*not_support*/; +-- show columns from t1 from sbtest1_0; +show full columns from t1 from sbtest1; +show full columns from t1 from sbtest1 like 'n%'; +show full columns from t1 from sbtest1 where field like 's%'; +show table status/*allow_diff*/; +show table status like 'aly_o%'/*allow_diff*/; +show tables; +show full tables; +show tables from sbtest1; +show tables in sbtest1; +show full tables from sbtest1; +show full tables in sbtest1; +show tables like 'aly_o%'; +show full tables from sbtest1 like 'aly%'; +show full tables in sbtest1 where table_type like 'base%'; +#create INDEX index_001 ON t1 (ID); +show index from t1; +show index in t1; +show index from t1 from sbtest1; +show index in t1 in sbtest1; +show index in t1 from sbtest1; +show index from t1 in sbtest1; +show keys from t1; +show keys in t1; +show keys from t1 from sbtest1; +show keys from t1 in sbtest1; +show keys in t1 in sbtest1; +show keys in t1 from sbtest1; +#drop index index_001 on t1; +create database if not exists sbtest1; +show create database sbtest1; +show create schema sbtest1; +show create schema if not exists sbtest1; +show create database if not exists sbtest1; +show databases; +show schemas; +show databases like 'sbtest1'; +show schemas like 'sbtest1'; +show open tables; +show open tables from sbtest1; +show open tables in sbtest1; +show open tables from sbtest1 like 'aly_o%'; diff --git a/tests/e2e/unshard/case/join/test_simple.sql b/tests/e2e/unshard/case/join/test_simple.sql new file mode 100644 index 00000000..4078d251 --- /dev/null +++ b/tests/e2e/unshard/case/join/test_simple.sql @@ -0,0 +1,672 @@ + +use sbtest1; +/* some comments */ SELECT CONVERT('111', SIGNED); +/* some comments */ /*comment*/ SELECT CONVERT('111', SIGNED); + +SELECT /*comment*/ CONVERT('111', SIGNED) ; +SELECT CONVERT('111', /*comment*/ SIGNED) ; +SELECT CONVERT('111', SIGNED) /*comment*/; +/*comment*/ /*comment*/ select col1 /* this is a comment */ from t; +SELECT /*!40001 SQL_NO_CACHE */ * FROM t WHERE 1 limit 0, 2000; + + +select b''; +select B''; +SELECT * FROM t; +SELECT * FROM t AS u; +SELECT * FROM t1, t2; +SELECT * FROM t1 AS u, t2; +SELECT * FROM t1, t2 AS u; +SELECT * FROM t1 AS u, t2 AS v; +SELECT * FROM t, t1, t2; +SELECT DISTINCT * FROM t; +SELECT DISTINCTROW * FROM t; +SELECT ALL * FROM t; +SELECT id FROM t; +SELECT * FROM t WHERE 1 = 1; +select 1 from t; +select 1 from t limit 1; +select 1 from t where not exists (select 2); +select * from sbtest1.t1 where id > 4 and id <=8 order by col1 desc; +select 1 as a from t order by a; +select * from sbtest1.t1 where id > 1 order by id desc limit 10; +select * from sbtest1.t2 where id < 0; +select 1 as a from t where 1 < any (select 2) order by a; +select 1 order by 1; + + +SELECT * from t for update; +SELECT * from t lock in share mode; + +DO 1; +DO 1, sleep(1); + +SELECT * from t1, t2, t3; +select * from t1 join t2 left join t3 on t2.id = t3.id; +select * from t1 right join t2 on t1.id = t2.id left join t3 on t3.id = t2.id; +select * from t1 right join t2 using (id) left join t3 using (id); +select * from t1 natural join t2; +select * from t1 natural right join t2; +select * from t1 natural left outer join t2; + + +select * from t1 straight_join t2 on t1.id = t2.id; +select straight_join * from t1 join t2 on t1.id = t2.id; +select straight_join * from t1 left join t2 on t1.id = t2.id; +select straight_join * from t1 right join t2 on t1.id = t2.id; +select straight_join * from t1 straight_join t2 on t1.id = t2.id; + + +(select 1); +ANALYZE TABLE t; + + +SHOW VARIABLES LIKE 'character_set_results'; +SHOW GLOBAL VARIABLES LIKE 'character_set_results'; +SHOW SESSION VARIABLES LIKE 'character_set_results'; +SHOW GLOBAL VARIABLES WHERE Variable_name = 'autocommit'; + + +SHOW STATUS WHERE Variable_name; +SHOW FULL TABLES FROM sbtest1 LIKE 't%'; +SHOW FULL TABLES WHERE Table_type != 'VIEW'; + +SHOW COLUMNS FROM t; +SHOW COLUMNS FROM sbtest1.t; +SHOW FIELDS FROM t; +SHOW TRIGGERS LIKE 't'; + +SHOW DATABASES LIKE 'test2'; +SHOW PROCEDURE STATUS WHERE Db='test'; +SHOW FUNCTION STATUS WHERE Db='test'; +SHOW INDEX FROM t; +SHOW KEYS FROM t; +SHOW INDEX IN t; +SHOW KEYS IN t; +SHOW INDEXES IN t where true; +SHOW KEYS FROM t FROM sbtest1 where true; +SHOW PLUGINS; +SHOW PROFILES; +SHOW PRIVILEGES; +show character set; +show charset; + + +show collation; +show collation like 'utf8%'; +show collation where Charset = 'utf8' and Collation = 'utf8_bin'; + +show columns in t; + +show create table sbtest1.t; +show create table t; + + +show create database sbtest1; +show create database if not exists sbtest1; + + +SELECT ++1; +SELECT -+1; +SELECT -1; +SELECT --1; + + +select '''a''', """a"""; +select '''a'''; +select '\'a\''; +select "\"a\""; +select """a"""; +select _utf8"string"; +select _binary"string"; +select N'string'; +select n'string'; + +select 1 <=> 0, 1 <=> null, 1 = null; + + + +select {ts '1989-09-10 11:11:11'}; +select {d '1989-09-10'}; +select {t '00:00:00.111'}; + + +select {ts123 '1989-09-10 11:11:11'}; +select {ts123 123}; +select {ts123 1 xor 1}; + +SELECT POW(1, 2); +SELECT POW(1, 0.5); +SELECT POW(1, -1); +SELECT POW(-1, 1); + +SELECT MOD(10, 2); +SELECT ROUND(-1.23); +SELECT ROUND(1.23, 1); +SELECT CEIL(-1.23); +SELECT CEILING(1.23); +SELECT FLOOR(-1.23); +SELECT LN(1); +SELECT LOG(-2); +SELECT LOG(2, 65536); +SELECT LOG2(2); +SELECT LOG10(10); +SELECT ABS(10); +SELECT CRC32('MySQL'); +SELECT SIGN(0); +SELECT SQRT(0); +SELECT ACOS(1); +SELECT ASIN(1); +SELECT ATAN(0), ATAN(1), ATAN(1, 2); +SELECT COS(0); +SELECT COS(1); +SELECT COT(1); +SELECT DEGREES(0); +SELECT EXP(1); +SELECT PI(); +SELECT RADIANS(1); +SELECT SIN(1); +SELECT TAN(1); +SELECT TRUNCATE(1.223,1); +SELECT SUBSTR('Quadratically',5); +SELECT SUBSTR('Quadratically',5, 3); +SELECT SUBSTR('Quadratically' FROM 5); +SELECT SUBSTR('Quadratically' FROM 5 FOR 3); +SELECT SUBSTRING('Quadratically',5); +SELECT SUBSTRING('Quadratically',5, 3); +SELECT SUBSTRING('Quadratically' FROM 5); +SELECT SUBSTRING('Quadratically' FROM 5 FOR 3); +SELECT CONVERT('111', SIGNED); +SELECT LEAST(1, 2, 3); +SELECT INTERVAL(1, 0, 1, 2); +SELECT DATE_ADD('2008-01-02', INTERVAL INTERVAL(1, 0, 1) DAY); + + +SELECT DATABASE(); +SELECT SCHEMA(); + + +SELECT VERSION(); +SELECT BENCHMARK(1000000, AES_ENCRYPT('text',UNHEX('F3229A0B371ED2D9441B830D21A390C3'))); +SELECT CHARSET('abc'); +SELECT COERCIBILITY('abc'); +SELECT COLLATION('abc'); + +SELECT SUBSTRING_INDEX('www.mysql.com', '.', 2); +SELECT SUBSTRING_INDEX('www.mysql.com', '.', -2); +SELECT LOWER("A"), UPPER("a"); +SELECT LCASE("A"), UCASE("a"); +SELECT REPLACE('www.mysql.com', 'w', 'Ww'); +SELECT LOCATE('bar', 'foobarbar'); +SELECT LOCATE('bar', 'foobarbar', 5); + + +select row(1, 1) > row(1, 1), row(1, 1, 1) > row(1, 1, 1); +Select (1, 1) > (1, 1); + +SELECT *, CAST(col1 AS CHAR CHARACTER SET utf8) FROM t; + +select cast(1 as signed int); + +SELECT last_insert_id(); +SELECT last_insert_id(1); +SELECT binary 'a'; +SELECT BIT_COUNT(1); + + + +SELECT time('01:02:03'); +SELECT time('01:02:03.1'); +SELECT time('20.1'); +SELECT TIMEDIFF('2000:01:01 00:00:00', '2000:01:01 00:00:00.000001'); +SELECT TIMESTAMPDIFF(MONTH,'2003-02-01','2003-05-01'); +SELECT TIMESTAMPDIFF(YEAR,'2002-05-01','2001-01-01'); +SELECT TIMESTAMPDIFF(MINUTE,'2003-02-01','2003-05-01 12:05:55'); + + +SELECT MICROSECOND('2009-12-31 23:59:59.000010'); +SELECT SECOND('10:05:03'); +SELECT MINUTE('2008-02-03 10:05:03'); + +SELECT CURRENT_DATE, CURRENT_DATE(), CURDATE(); +SELECT DATEDIFF('2003-12-31', '2003-12-30'); +SELECT DATE('2003-12-31 01:02:03'); +SELECT DATE_FORMAT('2003-12-31 01:02:03', '%W %M %Y'); +SELECT DAY('2007-02-03'); +SELECT DAYOFMONTH('2007-02-03'); +SELECT DAYOFWEEK('2007-02-03'); +SELECT DAYOFYEAR('2007-02-03'); +SELECT DAYNAME('2007-02-03'); +SELECT FROM_DAYS(1423); +SELECT WEEKDAY('2007-02-03'); + + +SELECT UTC_DATE, UTC_DATE(); +SELECT UTC_DATE(), UTC_DATE()+0; + + +SELECT WEEK('2007-02-03'); +SELECT WEEK('2007-02-03', 0); +SELECT WEEKOFYEAR('2007-02-03'); +SELECT MONTH('2007-02-03'); +SELECT MONTHNAME('2007-02-03'); +SELECT YEAR('2007-02-03'); +SELECT YEARWEEK('2007-02-03'); +SELECT YEARWEEK('2007-02-03', 0); +SELECT ADDTIME('01:00:00.999999', '02:00:00.999998'); +SELECT SUBTIME('01:00:00.999999', '02:00:00.999998'); + + +SELECT CONVERT_TZ('2004-01-01 12:00:00','+00:00','+10:00'); +SELECT GET_FORMAT(DATE, 'USA'); +SELECT GET_FORMAT(DATETIME, 'USA'); +SELECT GET_FORMAT(TIME, 'USA'); +SELECT GET_FORMAT(TIMESTAMP, 'USA'); + + + + +SELECT MAKEDATE(2011,31); +SELECT MAKETIME(12,15,30); + +SELECT PERIOD_ADD(200801,2); +SELECT PERIOD_DIFF(200802,200703); + + +SELECT QUARTER('2008-04-01'); +SELECT SEC_TO_TIME(2378); +SELECT TIME_FORMAT('100:00:00', '%H %k %h %I %l'); +SELECT TIME_TO_SEC('22:23:00'); +SELECT TIMESTAMPADD(WEEK,1,'2003-01-02'); +SELECT TO_DAYS('2007-10-07'); +SELECT TO_SECONDS('2009-11-29'); +SELECT LAST_DAY('2003-02-05'); + + +select extract(microsecond from "2011-11-11 10:10:10.123456"); +select extract(second from "2011-11-11 10:10:10.123456"); +select extract(minute from "2011-11-11 10:10:10.123456"); +select extract(hour from "2011-11-11 10:10:10.123456"); +select extract(day from "2011-11-11 10:10:10.123456"); +select extract(week from "2011-11-11 10:10:10.123456"); +select extract(month from "2011-11-11 10:10:10.123456"); +select extract(quarter from "2011-11-11 10:10:10.123456"); +select extract(year from "2011-11-11 10:10:10.123456"); +select extract(second_microsecond from "2011-11-11 10:10:10.123456"); +select extract(minute_microsecond from "2011-11-11 10:10:10.123456"); +select extract(minute_second from "2011-11-11 10:10:10.123456"); +select extract(hour_microsecond from "2011-11-11 10:10:10.123456"); +select extract(hour_second from "2011-11-11 10:10:10.123456"); +select extract(hour_minute from "2011-11-11 10:10:10.123456"); +select extract(day_microsecond from "2011-11-11 10:10:10.123456"); +select extract(day_second from "2011-11-11 10:10:10.123456"); +select extract(day_minute from "2011-11-11 10:10:10.123456"); +select extract(day_hour from "2011-11-11 10:10:10.123456"); +select extract(year_month from "2011-11-11 10:10:10.123456"); + + +select from_unixtime(1447430881); +select from_unixtime(1447430881.123456); +select from_unixtime(1447430881.1234567); +select from_unixtime(1447430881.9999999); +select from_unixtime(1447430881, "%Y %D %M %h:%i:%s %x"); +select from_unixtime(1447430881.123456, "%Y %D %M %h:%i:%s %x"); +select from_unixtime(1447430881.1234567, "%Y %D %M %h:%i:%s %x"); + + +SELECT CAST('test collated returns' AS CHAR CHARACTER SET utf8) COLLATE utf8_bin; +SELECT TRIM(' bar '); +SELECT TRIM(LEADING 'x' FROM 'xxxbarxxx'); +SELECT TRIM(BOTH 'x' FROM 'xxxbarxxx'); +SELECT TRIM(TRAILING 'xyz' FROM 'barxxyz'); +SELECT LTRIM(' foo '); +SELECT RTRIM(' bar '); +SELECT RPAD('hi', 6, 'c'); +SELECT BIT_LENGTH('hi'); + +SELECT CHAR_LENGTH('abc'); +SELECT CHARACTER_LENGTH('abc'); +SELECT FIELD('ej', 'Hej', 'ej', 'Heja', 'hej', 'foo'); +SELECT FIND_IN_SET('foo', 'foo,bar'); +SELECT MAKE_SET(1,'a'), MAKE_SET(1,'a','b','c'); +SELECT MID('Sakila', -5, 3); +SELECT OCT(12); +SELECT OCTET_LENGTH('text'); +SELECT ORD('2'); +SELECT POSITION('bar' IN 'foobarbar'); + +SELECT BIN(12); +SELECT ELT(1, 'ej', 'Heja', 'hej', 'foo'); +SELECT EXPORT_SET(5,'Y','N'), EXPORT_SET(5,'Y','N',','), EXPORT_SET(5,'Y','N',',',4); +SELECT FROM_BASE64('abc'); +SELECT TO_BASE64('abc'); + +SELECT LOAD_FILE('/tmp/picture'); +SELECT LPAD('hi',4,'??'); +SELECT LEFT("foobar", 3); +SELECT RIGHT("foobar", 3); + + +SELECT REPEAT("a", 10); + + +SELECT SLEEP(1); +SELECT ANY_VALUE(@arg); +SELECT INET_ATON('10.0.5.9'); +SELECT INET_NTOA(167773449); +SELECT INET6_ATON('fdfe::5a55:caff:fefa:9089'); +SELECT INET6_NTOA(INET_NTOA(167773449)); +SELECT IS_IPV4('10.0.5.9'); +SELECT IS_IPV4_COMPAT(INET6_ATON('::10.0.5.9')); +SELECT IS_IPV4_MAPPED(INET6_ATON('::10.0.5.9')); +SELECT IS_IPV6('10.0.5.9'); +SELECT MASTER_POS_WAIT(@log_name, @log_pos), MASTER_POS_WAIT(@log_name, @log_pos, @timeout), MASTER_POS_WAIT(@log_name, @log_pos, @timeout, @channel_name); +SELECT NAME_CONST('myname', 14); +SELECT RELEASE_ALL_LOCKS(); + + + +select "2011-11-11 10:10:10.123456" + interval 10 second; +select "2011-11-11 10:10:10.123456" - interval 10 second; + + +select date_add("2011-11-11 10:10:10.123456", interval 10 microsecond); +select date_add("2011-11-11 10:10:10.123456", interval 10 second); +select date_add("2011-11-11 10:10:10.123456", interval 10 minute); +select date_add("2011-11-11 10:10:10.123456", interval 10 hour); +select date_add("2011-11-11 10:10:10.123456", interval 10 day); +select date_add("2011-11-11 10:10:10.123456", interval 1 week); +select date_add("2011-11-11 10:10:10.123456", interval 1 month); +select date_add("2011-11-11 10:10:10.123456", interval 1 quarter); +select date_add("2011-11-11 10:10:10.123456", interval 1 year); +select date_add("2011-11-11 10:10:10.123456", interval "10.10" second_microsecond); +select date_add("2011-11-11 10:10:10.123456", interval "10:10.10" minute_microsecond); +select date_add("2011-11-11 10:10:10.123456", interval "10:10" minute_second); +select date_add("2011-11-11 10:10:10.123456", interval "10:10:10.10" hour_microsecond); +select date_add("2011-11-11 10:10:10.123456", interval "10:10:10" hour_second); +select date_add("2011-11-11 10:10:10.123456", interval "10:10" hour_minute); +select date_add("2011-11-11 10:10:10.123456", interval 10.10 hour_minute); +select date_add("2011-11-11 10:10:10.123456", interval "11 10:10:10.10" day_microsecond); +select date_add("2011-11-11 10:10:10.123456", interval "11 10:10:10" day_second); +select date_add("2011-11-11 10:10:10.123456", interval "11 10:10" day_minute); +select date_add("2011-11-11 10:10:10.123456", interval "11 10" day_hour); +select date_add("2011-11-11 10:10:10.123456", interval "11-11" year_month); + +select strcmp('abc', 'def'); + + +select adddate("2011-11-11 10:10:10.123456", interval 10 microsecond); +select adddate("2011-11-11 10:10:10.123456", interval 10 second); +select adddate("2011-11-11 10:10:10.123456", interval 10 minute); +select adddate("2011-11-11 10:10:10.123456", interval 10 hour); +select adddate("2011-11-11 10:10:10.123456", interval 10 day); +select adddate("2011-11-11 10:10:10.123456", interval 1 week); +select adddate("2011-11-11 10:10:10.123456", interval 1 month); +select adddate("2011-11-11 10:10:10.123456", interval 1 quarter); +select adddate("2011-11-11 10:10:10.123456", interval 1 year); +select adddate("2011-11-11 10:10:10.123456", interval "10.10" second_microsecond); +select adddate("2011-11-11 10:10:10.123456", interval "10:10.10" minute_microsecond); +select adddate("2011-11-11 10:10:10.123456", interval "10:10" minute_second); +select adddate("2011-11-11 10:10:10.123456", interval "10:10:10.10" hour_microsecond); +select adddate("2011-11-11 10:10:10.123456", interval "10:10:10" hour_second); +select adddate("2011-11-11 10:10:10.123456", interval "10:10" hour_minute); +select adddate("2011-11-11 10:10:10.123456", interval 10.10 hour_minute); +select adddate("2011-11-11 10:10:10.123456", interval "11 10:10:10.10" day_microsecond); +select adddate("2011-11-11 10:10:10.123456", interval "11 10:10:10" day_second); +select adddate("2011-11-11 10:10:10.123456", interval "11 10:10" day_minute); +select adddate("2011-11-11 10:10:10.123456", interval "11 10" day_hour); +select adddate("2011-11-11 10:10:10.123456", interval "11-11" year_month); +select adddate("2011-11-11 10:10:10.123456", 10); +select adddate("2011-11-11 10:10:10.123456", 0.10); +select adddate("2011-11-11 10:10:10.123456", "11,11"); + + +select date_sub("2011-11-11 10:10:10.123456", interval 10 microsecond); +select date_sub("2011-11-11 10:10:10.123456", interval 10 second); +select date_sub("2011-11-11 10:10:10.123456", interval 10 minute); +select date_sub("2011-11-11 10:10:10.123456", interval 10 hour); +select date_sub("2011-11-11 10:10:10.123456", interval 10 day); +select date_sub("2011-11-11 10:10:10.123456", interval 1 week); +select date_sub("2011-11-11 10:10:10.123456", interval 1 month); +select date_sub("2011-11-11 10:10:10.123456", interval 1 quarter); +select date_sub("2011-11-11 10:10:10.123456", interval 1 year); +select date_sub("2011-11-11 10:10:10.123456", interval "10.10" second_microsecond); +select date_sub("2011-11-11 10:10:10.123456", interval "10:10.10" minute_microsecond); +select date_sub("2011-11-11 10:10:10.123456", interval "10:10" minute_second); +select date_sub("2011-11-11 10:10:10.123456", interval "10:10:10.10" hour_microsecond); +select date_sub("2011-11-11 10:10:10.123456", interval "10:10:10" hour_second); +select date_sub("2011-11-11 10:10:10.123456", interval "10:10" hour_minute); +select date_sub("2011-11-11 10:10:10.123456", interval 10.10 hour_minute); +select date_sub("2011-11-11 10:10:10.123456", interval "11 10:10:10.10" day_microsecond); +select date_sub("2011-11-11 10:10:10.123456", interval "11 10:10:10" day_second); +select date_sub("2011-11-11 10:10:10.123456", interval "11 10:10" day_minute); +select date_sub("2011-11-11 10:10:10.123456", interval "11 10" day_hour); +select date_sub("2011-11-11 10:10:10.123456", interval "11-11" year_month); + + +select subdate("2011-11-11 10:10:10.123456", interval 10 microsecond); +select subdate("2011-11-11 10:10:10.123456", interval 10 second); +select subdate("2011-11-11 10:10:10.123456", interval 10 minute); +select subdate("2011-11-11 10:10:10.123456", interval 10 hour); +select subdate("2011-11-11 10:10:10.123456", interval 10 day); +select subdate("2011-11-11 10:10:10.123456", interval 1 week); +select subdate("2011-11-11 10:10:10.123456", interval 1 month); +select subdate("2011-11-11 10:10:10.123456", interval 1 quarter); +select subdate("2011-11-11 10:10:10.123456", interval 1 year); +select subdate("2011-11-11 10:10:10.123456", interval "10.10" second_microsecond); +select subdate("2011-11-11 10:10:10.123456", interval "10:10.10" minute_microsecond); +select subdate("2011-11-11 10:10:10.123456", interval "10:10" minute_second); +select subdate("2011-11-11 10:10:10.123456", interval "10:10:10.10" hour_microsecond); +select subdate("2011-11-11 10:10:10.123456", interval "10:10:10" hour_second); +select subdate("2011-11-11 10:10:10.123456", interval "10:10" hour_minute); +select subdate("2011-11-11 10:10:10.123456", interval 10.10 hour_minute); +select subdate("2011-11-11 10:10:10.123456", interval "11 10:10:10.10" day_microsecond); +select subdate("2011-11-11 10:10:10.123456", interval "11 10:10:10" day_second); +select subdate("2011-11-11 10:10:10.123456", interval "11 10:10" day_minute); +select subdate("2011-11-11 10:10:10.123456", interval "11 10" day_hour); +select subdate("2011-11-11 10:10:10.123456", interval "11-11" year_month); +select subdate("2011-11-11 10:10:10.123456", 10); +select subdate("2011-11-11 10:10:10.123456", 0.10); +select subdate("2011-11-11 10:10:10.123456", "11,11"); + + +select unix_timestamp(); +select unix_timestamp('2015-11-13 10:20:19.012'); + + + + +select avg(distinct col1) from t; +select avg(distinctrow col1) from t; +select avg(distinct all col1) from t; +select avg(distinctrow all col1) from t; +select avg(col2) from t; + +select bit_and(col1) from t; +select bit_and(all col1) from t; +select bit_or(col1) from t; +select bit_or(all col1) from t; +select bit_xor(col1) from t; +select bit_xor(all col1) from t; +select max(distinct col1) from t; +select max(distinctrow col1) from t; +select max(distinct all col1) from t; +select max(distinctrow all col1) from t; +select max(col2) from t; +select min(distinct col1) from t; +select min(distinctrow col1) from t; +select min(distinct all col1) from t; +select min(distinctrow all col1) from t; + +select min(col2) from t; +select sum(distinct col1) from t; +select sum(distinctrow col1) from t; +select sum(distinct all col1) from t; +select sum(distinctrow all col1) from t; +select sum(col2) from t; +select count(col1) from t; +select count(*) from t; +select count(distinct col1, col2) from t; +select count(distinctrow col1, col2) from t; +select count(all col1) from t; + +select group_concat(col2,col1) from t group by col1; +select group_concat(col2,col1 SEPARATOR ';') from t group by col1; +select group_concat(distinct col2,col1) from t group by col1; +select group_concat(distinctrow col2,col1) from t group by col1; +SELECT col1, GROUP_CONCAT(DISTINCT col2 ORDER BY col2 DESC SEPARATOR ' ') FROM t GROUP BY col1; +select std(col1), std(all col1) from t; +select stddev(col1), stddev(all col1) from t; +select stddev_pop(col1), stddev_pop(all col1) from t; +select stddev_samp(col1), stddev_samp(all col1) from t; +select variance(col1), variance(all col1) from t; +select var_pop(col1), var_pop(all col1) from t; +select var_samp(col1), var_samp(all col1) from t; + + +select AES_ENCRYPT('text',UNHEX('F3229A0B371ED2D9441B830D21A390C3')); +select AES_DECRYPT(@crypt_str,@key_str); +select AES_DECRYPT(@crypt_str,@key_str,@init_vector); +SELECT COMPRESS(''); + + +SELECT MD5('testing'); + +SELECT RANDOM_BYTES(@len); +SELECT SHA1('abc'); +SELECT SHA('abc'); +SELECT SHA2('abc', 224); +SELECT UNCOMPRESS('any string'); +SELECT UNCOMPRESSED_LENGTH(@compressed_string); +SELECT VALIDATE_PASSWORD_STRENGTH(@str); + + +SELECT CHAR(65); +SELECT CHAR(65, 66, 67); +SELECT HEX(CHAR(1, 0)),HEX(CHAR(256)),HEX(CHAR(1, 1)),HEX(CHAR(257)); +SELECT CHAR(0x027FA USING ucs2); +SELECT CHAR(0xc2a7 USING utf8); + + + +select 1 as a, 1 as `a`, 1 as 'a'; +select 1 as a, 1 as "a", 1 as 'a'; +select 1 a, 1 "a", 1 'a'; +select * from t a; +select * from t as a; +select 1 full, 1 `row`, 1 abs; +select * from t full, t1 `row`, t2 abs; + + +select .78+123; +select .78+.21; +select .78-123; +select .78-.21; +select .78--123; +select .78*123; +select .78*.21; +select .78/123; +select .78/.21; +select .78,123; +select .78,.21; +select .78 , 123; +select .78'123'; +select .78`123`; +select .78"123"; + + +select x'0a', X'11', 0x11; +select x'13181C76734725455A'; +select 0x4920616D2061206C6F6E672068657820737472696E67; + + +select 0b01, 0b0, b'11', B'11'; + +SELECT 1 > (select 1); +SELECT 1 > ANY (select 1); +SELECT 1 > ALL (select 1); +SELECT 1 > SOME (select 1); + + +SELECT EXISTS (select 1); +SELECT + EXISTS (select 1); +SELECT - EXISTS (select 1); +SELECT NOT EXISTS (select 1); + +select * from t1 where not exists (select * from t2 where t1.col1 = t2.col1); + + +select col1 from t1 union select col2 from t2; +select col1 from t1 union (select col2 from t2); +select col1 from t1 union (select col2 from t2) order by col1; +select col1 from t1 union (select col2 from t2) limit 1; +select col1 from t1 union (select col2 from t2) limit 1, 1; +select col1 from t1 union (select col2 from t2) order by col1 limit 1; +(select col1 from t1) union distinct select col2 from t2; +(select col1 from t1) union distinctrow select col2 from t2; +(select col1 from t1) union all select col2 from t2; +(select col1 from t1) union select col2 from t2 union (select col2 from t3) order by col1 limit 1; +select (select 1 union select 1) as a; +select * from (select 1 union select 2) as a; +select 2 as a from dual union select 1 as b from dual order by a; + + +select 2 as a from t1 union select 1 as b from t1 order by a; +(select 2 as a from t order by a) union select 1 as b from t order by a; +select 1 a, 2 b from dual order by a; +select 1 a, 2 b from dual; + + +select "abc_" like "abc\\_" escape ''; +select "abc_" like "abc\\_" escape '\\'; +select "abc" like "escape" escape '+'; +select '''_' like '''_' escape ''''; + + +select * from t use index (primary); +select * from t use index (`primary`); +select * from t use index (); +select * from t use index (idx1); +select * from t use index (idx1, idx2); +select * from t ignore key (idx1); +select * from t force index for join (idx1); +select * from t use index for order by (idx1); +select * from t force index for group by (idx1); +select * from t use index for group by (idx1) use index for order by (idx2), t2; + + +select high_priority * from t; + +select * from t; + + +select """"; +select "汉字"; +select 'abc"def'; +select 'a\r\n'; +select "\a\r\n"; +select "\xFF"; + + +explain select col1 from t1; +explain delete t1, t2 from t1 inner join t2 inner join t3 where t1.id=t2.id and t2.id=t3.id; +explain update t set id = id + 1 order by id desc; +EXPLAIN select col1 from t1 union (select col2 from t2) limit 1, 1; +EXPLAIN SELECT 1; + +PREPARE pname FROM 'SELECT ?'; + + +SELECT col1, MAX(col2) AS max_col2 FROM t GROUP BY col1 WITH ROLLUP; +SELECT COALESCE(col1,'ALL') AS coalesced_col1, MAX(col2) AS max_col2 FROM t GROUP BY col1 WITH ROLLUP; + +select col1 from t1 group by col1 order by null; +select col1 from t1 group by col1 order by 1; + +# simple function +## DIV +SELECT 5 DIV 2, -5 DIV 2, 5 DIV -2, -5 DIV -2; + +## other +SELECT INSERT('Quadratic', 3, 4, 'What'); +SELECT CHAR(65); diff --git a/tests/e2e/unshard/case/join/test_subquery_global.sql b/tests/e2e/unshard/case/join/test_subquery_global.sql new file mode 100644 index 00000000..d0fa22b9 --- /dev/null +++ b/tests/e2e/unshard/case/join/test_subquery_global.sql @@ -0,0 +1,65 @@ +use sbtest1; +select a.id,b.id,b.pad,a.t_id from test1 a,(select all * from sbtest1.test2) b where a.t_id=b.o_id; +select a.id,b.id,b.pad,a.t_id from test1 a,(select distinct * from sbtest1.test2) b where a.t_id=b.o_id; +select id,o_id,name,pad from (select * from sbtest1.test2 a group by a.id) a; +select * from (select pad,count(*) from sbtest1.test2 a group by pad) a; +select a.id,b.id,b.pad,a.t_id from test1 a,(select * from sbtest1.test2 having pad>3) b where a.t_id=b.o_id; +select a.id,b.id,b.pad,a.t_id from test1 a,(select * from sbtest1.test2 where pad>3 order by id) b where a.t_id=b.o_id; +select a.id,b.id,b.pad,a.t_id from test1 a,(select * from sbtest1.test2 order by id limit 3) b where a.t_id=b.o_id; +select a.id,b.id,b.pad,a.t_id from test1 a,(select * from sbtest1.test2 order by id limit 3) b where a.t_id=b.o_id limit 2; +select a.id,b.id,b.pad,a.t_id from test1 a,(select * from sbtest1.test2 where pad>3) b where a.t_id=b.o_id; +select * from (select sbtest1.test3.pad from test1 left join sbtest1.test3 on test1.pad=sbtest1.test3.pad) a; + +select id,t_id,name,pad from (select * from test1 union select * from sbtest1.test3) a where a.id >3; +select id,pad from test1 where pad=(select min(id) from sbtest1.test3); +select id,pad,name from (select * from test1 where pad>2) a where id<5; +select pad,count(*) from (select * from test1 where pad>2) a group by pad; +select pad,count(*) from (select * from test1 where pad>2) a group by pad order by pad; +select count(*) from (select pad,count(*) a from test1 group by pad) a; +select id,t_id,name,pad from test1 where pad<(select pad from sbtest1.test3 where id=3); +select id,t_id,name,pad from test1 having pad<(select pad from sbtest1.test3 where id=3); +select a.id,b.id,b.pad,a.t_id from test1 a,(select * from sbtest1.test2 where pad>3) b where a.t_id=b.o_id; + +select id,name,(select count(*) from sbtest1.test3) count from test1; +select id,t_id,name,pad from test1 where pad like (select pad from sbtest1.test3 where id=3); +select id,pad from test1 where pad>(select pad from test1 where id=2); +select id,pad from test1 where pad<(select pad from test1 where id=2); +select id,pad from test1 where pad=(select pad from test1 where id=2); +select id,pad from test1 where pad>=(select pad from test1 where id=2); +select id,pad from test1 where pad<=(select pad from test1 where id=2); +select id,pad from test1 where pad<>(select pad from test1 where id=2); +select id,pad from test1 where pad !=(select pad from test1 where id=2); + +select id,t_id,name,pad from test1 where exists(select * from test1 where pad>1); +select id,t_id,name,pad from test1 where not exists(select * from test1 where pad>1); +select id,t_id,name,pad from test1 where pad not in(select id from test1 where pad>1); +select id,t_id,name,pad from test1 where pad in(select id from test1 where pad>1); +select id,t_id,name,pad from test1 where pad=some(select id from test1 where pad>1); +select id,t_id,name,pad from test1 where pad=any(select id from test1 where pad>1); +select id,t_id,name,pad from test1 where pad !=any(select id from test1 where pad=3); + +SELECT a.id AS a_id, b.id AS b_id, b.pad AS b_pad, a.t_id AS a_t_id FROM (SELECT t1.id, t1.pad, t1.t_id FROM test1 AS t1 JOIN sbtest1.test3 AS t3 ON t1.pad = t3.pad) AS a JOIN (SELECT t2.id, t2.pad FROM test1 AS t1_2 JOIN sbtest1.test2 AS t2 ON t1_2.pad = t2.pad) AS b ON a.pad = b.pad; +select id,t_id,name,pad from test1 where pad>(select pad from test1 where pad=2); +select b.id,b.t_id,b.name,b.pad,a.id,a.id,a.pad,a.t_id from test1 b,(select * from test1 where id>3 union select * from sbtest1.test3 where id<2) a where a.id >3 and b.pad=a.pad; +select count(*) from (select * from test1 where pad=(select pad from sbtest1.test3 where id=1)) a; + + +select (select name from test1 limit 1); +select id,t_id,name,pad from test1 where 'test_2'=(select name from sbtest1.test3 where id=2); +select id,t_id,name,pad from test1 where 5=(select count(*) from sbtest1.test3); +select id,t_id,name,pad from test1 where 'test_2' like(select name from sbtest1.test3 where id=2); +select id,t_id,name,pad from test1 where 2 >any(select id from test1 where pad>1); +select id,t_id,name,pad from test1 where 2 in(select id from test1 where pad>1); +select id,t_id,name,pad from test1 where 2<>some(select id from test1 where pad>1); +select id,t_id,name,pad from test1 where 2>all(select id from test1 where pad<1); + +select id,t_id,name,pad from test1 where (id,pad)=(select id,pad from sbtest1.test3 limit 1); +select id,t_id,name,pad from test1 where row(id,pad)=(select id,pad from sbtest1.test3 limit 1); +select id,name,pad from test1 where (id,pad)in(select id,pad from sbtest1.test3); +select id,name,pad from test1 where (1,1)in(select id,pad from sbtest1.test3); + +SELECT x.pad FROM test1 AS x WHERE x.id = ( SELECT y.pad FROM sbtest1.test3 AS y WHERE y.id = ( SELECT z.pad FROM sbtest1.test2 AS z WHERE y.id = z.id LIMIT 1 ) LIMIT 1 ); +select co1,co2,co3 from (select id as co1,name as co2,pad as co3 from test1)as tb where co1>1; +select avg(sum_column1) from (select sum(id) as sum_column1 from test1 group by pad) as t1; +select * from (select m.id,n.pad from test1 m,sbtest1.test2 n where m.id=n.id AND m.name='test中id为1' and m.pad>7 and m.pad<10)a; +select id,t_id,name,pad from test1 where id in (select id from test1 where id in ( select id from test1 where id in (select id from test1 where id =0) or id not in(select id from test1 where id =1))); diff --git a/tests/e2e/unshard/dml.go b/tests/e2e/unshard/dml.go new file mode 100644 index 00000000..8edf4385 --- /dev/null +++ b/tests/e2e/unshard/dml.go @@ -0,0 +1,74 @@ +// Copyright 2024 The Gaea Authors. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package unshard + +import ( + "path/filepath" + + config "github.com/XiaoMi/Gaea/tests/e2e/config" + "github.com/XiaoMi/Gaea/tests/e2e/util" + "github.com/onsi/ginkgo/v2" +) + +var _ = ginkgo.Describe("sql_support_test", func() { + planManagers := []*config.PlanManager{} + e2eMgr := config.NewE2eManager() + slice := e2eMgr.NsSlices[config.SliceSingleSlave] + gaeaConn, err := e2eMgr.GetReadWriteGaeaUserConn() + util.ExpectNoError(err) + + ginkgo.BeforeEach(func() { + // 注册 + ns, err := config.ParseNamespaceTmpl(config.UnShardDMLNamespaceTmpl, slice) + util.ExpectNoError(err) + err = e2eMgr.ModifyNamespace(ns) + util.ExpectNoError(err) + + casesPath, err := config.GetJSONFilesFromDir(filepath.Join(e2eMgr.BasePath, "unshard/case/dml")) + util.ExpectNoError(err) + + conns, err := slice.GetLocalSliceConn() + util.ExpectNoError(err) + + ginkgo.By("get sql plan") + planManagers = []*config.PlanManager{} + for _, v := range casesPath { + p := &config.PlanManager{ + PlanPath: v, + MysqlClusterConn: conns, + GaeaDB: gaeaConn, + } + planManagers = append(planManagers, p) + } + }) + + ginkgo.Context("sql support test", func() { + ginkgo.It("sql support", func() { + for _, p := range planManagers { + err := p.Init() + util.ExpectNoError(err) + err = p.Run() + util.ExpectNoError(err) + } + }) + }) + + ginkgo.AfterEach(func() { + for _, p := range planManagers { + p.MysqlClusterConnClose() + } + e2eMgr.Clean() + }) +}) diff --git a/tests/e2e/unshard/unshard.go b/tests/e2e/unshard/unshard.go new file mode 100644 index 00000000..f33ca0ac --- /dev/null +++ b/tests/e2e/unshard/unshard.go @@ -0,0 +1,100 @@ +// Copyright 2024 The Gaea Authors. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package unshard + +import ( + "fmt" + "path/filepath" + "time" + + "github.com/XiaoMi/Gaea/tests/e2e/config" + "github.com/XiaoMi/Gaea/tests/e2e/util" + + "github.com/onsi/ginkgo/v2" +) + +var _ = ginkgo.Describe("Unshard DML Support Test", func() { + e2eMgr := config.NewE2eManager() + slice := e2eMgr.NsSlices[config.SliceSingleSlave] + testCases := struct { + PrepareSqlFiles []string + TestSqlFiles []string + CleanSqlFiles []string + }{ + PrepareSqlFiles: []string{ + filepath.Join(e2eMgr.BasePath, "unshard/case/join/0-prepare.sql"), + }, + TestSqlFiles: []string{ + filepath.Join(e2eMgr.BasePath, "unshard/case/join/test_join_unsharding.sql"), + filepath.Join(e2eMgr.BasePath, "unshard/case/join/test_join.sql"), + filepath.Join(e2eMgr.BasePath, "unshard/case/join/test_select_global_old.sql"), + filepath.Join(e2eMgr.BasePath, "unshard/case/join/test_simple.sql"), + filepath.Join(e2eMgr.BasePath, "unshard/case/join/test_subquery_global.sql"), + }, + CleanSqlFiles: []string{ + filepath.Join(e2eMgr.BasePath, "unshard/case/join/1-clean.sql"), + }, + } + ginkgo.BeforeEach(func() { + ns, err := config.ParseNamespaceTmpl(config.UnShardNamespaceTmpl, slice) + util.ExpectNoError(err) + err = e2eMgr.ModifyNamespace(ns) + util.ExpectNoError(err) + master, err := slice.GetMasterAdminConn(0) + util.ExpectNoError(err) + ginkgo.By("get setup file") + for _, file := range testCases.PrepareSqlFiles { + sqls, err := util.GetSqlFromFile(file) + util.ExpectNoError(err) + for _, sql := range sqls { + _, err = util.MysqlExec(master, sql) + util.ExpectNoError(err) + } + } + // 等待从库追赶主库 + time.Sleep(2 * time.Second) + }) + ginkgo.Context("unshard support test", func() { + ginkgo.It("When testing unshard sql support", func() { + ginkgo.By("get Gaea conn ") + gaeaConn, err := e2eMgr.GetReadWriteGaeaUserConn() + util.ExpectNoError(err) + // namespace使用的是普通权限的用户 + // 简单show语句走从库 + slaveConn, err := slice.GetSlaveCommonConn(0, 0) + util.ExpectNoError(err) + for _, file := range testCases.TestSqlFiles { + sqls, err := util.GetSqlFromFile(file) + util.ExpectNoError(err) + for _, sql := range sqls { + _, err = gaeaConn.Exec("use sbtest1") + util.ExpectNoError(err) + _, err = slaveConn.Exec("use sbtest1") + util.ExpectNoError(err) + gaeaRes, err := util.MysqlQuery(gaeaConn, sql) + util.ExpectNoError(err, fmt.Sprintf("gaea exec equal sql err:%v, err:%v\n", sql, err)) + mysqlRes, err := util.MysqlQuery(slaveConn, sql) + util.ExpectNoError(err, fmt.Sprintf("mysql exec equal sql err:%v, err:%v\n", sql, err)) + res, err := util.CompareIgnoreSort(gaeaRes, mysqlRes) + util.ExpectNoError(err, fmt.Sprintf("compare equal sql get uneuqal res.sql:%v, err:%v\n", sql, err), res) + } + } + }) + }) + ginkgo.AfterEach(func() { + // 删除注册 + e2eMgr.Clean() + }) +}) diff --git a/tests/e2e/util/action.go b/tests/e2e/util/action.go new file mode 100644 index 00000000..65a8f0e3 --- /dev/null +++ b/tests/e2e/util/action.go @@ -0,0 +1,47 @@ +// Copyright 2024 The Gaea Authors. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package util + +import ( + "os/exec" +) + +// StartGaeaDefault gaea的一些操作 +func StartGaeaDefault() error { + cmd := exec.Command("sh", "-c", CmdStartGaea) + _, err := cmd.CombinedOutput() + return err +} + +// StartGaeaCCDefault gaeacc的一些操作 +func StartGaeaCCDefault() error { + cmd := exec.Command("sh", "-c", CmdStartGaeaCC) + _, err := cmd.CombinedOutput() + return err +} + +// StopGaeaDefault gaea的一些操作 +func StopGaeaDefault() error { + cmd := exec.Command("sh", "-c", CmdStopGaea) + _, err := cmd.CombinedOutput() + return err +} + +// StopGaeaCCDefault gaeacc的一些操作 +func StopGaeaCCDefault() error { + cmd := exec.Command("sh", "-c", CmdStopGaeaCC) + _, err := cmd.CombinedOutput() + return err +} diff --git a/util/request_context_test.go b/tests/e2e/util/constant.go similarity index 61% rename from util/request_context_test.go rename to tests/e2e/util/constant.go index 55643292..4e2ea897 100644 --- a/util/request_context_test.go +++ b/tests/e2e/util/constant.go @@ -1,4 +1,4 @@ -// Copyright 2019 The Gaea Authors. All Rights Reserved. +// Copyright 2024 The Gaea Authors. All Rights Reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -11,14 +11,21 @@ // 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 util -import "testing" +var ( + // gaea 相关命令 + CmdStartGaea = "cd ./cmd ; ./gaea --config=gaea.ini >/dev/null 2>&1 &" + CmdStopGaea = "pkill gaea" + CmdStartGaeaCC = "cd ./cmd ; ./gaea-cc -c=gaea_cc.ini >/dev/null 2>&1 &" + CmdStopGaeaCC = "pkill gaea-cc" +) + +type ResultType int -func Benchmark_RequestContext_Get(b *testing.B) { - var rctx = NewRequestContext() - rctx.Set("key", "value") - for i := 0; i < b.N; i++ { - rctx.Get("key") - } -} +const ( + Equal = iota + UnEqual + UnSupport +) diff --git a/tests/e2e/util/db.go b/tests/e2e/util/db.go new file mode 100644 index 00000000..37f784c8 --- /dev/null +++ b/tests/e2e/util/db.go @@ -0,0 +1,557 @@ +// Copyright 2024 The Gaea Authors. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package util + +import ( + "database/sql" + "fmt" + "io/ioutil" + "reflect" + "strconv" + "strings" + "time" +) + +// This function does not call rows.Close() +// so the release of resources should be managed by external code that calls this function. +// When using this function, be sure to call rows.Close() externally to avoid leaking database resources. +func GetDataFromRows(rows *sql.Rows) ([][]string, error) { + pr := func(t interface{}) (r string) { + r = "\\N" + switch v := t.(type) { + case *sql.NullBool: + if v.Valid { + r = strconv.FormatBool(v.Bool) + } + case *sql.NullString: + if v.Valid { + r = v.String + } + case *sql.NullInt64: + if v.Valid { + r = fmt.Sprintf("%v", v.Int64) + } + case *sql.NullFloat64: + if v.Valid { + r = fmt.Sprintf("%v", v.Float64) + } + case *time.Time: + if v.Year() > 1900 { + r = v.Format("2006-01-02 15:04:05") + } + default: + r = fmt.Sprintf("%#v", t) + } + return + } + c, _ := rows.Columns() + n := len(c) + field := make([]interface{}, 0, n) + for i := 0; i < n; i++ { + field = append(field, new(sql.NullString)) + } + var converts [][]string + for rows.Next() { + if err := rows.Scan(field...); err != nil { + return nil, err + } + row := make([]string, 0, n) + for i := 0; i < n; i++ { + col := pr(field[i]) + if col == "\\N" { + col = "NULL" // 或者期望的其他值 + } + row = append(row, col) + } + converts = append(converts, row) + } + return converts, nil +} + +// This function does not call rows.Close() +// so the release of resources should be managed by external code that calls this function. +// When using this function, be sure to call rows.Close() externally to avoid leaking database resources. +func GetColumnAbdDataFromRows(rows *sql.Rows) ([]string, [][]string, error) { + pr := func(t interface{}) (r string) { + r = "\\N" + switch v := t.(type) { + case *sql.NullBool: + if v.Valid { + r = strconv.FormatBool(v.Bool) + } + case *sql.NullString: + if v.Valid { + r = v.String + } + case *sql.NullInt64: + if v.Valid { + r = fmt.Sprintf("%v", v.Int64) + } + case *sql.NullFloat64: + if v.Valid { + r = fmt.Sprintf("%v", v.Float64) + } + case *time.Time: + if v.Year() > 1900 { + r = v.Format("2006-01-02 15:04:05") + } + default: + r = fmt.Sprintf("%#v", t) + } + return + } + c, _ := rows.Columns() + n := len(c) + field := make([]interface{}, 0, n) + for i := 0; i < n; i++ { + field = append(field, new(sql.NullString)) + } + var converts [][]string + for rows.Next() { + if err := rows.Scan(field...); err != nil { + return nil, nil, err + } + row := make([]string, 0, n) + for i := 0; i < n; i++ { + col := pr(field[i]) + if col == "\\N" { + col = "NULL" // 或者期望的其他值 + } + row = append(row, col) + } + converts = append(converts, row) + } + return c, converts, nil +} + +// GetDataFromRow retrieves data from a single SQL row and returns it as a slice of strings. +// It handles various SQL data types and converts them into a readable string format. +// If the row contains SQL null values, they are converted to a readable format. +// The function returns an error if the row scan fails. +func GetDataFromRow(row *sql.Row, numCols int) ([]string, error) { + pr := func(t interface{}) (r string) { + r = "\\N" + switch v := t.(type) { + case *sql.NullBool: + if v.Valid { + r = strconv.FormatBool(v.Bool) + } + case *sql.NullString: + if v.Valid { + r = v.String + } + case *sql.NullInt64: + if v.Valid { + r = fmt.Sprintf("%v", v.Int64) + } + case *sql.NullFloat64: + if v.Valid { + r = fmt.Sprintf("%v", v.Float64) + } + case *time.Time: + if v.Year() > 1900 { + r = v.Format("2006-01-02 15:04:05") + } + default: + r = fmt.Sprintf("%#v", t) + } + return + } + + field := make([]interface{}, 0, numCols) + for i := 0; i < numCols; i++ { + field = append(field, new(sql.NullString)) + } + + if err := row.Scan(field...); err != nil { + if err == sql.ErrNoRows { + return []string{}, err + } + return nil, err + } + result := make([]string, 0, numCols) + for i := 0; i < numCols; i++ { + col := pr(field[i]) + result = append(result, col) + } + + return result, nil +} + +// GetDataFromResult retrieves the number of rows affected by an SQL operation. +// It is useful for understanding the impact of non-query SQL commands like INSERT, UPDATE, or DELETE. +// The function returns the number of rows affected and an error if the operation fails. +func GetDataFromResult(result sql.Result) (int64, error) { + rowsAffected, err := result.RowsAffected() + if err != nil { + return 0, err + } + return rowsAffected, nil +} + +// MysqlQuery executes a given SQL query on the provided database connection and returns the results. +// The results are returned as a slice of string slices, where each inner slice represents a row. +// The function handles no-row scenarios and returns an error for other query failures. +func MysqlQuery(db *sql.DB, execSql string) ([][]string, error) { + rows, err := db.Query(execSql) + if err != nil { + if err == sql.ErrNoRows { + // No rows found, but it's not an actual error, so we return nil + return nil, nil + } + // An error occurred while querying + return nil, err + } + defer rows.Close() + res, err := GetDataFromRows(rows) + if err != nil { + return nil, fmt.Errorf("get data from rows Error: %v", err) + } + return res, nil +} + +// MysqlExec executes a given SQL command (like INSERT, UPDATE, DELETE) on the provided database connection. +// It returns the number of rows affected by the command and an error if the command execution fails. +func MysqlExec(db *sql.DB, execSql string) (int64, error) { + result, err := db.Exec(execSql) + if err != nil { + if err == sql.ErrNoRows { + // No rows affected but not an error, so return 0 + return 0, nil + } + return -1, fmt.Errorf("sql %s Exec Error: %v", execSql, err) + } + rowsAffected, err := GetDataFromResult(result) + if err != nil { + return 0, fmt.Errorf("get data from to result Error: %v", err) + } + return rowsAffected, nil +} + +// IsSlice function takes an interface{} type argument i and returns a boolean +// indicating whether i is of a slice type. +func IsSlice(i interface{}) bool { + // Use reflect.TypeOf to get the reflection Type object of i. + // If i is nil, reflect.TypeOf(i) will return nil, + // so it's necessary to check for nil before calling the .Kind() method. + t := reflect.TypeOf(i) + if t == nil { + return false + } + + // The .Kind() method returns the specific kind of the type. + // reflect.Slice is a constant representing the slice type. + // If the kind of i is a slice, return true; otherwise, return false. + return t.Kind() == reflect.Slice +} + +// GetSqlFromFile reads SQL commands from a file and returns them as a slice of strings. +// It ignores lines that are comments (starting with "//", "#", or "--"). +// The function returns an error if reading the file fails. +func GetSqlFromFile(path string) ([]string, error) { + bys, err := ioutil.ReadFile(path) + if err != nil { + return nil, fmt.Errorf("read file error") + } + var res []string + sqlString := strings.Split(string(bys), "\n") + for _, sql := range sqlString { + trimSql := strings.TrimSpace(sql) + if strings.HasPrefix(trimSql, "//") || strings.HasPrefix(trimSql, "#") || trimSql == "" || strings.HasPrefix(trimSql, "-- ") || strings.HasPrefix(trimSql, "--") { + continue + } + res = append(res, sql) + } + return res, nil +} + +// CompareIgnoreSort compares two slices of string slices (representing SQL query results) without considering the order of rows. +// It is useful for comparing query results where the row order is not guaranteed. +// The function returns true if the results are equivalent, and false with an error if they are not. +func CompareIgnoreSort(gaeaRes [][]string, mysqlRes [][]string) (bool, error) { + if len(gaeaRes) != len(mysqlRes) { + return false, fmt.Errorf("sql.Result mismatched lengths for results. gaeaRes: %v, mysqlRes: %v", gaeaRes, mysqlRes) + } + + elementCount := make(map[string]int) + for _, item := range gaeaRes { + elementCount[fmt.Sprint(item)]++ + } + + for _, item := range mysqlRes { + elementCount[fmt.Sprint(item)]-- + if elementCount[fmt.Sprint(item)] < 0 { + return false, fmt.Errorf("sql.Result mismatched elements for results. gaeaRes: %v, mysqlRes: %v", gaeaRes, mysqlRes) + } + } + + for _, count := range elementCount { + if count != 0 { + return false, fmt.Errorf("sql.Result mismatched elements for results. gaeaRes: %v, mysqlRes: %v", gaeaRes, mysqlRes) + } + } + + return true, nil +} + +// SetupDatabaseAndInsertData sets up a database and a table, and then inserts data into the table. +// It first drops the database if it already exists, creates a new database, and then creates a table within that database. +// After setting up the database and table, it inserts a predefined number of rows into the table. +// The function takes a database connection, and the names of the database and table as parameters. +// It returns an error if any of the database setup or data insertion commands fail. +func SetupDatabaseAndInsertData(conn *sql.DB, db, table string) error { + commands := []string{ + fmt.Sprintf("DROP DATABASE IF EXISTS %s", db), + fmt.Sprintf("CREATE DATABASE %s", db), + fmt.Sprintf("CREATE TABLE %s.%s (id INT AUTO_INCREMENT, name VARCHAR(20), PRIMARY KEY (id))", db, table), + } + + // 执行数据库和表的创建命令 + for _, cmd := range commands { + if _, err := conn.Exec(cmd); err != nil { + return fmt.Errorf("failed to execute command '%s': %v", cmd, err) + } + } + + // 插入数据 + for i := 0; i < 10; i++ { + if _, err := conn.Exec(fmt.Sprintf("INSERT INTO %s.%s (name) VALUES (?)", db, table), "nameValue"); err != nil { + return fmt.Errorf("failed to insert data into table %s: %v", table, err) + } + } + + return nil +} + +// CompareQueryRows executes a given query on two different database connections (db1 and db2) +// and compares the results to check if they are identical. It compares both the structure (columns) +// and the content (rows) of the query result sets. +// The function returns nil if the results are identical, or an error if there are any differences +// or issues encountered during the execution or comparison process. +func CompareQueryRows(db1 *sql.DB, db2 *sql.DB, query string) error { + rows1, err := db1.Query(query) + if err != nil { + return err + } + defer rows1.Close() + + rows2, err := db2.Query(query) + if err != nil { + return err + } + defer rows2.Close() + // 检查第一个结果集是否为空 + hasRow1 := rows1.Next() + hasRow2 := rows2.Next() + + // 如果两个结果集都为空,那么它们是相同的 + if !hasRow1 && !hasRow2 { + return nil + } + + // 如果一个结果集为空而另一个不为空,则它们不同 + if hasRow1 != hasRow2 { + return fmt.Errorf("one of the result sets is empty while the other is not") + } + + for { + // 两个结果集都至少有一行数据 + cols1, err := rows1.Columns() + if err != nil { + return err + } + cols2, err := rows2.Columns() + if err != nil { + return err + } + + // 比较列的数量和名称 + if len(cols1) != len(cols2) || !reflect.DeepEqual(cols1, cols2) { + return fmt.Errorf("column mismatch,res1:%+v,res2:%+v", cols1, cols2) + } + + // 创建接收数据的切片 + vals1 := make([]interface{}, len(cols1)) + vals2 := make([]interface{}, len(cols2)) + for i := range cols1 { + vals1[i] = new(sql.RawBytes) + vals2[i] = new(sql.RawBytes) + } + + // 扫描数据 + if err := rows1.Scan(vals1...); err != nil { + return err + } + if err := rows2.Scan(vals2...); err != nil { + return err + } + + // 比较每一列的值 + if !reflect.DeepEqual(vals1, vals2) { + return fmt.Errorf("row values mismatch,sql:%s,vals1:%v ,vals2:%v ", query, vals1, vals2) + } + + // 检查是否还有更多的行 + hasRow1 = rows1.Next() + hasRow2 = rows2.Next() + if hasRow1 != hasRow2 { + return fmt.Errorf("number of rows mismatch") + } + if !hasRow1 { + // 如果没有更多的行,则完成比较 + break + } + } + + return nil +} + +// GetSecondsBehindMaster retrieves the replication delay (in seconds) of a MySQL slave server from its master. +// This function executes the 'SHOW SLAVE STATUS' SQL command and parses the output to find the 'Seconds_Behind_Master' value. +// It returns the number of seconds the slave is behind the master, or an error if the query fails, the value is null, or the field is not found. +func GetSecondsBehindMaster(db *sql.DB) (secondsBehindMaster int, err error) { + rows, err := db.Query(`SHOW SLAVE STATUS`) + if err != nil { + return -1, fmt.Errorf("query slave status error:%v", err) + } + defer rows.Close() + pr := func(t interface{}) (r string) { + r = "\\N" + switch v := t.(type) { + case *sql.NullBool: + if v.Valid { + r = strconv.FormatBool(v.Bool) + } + case *sql.NullString: + if v.Valid { + r = v.String + } + case *sql.NullInt64: + if v.Valid { + r = fmt.Sprintf("%v", v.Int64) + } + case *sql.NullFloat64: + if v.Valid { + r = fmt.Sprintf("%v", v.Float64) + } + case *time.Time: + if v.Year() > 1900 { + r = v.Format("2006-01-02 15:04:05") + } + default: + r = fmt.Sprintf("%#v", t) + } + return + } + c, _ := rows.Columns() + n := len(c) + field := make([]interface{}, 0, n) + for i := 0; i < n; i++ { + field = append(field, new(sql.NullString)) + } + for rows.Next() { + if err := rows.Scan(field...); err != nil { + return -1, err + } + for i := 0; i < n; i++ { + col := pr(field[i]) + if c[i] == "Seconds_Behind_Master" { + if col == "\\N" { + col = "NULL" // 期望的其他值 + return -1, fmt.Errorf("Seconds_Behind_Master is null") + } + delay, err := strconv.Atoi(col) + return delay, err + } + if col == "\\N" { + col = "NULL" // 或者期望的其他值 + } + } + } + return -1, fmt.Errorf("can not find Seconds Behind Master") +} + +// GetRealServerID retrieves the server ID of the MySQL instance connected through the given database connection. +// It executes a query to fetch the server ID and returns it. +// If the query fails, it returns an error with a descriptive message. +func GetRealSeverID(conn *sql.DB) (serverID int, err error) { + query := "SELECT @@server_id" + err = conn.QueryRow(query).Scan(&serverID) + if err != nil { + return serverID, fmt.Errorf("query server ID Error:%v", err) + } + + return serverID, nil +} + +// LockWithReadLock executes a 'FLUSH TABLES WITH READ LOCK' SQL command on the provided database connection. +// This command is used to lock all tables for read operations, which is useful for creating consistent backups +// or synchronizing replication slaves with the master. +// It returns an error if the locking operation fails. +func LockWithReadLock(db *sql.DB) error { + _, err := db.Exec("FLUSH TABLES WITH READ LOCK") + if err != nil { + return fmt.Errorf("failed to lock slave for read: %v", err) + } + return nil +} + +// UnLockReadLock releases any table locks held by the current session on the provided database connection. +// This function is typically used to unlock the tables that were locked using the 'FLUSH TABLES WITH READ LOCK' command. +// It returns an error if the unlocking operation fails. +func UnLockReadLock(db *sql.DB) error { + _, err := db.Exec("UNLOCK TABLES") + if err != nil { + return fmt.Errorf("failed to unlock slave: %v", err) + } + return nil +} + +// CleanUpDatabases removes all non-system databases from the MySQL server. +// This function is intended to be used for cleaning up a database server by +// dropping all user-created databases while preserving the essential system databases. +// System databases like 'information_schema', 'mysql', 'performance_schema', and 'sys' +// are not affected by this operation. +func CleanUpDatabases(db *sql.DB) error { + // 获取非系统数据库列表 + rows, err := db.Query("SHOW DATABASES WHERE `Database` NOT IN ('information_schema', 'mysql', 'performance_schema', 'sys')") + if err != nil { + return fmt.Errorf("error querying non-system databases: %w", err) + } + defer rows.Close() + + var databases []string + for rows.Next() { + var database string + if err := rows.Scan(&database); err != nil { + return fmt.Errorf("error scanning database result: %w", err) + } + databases = append(databases, database) + } + + // 检查是否在获取数据库列表时出错 + if err = rows.Err(); err != nil { + return fmt.Errorf("error after iterating over rows: %w", err) + } + + // 清理非系统数据库 + for _, database := range databases { + _, err := db.Exec(fmt.Sprintf("DROP DATABASE `%s`", database)) + if err != nil { + return fmt.Errorf("error dropping database %s: %w", database, err) + } + } + return nil +} diff --git a/tests/e2e/util/expect.go b/tests/e2e/util/expect.go new file mode 100644 index 00000000..052ab123 --- /dev/null +++ b/tests/e2e/util/expect.go @@ -0,0 +1,60 @@ +// Copyright 2024 The Gaea Authors. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package util + +import ( + "github.com/onsi/gomega" +) + +// ExpectEqual expects the specified two are the same, otherwise an exception raises +func ExpectEqual(actual interface{}, extra interface{}, explain ...interface{}) { + gomega.ExpectWithOffset(1, actual).To(gomega.Equal(extra), explain...) +} + +// ExpectNotEqual expects the specified two are not the same, otherwise an exception raises +func ExpectNotEqual(actual interface{}, extra interface{}, explain ...interface{}) { + gomega.ExpectWithOffset(1, actual).NotTo(gomega.Equal(extra), explain...) +} + +// ExpectError expects an error happens, otherwise an exception raises +func ExpectError(err error, explain ...interface{}) { + gomega.ExpectWithOffset(1, err).To(gomega.HaveOccurred(), explain...) +} + +// ExpectNoError checks if "err" is set, and if so, fails assertion while logging the error. +func ExpectNoError(err error, explain ...interface{}) { + ExpectNoErrorWithOffset(1, err, explain...) +} + +// ExpectNoErrorWithOffset checks if "err" is set, and if so, fails assertion while logging the error at "offset" levels above its caller +// (for example, for call chain f -> g -> ExpectNoErrorWithOffset(1, ...) error would be logged for "f"). +func ExpectNoErrorWithOffset(offset int, err error, explain ...interface{}) { + gomega.ExpectWithOffset(1+offset, err).NotTo(gomega.HaveOccurred(), explain...) +} + +// ExpectConsistOf expects actual contains precisely the extra elements. The ordering of the elements does not matter. +func ExpectConsistOf(actual interface{}, extra interface{}, explain ...interface{}) { + gomega.ExpectWithOffset(1, actual).To(gomega.ConsistOf(extra), explain...) +} + +// ExpectHaveKey expects the actual map has the key in the keyset +func ExpectHaveKey(actual interface{}, key interface{}, explain ...interface{}) { + gomega.ExpectWithOffset(1, actual).To(gomega.HaveKey(key), explain...) +} + +// ExpectEmpty expects actual is empty +func ExpectEmpty(actual interface{}, explain ...interface{}) { + gomega.ExpectWithOffset(1, actual).To(gomega.BeEmpty(), explain...) +} diff --git a/tests/e2e/util/log.go b/tests/e2e/util/log.go new file mode 100644 index 00000000..9a554b76 --- /dev/null +++ b/tests/e2e/util/log.go @@ -0,0 +1,105 @@ +// Copyright 2024 The Gaea Authors. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package util + +import ( + "bufio" + "fmt" + "os" + "regexp" + "strings" + "time" +) + +type LogEntry struct { + Timestamp string + Namespace string + User string + ClientAddr string + BackendAddr string + Database string + ConnectionID int + MySQLConnectionID int + Query string + ResponseTimeMs float64 + InTx bool +} + +// CompareTimeStrings 比较两个时间字符串的大小 +// 返回值为-1,0或1。-1表示time Before time2,0表示time1 = time2,1表示time1 After time2 +func CompareTimeStrings(currentTime string, time2 string) (int, error) { + // 解析时间字符串 + t1, err1 := time.Parse("2006-01-02 15:04:05.999", currentTime) + t2, err2 := time.Parse("2006-01-02 15:04:05.999", time2) + if err1 != nil || err2 != nil { + return 0, fmt.Errorf("解析错误:%v %v", err1, err2) + } + + // 比较时间 + if t1.Before(t2) { + return -1, nil + } + if t1.After(t2) { + return 1, nil + } + return 0, nil +} + +func ParseLogEntries(file *os.File, re *regexp.Regexp, currentTime time.Time, searchString string) ([]LogEntry, error) { + startTime := currentTime.Format("2006-01-02 15:04:05.999") + + scanner := bufio.NewScanner(file) + + var logEntryRes []LogEntry + for scanner.Scan() { + line := scanner.Text() + // 使用正则表达式匹配日志行 + matches := re.FindStringSubmatch(line) + if len(matches) != 13 { + continue + } + // 解析并填充结构体 + logEntry := LogEntry{} + logEntry.Timestamp = matches[1] + // 检查时间是否在startTime之后 + res, err := CompareTimeStrings(startTime, logEntry.Timestamp) + if err != nil { + return []LogEntry{}, nil + } + if res > 0 { + continue + } + fmt.Sscanf(matches[3], "%f", &logEntry.ResponseTimeMs) + logEntry.Namespace = matches[4] + logEntry.User = matches[5] + logEntry.ClientAddr = matches[6] + logEntry.BackendAddr = matches[7] + logEntry.Database = matches[8] + fmt.Sscanf(matches[9], "%d", &logEntry.ConnectionID) + fmt.Sscanf(matches[10], "%d", &logEntry.MySQLConnectionID) + fmt.Sscanf(matches[11], "%t", &logEntry.InTx) + logEntry.Query = matches[12] + + if strings.Compare(searchString, logEntry.Query) != 0 { + continue + } + logEntryRes = append(logEntryRes, logEntry) + } + + if err := scanner.Err(); err != nil { + return logEntryRes, fmt.Errorf("error during file scanning:%v", err) + } + return logEntryRes, nil +} diff --git a/util/array.go b/util/array.go index 6053afa1..860265f6 100644 --- a/util/array.go +++ b/util/array.go @@ -1,3 +1,17 @@ +// Copyright 2024 The Gaea Authors. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + package util func ArrayFindIndex(items []string, findItem string) int { diff --git a/util/bucketpool/bucketpool.go b/util/bucketpool/bucketpool.go index be0ec18a..858afdb3 100644 --- a/util/bucketpool/bucketpool.go +++ b/util/bucketpool/bucketpool.go @@ -1,7 +1,21 @@ +// Copyright 2024 The Gaea Authors. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + package bucketpool import ( - "math" + "math/bits" "sync" ) @@ -53,12 +67,10 @@ func (p *Pool) findPool(size int) *sizedPool { if size > p.maxSize { return nil } - idx := int(math.Ceil(math.Log2(float64(size) / float64(p.minSize)))) - if idx < 0 { - idx = 0 - } - if idx > len(p.pools)-1 { - return nil + div, rem := bits.Div64(0, uint64(size), uint64(p.minSize)) + idx := bits.Len64(div) + if rem == 0 && div != 0 && (div&(div-1)) == 0 { + idx = idx - 1 } return p.pools[idx] } diff --git a/util/bucketpool/bucketpool_test.go b/util/bucketpool/bucketpool_test.go index a7e2cf0e..27f42e59 100644 --- a/util/bucketpool/bucketpool_test.go +++ b/util/bucketpool/bucketpool_test.go @@ -1,3 +1,17 @@ +// Copyright 2024 The Gaea Authors. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + package bucketpool import ( @@ -152,7 +166,7 @@ func TestPoolWeirdMaxSize(t *testing.T) { func TestFuzz(t *testing.T) { maxTestSize := 16384 - for i := 0; i < 20000; i++ { + for i := 0; i < 1000; i++ { minSize := rand.Intn(maxTestSize) maxSize := rand.Intn(maxTestSize-minSize) + minSize p := New(minSize, maxSize) diff --git a/util/cache/lru_cache.go b/util/cache/lru_cache.go index f4645ab4..126f50c8 100644 --- a/util/cache/lru_cache.go +++ b/util/cache/lru_cache.go @@ -64,7 +64,7 @@ func (c CachedString) Size() int { // StringValue alias name of string type StringValue string -// Size return cached string value lenght +// Size return cached string value length func (s StringValue) Size() int { return len(s) } diff --git a/util/crypto/xaes_ecb.go b/util/crypto/xaes_ecb.go index 76c08825..9cc4e0ed 100644 --- a/util/crypto/xaes_ecb.go +++ b/util/crypto/xaes_ecb.go @@ -101,12 +101,12 @@ func (e *ecbEncrypter) BlockSize() (size int) { func (e *ecbEncrypter) cryptBlocks(dst []byte, src []byte) (err error) { if len(src)%e.blockSize != 0 { - err = fmt.Errorf("len(src)[%v] not full blocks, blocksize[%v]", len(src), e.blockSize) + err = fmt.Errorf("encrypter len(src)[%v] not full blocks, blocksize[%v]", len(src), e.blockSize) return } if len(dst) < len(src) { - err = fmt.Errorf("output[%v] is smaller than input[%v]", len(dst), len(src)) + err = fmt.Errorf("encrypter output[%v] is smaller than input[%v]", len(dst), len(src)) return } @@ -137,11 +137,11 @@ func (e *ecbDecrypter) BlockSize() (size int) { func (e *ecbDecrypter) cryptBlocks(dst []byte, src []byte) (err error) { if len(src)%e.blockSize != 0 { - err = fmt.Errorf("len(src)[%v] not full blocks, blocksize[%v]", len(src), e.blockSize) + err = fmt.Errorf("decrypter len(src)[%v] not full blocks, blocksize[%v]", len(src), e.blockSize) return } if len(dst) < len(src) { - err = fmt.Errorf("output[%v] is smaller than input[%v]", len(dst), len(src)) + err = fmt.Errorf("decrypter output[%v] is smaller than input[%v]", len(dst), len(src)) return } diff --git a/util/hack/hack.go b/util/hack/hack.go index a856b58a..8eadeea2 100644 --- a/util/hack/hack.go +++ b/util/hack/hack.go @@ -42,7 +42,7 @@ func Slice(s string) (b []byte) { return } -// IsSQLSep check if sql seperation +// IsSQLSep check if sql separation func IsSQLSep(r rune) bool { return r == ' ' || r == ',' || r == '\t' || r == '/' || diff --git a/util/ip.go b/util/ip.go index 0bf38e0e..0825055c 100644 --- a/util/ip.go +++ b/util/ip.go @@ -18,6 +18,7 @@ import ( "errors" "fmt" "net" + "os" "strings" ) @@ -138,3 +139,39 @@ func HostName(ip string) (hostname string, err error) { } return hostName[0], err } + +// GetLocalDatacenter return local host datacenter +func GetLocalDatacenter() (string, error) { + hostname, err := os.Hostname() + if err != nil { + return "", err + } + return GetHostDatacenter(hostname) +} + +// GetInstanceDatacenter return datacenter parsed from host like "c3-mysql01.bj:3306" or "127.0.0.1:3306" +func GetInstanceDatacenter(addr string) (string, error) { + splits := strings.Split(addr, ":") + if len(splits) != 2 { + return "", fmt.Errorf("get unexpected db host:%s", addr) + } + return GetHostDatacenter(splits[0]) +} + +// GetHostDatacenter return datacenter parsed from host like "c3-mysql01.bj" or "127.0.0.1" +func GetHostDatacenter(host string) (string, error) { + var err error + hostname := host + if ip := net.ParseIP(host); ip != nil { + hostname, err = HostName(host) + if err != nil { + return "", err + } + } + + prefixSplit := strings.Split(hostname, "-") + if len(prefixSplit) < 2 { + return "", fmt.Errorf("get hostname prefix error,hostname:%s", hostname) + } + return prefixSplit[0], nil +} diff --git a/util/ip_test.go b/util/ip_test.go index 56c40f02..0a0a5a7d 100644 --- a/util/ip_test.go +++ b/util/ip_test.go @@ -4,7 +4,7 @@ // not use this file except in compliance with the License. You may obtain // a copy of the License at // -// http://www.apache.org/licenses/LICENSE-2.0 +// http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, WITHOUT @@ -17,6 +17,8 @@ import ( "fmt" "net" "testing" + + "github.com/stretchr/testify/assert" ) func TestParseIP(t *testing.T) { @@ -87,3 +89,115 @@ func TestCreateIPInfoIPNetError2(t *testing.T) { t.FailNow() } } + +func TestGetInstanceDatacenter(t *testing.T) { + testCases := []struct { + name string + addr string + hasErr bool + expectDc string + }{ + { + "test get datacenter success", + "c3-mysql01.bj:3306", + false, + "c3", + }, + { + "test get datacenter format error too much hyphens", + "c3-mysql01.bj-3306", + true, + "", + }, + { + "test get datacenter format error too much dots", + "c3.mysql01.bj.3306", + true, + "", + }, + { + "test get datacenter format error no enough hyphens", + "c3-mysql01.bj-3306", + true, + "", + }, + { + "test get datacenter format error no enough dots", + "c3.mysql01-bj:3306", + false, + "c3.mysql01", + }, + { + "test get datacenter format error no colons", + "c3.mysql01.bj", + true, + "", + }, + } + + for k, tt := range testCases { + t.Run(tt.name, func(t *testing.T) { + dc, err := GetInstanceDatacenter(tt.addr) + t.Logf("Testing Case:%d addr: %s, dc: %v, err: %v", k, tt.addr, dc, err) + if tt.hasErr { + assert.NotNil(t, err) + return + } + assert.Nil(t, err) + assert.Equal(t, tt.expectDc, dc) + }) + } +} + +func TestGetHostDatacenter(t *testing.T) { + testCases := []struct { + name string + host string + hasErr bool + expectDc string + }{ + { + "test get datacenter success", + "c3-mysql01.bj", + false, + "c3", + }, + { + "test get datacenter success local", + "MacBook-Pro-2.local", + false, + "MacBook", + }, + { + "test get datacenter format error too much dots", + "c3.mysql01.bj", + true, + "", + }, + { + "test get datacenter format error no enough dots", + "c3.mysql01-bj", + false, + "c3.mysql01", + }, + { + "test get datacenter format error no colons", + "c3.mysql01.bj", + true, + "", + }, + } + + for k, tt := range testCases { + t.Run(tt.name, func(t *testing.T) { + dc, err := GetHostDatacenter(tt.host) + t.Logf("Testing Case:%d addr: %s, dc: %v, err: %v", k, tt.host, dc, err) + if tt.hasErr { + assert.NotNil(t, err) + return + } + assert.Nil(t, err) + assert.Equal(t, tt.expectDc, dc) + }) + } +} diff --git a/util/math/compare.go b/util/math/compare.go index a0a342e7..9b7c73be 100644 --- a/util/math/compare.go +++ b/util/math/compare.go @@ -1,3 +1,17 @@ +// Copyright 2024 The Gaea Authors. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + package math // MaxInt64 returns the larger of a and b. diff --git a/util/mocks/pipeTest/README.md b/util/mocks/pipeTest/README.md index db4265ec..6abda869 100644 --- a/util/mocks/pipeTest/README.md +++ b/util/mocks/pipeTest/README.md @@ -273,4 +273,3 @@ func TestMariadbConnWithoutDB(t *testing.T) { }) } ``` - diff --git a/util/mocks/pipeTest/pipeTest.go b/util/mocks/pipeTest/pipeTest.go index 59234667..f2a10cea 100644 --- a/util/mocks/pipeTest/pipeTest.go +++ b/util/mocks/pipeTest/pipeTest.go @@ -1,11 +1,26 @@ +// Copyright 2024 The Gaea Authors. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + package pipeTest import ( "bufio" - "github.com/stretchr/testify/require" "net" "sync" "testing" + + "github.com/stretchr/testify/require" ) // ReplyMsgFuncType 回应函数的型态,测试时,当客户端或服务端接收到讯息时,可以利用此函数去建立回传讯息 @@ -13,8 +28,9 @@ type ReplyMsgFuncType func([]uint8) []uint8 // TestReplyMsgFunc ,目前是用于验证测试流程是否正确,在这里会处理常接收到什么讯息,要将下来跟着回应什么讯息 // 每次的回应讯息为接收讯息加 1 -// 比如 当接收值为 1,就会回传值为 2 给对方 -// 比如 当接收值为 2,就会回传值为 3 给对方 +// +// 比如 当接收值为 1,就会回传值为 2 给对方 +// 比如 当接收值为 2,就会回传值为 3 给对方 func TestReplyMsgFunc(data []uint8) []uint8 { return []uint8{data[0] + 1} // 回应讯息为接收讯息加 1 } diff --git a/util/mocks/pipeTest/pipeTest_test.go b/util/mocks/pipeTest/pipeTest_test.go index 44a3acf3..fa0e0430 100644 --- a/util/mocks/pipeTest/pipeTest_test.go +++ b/util/mocks/pipeTest/pipeTest_test.go @@ -1,8 +1,23 @@ +// Copyright 2024 The Gaea Authors. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + package pipeTest import ( - "github.com/stretchr/testify/require" "testing" + + "github.com/stretchr/testify/require" ) // TestPipeTestWorkable 为验证测试 PipeTest 是否能正常运作,以下测试不使用 MariaDB 的服务器,只是单纯的单元测试 diff --git a/util/request_context.go b/util/request_context.go index 594a0274..5c3b2e31 100644 --- a/util/request_context.go +++ b/util/request_context.go @@ -14,44 +14,66 @@ package util -import ( - "sync" -) - -const ( - // StmtType stmt type - StmtType = "stmtType" // SQL类型, 值类型为int (对应parser.Preview()得到的值) - // FromSlave if read from slave - FromSlave = "fromSlave" // 读写分离标识, 值类型为int, false = 0, true = 1 - DefaultSlice = "defaultSlice" // 默认分片标识 string 类型 -) - // RequestContext means request scope context with values -// thread safe +// 旧版 thread safe,因为 context 是顺序执行的,把锁去掉,提升性能,新版本 thread unsafe type RequestContext struct { - lock *sync.RWMutex - ctx map[string]interface{} + tokens []string + stmtType int + fromSlave int + fingerprint string + fingerprintMD5 string + defaultSlice string } // NewRequestContext return request scopre context func NewRequestContext() *RequestContext { - return &RequestContext{ctx: make(map[string]interface{}, 2), lock: new(sync.RWMutex)} + return &RequestContext{} +} + +func (reqCtx *RequestContext) GetStmtType() int { + return reqCtx.stmtType +} + +func (reqCtx *RequestContext) SetStmtType(value int) { + reqCtx.stmtType = value +} + +func (reqCtx *RequestContext) GetTokens() []string { + return reqCtx.tokens +} + +func (reqCtx *RequestContext) SetTokens(value []string) { + reqCtx.tokens = value +} + +func (reqCtx *RequestContext) GetFromSlave() int { + return reqCtx.fromSlave +} + +func (reqCtx *RequestContext) SetFromSlave(value int) { + reqCtx.fromSlave = value +} + +func (reqCtx *RequestContext) GetFingerprint() string { + return reqCtx.fingerprint +} + +func (reqCtx *RequestContext) SetFingerprint(value string) { + reqCtx.fingerprint = value +} + +func (reqCtx *RequestContext) GetFingerprintMD5() string { + return reqCtx.fingerprintMD5 +} + +func (reqCtx *RequestContext) SetFingerprintMD5(value string) { + reqCtx.fingerprintMD5 = value } -// Get return context in RequestContext -func (reqCtx *RequestContext) Get(key string) interface{} { - reqCtx.lock.RLock() - v, ok := reqCtx.ctx[key] - reqCtx.lock.RUnlock() - if ok { - return v - } - return nil +func (reqCtx *RequestContext) GetDefaultSlice() string { + return reqCtx.defaultSlice } -// Set set value with specific key -func (reqCtx *RequestContext) Set(key string, value interface{}) { - reqCtx.lock.Lock() - reqCtx.ctx[key] = value - reqCtx.lock.Unlock() +func (reqCtx *RequestContext) SetDefaultSlice(value string) { + reqCtx.defaultSlice = value } diff --git a/util/resource_pool.go b/util/resource_pool.go index c8b899ba..a8f17af1 100644 --- a/util/resource_pool.go +++ b/util/resource_pool.go @@ -89,9 +89,9 @@ type resourceWrapper struct { // maxCap代表最大资源数量 // 超过设定空闲时间的连接会被丢弃 // 资源池会根据传入的factory进行具体资源的初始化,比如建立与mysql的连接 -func NewResourcePool(factory Factory, capacity, maxCap int, idleTimeout time.Duration) *ResourcePool { +func NewResourcePool(factory Factory, capacity, maxCap int, idleTimeout time.Duration) (*ResourcePool, error) { if capacity <= 0 || maxCap <= 0 || capacity > maxCap { - panic(errors.New("invalid/out of range capacity")) + return nil, fmt.Errorf("invalid/out of range capacity") } rp := &ResourcePool{ resources: make(chan resourceWrapper, maxCap), @@ -105,6 +105,7 @@ func NewResourcePool(factory Factory, capacity, maxCap int, idleTimeout time.Dur scaleInTodo: make(chan int8, 1), Dynamic: true, // 动态扩展连接池 } + for i := 0; i < capacity; i++ { rp.resources <- resourceWrapper{} } @@ -115,7 +116,7 @@ func NewResourcePool(factory Factory, capacity, maxCap int, idleTimeout time.Dur } rp.capTimer = timer.NewTimer(5 * time.Second) rp.capTimer.Start(rp.scaleInResources) - return rp + return rp, nil } // Close empties the pool calling Close on all its resources. @@ -191,34 +192,54 @@ func (rp *ResourcePool) get(ctx context.Context, wait bool) (resource Resource, select { case wrapper, ok = <-rp.resources: default: + var newWrapper resourceWrapper if rp.Dynamic { - rp.scaleOutResources() - } - if !wait { - return nil, nil - } - startTime := time.Now() - select { - case wrapper, ok = <-rp.resources: - case <-ctx.Done(): - return nil, ErrTimeout + newWrapper, ok = rp.scaleOutResources() } - endTime := time.Now() - if int64(startTime.UnixNano()/100000) != int64(endTime.UnixNano()/100000) { - rp.recordWait(startTime) + if ok { + wrapper = newWrapper + } else { + if !wait { + return nil, nil + } + startTime := time.Now() + select { + case wrapper, ok = <-rp.resources: + case <-ctx.Done(): + return nil, ErrTimeout + } + endTime := time.Now() + if startTime.UnixNano()/100000 != endTime.UnixNano()/100000 { + rp.recordWait(startTime) + } } } if !ok { return nil, ErrClosed } - // Unwrap if wrapper.resource == nil { - wrapper.resource, err = rp.factory() // 实际建立连接 - if err != nil { + errChan := make(chan error) + go func() { + wrapper.resource, err = rp.factory() + if err != nil { + errChan <- err + return + } + errChan <- nil + }() + + select { + case <-ctx.Done(): rp.resources <- resourceWrapper{} - return nil, err + return nil, ctx.Err() + case err1 := <-errChan: + if err1 != nil { + rp.resources <- resourceWrapper{} + return nil, err1 + } } + rp.active.Add(1) } rp.available.Add(-1) @@ -304,13 +325,26 @@ func (rp *ResourcePool) ScaleCapacity(capacity int) error { } // 扩容 -func (rp *ResourcePool) scaleOutResources() { +func (rp *ResourcePool) scaleOutResources() (resourceWrapper, bool) { rp.lock.Lock() defer rp.lock.Unlock() if rp.capacity.Get() < rp.maxCapacity.Get() { - rp.ScaleCapacity(int(rp.capacity.Get()) + 1) + wrapper, ok := rp.AddCapacityResource() rp.scaleOutTime = time.Now().Unix() + return wrapper, ok } + return resourceWrapper{}, false +} + +// 扩容并获取连接, 外层加锁了,所以这边不加锁 +func (rp *ResourcePool) AddCapacityResource() (resourceWrapper, bool) { + capacity := int(rp.capacity.Get()) + if capacity < 0 || capacity >= int(rp.maxCapacity.Get()) { + return resourceWrapper{}, false + } + rp.capacity.Add(1) + rp.available.Add(1) + return resourceWrapper{}, true } // 缩容 diff --git a/util/resource_pool_test.go b/util/resource_pool_test.go index 1df612f6..b53e1a5b 100644 --- a/util/resource_pool_test.go +++ b/util/resource_pool_test.go @@ -19,6 +19,8 @@ package util import ( "context" "errors" + "github.com/stretchr/testify/assert" + "sync" "testing" "time" @@ -57,7 +59,8 @@ func TestOpen(t *testing.T) { ctx := context.Background() lastID.Set(0) count.Set(0) - p := NewResourcePool(PoolFactory, 6, 6, time.Second) + p, _ := NewResourcePool(PoolFactory, 6, 6, time.Second) + // TODO: Test dynamic pool p.SetDynamic(false) p.ScaleCapacity(5) var resources [10]Resource @@ -78,11 +81,15 @@ func TestOpen(t *testing.T) { if p.WaitTime() != 0 { t.Errorf("expecting 0, received %d", p.WaitTime()) } + + // Since all connection will be connected at start and `PoolFactory` has been called 6 times if lastID.Get() != int64(i+1) { - t.Errorf("Expecting %d, received %d", i+1, lastID.Get()) + t.Errorf("Expecting %d, received %d", 6, lastID.Get()) } + + // All connection will be connected at start, so the count is current capacity = 6 -1 = 5 if count.Get() != int64(i+1) { - t.Errorf("Expecting %d, received %d", i+1, count.Get()) + t.Errorf("Expecting %d, received %d", 5, count.Get()) } } @@ -140,6 +147,7 @@ func TestOpen(t *testing.T) { if count.Get() != 5 { t.Errorf("Expecting 5, received %d", count.Get()) } + // the last values is 6 and since close resource at line 129 then call p.Get() 5 times, and one of five need connect if lastID.Get() != 6 { t.Errorf("Expecting 6, received %d", lastID.Get()) } @@ -199,7 +207,7 @@ func TestOpenDynamic(t *testing.T) { ctx := context.Background() lastID.Set(0) count.Set(0) - p := NewResourcePool(PoolFactory, 6, 10, time.Second) + p, _ := NewResourcePool(PoolFactory, 6, 10, time.Second) p.ScaleCapacity(5) p.SetDynamic(true) var resources [10]Resource @@ -227,6 +235,7 @@ func TestOpenDynamic(t *testing.T) { if p.WaitTime() != 0 { t.Errorf("expecting 0, received %d", p.WaitTime()) } + if lastID.Get() != int64(i+1) { t.Errorf("Expecting %d, received %d", i+1, lastID.Get()) } @@ -263,7 +272,7 @@ func TestOpenDynamic(t *testing.T) { t.Errorf("Expecting non-zero") } if lastID.Get() != 10 { - t.Errorf("Expecting 10, received %d", lastID.Get()) + t.Errorf("Expecting 11, received %d", lastID.Get()) } // Test Close resource @@ -298,7 +307,7 @@ func TestShrinking(t *testing.T) { ctx := context.Background() lastID.Set(0) count.Set(0) - p := NewResourcePool(PoolFactory, 5, 5, time.Second) + p, _ := NewResourcePool(PoolFactory, 5, 5, time.Second) p.SetDynamic(false) var resources [10]Resource // Leave one empty slot in the pool @@ -438,7 +447,7 @@ func TestClosing(t *testing.T) { ctx := context.Background() lastID.Set(0) count.Set(0) - p := NewResourcePool(PoolFactory, 5, 5, time.Second) + p, _ := NewResourcePool(PoolFactory, 5, 5, time.Second) p.SetDynamic(false) var resources [10]Resource for i := 0; i < 5; i++ { @@ -493,7 +502,7 @@ func TestIdleTimeout(t *testing.T) { ctx := context.Background() lastID.Set(0) count.Set(0) - p := NewResourcePool(PoolFactory, 1, 1, 10*time.Millisecond) + p, _ := NewResourcePool(PoolFactory, 1, 1, 10*time.Millisecond) p.SetDynamic(false) defer p.Close() @@ -517,7 +526,7 @@ func TestIdleTimeout(t *testing.T) { if p.IdleClosed() != 0 { t.Errorf("Expecting 0, received %d", p.IdleClosed()) } - time.Sleep(20 * time.Millisecond) + time.Sleep(50 * time.Millisecond) if count.Get() != 0 { t.Errorf("Expecting 0, received %d", count.Get()) @@ -599,7 +608,7 @@ func TestCreateFail(t *testing.T) { ctx := context.Background() lastID.Set(0) count.Set(0) - p := NewResourcePool(FailFactory, 5, 5, time.Second) + p, _ := NewResourcePool(FailFactory, 5, 5, time.Second) p.SetDynamic(false) defer p.Close() if _, err := p.Get(ctx); err.Error() != "Failed" { @@ -616,7 +625,7 @@ func TestSlowCreateFail(t *testing.T) { ctx := context.Background() lastID.Set(0) count.Set(0) - p := NewResourcePool(SlowFailFactory, 2, 2, time.Second) + p, _ := NewResourcePool(SlowFailFactory, 2, 2, time.Second) p.SetDynamic(false) defer p.Close() ch := make(chan bool) @@ -639,7 +648,7 @@ func TestTimeout(t *testing.T) { ctx := context.Background() lastID.Set(0) count.Set(0) - p := NewResourcePool(PoolFactory, 1, 1, time.Second) + p, _ := NewResourcePool(PoolFactory, 1, 1, time.Second) p.SetDynamic(false) defer p.Close() r, err := p.Get(ctx) @@ -659,7 +668,7 @@ func TestTimeout(t *testing.T) { func TestExpired(t *testing.T) { lastID.Set(0) count.Set(0) - p := NewResourcePool(PoolFactory, 1, 1, time.Second) + p, _ := NewResourcePool(PoolFactory, 1, 1, time.Second) p.SetDynamic(false) defer p.Close() ctx, cancel := context.WithDeadline(context.Background(), time.Now().Add(-1*time.Second)) @@ -673,3 +682,29 @@ func TestExpired(t *testing.T) { t.Errorf("got %v, want %s", err, want) } } + +func TestScaleOutResource(t *testing.T) { + factory := func() (Resource, error) { + time.Sleep(10 * time.Millisecond) + return nil, nil + } + p, _ := NewResourcePool(factory, 1, 1000, time.Second*3600) + var wg sync.WaitGroup + wg.Add(1000) + var errTimeoutCount sync2.AtomicInt64 + for i := 0; i < 1000; i++ { + go func() { + defer wg.Done() + ctx, _ := context.WithTimeout(context.Background(), 2*time.Second) + _, err := p.Get(ctx) + if err != nil && err.Error() == "resource pool timed out" { + errTimeoutCount.Add(1) + } + }() + } + wg.Wait() + assert.Equal(t, 1000, int(p.capacity.Get())) + assert.Equal(t, 0, int(errTimeoutCount.Get())) + t.Logf("capacity is %d", p.capacity.Get()) + t.Logf("err timeout count is %d", errTimeoutCount.Get()) +} diff --git a/util/string.go b/util/string.go index 604117b7..083b41d1 100644 --- a/util/string.go +++ b/util/string.go @@ -1,4 +1,4 @@ -// Copyright 2019 The Gaea Authors. All Rights Reserved. +// Copyright 2024 The Gaea Authors. All Rights Reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -14,12 +14,25 @@ package util -import "bytes" +import "strings" -func Concat(strings ...string) string { - var buffer bytes.Buffer - for _, s := range strings { - buffer.WriteString(s) +func LowerEqual(src string, dest string) bool { + if len(src) != len(dest) { + return false } - return buffer.String() + return strings.ToLower(src) == dest +} + +func UpperEqual(src string, dest string) bool { + if len(src) != len(dest) { + return false + } + return strings.ToUpper(src) == dest +} + +func HasUpperPrefix(src string, dest string) bool { + if len(src) < len(dest) { + return false + } + return strings.ToUpper(src[0:len(dest)]) == dest } diff --git a/util/string_test.go b/util/string_test.go new file mode 100644 index 00000000..c8175c4a --- /dev/null +++ b/util/string_test.go @@ -0,0 +1,86 @@ +// Copyright 2024 The Gaea Authors. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package util + +import "testing" + +// TestLowerEqual tests the LowerEqual function +func TestLowerEqual(t *testing.T) { + testCases := []struct { + name string + src string + dest string + expect bool + }{ + {"equal_case_sensitive", "hello", "hello", true}, + {"not_equal_length", "hello", "helloo", false}, + {"not_equal_content", "hello", "world", false}, + } + + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + result := LowerEqual(tc.src, tc.dest) + if result != tc.expect { + t.Errorf("Expected %v but got %v for src=%s and dest=%s", tc.expect, result, tc.src, tc.dest) + } + }) + } +} + +// TestUpperEqual tests the UpperEqual function +func TestUpperEqual(t *testing.T) { + testCases := []struct { + name string + src string + dest string + expect bool + }{ + {"equal_case_sensitive", "HELLO", "HELLO", true}, + {"not_equal_length", "HELLO", "HELLOO", false}, + {"not_equal_content", "HELLO", "WORLD", false}, + } + + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + result := UpperEqual(tc.src, tc.dest) + if result != tc.expect { + t.Errorf("Expected %v but got %v for src=%s and dest=%s", tc.expect, result, tc.src, tc.dest) + } + }) + } +} + +// TestHasUpperPrefix tests the HasUpperPrefix function +func TestHasUpperPrefix(t *testing.T) { + testCases := []struct { + name string + src string + dest string + expect bool + }{ + {"prefix_match", "HelloWorld", "HELLO", true}, + {"prefix_mismatch", "HelloWorld", "GOD", false}, + {"shorter_source", "Hello", "HELLO", true}, + } + + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + result := HasUpperPrefix(tc.src, tc.dest) + if result != tc.expect { + t.Errorf("Expected %v but got %v for src=%s and dest=%s", tc.expect, result, tc.src, tc.dest) + } + }) + } +} diff --git a/util/testleak/fake.go b/util/testleak/fake.go index 5d4ad573..c48864a6 100644 --- a/util/testleak/fake.go +++ b/util/testleak/fake.go @@ -10,6 +10,7 @@ // 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. +//go:build !leak // +build !leak package testleak diff --git a/util/testleak/leaktest.go b/util/testleak/leaktest.go index 21dccbc0..91aad937 100644 --- a/util/testleak/leaktest.go +++ b/util/testleak/leaktest.go @@ -14,6 +14,7 @@ // 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. +//go:build leak // +build leak package testleak diff --git a/util/time_wheel.go b/util/time_wheel.go index 24aea7be..3ee75ad6 100644 --- a/util/time_wheel.go +++ b/util/time_wheel.go @@ -27,6 +27,11 @@ type Task struct { callback func() } +type PipeLineItem struct { + value interface{} + key string +} + // TimeWheel means time wheel type TimeWheel struct { tick time.Duration @@ -37,10 +42,7 @@ type TimeWheel struct { bucketIndexes map[interface{}]int // key: added item, value: bucket position currentIndex int - - addC chan *Task - removeC chan interface{} - stopC chan struct{} + pipelineC chan PipeLineItem } // NewTimeWheel create new time wheel @@ -58,9 +60,7 @@ func NewTimeWheel(tick time.Duration, bucketsNum int) (*TimeWheel, error) { bucketIndexes: make(map[interface{}]int, 1024), buckets: make([]map[interface{}]*Task, bucketsNum), currentIndex: 0, - addC: make(chan *Task, 1024), - removeC: make(chan interface{}, 1024), - stopC: make(chan struct{}), + pipelineC: make(chan PipeLineItem, 4096), } for i := 0; i < bucketsNum; i++ { @@ -72,29 +72,42 @@ func NewTimeWheel(tick time.Duration, bucketsNum int) (*TimeWheel, error) { // Start start the time wheel func (tw *TimeWheel) Start() { - tw.ticker = time.NewTicker(tw.tick) go tw.start() } +// 此处旧版本连接数大的时候资源占用比较多 func (tw *TimeWheel) start() { for { - select { - case <-tw.ticker.C: - tw.handleTick() - case task := <-tw.addC: - tw.add(task) - case key := <-tw.removeC: - tw.remove(key) - case <-tw.stopC: - tw.ticker.Stop() - return + time.Sleep(tw.tick) + count := 0 + // 取不到数据或者处理 count 超过 16 * 1024 退出 + for count >= 0 && count < 16*1024 { + select { + case item := <-tw.pipelineC: + count++ + // 为了保证获取的顺序,用统一的 pipeline 获取,select 不同的管道不能保证顺序 + switch item.key { + case "add": + tw.add(item.value.(*Task)) + case "del": + tw.remove(item.value) + case "stop": + return + } + default: + count = -1 + } } + tw.handleTick() } } // Stop stop the time wheel func (tw *TimeWheel) Stop() { - tw.stopC <- struct{}{} + tw.pipelineC <- PipeLineItem{ + key: "stop", + value: nil, + } } func (tw *TimeWheel) handleTick() { @@ -116,11 +129,20 @@ func (tw *TimeWheel) handleTick() { } // Add add an item into time wheel +// 每执行一个 sql 就需要执行一次这个方法,旧版本管道只有 1024,高并发情况下会存在资源抢占和阻塞 +// 为了提高性能,降低 session timeout 的精确度 func (tw *TimeWheel) Add(delay time.Duration, key interface{}, callback func()) error { if delay <= 0 || key == nil { return errors.New("invalid params") } - tw.addC <- &Task{delay: delay, key: key, callback: callback} + // 高并发情况下可能阻塞 + select { + case tw.pipelineC <- PipeLineItem{ + key: "add", + value: &Task{delay: delay, key: key, callback: callback}, + }: + default: + } return nil } @@ -154,7 +176,11 @@ func (tw *TimeWheel) Remove(key interface{}) error { if key == nil { return errors.New("invalid params") } - tw.removeC <- key + //tw.removeC <- key + tw.pipelineC <- PipeLineItem{ + key: "del", + value: key, + } return nil } diff --git a/util/time_wheel_test.go b/util/time_wheel_test.go index b59a73d8..ffdefad7 100644 --- a/util/time_wheel_test.go +++ b/util/time_wheel_test.go @@ -109,6 +109,22 @@ func TestRemove(t *testing.T) { tw.Stop() } +func TestRemoveMulti(t *testing.T) { + a := &A{a: 0, b: "test"} + tw := newTimeWheel() + for i := 0; i < 10; i++ { + err := tw.Add(time.Second*1, a, a.callback) + assert.NoError(t, err) + } + for i := 0; i < 10; i++ { + err := tw.Remove(a) + assert.NoError(t, err) + } + time.Sleep(time.Second * 2) + assert.Equal(t, int32(0), a.getCallbackValue()) + tw.Stop() +} + func BenchmarkAdd(b *testing.B) { a := &A{} tw := newTimeWheel() diff --git a/util/timer/randticker_flaky_test.go b/util/timer/randticker_flaky_test.go index 0ad8bd26..541bee6d 100644 --- a/util/timer/randticker_flaky_test.go +++ b/util/timer/randticker_flaky_test.go @@ -27,6 +27,9 @@ const ( ) func TestTick(t *testing.T) { + if testing.Short() { + t.Skip("Skip TestTick in short mode") + } tkr := NewRandTicker(testDuration, testVariance) for i := 0; i < 5; i++ { start := time.Now() @@ -45,6 +48,9 @@ func TestTick(t *testing.T) { } func TestTickSkip(t *testing.T) { + if testing.Short() { + t.Skip("Skip TestTickSkip in short mode") + } tkr := NewRandTicker(10*time.Millisecond, 1*time.Millisecond) time.Sleep(35 * time.Millisecond) end := <-tkr.C diff --git a/util/timer/timer_flaky_test.go b/util/timer/timer_flaky_test.go index 26c5fbbc..4e5ae952 100644 --- a/util/timer/timer_flaky_test.go +++ b/util/timer/timer_flaky_test.go @@ -35,6 +35,9 @@ func f() { } func TestWait(t *testing.T) { + if testing.Short() { + t.Skip("Skip TestWait in short mode") + } atomic.StoreInt32(&numcalls, 0) timer := NewTimer(quarter) timer.Start(f) @@ -54,6 +57,9 @@ func TestWait(t *testing.T) { } func TestReset(t *testing.T) { + if testing.Short() { + t.Skip("Skip TestWait in short mode") + } atomic.StoreInt32(&numcalls, 0) timer := NewTimer(half) timer.Start(f) @@ -70,6 +76,9 @@ func TestReset(t *testing.T) { } func TestIndefinite(t *testing.T) { + if testing.Short() { + t.Skip("Skip TestIndefinite in short mode") + } atomic.StoreInt32(&numcalls, 0) timer := NewTimer(0) timer.Start(f) diff --git a/util/version.go b/util/version.go new file mode 100644 index 00000000..f6656db3 --- /dev/null +++ b/util/version.go @@ -0,0 +1,86 @@ +package util + +import ( + "github.com/XiaoMi/Gaea/mysql" + "github.com/hashicorp/go-version" + "strings" +) + +const ( + LessThanMySQLVersion80 = "< 8.0" + LessThanMySQLVersion803 = "< 8.0.3" +) + +type VersionCompareStatus struct { + LessThanMySQLVersion80 bool + LessThanMySQLVersion803 bool +} + +func NewVersionCompareStatus(version string) *VersionCompareStatus { + v := &VersionCompareStatus{} + return v.SetVersion(version) +} + +// 用于需保留版本状态时 +func (v *VersionCompareStatus) SetVersion(srcVersion string) *VersionCompareStatus { + if strings.HasSuffix(srcVersion, "-gaea") { + srcVersion = srcVersion[:len(srcVersion)-5] + } else { + srcVersion = strings.Split(srcVersion, "-")[0] + } + src, err := version.NewVersion(srcVersion) + if err != nil { + return v + } + for _, compareVersion := range []string{LessThanMySQLVersion80, LessThanMySQLVersion803} { + constraints, err := version.NewConstraint(compareVersion) + if err != nil || !constraints.Check(src) { + continue + } + switch compareVersion { + case LessThanMySQLVersion80: + v.LessThanMySQLVersion80 = true + case LessThanMySQLVersion803: + v.LessThanMySQLVersion803 = true + } + } + return v +} + +// CompactServerVersion CompactVersion get compact version from origin string +func CompactServerVersion(sv string) string { + version := strings.Trim(sv, " ") + if version != "" { + v := strings.Split(sv, ".") + if len(v) < 3 { + return mysql.ServerVersion + } + return version + } else { + return mysql.ServerVersion + } +} + +// CheckMySQLVersion check if curVersion satisfies constraintVersion, which should be format like ">= 5.7, < 8.0" +func CheckMySQLVersion(curVersion string, constraintVersion string) bool { + if strings.HasSuffix(curVersion, "-gaea") { + curVersion = curVersion[:len(curVersion)-5] + } else { + curVersion = strings.Split(curVersion, "-")[0] + } + + cur, err := version.NewVersion(curVersion) + if err != nil { + return false + } + + constraints, err := version.NewConstraint(constraintVersion) + if err != nil { + return false + } + + if constraints.Check(cur) { + return true + } + return false +} diff --git a/util/version_test.go b/util/version_test.go new file mode 100644 index 00000000..a2f78a35 --- /dev/null +++ b/util/version_test.go @@ -0,0 +1,83 @@ +package util + +import ( + "github.com/XiaoMi/Gaea/mysql" + "github.com/stretchr/testify/assert" + "testing" +) + +func TestCompactServerVersion(t *testing.T) { + type tCase struct { + oVersion string + dVersion string + } + + tts := []tCase{ + { + "", + mysql.ServerVersion, + }, + { + "5.7-gaea", + mysql.ServerVersion, + }, + { + "5.7.11-gaea", + "5.7.11-gaea", + }, + { + "5.7.11", + "5.7.11", + }, + { + "8.0.0-gaea", + "8.0.0-gaea", + }, + } + for _, tt := range tts { + assert.Equal(t, CompactServerVersion(tt.oVersion), tt.dVersion) + } +} + +func TestCheckMySQLVersion(t *testing.T) { + type tCase struct { + version string + lessThan string + isTrue bool + } + + tts := []tCase{{ + "5.7.20-gaea", + "< 5.7.25", + true, + }, + { + "5.7.20-gaea", + ">= 5.7.10", + true, + }, + { + "5.7.11-gaea", + "< 5.7.25", + true, + }, + { + "5.6.20-gaea", + "< 5.7.25", + true, + }, + { + "5.6.20-gaea", + "< 8.0.0", + true, + }, + { + "5.6.20", + "< 8.0.0", + true, + }, + } + for _, tt := range tts { + assert.Equal(t, CheckMySQLVersion(tt.version, tt.lessThan), tt.isTrue) + } +}