From d28f469de80564ada74a25483d68fc272ce7b0bf Mon Sep 17 00:00:00 2001 From: Ti Chi Robot Date: Thu, 15 Jul 2021 14:33:34 +0800 Subject: [PATCH] dump: always split TiDB v3.* tables through tidb rowid to save TiDB's memory (#301) (#306) --- go.mod | 3 +- go.sum | 7 - v4/export/config.go | 5 +- v4/export/dump.go | 120 ++++- v4/export/prepare.go | 14 + v4/export/region_results.csv | 990 ++++++++++++++++++++++++++++++++++ v4/export/sql.go | 215 +++++++- v4/export/sql_test.go | 349 +++++++++++- v4/export/writer_util_test.go | 2 +- 9 files changed, 1663 insertions(+), 42 deletions(-) create mode 100644 v4/export/region_results.csv diff --git a/go.mod b/go.mod index 69925831..1c4a859c 100644 --- a/go.mod +++ b/go.mod @@ -24,7 +24,8 @@ require ( github.com/pingcap/errors v0.11.5-0.20201126102027-b0a155152ca3 github.com/pingcap/failpoint v0.0.0-20210316064728-7acb0f0a3dfd github.com/pingcap/log v0.0.0-20210317133921-96f4fcab92a4 - github.com/pingcap/tidb v1.1.0-beta.0.20210715025933-fb96fe79e72a // indirect + github.com/pingcap/parser v0.0.0-20210421190550-451a84cf120a + github.com/pingcap/tidb v1.1.0-beta.0.20210715025933-fb96fe79e72a github.com/pingcap/tidb-tools v4.0.9-0.20201127090955-2707c97b3853+incompatible github.com/prometheus/client_golang v1.5.1 github.com/prometheus/client_model v0.2.0 diff --git a/go.sum b/go.sum index 0fe6313e..4d6fa75a 100644 --- a/go.sum +++ b/go.sum @@ -91,9 +91,7 @@ github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE github.com/codahale/hdrhistogram v0.9.0 h1:9GjrtRI+mLEFPtTfR/AZhcxp+Ii8NZYWq5104FbZQY0= github.com/codahale/hdrhistogram v0.9.0/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI= github.com/colinmarc/hdfs/v2 v2.1.1/go.mod h1:M3x+k8UKKmxtFu++uAZ0OtDU8jR3jnaZIAc6yK4Ue0c= -github.com/coreos/bbolt v1.3.2 h1:wZwiHHUieZCquLkDL0B8UhzreNWsPHooDAG3q34zk0s= github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= -github.com/coreos/etcd v3.3.10+incompatible h1:jFneRYjIvLMLhDLCzuTuU4rSJUjRplcJQ7pD7MnhC04= github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/coreos/go-semver v0.3.0 h1:wkHLiw0WNATZnSG7epLsujiMCgPAc9xhjJ4tgnAxmfM= @@ -152,7 +150,6 @@ github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMo github.com/fsouza/fake-gcs-server v1.17.0/go.mod h1:D1rTE4YCyHFNa99oyJJ5HyclvN/0uQR+pM/VdlL83bw= github.com/fsouza/fake-gcs-server v1.19.0 h1:XyaGOlqo+R5sjT03x2ymk0xepaQlgwhRLTT2IopW0zA= github.com/fsouza/fake-gcs-server v1.19.0/go.mod h1:JtXHY/QzHhtyIxsNfIuQ+XgHtRb5B/w8nqbL5O8zqo0= -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/go.mod h1:fGBJBCdt6qCZuCAOwWuFhBB4OOq9EFqlo5dEaFhhu5w= github.com/gin-contrib/sse v0.0.0-20170109093832-22d885f9ecc7/go.mod h1:VJ0WA2NBN22VlZ2dKZQPAPnyWw5XTlK1KymzLKsr59s= @@ -385,11 +382,9 @@ github.com/oleiade/reflections v1.0.0/go.mod h1:RbATFBbKYkVdqmSFtx13Bb/tVhR0lgOB github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= github.com/olekukonko/tablewriter v0.0.4/go.mod h1:zq6QwlOf5SlnkVbMSr5EoBv3636FWnp+qbPhuoO21uA= github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.7.0 h1:WSHQ+IS43OoUrWtD1/bbclrwK8TTH5hzp+umCiuxHgs= github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.11.0 h1:JAKSXpt1YjtLA7YpPiqO9ss6sNXEsPfSGdwN0UHqzrw= github.com/onsi/ginkgo v1.11.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/gomega v1.4.3 h1:RE1xgDvH7imwFD45h+u2SgIfERHlS2yNG4DObb5BSKU= github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.8.1 h1:C5Dqfs/LeauYDX0jJXIe2SWmwCbGzx9yF8C8xy3Lh34= github.com/onsi/gomega v1.8.1/go.mod h1:Ho0h+IUsWyvy1OpqCwxlQ/21gkhVunqlU8fDGcoTdcA= @@ -562,11 +557,9 @@ github.com/uber/jaeger-lib v2.4.0+incompatible h1:fY7QsGQWiCt8pajv4r7JEvmATdCVaW github.com/uber/jaeger-lib v2.4.0+incompatible/go.mod h1:ComeNDZlWwrWnDv8aPp0Ba6+uUTzImX/AauajbLI56U= github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= github.com/ugorji/go v1.1.5-pre/go.mod h1:FwP/aQVg39TXzItUBMwnWp9T9gPQnXw4Poh4/oBQZ/0= -github.com/ugorji/go v1.1.7 h1:/68gy2h+1mWMrwZFeD1kQialdSzAb432dtpeJ42ovdo= github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= github.com/ugorji/go/codec v0.0.0-20181022190402-e5e69e061d4f/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= github.com/ugorji/go/codec v1.1.5-pre/go.mod h1:tULtS6Gy1AE1yCENaw4Vb//HLH5njI2tfCQDUqRd8fI= -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/unrolled/render v1.0.1/go.mod h1:gN9T0NhL4Bfbwu8ann7Ry/TGHYfosul+J0obPf6NBdM= github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= diff --git a/v4/export/config.go b/v4/export/config.go index fbf6975b..2f5ebc02 100644 --- a/v4/export/config.go +++ b/v4/export/config.go @@ -550,8 +550,9 @@ const ( ) var ( - gcSafePointVersion = semver.New("4.0.0") - tableSampleVersion = semver.New("5.0.0-nightly") + decodeRegionVersion = semver.New("3.0.0") + gcSafePointVersion = semver.New("4.0.0") + tableSampleVersion = semver.New("5.0.0-nightly") ) // ServerInfo is the combination of ServerType and ServerInfo diff --git a/v4/export/dump.go b/v4/export/dump.go index 947f1878..39fb4e33 100755 --- a/v4/export/dump.go +++ b/v4/export/dump.go @@ -6,8 +6,11 @@ import ( "bytes" "context" "database/sql" + "encoding/hex" "fmt" "math/big" + "sort" + "strconv" "strings" "time" @@ -22,11 +25,16 @@ import ( "github.com/pingcap/errors" "github.com/pingcap/failpoint" pclog "github.com/pingcap/log" + "github.com/pingcap/tidb/store/helper" + "github.com/pingcap/tidb/tablecodec" + "github.com/pingcap/tidb/util/codec" pd "github.com/tikv/pd/client" "go.uber.org/zap" "golang.org/x/sync/errgroup" ) +var openDBFunc = sql.Open + // Dumper is the dump progress structure type Dumper struct { tctx *tcontext.Context @@ -36,16 +44,18 @@ type Dumper struct { extStore storage.ExternalStorage dbHandle *sql.DB - tidbPDClientForGC pd.Client + tidbPDClientForGC pd.Client + selectTiDBTableRegionFunc func(tctx *tcontext.Context, conn *sql.Conn, dbName, tableName string) (pkFields []string, pkVals [][]string, err error) } // NewDumper returns a new Dumper func NewDumper(ctx context.Context, conf *Config) (*Dumper, error) { tctx, cancelFn := tcontext.Background().WithContext(ctx).WithCancel() d := &Dumper{ - tctx: tctx, - conf: conf, - cancelCtx: cancelFn, + tctx: tctx, + conf: conf, + cancelCtx: cancelFn, + selectTiDBTableRegionFunc: selectTiDBTableRegion, } err := adjustConfig(conf, registerTLSConfig, @@ -139,6 +149,9 @@ func (d *Dumper) Dump() (dumpErr error) { return err } } + if err = d.renewSelectTableRegionFuncForLowerTiDB(tctx); err != nil { + tctx.L().Error("fail to update select table region info for TiDB", zap.Error(err)) + } rebuildConn := func(conn *sql.Conn) (*sql.Conn, error) { // make sure that the lock connection is still alive @@ -214,8 +227,7 @@ func (d *Dumper) Dump() (dumpErr error) { }) // get estimate total count - err = d.getEstimateTotalRowsCount(tctx, metaConn) - if err != nil { + if err = d.getEstimateTotalRowsCount(tctx, metaConn); err != nil { tctx.L().Error("fail to get estimate total count", zap.Error(err)) } @@ -442,7 +454,7 @@ func (d *Dumper) concurrentDumpTable(tctx *tcontext.Context, conn *sql.Conn, met if conf.ServerInfo.ServerType == ServerTypeTiDB && conf.ServerInfo.ServerVersion != nil && (conf.ServerInfo.ServerVersion.Compare(*tableSampleVersion) >= 0 || - (conf.ServerInfo.HasTiKV && conf.ServerInfo.ServerVersion.Compare(*gcSafePointVersion) >= 0)) { + (conf.ServerInfo.HasTiKV && conf.ServerInfo.ServerVersion.Compare(*decodeRegionVersion) >= 0)) { return d.concurrentDumpTiDBTables(tctx, conn, meta, taskChan) } field, err := pickupPossibleField(db, tbl, conn, conf) @@ -578,18 +590,22 @@ func (d *Dumper) concurrentDumpTiDBTables(tctx *tcontext.Context, conn *sql.Conn handleVals [][]string err error ) + // for TiDB v5.0+, we can use table sample directly if d.conf.ServerInfo.ServerVersion.Compare(*tableSampleVersion) >= 0 { tctx.L().Debug("dumping TiDB tables with TABLESAMPLE", zap.String("database", db), zap.String("table", tbl)) handleColNames, handleVals, err = selectTiDBTableSample(tctx, conn, db, tbl) } else { + // for TiDB v3.0+, we can use table region decode in TiDB directly tctx.L().Debug("dumping TiDB tables with TABLE REGIONS", zap.String("database", db), zap.String("table", tbl)) var partitions []string - partitions, err = GetPartitionNames(conn, db, tbl) + if d.conf.ServerInfo.ServerVersion.Compare(*gcSafePointVersion) >= 0 { + partitions, err = GetPartitionNames(conn, db, tbl) + } if err == nil { if len(partitions) == 0 { - handleColNames, handleVals, err = selectTiDBTableRegion(tctx, conn, db, tbl) + handleColNames, handleVals, err = d.selectTiDBTableRegionFunc(tctx, conn, db, tbl) } else { return d.concurrentDumpTiDBPartitionTables(tctx, conn, meta, taskChan, partitions) } @@ -1153,3 +1169,89 @@ func setSessionParam(d *Dumper) error { } return nil } + +func (d *Dumper) renewSelectTableRegionFuncForLowerTiDB(tctx *tcontext.Context) error { + conf := d.conf + if !(conf.ServerInfo.ServerType == ServerTypeTiDB && conf.ServerInfo.ServerVersion != nil && conf.ServerInfo.HasTiKV && + conf.ServerInfo.ServerVersion.Compare(*decodeRegionVersion) >= 0 && + conf.ServerInfo.ServerVersion.Compare(*gcSafePointVersion) < 0) { + tctx.L().Debug("no need to build region info because database is not TiDB 3.x") + return nil + } + dbHandle, err := openDBFunc("mysql", conf.GetDSN("")) + if err != nil { + return errors.Trace(err) + } + defer dbHandle.Close() + conn, err := dbHandle.Conn(tctx) + if err != nil { + return errors.Trace(err) + } + defer conn.Close() + dbInfos, err := GetDBInfo(conn, DatabaseTablesToMap(conf.Tables)) + if err != nil { + return errors.Trace(err) + } + regionsInfo, err := GetRegionInfos(conn) + if err != nil { + return errors.Trace(err) + } + tikvHelper := &helper.Helper{} + tableInfos := tikvHelper.GetRegionsTableInfo(regionsInfo, dbInfos) + + tableInfoMap := make(map[string]map[string][]int64, len(conf.Tables)) + for _, region := range regionsInfo.Regions { + tableList := tableInfos[region.ID] + for _, table := range tableList { + db, tbl := table.DB.Name.O, table.Table.Name.O + if _, ok := tableInfoMap[db]; !ok { + tableInfoMap[db] = make(map[string][]int64, len(conf.Tables[db])) + } + + key, err := hex.DecodeString(region.StartKey) + if err != nil { + d.L().Debug("invalid region start key", zap.Error(err), zap.String("key", region.StartKey)) + continue + } + // Auto decode byte if needed. + _, bs, err := codec.DecodeBytes(key, nil) + if err == nil { + key = bs + } + // Try to decode it as a record key. + tableID, handle, err := tablecodec.DecodeRecordKey(key) + if err != nil { + d.L().Debug("fail to decode region start key", zap.Error(err), zap.String("key", region.StartKey), zap.Int64("tableID", tableID)) + continue + } + tableInfoMap[db][tbl] = append(tableInfoMap[db][tbl], handle) + } + } + for _, tbInfos := range tableInfoMap { + for _, tbInfoLoop := range tbInfos { + // make sure tbInfo is only used in this loop + tbInfo := tbInfoLoop + sort.Slice(tbInfo, func(i, j int) bool { + return tbInfo[i] < tbInfo[j] + }) + } + } + + d.selectTiDBTableRegionFunc = func(tctx *tcontext.Context, conn *sql.Conn, dbName, tableName string) (pkFields []string, pkVals [][]string, err error) { + pkFields, _, err = selectTiDBRowKeyFields(conn, dbName, tableName, checkTiDBTableRegionPkFields) + if err != nil { + return + } + if tbInfos, ok := tableInfoMap[dbName]; ok { + if tbInfo, ok := tbInfos[tableName]; ok { + pkVals = make([][]string, len(tbInfo)) + for i, val := range tbInfo { + pkVals[i] = []string{strconv.FormatInt(val, 10)} + } + } + } + return + } + + return nil +} diff --git a/v4/export/prepare.go b/v4/export/prepare.go index 362ff7cc..000e1cf9 100644 --- a/v4/export/prepare.go +++ b/v4/export/prepare.go @@ -183,3 +183,17 @@ func (d DatabaseTables) Literal() string { return b.String() } + +// DatabaseTablesToMap transfers DatabaseTables to Map +func DatabaseTablesToMap(d DatabaseTables) map[string]map[string]struct{} { + mp := make(map[string]map[string]struct{}, len(d)) + for name, infos := range d { + mp[name] = make(map[string]struct{}, len(infos)) + for _, info := range infos { + if info.Type == TableTypeBase { + mp[name][info.Name] = struct{}{} + } + } + } + return mp +} diff --git a/v4/export/region_results.csv b/v4/export/region_results.csv new file mode 100644 index 00000000..07c0355b --- /dev/null +++ b/v4/export/region_results.csv @@ -0,0 +1,990 @@ +4,"","7480000000000000FF0500000000000000F8" +6,"7480000000000000FF0500000000000000F8","7480000000000000FF0700000000000000F8" +8,"7480000000000000FF0700000000000000F8","7480000000000000FF0900000000000000F8" +10,"7480000000000000FF0900000000000000F8","7480000000000000FF0B00000000000000F8" +12,"7480000000000000FF0B00000000000000F8","7480000000000000FF0D00000000000000F8" +14,"7480000000000000FF0D00000000000000F8","7480000000000000FF0F00000000000000F8" +16,"7480000000000000FF0F00000000000000F8","7480000000000000FF1100000000000000F8" +18,"7480000000000000FF1100000000000000F8","7480000000000000FF1300000000000000F8" +20,"7480000000000000FF1300000000000000F8","7480000000000000FF1500000000000000F8" +22,"7480000000000000FF1500000000000000F8","7480000000000000FF1700000000000000F8" +24,"7480000000000000FF1700000000000000F8","7480000000000000FF1900000000000000F8" +26,"7480000000000000FF1900000000000000F8","7480000000000000FF1B00000000000000F8" +28,"7480000000000000FF1B00000000000000F8","7480000000000000FF1D00000000000000F8" +30,"7480000000000000FF1D00000000000000F8","7480000000000000FF1F00000000000000F8" +32,"7480000000000000FF1F00000000000000F8","7480000000000000FF2100000000000000F8" +34,"7480000000000000FF2100000000000000F8","7480000000000000FF2300000000000000F8" +36,"7480000000000000FF2300000000000000F8","7480000000000000FF2500000000000000F8" +38,"7480000000000000FF2500000000000000F8","7480000000000000FF2700000000000000F8" +40,"7480000000000000FF2700000000000000F8","7480000000000000FF2900000000000000F8" +42,"7480000000000000FF2900000000000000F8","7480000000000000FF295F728000000000FF0EA6010000000000FA" +44,"7480000000000000FF295F728000000000FF0EA6010000000000FA","7480000000000000FF295F728000000000FF1D4C010000000000FA" +46,"7480000000000000FF295F728000000000FF1D4C010000000000FA","7480000000000000FF295F728000000000FF2BF2010000000000FA" +48,"7480000000000000FF295F728000000000FF2BF2010000000000FA","7480000000000000FF295F728000000000FF3A98010000000000FA" +50,"7480000000000000FF295F728000000000FF3A98010000000000FA","7480000000000000FF295F728000000000FF493E010000000000FA" +52,"7480000000000000FF295F728000000000FF493E010000000000FA","7480000000000000FF295F728000000000FF57E4010000000000FA" +54,"7480000000000000FF295F728000000000FF57E4010000000000FA","7480000000000000FF295F728000000000FF668A010000000000FA" +1001,"7480000000000000FF295F728000000000FF668A010000000000FA","7480000000000000FF2F00000000000000F8" +1003,"7480000000000000FF2F00000000000000F8","7480000000000000FF3300000000000000F8" +1005,"7480000000000000FF3300000000000000F8","7480000000000000FF3500000000000000F8" +1007,"7480000000000000FF3500000000000000F8","7480000000000000FF3C00000000000000F8" +1009,"7480000000000000FF3C00000000000000F8","7480000000000000FF4500000000000000F8" +1011,"7480000000000000FF4500000000000000F8","7480000000000000FF4700000000000000F8" +1013,"7480000000000000FF4700000000000000F8","7480000000000000FF4F00000000000000F8" +1015,"7480000000000000FF4F00000000000000F8","7480000000000000FF5400000000000000F8" +1017,"7480000000000000FF5400000000000000F8","7480000000000000FF5800000000000000F8" +1019,"7480000000000000FF5800000000000000F8","7480000000000000FF5E00000000000000F8" +1021,"7480000000000000FF5E00000000000000F8","7480000000000000FF6B00000000000000F8" +1023,"7480000000000000FF6B00000000000000F8","7480000000000000FF7000000000000000F8" +1025,"7480000000000000FF7000000000000000F8","7480000000000000FF7300000000000000F8" +1027,"7480000000000000FF7300000000000000F8","7480000000000000FF7A00000000000000F8" +1029,"7480000000000000FF7A00000000000000F8","7480000000000000FF8500000000000000F8" +1031,"7480000000000000FF8500000000000000F8","7480000000000000FF8900000000000000F8" +1033,"7480000000000000FF8900000000000000F8","7480000000000000FF8D00000000000000F8" +1035,"7480000000000000FF8D00000000000000F8","7480000000000000FF9400000000000000F8" +1037,"7480000000000000FF9400000000000000F8","7480000000000000FF9D00000000000000F8" +1039,"7480000000000000FF9D00000000000000F8","7480000000000000FFA200000000000000F8" +1041,"7480000000000000FFA200000000000000F8","7480000000000000FFA500000000000000F8" +1043,"7480000000000000FFA500000000000000F8","7480000000000000FFAC00000000000000F8" +1045,"7480000000000000FFAC00000000000000F8","7480000000000000FFB900000000000000F8" +1047,"7480000000000000FFB900000000000000F8","7480000000000000FFBD00000000000000F8" +1049,"7480000000000000FFBD00000000000000F8","7480000000000000FFBF00000000000000F8" +1051,"7480000000000000FFBF00000000000000F8","7480000000000000FFC300000000000000F8" +1053,"7480000000000000FFC300000000000000F8","7480000000000000FFCF00000000000000F8" +1055,"7480000000000000FFCF00000000000000F8","7480000000000000FFD400000000000000F8" +1057,"7480000000000000FFD400000000000000F8","7480000000000000FFD800000000000000F8" +1059,"7480000000000000FFD800000000000000F8","7480000000000000FFDE00000000000000F8" +1061,"7480000000000000FFDE00000000000000F8","7480000000000000FFE700000000000000F8" +1063,"7480000000000000FFE700000000000000F8","7480000000000000FFEC00000000000000F8" +1065,"7480000000000000FFEC00000000000000F8","7480000000000000FFF000000000000000F8" +1067,"7480000000000000FFF000000000000000F8","7480000000000000FFF600000000000000F8" +1069,"7480000000000000FFF600000000000000F8","7480000000000000FFFC00000000000000F8" +1071,"7480000000000000FFFC00000000000000F8","7480000000000000FFFE00000000000000F8" +1119,"7480000000000000FFFE00000000000000F8","7480000000000001FF0200000000000000F8" +1135,"7480000000000001FF0200000000000000F8","7480000000000001FF0300000000000000F8" +1137,"7480000000000001FF0300000000000000F8","7480000000000001FF0400000000000000F8" +1127,"7480000000000001FF0400000000000000F8","7480000000000001FF0500000000000000F8" +1073,"7480000000000001FF0500000000000000F8","7480000000000001FF0600000000000000F8" +1125,"7480000000000001FF0600000000000000F8","7480000000000001FF0800000000000000F8" +1083,"7480000000000001FF0800000000000000F8","7480000000000001FF0900000000000000F8" +1075,"7480000000000001FF0900000000000000F8","7480000000000001FF0A00000000000000F8" +1115,"7480000000000001FF0A00000000000000F8","7480000000000001FF0C00000000000000F8" +1077,"7480000000000001FF0C00000000000000F8","7480000000000001FF0D00000000000000F8" +1079,"7480000000000001FF0D00000000000000F8","7480000000000001FF0F00000000000000F8" +1129,"7480000000000001FF0F00000000000000F8","7480000000000001FF1100000000000000F8" +1103,"7480000000000001FF1100000000000000F8","7480000000000001FF1200000000000000F8" +1081,"7480000000000001FF1200000000000000F8","7480000000000001FF1300000000000000F8" +1085,"7480000000000001FF1300000000000000F8","7480000000000001FF1500000000000000F8" +1105,"7480000000000001FF1500000000000000F8","7480000000000001FF1600000000000000F8" +1089,"7480000000000001FF1600000000000000F8","7480000000000001FF1800000000000000F8" +1087,"7480000000000001FF1800000000000000F8","7480000000000001FF1A00000000000000F8" +1099,"7480000000000001FF1A00000000000000F8","7480000000000001FF1C00000000000000F8" +1093,"7480000000000001FF1C00000000000000F8","7480000000000001FF1E00000000000000F8" +1091,"7480000000000001FF1E00000000000000F8","7480000000000001FF1F00000000000000F8" +1143,"7480000000000001FF1F00000000000000F8","7480000000000001FF2200000000000000F8" +1097,"7480000000000001FF2200000000000000F8","7480000000000001FF2300000000000000F8" +1145,"7480000000000001FF2300000000000000F8","7480000000000001FF2400000000000000F8" +1095,"7480000000000001FF2400000000000000F8","7480000000000001FF2500000000000000F8" +1139,"7480000000000001FF2500000000000000F8","7480000000000001FF2800000000000000F8" +1101,"7480000000000001FF2800000000000000F8","7480000000000001FF2A00000000000000F8" +1141,"7480000000000001FF2A00000000000000F8","7480000000000001FF2E00000000000000F8" +1123,"7480000000000001FF2E00000000000000F8","7480000000000001FF2F00000000000000F8" +1107,"7480000000000001FF2F00000000000000F8","7480000000000001FF3000000000000000F8" +1121,"7480000000000001FF3000000000000000F8","7480000000000001FF3100000000000000F8" +1109,"7480000000000001FF3100000000000000F8","7480000000000001FF3200000000000000F8" +1113,"7480000000000001FF3200000000000000F8","7480000000000001FF3500000000000000F8" +1111,"7480000000000001FF3500000000000000F8","7480000000000001FF3600000000000000F8" +1117,"7480000000000001FF3600000000000000F8","7480000000000001FF3A00000000000000F8" +1131,"7480000000000001FF3A00000000000000F8","7480000000000001FF4200000000000000F8" +1133,"7480000000000001FF4200000000000000F8","7480000000000001FF4400000000000000F8" +1147,"7480000000000001FF4400000000000000F8","7480000000000001FF4C00000000000000F8" +1149,"7480000000000001FF4C00000000000000F8","7480000000000001FF4E00000000000000F8" +1153,"7480000000000001FF4E00000000000000F8","7480000000000001FF5000000000000000F8" +1187,"7480000000000001FF5000000000000000F8","7480000000000001FF5100000000000000F8" +1183,"7480000000000001FF5100000000000000F8","7480000000000001FF5300000000000000F8" +1151,"7480000000000001FF5300000000000000F8","7480000000000001FF5400000000000000F8" +1167,"7480000000000001FF5400000000000000F8","7480000000000001FF5500000000000000F8" +1175,"7480000000000001FF5500000000000000F8","7480000000000001FF5700000000000000F8" +1177,"7480000000000001FF5700000000000000F8","7480000000000001FF5800000000000000F8" +1197,"7480000000000001FF5800000000000000F8","7480000000000001FF5900000000000000F8" +1169,"7480000000000001FF5900000000000000F8","7480000000000001FF5A00000000000000F8" +1157,"7480000000000001FF5A00000000000000F8","7480000000000001FF5B00000000000000F8" +1179,"7480000000000001FF5B00000000000000F8","7480000000000001FF5C00000000000000F8" +1191,"7480000000000001FF5C00000000000000F8","7480000000000001FF5D00000000000000F8" +1155,"7480000000000001FF5D00000000000000F8","7480000000000001FF5E00000000000000F8" +1189,"7480000000000001FF5E00000000000000F8","7480000000000001FF6100000000000000F8" +1159,"7480000000000001FF6100000000000000F8","7480000000000001FF6200000000000000F8" +1193,"7480000000000001FF6200000000000000F8","7480000000000001FF6400000000000000F8" +1163,"7480000000000001FF6400000000000000F8","7480000000000001FF6500000000000000F8" +1161,"7480000000000001FF6500000000000000F8","7480000000000001FF6600000000000000F8" +1185,"7480000000000001FF6600000000000000F8","7480000000000001FF6900000000000000F8" +1165,"7480000000000001FF6900000000000000F8","7480000000000001FF6A00000000000000F8" +1171,"7480000000000001FF6A00000000000000F8","7480000000000001FF6E00000000000000F8" +1173,"7480000000000001FF6E00000000000000F8","7480000000000001FF7000000000000000F8" +1181,"7480000000000001FF7000000000000000F8","7480000000000001FF7500000000000000F8" +1195,"7480000000000001FF7500000000000000F8","7480000000000001FF7C00000000000000F8" +1199,"7480000000000001FF7C00000000000000F8","7480000000000001FF8000000000000000F8" +1201,"7480000000000001FF8000000000000000F8","7480000000000001FF8200000000000000F8" +1203,"7480000000000001FF8200000000000000F8","7480000000000001FF8400000000000000F8" +1209,"7480000000000001FF8400000000000000F8","7480000000000001FF8600000000000000F8" +1211,"7480000000000001FF8600000000000000F8","7480000000000001FF8800000000000000F8" +1207,"7480000000000001FF8800000000000000F8","7480000000000001FF8A00000000000000F8" +1217,"7480000000000001FF8A00000000000000F8","7480000000000001FF8B00000000000000F8" +1219,"7480000000000001FF8B00000000000000F8","7480000000000001FF8C00000000000000F8" +1205,"7480000000000001FF8C00000000000000F8","7480000000000001FF8D00000000000000F8" +1213,"7480000000000001FF8D00000000000000F8","7480000000000001FF9100000000000000F8" +1233,"7480000000000001FF9100000000000000F8","7480000000000001FF9400000000000000F8" +1247,"7480000000000001FF9400000000000000F8","7480000000000001FF9500000000000000F8" +1215,"7480000000000001FF9500000000000000F8","7480000000000001FF9600000000000000F8" +1227,"7480000000000001FF9600000000000000F8","7480000000000001FF9700000000000000F8" +1235,"7480000000000001FF9700000000000000F8","7480000000000001FF9900000000000000F8" +1221,"7480000000000001FF9900000000000000F8","7480000000000001FF9A00000000000000F8" +1231,"7480000000000001FF9A00000000000000F8","7480000000000001FF9B00000000000000F8" +1223,"7480000000000001FF9B00000000000000F8","7480000000000001FF9D00000000000000F8" +1229,"7480000000000001FF9D00000000000000F8","7480000000000001FFA000000000000000F8" +1243,"7480000000000001FFA000000000000000F8","7480000000000001FFA500000000000000F8" +1245,"7480000000000001FFA500000000000000F8","7480000000000001FFA600000000000000F8" +1239,"7480000000000001FFA600000000000000F8","7480000000000001FFA700000000000000F8" +1241,"7480000000000001FFA700000000000000F8","7480000000000001FFA900000000000000F8" +1237,"7480000000000001FFA900000000000000F8","7480000000000001FFAA00000000000000F8" +1249,"7480000000000001FFAA00000000000000F8","7480000000000001FFB000000000000000F8" +1251,"7480000000000001FFB000000000000000F8","7480000000000001FFB200000000000000F8" +1255,"7480000000000001FFB200000000000000F8","7480000000000001FFB300000000000000F8" +1257,"7480000000000001FFB300000000000000F8","7480000000000001FFB600000000000000F8" +1267,"7480000000000001FFB600000000000000F8","7480000000000001FFB800000000000000F8" +1275,"7480000000000001FFB800000000000000F8","7480000000000001FFB900000000000000F8" +1273,"7480000000000001FFB900000000000000F8","7480000000000001FFBA00000000000000F8" +1271,"7480000000000001FFBA00000000000000F8","7480000000000001FFBB00000000000000F8" +1277,"7480000000000001FFBB00000000000000F8","7480000000000001FFBC00000000000000F8" +1261,"7480000000000001FFBC00000000000000F8","7480000000000001FFBD00000000000000F8" +1259,"7480000000000001FFBD00000000000000F8","7480000000000001FFBE00000000000000F8" +1279,"7480000000000001FFBE00000000000000F8","7480000000000001FFC600000000000000F8" +1281,"7480000000000001FFC600000000000000F8","7480000000000001FFC800000000000000F8" +1283,"7480000000000001FFC800000000000000F8","7480000000000001FFCA00000000000000F8" +1285,"7480000000000001FFCA00000000000000F8","7480000000000001FFCC00000000000000F8" +1289,"7480000000000001FFCC00000000000000F8","7480000000000001FFCD00000000000000F8" +1291,"7480000000000001FFCD00000000000000F8","7480000000000001FFD000000000000000F8" +1293,"7480000000000001FFD000000000000000F8","7480000000000001FFD200000000000000F8" +1295,"7480000000000001FFD200000000000000F8","7480000000000001FFD400000000000000F8" +1297,"7480000000000001FFD400000000000000F8","7480000000000001FFD600000000000000F8" +1299,"7480000000000001FFD600000000000000F8","7480000000000001FFD800000000000000F8" +1309,"7480000000000001FFD800000000000000F8","7480000000000001FFDA00000000000000F8" +1303,"7480000000000001FFDA00000000000000F8","7480000000000001FFDB00000000000000F8" +1307,"7480000000000001FFDB00000000000000F8","7480000000000001FFDE00000000000000F8" +1311,"7480000000000001FFDE00000000000000F8","7480000000000001FFE000000000000000F8" +1313,"7480000000000001FFE000000000000000F8","7480000000000001FFE200000000000000F8" +1317,"7480000000000001FFE200000000000000F8","7480000000000001FFE400000000000000F8" +1321,"7480000000000001FFE400000000000000F8","7480000000000001FFE600000000000000F8" +1325,"7480000000000001FFE600000000000000F8","7480000000000001FFE800000000000000F8" +1329,"7480000000000001FFE800000000000000F8","7480000000000001FFEA00000000000000F8" +1331,"7480000000000001FFEA00000000000000F8","7480000000000001FFEC00000000000000F8" +1327,"7480000000000001FFEC00000000000000F8","7480000000000001FFED00000000000000F8" +1333,"7480000000000001FFED00000000000000F8","7480000000000001FFF000000000000000F8" +1335,"7480000000000001FFF000000000000000F8","7480000000000001FFF200000000000000F8" +1337,"7480000000000001FFF200000000000000F8","7480000000000001FFF400000000000000F8" +1339,"7480000000000001FFF400000000000000F8","7480000000000001FFF600000000000000F8" +1341,"7480000000000001FFF600000000000000F8","7480000000000001FFF800000000000000F8" +1355,"7480000000000001FFF800000000000000F8","7480000000000001FFFA00000000000000F8" +1343,"7480000000000001FFFA00000000000000F8","7480000000000001FFFB00000000000000F8" +1347,"7480000000000001FFFB00000000000000F8","7480000000000001FFFC00000000000000F8" +1345,"7480000000000001FFFC00000000000000F8","7480000000000001FFFD00000000000000F8" +1353,"7480000000000001FFFD00000000000000F8","7480000000000002FF0100000000000000F8" +1349,"7480000000000002FF0100000000000000F8","7480000000000002FF0200000000000000F8" +1351,"7480000000000002FF0200000000000000F8","7480000000000002FF0500000000000000F8" +1363,"7480000000000002FF0500000000000000F8","7480000000000002FF0800000000000000F8" +1357,"7480000000000002FF0800000000000000F8","7480000000000002FF0900000000000000F8" +1359,"7480000000000002FF0900000000000000F8","7480000000000002FF0B00000000000000F8" +1361,"7480000000000002FF0B00000000000000F8","7480000000000002FF0D00000000000000F8" +1365,"7480000000000002FF0D00000000000000F8","7480000000000002FF1000000000000000F8" +1369,"7480000000000002FF1000000000000000F8","7480000000000002FF1200000000000000F8" +1373,"7480000000000002FF1200000000000000F8","7480000000000002FF1400000000000000F8" +1375,"7480000000000002FF1400000000000000F8","7480000000000002FF1600000000000000F8" +1367,"7480000000000002FF1600000000000000F8","7480000000000002FF1800000000000000F8" +1377,"7480000000000002FF1800000000000000F8","7480000000000002FF1A00000000000000F8" +1383,"7480000000000002FF1A00000000000000F8","7480000000000002FF1C00000000000000F8" +1379,"7480000000000002FF1C00000000000000F8","7480000000000002FF1D00000000000000F8" +1385,"7480000000000002FF1D00000000000000F8","7480000000000002FF2000000000000000F8" +1397,"7480000000000002FF2000000000000000F8","7480000000000002FF2200000000000000F8" +1389,"7480000000000002FF2200000000000000F8","7480000000000002FF2300000000000000F8" +1387,"7480000000000002FF2300000000000000F8","7480000000000002FF2400000000000000F8" +1393,"7480000000000002FF2400000000000000F8","7480000000000002FF2700000000000000F8" +1391,"7480000000000002FF2700000000000000F8","7480000000000002FF2800000000000000F8" +1401,"7480000000000002FF2800000000000000F8","7480000000000002FF2C00000000000000F8" +1399,"7480000000000002FF2C00000000000000F8","7480000000000002FF2D00000000000000F8" +1395,"7480000000000002FF2D00000000000000F8","7480000000000002FF3000000000000000F8" +1403,"7480000000000002FF3000000000000000F8","7480000000000002FF3200000000000000F8" +1405,"7480000000000002FF3200000000000000F8","7480000000000002FF3400000000000000F8" +1411,"7480000000000002FF3400000000000000F8","7480000000000002FF3500000000000000F8" +1409,"7480000000000002FF3500000000000000F8","7480000000000002FF3800000000000000F8" +1413,"7480000000000002FF3800000000000000F8","7480000000000002FF3A00000000000000F8" +1417,"7480000000000002FF3A00000000000000F8","7480000000000002FF3C00000000000000F8" +1415,"7480000000000002FF3C00000000000000F8","7480000000000002FF3D00000000000000F8" +1419,"7480000000000002FF3D00000000000000F8","7480000000000002FF4000000000000000F8" +1423,"7480000000000002FF4000000000000000F8","7480000000000002FF4200000000000000F8" +1421,"7480000000000002FF4200000000000000F8","7480000000000002FF4300000000000000F8" +1425,"7480000000000002FF4300000000000000F8","7480000000000002FF4600000000000000F8" +1427,"7480000000000002FF4600000000000000F8","7480000000000002FF4800000000000000F8" +1429,"7480000000000002FF4800000000000000F8","7480000000000002FF4A00000000000000F8" +1431,"7480000000000002FF4A00000000000000F8","7480000000000002FF4C00000000000000F8" +1437,"7480000000000002FF4C00000000000000F8","7480000000000002FF4E00000000000000F8" +1433,"7480000000000002FF4E00000000000000F8","7480000000000002FF4F00000000000000F8" +1439,"7480000000000002FF4F00000000000000F8","7480000000000002FF5200000000000000F8" +1445,"7480000000000002FF5200000000000000F8","7480000000000002FF5400000000000000F8" +1441,"7480000000000002FF5400000000000000F8","7480000000000002FF5500000000000000F8" +1443,"7480000000000002FF5500000000000000F8","7480000000000002FF5700000000000000F8" +1447,"7480000000000002FF5700000000000000F8","7480000000000002FF5A00000000000000F8" +1449,"7480000000000002FF5A00000000000000F8","7480000000000002FF5C00000000000000F8" +1451,"7480000000000002FF5C00000000000000F8","7480000000000002FF5E00000000000000F8" +1453,"7480000000000002FF5E00000000000000F8","7480000000000002FF6000000000000000F8" +1457,"7480000000000002FF6000000000000000F8","7480000000000002FF6200000000000000F8" +1459,"7480000000000002FF6200000000000000F8","7480000000000002FF6400000000000000F8" +1455,"7480000000000002FF6400000000000000F8","7480000000000002FF6600000000000000F8" +1465,"7480000000000002FF6600000000000000F8","7480000000000002FF6800000000000000F8" +1461,"7480000000000002FF6800000000000000F8","7480000000000002FF6A00000000000000F8" +1463,"7480000000000002FF6A00000000000000F8","7480000000000002FF6C00000000000000F8" +1469,"7480000000000002FF6C00000000000000F8","7480000000000002FF6E00000000000000F8" +1467,"7480000000000002FF6E00000000000000F8","7480000000000002FF6F00000000000000F8" +1471,"7480000000000002FF6F00000000000000F8","7480000000000002FF7200000000000000F8" +1473,"7480000000000002FF7200000000000000F8","7480000000000002FF7400000000000000F8" +1475,"7480000000000002FF7400000000000000F8","7480000000000002FF7600000000000000F8" +1477,"7480000000000002FF7600000000000000F8","7480000000000002FF7800000000000000F8" +1479,"7480000000000002FF7800000000000000F8","7480000000000002FF7A00000000000000F8" +1481,"7480000000000002FF7A00000000000000F8","7480000000000002FF7C00000000000000F8" +1485,"7480000000000002FF7C00000000000000F8","7480000000000002FF7E00000000000000F8" +1487,"7480000000000002FF7E00000000000000F8","7480000000000002FF8000000000000000F8" +1483,"7480000000000002FF8000000000000000F8","7480000000000002FF8200000000000000F8" +1489,"7480000000000002FF8200000000000000F8","7480000000000002FF8400000000000000F8" +1491,"7480000000000002FF8400000000000000F8","7480000000000002FF8600000000000000F8" +1493,"7480000000000002FF8600000000000000F8","7480000000000002FF8800000000000000F8" +1495,"7480000000000002FF8800000000000000F8","7480000000000002FF8A00000000000000F8" +1497,"7480000000000002FF8A00000000000000F8","7480000000000002FF8C00000000000000F8" +1501,"7480000000000002FF8C00000000000000F8","7480000000000002FF8E00000000000000F8" +1499,"7480000000000002FF8E00000000000000F8","7480000000000002FF9000000000000000F8" +1507,"7480000000000002FF9000000000000000F8","7480000000000002FF9200000000000000F8" +1503,"7480000000000002FF9200000000000000F8","7480000000000002FF9400000000000000F8" +1509,"7480000000000002FF9400000000000000F8","7480000000000002FF9600000000000000F8" +1511,"7480000000000002FF9600000000000000F8","7480000000000002FF9800000000000000F8" +1515,"7480000000000002FF9800000000000000F8","7480000000000002FF9A00000000000000F8" +1513,"7480000000000002FF9A00000000000000F8","7480000000000002FF9C00000000000000F8" +1517,"7480000000000002FF9C00000000000000F8","7480000000000002FF9E00000000000000F8" +1519,"7480000000000002FF9E00000000000000F8","7480000000000002FFA000000000000000F8" +1521,"7480000000000002FFA000000000000000F8","7480000000000002FFA200000000000000F8" +1523,"7480000000000002FFA200000000000000F8","7480000000000002FFA400000000000000F8" +1527,"7480000000000002FFA400000000000000F8","7480000000000002FFA600000000000000F8" +1529,"7480000000000002FFA600000000000000F8","7480000000000002FFA800000000000000F8" +1531,"7480000000000002FFA800000000000000F8","7480000000000002FFAA00000000000000F8" +1533,"7480000000000002FFAA00000000000000F8","7480000000000002FFAC00000000000000F8" +1535,"7480000000000002FFAC00000000000000F8","7480000000000002FFAE00000000000000F8" +1537,"7480000000000002FFAE00000000000000F8","7480000000000002FFB000000000000000F8" +1547,"7480000000000002FFB000000000000000F8","7480000000000002FFB200000000000000F8" +1539,"7480000000000002FFB200000000000000F8","7480000000000002FFB300000000000000F8" +1543,"7480000000000002FFB300000000000000F8","7480000000000002FFB500000000000000F8" +1549,"7480000000000002FFB500000000000000F8","7480000000000002FFB800000000000000F8" +1541,"7480000000000002FFB800000000000000F8","7480000000000002FFBA00000000000000F8" +1545,"7480000000000002FFBA00000000000000F8","7480000000000002FFBC00000000000000F8" +1551,"7480000000000002FFBC00000000000000F8","7480000000000002FFBE00000000000000F8" +1553,"7480000000000002FFBE00000000000000F8","7480000000000002FFC000000000000000F8" +1557,"7480000000000002FFC000000000000000F8","7480000000000002FFC200000000000000F8" +1555,"7480000000000002FFC200000000000000F8","7480000000000002FFC400000000000000F8" +1567,"7480000000000002FFC400000000000000F8","7480000000000002FFC500000000000000F8" +1559,"7480000000000002FFC500000000000000F8","7480000000000002FFC700000000000000F8" +1577,"7480000000000002FFC700000000000000F8","7480000000000002FFC800000000000000F8" +1565,"7480000000000002FFC800000000000000F8","7480000000000002FFC900000000000000F8" +1561,"7480000000000002FFC900000000000000F8","7480000000000002FFCB00000000000000F8" +1569,"7480000000000002FFCB00000000000000F8","7480000000000002FFCD00000000000000F8" +1563,"7480000000000002FFCD00000000000000F8","7480000000000002FFCE00000000000000F8" +1571,"7480000000000002FFCE00000000000000F8","7480000000000002FFD400000000000000F8" +1573,"7480000000000002FFD400000000000000F8","7480000000000002FFD600000000000000F8" +1575,"7480000000000002FFD600000000000000F8","7480000000000002FFD800000000000000F8" +1579,"7480000000000002FFD800000000000000F8","7480000000000002FFDA00000000000000F8" +1589,"7480000000000002FFDA00000000000000F8","7480000000000002FFDC00000000000000F8" +1581,"7480000000000002FFDC00000000000000F8","7480000000000002FFDD00000000000000F8" +1591,"7480000000000002FFDD00000000000000F8","7480000000000002FFE000000000000000F8" +1587,"7480000000000002FFE000000000000000F8","7480000000000002FFE200000000000000F8" +1593,"7480000000000002FFE200000000000000F8","7480000000000002FFE400000000000000F8" +1595,"7480000000000002FFE400000000000000F8","7480000000000002FFE600000000000000F8" +1599,"7480000000000002FFE600000000000000F8","7480000000000002FFE800000000000000F8" +1597,"7480000000000002FFE800000000000000F8","7480000000000002FFE900000000000000F8" +1601,"7480000000000002FFE900000000000000F8","7480000000000002FFEB00000000000000F8" +1603,"7480000000000002FFEB00000000000000F8","7480000000000002FFEE00000000000000F8" +1605,"7480000000000002FFEE00000000000000F8","7480000000000002FFF000000000000000F8" +1607,"7480000000000002FFF000000000000000F8","7480000000000002FFF200000000000000F8" +1609,"7480000000000002FFF200000000000000F8","7480000000000002FFF400000000000000F8" +1611,"7480000000000002FFF400000000000000F8","7480000000000002FFF600000000000000F8" +1613,"7480000000000002FFF600000000000000F8","7480000000000002FFF800000000000000F8" +1615,"7480000000000002FFF800000000000000F8","7480000000000002FFFA00000000000000F8" +1621,"7480000000000002FFFA00000000000000F8","7480000000000002FFFC00000000000000F8" +1623,"7480000000000002FFFC00000000000000F8","7480000000000002FFFD00000000000000F8" +1617,"7480000000000002FFFD00000000000000F8","7480000000000002FFFE00000000000000F8" +1619,"7480000000000002FFFE00000000000000F8","7480000000000003FF0000000000000000F8" +1625,"7480000000000003FF0000000000000000F8","7480000000000003FF0400000000000000F8" +1627,"7480000000000003FF0400000000000000F8","7480000000000003FF0600000000000000F8" +1629,"7480000000000003FF0600000000000000F8","7480000000000003FF0800000000000000F8" +1631,"7480000000000003FF0800000000000000F8","7480000000000003FF0A00000000000000F8" +1633,"7480000000000003FF0A00000000000000F8","7480000000000003FF0C00000000000000F8" +1635,"7480000000000003FF0C00000000000000F8","7480000000000003FF0E00000000000000F8" +1637,"7480000000000003FF0E00000000000000F8","7480000000000003FF1000000000000000F8" +1639,"7480000000000003FF1000000000000000F8","7480000000000003FF1200000000000000F8" +1641,"7480000000000003FF1200000000000000F8","7480000000000003FF1400000000000000F8" +1643,"7480000000000003FF1400000000000000F8","7480000000000003FF1600000000000000F8" +1647,"7480000000000003FF1600000000000000F8","7480000000000003FF1800000000000000F8" +1649,"7480000000000003FF1800000000000000F8","7480000000000003FF1A00000000000000F8" +1651,"7480000000000003FF1A00000000000000F8","7480000000000003FF1C00000000000000F8" +1645,"7480000000000003FF1C00000000000000F8","7480000000000003FF1E00000000000000F8" +1657,"7480000000000003FF1E00000000000000F8","7480000000000003FF1F00000000000000F8" +1655,"7480000000000003FF1F00000000000000F8","7480000000000003FF2000000000000000F8" +1677,"7480000000000003FF2000000000000000F8","7480000000000003FF2300000000000000F8" +1671,"7480000000000003FF2300000000000000F8","7480000000000003FF2400000000000000F8" +1675,"7480000000000003FF2400000000000000F8","7480000000000003FF2500000000000000F8" +1681,"7480000000000003FF2500000000000000F8","7480000000000003FF2600000000000000F8" +1679,"7480000000000003FF2600000000000000F8","7480000000000003FF2700000000000000F8" +1661,"7480000000000003FF2700000000000000F8","7480000000000003FF2900000000000000F8" +1665,"7480000000000003FF2900000000000000F8","7480000000000003FF2A00000000000000F8" +1663,"7480000000000003FF2A00000000000000F8","7480000000000003FF2B00000000000000F8" +1659,"7480000000000003FF2B00000000000000F8","7480000000000003FF2C00000000000000F8" +1653,"7480000000000003FF2C00000000000000F8","7480000000000003FF2D00000000000000F8" +1667,"7480000000000003FF2D00000000000000F8","7480000000000003FF3300000000000000F8" +1669,"7480000000000003FF3300000000000000F8","7480000000000003FF3500000000000000F8" +1683,"7480000000000003FF3500000000000000F8","7480000000000003FF3B00000000000000F8" +1685,"7480000000000003FF3B00000000000000F8","7480000000000003FF3E00000000000000F8" +1687,"7480000000000003FF3E00000000000000F8","7480000000000003FF4000000000000000F8" +1689,"7480000000000003FF4000000000000000F8","7480000000000003FF4200000000000000F8" +1691,"7480000000000003FF4200000000000000F8","7480000000000003FF4300000000000000F8" +1693,"7480000000000003FF4300000000000000F8","7480000000000003FF4600000000000000F8" +1695,"7480000000000003FF4600000000000000F8","7480000000000003FF4800000000000000F8" +1697,"7480000000000003FF4800000000000000F8","7480000000000003FF4A00000000000000F8" +1699,"7480000000000003FF4A00000000000000F8","7480000000000003FF4C00000000000000F8" +1701,"7480000000000003FF4C00000000000000F8","7480000000000003FF4E00000000000000F8" +1705,"7480000000000003FF4E00000000000000F8","7480000000000003FF4F00000000000000F8" +1711,"7480000000000003FF4F00000000000000F8","7480000000000003FF5200000000000000F8" +1707,"7480000000000003FF5200000000000000F8","7480000000000003FF5300000000000000F8" +1713,"7480000000000003FF5300000000000000F8","7480000000000003FF5600000000000000F8" +1715,"7480000000000003FF5600000000000000F8","7480000000000003FF5800000000000000F8" +1717,"7480000000000003FF5800000000000000F8","7480000000000003FF5A00000000000000F8" +1719,"7480000000000003FF5A00000000000000F8","7480000000000003FF5C00000000000000F8" +1721,"7480000000000003FF5C00000000000000F8","7480000000000003FF5E00000000000000F8" +1723,"7480000000000003FF5E00000000000000F8","7480000000000003FF6000000000000000F8" +1727,"7480000000000003FF6000000000000000F8","7480000000000003FF6200000000000000F8" +1725,"7480000000000003FF6200000000000000F8","7480000000000003FF6300000000000000F8" +1729,"7480000000000003FF6300000000000000F8","7480000000000003FF6600000000000000F8" +1731,"7480000000000003FF6600000000000000F8","7480000000000003FF6800000000000000F8" +1733,"7480000000000003FF6800000000000000F8","7480000000000003FF6A00000000000000F8" +1735,"7480000000000003FF6A00000000000000F8","7480000000000003FF6C00000000000000F8" +1741,"7480000000000003FF6C00000000000000F8","7480000000000003FF6E00000000000000F8" +1737,"7480000000000003FF6E00000000000000F8","7480000000000003FF6F00000000000000F8" +1765,"7480000000000003FF6F00000000000000F8","7480000000000003FF7200000000000000F8" +1779,"7480000000000003FF7200000000000000F8","7480000000000003FF7300000000000000F8" +1773,"7480000000000003FF7300000000000000F8","7480000000000003FF7400000000000000F8" +1739,"7480000000000003FF7400000000000000F8","7480000000000003FF7500000000000000F8" +1785,"7480000000000003FF7500000000000000F8","7480000000000003FF7600000000000000F8" +1789,"7480000000000003FF7600000000000000F8","7480000000000003FF7700000000000000F8" +1743,"7480000000000003FF7700000000000000F8","7480000000000003FF7800000000000000F8" +1777,"7480000000000003FF7800000000000000F8","7480000000000003FF7A00000000000000F8" +1775,"7480000000000003FF7A00000000000000F8","7480000000000003FF7B00000000000000F8" +1771,"7480000000000003FF7B00000000000000F8","7480000000000003FF7D00000000000000F8" +1761,"7480000000000003FF7D00000000000000F8","7480000000000003FF7E00000000000000F8" +1745,"7480000000000003FF7E00000000000000F8","7480000000000003FF7F00000000000000F8" +1755,"7480000000000003FF7F00000000000000F8","7480000000000003FF8100000000000000F8" +1747,"7480000000000003FF8100000000000000F8","7480000000000003FF8200000000000000F8" +1749,"7480000000000003FF8200000000000000F8","7480000000000003FF8400000000000000F8" +1787,"7480000000000003FF8400000000000000F8","7480000000000003FF8500000000000000F8" +1783,"7480000000000003FF8500000000000000F8","7480000000000003FF8600000000000000F8" +1769,"7480000000000003FF8600000000000000F8","7480000000000003FF8800000000000000F8" +1751,"7480000000000003FF8800000000000000F8","7480000000000003FF8900000000000000F8" +1767,"7480000000000003FF8900000000000000F8","7480000000000003FF8B00000000000000F8" +1753,"7480000000000003FF8B00000000000000F8","7480000000000003FF8C00000000000000F8" +1757,"7480000000000003FF8C00000000000000F8","7480000000000003FF8E00000000000000F8" +1759,"7480000000000003FF8E00000000000000F8","7480000000000003FF9100000000000000F8" +1763,"7480000000000003FF9100000000000000F8","7480000000000003FF9400000000000000F8" +1781,"7480000000000003FF9400000000000000F8","7480000000000003FF9D00000000000000F8" +1791,"7480000000000003FF9D00000000000000F8","7480000000000003FFA400000000000000F8" +1793,"7480000000000003FFA400000000000000F8","7480000000000003FFA600000000000000F8" +1795,"7480000000000003FFA600000000000000F8","7480000000000003FFA800000000000000F8" +1805,"7480000000000003FFA800000000000000F8","7480000000000003FFAA00000000000000F8" +1799,"7480000000000003FFAA00000000000000F8","7480000000000003FFAC00000000000000F8" +1807,"7480000000000003FFAC00000000000000F8","7480000000000003FFAD00000000000000F8" +1803,"7480000000000003FFAD00000000000000F8","7480000000000003FFAE00000000000000F8" +1809,"7480000000000003FFAE00000000000000F8","7480000000000003FFAF00000000000000F8" +1797,"7480000000000003FFAF00000000000000F8","7480000000000003FFB000000000000000F8" +1811,"7480000000000003FFB000000000000000F8","7480000000000003FFB600000000000000F8" +1813,"7480000000000003FFB600000000000000F8","7480000000000003FFB800000000000000F8" +1815,"7480000000000003FFB800000000000000F8","7480000000000003FFBA00000000000000F8" +1817,"7480000000000003FFBA00000000000000F8","7480000000000003FFBC00000000000000F8" +1819,"7480000000000003FFBC00000000000000F8","7480000000000003FFBE00000000000000F8" +1821,"7480000000000003FFBE00000000000000F8","7480000000000003FFC000000000000000F8" +1823,"7480000000000003FFC000000000000000F8","7480000000000003FFC200000000000000F8" +1827,"7480000000000003FFC200000000000000F8","7480000000000003FFC400000000000000F8" +1825,"7480000000000003FFC400000000000000F8","7480000000000003FFC600000000000000F8" +1829,"7480000000000003FFC600000000000000F8","7480000000000003FFC800000000000000F8" +1839,"7480000000000003FFC800000000000000F8","7480000000000003FFCA00000000000000F8" +1837,"7480000000000003FFCA00000000000000F8","7480000000000003FFCB00000000000000F8" +1831,"7480000000000003FFCB00000000000000F8","7480000000000003FFCC00000000000000F8" +1833,"7480000000000003FFCC00000000000000F8","7480000000000003FFCE00000000000000F8" +1841,"7480000000000003FFCE00000000000000F8","7480000000000003FFD600000000000000F8" +1843,"7480000000000003FFD600000000000000F8","7480000000000003FFD800000000000000F8" +1917,"7480000000000003FFD800000000000000F8","7480000000000003FFDC00000000000000F8" +1893,"7480000000000003FFDC00000000000000F8","7480000000000003FFDD00000000000000F8" +1847,"7480000000000003FFDD00000000000000F8","7480000000000003FFDE00000000000000F8" +1869,"7480000000000003FFDE00000000000000F8","7480000000000003FFDF00000000000000F8" +1899,"7480000000000003FFDF00000000000000F8","7480000000000003FFE000000000000000F8" +1849,"7480000000000003FFE000000000000000F8","7480000000000003FFE100000000000000F8" +1845,"7480000000000003FFE100000000000000F8","7480000000000003FFE200000000000000F8" +1909,"7480000000000003FFE200000000000000F8","7480000000000003FFE600000000000000F8" +1879,"7480000000000003FFE600000000000000F8","7480000000000003FFE700000000000000F8" +1851,"7480000000000003FFE700000000000000F8","7480000000000003FFE800000000000000F8" +1865,"7480000000000003FFE800000000000000F8","7480000000000003FFEA00000000000000F8" +1863,"7480000000000003FFEA00000000000000F8","7480000000000003FFEB00000000000000F8" +1853,"7480000000000003FFEB00000000000000F8","7480000000000003FFEC00000000000000F8" +1855,"7480000000000003FFEC00000000000000F8","7480000000000003FFEE00000000000000F8" +1857,"7480000000000003FFEE00000000000000F8","7480000000000003FFF000000000000000F8" +1861,"7480000000000003FFF000000000000000F8","7480000000000003FFF200000000000000F8" +1859,"7480000000000003FFF200000000000000F8","7480000000000003FFF300000000000000F8" +1867,"7480000000000003FFF300000000000000F8","7480000000000003FFF800000000000000F8" +1907,"7480000000000003FFF800000000000000F8","7480000000000003FFFB00000000000000F8" +1915,"7480000000000003FFFB00000000000000F8","7480000000000003FFFC00000000000000F8" +1897,"7480000000000003FFFC00000000000000F8","7480000000000003FFFD00000000000000F8" +1905,"7480000000000003FFFD00000000000000F8","7480000000000003FFFE00000000000000F8" +1891,"7480000000000003FFFE00000000000000F8","7480000000000003FFFF00000000000000F8" +1873,"7480000000000003FFFF00000000000000F8","7480000000000004FF0000000000000000F8" +1901,"7480000000000004FF0000000000000000F8","7480000000000004FF0100000000000000F8" +1913,"7480000000000004FF0100000000000000F8","7480000000000004FF0200000000000000F8" +1871,"7480000000000004FF0200000000000000F8","7480000000000004FF0300000000000000F8" +1889,"7480000000000004FF0300000000000000F8","7480000000000004FF0600000000000000F8" +1875,"7480000000000004FF0600000000000000F8","7480000000000004FF0700000000000000F8" +1881,"7480000000000004FF0700000000000000F8","7480000000000004FF0900000000000000F8" +1887,"7480000000000004FF0900000000000000F8","7480000000000004FF0A00000000000000F8" +1877,"7480000000000004FF0A00000000000000F8","7480000000000004FF0B00000000000000F8" +1885,"7480000000000004FF0B00000000000000F8","7480000000000004FF0F00000000000000F8" +1883,"7480000000000004FF0F00000000000000F8","7480000000000004FF1000000000000000F8" +1919,"7480000000000004FF1000000000000000F8","7480000000000004FF1800000000000000F8" +1911,"7480000000000004FF1800000000000000F8","7480000000000004FF1900000000000000F8" +1921,"7480000000000004FF1900000000000000F8","7480000000000004FF1A00000000000000F8" +1895,"7480000000000004FF1A00000000000000F8","7480000000000004FF1B00000000000000F8" +1903,"7480000000000004FF1B00000000000000F8","7480000000000004FF1F00000000000000F8" +1923,"7480000000000004FF1F00000000000000F8","7480000000000004FF2A00000000000000F8" +1925,"7480000000000004FF2A00000000000000F8","7480000000000004FF2C00000000000000F8" +1929,"7480000000000004FF2C00000000000000F8","7480000000000004FF2E00000000000000F8" +1927,"7480000000000004FF2E00000000000000F8","7480000000000004FF2F00000000000000F8" +1931,"7480000000000004FF2F00000000000000F8","7480000000000004FF3200000000000000F8" +1933,"7480000000000004FF3200000000000000F8","7480000000000004FF3400000000000000F8" +1945,"7480000000000004FF3400000000000000F8","7480000000000004FF3600000000000000F8" +1939,"7480000000000004FF3600000000000000F8","7480000000000004FF3700000000000000F8" +1935,"7480000000000004FF3700000000000000F8","7480000000000004FF3800000000000000F8" +1943,"7480000000000004FF3800000000000000F8","7480000000000004FF3B00000000000000F8" +1941,"7480000000000004FF3B00000000000000F8","7480000000000004FF3C00000000000000F8" +1951,"7480000000000004FF3C00000000000000F8","7480000000000004FF4000000000000000F8" +1947,"7480000000000004FF4000000000000000F8","7480000000000004FF4100000000000000F8" +1961,"7480000000000004FF4100000000000000F8","7480000000000004FF4400000000000000F8" +1953,"7480000000000004FF4400000000000000F8","7480000000000004FF4500000000000000F8" +1965,"7480000000000004FF4500000000000000F8","7480000000000004FF4700000000000000F8" +1957,"7480000000000004FF4700000000000000F8","7480000000000004FF4800000000000000F8" +1955,"7480000000000004FF4800000000000000F8","7480000000000004FF4900000000000000F8" +1959,"7480000000000004FF4900000000000000F8","7480000000000004FF4C00000000000000F8" +1967,"7480000000000004FF4C00000000000000F8","7480000000000004FF5000000000000000F8" +1963,"7480000000000004FF5000000000000000F8","7480000000000004FF5200000000000000F8" +1969,"7480000000000004FF5200000000000000F8","7480000000000004FF5400000000000000F8" +1973,"7480000000000004FF5400000000000000F8","7480000000000004FF5600000000000000F8" +1971,"7480000000000004FF5600000000000000F8","7480000000000004FF5700000000000000F8" +1975,"7480000000000004FF5700000000000000F8","7480000000000004FF5A00000000000000F8" +1977,"7480000000000004FF5A00000000000000F8","7480000000000004FF5C00000000000000F8" +1979,"7480000000000004FF5C00000000000000F8","7480000000000004FF5E00000000000000F8" +1983,"7480000000000004FF5E00000000000000F8","7480000000000004FF6000000000000000F8" +1981,"7480000000000004FF6000000000000000F8","7480000000000004FF6100000000000000F8" +1985,"7480000000000004FF6100000000000000F8","7480000000000004FF6400000000000000F8" +1987,"7480000000000004FF6400000000000000F8","7480000000000004FF6600000000000000F8" +1989,"7480000000000004FF6600000000000000F8","7480000000000004FF6800000000000000F8" +1991,"7480000000000004FF6800000000000000F8","7480000000000004FF6A00000000000000F8" +1995,"7480000000000004FF6A00000000000000F8","7480000000000004FF6C00000000000000F8" +1993,"7480000000000004FF6C00000000000000F8","7480000000000004FF6D00000000000000F8" +1997,"7480000000000004FF6D00000000000000F8","7480000000000004FF7000000000000000F8" +1999,"7480000000000004FF7000000000000000F8","7480000000000004FF7200000000000000F8" +2001,"7480000000000004FF7200000000000000F8","7480000000000004FF7400000000000000F8" +2003,"7480000000000004FF7400000000000000F8","7480000000000004FF7600000000000000F8" +2005,"7480000000000004FF7600000000000000F8","7480000000000004FF7800000000000000F8" +2011,"7480000000000004FF7800000000000000F8","7480000000000004FF7A00000000000000F8" +2007,"7480000000000004FF7A00000000000000F8","7480000000000004FF7C00000000000000F8" +2013,"7480000000000004FF7C00000000000000F8","7480000000000004FF7E00000000000000F8" +2015,"7480000000000004FF7E00000000000000F8","7480000000000004FF8000000000000000F8" +2019,"7480000000000004FF8000000000000000F8","7480000000000004FF8200000000000000F8" +2017,"7480000000000004FF8200000000000000F8","7480000000000004FF8300000000000000F8" +2021,"7480000000000004FF8300000000000000F8","7480000000000004FF8600000000000000F8" +2023,"7480000000000004FF8600000000000000F8","7480000000000004FF8800000000000000F8" +2025,"7480000000000004FF8800000000000000F8","7480000000000004FF8A00000000000000F8" +2027,"7480000000000004FF8A00000000000000F8","7480000000000004FF8C00000000000000F8" +2029,"7480000000000004FF8C00000000000000F8","7480000000000004FF8E00000000000000F8" +2033,"7480000000000004FF8E00000000000000F8","7480000000000004FF9000000000000000F8" +2035,"7480000000000004FF9000000000000000F8","7480000000000004FF9200000000000000F8" +2037,"7480000000000004FF9200000000000000F8","7480000000000004FF9400000000000000F8" +2039,"7480000000000004FF9400000000000000F8","7480000000000004FF9600000000000000F8" +2041,"7480000000000004FF9600000000000000F8","7480000000000004FF9800000000000000F8" +2047,"7480000000000004FF9800000000000000F8","7480000000000004FF9A00000000000000F8" +2043,"7480000000000004FF9A00000000000000F8","7480000000000004FF9B00000000000000F8" +2049,"7480000000000004FF9B00000000000000F8","7480000000000004FF9E00000000000000F8" +2051,"7480000000000004FF9E00000000000000F8","7480000000000004FFA000000000000000F8" +2055,"7480000000000004FFA000000000000000F8","7480000000000004FFA200000000000000F8" +2053,"7480000000000004FFA200000000000000F8","7480000000000004FFA300000000000000F8" +2057,"7480000000000004FFA300000000000000F8","7480000000000004FFA600000000000000F8" +2061,"7480000000000004FFA600000000000000F8","7480000000000004FFA800000000000000F8" +2063,"7480000000000004FFA800000000000000F8","7480000000000004FFAA00000000000000F8" +2065,"7480000000000004FFAA00000000000000F8","7480000000000004FFAC00000000000000F8" +2075,"7480000000000004FFAC00000000000000F8","7480000000000004FFAE00000000000000F8" +2059,"7480000000000004FFAE00000000000000F8","7480000000000004FFAF00000000000000F8" +2073,"7480000000000004FFAF00000000000000F8","7480000000000004FFB200000000000000F8" +2067,"7480000000000004FFB200000000000000F8","7480000000000004FFB400000000000000F8" +2069,"7480000000000004FFB400000000000000F8","7480000000000004FFB600000000000000F8" +2071,"7480000000000004FFB600000000000000F8","7480000000000004FFB800000000000000F8" +2077,"7480000000000004FFB800000000000000F8","7480000000000004FFBA00000000000000F8" +2081,"7480000000000004FFBA00000000000000F8","7480000000000004FFBB00000000000000F8" +2083,"7480000000000004FFBB00000000000000F8","7480000000000004FFBE00000000000000F8" +2085,"7480000000000004FFBE00000000000000F8","7480000000000004FFC000000000000000F8" +2087,"7480000000000004FFC000000000000000F8","7480000000000004FFC200000000000000F8" +2089,"7480000000000004FFC200000000000000F8","7480000000000004FFC400000000000000F8" +2099,"7480000000000004FFC400000000000000F8","7480000000000004FFC600000000000000F8" +2103,"7480000000000004FFC600000000000000F8","7480000000000004FFC800000000000000F8" +2091,"7480000000000004FFC800000000000000F8","7480000000000004FFCA00000000000000F8" +2097,"7480000000000004FFCA00000000000000F8","7480000000000004FFCC00000000000000F8" +2105,"7480000000000004FFCC00000000000000F8","7480000000000004FFCE00000000000000F8" +2107,"7480000000000004FFCE00000000000000F8","7480000000000004FFD000000000000000F8" +2109,"7480000000000004FFD000000000000000F8","7480000000000004FFD200000000000000F8" +2111,"7480000000000004FFD200000000000000F8","7480000000000004FFD400000000000000F8" +2123,"7480000000000004FFD400000000000000F8","7480000000000004FFD600000000000000F8" +2115,"7480000000000004FFD600000000000000F8","7480000000000004FFD700000000000000F8" +2121,"7480000000000004FFD700000000000000F8","7480000000000004FFDA00000000000000F8" +2113,"7480000000000004FFDA00000000000000F8","7480000000000004FFDB00000000000000F8" +2125,"7480000000000004FFDB00000000000000F8","7480000000000004FFDE00000000000000F8" +2127,"7480000000000004FFDE00000000000000F8","7480000000000004FFE000000000000000F8" +2129,"7480000000000004FFE000000000000000F8","7480000000000004FFE200000000000000F8" +2131,"7480000000000004FFE200000000000000F8","7480000000000004FFE400000000000000F8" +2179,"7480000000000004FFE400000000000000F8","7480000000000004FFE600000000000000F8" +2169,"7480000000000004FFE600000000000000F8","7480000000000004FFE700000000000000F8" +2177,"7480000000000004FFE700000000000000F8","7480000000000004FFE800000000000000F8" +2191,"7480000000000004FFE800000000000000F8","7480000000000004FFE900000000000000F8" +2181,"7480000000000004FFE900000000000000F8","7480000000000004FFEA00000000000000F8" +2173,"7480000000000004FFEA00000000000000F8","7480000000000004FFEB00000000000000F8" +2189,"7480000000000004FFEB00000000000000F8","7480000000000004FFEC00000000000000F8" +2185,"7480000000000004FFEC00000000000000F8","7480000000000004FFED00000000000000F8" +2163,"7480000000000004FFED00000000000000F8","7480000000000004FFEE00000000000000F8" +2133,"7480000000000004FFEE00000000000000F8","7480000000000004FFEF00000000000000F8" +2161,"7480000000000004FFEF00000000000000F8","7480000000000004FFF100000000000000F8" +2135,"7480000000000004FFF100000000000000F8","7480000000000004FFF200000000000000F8" +2137,"7480000000000004FFF200000000000000F8","7480000000000004FFF400000000000000F8" +2145,"7480000000000004FFF400000000000000F8","7480000000000004FFF600000000000000F8" +2141,"7480000000000004FFF600000000000000F8","7480000000000004FFF700000000000000F8" +2139,"7480000000000004FFF700000000000000F8","7480000000000004FFF800000000000000F8" +2143,"7480000000000004FFF800000000000000F8","7480000000000004FFFB00000000000000F8" +2147,"7480000000000004FFFB00000000000000F8","7480000000000004FFFE00000000000000F8" +2149,"7480000000000004FFFE00000000000000F8","7480000000000005FF0000000000000000F8" +2171,"7480000000000005FF0000000000000000F8","7480000000000005FF0200000000000000F8" +2151,"7480000000000005FF0200000000000000F8","7480000000000005FF0300000000000000F8" +2157,"7480000000000005FF0300000000000000F8","7480000000000005FF0400000000000000F8" +2153,"7480000000000005FF0400000000000000F8","7480000000000005FF0500000000000000F8" +2155,"7480000000000005FF0500000000000000F8","7480000000000005FF0800000000000000F8" +2159,"7480000000000005FF0800000000000000F8","7480000000000005FF0B00000000000000F8" +2165,"7480000000000005FF0B00000000000000F8","7480000000000005FF0E00000000000000F8" +2167,"7480000000000005FF0E00000000000000F8","7480000000000005FF1100000000000000F8" +2183,"7480000000000005FF1100000000000000F8","7480000000000005FF1900000000000000F8" +2193,"7480000000000005FF1900000000000000F8","7480000000000005FF1E00000000000000F8" +2195,"7480000000000005FF1E00000000000000F8","7480000000000005FF2000000000000000F8" +2197,"7480000000000005FF2000000000000000F8","7480000000000005FF2200000000000000F8" +2199,"7480000000000005FF2200000000000000F8","7480000000000005FF2400000000000000F8" +2241,"7480000000000005FF2400000000000000F8","7480000000000005FF2500000000000000F8" +2235,"7480000000000005FF2500000000000000F8","7480000000000005FF2700000000000000F8" +2245,"7480000000000005FF2700000000000000F8","7480000000000005FF2800000000000000F8" +2203,"7480000000000005FF2800000000000000F8","7480000000000005FF2900000000000000F8" +2231,"7480000000000005FF2900000000000000F8","7480000000000005FF2A00000000000000F8" +2201,"7480000000000005FF2A00000000000000F8","7480000000000005FF2B00000000000000F8" +2221,"7480000000000005FF2B00000000000000F8","7480000000000005FF2E00000000000000F8" +2253,"7480000000000005FF2E00000000000000F8","7480000000000005FF2F00000000000000F8" +2229,"7480000000000005FF2F00000000000000F8","7480000000000005FF3000000000000000F8" +2247,"7480000000000005FF3000000000000000F8","7480000000000005FF3100000000000000F8" +2239,"7480000000000005FF3100000000000000F8","7480000000000005FF3200000000000000F8" +2205,"7480000000000005FF3200000000000000F8","7480000000000005FF3300000000000000F8" +2207,"7480000000000005FF3300000000000000F8","7480000000000005FF3400000000000000F8" +2211,"7480000000000005FF3400000000000000F8","7480000000000005FF3600000000000000F8" +2249,"7480000000000005FF3600000000000000F8","7480000000000005FF3700000000000000F8" +2209,"7480000000000005FF3700000000000000F8","7480000000000005FF3900000000000000F8" +2225,"7480000000000005FF3900000000000000F8","7480000000000005FF3C00000000000000F8" +2223,"7480000000000005FF3C00000000000000F8","7480000000000005FF3D00000000000000F8" +2219,"7480000000000005FF3D00000000000000F8","7480000000000005FF3E00000000000000F8" +2227,"7480000000000005FF3E00000000000000F8","7480000000000005FF3F00000000000000F8" +2213,"7480000000000005FF3F00000000000000F8","7480000000000005FF4000000000000000F8" +2215,"7480000000000005FF4000000000000000F8","7480000000000005FF4200000000000000F8" +2217,"7480000000000005FF4200000000000000F8","7480000000000005FF4400000000000000F8" +2243,"7480000000000005FF4400000000000000F8","7480000000000005FF5000000000000000F8" +2251,"7480000000000005FF5000000000000000F8","7480000000000005FF5500000000000000F8" +2255,"7480000000000005FF5500000000000000F8","7480000000000005FF5800000000000000F8" +2257,"7480000000000005FF5800000000000000F8","7480000000000005FF5A00000000000000F8" +2259,"7480000000000005FF5A00000000000000F8","7480000000000005FF5C00000000000000F8" +2265,"7480000000000005FF5C00000000000000F8","7480000000000005FF5E00000000000000F8" +2333,"7480000000000005FF5E00000000000000F8","7480000000000005FF6000000000000000F8" +2329,"7480000000000005FF6000000000000000F8","7480000000000005FF6100000000000000F8" +2291,"7480000000000005FF6100000000000000F8","7480000000000005FF6200000000000000F8" +2261,"7480000000000005FF6200000000000000F8","7480000000000005FF6300000000000000F8" +2355,"7480000000000005FF6300000000000000F8","7480000000000005FF6500000000000000F8" +2325,"7480000000000005FF6500000000000000F8","7480000000000005FF6600000000000000F8" +2263,"7480000000000005FF6600000000000000F8","7480000000000005FF6700000000000000F8" +2351,"7480000000000005FF6700000000000000F8","7480000000000005FF6800000000000000F8" +2315,"7480000000000005FF6800000000000000F8","7480000000000005FF6900000000000000F8" +2345,"7480000000000005FF6900000000000000F8","7480000000000005FF6B00000000000000F8" +2341,"7480000000000005FF6B00000000000000F8","7480000000000005FF6C00000000000000F8" +2269,"7480000000000005FF6C00000000000000F8","7480000000000005FF6D00000000000000F8" +2331,"7480000000000005FF6D00000000000000F8","7480000000000005FF6E00000000000000F8" +2267,"7480000000000005FF6E00000000000000F8","7480000000000005FF6F00000000000000F8" +2271,"7480000000000005FF6F00000000000000F8","7480000000000005FF7100000000000000F8" +2299,"7480000000000005FF7100000000000000F8","7480000000000005FF7400000000000000F8" +2273,"7480000000000005FF7400000000000000F8","7480000000000005FF7500000000000000F8" +2293,"7480000000000005FF7500000000000000F8","7480000000000005FF7700000000000000F8" +2275,"7480000000000005FF7700000000000000F8","7480000000000005FF7800000000000000F8" +2277,"7480000000000005FF7800000000000000F8","7480000000000005FF7A00000000000000F8" +2279,"7480000000000005FF7A00000000000000F8","7480000000000005FF7C00000000000000F8" +2281,"7480000000000005FF7C00000000000000F8","7480000000000005FF7E00000000000000F8" +2287,"7480000000000005FF7E00000000000000F8","7480000000000005FF8000000000000000F8" +2283,"7480000000000005FF8000000000000000F8","7480000000000005FF8100000000000000F8" +2289,"7480000000000005FF8100000000000000F8","7480000000000005FF8300000000000000F8" +2285,"7480000000000005FF8300000000000000F8","7480000000000005FF8400000000000000F8" +2309,"7480000000000005FF8400000000000000F8","7480000000000005FF8A00000000000000F8" +2295,"7480000000000005FF8A00000000000000F8","7480000000000005FF8B00000000000000F8" +2311,"7480000000000005FF8B00000000000000F8","7480000000000005FF8D00000000000000F8" +2297,"7480000000000005FF8D00000000000000F8","7480000000000005FF8E00000000000000F8" +2301,"7480000000000005FF8E00000000000000F8","7480000000000005FF9000000000000000F8" +2307,"7480000000000005FF9000000000000000F8","7480000000000005FF9100000000000000F8" +2305,"7480000000000005FF9100000000000000F8","7480000000000005FF9200000000000000F8" +2303,"7480000000000005FF9200000000000000F8","7480000000000005FF9500000000000000F8" +2339,"7480000000000005FF9500000000000000F8","7480000000000005FF9B00000000000000F8" +2349,"7480000000000005FF9B00000000000000F8","7480000000000005FF9C00000000000000F8" +2361,"7480000000000005FF9C00000000000000F8","7480000000000005FF9D00000000000000F8" +2313,"7480000000000005FF9D00000000000000F8","7480000000000005FF9E00000000000000F8" +2317,"7480000000000005FF9E00000000000000F8","7480000000000005FFA000000000000000F8" +2347,"7480000000000005FFA000000000000000F8","7480000000000005FFA100000000000000F8" +2321,"7480000000000005FFA100000000000000F8","7480000000000005FFA400000000000000F8" +2319,"7480000000000005FFA400000000000000F8","7480000000000005FFA500000000000000F8" +2337,"7480000000000005FFA500000000000000F8","7480000000000005FFA700000000000000F8" +2323,"7480000000000005FFA700000000000000F8","7480000000000005FFA800000000000000F8" +2327,"7480000000000005FFA800000000000000F8","7480000000000005FFAB00000000000000F8" +2335,"7480000000000005FFAB00000000000000F8","7480000000000005FFB000000000000000F8" +2343,"7480000000000005FFB000000000000000F8","7480000000000005FFB500000000000000F8" +2353,"7480000000000005FFB500000000000000F8","7480000000000005FFBD00000000000000F8" +2357,"7480000000000005FFBD00000000000000F8","7480000000000005FFC000000000000000F8" +2359,"7480000000000005FFC000000000000000F8","7480000000000005FFC200000000000000F8" +2363,"7480000000000005FFC200000000000000F8","7480000000000005FFC400000000000000F8" +2365,"7480000000000005FFC400000000000000F8","7480000000000005FFC600000000000000F8" +2367,"7480000000000005FFC600000000000000F8","7480000000000005FFC800000000000000F8" +2369,"7480000000000005FFC800000000000000F8","7480000000000005FFCA00000000000000F8" +2377,"7480000000000005FFCA00000000000000F8","7480000000000005FFCC00000000000000F8" +2373,"7480000000000005FFCC00000000000000F8","7480000000000005FFCD00000000000000F8" +2371,"7480000000000005FFCD00000000000000F8","7480000000000005FFCE00000000000000F8" +2379,"7480000000000005FFCE00000000000000F8","7480000000000005FFD200000000000000F8" +2381,"7480000000000005FFD200000000000000F8","7480000000000005FFD400000000000000F8" +2383,"7480000000000005FFD400000000000000F8","7480000000000005FFD600000000000000F8" +2385,"7480000000000005FFD600000000000000F8","7480000000000005FFD800000000000000F8" +2391,"7480000000000005FFD800000000000000F8","7480000000000005FFDA00000000000000F8" +2395,"7480000000000005FFDA00000000000000F8","7480000000000005FFDB00000000000000F8" +2397,"7480000000000005FFDB00000000000000F8","7480000000000005FFDE00000000000000F8" +2399,"7480000000000005FFDE00000000000000F8","7480000000000005FFE000000000000000F8" +2401,"7480000000000005FFE000000000000000F8","7480000000000005FFE200000000000000F8" +2403,"7480000000000005FFE200000000000000F8","7480000000000005FFE400000000000000F8" +2405,"7480000000000005FFE400000000000000F8","7480000000000005FFE600000000000000F8" +2409,"7480000000000005FFE600000000000000F8","7480000000000005FFE800000000000000F8" +2411,"7480000000000005FFE800000000000000F8","7480000000000005FFEA00000000000000F8" +2413,"7480000000000005FFEA00000000000000F8","7480000000000005FFEC00000000000000F8" +2407,"7480000000000005FFEC00000000000000F8","7480000000000005FFED00000000000000F8" +2415,"7480000000000005FFED00000000000000F8","7480000000000005FFF000000000000000F8" +2417,"7480000000000005FFF000000000000000F8","7480000000000005FFF200000000000000F8" +2421,"7480000000000005FFF200000000000000F8","7480000000000005FFF400000000000000F8" +2419,"7480000000000005FFF400000000000000F8","7480000000000005FFF600000000000000F8" +2429,"7480000000000005FFF600000000000000F8","7480000000000005FFF800000000000000F8" +2425,"7480000000000005FFF800000000000000F8","7480000000000005FFF900000000000000F8" +2423,"7480000000000005FFF900000000000000F8","7480000000000005FFFB00000000000000F8" +2431,"7480000000000005FFFB00000000000000F8","7480000000000005FFFE00000000000000F8" +2433,"7480000000000005FFFE00000000000000F8","7480000000000006FF0000000000000000F8" +2435,"7480000000000006FF0000000000000000F8","7480000000000006FF0200000000000000F8" +2437,"7480000000000006FF0200000000000000F8","7480000000000006FF0400000000000000F8" +2439,"7480000000000006FF0400000000000000F8","7480000000000006FF0600000000000000F8" +2441,"7480000000000006FF0600000000000000F8","7480000000000006FF0800000000000000F8" +2443,"7480000000000006FF0800000000000000F8","7480000000000006FF0A00000000000000F8" +2445,"7480000000000006FF0A00000000000000F8","7480000000000006FF0C00000000000000F8" +2449,"7480000000000006FF0C00000000000000F8","7480000000000006FF0E00000000000000F8" +2447,"7480000000000006FF0E00000000000000F8","7480000000000006FF0F00000000000000F8" +2451,"7480000000000006FF0F00000000000000F8","7480000000000006FF1200000000000000F8" +2453,"7480000000000006FF1200000000000000F8","7480000000000006FF1400000000000000F8" +2459,"7480000000000006FF1400000000000000F8","7480000000000006FF1600000000000000F8" +2461,"7480000000000006FF1600000000000000F8","7480000000000006FF1800000000000000F8" +2469,"7480000000000006FF1800000000000000F8","7480000000000006FF1A00000000000000F8" +2463,"7480000000000006FF1A00000000000000F8","7480000000000006FF1B00000000000000F8" +2455,"7480000000000006FF1B00000000000000F8","7480000000000006FF1C00000000000000F8" +2457,"7480000000000006FF1C00000000000000F8","7480000000000006FF1D00000000000000F8" +2465,"7480000000000006FF1D00000000000000F8","7480000000000006FF2100000000000000F8" +2467,"7480000000000006FF2100000000000000F8","7480000000000006FF2300000000000000F8" +2475,"7480000000000006FF2300000000000000F8","7480000000000006FF2600000000000000F8" +2471,"7480000000000006FF2600000000000000F8","7480000000000006FF2800000000000000F8" +2477,"7480000000000006FF2800000000000000F8","7480000000000006FF2A00000000000000F8" +2479,"7480000000000006FF2A00000000000000F8","7480000000000006FF2C00000000000000F8" +2481,"7480000000000006FF2C00000000000000F8","7480000000000006FF2E00000000000000F8" +2483,"7480000000000006FF2E00000000000000F8","7480000000000006FF3000000000000000F8" +2485,"7480000000000006FF3000000000000000F8","7480000000000006FF3200000000000000F8" +2487,"7480000000000006FF3200000000000000F8","7480000000000006FF3400000000000000F8" +2495,"7480000000000006FF3400000000000000F8","7480000000000006FF3600000000000000F8" +2489,"7480000000000006FF3600000000000000F8","7480000000000006FF3700000000000000F8" +2497,"7480000000000006FF3700000000000000F8","7480000000000006FF3A00000000000000F8" +2499,"7480000000000006FF3A00000000000000F8","7480000000000006FF3C00000000000000F8" +2491,"7480000000000006FF3C00000000000000F8","7480000000000006FF3E00000000000000F8" +2513,"7480000000000006FF3E00000000000000F8","7480000000000006FF4000000000000000F8" +2501,"7480000000000006FF4000000000000000F8","7480000000000006FF4100000000000000F8" +2507,"7480000000000006FF4100000000000000F8","7480000000000006FF4300000000000000F8" +2511,"7480000000000006FF4300000000000000F8","7480000000000006FF4400000000000000F8" +2503,"7480000000000006FF4400000000000000F8","7480000000000006FF4500000000000000F8" +2505,"7480000000000006FF4500000000000000F8","7480000000000006FF4700000000000000F8" +2515,"7480000000000006FF4700000000000000F8","7480000000000006FF4C00000000000000F8" +2517,"7480000000000006FF4C00000000000000F8","7480000000000006FF4E00000000000000F8" +2519,"7480000000000006FF4E00000000000000F8","7480000000000006FF5000000000000000F8" +2521,"7480000000000006FF5000000000000000F8","7480000000000006FF5200000000000000F8" +2523,"7480000000000006FF5200000000000000F8","7480000000000006FF5400000000000000F8" +2525,"7480000000000006FF5400000000000000F8","7480000000000006FF5600000000000000F8" +2531,"7480000000000006FF5600000000000000F8","7480000000000006FF5800000000000000F8" +2527,"7480000000000006FF5800000000000000F8","7480000000000006FF5900000000000000F8" +2549,"7480000000000006FF5900000000000000F8","7480000000000006FF5B00000000000000F8" +2529,"7480000000000006FF5B00000000000000F8","7480000000000006FF5C00000000000000F8" +2547,"7480000000000006FF5C00000000000000F8","7480000000000006FF5F00000000000000F8" +2563,"7480000000000006FF5F00000000000000F8","7480000000000006FF6000000000000000F8" +2533,"7480000000000006FF6000000000000000F8","7480000000000006FF6100000000000000F8" +2553,"7480000000000006FF6100000000000000F8","7480000000000006FF6200000000000000F8" +2555,"7480000000000006FF6200000000000000F8","7480000000000006FF6400000000000000F8" +2567,"7480000000000006FF6400000000000000F8","7480000000000006FF6500000000000000F8" +2557,"7480000000000006FF6500000000000000F8","7480000000000006FF6600000000000000F8" +2559,"7480000000000006FF6600000000000000F8","7480000000000006FF6700000000000000F8" +2565,"7480000000000006FF6700000000000000F8","7480000000000006FF6800000000000000F8" +2561,"7480000000000006FF6800000000000000F8","7480000000000006FF6900000000000000F8" +2545,"7480000000000006FF6900000000000000F8","7480000000000006FF6A00000000000000F8" +2541,"7480000000000006FF6A00000000000000F8","7480000000000006FF6B00000000000000F8" +2535,"7480000000000006FF6B00000000000000F8","7480000000000006FF6C00000000000000F8" +2537,"7480000000000006FF6C00000000000000F8","7480000000000006FF6E00000000000000F8" +2539,"7480000000000006FF6E00000000000000F8","7480000000000006FF7000000000000000F8" +2543,"7480000000000006FF7000000000000000F8","7480000000000006FF7300000000000000F8" +2551,"7480000000000006FF7300000000000000F8","7480000000000006FF7800000000000000F8" +2571,"7480000000000006FF7800000000000000F8","7480000000000006FF8200000000000000F8" +2573,"7480000000000006FF8200000000000000F8","7480000000000006FF8400000000000000F8" +2575,"7480000000000006FF8400000000000000F8","7480000000000006FF8600000000000000F8" +2569,"7480000000000006FF8600000000000000F8","7480000000000006FF8800000000000000F8" +2577,"7480000000000006FF8800000000000000F8","7480000000000006FF8A00000000000000F8" +2579,"7480000000000006FF8A00000000000000F8","7480000000000006FF8C00000000000000F8" +2583,"7480000000000006FF8C00000000000000F8","7480000000000006FF8D00000000000000F8" +2589,"7480000000000006FF8D00000000000000F8","7480000000000006FF9000000000000000F8" +2585,"7480000000000006FF9000000000000000F8","7480000000000006FF9100000000000000F8" +2591,"7480000000000006FF9100000000000000F8","7480000000000006FF9400000000000000F8" +2593,"7480000000000006FF9400000000000000F8","7480000000000006FF9600000000000000F8" +2595,"7480000000000006FF9600000000000000F8","7480000000000006FF9800000000000000F8" +2599,"7480000000000006FF9800000000000000F8","7480000000000006FF9A00000000000000F8" +2587,"7480000000000006FF9A00000000000000F8","7480000000000006FF9C00000000000000F8" +2603,"7480000000000006FF9C00000000000000F8","7480000000000006FF9E00000000000000F8" +2605,"7480000000000006FF9E00000000000000F8","7480000000000006FFA000000000000000F8" +2607,"7480000000000006FFA000000000000000F8","7480000000000006FFA200000000000000F8" +2609,"7480000000000006FFA200000000000000F8","7480000000000006FFA300000000000000F8" +2597,"7480000000000006FFA300000000000000F8","7480000000000006FFA400000000000000F8" +2601,"7480000000000006FFA400000000000000F8","7480000000000006FFA600000000000000F8" +2611,"7480000000000006FFA600000000000000F8","7480000000000006FFA900000000000000F8" +2615,"7480000000000006FFA900000000000000F8","7480000000000006FFAC00000000000000F8" +2613,"7480000000000006FFAC00000000000000F8","7480000000000006FFAD00000000000000F8" +2617,"7480000000000006FFAD00000000000000F8","7480000000000006FFB000000000000000F8" +2619,"7480000000000006FFB000000000000000F8","7480000000000006FFB200000000000000F8" +2625,"7480000000000006FFB200000000000000F8","7480000000000006FFB400000000000000F8" +2621,"7480000000000006FFB400000000000000F8","7480000000000006FFB600000000000000F8" +2627,"7480000000000006FFB600000000000000F8","7480000000000006FFB800000000000000F8" +2629,"7480000000000006FFB800000000000000F8","7480000000000006FFBA00000000000000F8" +2637,"7480000000000006FFBA00000000000000F8","7480000000000006FFBC00000000000000F8" +2639,"7480000000000006FFBC00000000000000F8","7480000000000006FFBE00000000000000F8" +2633,"7480000000000006FFBE00000000000000F8","7480000000000006FFC000000000000000F8" +2641,"7480000000000006FFC000000000000000F8","7480000000000006FFC100000000000000F8" +2631,"7480000000000006FFC100000000000000F8","7480000000000006FFC200000000000000F8" +2693,"7480000000000006FFC200000000000000F8","7480000000000006FFC500000000000000F8" +2667,"7480000000000006FFC500000000000000F8","7480000000000006FFC700000000000000F8" +2643,"7480000000000006FFC700000000000000F8","7480000000000006FFC800000000000000F8" +2671,"7480000000000006FFC800000000000000F8","7480000000000006FFC900000000000000F8" +2711,"7480000000000006FFC900000000000000F8","7480000000000006FFCA00000000000000F8" +2645,"7480000000000006FFCA00000000000000F8","7480000000000006FFCB00000000000000F8" +2705,"7480000000000006FFCB00000000000000F8","7480000000000006FFCE00000000000000F8" +2707,"7480000000000006FFCE00000000000000F8","7480000000000006FFCF00000000000000F8" +2647,"7480000000000006FFCF00000000000000F8","7480000000000006FFD000000000000000F8" +2701,"7480000000000006FFD000000000000000F8","7480000000000006FFD100000000000000F8" +2695,"7480000000000006FFD100000000000000F8","7480000000000006FFD300000000000000F8" +2709,"7480000000000006FFD300000000000000F8","7480000000000006FFD400000000000000F8" +2651,"7480000000000006FFD400000000000000F8","7480000000000006FFD500000000000000F8" +2665,"7480000000000006FFD500000000000000F8","7480000000000006FFD600000000000000F8" +2649,"7480000000000006FFD600000000000000F8","7480000000000006FFD700000000000000F8" +2653,"7480000000000006FFD700000000000000F8","7480000000000006FFDA00000000000000F8" +2679,"7480000000000006FFDA00000000000000F8","7480000000000006FFDB00000000000000F8" +2657,"7480000000000006FFDB00000000000000F8","7480000000000006FFDD00000000000000F8" +2655,"7480000000000006FFDD00000000000000F8","7480000000000006FFDE00000000000000F8" +2691,"7480000000000006FFDE00000000000000F8","7480000000000006FFE100000000000000F8" +2699,"7480000000000006FFE100000000000000F8","7480000000000006FFE200000000000000F8" +2659,"7480000000000006FFE200000000000000F8","7480000000000006FFE300000000000000F8" +2663,"7480000000000006FFE300000000000000F8","7480000000000006FFE500000000000000F8" +2661,"7480000000000006FFE500000000000000F8","7480000000000006FFE600000000000000F8" +2669,"7480000000000006FFE600000000000000F8","7480000000000006FFEB00000000000000F8" +2683,"7480000000000006FFEB00000000000000F8","7480000000000006FFEE00000000000000F8" +2697,"7480000000000006FFEE00000000000000F8","7480000000000006FFEF00000000000000F8" +2681,"7480000000000006FFEF00000000000000F8","7480000000000006FFF000000000000000F8" +2703,"7480000000000006FFF000000000000000F8","7480000000000006FFF100000000000000F8" +2673,"7480000000000006FFF100000000000000F8","7480000000000006FFF200000000000000F8" +2675,"7480000000000006FFF200000000000000F8","7480000000000006FFF400000000000000F8" +2677,"7480000000000006FFF400000000000000F8","7480000000000006FFF600000000000000F8" +2687,"7480000000000006FFF600000000000000F8","7480000000000006FFFB00000000000000F8" +2685,"7480000000000006FFFB00000000000000F8","7480000000000006FFFC00000000000000F8" +2689,"7480000000000006FFFC00000000000000F8","7480000000000006FFFF00000000000000F8" +2713,"7480000000000006FFFF00000000000000F8","7480000000000007FF0C00000000000000F8" +2715,"7480000000000007FF0C00000000000000F8","7480000000000007FF0E00000000000000F8" +2717,"7480000000000007FF0E00000000000000F8","7480000000000007FF1000000000000000F8" +2719,"7480000000000007FF1000000000000000F8","7480000000000007FF1200000000000000F8" +2721,"7480000000000007FF1200000000000000F8","7480000000000007FF1400000000000000F8" +2723,"7480000000000007FF1400000000000000F8","7480000000000007FF1600000000000000F8" +2725,"7480000000000007FF1600000000000000F8","7480000000000007FF1800000000000000F8" +2727,"7480000000000007FF1800000000000000F8","7480000000000007FF1A00000000000000F8" +2729,"7480000000000007FF1A00000000000000F8","7480000000000007FF1C00000000000000F8" +2731,"7480000000000007FF1C00000000000000F8","7480000000000007FF1E00000000000000F8" +2733,"7480000000000007FF1E00000000000000F8","7480000000000007FF2000000000000000F8" +2735,"7480000000000007FF2000000000000000F8","7480000000000007FF2100000000000000F8" +2739,"7480000000000007FF2100000000000000F8","7480000000000007FF2400000000000000F8" +2741,"7480000000000007FF2400000000000000F8","7480000000000007FF2600000000000000F8" +2745,"7480000000000007FF2600000000000000F8","7480000000000007FF2800000000000000F8" +2743,"7480000000000007FF2800000000000000F8","7480000000000007FF2900000000000000F8" +2753,"7480000000000007FF2900000000000000F8","7480000000000007FF2C00000000000000F8" +2747,"7480000000000007FF2C00000000000000F8","7480000000000007FF2D00000000000000F8" +2751,"7480000000000007FF2D00000000000000F8","7480000000000007FF2F00000000000000F8" +2755,"7480000000000007FF2F00000000000000F8","7480000000000007FF3200000000000000F8" +2763,"7480000000000007FF3200000000000000F8","7480000000000007FF3400000000000000F8" +2765,"7480000000000007FF3400000000000000F8","7480000000000007FF3600000000000000F8" +2759,"7480000000000007FF3600000000000000F8","7480000000000007FF3800000000000000F8" +2757,"7480000000000007FF3800000000000000F8","7480000000000007FF3900000000000000F8" +2761,"7480000000000007FF3900000000000000F8","7480000000000007FF3B00000000000000F8" +2767,"7480000000000007FF3B00000000000000F8","7480000000000007FF3E00000000000000F8" +2769,"7480000000000007FF3E00000000000000F8","7480000000000007FF4000000000000000F8" +2773,"7480000000000007FF4000000000000000F8","7480000000000007FF4200000000000000F8" +2775,"7480000000000007FF4200000000000000F8","7480000000000007FF4300000000000000F8" +2771,"7480000000000007FF4300000000000000F8","7480000000000007FF4400000000000000F8" +2777,"7480000000000007FF4400000000000000F8","7480000000000007FF4700000000000000F8" +2783,"7480000000000007FF4700000000000000F8","7480000000000007FF4A00000000000000F8" +2779,"7480000000000007FF4A00000000000000F8","7480000000000007FF4C00000000000000F8" +2789,"7480000000000007FF4C00000000000000F8","7480000000000007FF4D00000000000000F8" +2787,"7480000000000007FF4D00000000000000F8","7480000000000007FF5000000000000000F8" +2797,"7480000000000007FF5000000000000000F8","7480000000000007FF5200000000000000F8" +2791,"7480000000000007FF5200000000000000F8","7480000000000007FF5400000000000000F8" +2793,"7480000000000007FF5400000000000000F8","7480000000000007FF5600000000000000F8" +2795,"7480000000000007FF5600000000000000F8","7480000000000007FF5800000000000000F8" +2799,"7480000000000007FF5800000000000000F8","7480000000000007FF5A00000000000000F8" +2801,"7480000000000007FF5A00000000000000F8","7480000000000007FF5C00000000000000F8" +2803,"7480000000000007FF5C00000000000000F8","7480000000000007FF5E00000000000000F8" +2805,"7480000000000007FF5E00000000000000F8","7480000000000007FF6000000000000000F8" +2807,"7480000000000007FF6000000000000000F8","7480000000000007FF6200000000000000F8" +2809,"7480000000000007FF6200000000000000F8","7480000000000007FF6400000000000000F8" +2811,"7480000000000007FF6400000000000000F8","7480000000000007FF6600000000000000F8" +2823,"7480000000000007FF6600000000000000F8","7480000000000007FF6800000000000000F8" +2813,"7480000000000007FF6800000000000000F8","7480000000000007FF6A00000000000000F8" +2815,"7480000000000007FF6A00000000000000F8","7480000000000007FF6B00000000000000F8" +2821,"7480000000000007FF6B00000000000000F8","7480000000000007FF6E00000000000000F8" +2817,"7480000000000007FF6E00000000000000F8","7480000000000007FF6F00000000000000F8" +2825,"7480000000000007FF6F00000000000000F8","7480000000000007FF7200000000000000F8" +2827,"7480000000000007FF7200000000000000F8","7480000000000007FF7400000000000000F8" +2829,"7480000000000007FF7400000000000000F8","7480000000000007FF7600000000000000F8" +2831,"7480000000000007FF7600000000000000F8","7480000000000007FF7800000000000000F8" +2833,"7480000000000007FF7800000000000000F8","7480000000000007FF7A00000000000000F8" +2839,"7480000000000007FF7A00000000000000F8","7480000000000007FF7B00000000000000F8" +2843,"7480000000000007FF7B00000000000000F8","7480000000000007FF7C00000000000000F8" +2837,"7480000000000007FF7C00000000000000F8","7480000000000007FF7E00000000000000F8" +2835,"7480000000000007FF7E00000000000000F8","7480000000000007FF8000000000000000F8" +2841,"7480000000000007FF8000000000000000F8","7480000000000007FF8300000000000000F8" +2845,"7480000000000007FF8300000000000000F8","7480000000000007FF8600000000000000F8" +2851,"7480000000000007FF8600000000000000F8","7480000000000007FF8800000000000000F8" +2849,"7480000000000007FF8800000000000000F8","7480000000000007FF8900000000000000F8" +2853,"7480000000000007FF8900000000000000F8","7480000000000007FF8C00000000000000F8" +2857,"7480000000000007FF8C00000000000000F8","7480000000000007FF8E00000000000000F8" +2859,"7480000000000007FF8E00000000000000F8","7480000000000007FF9000000000000000F8" +2861,"7480000000000007FF9000000000000000F8","7480000000000007FF9200000000000000F8" +2863,"7480000000000007FF9200000000000000F8","7480000000000007FF9400000000000000F8" +2865,"7480000000000007FF9400000000000000F8","7480000000000007FF9600000000000000F8" +2867,"7480000000000007FF9600000000000000F8","7480000000000007FF9800000000000000F8" +2869,"7480000000000007FF9800000000000000F8","7480000000000007FF9A00000000000000F8" +2871,"7480000000000007FF9A00000000000000F8","7480000000000007FF9C00000000000000F8" +2873,"7480000000000007FF9C00000000000000F8","7480000000000007FF9E00000000000000F8" +2875,"7480000000000007FF9E00000000000000F8","7480000000000007FFA000000000000000F8" +2879,"7480000000000007FFA000000000000000F8","7480000000000007FFA200000000000000F8" +2877,"7480000000000007FFA200000000000000F8","7480000000000007FFA300000000000000F8" +2881,"7480000000000007FFA300000000000000F8","7480000000000007FFA600000000000000F8" +2903,"7480000000000007FFA600000000000000F8","7480000000000007FFA800000000000000F8" +2895,"7480000000000007FFA800000000000000F8","7480000000000007FFA900000000000000F8" +2899,"7480000000000007FFA900000000000000F8","7480000000000007FFAA00000000000000F8" +2901,"7480000000000007FFAA00000000000000F8","7480000000000007FFAB00000000000000F8" +2891,"7480000000000007FFAB00000000000000F8","7480000000000007FFAC00000000000000F8" +2907,"7480000000000007FFAC00000000000000F8","7480000000000007FFAD00000000000000F8" +2909,"7480000000000007FFAD00000000000000F8","7480000000000007FFAE00000000000000F8" +2885,"7480000000000007FFAE00000000000000F8","7480000000000007FFAF00000000000000F8" +2905,"7480000000000007FFAF00000000000000F8","7480000000000007FFB000000000000000F8" +2883,"7480000000000007FFB000000000000000F8","7480000000000007FFB100000000000000F8" +2893,"7480000000000007FFB100000000000000F8","7480000000000007FFB300000000000000F8" +2897,"7480000000000007FFB300000000000000F8","7480000000000007FFB400000000000000F8" +2887,"7480000000000007FFB400000000000000F8","7480000000000007FFB500000000000000F8" +2889,"7480000000000007FFB500000000000000F8","7480000000000007FFB700000000000000F8" +2911,"7480000000000007FFB700000000000000F8","7480000000000007FFCB00000000000000F8" +2913,"7480000000000007FFCB00000000000000F8","7480000000000007FFCF00000000000000F8" +2915,"7480000000000007FFCF00000000000000F8","7480000000000007FFD100000000000000F8" +2917,"7480000000000007FFD100000000000000F8","7480000000000007FFD600000000000000F8" +2919,"7480000000000007FFD600000000000000F8","7480000000000007FFDF00000000000000F8" +2921,"7480000000000007FFDF00000000000000F8","7480000000000007FFE300000000000000F8" +2923,"7480000000000007FFE300000000000000F8","7480000000000007FFE500000000000000F8" +2925,"7480000000000007FFE500000000000000F8","7480000000000007FFEA00000000000000F8" +2927,"7480000000000007FFEA00000000000000F8","7480000000000007FFF700000000000000F8" +2929,"7480000000000007FFF700000000000000F8","7480000000000007FFFB00000000000000F8" +2931,"7480000000000007FFFB00000000000000F8","7480000000000008FF0000000000000000F8" +2933,"7480000000000008FF0000000000000000F8","7480000000000008FF0600000000000000F8" +2935,"7480000000000008FF0600000000000000F8","7480000000000008FF0E00000000000000F8" +2937,"7480000000000008FF0E00000000000000F8","7480000000000008FF1300000000000000F8" +2939,"7480000000000008FF1300000000000000F8","7480000000000008FF1800000000000000F8" +2941,"7480000000000008FF1800000000000000F8","7480000000000008FF1A00000000000000F8" +2943,"7480000000000008FF1A00000000000000F8","7480000000000008FF2200000000000000F8" +2945,"7480000000000008FF2200000000000000F8","7480000000000008FF2700000000000000F8" +2947,"7480000000000008FF2700000000000000F8","7480000000000008FF2E00000000000000F8" +2949,"7480000000000008FF2E00000000000000F8","7480000000000008FF3000000000000000F8" +4001,"7480000000000008FF3000000000000000F8","7480000000000008FF4300000000000000F8" +4003,"7480000000000008FF4300000000000000F8","7480000000000008FF4400000000000000F8" +4005,"7480000000000008FF4400000000000000F8","7480000000000008FF4500000000000000F8" +4007,"7480000000000008FF4500000000000000F8","7480000000000008FF4600000000000000F8" +4009,"7480000000000008FF4600000000000000F8","7480000000000008FF5000000000000000F8" +4017,"7480000000000008FF5000000000000000F8","7480000000000008FF505F728000000000FF0EA6010000000000FA" +4011,"7480000000000008FF505F728000000000FF0EA6010000000000FA","7480000000000008FF5100000000000000F8" +4019,"7480000000000008FF5100000000000000F8","7480000000000008FF515F728000000000FF2D2A810000000000FA" +4013,"7480000000000008FF515F728000000000FF2D2A810000000000FA","7480000000000008FF5200000000000000F8" +4021,"7480000000000008FF5200000000000000F8","7480000000000008FF525F728000000000FF4BAF010000000000FA" +4015,"7480000000000008FF525F728000000000FF4BAF010000000000FA","7480000000000008FF5300000000000000F8" +4023,"7480000000000008FF5300000000000000F8","7480000000000008FF535F728000000000FF6A33810000000000FA" +4025,"7480000000000008FF535F728000000000FF6A33810000000000FA","7480000000000008FF5500000000000000F8" +5001,"7480000000000008FF5500000000000000F8","7480000000000008FF5800000000000000F8" +5005,"7480000000000008FF5800000000000000F8","7480000000000008FF585F698000000000FF0000010380000000FF000EA60103800000FF00000EA601000000FC" +5009,"7480000000000008FF585F698000000000FF0000010380000000FF000EA60103800000FF00000EA601000000FC","7480000000000008FF585F698000000000FF0000010380000000FF001D4C0103800000FF00001D4C01000000FC" +5013,"7480000000000008FF585F698000000000FF0000010380000000FF001D4C0103800000FF00001D4C01000000FC","7480000000000008FF585F698000000000FF0000010380000000FF002BF20103800000FF00002BF201000000FC" +5017,"7480000000000008FF585F698000000000FF0000010380000000FF002BF20103800000FF00002BF201000000FC","7480000000000008FF585F698000000000FF0000010380000000FF003A980103800000FF00003A9801000000FC" +5021,"7480000000000008FF585F698000000000FF0000010380000000FF003A980103800000FF00003A9801000000FC","7480000000000008FF585F698000000000FF0000010380000000FF00493E0103800000FF0000493E01000000FC" +5025,"7480000000000008FF585F698000000000FF0000010380000000FF00493E0103800000FF0000493E01000000FC","7480000000000008FF585F698000000000FF0000010380000000FF0057E40103800000FF000057E401000000FC" +5029,"7480000000000008FF585F698000000000FF0000010380000000FF0057E40103800000FF000057E401000000FC","7480000000000008FF585F698000000000FF0000010380000000FF00668A0103800000FF0000668A01000000FC" +5003,"7480000000000008FF585F698000000000FF0000010380000000FF00668A0103800000FF0000668A01000000FC","7480000000000008FF585F728000000000FF013EB00000000000FA" +5007,"7480000000000008FF585F728000000000FF013EB00000000000FA","7480000000000008FF585F728000000000FF0FE4B00000000000FA" +5011,"7480000000000008FF585F728000000000FF0FE4B00000000000FA","7480000000000008FF585F728000000000FF1E8AB00000000000FA" +5015,"7480000000000008FF585F728000000000FF1E8AB00000000000FA","7480000000000008FF585F728000000000FF2D30B00000000000FA" +5019,"7480000000000008FF585F728000000000FF2D30B00000000000FA","7480000000000008FF585F728000000000FF3BD6B00000000000FA" +5023,"7480000000000008FF585F728000000000FF3BD6B00000000000FA","7480000000000008FF585F728000000000FF4A7CB00000000000FA" +5027,"7480000000000008FF585F728000000000FF4A7CB00000000000FA","7480000000000008FF585F728000000000FF5922B00000000000FA" +5031,"7480000000000008FF585F728000000000FF5922B00000000000FA","7480000000000008FF585F728000000000FF67C8B00000000000FA" +5033,"7480000000000008FF585F728000000000FF67C8B00000000000FA","7480000000000008FF5B00000000000000F8" +5043,"7480000000000008FF5B00000000000000F8","7480000000000008FF5B5F698000000000FF0000010380000000FF000EA60103800000FF00000EA601000000FC" +5041,"7480000000000008FF5B5F698000000000FF0000010380000000FF000EA60103800000FF00000EA601000000FC","7480000000000008FF5B5F728000000000FF02BF210000000000FA" +5045,"7480000000000008FF5B5F728000000000FF02BF210000000000FA","7480000000000008FF5B5F728000000000FF1165210000000000FA" +5035,"7480000000000008FF5B5F728000000000FF1165210000000000FA","7480000000000008FF5C00000000000000F8" +5049,"7480000000000008FF5C00000000000000F8","7480000000000008FF5C5F698000000000FF0000010380000000FF002D2A8103800000FF00002D2A81000000FC" +5047,"7480000000000008FF5C5F698000000000FF0000010380000000FF002D2A8103800000FF00002D2A81000000FC","7480000000000008FF5C5F728000000000FF2191C10000000000FA" +5051,"7480000000000008FF5C5F728000000000FF2191C10000000000FA","7480000000000008FF5C5F728000000000FF3037C10000000000FA" +5037,"7480000000000008FF5C5F728000000000FF3037C10000000000FA","7480000000000008FF5D00000000000000F8" +5057,"7480000000000008FF5D00000000000000F8","7480000000000008FF5D5F698000000000FF0000010380000000FF004BAF0103800000FF00004BAF01000000FC" +5053,"7480000000000008FF5D5F698000000000FF0000010380000000FF004BAF0103800000FF00004BAF01000000FC","7480000000000008FF5D5F728000000000FF3F7A010000000000FA" +5055,"7480000000000008FF5D5F728000000000FF3F7A010000000000FA","7480000000000008FF5D5F728000000000FF4E20010000000000FA" +5039,"7480000000000008FF5D5F728000000000FF4E20010000000000FA","7480000000000008FF5E00000000000000F8" +5061,"7480000000000008FF5E00000000000000F8","7480000000000008FF5E5F698000000000FF0000010380000000FF006A338103800000FF00006A3381000000FC" +5059,"7480000000000008FF5E5F698000000000FF0000010380000000FF006A338103800000FF00006A3381000000FC","7480000000000008FF5E5F728000000000FF5E25910000000000FA" +5063,"7480000000000008FF5E5F728000000000FF5E25910000000000FA","7480000000000008FF5E5F728000000000FF6CCB910000000000FA" +2,"7480000000000008FF5E5F728000000000FF6CCB910000000000FA","" diff --git a/v4/export/sql.go b/v4/export/sql.go index d40b4a1e..f6c1b80a 100644 --- a/v4/export/sql.go +++ b/v4/export/sql.go @@ -15,6 +15,8 @@ import ( tcontext "github.com/pingcap/dumpling/v4/context" "github.com/pingcap/errors" + "github.com/pingcap/parser/model" + "github.com/pingcap/tidb/store/helper" "go.uber.org/zap" ) @@ -473,6 +475,51 @@ func GetSpecifiedColumnValueAndClose(rows *sql.Rows, columnName string) ([]strin return strs, errors.Trace(rows.Err()) } +// GetSpecifiedColumnValuesAndClose get columns' values whose name is equal to columnName +func GetSpecifiedColumnValuesAndClose(rows *sql.Rows, columnName ...string) ([][]string, error) { + if rows == nil { + return [][]string{}, nil + } + defer rows.Close() + var strs [][]string + columns, err := rows.Columns() + if err != nil { + return strs, errors.Trace(err) + } + addr := make([]interface{}, len(columns)) + oneRow := make([]sql.NullString, len(columns)) + fieldIndexMp := make(map[int]int) + for i, col := range columns { + addr[i] = &oneRow[i] + for j, name := range columnName { + if strings.ToUpper(col) == name { + fieldIndexMp[i] = j + } + } + } + if len(fieldIndexMp) == 0 { + return strs, nil + } + for rows.Next() { + err := rows.Scan(addr...) + if err != nil { + return strs, errors.Trace(err) + } + written := false + tmpStr := make([]string, len(columnName)) + for colPos, namePos := range fieldIndexMp { + if oneRow[colPos].Valid { + written = true + tmpStr[namePos] = oneRow[colPos].String + } + } + if written { + strs = append(strs, tmpStr) + } + } + return strs, errors.Trace(rows.Err()) +} + // GetPdAddrs gets PD address from TiDB func GetPdAddrs(tctx *tcontext.Context, db *sql.DB) ([]string, error) { query := "SELECT * FROM information_schema.cluster_info where type = 'pd';" @@ -562,13 +609,7 @@ func resetDBWithSessionParams(tctx *tcontext.Context, db *sql.DB, dsn string, pa } newDB, err := sql.Open("mysql", dsn) - if err != nil { - return nil, errors.Trace(err) - } - - db.Close() - - return newDB, nil + return newDB, errors.Trace(err) } func createConnWithConsistency(ctx context.Context, db *sql.DB) (*sql.Conn, error) { @@ -816,18 +857,18 @@ func simpleQuery(conn *sql.Conn, sql string, handleOneRow func(*sql.Rows) error) func simpleQueryWithArgs(conn *sql.Conn, handleOneRow func(*sql.Rows) error, sql string, args ...interface{}) error { rows, err := conn.QueryContext(context.Background(), sql, args...) if err != nil { - return errors.Annotatef(err, "sql: %s", sql) + return errors.Annotatef(err, "sql: %s, args: %s", sql, args) } defer rows.Close() for rows.Next() { if err := handleOneRow(rows); err != nil { rows.Close() - return errors.Annotatef(err, "sql: %s", sql) + return errors.Annotatef(err, "sql: %s, args: %s", sql, args) } } rows.Close() - return errors.Annotatef(rows.Err(), "sql: %s", sql) + return errors.Annotatef(rows.Err(), "sql: %s, args: %s", sql, args) } func pickupPossibleField(dbName, tableName string, db *sql.Conn, conf *Config) (string, error) { @@ -1009,3 +1050,157 @@ func GetPartitionNames(db *sql.Conn, schema, table string) (partitions []string, }, "SELECT PARTITION_NAME from INFORMATION_SCHEMA.PARTITIONS WHERE TABLE_SCHEMA = ? AND TABLE_NAME = ?", schema, table) return } + +// GetPartitionTableIDs get partition tableIDs through histograms. +// SHOW STATS_HISTOGRAMS has db_name,table_name,partition_name but doesn't have partition id +// mysql.stats_histograms has partition_id but doesn't have db_name,table_name,partition_name +// So we combine the results from these two sqls to get partition ids for each table +// If UPDATE_TIME,DISTINCT_COUNT are equal, we assume these two records can represent one line. +// If histograms are not accurate or (UPDATE_TIME,DISTINCT_COUNT) has duplicate data, it's still fine. +// Because the possibility is low and the effect is that we will select more than one regions in one time, +// this will not affect the correctness of the dumping data and will not affect the memory usage much. +// This method is tricky, but no better way is found. +// Because TiDB v3.0.0's information_schema.partition table doesn't have partition name or partition id info +// return (dbName -> tbName -> partitionName -> partitionID, error) +func GetPartitionTableIDs(db *sql.Conn, tables map[string]map[string]struct{}) (map[string]map[string]map[string]int64, error) { + const ( + showStatsHistogramsSQL = "SHOW STATS_HISTOGRAMS" + selectStatsHistogramsSQL = "SELECT TABLE_ID,FROM_UNIXTIME(VERSION DIV 262144 DIV 1000,'%Y-%m-%d %H:%i:%s') AS UPDATE_TIME,DISTINCT_COUNT FROM mysql.stats_histograms" + ) + partitionIDs := make(map[string]map[string]map[string]int64, len(tables)) + rows, err := db.QueryContext(context.Background(), showStatsHistogramsSQL) + if err != nil { + return nil, errors.Annotatef(err, "sql: %s", showStatsHistogramsSQL) + } + results, err := GetSpecifiedColumnValuesAndClose(rows, "DB_NAME", "TABLE_NAME", "PARTITION_NAME", "UPDATE_TIME", "DISTINCT_COUNT") + if err != nil { + return nil, errors.Annotatef(err, "sql: %s", showStatsHistogramsSQL) + } + type partitionInfo struct { + dbName, tbName, partitionName string + } + saveMap := make(map[string]map[string]partitionInfo) + for _, oneRow := range results { + dbName, tbName, partitionName, updateTime, distinctCount := oneRow[0], oneRow[1], oneRow[2], oneRow[3], oneRow[4] + if len(partitionName) == 0 { + continue + } + if tbm, ok := tables[dbName]; ok { + if _, ok = tbm[tbName]; ok { + if _, ok = saveMap[updateTime]; !ok { + saveMap[updateTime] = make(map[string]partitionInfo) + } + saveMap[updateTime][distinctCount] = partitionInfo{ + dbName: dbName, + tbName: tbName, + partitionName: partitionName, + } + } + } + } + if len(saveMap) == 0 { + return map[string]map[string]map[string]int64{}, nil + } + err = simpleQuery(db, selectStatsHistogramsSQL, func(rows *sql.Rows) error { + var ( + tableID int64 + updateTime, distinctCount string + ) + err2 := rows.Scan(&tableID, &updateTime, &distinctCount) + if err2 != nil { + return errors.Trace(err2) + } + if mpt, ok := saveMap[updateTime]; ok { + if partition, ok := mpt[distinctCount]; ok { + dbName, tbName, partitionName := partition.dbName, partition.tbName, partition.partitionName + if _, ok := partitionIDs[dbName]; !ok { + partitionIDs[dbName] = make(map[string]map[string]int64) + } + if _, ok := partitionIDs[dbName][tbName]; !ok { + partitionIDs[dbName][tbName] = make(map[string]int64) + } + partitionIDs[dbName][tbName][partitionName] = tableID + } + } + return nil + }) + return partitionIDs, err +} + +// GetDBInfo get model.DBInfos from database sql interface. +// We need table_id to check whether a region belongs to this table +func GetDBInfo(db *sql.Conn, tables map[string]map[string]struct{}) ([]*model.DBInfo, error) { + const tableIDSQL = "SELECT TABLE_SCHEMA,TABLE_NAME,TIDB_TABLE_ID FROM INFORMATION_SCHEMA.TABLES ORDER BY TABLE_SCHEMA" + + schemas := make([]*model.DBInfo, 0, len(tables)) + var ( + tableSchema, tableName string + tidbTableID int64 + ) + partitionIDs, err := GetPartitionTableIDs(db, tables) + if err != nil { + return nil, err + } + err = simpleQuery(db, tableIDSQL, func(rows *sql.Rows) error { + err2 := rows.Scan(&tableSchema, &tableName, &tidbTableID) + if err2 != nil { + return errors.Trace(err2) + } + if tbm, ok := tables[tableSchema]; !ok { + return nil + } else if _, ok = tbm[tableName]; !ok { + return nil + } + last := len(schemas) - 1 + if last < 0 || schemas[last].Name.O != tableSchema { + schemas = append(schemas, &model.DBInfo{ + Name: model.CIStr{O: tableSchema}, + Tables: make([]*model.TableInfo, 0, len(tables[tableSchema])), + }) + last++ + } + var partition *model.PartitionInfo + if tbm, ok := partitionIDs[tableSchema]; ok { + if ptm, ok := tbm[tableName]; ok { + partition = &model.PartitionInfo{Definitions: make([]model.PartitionDefinition, 0, len(ptm))} + for partitionName, partitionID := range ptm { + partition.Definitions = append(partition.Definitions, model.PartitionDefinition{ + ID: partitionID, + Name: model.CIStr{O: partitionName}, + }) + } + } + } + schemas[last].Tables = append(schemas[last].Tables, &model.TableInfo{ + ID: tidbTableID, + Name: model.CIStr{O: tableName}, + Partition: partition, + }) + return nil + }) + return schemas, err +} + +// GetRegionInfos get region info including regionID, start key, end key from database sql interface. +// start key, end key includes information to help split table +func GetRegionInfos(db *sql.Conn) (*helper.RegionsInfo, error) { + const tableRegionSQL = "SELECT REGION_ID,START_KEY,END_KEY FROM INFORMATION_SCHEMA.TIKV_REGION_STATUS ORDER BY START_KEY;" + var ( + regionID int64 + startKey, endKey string + ) + regionsInfo := &helper.RegionsInfo{Regions: make([]helper.RegionInfo, 0)} + err := simpleQuery(db, tableRegionSQL, func(rows *sql.Rows) error { + err := rows.Scan(®ionID, &startKey, &endKey) + if err != nil { + return errors.Trace(err) + } + regionsInfo.Regions = append(regionsInfo.Regions, helper.RegionInfo{ + ID: regionID, + StartKey: startKey, + EndKey: endKey, + }) + return nil + }) + return regionsInfo, err +} diff --git a/v4/export/sql_test.go b/v4/export/sql_test.go index 4f12ed89..e0291999 100644 --- a/v4/export/sql_test.go +++ b/v4/export/sql_test.go @@ -6,7 +6,13 @@ import ( "context" "database/sql" "database/sql/driver" + "encoding/csv" "fmt" + "io" + "os" + "path" + "runtime" + "strconv" "strings" tcontext "github.com/pingcap/dumpling/v4/context" @@ -419,9 +425,10 @@ func (s *testSQLSuite) TestBuildTableSampleQueries(c *C) { tctx, cancel := tcontext.Background().WithLogger(appLogger).WithCancel() d := &Dumper{ - tctx: tctx, - conf: DefaultConfig(), - cancelCtx: cancel, + tctx: tctx, + conf: DefaultConfig(), + cancelCtx: cancel, + selectTiDBTableRegionFunc: selectTiDBTableRegion, } d.conf.ServerInfo = ServerInfo{ HasTiKV: true, @@ -651,7 +658,7 @@ func (s *testSQLSuite) TestBuildTableSampleQueries(c *C) { if len(handleColNames) > 0 { taskChan := make(chan Task, 128) quotaCols := make([]string, 0, len(handleColNames)) - for _, col := range quotaCols { + for _, col := range handleColNames { quotaCols = append(quotaCols, wrapBackTicks(col)) } selectFields := strings.Join(quotaCols, ",") @@ -792,9 +799,10 @@ func (s *testSQLSuite) TestBuildRegionQueriesWithoutPartition(c *C) { tctx, cancel := tcontext.Background().WithLogger(appLogger).WithCancel() d := &Dumper{ - tctx: tctx, - conf: DefaultConfig(), - cancelCtx: cancel, + tctx: tctx, + conf: DefaultConfig(), + cancelCtx: cancel, + selectTiDBTableRegionFunc: selectTiDBTableRegion, } d.conf.ServerInfo = ServerInfo{ HasTiKV: true, @@ -880,7 +888,7 @@ func (s *testSQLSuite) TestBuildRegionQueriesWithoutPartition(c *C) { // Test build tasks through table region taskChan := make(chan Task, 128) quotaCols := make([]string, 0, len(handleColNames)) - for _, col := range quotaCols { + for _, col := range handleColNames { quotaCols = append(quotaCols, wrapBackTicks(col)) } selectFields := strings.Join(quotaCols, ",") @@ -955,9 +963,10 @@ func (s *testSQLSuite) TestBuildRegionQueriesWithPartitions(c *C) { tctx, cancel := tcontext.Background().WithLogger(appLogger).WithCancel() d := &Dumper{ - tctx: tctx, - conf: DefaultConfig(), - cancelCtx: cancel, + tctx: tctx, + conf: DefaultConfig(), + cancelCtx: cancel, + selectTiDBTableRegionFunc: selectTiDBTableRegion, } d.conf.ServerInfo = ServerInfo{ HasTiKV: true, @@ -1088,7 +1097,7 @@ func (s *testSQLSuite) TestBuildRegionQueriesWithPartitions(c *C) { // Test build tasks through table region taskChan := make(chan Task, 128) quotaCols := make([]string, 0, len(handleColNames)) - for _, col := range quotaCols { + for _, col := range handleColNames { quotaCols = append(quotaCols, wrapBackTicks(col)) } selectFields := strings.Join(quotaCols, ",") @@ -1165,6 +1174,322 @@ func (s *testSQLSuite) TestBuildRegionQueriesWithPartitions(c *C) { } } +func buildMockNewRows(mock sqlmock.Sqlmock, columns []string, driverValues [][]driver.Value) *sqlmock.Rows { + rows := mock.NewRows(columns) + for _, driverValue := range driverValues { + rows.AddRow(driverValue...) + } + return rows +} + +func readRegionCsvDriverValues(c *C) [][]driver.Value { + // nolint: dogsled + _, filename, _, _ := runtime.Caller(0) + csvFilename := path.Join(path.Dir(filename), "region_results.csv") + file, err := os.Open(csvFilename) + c.Assert(err, IsNil) + csvReader := csv.NewReader(file) + values := make([][]driver.Value, 0, 990) + for { + results, err := csvReader.Read() + if err == io.EOF { + break + } + c.Assert(err, IsNil) + if len(results) != 3 { + continue + } + regionID, err := strconv.Atoi(results[0]) + c.Assert(err, IsNil) + startKey, endKey := results[1], results[2] + values = append(values, []driver.Value{regionID, startKey, endKey}) + } + return values +} + +func (s *testSQLSuite) TestBuildVersion3RegionQueries(c *C) { + db, mock, err := sqlmock.New() + c.Assert(err, IsNil) + defer db.Close() + conn, err := db.Conn(context.Background()) + c.Assert(err, IsNil) + tctx, cancel := tcontext.Background().WithLogger(appLogger).WithCancel() + oldOpenFunc := openDBFunc + defer func() { + openDBFunc = oldOpenFunc + }() + openDBFunc = func(_, _ string) (*sql.DB, error) { + return db, nil + } + + conf := DefaultConfig() + conf.ServerInfo = ServerInfo{ + HasTiKV: true, + ServerType: ServerTypeTiDB, + ServerVersion: decodeRegionVersion, + } + database := "test" + conf.Tables = DatabaseTables{ + database: []*TableInfo{ + {"t1", TableTypeBase}, + {"t2", TableTypeBase}, + {"t3", TableTypeBase}, + {"t4", TableTypeBase}, + }, + } + d := &Dumper{ + tctx: tctx, + conf: conf, + cancelCtx: cancel, + selectTiDBTableRegionFunc: selectTiDBTableRegion, + } + showStatsHistograms := buildMockNewRows(mock, []string{"Db_name", "Table_name", "Partition_name", "Column_name", "Is_index", "Update_time", "Distinct_count", "Null_count", "Avg_col_size", "Correlation"}, + [][]driver.Value{ + {"test", "t2", "p0", "a", 0, "2021-06-27 17:43:51", 1999999, 0, 8, 0}, + {"test", "t2", "p1", "a", 0, "2021-06-22 20:30:16", 1260000, 0, 8, 0}, + {"test", "t2", "p2", "a", 0, "2021-06-22 20:32:16", 1230000, 0, 8, 0}, + {"test", "t2", "p3", "a", 0, "2021-06-22 20:36:19", 2000000, 0, 8, 0}, + {"test", "t1", "", "a", 0, "2021-04-22 15:23:58", 7100000, 0, 8, 0}, + {"test", "t3", "", "PRIMARY", 1, "2021-06-27 22:08:43", 4980000, 0, 0, 0}, + {"test", "t4", "p0", "PRIMARY", 1, "2021-06-28 10:54:06", 2000000, 0, 0, 0}, + {"test", "t4", "p1", "PRIMARY", 1, "2021-06-28 10:55:04", 1300000, 0, 0, 0}, + {"test", "t4", "p2", "PRIMARY", 1, "2021-06-28 10:57:05", 1830000, 0, 0, 0}, + {"test", "t4", "p3", "PRIMARY", 1, "2021-06-28 10:59:04", 2000000, 0, 0, 0}, + {"mysql", "global_priv", "", "PRIMARY", 1, "2021-06-04 20:39:44", 0, 0, 0, 0}, + }) + selectMySQLStatsHistograms := buildMockNewRows(mock, []string{"TABLE_ID", "VERSION", "DISTINCT_COUNT"}, + [][]driver.Value{ + {15, "1970-01-01 08:00:00", 0}, + {15, "1970-01-01 08:00:00", 0}, + {15, "1970-01-01 08:00:00", 0}, + {41, "2021-04-22 15:23:58", 7100000}, + {41, "2021-04-22 15:23:59", 7100000}, + {41, "2021-04-22 15:23:59", 7100000}, + {41, "2021-04-22 15:23:59", 7100000}, + {27, "1970-01-01 08:00:00", 0}, + {27, "1970-01-01 08:00:00", 0}, + {25, "1970-01-01 08:00:00", 0}, + {25, "1970-01-01 08:00:00", 0}, + {2098, "2021-06-04 20:39:41", 0}, + {2101, "2021-06-04 20:39:44", 0}, + {2101, "2021-06-04 20:39:44", 0}, + {2101, "2021-06-04 20:39:44", 0}, + {2101, "2021-06-04 20:39:44", 0}, + {2128, "2021-06-22 20:29:19", 1991680}, + {2128, "2021-06-22 20:29:19", 1991680}, + {2128, "2021-06-22 20:29:19", 1991680}, + {2129, "2021-06-22 20:30:16", 1260000}, + {2129, "2021-06-22 20:30:16", 1237120}, + {2129, "2021-06-22 20:30:16", 1237120}, + {2129, "2021-06-22 20:30:16", 1237120}, + {2130, "2021-06-22 20:32:16", 1230000}, + {2130, "2021-06-22 20:32:16", 1216128}, + {2130, "2021-06-22 20:32:17", 1216128}, + {2130, "2021-06-22 20:32:17", 1216128}, + {2131, "2021-06-22 20:36:19", 2000000}, + {2131, "2021-06-22 20:36:19", 1959424}, + {2131, "2021-06-22 20:36:19", 1959424}, + {2131, "2021-06-22 20:36:19", 1959424}, + {2128, "2021-06-27 17:43:51", 1999999}, + {2136, "2021-06-27 22:08:38", 4860000}, + {2136, "2021-06-27 22:08:38", 4860000}, + {2136, "2021-06-27 22:08:38", 4860000}, + {2136, "2021-06-27 22:08:38", 4860000}, + {2136, "2021-06-27 22:08:43", 4980000}, + {2139, "2021-06-28 10:54:05", 1991680}, + {2139, "2021-06-28 10:54:05", 1991680}, + {2139, "2021-06-28 10:54:05", 1991680}, + {2139, "2021-06-28 10:54:05", 1991680}, + {2139, "2021-06-28 10:54:06", 2000000}, + {2140, "2021-06-28 10:55:02", 1246336}, + {2140, "2021-06-28 10:55:02", 1246336}, + {2140, "2021-06-28 10:55:02", 1246336}, + {2140, "2021-06-28 10:55:03", 1246336}, + {2140, "2021-06-28 10:55:04", 1300000}, + {2141, "2021-06-28 10:57:03", 1780000}, + {2141, "2021-06-28 10:57:03", 1780000}, + {2141, "2021-06-28 10:57:03", 1780000}, + {2141, "2021-06-28 10:57:03", 1780000}, + {2141, "2021-06-28 10:57:05", 1830000}, + {2142, "2021-06-28 10:59:03", 1959424}, + {2142, "2021-06-28 10:59:03", 1959424}, + {2142, "2021-06-28 10:59:03", 1959424}, + {2142, "2021-06-28 10:59:03", 1959424}, + {2142, "2021-06-28 10:59:04", 2000000}, + }) + selectRegionStatusHistograms := buildMockNewRows(mock, []string{"REGION_ID", "START_KEY", "END_KEY"}, readRegionCsvDriverValues(c)) + selectInformationSchemaTables := buildMockNewRows(mock, []string{"TABLE_SCHEMA", "TABLE_NAME", "TIDB_TABLE_ID"}, + [][]driver.Value{ + {"mysql", "expr_pushdown_blacklist", 39}, + {"mysql", "user", 5}, + {"mysql", "db", 7}, + {"mysql", "tables_priv", 9}, + {"mysql", "stats_top_n", 37}, + {"mysql", "columns_priv", 11}, + {"mysql", "bind_info", 35}, + {"mysql", "default_roles", 33}, + {"mysql", "role_edges", 31}, + {"mysql", "stats_feedback", 29}, + {"mysql", "gc_delete_range_done", 27}, + {"mysql", "gc_delete_range", 25}, + {"mysql", "help_topic", 17}, + {"mysql", "global_priv", 2101}, + {"mysql", "stats_histograms", 21}, + {"mysql", "opt_rule_blacklist", 2098}, + {"mysql", "stats_meta", 19}, + {"mysql", "stats_buckets", 23}, + {"mysql", "tidb", 15}, + {"mysql", "GLOBAL_VARIABLES", 13}, + {"test", "t2", 2127}, + {"test", "t1", 41}, + {"test", "t3", 2136}, + {"test", "t4", 2138}, + }) + mock.ExpectQuery("SHOW STATS_HISTOGRAMS"). + WillReturnRows(showStatsHistograms) + mock.ExpectQuery("SELECT TABLE_ID,FROM_UNIXTIME"). + WillReturnRows(selectMySQLStatsHistograms) + mock.ExpectQuery("SELECT TABLE_SCHEMA,TABLE_NAME,TIDB_TABLE_ID FROM INFORMATION_SCHEMA.TABLES ORDER BY TABLE_SCHEMA"). + WillReturnRows(selectInformationSchemaTables) + mock.ExpectQuery("SELECT REGION_ID,START_KEY,END_KEY FROM INFORMATION_SCHEMA.TIKV_REGION_STATUS ORDER BY START_KEY;"). + WillReturnRows(selectRegionStatusHistograms) + + c.Assert(d.renewSelectTableRegionFuncForLowerTiDB(tctx), IsNil) + c.Assert(mock.ExpectationsWereMet(), IsNil) + + testCases := []struct { + tableName string + handleColNames []string + handleColTypes []string + expectedWhereClauses []string + hasTiDBRowID bool + }{ + { + "t1", + []string{"a"}, + []string{"int"}, + []string{ + "`a`<960001", + "`a`>=960001 and `a`<1920001", + "`a`>=1920001 and `a`<2880001", + "`a`>=2880001 and `a`<3840001", + "`a`>=3840001 and `a`<4800001", + "`a`>=4800001 and `a`<5760001", + "`a`>=5760001 and `a`<6720001", + "`a`>=6720001", + }, + false, + }, + { + "t2", + []string{"a"}, + []string{"int"}, + []string{ + "`a`<960001", + "`a`>=960001 and `a`<2960001", + "`a`>=2960001 and `a`<4960001", + "`a`>=4960001 and `a`<6960001", + "`a`>=6960001", + }, + false, + }, + { + "t3", + []string{"_tidb_rowid"}, + []string{"int"}, + []string{ + "`_tidb_rowid`<81584", + "`_tidb_rowid`>=81584 and `_tidb_rowid`<1041584", + "`_tidb_rowid`>=1041584 and `_tidb_rowid`<2001584", + "`_tidb_rowid`>=2001584 and `_tidb_rowid`<2961584", + "`_tidb_rowid`>=2961584 and `_tidb_rowid`<3921584", + "`_tidb_rowid`>=3921584 and `_tidb_rowid`<4881584", + "`_tidb_rowid`>=4881584 and `_tidb_rowid`<5841584", + "`_tidb_rowid`>=5841584 and `_tidb_rowid`<6801584", + "`_tidb_rowid`>=6801584", + }, + true, + }, + { + "t4", + []string{"_tidb_rowid"}, + []string{"int"}, + []string{ + "`_tidb_rowid`<180001", + "`_tidb_rowid`>=180001 and `_tidb_rowid`<1140001", + "`_tidb_rowid`>=1140001 and `_tidb_rowid`<2200001", + "`_tidb_rowid`>=2200001 and `_tidb_rowid`<3160001", + "`_tidb_rowid`>=3160001 and `_tidb_rowid`<4160001", + "`_tidb_rowid`>=4160001 and `_tidb_rowid`<5120001", + "`_tidb_rowid`>=5120001 and `_tidb_rowid`<6170001", + "`_tidb_rowid`>=6170001 and `_tidb_rowid`<7130001", + "`_tidb_rowid`>=7130001", + }, + true, + }, + } + + for i, testCase := range testCases { + c.Log(fmt.Sprintf("case #%d", i)) + table := testCase.tableName + handleColNames := testCase.handleColNames + handleColTypes := testCase.handleColTypes + + // Test build tasks through table region + taskChan := make(chan Task, 128) + quotaCols := make([]string, 0, len(handleColNames)) + for _, col := range handleColNames { + quotaCols = append(quotaCols, wrapBackTicks(col)) + } + selectFields := strings.Join(quotaCols, ",") + meta := &tableMeta{ + database: database, + table: table, + selectedField: selectFields, + specCmts: []string{ + "/*!40101 SET NAMES binary*/;", + }, + } + + if testCase.hasTiDBRowID { + mock.ExpectExec("SELECT _tidb_rowid"). + WillReturnResult(sqlmock.NewResult(0, 0)) + } else { + mock.ExpectExec("SELECT _tidb_rowid"). + WillReturnError(errors.New(`1054, "Unknown column '_tidb_rowid' in 'field list'"`)) + rows := sqlmock.NewRows([]string{"COLUMN_NAME", "DATA_TYPE"}) + for i := range handleColNames { + rows.AddRow(handleColNames[i], handleColTypes[i]) + } + mock.ExpectQuery("SELECT c.COLUMN_NAME, DATA_TYPE FROM").WithArgs(database, table).WillReturnRows(rows) + } + + rows := sqlmock.NewRows([]string{"COLUMN_NAME", "EXTRA"}) + for _, handleCol := range handleColNames { + rows.AddRow(handleCol, "") + } + mock.ExpectQuery("SELECT COLUMN_NAME,EXTRA FROM INFORMATION_SCHEMA.COLUMNS").WithArgs(database, table). + WillReturnRows(rows) + + orderByClause := buildOrderByClauseString(handleColNames) + c.Assert(d.concurrentDumpTable(tctx, conn, meta, taskChan), IsNil) + c.Assert(mock.ExpectationsWereMet(), IsNil) + + chunkIdx := 0 + for _, w := range testCase.expectedWhereClauses { + query := buildSelectQuery(database, table, "*", "", buildWhereCondition(d.conf, w), orderByClause) + task := <-taskChan + taskTableData, ok := task.(*TaskTableData) + c.Assert(ok, IsTrue) + c.Assert(taskTableData.ChunkIndex, Equals, chunkIdx) + data, ok := taskTableData.Data.(*tableData) + c.Assert(ok, IsTrue) + c.Assert(data.query, Equals, query) + chunkIdx++ + } + } +} + func makeVersion(major, minor, patch int64, preRelease string) *semver.Version { return &semver.Version{ Major: major, diff --git a/v4/export/writer_util_test.go b/v4/export/writer_util_test.go index ff249c58..73cc5fae 100644 --- a/v4/export/writer_util_test.go +++ b/v4/export/writer_util_test.go @@ -21,7 +21,7 @@ var appLogger log.Logger func TestT(t *testing.T) { initColTypeRowReceiverMap() logger, _, err := log.InitAppLogger(&log.Config{ - Level: "info", + Level: "debug", File: "", Format: "text", })