From 3d9860bab661949af3e146e9532f76adecd016d4 Mon Sep 17 00:00:00 2001 From: ULookup Date: Mon, 13 Jul 2026 16:42:28 +0800 Subject: [PATCH 1/6] fix: fence auto increment commits by table version --- pkg/vm/engine/cmd_util/operations.go | 7 +- pkg/vm/engine/disttae/tools.go | 17 +- pkg/vm/engine/disttae/transfer.go | 3 +- pkg/vm/engine/disttae/txn.go | 202 +++++++++++++++------- pkg/vm/engine/disttae/txn_table.go | 38 ++-- pkg/vm/engine/disttae/txn_test.go | 53 ++++++ pkg/vm/engine/disttae/types.go | 19 +- pkg/vm/engine/tae/db/test/db_test.go | 172 ++++++++++++++++++ pkg/vm/engine/tae/rpc/handle.go | 56 +++++- pkg/vm/engine/tae/rpc/rpc_test.go | 20 +++ pkg/vm/engine/tae/txn/txnimpl/relation.go | 5 + pkg/vm/engine/tae/txn/txnimpl/table.go | 67 +++++++ pkg/vm/engine/tae/txn/txnimpl/txn_test.go | 131 ++++++++++++++ proto/api.proto | 3 + 14 files changed, 692 insertions(+), 101 deletions(-) diff --git a/pkg/vm/engine/cmd_util/operations.go b/pkg/vm/engine/cmd_util/operations.go index c58123bb08ad2..d37a3641ae776 100644 --- a/pkg/vm/engine/cmd_util/operations.go +++ b/pkg/vm/engine/cmd_util/operations.go @@ -162,8 +162,11 @@ type WriteReq struct { TableID uint64 DatabaseName string TableName string - Schema *catalog2.Schema - Batch *batch.Batch + // TableDefVersion is the schema version used by CN to plan the write. + // Zero is accepted for old-CN compatibility. + TableDefVersion uint32 + Schema *catalog2.Schema + Batch *batch.Batch //[IncrementalDedup|FullSkipWorkspaceDedup|FullDedup], default is IncrementalDedup. //If incremental-dedup in dn.toml is false, IncrementalDedup will be treated as FullSkipWorkspaceDedup. //IncrementalDedup do not check uniqueness of PK before txn's snapshot TS. diff --git a/pkg/vm/engine/disttae/tools.go b/pkg/vm/engine/disttae/tools.go index a7fb204e0b118..60a8df9a4ac25 100644 --- a/pkg/vm/engine/disttae/tools.go +++ b/pkg/vm/engine/disttae/tools.go @@ -173,14 +173,15 @@ func toPBEntry(e Entry) (*api.Entry, error) { return nil, err } return &api.Entry{ - Bat: bat, - EntryType: typ, - TableId: e.tableId, - DatabaseId: e.databaseId, - TableName: e.tableName, - DatabaseName: e.databaseName, - FileName: e.fileName, - PkCheckByTn: int32(e.pkChkByTN), + Bat: bat, + EntryType: typ, + TableId: e.tableId, + DatabaseId: e.databaseId, + TableName: e.tableName, + DatabaseName: e.databaseName, + FileName: e.fileName, + PkCheckByTn: int32(e.pkChkByTN), + TableDefVersion: e.tableDefVersion, }, nil } diff --git a/pkg/vm/engine/disttae/transfer.go b/pkg/vm/engine/disttae/transfer.go index 8caf867bed2ac..9c976bd84e3f0 100644 --- a/pkg/vm/engine/disttae/transfer.go +++ b/pkg/vm/engine/disttae/transfer.go @@ -148,11 +148,12 @@ func transferTombstoneObjects( if bat.RowCount() > 0 { fileName := slist[0].ObjectName().String() - if err = txn.WriteFileLocked( + if err = txn.writeFileLockedWithVersion( DELETE, tbl.accountId, tbl.db.databaseId, tbl.tableId, tbl.db.databaseName, tbl.tableName, fileName, bat, txn.tnStores[0], + tbl.version, ); err != nil { return err } diff --git a/pkg/vm/engine/disttae/txn.go b/pkg/vm/engine/disttae/txn.go index 6a89a4f9ae900..dd219e668a993 100644 --- a/pkg/vm/engine/disttae/txn.go +++ b/pkg/vm/engine/disttae/txn.go @@ -95,6 +95,21 @@ func (txn *Transaction) WriteBatch( tableName string, bat *batch.Batch, tnStore DNStore) (genRowidVec *vector.Vector, err error) { + return txn.writeBatchWithVersion(typ, note, accountId, databaseId, tableId, + databaseName, tableName, bat, tnStore, 0) +} + +func (txn *Transaction) writeBatchWithVersion( + typ int, note string, + accountId uint32, + databaseId uint64, + tableId uint64, + databaseName string, + tableName string, + bat *batch.Batch, + tnStore DNStore, + tableDefVersion uint32, +) (genRowidVec *vector.Vector, err error) { start := time.Now() seq := txn.op.NextSequence() trace.GetService(txn.proc.GetService()).AddTxnDurationAction( @@ -236,17 +251,18 @@ func (txn *Transaction) WriteBatch( } e := Entry{ - typ: typ, - accountId: accountId, - bat: bat, - tableId: tableId, - databaseId: databaseId, - tableName: tableName, - databaseName: databaseName, - tnStore: tnStore, - note: note, - pkCheckPos: pkCheckPos, - pkCheckReady: pkCheckReady, + typ: typ, + accountId: accountId, + bat: bat, + tableId: tableId, + databaseId: databaseId, + tableName: tableName, + databaseName: databaseName, + tnStore: tnStore, + tableDefVersion: tableDefVersion, + note: note, + pkCheckPos: pkCheckPos, + pkCheckReady: pkCheckReady, } txn.writes = append(txn.writes, e) txn.pkCount += bat.RowCount() @@ -825,7 +841,7 @@ func (txn *Transaction) dumpInsertBatchLocked( lastWriteIndex := offset writes := txn.writes - mp := make(map[tableKey][]*batch.Batch) + mp := make(map[workspaceTableKey][]*batch.Batch) for i := offset; i < len(txn.writes); i++ { if skipTable[txn.writes[i].tableId] { writes[lastWriteIndex] = writes[i] @@ -845,11 +861,14 @@ func (txn *Transaction) dumpInsertBatchLocked( keepElement := true if txn.writes[i].typ == INSERT && txn.writes[i].fileName == "" { - tbKey := tableKey{ - accountId: txn.writes[i].accountId, - databaseId: txn.writes[i].databaseId, - dbName: txn.writes[i].databaseName, - name: txn.writes[i].tableName, + tbKey := workspaceTableKey{ + tableKey: tableKey{ + accountId: txn.writes[i].accountId, + databaseId: txn.writes[i].databaseId, + dbName: txn.writes[i].databaseName, + name: txn.writes[i].tableName, + }, + tableDefVersion: txn.writes[i].tableDefVersion, } // Tables not resolved in the pre-resolution pass were appended // to the workspace while the lock was released; keep them in @@ -923,7 +942,7 @@ func (txn *Transaction) dumpInsertBatchLocked( table = tbl.(*txnTable) } - if err = table.getTxn().WriteFileLocked( + if err = table.getTxn().writeFileLockedWithVersion( INSERT, table.accountId, table.db.databaseId, @@ -933,6 +952,7 @@ func (txn *Transaction) dumpInsertBatchLocked( fileName, bat, table.getTxn().tnStores[0], + tbKey.tableDefVersion, ); err != nil { return err } @@ -965,7 +985,7 @@ func (txn *Transaction) dumpDeleteBatchLocked( deleteCnt := 0 lastWriteIndex := offset writes := txn.writes - mp := make(map[tableKey][]*batch.Batch) + mp := make(map[workspaceTableKey][]*batch.Batch) for i := offset; i < len(txn.writes); i++ { if txn.writes[i].isCatalog() { writes[lastWriteIndex] = writes[i] @@ -980,11 +1000,14 @@ func (txn *Transaction) dumpDeleteBatchLocked( keepElement := true if txn.writes[i].typ == DELETE && txn.writes[i].fileName == "" { - tbKey := tableKey{ - accountId: txn.writes[i].accountId, - databaseId: txn.writes[i].databaseId, - dbName: txn.writes[i].databaseName, - name: txn.writes[i].tableName, + tbKey := workspaceTableKey{ + tableKey: tableKey{ + accountId: txn.writes[i].accountId, + databaseId: txn.writes[i].databaseId, + dbName: txn.writes[i].databaseName, + name: txn.writes[i].tableName, + }, + tableDefVersion: txn.writes[i].tableDefVersion, } // Tables not resolved in the pre-resolution pass were appended // to the workspace while the lock was released; keep them in @@ -1062,7 +1085,7 @@ func (txn *Transaction) dumpDeleteBatchLocked( table = tbl.(*txnTable) } - if err = table.getTxn().WriteFileLocked( + if err = table.getTxn().writeFileLockedWithVersion( DELETE, table.accountId, table.db.databaseId, @@ -1072,6 +1095,7 @@ func (txn *Transaction) dumpDeleteBatchLocked( fileName, bat, table.getTxn().tnStores[0], + tbKey.tableDefVersion, ); err != nil { return err } @@ -1289,12 +1313,14 @@ func (txn *Transaction) registerCNObjects( objBat *batch.Batch, dbName string, tbName string, + tableDefVersion uint32, ) { txn.cnObjsSummary[objId] = Summary{ - objBat: objBat, - accountId: accountId, - dbName: dbName, - tbName: tbName, + objBat: objBat, + accountId: accountId, + dbName: dbName, + tbName: tbName, + tableDefVersion: tableDefVersion, } } @@ -1309,6 +1335,22 @@ func (txn *Transaction) WriteFileLocked( inputBat *batch.Batch, tnStore DNStore, ) (err error) { + return txn.writeFileLockedWithVersion(typ, accountId, databaseId, tableId, + databaseName, tableName, fileName, inputBat, tnStore, 0) +} + +func (txn *Transaction) writeFileLockedWithVersion( + typ int, + accountId uint32, + databaseId, + tableId uint64, + databaseName, + tableName string, + fileName string, + inputBat *batch.Batch, + tnStore DNStore, + tableDefVersion uint32, +) (err error) { txn.hasS3Op.Store(true) @@ -1329,7 +1371,7 @@ func (txn *Transaction) WriteFileLocked( sid := oid.Segment() server.PutCnSegment(txn.op.Txn().ID, tableId, sid, colexec.TxnWorkspaceUnCommitType) - txn.registerCNObjects(*oid, accountId, copied, databaseName, tableName) + txn.registerCNObjects(*oid, accountId, copied, databaseName, tableName, tableDefVersion) } } @@ -1345,17 +1387,18 @@ func (txn *Transaction) WriteFileLocked( } entry := Entry{ - typ: typ, - accountId: accountId, - tableId: tableId, - databaseId: databaseId, - tableName: tableName, - databaseName: databaseName, - fileName: fileName, - bat: copied, - tnStore: tnStore, - pkCheckPos: -1, - pkCheckReady: true, + typ: typ, + accountId: accountId, + tableId: tableId, + databaseId: databaseId, + tableName: tableName, + databaseName: databaseName, + fileName: fileName, + bat: copied, + tnStore: tnStore, + pkCheckPos: -1, + pkCheckReady: true, + tableDefVersion: tableDefVersion, } txn.writes = append(txn.writes, entry) @@ -1376,6 +1419,22 @@ func (txn *Transaction) WriteFileLockedSkipTransfer( inputBat *batch.Batch, tnStore DNStore, ) (err error) { + return txn.writeFileLockedSkipTransferWithVersion(typ, accountId, databaseId, tableId, + databaseName, tableName, fileName, inputBat, tnStore, 0) +} + +func (txn *Transaction) writeFileLockedSkipTransferWithVersion( + typ int, + accountId uint32, + databaseId, + tableId uint64, + databaseName, + tableName string, + fileName string, + inputBat *batch.Batch, + tnStore DNStore, + tableDefVersion uint32, +) (err error) { txn.hasS3Op.Store(true) @@ -1396,7 +1455,7 @@ func (txn *Transaction) WriteFileLockedSkipTransfer( sid := oid.Segment() server.PutCnSegment(txn.op.Txn().ID, tableId, sid, colexec.TxnWorkspaceUnCommitType) - txn.registerCNObjects(*oid, accountId, copied, databaseName, tableName) + txn.registerCNObjects(*oid, accountId, copied, databaseName, tableName, tableDefVersion) } } @@ -1412,16 +1471,17 @@ func (txn *Transaction) WriteFileLockedSkipTransfer( } entry := Entry{ - typ: typ, - accountId: accountId, - tableId: tableId, - databaseId: databaseId, - tableName: tableName, - databaseName: databaseName, - fileName: fileName, - bat: copied, - tnStore: tnStore, - skipTransfer: true, + typ: typ, + accountId: accountId, + tableId: tableId, + databaseId: databaseId, + tableName: tableName, + databaseName: databaseName, + fileName: fileName, + bat: copied, + tnStore: tnStore, + skipTransfer: true, + tableDefVersion: tableDefVersion, } txn.writes = append(txn.writes, entry) @@ -1442,11 +1502,27 @@ func (txn *Transaction) WriteFile( bat *batch.Batch, tnStore DNStore, ) error { + return txn.writeFileWithVersion(typ, accountId, databaseId, tableId, + databaseName, tableName, fileName, bat, tnStore, 0) +} + +func (txn *Transaction) writeFileWithVersion( + typ int, + accountId uint32, + databaseId, + tableId uint64, + databaseName, + tableName string, + fileName string, + bat *batch.Batch, + tnStore DNStore, + tableDefVersion uint32, +) error { txn.Lock() defer txn.Unlock() - return txn.WriteFileLocked( + return txn.writeFileLockedWithVersion( typ, accountId, databaseId, @@ -1456,6 +1532,7 @@ func (txn *Transaction) WriteFile( fileName, bat, tnStore, + tableDefVersion, ) } @@ -1885,7 +1962,7 @@ func (txn *Transaction) compactDeletionOnObjsLocked(ctx context.Context) error { // object --> blk id --> deletion objBlkDeletion := make(map[objectio.ObjectId]map[objectio.Blockid][]int64) - objTables := make(map[objectio.ObjectId]tableKey) + objTables := make(map[objectio.ObjectId]workspaceTableKey) affectedBats := make(map[*batch.Batch]struct{}) @@ -1908,10 +1985,13 @@ func (txn *Transaction) compactDeletionOnObjsLocked(ctx context.Context) error { blkDel[*blkId] = offsets if _, ok := objTables[*blkId.Object()]; !ok { - objTables[*blkId.Object()] = tableKey{ - accountId: summary.accountId, - dbName: summary.dbName, - name: summary.tbName, + objTables[*blkId.Object()] = workspaceTableKey{ + tableKey: tableKey{ + accountId: summary.accountId, + dbName: summary.dbName, + name: summary.tbName, + }, + tableDefVersion: summary.tableDefVersion, } } @@ -1967,7 +2047,7 @@ func (txn *Transaction) compactDeletionOnObjsLocked(ctx context.Context) error { locker.Lock() defer locker.Unlock() - if err = txn.WriteFileLocked( + if err = txn.writeFileLockedWithVersion( INSERT, tbl.accountId, tbl.db.databaseId, @@ -1977,6 +2057,7 @@ func (txn *Transaction) compactDeletionOnObjsLocked(ctx context.Context) error { fileName, bat, txn.tnStores[0], + tbKey.tableDefVersion, ); err != nil { bat.Clean(txn.proc.Mp()) panicWhenFailed(err, "write txn file failed") @@ -2024,7 +2105,7 @@ func (txn *Transaction) compactDeletionOnObjsLocked(ctx context.Context) error { bat.SetRowCount(bat.Vecs[0].Length()) - if err := txn.WriteFileLocked( + if err := txn.writeFileLockedWithVersion( INSERT, entry.accountId, entry.databaseId, @@ -2034,6 +2115,7 @@ func (txn *Transaction) compactDeletionOnObjsLocked(ctx context.Context) error { stats.ObjectName().String(), bat, entry.tnStore, + entry.tableDefVersion, ); err != nil { bat.Clean(txn.proc.Mp()) return err diff --git a/pkg/vm/engine/disttae/txn_table.go b/pkg/vm/engine/disttae/txn_table.go index bf6c62b3b83af..df0d2124aff5e 100644 --- a/pkg/vm/engine/disttae/txn_table.go +++ b/pkg/vm/engine/disttae/txn_table.go @@ -1867,7 +1867,7 @@ func (tbl *txnTable) Write(ctx context.Context, bat *batch.Batch) error { tbl.getTxn().hasS3Op.Store(true) //bocks maybe come from different S3 object, here we just need to make sure fileName is not Nil. fileName := objectio.DecodeBlockInfo(bat.Vecs[0].GetBytesAt(0)).MetaLocation().Name().String() - return tbl.getTxn().WriteFile( + return tbl.getTxn().writeFileWithVersion( INSERT, tbl.accountId, tbl.db.databaseId, @@ -1876,13 +1876,13 @@ func (tbl *txnTable) Write(ctx context.Context, bat *batch.Batch) error { tbl.tableName, fileName, bat, - tbl.getTxn().tnStores[0]) + tbl.getTxn().tnStores[0], tbl.version) } ibat, err := util.CopyBatch(bat, tbl.getTxn().proc) if err != nil { return err } - if _, err := tbl.getTxn().WriteBatch( + if _, err := tbl.getTxn().writeBatchWithVersion( INSERT, "", tbl.accountId, @@ -1892,6 +1892,7 @@ func (tbl *txnTable) Write(ctx context.Context, bat *batch.Batch) error { tbl.tableName, ibat, tbl.getTxn().tnStores[0], + tbl.version, ); err != nil { ibat.Clean(tbl.getTxn().proc.Mp()) return err @@ -2057,14 +2058,14 @@ func (tbl *txnTable) Delete( skipTransfer := ctx.Value(defines.SkipTransferKey{}) != nil if skipTransfer { tbl.getTxn().Lock() - err := tbl.getTxn().WriteFileLockedSkipTransfer(DELETE, tbl.accountId, tbl.db.databaseId, tbl.tableId, - tbl.db.databaseName, tbl.tableName, fileName, bat, tbl.getTxn().tnStores[0]) + err := tbl.getTxn().writeFileLockedSkipTransferWithVersion(DELETE, tbl.accountId, tbl.db.databaseId, tbl.tableId, + tbl.db.databaseName, tbl.tableName, fileName, bat, tbl.getTxn().tnStores[0], tbl.version) tbl.getTxn().Unlock() return err } - if err := tbl.getTxn().WriteFile(DELETE, tbl.accountId, tbl.db.databaseId, tbl.tableId, - tbl.db.databaseName, tbl.tableName, fileName, bat, tbl.getTxn().tnStores[0]); err != nil { + if err := tbl.getTxn().writeFileWithVersion(DELETE, tbl.accountId, tbl.db.databaseId, tbl.tableId, + tbl.db.databaseName, tbl.tableName, fileName, bat, tbl.getTxn().tnStores[0], tbl.version); err != nil { return err } @@ -2098,15 +2099,16 @@ func (tbl *txnTable) SoftDeleteObject(ctx context.Context, objID *objectio.Objec // Create entry with EntrySoftDeleteObject type entry := Entry{ - typ: SOFT_DELETE_OBJECT, - bat: bat, - tnStore: tbl.getTxn().tnStores[0], - tableId: tbl.tableId, - databaseId: tbl.db.databaseId, - tableName: tbl.tableName, - databaseName: tbl.db.databaseName, - accountId: tbl.accountId, - fileName: makeSoftDeleteFileName(isTombstone), + typ: SOFT_DELETE_OBJECT, + bat: bat, + tnStore: tbl.getTxn().tnStores[0], + tableId: tbl.tableId, + databaseId: tbl.db.databaseId, + tableName: tbl.tableName, + databaseName: tbl.db.databaseName, + accountId: tbl.accountId, + fileName: makeSoftDeleteFileName(isTombstone), + tableDefVersion: tbl.version, } tbl.getTxn().writes = append(tbl.getTxn().writes, entry) @@ -2118,8 +2120,8 @@ func (tbl *txnTable) writeTnPartition(_ context.Context, bat *batch.Batch) error if err != nil { return err } - if _, err := tbl.getTxn().WriteBatch(DELETE, "", tbl.accountId, tbl.db.databaseId, tbl.tableId, - tbl.db.databaseName, tbl.tableName, ibat, tbl.getTxn().tnStores[0]); err != nil { + if _, err := tbl.getTxn().writeBatchWithVersion(DELETE, "", tbl.accountId, tbl.db.databaseId, tbl.tableId, + tbl.db.databaseName, tbl.tableName, ibat, tbl.getTxn().tnStores[0], tbl.version); err != nil { ibat.Clean(tbl.getTxn().proc.Mp()) return err } diff --git a/pkg/vm/engine/disttae/txn_test.go b/pkg/vm/engine/disttae/txn_test.go index fbda599c22ab8..15f2b386d33fa 100644 --- a/pkg/vm/engine/disttae/txn_test.go +++ b/pkg/vm/engine/disttae/txn_test.go @@ -31,6 +31,7 @@ import ( "github.com/matrixorigin/matrixone/pkg/container/vector" mock_frontend "github.com/matrixorigin/matrixone/pkg/frontend/test" "github.com/matrixorigin/matrixone/pkg/objectio" + "github.com/matrixorigin/matrixone/pkg/pb/api" pbplan "github.com/matrixorigin/matrixone/pkg/pb/plan" txnpb "github.com/matrixorigin/matrixone/pkg/pb/txn" "github.com/matrixorigin/matrixone/pkg/sql/colexec" @@ -43,6 +44,46 @@ import ( "github.com/stretchr/testify/require" ) +func TestPrecommitEntryCarriesTableDefVersion(t *testing.T) { + proc := testutil.NewProc(t) + bat := newDeleteBatchForTest(t, proc, []int64{1}) + defer bat.Clean(proc.Mp()) + + for _, tc := range []struct { + name string + version uint32 + }{ + {name: "known", version: 7}, + {name: "old cn compatibility", version: 0}, + } { + t.Run(tc.name, func(t *testing.T) { + encoded, err := toPBEntry(Entry{ + typ: DELETE, + tableId: 42, + databaseId: 7, + bat: bat, + tableDefVersion: tc.version, + }) + require.NoError(t, err) + + data, err := encoded.Marshal() + require.NoError(t, err) + decoded := new(api.Entry) + require.NoError(t, decoded.Unmarshal(data)) + require.Equal(t, tc.version, decoded.TableDefVersion) + }) + } +} + +func TestWorkspaceFlushKeySeparatesTableDefVersions(t *testing.T) { + base := tableKey{accountId: 1, databaseId: 7, dbName: "db", name: "tbl"} + batches := map[workspaceTableKey]int{ + {tableKey: base, tableDefVersion: 7}: 1, + {tableKey: base, tableDefVersion: 8}: 1, + } + require.Len(t, batches, 2) +} + func Test_GetUncommittedS3Tombstone(t *testing.T) { var statsList []objectio.ObjectStats for i := 0; i < 3; i++ { @@ -210,6 +251,18 @@ func TestWriteBatchRecordsPKCheckState(t *testing.T) { bat.Clean(txn.proc.Mp()) }) + t.Run("user write records planned table version", func(t *testing.T) { + txn := newTransactionWithActivePKTableForTest(t, "pk") + bat := newInt64BatchForTest(t, txn.proc, []string{"pk"}, []int64{1}) + + _, err := txn.writeBatchWithVersion(INSERT, "", 1, 7, 42, "db", "tbl", bat, DNStore{}, 7) + require.NoError(t, err) + require.Len(t, txn.writes, 1) + require.Equal(t, uint32(7), txn.writes[0].tableDefVersion) + + bat.Clean(txn.proc.Mp()) + }) + t.Run("missing pk attr keeps legacy fallback", func(t *testing.T) { txn := newTransactionWithActivePKTableForTest(t, "pk") bat := newInt64BatchForTest(t, txn.proc, []string{"other"}, []int64{1, 2}) diff --git a/pkg/vm/engine/disttae/types.go b/pkg/vm/engine/disttae/types.go index fb300c22d5271..3e0eb36737fb2 100644 --- a/pkg/vm/engine/disttae/types.go +++ b/pkg/vm/engine/disttae/types.go @@ -497,10 +497,11 @@ func (txn *Transaction) GetSyncProtectionJobID() string { } type Summary struct { - objBat *batch.Batch - accountId uint32 - tbName string - dbName string + objBat *batch.Batch + accountId uint32 + tbName string + dbName string + tableDefVersion uint32 } // FIXME: The map inside this one will be accessed concurrently, using @@ -1135,6 +1136,9 @@ type Entry struct { bat *batch.Batch tnStore DNStore pkChkByTN int8 + // tableDefVersion is the schema version used to plan this user-table write. + // Zero means unknown/old-CN compatibility. + tableDefVersion uint32 // skipTransfer indicates this entry should skip transfer processing // Used by CCPR to avoid transfer errors for cross-cluster tombstones @@ -1193,6 +1197,13 @@ type tableKey struct { name string } +// workspaceTableKey keeps batches planned against different table definitions +// from being coalesced when the CN workspace is flushed to S3. +type workspaceTableKey struct { + tableKey + tableDefVersion uint32 +} + func (k tableKey) String() string { return fmt.Sprintf("%v-%v-%v-%v", k.accountId, k.databaseId, k.dbName, k.name) } diff --git a/pkg/vm/engine/tae/db/test/db_test.go b/pkg/vm/engine/tae/db/test/db_test.go index 70bbb2376418f..c23f2a4afad90 100644 --- a/pkg/vm/engine/tae/db/test/db_test.go +++ b/pkg/vm/engine/tae/db/test/db_test.go @@ -6543,6 +6543,178 @@ func TestAlterFakePk(t *testing.T) { } +func TestAlterAutoIncrementSchemaCommitAndRollback(t *testing.T) { + defer testutils.AfterTest(t)() + testutils.EnsureNoLeak(t) + ctx := context.Background() + + tae := testutil.InitTestDB(ctx, ModuleName, t, config.WithLongScanAndCKPOpts(nil)) + defer tae.Close() + schema := catalog.MockSchemaAll(3, 1) + schema.Extra.AutoIncrOffset = 10 + testutil.CreateRelation(t, tae, testutil.DefaultTestDB, schema, true) + + txn, rel := testutil.GetDefaultRelation(t, tae, schema.Name) + initial := rel.Schema(false).(*catalog.Schema) + require.Equal(t, uint64(10), initial.Extra.AutoIncrOffset) + require.NoError(t, rel.AlterTable(ctx, api.NewUpdateAutoIncrementReq(0, rel.ID(), 99))) + altered := rel.Schema(false).(*catalog.Schema) + require.Equal(t, initial.Version+1, altered.Version) + require.Equal(t, uint64(99), altered.Extra.AutoIncrOffset) + require.NoError(t, txn.Commit(ctx)) + + txn, rel = testutil.GetDefaultRelation(t, tae, schema.Name) + committed := rel.Schema(false).(*catalog.Schema) + committedVersion := committed.Version + require.Equal(t, initial.Version+1, committedVersion) + require.Equal(t, uint64(99), committed.Extra.AutoIncrOffset) + require.NoError(t, txn.Commit(ctx)) + + txn, rel = testutil.GetDefaultRelation(t, tae, schema.Name) + require.NoError(t, rel.AlterTable(ctx, api.NewUpdateAutoIncrementReq(0, rel.ID(), 123))) + uncommitted := rel.Schema(false).(*catalog.Schema) + require.Equal(t, committedVersion+1, uncommitted.Version) + require.Equal(t, uint64(123), uncommitted.Extra.AutoIncrOffset) + require.NoError(t, txn.Rollback(ctx)) + + txn, rel = testutil.GetDefaultRelation(t, tae, schema.Name) + afterRollback := rel.Schema(false).(*catalog.Schema) + require.Equal(t, committedVersion, afterRollback.Version) + require.Equal(t, uint64(99), afterRollback.Extra.AutoIncrOffset) + require.NoError(t, txn.Commit(ctx)) +} + +type tableDefVersionSetter interface { + SetTableDefVersion(uint32) error +} + +func waitTableVersionBarrier(t *testing.T, ch <-chan struct{}, name string) { + t.Helper() + select { + case <-ch: + case <-time.After(5 * time.Second): + t.Fatalf("timed out waiting for %s", name) + } +} + +func TestTableDefVersionCommitFence(t *testing.T) { + defer testutils.AfterTest(t)() + testutils.EnsureNoLeak(t) + ctx := context.Background() + + newVersionedTable := func(t *testing.T) (*db.DB, *catalog.Schema, uint32) { + t.Helper() + tae := testutil.InitTestDB(ctx, ModuleName, t, config.WithLongScanAndCKPOpts(nil)) + schema := catalog.MockSchemaAll(3, 1) + testutil.CreateRelation(t, tae, testutil.DefaultTestDB, schema, true) + + txn, rel := testutil.GetDefaultRelation(t, tae, schema.Name) + require.NoError(t, rel.AlterTable(ctx, api.NewUpdateAutoIncrementReq(0, rel.ID(), 10))) + require.NoError(t, txn.Commit(ctx)) + + txn, rel = testutil.GetDefaultRelation(t, tae, schema.Name) + version := rel.Schema(false).(*catalog.Schema).Version + require.NotZero(t, version) + require.NoError(t, txn.Commit(ctx)) + return tae, schema, version + } + + appendWithVersion := func(t *testing.T, tae *db.DB, schema *catalog.Schema, version uint32) txnif.AsyncTxn { + t.Helper() + txn, rel := testutil.GetDefaultRelation(t, tae, schema.Name) + require.NoError(t, rel.(tableDefVersionSetter).SetTableDefVersion(version)) + bat := catalog.MockBatch(schema, 1) + t.Cleanup(bat.Close) + require.NoError(t, rel.Append(ctx, bat)) + return txn + } + + t.Run("matching and zero compatibility", func(t *testing.T) { + tae, schema, version := newVersionedTable(t) + defer tae.Close() + require.NoError(t, appendWithVersion(t, tae, schema, version).Commit(ctx)) + + txn, rel := testutil.GetDefaultRelation(t, tae, schema.Name) + require.NoError(t, rel.(tableDefVersionSetter).SetTableDefVersion(0)) + require.NoError(t, txn.MockIncWriteCnt()) + require.NoError(t, txn.Commit(ctx)) + }) + + t.Run("committed newer schema retries", func(t *testing.T) { + tae, schema, version := newVersionedTable(t) + defer tae.Close() + dmlTxn := appendWithVersion(t, tae, schema, version) + + alterTxn, alterRel := testutil.GetDefaultRelation(t, tae, schema.Name) + require.NoError(t, alterRel.AlterTable(ctx, api.NewUpdateAutoIncrementReq(0, alterRel.ID(), 20))) + require.NoError(t, alterTxn.Commit(ctx)) + + err := dmlTxn.Commit(ctx) + require.True(t, moerr.IsMoErrCode(err, moerr.ErrTxnNeedRetryWithDefChanged), err) + }) + + t.Run("alter prepared first is ordered before dml", func(t *testing.T) { + tae, schema, version := newVersionedTable(t) + defer tae.Close() + dmlTxn := appendWithVersion(t, tae, schema, version) + + alterTxn, alterRel := testutil.GetDefaultRelation(t, tae, schema.Name) + require.NoError(t, alterRel.AlterTable(ctx, api.NewUpdateAutoIncrementReq(0, alterRel.ID(), 20))) + alterPrepared, releaseAlter := make(chan struct{}), make(chan struct{}) + alterTxn.SetPrepareCommitFn(func(txn txnif.AsyncTxn) error { + close(alterPrepared) + <-releaseAlter + return txn.GetStore().PrepareCommit() + }) + alterResult := make(chan error, 1) + go func() { alterResult <- alterTxn.Commit(ctx) }() + waitTableVersionBarrier(t, alterPrepared, "ALTER prepare") + + dmlStarted := make(chan struct{}) + dmlResult := make(chan error, 1) + go func() { + close(dmlStarted) + dmlResult <- dmlTxn.Commit(ctx) + }() + waitTableVersionBarrier(t, dmlStarted, "DML commit start") + close(releaseAlter) + + require.NoError(t, <-alterResult) + err := <-dmlResult + require.True(t, moerr.IsMoErrCode(err, moerr.ErrTxnNeedRetryWithDefChanged), err) + }) + + t.Run("dml prepared first may commit before alter", func(t *testing.T) { + tae, schema, version := newVersionedTable(t) + defer tae.Close() + dmlTxn := appendWithVersion(t, tae, schema, version) + + dmlPrepared, releaseDML := make(chan struct{}), make(chan struct{}) + dmlTxn.SetPrepareCommitFn(func(txn txnif.AsyncTxn) error { + close(dmlPrepared) + <-releaseDML + return txn.GetStore().PrepareCommit() + }) + dmlResult := make(chan error, 1) + go func() { dmlResult <- dmlTxn.Commit(ctx) }() + waitTableVersionBarrier(t, dmlPrepared, "DML prepare") + + alterTxn, alterRel := testutil.GetDefaultRelation(t, tae, schema.Name) + require.NoError(t, alterRel.AlterTable(ctx, api.NewUpdateAutoIncrementReq(0, alterRel.ID(), 20))) + alterStarted := make(chan struct{}) + alterResult := make(chan error, 1) + go func() { + close(alterStarted) + alterResult <- alterTxn.Commit(ctx) + }() + waitTableVersionBarrier(t, alterStarted, "ALTER commit start") + + close(releaseDML) + require.NoError(t, <-dmlResult) + require.NoError(t, <-alterResult) + }) +} + func TestAlterColumnAndFreeze(t *testing.T) { defer testutils.AfterTest(t)() testutils.EnsureNoLeak(t) diff --git a/pkg/vm/engine/tae/rpc/handle.go b/pkg/vm/engine/tae/rpc/handle.go index a83d8a2182a19..3bf06eccef287 100644 --- a/pkg/vm/engine/tae/rpc/handle.go +++ b/pkg/vm/engine/tae/rpc/handle.go @@ -315,6 +315,9 @@ func (h *Handle) handleRequests( wr = h.apiEntryToWriteEntry(ctx, txnMeta, ae, true) // Check if this is a soft delete object request if wr.FileName != "" && isSoftDeleteEntry(wr.FileName) { + if err = h.registerWriteTableDefVersion(txn, wr); err != nil { + return + } // Handle soft delete object separately err = h.HandleSoftDeleteObject(ctx, txn, wr) if err != nil { @@ -326,6 +329,9 @@ func (h *Handle) handleRequests( wr = req.(*cmd_util.WriteReq) // Check if this is a soft delete object request if wr.Type == cmd_util.EntrySoftDeleteObject { + if err = h.registerWriteTableDefVersion(txn, wr); err != nil { + return + } err = h.HandleSoftDeleteObject(ctx, txn, wr) if err != nil { return @@ -405,6 +411,36 @@ func (h *Handle) handleRequests( return } +type tableDefVersionRecorder interface { + SetTableDefVersion(uint32) error +} + +func setTableDefVersionDependency(rel handle.Relation, version uint32) error { + if version == 0 { + return nil + } + recorder, ok := rel.(tableDefVersionRecorder) + if !ok { + return moerr.NewInternalErrorNoCtxf("relation %T cannot record table definition version", rel) + } + return recorder.SetTableDefVersion(version) +} + +func (h *Handle) registerWriteTableDefVersion(txn txnif.AsyncTxn, req *cmd_util.WriteReq) error { + if req.TableDefVersion == 0 { + return nil + } + dbase, err := txn.GetDatabaseByID(req.DatabaseId) + if err != nil { + return err + } + rel, err := dbase.GetRelationByID(req.TableID) + if err != nil { + return err + } + return setTableDefVersionDependency(rel, req.TableDefVersion) +} + //#endregion //#region Impl TxnStorage interface @@ -423,14 +459,15 @@ func (h *Handle) apiEntryToWriteEntry( } req := &cmd_util.WriteReq{ - Type: cmd_util.EntryType(pe.EntryType), - DatabaseId: pe.GetDatabaseId(), - TableID: pe.GetTableId(), - DatabaseName: pe.GetDatabaseName(), - TableName: pe.GetTableName(), - FileName: pe.GetFileName(), - Batch: moBat, - PkCheck: cmd_util.PKCheckType(pe.GetPkCheckByTn()), + Type: cmd_util.EntryType(pe.EntryType), + DatabaseId: pe.GetDatabaseId(), + TableID: pe.GetTableId(), + DatabaseName: pe.GetDatabaseName(), + TableName: pe.GetTableName(), + TableDefVersion: pe.GetTableDefVersion(), + FileName: pe.GetFileName(), + Batch: moBat, + PkCheck: cmd_util.PKCheckType(pe.GetPkCheckByTn()), } // Handle soft delete object: parse ObjectID from batch and IsTombstone from FileName @@ -895,6 +932,9 @@ func (h *Handle) HandleWrite( fmt.Sprintf("%d-%s", req.TableID, req.TableName))) return } + if err = setTableDefVersionDependency(tb, req.TableDefVersion); err != nil { + return + } if req.Type == cmd_util.EntryInsert { //Add blocks which had been bulk-loaded into S3 into table. diff --git a/pkg/vm/engine/tae/rpc/rpc_test.go b/pkg/vm/engine/tae/rpc/rpc_test.go index 2877f42db2613..fd841bf0f0bb8 100644 --- a/pkg/vm/engine/tae/rpc/rpc_test.go +++ b/pkg/vm/engine/tae/rpc/rpc_test.go @@ -26,6 +26,7 @@ import ( catalog2 "github.com/matrixorigin/matrixone/pkg/catalog" "github.com/matrixorigin/matrixone/pkg/container/batch" "github.com/matrixorigin/matrixone/pkg/container/types" + "github.com/matrixorigin/matrixone/pkg/container/vector" "github.com/matrixorigin/matrixone/pkg/objectio" "github.com/matrixorigin/matrixone/pkg/objectio/ioutil" "github.com/matrixorigin/matrixone/pkg/pb/api" @@ -45,6 +46,25 @@ import ( "github.com/stretchr/testify/assert" ) +func TestAPIEntryTableDefVersionIsModeIndependent(t *testing.T) { + h := new(Handle) + cnBatch := batch.NewWithSize(1) + cnBatch.Vecs[0] = vector.NewVec(types.T_int64.ToType()) + pbBatch, err := batch.BatchToProtoBatch(cnBatch) + require.NoError(t, err) + for _, mode := range []string{"optimistic", "pessimistic"} { + t.Run(mode, func(t *testing.T) { + req := h.apiEntryToWriteEntry(context.Background(), txnpb.TxnMeta{}, &api.Entry{ + EntryType: api.Entry_Insert, + Bat: pbBatch, + TableDefVersion: 7, + }, false) + require.NotNil(t, req) + require.Equal(t, uint32(7), req.TableDefVersion) + }) + } +} + func TestHandle_HandleCommitPerformanceForS3Load(t *testing.T) { defer testutils.AfterTest(t)() opts := config.WithLongScanAndCKPOpts(nil) diff --git a/pkg/vm/engine/tae/txn/txnimpl/relation.go b/pkg/vm/engine/tae/txn/txnimpl/relation.go index c7ff4d043e627..fa3eccd0afd28 100644 --- a/pkg/vm/engine/tae/txn/txnimpl/relation.go +++ b/pkg/vm/engine/tae/txn/txnimpl/relation.go @@ -115,6 +115,11 @@ type txnRelation struct { table *txnTable } +// SetTableDefVersion records the CN schema dependency for this relation. +func (h *txnRelation) SetTableDefVersion(version uint32) error { + return h.table.setExpectedTableDefVersion(version) +} + func newRelation(table *txnTable) *txnRelation { rel := &txnRelation{ TxnRelation: &txnbase.TxnRelation{ diff --git a/pkg/vm/engine/tae/txn/txnimpl/table.go b/pkg/vm/engine/tae/txn/txnimpl/table.go index 61f779eccf2c8..b73776cba36f9 100644 --- a/pkg/vm/engine/tae/txn/txnimpl/table.go +++ b/pkg/vm/engine/tae/txn/txnimpl/table.go @@ -118,6 +118,70 @@ type txnTable struct { dedupTS types.TS idx int + + // expectedTableDefVersion is the CN schema version this transaction's + // user-table writes were planned against. Zero means old-CN compatibility. + expectedTableDefVersion uint32 +} + +func (tbl *txnTable) setExpectedTableDefVersion(version uint32) error { + if version == 0 { + return nil + } + if tbl.expectedTableDefVersion == 0 { + tbl.expectedTableDefVersion = version + return nil + } + if tbl.expectedTableDefVersion != version { + return moerr.NewTxnNeedRetryWithDefChangedNoCtx() + } + return nil +} + +func (tbl *txnTable) validateTableDefVersion() error { + expected := tbl.expectedTableDefVersion + if expected == 0 { + return nil + } + + prepareTS := tbl.store.txn.GetPrepareTS() + for { + tbl.entry.RLock() + latest := tbl.entry.GetLatestNodeLocked() + if latest != nil && !latest.IsSameTxn(tbl.store.txn) { + if needWait, txnToWait := latest.NeedWaitCommitting(prepareTS); needWait { + tbl.entry.RUnlock() + txnToWait.GetTxnState(true) + continue + } + } + + actual := uint32(0) + tbl.entry.LoopChainLocked(func(node *catalog.MVCCNode[*catalog.TableMVCCNode]) bool { + // An ALTER in this same transaction cannot be ordered around this DML. + if node.IsSameTxn(tbl.store.txn) { + actual = node.BaseNode.Schema.Version + return false + } + if node.IsActive() || node.IsCommitting() || node.IsAborted() { + return true + } + // A schema committed with a later prepare timestamp is ordered after + // this DML and must not invalidate it. + nodePrepareTS := node.GetPrepare() + if nodePrepareTS.GT(&prepareTS) { + return true + } + actual = node.BaseNode.Schema.Version + return false + }) + tbl.entry.RUnlock() + + if actual != expected { + return moerr.NewTxnNeedRetryWithDefChangedNoCtx() + } + return nil + } } func newTxnTable(store *txnStore, entry *catalog.TableEntry) (*txnTable, error) { @@ -1446,6 +1510,9 @@ func (tbl *txnTable) dumpCore(errMsg string) { } func (tbl *txnTable) PrepareCommit() (err error) { + if err = tbl.validateTableDefVersion(); err != nil { + return err + } nodeCount := len(tbl.txnEntries.entries) for idx, node := range tbl.txnEntries.entries { if tbl.txnEntries.IsDeleted(idx) { diff --git a/pkg/vm/engine/tae/txn/txnimpl/txn_test.go b/pkg/vm/engine/tae/txn/txnimpl/txn_test.go index ee3d1cfe516a3..13727dbdff57a 100644 --- a/pkg/vm/engine/tae/txn/txnimpl/txn_test.go +++ b/pkg/vm/engine/tae/txn/txnimpl/txn_test.go @@ -23,6 +23,7 @@ import ( "time" "github.com/matrixorigin/matrixone/pkg/objectio" + apipb "github.com/matrixorigin/matrixone/pkg/pb/api" "github.com/matrixorigin/matrixone/pkg/common/moerr" "github.com/matrixorigin/matrixone/pkg/common/mpool" @@ -44,6 +45,136 @@ const ( ModuleName = "TAETXN" ) +type waitingSchemaTxn struct { + txnif.TxnReader + prepareTS types.TS + waited chan struct{} + release chan struct{} + once sync.Once +} + +func (txn *waitingSchemaTxn) GetPrepareTS() types.TS { return txn.prepareTS } +func (txn *waitingSchemaTxn) GetCommitTS() types.TS { return txn.prepareTS } +func (txn *waitingSchemaTxn) GetTxnState(wait bool) txnif.TxnState { + if !wait { + return txnif.TxnStatePreparing + } + txn.once.Do(func() { close(txn.waited) }) + <-txn.release + return txnif.TxnStateCommitted +} + +func TestTableDefVersionFenceWaitsForEarlierSchemaPrepare(t *testing.T) { + for _, tc := range []struct { + name string + rollback bool + }{ + {name: "commit retries"}, + {name: "rollback continues", rollback: true}, + } { + t.Run(tc.name, func(t *testing.T) { + schema := catalog.MockSchemaAll(3, 1) + schema.Version = 7 + entry := catalog.MockTableEntryWithDB(nil, 42) + entry.CreateWithTSLocked(types.BuildTS(1, 0), &catalog.TableMVCCNode{ + Schema: schema, + TombstoneSchema: catalog.GetTombstoneSchema(schema), + }) + + alterBase := txnbase.NewTxn(nil, nil, []byte("alter"), types.BuildTS(2, 0), types.TS{}) + alterTxn := &waitingSchemaTxn{ + TxnReader: alterBase, + prepareTS: types.BuildTS(3, 0), + waited: make(chan struct{}), + release: make(chan struct{}), + } + _, _, err := entry.AlterTable(context.Background(), alterTxn, + apipb.NewUpdateAutoIncrementReq(0, 42, 20)) + assert.NoError(t, err) + + dmlTxn := txnbase.NewTxn(nil, nil, []byte("dml"), types.BuildTS(2, 1), types.TS{}) + dmlTxn.Lock() + assert.NoError(t, dmlTxn.ToPreparingLocked(types.BuildTS(4, 0))) + dmlTxn.Unlock() + tbl := &txnTable{ + store: &txnStore{txn: dmlTxn}, + entry: entry, + expectedTableDefVersion: 7, + } + + result := make(chan error, 1) + go func() { result <- tbl.validateTableDefVersion() }() + select { + case <-alterTxn.waited: + case <-time.After(5 * time.Second): + t.Fatal("version fence did not wait for earlier schema prepare") + } + + if tc.rollback { + _, err = entry.BaseEntryImpl.PrepareRollback() + assert.NoError(t, err) + } else { + assert.NoError(t, entry.BaseEntryImpl.PrepareCommit()) + assert.NoError(t, entry.BaseEntryImpl.ApplyCommit(alterTxn.GetID())) + } + close(alterTxn.release) + + select { + case err = <-result: + case <-time.After(5 * time.Second): + t.Fatal("version fence did not resume after schema transaction finished") + } + if tc.rollback { + assert.NoError(t, err) + } else { + assert.True(t, moerr.IsMoErrCode(err, moerr.ErrTxnNeedRetryWithDefChanged), err) + } + }) + } +} + +func TestTableDefVersionDependencyRejectsConflictingExpectations(t *testing.T) { + tbl := new(txnTable) + assert.NoError(t, tbl.setExpectedTableDefVersion(0)) + assert.NoError(t, tbl.setExpectedTableDefVersion(7)) + assert.NoError(t, tbl.setExpectedTableDefVersion(7)) + err := tbl.setExpectedTableDefVersion(8) + assert.True(t, moerr.IsMoErrCode(err, moerr.ErrTxnNeedRetryWithDefChanged), err) +} + +func TestTableDefVersionFenceUsesPrepareOrderForCommittedSchema(t *testing.T) { + schema := catalog.MockSchemaAll(3, 1) + schema.Version = 7 + entry := catalog.MockTableEntryWithDB(nil, 42) + entry.CreateWithTSLocked(types.BuildTS(1, 0), &catalog.TableMVCCNode{ + Schema: schema, TombstoneSchema: catalog.GetTombstoneSchema(schema), + }) + + alterBase := txnbase.NewTxn(nil, nil, []byte("later-alter"), types.BuildTS(2, 0), types.TS{}) + alterTxn := &waitingSchemaTxn{ + TxnReader: alterBase, + prepareTS: types.BuildTS(5, 0), + waited: make(chan struct{}), + release: make(chan struct{}), + } + _, _, err := entry.AlterTable(context.Background(), alterTxn, + apipb.NewUpdateAutoIncrementReq(0, 42, 20)) + assert.NoError(t, err) + assert.NoError(t, entry.BaseEntryImpl.PrepareCommit()) + assert.NoError(t, entry.BaseEntryImpl.ApplyCommit(alterTxn.GetID())) + + dmlTxn := txnbase.NewTxn(nil, nil, []byte("earlier-dml"), types.BuildTS(2, 1), types.TS{}) + dmlTxn.Lock() + assert.NoError(t, dmlTxn.ToPreparingLocked(types.BuildTS(4, 0))) + dmlTxn.Unlock() + tbl := &txnTable{ + store: &txnStore{txn: dmlTxn}, + entry: entry, + expectedTableDefVersion: 7, + } + assert.NoError(t, tbl.validateTableDefVersion()) +} + // 1. 30 concurrency // 2. 10000 node // 3. 512K buffer diff --git a/proto/api.proto b/proto/api.proto index e929c195239d9..0face5389443b 100644 --- a/proto/api.proto +++ b/proto/api.proto @@ -244,6 +244,9 @@ message Entry { Batch bat = 7; // whether TN do the PK uniqueness check against txn's workspace or not. int32 pk_check_by_tn = 8; + // table definition version used by the CN when planning this write. + // Zero is reserved for compatibility with old CNs. + uint32 table_def_version = 9; }; // There are two kinds of checkpoint: delta checkpoint and base checkpoint, From b2c39bce4649606d2ae2d6445d2825092f9b89b4 Mon Sep 17 00:00:00 2001 From: ULookup Date: Mon, 13 Jul 2026 17:33:36 +0800 Subject: [PATCH 2/6] fix: distinguish unknown table versions --- pkg/vm/engine/cmd_util/operations.go | 10 +- pkg/vm/engine/disttae/tools.go | 19 ++- pkg/vm/engine/disttae/txn.go | 196 +++++++++++++++------- pkg/vm/engine/disttae/txn_table.go | 21 +-- pkg/vm/engine/disttae/txn_test.go | 24 ++- pkg/vm/engine/disttae/types.go | 20 ++- pkg/vm/engine/tae/db/test/db_test.go | 81 ++++++++- pkg/vm/engine/tae/rpc/handle.go | 29 ++-- pkg/vm/engine/tae/rpc/rpc_test.go | 63 +++++-- pkg/vm/engine/tae/txn/txnimpl/table.go | 43 ++--- pkg/vm/engine/tae/txn/txnimpl/txn_test.go | 39 ++++- proto/api.proto | 4 +- 12 files changed, 387 insertions(+), 162 deletions(-) diff --git a/pkg/vm/engine/cmd_util/operations.go b/pkg/vm/engine/cmd_util/operations.go index d37a3641ae776..4df39b339dc9b 100644 --- a/pkg/vm/engine/cmd_util/operations.go +++ b/pkg/vm/engine/cmd_util/operations.go @@ -163,10 +163,12 @@ type WriteReq struct { DatabaseName string TableName string // TableDefVersion is the schema version used by CN to plan the write. - // Zero is accepted for old-CN compatibility. - TableDefVersion uint32 - Schema *catalog2.Schema - Batch *batch.Batch + // TableDefVersionKnown distinguishes a valid initial zero version from an + // old CN that did not send the dependency. + TableDefVersion uint32 + TableDefVersionKnown bool + Schema *catalog2.Schema + Batch *batch.Batch //[IncrementalDedup|FullSkipWorkspaceDedup|FullDedup], default is IncrementalDedup. //If incremental-dedup in dn.toml is false, IncrementalDedup will be treated as FullSkipWorkspaceDedup. //IncrementalDedup do not check uniqueness of PK before txn's snapshot TS. diff --git a/pkg/vm/engine/disttae/tools.go b/pkg/vm/engine/disttae/tools.go index 60a8df9a4ac25..e80e0fdf9ee82 100644 --- a/pkg/vm/engine/disttae/tools.go +++ b/pkg/vm/engine/disttae/tools.go @@ -173,15 +173,16 @@ func toPBEntry(e Entry) (*api.Entry, error) { return nil, err } return &api.Entry{ - Bat: bat, - EntryType: typ, - TableId: e.tableId, - DatabaseId: e.databaseId, - TableName: e.tableName, - DatabaseName: e.databaseName, - FileName: e.fileName, - PkCheckByTn: int32(e.pkChkByTN), - TableDefVersion: e.tableDefVersion, + Bat: bat, + EntryType: typ, + TableId: e.tableId, + DatabaseId: e.databaseId, + TableName: e.tableName, + DatabaseName: e.databaseName, + FileName: e.fileName, + PkCheckByTn: int32(e.pkChkByTN), + TableDefVersion: e.tableDefVersion, + TableDefVersionKnown: e.tableDefVersionKnown, }, nil } diff --git a/pkg/vm/engine/disttae/txn.go b/pkg/vm/engine/disttae/txn.go index dd219e668a993..6aa7d90163bde 100644 --- a/pkg/vm/engine/disttae/txn.go +++ b/pkg/vm/engine/disttae/txn.go @@ -95,8 +95,8 @@ func (txn *Transaction) WriteBatch( tableName string, bat *batch.Batch, tnStore DNStore) (genRowidVec *vector.Vector, err error) { - return txn.writeBatchWithVersion(typ, note, accountId, databaseId, tableId, - databaseName, tableName, bat, tnStore, 0) + return txn.writeBatchWithVersionKnown(typ, note, accountId, databaseId, tableId, + databaseName, tableName, bat, tnStore, 0, false) } func (txn *Transaction) writeBatchWithVersion( @@ -109,6 +109,22 @@ func (txn *Transaction) writeBatchWithVersion( bat *batch.Batch, tnStore DNStore, tableDefVersion uint32, +) (genRowidVec *vector.Vector, err error) { + return txn.writeBatchWithVersionKnown(typ, note, accountId, databaseId, tableId, + databaseName, tableName, bat, tnStore, tableDefVersion, true) +} + +func (txn *Transaction) writeBatchWithVersionKnown( + typ int, note string, + accountId uint32, + databaseId uint64, + tableId uint64, + databaseName string, + tableName string, + bat *batch.Batch, + tnStore DNStore, + tableDefVersion uint32, + tableDefVersionKnown bool, ) (genRowidVec *vector.Vector, err error) { start := time.Now() seq := txn.op.NextSequence() @@ -251,18 +267,19 @@ func (txn *Transaction) writeBatchWithVersion( } e := Entry{ - typ: typ, - accountId: accountId, - bat: bat, - tableId: tableId, - databaseId: databaseId, - tableName: tableName, - databaseName: databaseName, - tnStore: tnStore, - tableDefVersion: tableDefVersion, - note: note, - pkCheckPos: pkCheckPos, - pkCheckReady: pkCheckReady, + typ: typ, + accountId: accountId, + bat: bat, + tableId: tableId, + databaseId: databaseId, + tableName: tableName, + databaseName: databaseName, + tnStore: tnStore, + tableDefVersion: tableDefVersion, + tableDefVersionKnown: tableDefVersionKnown, + note: note, + pkCheckPos: pkCheckPos, + pkCheckReady: pkCheckReady, } txn.writes = append(txn.writes, e) txn.pkCount += bat.RowCount() @@ -868,7 +885,8 @@ func (txn *Transaction) dumpInsertBatchLocked( dbName: txn.writes[i].databaseName, name: txn.writes[i].tableName, }, - tableDefVersion: txn.writes[i].tableDefVersion, + tableDefVersion: txn.writes[i].tableDefVersion, + tableDefVersionKnown: txn.writes[i].tableDefVersionKnown, } // Tables not resolved in the pre-resolution pass were appended // to the workspace while the lock was released; keep them in @@ -942,7 +960,7 @@ func (txn *Transaction) dumpInsertBatchLocked( table = tbl.(*txnTable) } - if err = table.getTxn().writeFileLockedWithVersion( + if err = table.getTxn().writeFileLockedWithVersionKnown( INSERT, table.accountId, table.db.databaseId, @@ -953,6 +971,7 @@ func (txn *Transaction) dumpInsertBatchLocked( bat, table.getTxn().tnStores[0], tbKey.tableDefVersion, + tbKey.tableDefVersionKnown, ); err != nil { return err } @@ -1007,7 +1026,8 @@ func (txn *Transaction) dumpDeleteBatchLocked( dbName: txn.writes[i].databaseName, name: txn.writes[i].tableName, }, - tableDefVersion: txn.writes[i].tableDefVersion, + tableDefVersion: txn.writes[i].tableDefVersion, + tableDefVersionKnown: txn.writes[i].tableDefVersionKnown, } // Tables not resolved in the pre-resolution pass were appended // to the workspace while the lock was released; keep them in @@ -1085,7 +1105,7 @@ func (txn *Transaction) dumpDeleteBatchLocked( table = tbl.(*txnTable) } - if err = table.getTxn().writeFileLockedWithVersion( + if err = table.getTxn().writeFileLockedWithVersionKnown( DELETE, table.accountId, table.db.databaseId, @@ -1096,6 +1116,7 @@ func (txn *Transaction) dumpDeleteBatchLocked( bat, table.getTxn().tnStores[0], tbKey.tableDefVersion, + tbKey.tableDefVersionKnown, ); err != nil { return err } @@ -1314,13 +1335,15 @@ func (txn *Transaction) registerCNObjects( dbName string, tbName string, tableDefVersion uint32, + tableDefVersionKnown bool, ) { txn.cnObjsSummary[objId] = Summary{ - objBat: objBat, - accountId: accountId, - dbName: dbName, - tbName: tbName, - tableDefVersion: tableDefVersion, + objBat: objBat, + accountId: accountId, + dbName: dbName, + tbName: tbName, + tableDefVersion: tableDefVersion, + tableDefVersionKnown: tableDefVersionKnown, } } @@ -1335,8 +1358,8 @@ func (txn *Transaction) WriteFileLocked( inputBat *batch.Batch, tnStore DNStore, ) (err error) { - return txn.writeFileLockedWithVersion(typ, accountId, databaseId, tableId, - databaseName, tableName, fileName, inputBat, tnStore, 0) + return txn.writeFileLockedWithVersionKnown(typ, accountId, databaseId, tableId, + databaseName, tableName, fileName, inputBat, tnStore, 0, false) } func (txn *Transaction) writeFileLockedWithVersion( @@ -1351,6 +1374,23 @@ func (txn *Transaction) writeFileLockedWithVersion( tnStore DNStore, tableDefVersion uint32, ) (err error) { + return txn.writeFileLockedWithVersionKnown(typ, accountId, databaseId, tableId, + databaseName, tableName, fileName, inputBat, tnStore, tableDefVersion, true) +} + +func (txn *Transaction) writeFileLockedWithVersionKnown( + typ int, + accountId uint32, + databaseId, + tableId uint64, + databaseName, + tableName string, + fileName string, + inputBat *batch.Batch, + tnStore DNStore, + tableDefVersion uint32, + tableDefVersionKnown bool, +) (err error) { txn.hasS3Op.Store(true) @@ -1371,7 +1411,7 @@ func (txn *Transaction) writeFileLockedWithVersion( sid := oid.Segment() server.PutCnSegment(txn.op.Txn().ID, tableId, sid, colexec.TxnWorkspaceUnCommitType) - txn.registerCNObjects(*oid, accountId, copied, databaseName, tableName, tableDefVersion) + txn.registerCNObjects(*oid, accountId, copied, databaseName, tableName, tableDefVersion, tableDefVersionKnown) } } @@ -1387,18 +1427,19 @@ func (txn *Transaction) writeFileLockedWithVersion( } entry := Entry{ - typ: typ, - accountId: accountId, - tableId: tableId, - databaseId: databaseId, - tableName: tableName, - databaseName: databaseName, - fileName: fileName, - bat: copied, - tnStore: tnStore, - pkCheckPos: -1, - pkCheckReady: true, - tableDefVersion: tableDefVersion, + typ: typ, + accountId: accountId, + tableId: tableId, + databaseId: databaseId, + tableName: tableName, + databaseName: databaseName, + fileName: fileName, + bat: copied, + tnStore: tnStore, + pkCheckPos: -1, + pkCheckReady: true, + tableDefVersion: tableDefVersion, + tableDefVersionKnown: tableDefVersionKnown, } txn.writes = append(txn.writes, entry) @@ -1419,8 +1460,8 @@ func (txn *Transaction) WriteFileLockedSkipTransfer( inputBat *batch.Batch, tnStore DNStore, ) (err error) { - return txn.writeFileLockedSkipTransferWithVersion(typ, accountId, databaseId, tableId, - databaseName, tableName, fileName, inputBat, tnStore, 0) + return txn.writeFileLockedSkipTransferWithVersionKnown(typ, accountId, databaseId, tableId, + databaseName, tableName, fileName, inputBat, tnStore, 0, false) } func (txn *Transaction) writeFileLockedSkipTransferWithVersion( @@ -1435,6 +1476,23 @@ func (txn *Transaction) writeFileLockedSkipTransferWithVersion( tnStore DNStore, tableDefVersion uint32, ) (err error) { + return txn.writeFileLockedSkipTransferWithVersionKnown(typ, accountId, databaseId, tableId, + databaseName, tableName, fileName, inputBat, tnStore, tableDefVersion, true) +} + +func (txn *Transaction) writeFileLockedSkipTransferWithVersionKnown( + typ int, + accountId uint32, + databaseId, + tableId uint64, + databaseName, + tableName string, + fileName string, + inputBat *batch.Batch, + tnStore DNStore, + tableDefVersion uint32, + tableDefVersionKnown bool, +) (err error) { txn.hasS3Op.Store(true) @@ -1455,7 +1513,7 @@ func (txn *Transaction) writeFileLockedSkipTransferWithVersion( sid := oid.Segment() server.PutCnSegment(txn.op.Txn().ID, tableId, sid, colexec.TxnWorkspaceUnCommitType) - txn.registerCNObjects(*oid, accountId, copied, databaseName, tableName, tableDefVersion) + txn.registerCNObjects(*oid, accountId, copied, databaseName, tableName, tableDefVersion, tableDefVersionKnown) } } @@ -1471,17 +1529,18 @@ func (txn *Transaction) writeFileLockedSkipTransferWithVersion( } entry := Entry{ - typ: typ, - accountId: accountId, - tableId: tableId, - databaseId: databaseId, - tableName: tableName, - databaseName: databaseName, - fileName: fileName, - bat: copied, - tnStore: tnStore, - skipTransfer: true, - tableDefVersion: tableDefVersion, + typ: typ, + accountId: accountId, + tableId: tableId, + databaseId: databaseId, + tableName: tableName, + databaseName: databaseName, + fileName: fileName, + bat: copied, + tnStore: tnStore, + skipTransfer: true, + tableDefVersion: tableDefVersion, + tableDefVersionKnown: tableDefVersionKnown, } txn.writes = append(txn.writes, entry) @@ -1502,8 +1561,8 @@ func (txn *Transaction) WriteFile( bat *batch.Batch, tnStore DNStore, ) error { - return txn.writeFileWithVersion(typ, accountId, databaseId, tableId, - databaseName, tableName, fileName, bat, tnStore, 0) + return txn.writeFileWithVersionKnown(typ, accountId, databaseId, tableId, + databaseName, tableName, fileName, bat, tnStore, 0, false) } func (txn *Transaction) writeFileWithVersion( @@ -1518,11 +1577,28 @@ func (txn *Transaction) writeFileWithVersion( tnStore DNStore, tableDefVersion uint32, ) error { + return txn.writeFileWithVersionKnown(typ, accountId, databaseId, tableId, + databaseName, tableName, fileName, bat, tnStore, tableDefVersion, true) +} + +func (txn *Transaction) writeFileWithVersionKnown( + typ int, + accountId uint32, + databaseId, + tableId uint64, + databaseName, + tableName string, + fileName string, + bat *batch.Batch, + tnStore DNStore, + tableDefVersion uint32, + tableDefVersionKnown bool, +) error { txn.Lock() defer txn.Unlock() - return txn.writeFileLockedWithVersion( + return txn.writeFileLockedWithVersionKnown( typ, accountId, databaseId, @@ -1533,6 +1609,7 @@ func (txn *Transaction) writeFileWithVersion( bat, tnStore, tableDefVersion, + tableDefVersionKnown, ) } @@ -1991,7 +2068,8 @@ func (txn *Transaction) compactDeletionOnObjsLocked(ctx context.Context) error { dbName: summary.dbName, name: summary.tbName, }, - tableDefVersion: summary.tableDefVersion, + tableDefVersion: summary.tableDefVersion, + tableDefVersionKnown: summary.tableDefVersionKnown, } } @@ -2047,7 +2125,7 @@ func (txn *Transaction) compactDeletionOnObjsLocked(ctx context.Context) error { locker.Lock() defer locker.Unlock() - if err = txn.writeFileLockedWithVersion( + if err = txn.writeFileLockedWithVersionKnown( INSERT, tbl.accountId, tbl.db.databaseId, @@ -2058,6 +2136,7 @@ func (txn *Transaction) compactDeletionOnObjsLocked(ctx context.Context) error { bat, txn.tnStores[0], tbKey.tableDefVersion, + tbKey.tableDefVersionKnown, ); err != nil { bat.Clean(txn.proc.Mp()) panicWhenFailed(err, "write txn file failed") @@ -2105,7 +2184,7 @@ func (txn *Transaction) compactDeletionOnObjsLocked(ctx context.Context) error { bat.SetRowCount(bat.Vecs[0].Length()) - if err := txn.writeFileLockedWithVersion( + if err := txn.writeFileLockedWithVersionKnown( INSERT, entry.accountId, entry.databaseId, @@ -2116,6 +2195,7 @@ func (txn *Transaction) compactDeletionOnObjsLocked(ctx context.Context) error { bat, entry.tnStore, entry.tableDefVersion, + entry.tableDefVersionKnown, ); err != nil { bat.Clean(txn.proc.Mp()) return err diff --git a/pkg/vm/engine/disttae/txn_table.go b/pkg/vm/engine/disttae/txn_table.go index df0d2124aff5e..2e959b765f1b0 100644 --- a/pkg/vm/engine/disttae/txn_table.go +++ b/pkg/vm/engine/disttae/txn_table.go @@ -2099,16 +2099,17 @@ func (tbl *txnTable) SoftDeleteObject(ctx context.Context, objID *objectio.Objec // Create entry with EntrySoftDeleteObject type entry := Entry{ - typ: SOFT_DELETE_OBJECT, - bat: bat, - tnStore: tbl.getTxn().tnStores[0], - tableId: tbl.tableId, - databaseId: tbl.db.databaseId, - tableName: tbl.tableName, - databaseName: tbl.db.databaseName, - accountId: tbl.accountId, - fileName: makeSoftDeleteFileName(isTombstone), - tableDefVersion: tbl.version, + typ: SOFT_DELETE_OBJECT, + bat: bat, + tnStore: tbl.getTxn().tnStores[0], + tableId: tbl.tableId, + databaseId: tbl.db.databaseId, + tableName: tbl.tableName, + databaseName: tbl.db.databaseName, + accountId: tbl.accountId, + fileName: makeSoftDeleteFileName(isTombstone), + tableDefVersion: tbl.version, + tableDefVersionKnown: true, } tbl.getTxn().writes = append(tbl.getTxn().writes, entry) diff --git a/pkg/vm/engine/disttae/txn_test.go b/pkg/vm/engine/disttae/txn_test.go index 15f2b386d33fa..60bbe574b0e2e 100644 --- a/pkg/vm/engine/disttae/txn_test.go +++ b/pkg/vm/engine/disttae/txn_test.go @@ -52,17 +52,20 @@ func TestPrecommitEntryCarriesTableDefVersion(t *testing.T) { for _, tc := range []struct { name string version uint32 + known bool }{ - {name: "known", version: 7}, - {name: "old cn compatibility", version: 0}, + {name: "known", version: 7, known: true}, + {name: "known zero", version: 0, known: true}, + {name: "old cn compatibility", version: 0, known: false}, } { t.Run(tc.name, func(t *testing.T) { encoded, err := toPBEntry(Entry{ - typ: DELETE, - tableId: 42, - databaseId: 7, - bat: bat, - tableDefVersion: tc.version, + typ: DELETE, + tableId: 42, + databaseId: 7, + bat: bat, + tableDefVersion: tc.version, + tableDefVersionKnown: tc.known, }) require.NoError(t, err) @@ -71,6 +74,7 @@ func TestPrecommitEntryCarriesTableDefVersion(t *testing.T) { decoded := new(api.Entry) require.NoError(t, decoded.Unmarshal(data)) require.Equal(t, tc.version, decoded.TableDefVersion) + require.Equal(t, tc.known, decoded.TableDefVersionKnown) }) } } @@ -78,8 +82,8 @@ func TestPrecommitEntryCarriesTableDefVersion(t *testing.T) { func TestWorkspaceFlushKeySeparatesTableDefVersions(t *testing.T) { base := tableKey{accountId: 1, databaseId: 7, dbName: "db", name: "tbl"} batches := map[workspaceTableKey]int{ - {tableKey: base, tableDefVersion: 7}: 1, - {tableKey: base, tableDefVersion: 8}: 1, + {tableKey: base, tableDefVersion: 0, tableDefVersionKnown: false}: 1, + {tableKey: base, tableDefVersion: 0, tableDefVersionKnown: true}: 1, } require.Len(t, batches, 2) } @@ -221,6 +225,7 @@ func TestWriteBatchRecordsPKCheckState(t *testing.T) { require.Len(t, txn.writes, 1) require.False(t, txn.writes[0].pkCheckReady) require.Equal(t, -1, txn.writes[0].pkCheckPos) + require.False(t, txn.writes[0].tableDefVersionKnown) bat.Clean(proc.Mp()) }) @@ -259,6 +264,7 @@ func TestWriteBatchRecordsPKCheckState(t *testing.T) { require.NoError(t, err) require.Len(t, txn.writes, 1) require.Equal(t, uint32(7), txn.writes[0].tableDefVersion) + require.True(t, txn.writes[0].tableDefVersionKnown) bat.Clean(txn.proc.Mp()) }) diff --git a/pkg/vm/engine/disttae/types.go b/pkg/vm/engine/disttae/types.go index 3e0eb36737fb2..cb0a8af240d27 100644 --- a/pkg/vm/engine/disttae/types.go +++ b/pkg/vm/engine/disttae/types.go @@ -497,11 +497,12 @@ func (txn *Transaction) GetSyncProtectionJobID() string { } type Summary struct { - objBat *batch.Batch - accountId uint32 - tbName string - dbName string - tableDefVersion uint32 + objBat *batch.Batch + accountId uint32 + tbName string + dbName string + tableDefVersion uint32 + tableDefVersionKnown bool } // FIXME: The map inside this one will be accessed concurrently, using @@ -1137,8 +1138,10 @@ type Entry struct { tnStore DNStore pkChkByTN int8 // tableDefVersion is the schema version used to plan this user-table write. - // Zero means unknown/old-CN compatibility. - tableDefVersion uint32 + // tableDefVersionKnown distinguishes a valid initial zero version from an + // old CN that did not send the dependency. + tableDefVersion uint32 + tableDefVersionKnown bool // skipTransfer indicates this entry should skip transfer processing // Used by CCPR to avoid transfer errors for cross-cluster tombstones @@ -1201,7 +1204,8 @@ type tableKey struct { // from being coalesced when the CN workspace is flushed to S3. type workspaceTableKey struct { tableKey - tableDefVersion uint32 + tableDefVersion uint32 + tableDefVersionKnown bool } func (k tableKey) String() string { diff --git a/pkg/vm/engine/tae/db/test/db_test.go b/pkg/vm/engine/tae/db/test/db_test.go index c23f2a4afad90..37095c9dbe959 100644 --- a/pkg/vm/engine/tae/db/test/db_test.go +++ b/pkg/vm/engine/tae/db/test/db_test.go @@ -6629,14 +6629,89 @@ func TestTableDefVersionCommitFence(t *testing.T) { return txn } - t.Run("matching and zero compatibility", func(t *testing.T) { + t.Run("known initial zero retries after first alter", func(t *testing.T) { + tae := testutil.InitTestDB(ctx, ModuleName, t, config.WithLongScanAndCKPOpts(nil)) + defer tae.Close() + schema := catalog.MockSchemaAll(3, 1) + testutil.CreateRelation(t, tae, testutil.DefaultTestDB, schema, true) + dmlTxn := appendWithVersion(t, tae, schema, 0) + + alterTxn, alterRel := testutil.GetDefaultRelation(t, tae, schema.Name) + require.NoError(t, alterRel.AlterTable(ctx, api.NewUpdateAutoIncrementReq(0, alterRel.ID(), 10))) + require.NoError(t, alterTxn.Commit(ctx)) + err := dmlTxn.Commit(ctx) + require.True(t, moerr.IsMoErrCode(err, moerr.ErrTxnNeedRetryWithDefChanged), err) + }) + + t.Run("unknown initial zero remains compatible", func(t *testing.T) { + tae := testutil.InitTestDB(ctx, ModuleName, t, config.WithLongScanAndCKPOpts(nil)) + defer tae.Close() + schema := catalog.MockSchemaAll(3, 1) + testutil.CreateRelation(t, tae, testutil.DefaultTestDB, schema, true) + unknownTxn, _ := testutil.GetDefaultRelation(t, tae, schema.Name) + require.NoError(t, unknownTxn.MockIncWriteCnt()) + + alterTxn, alterRel := testutil.GetDefaultRelation(t, tae, schema.Name) + require.NoError(t, alterRel.AlterTable(ctx, api.NewUpdateAutoIncrementReq(0, alterRel.ID(), 10))) + require.NoError(t, alterTxn.Commit(ctx)) + require.NoError(t, unknownTxn.Commit(ctx)) + }) + + t.Run("matching version", func(t *testing.T) { tae, schema, version := newVersionedTable(t) defer tae.Close() require.NoError(t, appendWithVersion(t, tae, schema, version).Commit(ctx)) + }) + t.Run("same txn dml then alter", func(t *testing.T) { + tae, schema, version := newVersionedTable(t) + defer tae.Close() txn, rel := testutil.GetDefaultRelation(t, tae, schema.Name) - require.NoError(t, rel.(tableDefVersionSetter).SetTableDefVersion(0)) - require.NoError(t, txn.MockIncWriteCnt()) + require.NoError(t, rel.(tableDefVersionSetter).SetTableDefVersion(version)) + bat := containers.MockBatchWithAttrsAndOffset(schema.Types(), schema.Attrs(), 1, 0) + defer bat.Close() + require.NoError(t, rel.Append(ctx, bat)) + _, _, err := rel.GetByFilter(ctx, handle.NewEQFilter(bat.Vecs[schema.GetSingleSortKeyIdx()].Get(0))) + require.NoError(t, err) + require.NoError(t, rel.AlterTable(ctx, api.NewUpdateAutoIncrementReq(0, rel.ID(), 20))) + require.NoError(t, txn.Commit(ctx)) + }) + + t.Run("same txn alter then dml", func(t *testing.T) { + tae, schema, version := newVersionedTable(t) + defer tae.Close() + txn, rel := testutil.GetDefaultRelation(t, tae, schema.Name) + require.NoError(t, rel.AlterTable(ctx, api.NewUpdateAutoIncrementReq(0, rel.ID(), 20))) + localVersion := rel.Schema(false).(*catalog.Schema).Version + require.Equal(t, version+1, localVersion) + require.NoError(t, rel.(tableDefVersionSetter).SetTableDefVersion(localVersion)) + bat := containers.MockBatchWithAttrsAndOffset(schema.Types(), schema.Attrs(), 1, 0) + defer bat.Close() + require.NoError(t, rel.Append(ctx, bat)) + _, _, err := rel.GetByFilter(ctx, handle.NewEQFilter(bat.Vecs[schema.GetSingleSortKeyIdx()].Get(0))) + require.NoError(t, err) + require.NoError(t, txn.Commit(ctx)) + }) + + t.Run("same txn dml alter dml", func(t *testing.T) { + tae, schema, version := newVersionedTable(t) + defer tae.Close() + txn, rel := testutil.GetDefaultRelation(t, tae, schema.Name) + require.NoError(t, rel.(tableDefVersionSetter).SetTableDefVersion(version)) + before := containers.MockBatchWithAttrsAndOffset(schema.Types(), schema.Attrs(), 1, 0) + defer before.Close() + require.NoError(t, rel.Append(ctx, before)) + require.NoError(t, rel.AlterTable(ctx, api.NewUpdateAutoIncrementReq(0, rel.ID(), 20))) + localVersion := rel.Schema(false).(*catalog.Schema).Version + require.Equal(t, version+1, localVersion) + require.NoError(t, rel.(tableDefVersionSetter).SetTableDefVersion(localVersion)) + after := containers.MockBatchWithAttrsAndOffset(schema.Types(), schema.Attrs(), 1, 10) + defer after.Close() + require.NoError(t, rel.Append(ctx, after)) + _, _, err := rel.GetByFilter(ctx, handle.NewEQFilter(before.Vecs[schema.GetSingleSortKeyIdx()].Get(0))) + require.NoError(t, err) + _, _, err = rel.GetByFilter(ctx, handle.NewEQFilter(after.Vecs[schema.GetSingleSortKeyIdx()].Get(0))) + require.NoError(t, err) require.NoError(t, txn.Commit(ctx)) }) diff --git a/pkg/vm/engine/tae/rpc/handle.go b/pkg/vm/engine/tae/rpc/handle.go index 3bf06eccef287..9c7bda32794f7 100644 --- a/pkg/vm/engine/tae/rpc/handle.go +++ b/pkg/vm/engine/tae/rpc/handle.go @@ -415,8 +415,8 @@ type tableDefVersionRecorder interface { SetTableDefVersion(uint32) error } -func setTableDefVersionDependency(rel handle.Relation, version uint32) error { - if version == 0 { +func setTableDefVersionDependency(rel handle.Relation, version uint32, known bool) error { + if !known { return nil } recorder, ok := rel.(tableDefVersionRecorder) @@ -427,7 +427,7 @@ func setTableDefVersionDependency(rel handle.Relation, version uint32) error { } func (h *Handle) registerWriteTableDefVersion(txn txnif.AsyncTxn, req *cmd_util.WriteReq) error { - if req.TableDefVersion == 0 { + if !req.TableDefVersionKnown { return nil } dbase, err := txn.GetDatabaseByID(req.DatabaseId) @@ -438,7 +438,7 @@ func (h *Handle) registerWriteTableDefVersion(txn txnif.AsyncTxn, req *cmd_util. if err != nil { return err } - return setTableDefVersionDependency(rel, req.TableDefVersion) + return setTableDefVersionDependency(rel, req.TableDefVersion, req.TableDefVersionKnown) } //#endregion @@ -459,15 +459,16 @@ func (h *Handle) apiEntryToWriteEntry( } req := &cmd_util.WriteReq{ - Type: cmd_util.EntryType(pe.EntryType), - DatabaseId: pe.GetDatabaseId(), - TableID: pe.GetTableId(), - DatabaseName: pe.GetDatabaseName(), - TableName: pe.GetTableName(), - TableDefVersion: pe.GetTableDefVersion(), - FileName: pe.GetFileName(), - Batch: moBat, - PkCheck: cmd_util.PKCheckType(pe.GetPkCheckByTn()), + Type: cmd_util.EntryType(pe.EntryType), + DatabaseId: pe.GetDatabaseId(), + TableID: pe.GetTableId(), + DatabaseName: pe.GetDatabaseName(), + TableName: pe.GetTableName(), + TableDefVersion: pe.GetTableDefVersion(), + TableDefVersionKnown: pe.GetTableDefVersionKnown(), + FileName: pe.GetFileName(), + Batch: moBat, + PkCheck: cmd_util.PKCheckType(pe.GetPkCheckByTn()), } // Handle soft delete object: parse ObjectID from batch and IsTombstone from FileName @@ -932,7 +933,7 @@ func (h *Handle) HandleWrite( fmt.Sprintf("%d-%s", req.TableID, req.TableName))) return } - if err = setTableDefVersionDependency(tb, req.TableDefVersion); err != nil { + if err = setTableDefVersionDependency(tb, req.TableDefVersion, req.TableDefVersionKnown); err != nil { return } diff --git a/pkg/vm/engine/tae/rpc/rpc_test.go b/pkg/vm/engine/tae/rpc/rpc_test.go index fd841bf0f0bb8..48b8fce45eeb3 100644 --- a/pkg/vm/engine/tae/rpc/rpc_test.go +++ b/pkg/vm/engine/tae/rpc/rpc_test.go @@ -24,9 +24,9 @@ import ( "github.com/stretchr/testify/require" catalog2 "github.com/matrixorigin/matrixone/pkg/catalog" + "github.com/matrixorigin/matrixone/pkg/common/moerr" "github.com/matrixorigin/matrixone/pkg/container/batch" "github.com/matrixorigin/matrixone/pkg/container/types" - "github.com/matrixorigin/matrixone/pkg/container/vector" "github.com/matrixorigin/matrixone/pkg/objectio" "github.com/matrixorigin/matrixone/pkg/objectio/ioutil" "github.com/matrixorigin/matrixone/pkg/pb/api" @@ -46,21 +46,52 @@ import ( "github.com/stretchr/testify/assert" ) -func TestAPIEntryTableDefVersionIsModeIndependent(t *testing.T) { - h := new(Handle) - cnBatch := batch.NewWithSize(1) - cnBatch.Vecs[0] = vector.NewVec(types.T_int64.ToType()) - pbBatch, err := batch.BatchToProtoBatch(cnBatch) - require.NoError(t, err) - for _, mode := range []string{"optimistic", "pessimistic"} { - t.Run(mode, func(t *testing.T) { - req := h.apiEntryToWriteEntry(context.Background(), txnpb.TxnMeta{}, &api.Entry{ - EntryType: api.Entry_Insert, - Bat: pbBatch, - TableDefVersion: 7, - }, false) - require.NotNil(t, req) - require.Equal(t, uint32(7), req.TableDefVersion) +func TestTableDefVersionFenceIsModeIndependent(t *testing.T) { + defer testutils.AfterTest(t)() + for _, mode := range []txnpb.TxnMode{txnpb.TxnMode_Optimistic, txnpb.TxnMode_Pessimistic} { + t.Run(mode.String(), func(t *testing.T) { + ctx := context.Background() + h := mockTAEHandle(ctx, t, config.WithLongScanAndCKPOpts(nil)) + defer h.HandleClose(ctx) + + schema := catalog.MockSchemaAll(3, 1) + schema.Name = "mode_fence" + _, createdRel := testutil.CreateRelation(t, h.db, testutil.DefaultTestDB, schema, true) + tableID := createdRel.ID() + databaseID := createdRel.GetMeta().(*catalog.TableEntry).GetDB().ID + + alterTxn, alterRel := testutil.GetDefaultRelation(t, h.db, schema.Name) + require.NoError(t, alterRel.AlterTable(ctx, api.NewUpdateAutoIncrementReq(0, tableID, 10))) + require.NoError(t, alterTxn.Commit(ctx)) + + insertBatch := catalog.MockBatch(schema, 1) + defer insertBatch.Close() + entry, err := makePBEntry(INSERT, databaseID, tableID, testutil.DefaultTestDB, + schema.Name, "", containers.ToCNBatch(insertBatch)) + require.NoError(t, err) + entry.TableDefVersion = 0 + entry.TableDefVersionKnown = true + payload, err := (&api.PrecommitWriteCmd{EntryList: []*api.Entry{entry}}).MarshalBinary() + require.NoError(t, err) + commitReq := &txnpb.TxnCommitRequest{Payload: []*txnpb.TxnRequest{{ + CNRequest: &txnpb.CNOpRequest{OpCode: uint32(api.OpCode_OpPreCommit), Payload: payload}, + }}} + meta := mock1PCTxn(h.db) + meta.Mode = mode + + _, err = h.HandleCommit(ctx, meta, nil, commitReq) + require.True(t, moerr.IsMoErrCode(err, moerr.ErrTxnNeedRetryWithDefChanged), err) + + // The same raw V0 from an old CN has no presence bit and therefore + // remains wire-compatible after the ALTER. + entry.TableDefVersionKnown = false + payload, err = (&api.PrecommitWriteCmd{EntryList: []*api.Entry{entry}}).MarshalBinary() + require.NoError(t, err) + commitReq.Payload[0].CNRequest.Payload = payload + meta = mock1PCTxn(h.db) + meta.Mode = mode + _, err = h.HandleCommit(ctx, meta, nil, commitReq) + require.NoError(t, err) }) } } diff --git a/pkg/vm/engine/tae/txn/txnimpl/table.go b/pkg/vm/engine/tae/txn/txnimpl/table.go index b73776cba36f9..781ccb5cb6588 100644 --- a/pkg/vm/engine/tae/txn/txnimpl/table.go +++ b/pkg/vm/engine/tae/txn/txnimpl/table.go @@ -119,28 +119,23 @@ type txnTable struct { idx int - // expectedTableDefVersion is the CN schema version this transaction's - // user-table writes were planned against. Zero means old-CN compatibility. - expectedTableDefVersion uint32 + // expectedTableDefVersions are the known CN schema versions this + // transaction's user-table writes were planned against. A transaction can + // legitimately use both the committed version and the version created by + // its own ALTER TABLE. + expectedTableDefVersions map[uint32]struct{} } func (tbl *txnTable) setExpectedTableDefVersion(version uint32) error { - if version == 0 { - return nil - } - if tbl.expectedTableDefVersion == 0 { - tbl.expectedTableDefVersion = version - return nil - } - if tbl.expectedTableDefVersion != version { - return moerr.NewTxnNeedRetryWithDefChangedNoCtx() + if tbl.expectedTableDefVersions == nil { + tbl.expectedTableDefVersions = make(map[uint32]struct{}, 2) } + tbl.expectedTableDefVersions[version] = struct{}{} return nil } func (tbl *txnTable) validateTableDefVersion() error { - expected := tbl.expectedTableDefVersion - if expected == 0 { + if len(tbl.expectedTableDefVersions) == 0 { return nil } @@ -156,12 +151,16 @@ func (tbl *txnTable) validateTableDefVersion() error { } } - actual := uint32(0) + baseVersion := uint32(0) + localVersion := uint32(0) + hasLocalVersion := false tbl.entry.LoopChainLocked(func(node *catalog.MVCCNode[*catalog.TableMVCCNode]) bool { - // An ALTER in this same transaction cannot be ordered around this DML. + // A same-transaction ALTER is unordered with the transaction's DML. + // Keep scanning for the committed base version as both are valid. if node.IsSameTxn(tbl.store.txn) { - actual = node.BaseNode.Schema.Version - return false + localVersion = node.BaseNode.Schema.Version + hasLocalVersion = true + return true } if node.IsActive() || node.IsCommitting() || node.IsAborted() { return true @@ -172,13 +171,15 @@ func (tbl *txnTable) validateTableDefVersion() error { if nodePrepareTS.GT(&prepareTS) { return true } - actual = node.BaseNode.Schema.Version + baseVersion = node.BaseNode.Schema.Version return false }) tbl.entry.RUnlock() - if actual != expected { - return moerr.NewTxnNeedRetryWithDefChangedNoCtx() + for expected := range tbl.expectedTableDefVersions { + if expected != baseVersion && (!hasLocalVersion || expected != localVersion) { + return moerr.NewTxnNeedRetryWithDefChangedNoCtx() + } } return nil } diff --git a/pkg/vm/engine/tae/txn/txnimpl/txn_test.go b/pkg/vm/engine/tae/txn/txnimpl/txn_test.go index 13727dbdff57a..e234b7d2ea82d 100644 --- a/pkg/vm/engine/tae/txn/txnimpl/txn_test.go +++ b/pkg/vm/engine/tae/txn/txnimpl/txn_test.go @@ -97,9 +97,9 @@ func TestTableDefVersionFenceWaitsForEarlierSchemaPrepare(t *testing.T) { assert.NoError(t, dmlTxn.ToPreparingLocked(types.BuildTS(4, 0))) dmlTxn.Unlock() tbl := &txnTable{ - store: &txnStore{txn: dmlTxn}, - entry: entry, - expectedTableDefVersion: 7, + store: &txnStore{txn: dmlTxn}, + entry: entry, + expectedTableDefVersions: map[uint32]struct{}{7: {}}, } result := make(chan error, 1) @@ -133,13 +133,13 @@ func TestTableDefVersionFenceWaitsForEarlierSchemaPrepare(t *testing.T) { } } -func TestTableDefVersionDependencyRejectsConflictingExpectations(t *testing.T) { +func TestTableDefVersionDependencyRecordsMultipleExpectations(t *testing.T) { tbl := new(txnTable) assert.NoError(t, tbl.setExpectedTableDefVersion(0)) assert.NoError(t, tbl.setExpectedTableDefVersion(7)) assert.NoError(t, tbl.setExpectedTableDefVersion(7)) - err := tbl.setExpectedTableDefVersion(8) - assert.True(t, moerr.IsMoErrCode(err, moerr.ErrTxnNeedRetryWithDefChanged), err) + assert.NoError(t, tbl.setExpectedTableDefVersion(8)) + assert.Equal(t, map[uint32]struct{}{0: {}, 7: {}, 8: {}}, tbl.expectedTableDefVersions) } func TestTableDefVersionFenceUsesPrepareOrderForCommittedSchema(t *testing.T) { @@ -168,13 +168,34 @@ func TestTableDefVersionFenceUsesPrepareOrderForCommittedSchema(t *testing.T) { assert.NoError(t, dmlTxn.ToPreparingLocked(types.BuildTS(4, 0))) dmlTxn.Unlock() tbl := &txnTable{ - store: &txnStore{txn: dmlTxn}, - entry: entry, - expectedTableDefVersion: 7, + store: &txnStore{txn: dmlTxn}, + entry: entry, + expectedTableDefVersions: map[uint32]struct{}{7: {}}, } assert.NoError(t, tbl.validateTableDefVersion()) } +func TestTableDefVersionFenceRejectsMultipleVersionsWithoutLocalAlter(t *testing.T) { + schema := catalog.MockSchemaAll(3, 1) + schema.Version = 7 + entry := catalog.MockTableEntryWithDB(nil, 42) + entry.CreateWithTSLocked(types.BuildTS(1, 0), &catalog.TableMVCCNode{ + Schema: schema, TombstoneSchema: catalog.GetTombstoneSchema(schema), + }) + + dmlTxn := txnbase.NewTxn(nil, nil, []byte("dml"), types.BuildTS(2, 0), types.TS{}) + dmlTxn.Lock() + assert.NoError(t, dmlTxn.ToPreparingLocked(types.BuildTS(3, 0))) + dmlTxn.Unlock() + tbl := &txnTable{ + store: &txnStore{txn: dmlTxn}, + entry: entry, + expectedTableDefVersions: map[uint32]struct{}{7: {}, 8: {}}, + } + err := tbl.validateTableDefVersion() + assert.True(t, moerr.IsMoErrCode(err, moerr.ErrTxnNeedRetryWithDefChanged), err) +} + // 1. 30 concurrency // 2. 10000 node // 3. 512K buffer diff --git a/proto/api.proto b/proto/api.proto index 0face5389443b..85c84b97876e8 100644 --- a/proto/api.proto +++ b/proto/api.proto @@ -245,8 +245,10 @@ message Entry { // whether TN do the PK uniqueness check against txn's workspace or not. int32 pk_check_by_tn = 8; // table definition version used by the CN when planning this write. - // Zero is reserved for compatibility with old CNs. + // Consult table_def_version_known because zero is a valid initial version. uint32 table_def_version = 9; + // whether table_def_version was supplied by a version-aware CN. + bool table_def_version_known = 10; }; // There are two kinds of checkpoint: delta checkpoint and base checkpoint, From c76dc259ab94951af9ae7fded2e7be18ed5a590d Mon Sep 17 00:00:00 2001 From: VioletQwQ-0 <1659648118@qq.com> Date: Wed, 22 Jul 2026 16:32:18 +0800 Subject: [PATCH 3/6] fix: use dedicated auto increment epoch fence Co-authored-by: ULookup --- pkg/pb/api/api.go | 17 + pkg/pb/api/api.pb.go | 912 ++++++--- pkg/pb/pipeline/pipeline.pb.go | 12 +- pkg/pb/plan/plan.pb.go | 1732 +++++++++--------- pkg/sql/plan/deepcopy.go | 1 + pkg/vm/engine/cmd_util/operations.go | 12 +- pkg/vm/engine/disttae/cache/catalog.go | 40 +- pkg/vm/engine/disttae/tools.go | 20 +- pkg/vm/engine/disttae/transfer.go | 4 +- pkg/vm/engine/disttae/txn.go | 212 +-- pkg/vm/engine/disttae/txn_table.go | 53 +- pkg/vm/engine/disttae/txn_test.go | 34 +- pkg/vm/engine/disttae/types.go | 24 +- pkg/vm/engine/tae/catalog/schema.go | 3 + pkg/vm/engine/tae/catalog/table.go | 60 + pkg/vm/engine/tae/catalog/table_test.go | 27 + pkg/vm/engine/tae/db/test/db_test.go | 53 +- pkg/vm/engine/tae/rpc/handle.go | 47 +- pkg/vm/engine/tae/rpc/rpc_test.go | 14 +- pkg/vm/engine/tae/txn/txnimpl/relation.go | 6 +- pkg/vm/engine/tae/txn/txnimpl/replaystore.go | 43 +- pkg/vm/engine/tae/txn/txnimpl/table.go | 57 +- pkg/vm/engine/tae/txn/txnimpl/txn_test.go | 115 +- pkg/vm/engine/types.go | 4 +- proto/api.proto | 20 +- proto/plan.proto | 2 + 26 files changed, 2135 insertions(+), 1389 deletions(-) diff --git a/pkg/pb/api/api.go b/pkg/pb/api/api.go index 42ab124055872..2f590d4259ec2 100644 --- a/pkg/pb/api/api.go +++ b/pkg/pb/api/api.go @@ -76,6 +76,23 @@ func CloneExtra(info *SchemaExtra) *SchemaExtra { FeatureFlag: info.FeatureFlag, IndexTables: append([]uint64{}, info.IndexTables...), ParentTableID: info.ParentTableID, + AutoIncrOffset: info.AutoIncrOffset, + AutoIncrEpoch: info.AutoIncrEpoch, + } +} + +func NewUpdateAutoIncrementReq(did, tid, offset uint64, epochs ...uint32) *AlterTableReq { + epoch := uint32(1) + if len(epochs) > 0 { + epoch = epochs[0] + } + return &AlterTableReq{ + DbId: did, + TableId: tid, + Kind: AlterKind_UpdateAutoIncrement, + Operation: &AlterTableReq_UpdateAutoIncrement{ + UpdateAutoIncrement: &AlterTableAutoIncrement{Offset: offset, Epoch: epoch}, + }, } } diff --git a/pkg/pb/api/api.pb.go b/pkg/pb/api/api.pb.go index c9c811b399ad1..3cda1e08e353f 100644 --- a/pkg/pb/api/api.pb.go +++ b/pkg/pb/api/api.pb.go @@ -108,42 +108,45 @@ func (OpCode) EnumDescriptor() ([]byte, []int) { type AlterKind int32 const ( - AlterKind_Invalid AlterKind = 0 - AlterKind_AddColumn AlterKind = 1 - AlterKind_DropColumn AlterKind = 2 - AlterKind_RenameTable AlterKind = 3 - AlterKind_UpdateComment AlterKind = 4 - AlterKind_UpdateConstraint AlterKind = 5 - AlterKind_UpdatePolicy AlterKind = 6 - AlterKind_AddPartition AlterKind = 7 - AlterKind_RenameColumn AlterKind = 8 - AlterKind_ReplaceDef AlterKind = 9 + AlterKind_Invalid AlterKind = 0 + AlterKind_AddColumn AlterKind = 1 + AlterKind_DropColumn AlterKind = 2 + AlterKind_RenameTable AlterKind = 3 + AlterKind_UpdateComment AlterKind = 4 + AlterKind_UpdateConstraint AlterKind = 5 + AlterKind_UpdatePolicy AlterKind = 6 + AlterKind_AddPartition AlterKind = 7 + AlterKind_RenameColumn AlterKind = 8 + AlterKind_ReplaceDef AlterKind = 9 + AlterKind_UpdateAutoIncrement AlterKind = 10 ) var AlterKind_name = map[int32]string{ - 0: "Invalid", - 1: "AddColumn", - 2: "DropColumn", - 3: "RenameTable", - 4: "UpdateComment", - 5: "UpdateConstraint", - 6: "UpdatePolicy", - 7: "AddPartition", - 8: "RenameColumn", - 9: "ReplaceDef", + 0: "Invalid", + 1: "AddColumn", + 2: "DropColumn", + 3: "RenameTable", + 4: "UpdateComment", + 5: "UpdateConstraint", + 6: "UpdatePolicy", + 7: "AddPartition", + 8: "RenameColumn", + 9: "ReplaceDef", + 10: "UpdateAutoIncrement", } var AlterKind_value = map[string]int32{ - "Invalid": 0, - "AddColumn": 1, - "DropColumn": 2, - "RenameTable": 3, - "UpdateComment": 4, - "UpdateConstraint": 5, - "UpdatePolicy": 6, - "AddPartition": 7, - "RenameColumn": 8, - "ReplaceDef": 9, + "Invalid": 0, + "AddColumn": 1, + "DropColumn": 2, + "RenameTable": 3, + "UpdateComment": 4, + "UpdateConstraint": 5, + "UpdatePolicy": 6, + "AddPartition": 7, + "RenameColumn": 8, + "ReplaceDef": 9, + "UpdateAutoIncrement": 10, } func (x AlterKind) String() string { @@ -838,7 +841,12 @@ type Entry struct { FileName string `protobuf:"bytes,6,opt,name=file_name,json=fileName,proto3" json:"file_name,omitempty"` Bat *Batch `protobuf:"bytes,7,opt,name=bat,proto3" json:"bat,omitempty"` // whether TN do the PK uniqueness check against txn's workspace or not. - PkCheckByTn int32 `protobuf:"varint,8,opt,name=pk_check_by_tn,json=pkCheckByTn,proto3" json:"pk_check_by_tn,omitempty"` + PkCheckByTn int32 `protobuf:"varint,8,opt,name=pk_check_by_tn,json=pkCheckByTn,proto3" json:"pk_check_by_tn,omitempty"` + // AUTO_INCREMENT epoch used by the CN when planning this write. + // Consult auto_incr_epoch_known because zero is a valid initial epoch. + AutoIncrEpoch uint32 `protobuf:"varint,9,opt,name=auto_incr_epoch,json=autoIncrEpoch,proto3" json:"auto_incr_epoch,omitempty"` + // whether auto_incr_epoch was supplied by an epoch-aware CN. + AutoIncrEpochKnown bool `protobuf:"varint,10,opt,name=auto_incr_epoch_known,json=autoIncrEpochKnown,proto3" json:"auto_incr_epoch_known,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` @@ -933,6 +941,20 @@ func (m *Entry) GetPkCheckByTn() int32 { return 0 } +func (m *Entry) GetAutoIncrEpoch() uint32 { + if m != nil { + return m.AutoIncrEpoch + } + return 0 +} + +func (m *Entry) GetAutoIncrEpochKnown() bool { + if m != nil { + return m.AutoIncrEpochKnown + } + return false +} + // CatalogCkp contains information about database and tables in the system,and // MetadataCkp contains information about blocks. type Checkpoint struct { @@ -1587,6 +1609,61 @@ func (m *AlterTableDropColumn) GetSequenceNum() uint32 { return 0 } +type AlterTableAutoIncrement struct { + Offset uint64 `protobuf:"varint,1,opt,name=offset,proto3" json:"offset,omitempty"` + Epoch uint32 `protobuf:"varint,2,opt,name=epoch,proto3" json:"epoch,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *AlterTableAutoIncrement) Reset() { *m = AlterTableAutoIncrement{} } +func (m *AlterTableAutoIncrement) String() string { return proto.CompactTextString(m) } +func (*AlterTableAutoIncrement) ProtoMessage() {} +func (*AlterTableAutoIncrement) Descriptor() ([]byte, []int) { + return fileDescriptor_00212fb1f9d3bf1c, []int{21} +} +func (m *AlterTableAutoIncrement) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *AlterTableAutoIncrement) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_AlterTableAutoIncrement.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *AlterTableAutoIncrement) XXX_Merge(src proto.Message) { + xxx_messageInfo_AlterTableAutoIncrement.Merge(m, src) +} +func (m *AlterTableAutoIncrement) XXX_Size() int { + return m.ProtoSize() +} +func (m *AlterTableAutoIncrement) XXX_DiscardUnknown() { + xxx_messageInfo_AlterTableAutoIncrement.DiscardUnknown(m) +} + +var xxx_messageInfo_AlterTableAutoIncrement proto.InternalMessageInfo + +func (m *AlterTableAutoIncrement) GetOffset() uint64 { + if m != nil { + return m.Offset + } + return 0 +} + +func (m *AlterTableAutoIncrement) GetEpoch() uint32 { + if m != nil { + return m.Epoch + } + return 0 +} + type AlterTableReq struct { TableId uint64 `protobuf:"varint,1,opt,name=table_id,json=tableId,proto3" json:"table_id,omitempty"` DbId uint64 `protobuf:"varint,2,opt,name=db_id,json=dbId,proto3" json:"db_id,omitempty"` @@ -1600,6 +1677,7 @@ type AlterTableReq struct { // *AlterTableReq_UpdatePolicy // *AlterTableReq_RenameCol // *AlterTableReq_ReplaceDef + // *AlterTableReq_UpdateAutoIncrement Operation isAlterTableReq_Operation `protobuf_oneof:"operation"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` @@ -1610,7 +1688,7 @@ func (m *AlterTableReq) Reset() { *m = AlterTableReq{} } func (m *AlterTableReq) String() string { return proto.CompactTextString(m) } func (*AlterTableReq) ProtoMessage() {} func (*AlterTableReq) Descriptor() ([]byte, []int) { - return fileDescriptor_00212fb1f9d3bf1c, []int{21} + return fileDescriptor_00212fb1f9d3bf1c, []int{22} } func (m *AlterTableReq) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1669,15 +1747,19 @@ type AlterTableReq_RenameCol struct { type AlterTableReq_ReplaceDef struct { ReplaceDef *AlterTableReplaceDef `protobuf:"bytes,12,opt,name=replace_def,json=replaceDef,proto3,oneof" json:"replace_def,omitempty"` } +type AlterTableReq_UpdateAutoIncrement struct { + UpdateAutoIncrement *AlterTableAutoIncrement `protobuf:"bytes,13,opt,name=update_auto_increment,json=updateAutoIncrement,proto3,oneof" json:"update_auto_increment,omitempty"` +} -func (*AlterTableReq_AddColumn) isAlterTableReq_Operation() {} -func (*AlterTableReq_DropColumn) isAlterTableReq_Operation() {} -func (*AlterTableReq_RenameTable) isAlterTableReq_Operation() {} -func (*AlterTableReq_UpdateComment) isAlterTableReq_Operation() {} -func (*AlterTableReq_UpdateCstr) isAlterTableReq_Operation() {} -func (*AlterTableReq_UpdatePolicy) isAlterTableReq_Operation() {} -func (*AlterTableReq_RenameCol) isAlterTableReq_Operation() {} -func (*AlterTableReq_ReplaceDef) isAlterTableReq_Operation() {} +func (*AlterTableReq_AddColumn) isAlterTableReq_Operation() {} +func (*AlterTableReq_DropColumn) isAlterTableReq_Operation() {} +func (*AlterTableReq_RenameTable) isAlterTableReq_Operation() {} +func (*AlterTableReq_UpdateComment) isAlterTableReq_Operation() {} +func (*AlterTableReq_UpdateCstr) isAlterTableReq_Operation() {} +func (*AlterTableReq_UpdatePolicy) isAlterTableReq_Operation() {} +func (*AlterTableReq_RenameCol) isAlterTableReq_Operation() {} +func (*AlterTableReq_ReplaceDef) isAlterTableReq_Operation() {} +func (*AlterTableReq_UpdateAutoIncrement) isAlterTableReq_Operation() {} func (m *AlterTableReq) GetOperation() isAlterTableReq_Operation { if m != nil { @@ -1763,6 +1845,13 @@ func (m *AlterTableReq) GetReplaceDef() *AlterTableReplaceDef { return nil } +func (m *AlterTableReq) GetUpdateAutoIncrement() *AlterTableAutoIncrement { + if x, ok := m.GetOperation().(*AlterTableReq_UpdateAutoIncrement); ok { + return x.UpdateAutoIncrement + } + return nil +} + // XXX_OneofWrappers is for the internal use of the proto package. func (*AlterTableReq) XXX_OneofWrappers() []interface{} { return []interface{}{ @@ -1774,6 +1863,7 @@ func (*AlterTableReq) XXX_OneofWrappers() []interface{} { (*AlterTableReq_UpdatePolicy)(nil), (*AlterTableReq_RenameCol)(nil), (*AlterTableReq_ReplaceDef)(nil), + (*AlterTableReq_UpdateAutoIncrement)(nil), } } @@ -1795,7 +1885,10 @@ type SchemaExtra struct { IndexTables []uint64 `protobuf:"varint,13,rep,packed,name=IndexTables,proto3" json:"IndexTables,omitempty"` ParentTableID uint64 `protobuf:"varint,14,opt,name=ParentTableID,proto3" json:"ParentTableID,omitempty"` // mark if table is created by publication (CCPR), should skip merge - FromPublication bool `protobuf:"varint,15,opt,name=FromPublication,proto3" json:"FromPublication,omitempty"` + FromPublication bool `protobuf:"varint,15,opt,name=FromPublication,proto3" json:"FromPublication,omitempty"` + AutoIncrOffset uint64 `protobuf:"varint,16,opt,name=auto_incr_offset,json=autoIncrOffset,proto3" json:"auto_incr_offset,omitempty"` + // Advances only when AUTO_INCREMENT allocation is reset. + AutoIncrEpoch uint32 `protobuf:"varint,17,opt,name=auto_incr_epoch,json=autoIncrEpoch,proto3" json:"auto_incr_epoch,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` @@ -1805,7 +1898,7 @@ func (m *SchemaExtra) Reset() { *m = SchemaExtra{} } func (m *SchemaExtra) String() string { return proto.CompactTextString(m) } func (*SchemaExtra) ProtoMessage() {} func (*SchemaExtra) Descriptor() ([]byte, []int) { - return fileDescriptor_00212fb1f9d3bf1c, []int{22} + return fileDescriptor_00212fb1f9d3bf1c, []int{23} } func (m *SchemaExtra) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1939,6 +2032,20 @@ func (m *SchemaExtra) GetFromPublication() bool { return false } +func (m *SchemaExtra) GetAutoIncrOffset() uint64 { + if m != nil { + return m.AutoIncrOffset + } + return 0 +} + +func (m *SchemaExtra) GetAutoIncrEpoch() uint32 { + if m != nil { + return m.AutoIncrEpoch + } + return 0 +} + // Int64Map mainly used in unit test type Int64Map struct { M map[int64]int64 `protobuf:"bytes,1,rep,name=m,proto3" json:"m,omitempty" protobuf_key:"varint,1,opt,name=key,proto3" protobuf_val:"varint,2,opt,name=value,proto3"` @@ -1951,7 +2058,7 @@ func (m *Int64Map) Reset() { *m = Int64Map{} } func (m *Int64Map) String() string { return proto.CompactTextString(m) } func (*Int64Map) ProtoMessage() {} func (*Int64Map) Descriptor() ([]byte, []int) { - return fileDescriptor_00212fb1f9d3bf1c, []int{23} + return fileDescriptor_00212fb1f9d3bf1c, []int{24} } func (m *Int64Map) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2000,7 +2107,7 @@ func (m *TransDestPos) Reset() { *m = TransDestPos{} } func (m *TransDestPos) String() string { return proto.CompactTextString(m) } func (*TransDestPos) ProtoMessage() {} func (*TransDestPos) Descriptor() ([]byte, []int) { - return fileDescriptor_00212fb1f9d3bf1c, []int{24} + return fileDescriptor_00212fb1f9d3bf1c, []int{25} } func (m *TransDestPos) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2061,7 +2168,7 @@ func (m *BlkTransMap) Reset() { *m = BlkTransMap{} } func (m *BlkTransMap) String() string { return proto.CompactTextString(m) } func (*BlkTransMap) ProtoMessage() {} func (*BlkTransMap) Descriptor() ([]byte, []int) { - return fileDescriptor_00212fb1f9d3bf1c, []int{25} + return fileDescriptor_00212fb1f9d3bf1c, []int{26} } func (m *BlkTransMap) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2108,7 +2215,7 @@ func (m *BlkTransferBooking) Reset() { *m = BlkTransferBooking{} } func (m *BlkTransferBooking) String() string { return proto.CompactTextString(m) } func (*BlkTransferBooking) ProtoMessage() {} func (*BlkTransferBooking) Descriptor() ([]byte, []int) { - return fileDescriptor_00212fb1f9d3bf1c, []int{26} + return fileDescriptor_00212fb1f9d3bf1c, []int{27} } func (m *BlkTransferBooking) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2164,7 +2271,7 @@ func (m *MergeCommitEntry) Reset() { *m = MergeCommitEntry{} } func (m *MergeCommitEntry) String() string { return proto.CompactTextString(m) } func (*MergeCommitEntry) ProtoMessage() {} func (*MergeCommitEntry) Descriptor() ([]byte, []int) { - return fileDescriptor_00212fb1f9d3bf1c, []int{27} + return fileDescriptor_00212fb1f9d3bf1c, []int{28} } func (m *MergeCommitEntry) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2283,7 +2390,7 @@ func (m *MergeTaskEntry) Reset() { *m = MergeTaskEntry{} } func (m *MergeTaskEntry) String() string { return proto.CompactTextString(m) } func (*MergeTaskEntry) ProtoMessage() {} func (*MergeTaskEntry) Descriptor() ([]byte, []int) { - return fileDescriptor_00212fb1f9d3bf1c, []int{28} + return fileDescriptor_00212fb1f9d3bf1c, []int{29} } func (m *MergeTaskEntry) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2387,7 +2494,7 @@ func (m *CheckpointResp) Reset() { *m = CheckpointResp{} } func (m *CheckpointResp) String() string { return proto.CompactTextString(m) } func (*CheckpointResp) ProtoMessage() {} func (*CheckpointResp) Descriptor() ([]byte, []int) { - return fileDescriptor_00212fb1f9d3bf1c, []int{29} + return fileDescriptor_00212fb1f9d3bf1c, []int{30} } func (m *CheckpointResp) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2456,6 +2563,7 @@ func init() { proto.RegisterType((*AlterTableAddColumn)(nil), "api.AlterTableAddColumn") proto.RegisterType((*AlterTableReplaceDef)(nil), "api.AlterTableReplaceDef") proto.RegisterType((*AlterTableDropColumn)(nil), "api.AlterTableDropColumn") + proto.RegisterType((*AlterTableAutoIncrement)(nil), "api.AlterTableAutoIncrement") proto.RegisterType((*AlterTableReq)(nil), "api.AlterTableReq") proto.RegisterType((*SchemaExtra)(nil), "api.SchemaExtra") proto.RegisterType((*Int64Map)(nil), "api.Int64Map") @@ -2472,172 +2580,180 @@ func init() { func init() { proto.RegisterFile("api.proto", fileDescriptor_00212fb1f9d3bf1c) } var fileDescriptor_00212fb1f9d3bf1c = []byte{ - // 2630 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xc4, 0x58, 0x5f, 0x6f, 0x5c, 0x47, - 0x15, 0xf7, 0x7a, 0xff, 0x9f, 0xfd, 0x77, 0x3d, 0x4e, 0xd2, 0xad, 0x29, 0x89, 0xd9, 0xa6, 0xad, - 0x9b, 0x52, 0x47, 0xb8, 0x05, 0xda, 0x2a, 0xa2, 0x8a, 0xed, 0x26, 0xde, 0x12, 0xc7, 0xe6, 0x7a, - 0xd3, 0x4a, 0x15, 0xd2, 0xd5, 0xec, 0xbd, 0x93, 0xf5, 0xcd, 0xde, 0x3b, 0x73, 0x33, 0x33, 0xeb, - 0xd8, 0x7d, 0x05, 0x1e, 0x91, 0x10, 0x6f, 0xbc, 0xb5, 0x1f, 0x01, 0x09, 0x89, 0x6f, 0x80, 0xfa, - 0x58, 0x44, 0xf9, 0x57, 0xa0, 0x84, 0xf2, 0x02, 0x7c, 0x0a, 0x34, 0x67, 0xe6, 0xee, 0xae, 0x9d, - 0xb4, 0x50, 0x84, 0xd4, 0x07, 0x5b, 0x33, 0xbf, 0x73, 0xce, 0xdc, 0xdf, 0x39, 0x73, 0xe6, 0xcc, - 0x99, 0x85, 0x3a, 0xcd, 0xe2, 0xf5, 0x4c, 0x0a, 0x2d, 0x48, 0x91, 0x66, 0xf1, 0xca, 0x8b, 0xa3, - 0x58, 0x1f, 0x4e, 0x86, 0xeb, 0xa1, 0x48, 0xaf, 0x8e, 0xc4, 0x48, 0x5c, 0x45, 0xd9, 0x70, 0x72, - 0x17, 0x67, 0x38, 0xc1, 0x91, 0xb5, 0x59, 0xe9, 0xe8, 0x38, 0x65, 0x4a, 0xd3, 0x34, 0x73, 0x00, - 0x64, 0x09, 0xe5, 0x76, 0xdc, 0xfb, 0x36, 0xb4, 0x06, 0xb7, 0xf7, 0x63, 0x3e, 0xf2, 0xd9, 0xfd, - 0x09, 0x53, 0x9a, 0x3c, 0x05, 0xf5, 0x8c, 0x4a, 0x9a, 0x32, 0xcd, 0x64, 0xb7, 0xb0, 0x5a, 0x58, - 0xab, 0xfb, 0x33, 0xe0, 0xb5, 0xda, 0x7b, 0xef, 0x5f, 0x2a, 0x3c, 0x7c, 0xff, 0xd2, 0x42, 0xef, - 0x17, 0x05, 0x68, 0xe7, 0x96, 0x2a, 0x13, 0x5c, 0x31, 0xd2, 0x85, 0xaa, 0xd2, 0x42, 0xb2, 0xfe, - 0xb6, 0x33, 0xcc, 0xa7, 0xe4, 0x59, 0x68, 0x2b, 0x26, 0x8f, 0xe2, 0x90, 0x5d, 0x8f, 0x22, 0xc9, - 0x94, 0xea, 0x2e, 0xa2, 0xc2, 0x19, 0x14, 0x57, 0x38, 0xa4, 0x32, 0xea, 0x6f, 0x77, 0x8b, 0xab, - 0x85, 0xb5, 0x92, 0x9f, 0x4f, 0x0d, 0x2d, 0xc9, 0xb2, 0x24, 0x0e, 0x69, 0x7f, 0xbb, 0x5b, 0x42, - 0xd9, 0x0c, 0x20, 0x17, 0x01, 0x12, 0x31, 0x3a, 0x70, 0xa6, 0x65, 0x14, 0xcf, 0x21, 0x73, 0xb4, - 0x5f, 0x03, 0x6f, 0x70, 0xfb, 0x40, 0xcb, 0x79, 0xde, 0xb8, 0xb6, 0x9e, 0x48, 0x7e, 0xa0, 0xa7, - 0x2e, 0x4f, 0x81, 0x39, 0xdb, 0x9f, 0x17, 0xa0, 0xf2, 0x16, 0x0b, 0xb5, 0x90, 0x84, 0x40, 0x29, - 0xa2, 0x9a, 0xa2, 0x76, 0xd3, 0xc7, 0x31, 0xb9, 0x0c, 0x25, 0x7d, 0x92, 0x31, 0x74, 0xad, 0xb1, - 0x01, 0xeb, 0x18, 0xe5, 0xc1, 0x49, 0xc6, 0x36, 0x4b, 0x1f, 0x7c, 0x72, 0x69, 0xc1, 0x47, 0x29, - 0x59, 0x81, 0x1a, 0x9f, 0x24, 0x09, 0x1d, 0x26, 0x0c, 0x7d, 0xac, 0xf9, 0xd3, 0x39, 0xf1, 0xa0, - 0xc8, 0x55, 0x86, 0xee, 0x35, 0x7d, 0x33, 0x24, 0x4f, 0x42, 0x2d, 0x56, 0x41, 0x28, 0xb8, 0xd2, - 0xe8, 0x56, 0xcd, 0xaf, 0xc6, 0x6a, 0xcb, 0x4c, 0x8d, 0x72, 0xc2, 0x78, 0xb7, 0xb2, 0x5a, 0x58, - 0x6b, 0xf9, 0x66, 0x68, 0x48, 0x51, 0xc9, 0x68, 0xb7, 0x6a, 0x49, 0x99, 0x71, 0xef, 0x4d, 0x28, - 0x6f, 0x52, 0x1d, 0x1e, 0x92, 0x15, 0x28, 0x53, 0xad, 0xa5, 0xea, 0x16, 0x56, 0x8b, 0x6b, 0x75, - 0x47, 0xc9, 0x42, 0xe4, 0x19, 0x28, 0x1d, 0xb1, 0xd0, 0x6c, 0x4a, 0x71, 0xad, 0xb1, 0xd1, 0x58, - 0x37, 0xf9, 0x66, 0x1d, 0xcd, 0xa9, 0x1b, 0x71, 0xef, 0x57, 0x05, 0xa8, 0x0e, 0x0c, 0xd1, 0xfe, - 0x36, 0x59, 0x86, 0x72, 0x34, 0x0c, 0xe2, 0x08, 0x23, 0x50, 0xf2, 0x4b, 0xd1, 0xb0, 0x1f, 0x19, - 0x50, 0x23, 0xb8, 0x68, 0x41, 0x6d, 0xc0, 0xaf, 0x41, 0x33, 0xa3, 0x52, 0xc7, 0x3a, 0x16, 0xdc, - 0xc8, 0xec, 0xc6, 0x36, 0xa6, 0x58, 0x3f, 0x22, 0xe7, 0xa1, 0x42, 0xc3, 0xd0, 0x08, 0x4b, 0xe8, - 0x4d, 0x99, 0x86, 0x61, 0x3f, 0x22, 0x4f, 0x40, 0x35, 0x1a, 0x06, 0x9c, 0xa6, 0x0c, 0x7d, 0xaf, - 0xfb, 0x95, 0x68, 0x78, 0x9b, 0xa6, 0xcc, 0x08, 0xb4, 0x13, 0x54, 0xac, 0x40, 0x5b, 0xc1, 0x33, - 0xd0, 0xce, 0x64, 0x9c, 0x52, 0x79, 0x12, 0x28, 0x76, 0x9f, 0x4f, 0x52, 0x8c, 0x45, 0xcb, 0x6f, - 0x39, 0xf4, 0x00, 0xc1, 0xde, 0x4f, 0x0b, 0xd0, 0x3e, 0x38, 0xe1, 0xe1, 0x2d, 0x31, 0x1a, 0xd0, - 0x38, 0xf1, 0xd9, 0x7d, 0xf2, 0x22, 0x54, 0x43, 0x1e, 0x1c, 0xd2, 0x23, 0x86, 0x1e, 0x35, 0x36, - 0xce, 0xad, 0xcf, 0x8e, 0xcd, 0x20, 0x1f, 0xf9, 0x95, 0x90, 0xef, 0xd0, 0x23, 0xe6, 0xd4, 0x1f, - 0x50, 0xae, 0xdd, 0x76, 0x7f, 0xa6, 0xfa, 0xdb, 0x94, 0x6b, 0xd2, 0x83, 0xb2, 0x9e, 0xee, 0x78, - 0x63, 0xa3, 0x89, 0x11, 0x76, 0xa1, 0xf4, 0xad, 0xa8, 0xf7, 0x7d, 0xe8, 0x9c, 0xe2, 0xa4, 0x32, - 0x13, 0xba, 0x70, 0x9c, 0x05, 0x89, 0x08, 0xa9, 0x89, 0x94, 0xcb, 0xcd, 0x46, 0x38, 0xce, 0x6e, - 0x39, 0x88, 0x3c, 0x0b, 0xb5, 0x50, 0xa4, 0x29, 0xe5, 0x51, 0xbe, 0x7d, 0x80, 0x8b, 0xbf, 0xc1, - 0xb5, 0x3c, 0xf1, 0xa7, 0xb2, 0x9e, 0x82, 0xa5, 0x7d, 0xc9, 0xcc, 0x34, 0xd6, 0x6f, 0xcb, 0x58, - 0xb3, 0xad, 0x34, 0x22, 0xcf, 0x03, 0x30, 0xa3, 0x17, 0x24, 0xb1, 0xd2, 0x98, 0x18, 0xa7, 0xcd, - 0xeb, 0x28, 0xbd, 0x15, 0x2b, 0x4d, 0x5e, 0x82, 0x0b, 0xea, 0x84, 0x87, 0x81, 0xa9, 0x1a, 0x2c, - 0xc4, 0xbd, 0xbc, 0x27, 0xa6, 0x7b, 0x5d, 0xf7, 0x97, 0x8d, 0x74, 0x7f, 0x2a, 0x7c, 0x53, 0x0c, - 0xfb, 0x51, 0xef, 0x27, 0x45, 0x28, 0xe3, 0x4a, 0xe4, 0xa5, 0xfc, 0x4b, 0x78, 0x42, 0x8c, 0x1f, - 0xed, 0x8d, 0x73, 0xb3, 0x2f, 0xd9, 0xff, 0xe6, 0xac, 0xb8, 0x6f, 0x9a, 0xa1, 0x49, 0x7e, 0x0c, - 0xcd, 0x2c, 0xa3, 0xaa, 0x38, 0xef, 0x47, 0xe4, 0x12, 0x34, 0xcc, 0x99, 0x1b, 0x52, 0xc5, 0x66, - 0x39, 0x05, 0x39, 0xd4, 0x8f, 0xc8, 0x57, 0x01, 0xac, 0x2d, 0x66, 0x49, 0xc9, 0x1e, 0x6a, 0x44, - 0x30, 0x51, 0x9e, 0x86, 0xd6, 0xd4, 0x7e, 0x2e, 0xc1, 0x9a, 0x39, 0x88, 0x4a, 0x5f, 0x81, 0xfa, - 0xdd, 0x38, 0x5f, 0xc2, 0x26, 0x5a, 0xcd, 0x00, 0x28, 0x7c, 0x0a, 0x8a, 0x43, 0xaa, 0x31, 0xbf, - 0xf2, 0xa0, 0xe1, 0x41, 0xf3, 0x0d, 0x4c, 0x9e, 0x86, 0x76, 0x36, 0x0e, 0xc2, 0x43, 0x16, 0x8e, - 0x83, 0xe1, 0x49, 0xa0, 0x79, 0xb7, 0xb6, 0x5a, 0x58, 0x2b, 0xfb, 0x8d, 0x6c, 0xbc, 0x65, 0xc0, - 0xcd, 0x93, 0x01, 0xef, 0x49, 0xa8, 0x4f, 0xfd, 0x26, 0x00, 0x95, 0x3e, 0x57, 0x4c, 0x6a, 0x6f, - 0xc1, 0x8c, 0xb7, 0x59, 0xc2, 0x34, 0xf3, 0x0a, 0x66, 0x7c, 0x27, 0x8b, 0xa8, 0x66, 0xde, 0x22, - 0xa9, 0x43, 0xf9, 0x7a, 0xa2, 0x99, 0xf4, 0x8a, 0x64, 0x09, 0x5a, 0x07, 0x19, 0x0b, 0x63, 0x9a, - 0x38, 0xcd, 0x12, 0x69, 0x03, 0x6c, 0x53, 0x4d, 0xf7, 0x86, 0xf7, 0x58, 0xa8, 0xbd, 0x32, 0x59, - 0x86, 0xce, 0x40, 0xa4, 0x43, 0xa5, 0x05, 0x67, 0x0e, 0xac, 0xf4, 0x7e, 0x58, 0x00, 0x40, 0x06, - 0x99, 0x88, 0xb9, 0x26, 0x2f, 0x40, 0x25, 0x8d, 0x79, 0xa0, 0xd5, 0xe7, 0x66, 0x7d, 0x39, 0x8d, - 0xf9, 0x40, 0xa1, 0x32, 0x3d, 0x36, 0xca, 0x8b, 0x9f, 0xab, 0x4c, 0x8f, 0x07, 0x2a, 0x8f, 0x4f, - 0xf1, 0xb1, 0xf1, 0xb1, 0x34, 0xa8, 0xa6, 0x89, 0x18, 0x6d, 0x8d, 0xb3, 0x2f, 0x8d, 0xc6, 0x8f, - 0x0a, 0xd0, 0xd8, 0x65, 0x9a, 0x9a, 0x6d, 0xff, 0x32, 0x79, 0xfc, 0xab, 0x00, 0x1e, 0xee, 0x2c, - 0xd6, 0x84, 0x7d, 0x91, 0xc4, 0xe1, 0x09, 0x59, 0x87, 0x65, 0x43, 0x46, 0xa8, 0xf8, 0x5d, 0x16, - 0xdc, 0x9f, 0xd0, 0x38, 0x89, 0xef, 0x32, 0x5b, 0x70, 0x5b, 0xfe, 0x52, 0x1a, 0xf3, 0x3d, 0x23, - 0xf9, 0x5e, 0x2e, 0x20, 0x97, 0xa1, 0x6d, 0xf8, 0x88, 0xe1, 0xbd, 0x40, 0x70, 0x26, 0x27, 0x1c, - 0x79, 0xb5, 0xfc, 0x66, 0x4a, 0x8f, 0xf7, 0x86, 0xf7, 0xf6, 0x10, 0x23, 0x57, 0xe1, 0x1c, 0x6a, - 0xe1, 0xaa, 0x29, 0x93, 0x23, 0x16, 0x19, 0x13, 0x64, 0x66, 0x96, 0xa5, 0xc7, 0xb8, 0xec, 0x2e, - 0x4a, 0xf6, 0x86, 0xf7, 0xc8, 0x65, 0x28, 0x1f, 0xc6, 0x5c, 0xab, 0x6e, 0x69, 0xb5, 0xb8, 0xd6, - 0xde, 0x68, 0x23, 0x77, 0x14, 0xef, 0xc4, 0x5c, 0xfb, 0x56, 0x48, 0x9e, 0x07, 0xc3, 0x28, 0x08, - 0xb9, 0x5d, 0x33, 0x30, 0x6b, 0xb8, 0x8b, 0xb8, 0x9d, 0xc6, 0x7c, 0x8b, 0xa3, 0xc5, 0x41, 0xfc, - 0x2e, 0xeb, 0xbd, 0x02, 0xe7, 0x66, 0xbe, 0xe2, 0x5d, 0x26, 0xa9, 0xc9, 0xc5, 0x55, 0x68, 0x84, - 0xd3, 0x99, 0x72, 0x57, 0xeb, 0x3c, 0xd4, 0x7b, 0x11, 0x96, 0xe6, 0x2d, 0xd3, 0x94, 0x71, 0x6d, - 0x7a, 0x86, 0xd0, 0x0e, 0xf3, 0xae, 0xc3, 0x4d, 0x7b, 0xbb, 0x70, 0x7e, 0xa6, 0xee, 0x33, 0x73, - 0x8c, 0x71, 0x68, 0x0a, 0x8b, 0x48, 0x22, 0x7b, 0xae, 0x9d, 0x8d, 0x48, 0x22, 0x3c, 0xd6, 0x4f, - 0x42, 0x8d, 0xb3, 0x07, 0x56, 0x64, 0x2b, 0x5b, 0x95, 0xb3, 0x07, 0x46, 0xd4, 0xe3, 0xb0, 0x7c, - 0x76, 0xb9, 0x2d, 0x91, 0xfc, 0x6f, 0x8b, 0x99, 0xd2, 0xae, 0x4c, 0xc7, 0xc5, 0x43, 0x16, 0x98, - 0x7b, 0xca, 0x86, 0xbf, 0x91, 0x63, 0xb7, 0x27, 0x69, 0x2f, 0x9a, 0xff, 0xde, 0xf5, 0x28, 0xda, - 0x12, 0xc9, 0x24, 0xe5, 0xe4, 0x32, 0x54, 0x42, 0x1c, 0xb9, 0x1c, 0x6d, 0xda, 0x46, 0x63, 0x4b, - 0x24, 0xdb, 0xec, 0xae, 0xef, 0x64, 0xe4, 0x39, 0xe8, 0xc4, 0x58, 0x4e, 0x82, 0x4c, 0x28, 0xbc, - 0x67, 0x91, 0x41, 0xd9, 0x6f, 0x5b, 0x78, 0xdf, 0xa1, 0xa7, 0x77, 0xc3, 0x67, 0x59, 0x42, 0x43, - 0xb6, 0xcd, 0xee, 0x92, 0x55, 0x28, 0x46, 0xec, 0xae, 0xfb, 0x46, 0xdb, 0x35, 0x33, 0x46, 0xc7, - 0x7c, 0xc5, 0x88, 0x7a, 0xef, 0xcc, 0x5b, 0x6e, 0x4b, 0x91, 0x39, 0x82, 0x97, 0xa0, 0x91, 0x88, - 0x51, 0x1c, 0xd2, 0x24, 0x88, 0xa3, 0x63, 0x97, 0xaf, 0xe0, 0xa0, 0x7e, 0x74, 0xfc, 0x88, 0xef, - 0x8b, 0x8f, 0xfa, 0xfe, 0xb0, 0x04, 0xad, 0x79, 0x5a, 0xf7, 0x4f, 0x5d, 0x06, 0x85, 0xd3, 0x97, - 0xc1, 0xb4, 0x17, 0x59, 0x9c, 0xeb, 0x45, 0x7a, 0x50, 0x1a, 0xc7, 0xdc, 0x5e, 0x0d, 0x79, 0xd6, - 0xe2, 0x8a, 0xdf, 0x8d, 0x79, 0xe4, 0xa3, 0x8c, 0xbc, 0x0a, 0x40, 0xa3, 0x28, 0x70, 0xe1, 0x2c, - 0xa1, 0xab, 0xdd, 0x99, 0xe6, 0xe9, 0xc0, 0xef, 0x2c, 0xf8, 0x75, 0x3a, 0xdd, 0x85, 0x6b, 0xd0, - 0x88, 0xa4, 0xc8, 0x72, 0xdb, 0x32, 0xda, 0x3e, 0x79, 0xc6, 0x76, 0x16, 0x94, 0x9d, 0x05, 0x1f, - 0xa2, 0x59, 0x88, 0x5e, 0x87, 0xa6, 0xc4, 0x04, 0x0a, 0x6c, 0x5b, 0x50, 0x41, 0xf3, 0x95, 0x33, - 0xe6, 0x73, 0x29, 0xbb, 0xb3, 0xe0, 0x37, 0xe4, 0x5c, 0x06, 0xbf, 0x0e, 0xed, 0x09, 0xde, 0x0a, - 0x41, 0x9e, 0xfb, 0xf6, 0x22, 0xba, 0x70, 0x66, 0x09, 0x77, 0x48, 0x76, 0x16, 0xfc, 0x96, 0xd5, - 0xcf, 0x4f, 0xcd, 0x35, 0x68, 0xe4, 0x0b, 0x28, 0x2d, 0xf1, 0x76, 0x7a, 0x94, 0xff, 0xec, 0x70, - 0x1a, 0xfe, 0x6e, 0x01, 0xa5, 0x25, 0xb9, 0x06, 0x6e, 0xb9, 0x20, 0xc3, 0x5a, 0xd5, 0xad, 0xa3, - 0xfd, 0xf9, 0x33, 0xf6, 0xb6, 0x90, 0xed, 0x2c, 0xf8, 0x4d, 0xab, 0xed, 0x0a, 0xdb, 0xab, 0x00, - 0xce, 0xfb, 0x50, 0x24, 0xdd, 0xc6, 0x63, 0xc3, 0x3e, 0x3d, 0x5f, 0x26, 0xec, 0x72, 0x7a, 0xd8, - 0xae, 0x41, 0x43, 0xda, 0x1c, 0x0d, 0x4c, 0x76, 0x36, 0x1f, 0x4b, 0x7b, 0x96, 0xc5, 0x86, 0xb6, - 0x9c, 0xce, 0x36, 0x1b, 0x50, 0x17, 0x19, 0x93, 0xd8, 0x39, 0xf5, 0x3e, 0x2e, 0x41, 0xe3, 0x20, - 0x3c, 0x64, 0x29, 0x7d, 0xe3, 0x58, 0x4b, 0x4a, 0x9e, 0x85, 0x0e, 0x67, 0xc7, 0xda, 0x70, 0xca, - 0x9b, 0x47, 0x9b, 0xba, 0x2d, 0x03, 0x6f, 0x89, 0xc4, 0x36, 0x8f, 0xd8, 0x3a, 0x48, 0x91, 0x65, - 0x2c, 0x0a, 0x6c, 0x43, 0x6d, 0xda, 0x2e, 0xd3, 0x3a, 0x58, 0xf0, 0xba, 0xeb, 0xa8, 0xdb, 0x36, - 0x33, 0x82, 0xf0, 0x90, 0xf2, 0x11, 0x8b, 0x5c, 0xaf, 0xdf, 0xb2, 0xe8, 0x96, 0x05, 0x4f, 0xd5, - 0x8e, 0xd2, 0xe9, 0xda, 0xf1, 0x19, 0xd5, 0xbf, 0xfc, 0xdf, 0x57, 0xff, 0xca, 0x17, 0xa8, 0xfe, - 0xd5, 0xff, 0x58, 0xfd, 0x6b, 0x5f, 0xb8, 0xfa, 0xd7, 0x1f, 0x57, 0xfd, 0x0d, 0xcf, 0x61, 0x22, - 0xc2, 0x71, 0x60, 0x78, 0x48, 0xf1, 0x40, 0x75, 0xc1, 0xf2, 0x44, 0x74, 0x97, 0x1e, 0xfb, 0xe2, - 0x81, 0x22, 0x57, 0x60, 0x49, 0x60, 0xcb, 0x82, 0x6a, 0x28, 0x52, 0x98, 0x29, 0x2d, 0xbf, 0x63, - 0x05, 0xbb, 0xf4, 0x78, 0x13, 0x61, 0x73, 0x6f, 0xdc, 0x60, 0x54, 0x4f, 0x24, 0xbb, 0x91, 0xd0, - 0x11, 0xe6, 0x44, 0xc9, 0x9f, 0x87, 0x8c, 0x46, 0x9f, 0x47, 0xec, 0x18, 0xb3, 0x43, 0x75, 0x5b, - 0xab, 0x45, 0xa3, 0x31, 0x07, 0x91, 0xcb, 0xd0, 0xda, 0xa7, 0x92, 0x71, 0xed, 0x9a, 0xf2, 0x6e, - 0x1b, 0x57, 0x39, 0x0d, 0x92, 0x35, 0xe8, 0xdc, 0x90, 0x22, 0xdd, 0x9f, 0x0c, 0xcd, 0xbb, 0x13, - 0x8b, 0x6a, 0x07, 0xb7, 0xf5, 0x2c, 0xdc, 0x8b, 0xa0, 0xd6, 0xe7, 0xfa, 0x5b, 0x2f, 0xef, 0xd2, - 0x8c, 0xf4, 0xa0, 0x90, 0xba, 0xe6, 0xda, 0xb6, 0xbc, 0xb9, 0x64, 0x7d, 0xd7, 0xb6, 0xd9, 0x85, - 0x74, 0xe5, 0x65, 0xa8, 0xd8, 0x89, 0x79, 0xd6, 0x8d, 0xd9, 0x09, 0xa6, 0x5e, 0xd1, 0x37, 0x43, - 0x72, 0x0e, 0xca, 0x47, 0x34, 0x99, 0xd8, 0x2b, 0xa4, 0xe8, 0xdb, 0xc9, 0x6b, 0x8b, 0xaf, 0x14, - 0x7a, 0x6f, 0x41, 0x73, 0x20, 0x29, 0x57, 0xdb, 0x4c, 0x99, 0x82, 0x4e, 0x2e, 0x40, 0x45, 0x0c, - 0xef, 0xf5, 0x5d, 0xd1, 0x2d, 0xfb, 0x6e, 0x66, 0xf0, 0x61, 0x32, 0x36, 0xb8, 0xbd, 0x03, 0xdc, - 0xcc, 0xe0, 0x52, 0x3c, 0x30, 0x78, 0xd1, 0xe2, 0x76, 0xd6, 0xfb, 0x41, 0x01, 0x1a, 0x9b, 0xc9, - 0x18, 0xd7, 0x36, 0x1e, 0xbc, 0x30, 0xf3, 0xe0, 0x09, 0xdb, 0xba, 0xcc, 0x84, 0xce, 0x09, 0xf7, - 0x50, 0x2c, 0xa4, 0x2b, 0x37, 0x1f, 0xe7, 0x4a, 0xd9, 0xba, 0xf2, 0xdc, 0xbc, 0x2b, 0x8d, 0x8d, - 0x25, 0xfb, 0x0e, 0x9a, 0x73, 0x61, 0xde, 0xbb, 0x1d, 0x20, 0xf9, 0x77, 0xee, 0x32, 0xb9, 0x29, - 0xc4, 0x38, 0xe6, 0x23, 0xb2, 0x01, 0xb5, 0x94, 0x66, 0x59, 0xcc, 0x47, 0xca, 0x51, 0xf2, 0xce, - 0x52, 0x72, 0x5c, 0xa6, 0x7a, 0xbd, 0x8f, 0x16, 0xc1, 0xc3, 0x0c, 0xdc, 0xc2, 0xf7, 0x8f, 0x65, - 0xf7, 0xd8, 0x17, 0xec, 0x79, 0xa8, 0xe8, 0x61, 0x32, 0xbb, 0x4b, 0xca, 0x7a, 0x98, 0x3c, 0xf2, - 0x9a, 0x28, 0x9e, 0x7d, 0x4d, 0x7c, 0x13, 0x6a, 0x4a, 0x53, 0xa9, 0x03, 0xec, 0x92, 0x3e, 0xb3, - 0x17, 0x74, 0xbc, 0xaa, 0xa8, 0x3b, 0x50, 0xe6, 0xa2, 0x9c, 0x1d, 0x41, 0xd5, 0x2d, 0xaf, 0x16, - 0xd7, 0x9a, 0x3e, 0xa4, 0xf9, 0xd9, 0x53, 0xf8, 0xfe, 0x93, 0x8c, 0xea, 0x5c, 0xa3, 0x82, 0x1a, - 0x0d, 0x87, 0xa1, 0xca, 0x37, 0xa0, 0x3a, 0xb4, 0x91, 0x71, 0x37, 0xc0, 0xe9, 0x0d, 0x9a, 0x05, - 0xce, 0xcf, 0xf5, 0xcc, 0x67, 0xdd, 0xd0, 0xbc, 0x2c, 0xf1, 0x60, 0xd7, 0x7d, 0x70, 0xd0, 0x2d, - 0x11, 0x9a, 0x7d, 0x63, 0x52, 0xe2, 0xf9, 0xad, 0xfb, 0x66, 0x68, 0x52, 0x30, 0x61, 0x47, 0x2c, - 0xc1, 0xb3, 0x5a, 0xf6, 0xed, 0xa4, 0xf7, 0xb3, 0x45, 0x68, 0x63, 0x58, 0x07, 0x54, 0x8d, 0xff, - 0xef, 0x41, 0x9d, 0x7b, 0xfd, 0x97, 0x4e, 0xbd, 0xfe, 0x7b, 0xd0, 0xd2, 0xc2, 0x15, 0x9a, 0xb9, - 0xc0, 0x35, 0xb4, 0x40, 0x32, 0x18, 0x96, 0x75, 0x58, 0x66, 0x4a, 0xc7, 0x29, 0xc6, 0x2e, 0x65, - 0x69, 0x30, 0x51, 0x74, 0x64, 0xef, 0xd9, 0x92, 0xbf, 0x34, 0x15, 0xed, 0xb2, 0xf4, 0x8e, 0x11, - 0x18, 0x2e, 0x34, 0x0c, 0xc5, 0x84, 0x6b, 0x43, 0xd3, 0x56, 0xc3, 0xba, 0x43, 0xec, 0x2f, 0x11, - 0x13, 0xc5, 0xa4, 0x91, 0xd5, 0x50, 0x56, 0x31, 0x53, 0x2b, 0x90, 0xc2, 0x36, 0x25, 0x75, 0x2b, - 0x30, 0xd3, 0x7e, 0xd4, 0xbb, 0x0d, 0xed, 0xd9, 0x33, 0x0b, 0x1f, 0xf3, 0x2b, 0x50, 0xbb, 0x75, - 0xfa, 0x21, 0x3f, 0x9d, 0x9b, 0x02, 0xa5, 0xe5, 0x84, 0x87, 0x54, 0xb3, 0x5b, 0x8a, 0xbb, 0x30, - 0xcd, 0x43, 0x57, 0x7e, 0x5c, 0x84, 0xca, 0x5e, 0xb6, 0x25, 0x22, 0x46, 0xaa, 0x50, 0xbc, 0x2d, - 0x32, 0x6f, 0x81, 0x2c, 0x41, 0x73, 0x2f, 0xbb, 0xc9, 0xb4, 0xfb, 0xc9, 0xc0, 0xfb, 0x47, 0x95, - 0x78, 0xd0, 0xd8, 0xcb, 0xf6, 0xa5, 0x4b, 0x74, 0xef, 0x9f, 0x55, 0xd2, 0x30, 0x76, 0xfb, 0x31, - 0x1f, 0x79, 0x1f, 0x76, 0x48, 0x13, 0xaa, 0x7b, 0xd9, 0x8d, 0x64, 0xa2, 0x0e, 0xbd, 0x5f, 0x77, - 0xac, 0xfd, 0x8c, 0xa5, 0xf7, 0x9b, 0x0e, 0x69, 0x43, 0x7d, 0x2f, 0xeb, 0x73, 0x95, 0x99, 0xd7, - 0xe2, 0x47, 0x1d, 0x72, 0x0e, 0x3a, 0x7b, 0xd9, 0xf5, 0x28, 0xba, 0x41, 0x27, 0x89, 0xde, 0x47, - 0xad, 0xdf, 0x76, 0x48, 0x0b, 0x6a, 0x7b, 0xd9, 0x26, 0x0d, 0xc7, 0x93, 0xcc, 0xfb, 0x5d, 0xc7, - 0x7e, 0x74, 0x20, 0x69, 0xc8, 0x0e, 0x32, 0xca, 0xbd, 0xdf, 0x77, 0xc8, 0x32, 0xb4, 0xf7, 0xb2, - 0x03, 0x2d, 0x24, 0x1d, 0x31, 0x0c, 0xb0, 0xf7, 0x87, 0x0e, 0x79, 0x02, 0xc8, 0x5e, 0x76, 0x33, - 0x11, 0x43, 0x9a, 0xcc, 0x7d, 0xf4, 0x8f, 0x1d, 0x72, 0x01, 0x96, 0xcc, 0x47, 0x35, 0x93, 0x21, - 0xcb, 0xb4, 0xa3, 0xfe, 0x71, 0x87, 0x10, 0x68, 0x19, 0x97, 0xcd, 0x14, 0x77, 0xd6, 0xfb, 0x93, - 0xd3, 0xdd, 0x8e, 0xd5, 0xd8, 0xfc, 0x6d, 0x25, 0x8c, 0x72, 0x26, 0xbd, 0x3f, 0x3b, 0x4a, 0x3e, - 0xa3, 0x11, 0x93, 0xde, 0x5f, 0x3a, 0x64, 0x05, 0xce, 0xdb, 0xd0, 0x50, 0xcd, 0x94, 0x9e, 0xfb, - 0xdc, 0x27, 0x39, 0x39, 0x4e, 0x33, 0x75, 0x28, 0xb4, 0x31, 0xf1, 0xfe, 0x3a, 0x33, 0x70, 0x37, - 0x33, 0x56, 0xfc, 0x5b, 0xb1, 0xd2, 0xde, 0x43, 0xc7, 0x03, 0x23, 0xd0, 0xe7, 0xf8, 0x8c, 0xfe, - 0x5b, 0xe7, 0xca, 0x2f, 0x0b, 0x50, 0x9f, 0xb6, 0x93, 0xa4, 0x01, 0xd5, 0x3e, 0x3f, 0xa2, 0x49, - 0x1c, 0x79, 0x0b, 0xa4, 0x05, 0xf5, 0x69, 0xd3, 0xe8, 0x15, 0xf0, 0x59, 0x3e, 0xed, 0xfc, 0xbc, - 0x45, 0xd2, 0x81, 0xc6, 0x5c, 0x63, 0x67, 0x9f, 0xf2, 0x77, 0xe6, 0x7b, 0x33, 0xaf, 0x44, 0xce, - 0x81, 0x97, 0x43, 0x79, 0x07, 0xe6, 0x95, 0x89, 0x07, 0xcd, 0x3b, 0x73, 0x7d, 0x94, 0x57, 0x31, - 0xc8, 0xf5, 0x28, 0xda, 0xcf, 0x7f, 0x4a, 0xf3, 0x4c, 0x02, 0x34, 0xa7, 0xad, 0x93, 0xf9, 0x5e, - 0xcd, 0x7c, 0x7f, 0xd6, 0x10, 0x79, 0xf5, 0x2b, 0x37, 0xa1, 0x3e, 0xbd, 0xbf, 0x49, 0x0d, 0x4a, - 0xd7, 0x27, 0x5a, 0x58, 0xd6, 0xb7, 0x85, 0xfd, 0x2d, 0x41, 0x79, 0x05, 0xd2, 0x84, 0xda, 0x66, - 0x3c, 0xb2, 0x14, 0x17, 0xc9, 0x32, 0x74, 0xb6, 0x04, 0xd7, 0x31, 0x9f, 0x88, 0x89, 0xc2, 0x9f, - 0x8f, 0xbc, 0xe2, 0xe6, 0x77, 0x3e, 0xf8, 0xf4, 0x62, 0xe1, 0xc3, 0x4f, 0x2f, 0x16, 0x1e, 0x7e, - 0x7a, 0x71, 0xe1, 0xbd, 0xbf, 0x5f, 0x2c, 0xbc, 0xf3, 0xf5, 0xb9, 0x1f, 0xa6, 0x53, 0xaa, 0x65, - 0x7c, 0x2c, 0x64, 0x3c, 0x8a, 0x79, 0x3e, 0xe1, 0xec, 0x6a, 0x36, 0x1e, 0x5d, 0xcd, 0x86, 0x57, - 0x69, 0x16, 0x0f, 0x2b, 0xf8, 0x0b, 0xf4, 0x4b, 0xff, 0x0e, 0x00, 0x00, 0xff, 0xff, 0x84, 0x64, - 0x0a, 0xc7, 0xdf, 0x16, 0x00, 0x00, + // 2768 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xc4, 0x58, 0xdd, 0x6f, 0x1c, 0xc7, + 0x91, 0xe7, 0x72, 0xbf, 0x6b, 0xf6, 0x63, 0xd8, 0xd4, 0xc7, 0x9a, 0xe7, 0x93, 0x78, 0x6b, 0xd9, + 0xa6, 0xe5, 0x33, 0x05, 0xd3, 0xbe, 0x3b, 0xdb, 0x10, 0xce, 0x10, 0x49, 0x4b, 0x5c, 0x5b, 0xd4, + 0xf2, 0x86, 0x94, 0x0d, 0x18, 0x07, 0x0c, 0x7a, 0x67, 0x9a, 0xcb, 0xd1, 0xce, 0x74, 0x8f, 0x7a, + 0x7a, 0x25, 0xd2, 0xaf, 0x77, 0x79, 0xcc, 0x4b, 0xde, 0xf2, 0x66, 0xbf, 0xe7, 0x25, 0x80, 0xff, + 0x86, 0xc0, 0x8f, 0x0e, 0xe2, 0x7c, 0x27, 0x8e, 0xe3, 0xbc, 0xe4, 0xe3, 0x9f, 0x08, 0xba, 0xba, + 0x67, 0x77, 0x48, 0xd1, 0x4e, 0x1c, 0x04, 0xf0, 0xc3, 0x2e, 0xba, 0x7f, 0x55, 0xd5, 0x53, 0x55, + 0x5d, 0x5d, 0x55, 0xdd, 0xd0, 0xa4, 0x69, 0xb4, 0x9e, 0x4a, 0xa1, 0x04, 0x29, 0xd3, 0x34, 0x5a, + 0x79, 0x69, 0x1c, 0xa9, 0xa3, 0xe9, 0x68, 0x3d, 0x10, 0xc9, 0x8d, 0xb1, 0x18, 0x8b, 0x1b, 0x48, + 0x1b, 0x4d, 0x0f, 0x71, 0x86, 0x13, 0x1c, 0x19, 0x99, 0x95, 0xae, 0x8a, 0x12, 0x96, 0x29, 0x9a, + 0xa4, 0x16, 0x80, 0x34, 0xa6, 0xdc, 0x8c, 0xfb, 0xff, 0x05, 0xed, 0x83, 0x7b, 0x7b, 0x11, 0x1f, + 0x7b, 0xec, 0xe1, 0x94, 0x65, 0x8a, 0x3c, 0x0d, 0xcd, 0x94, 0x4a, 0x9a, 0x30, 0xc5, 0x64, 0xaf, + 0xb4, 0x5a, 0x5a, 0x6b, 0x7a, 0x73, 0xe0, 0x8d, 0xc6, 0x87, 0x1f, 0x5d, 0x2d, 0x7d, 0xf1, 0xd1, + 0xd5, 0x85, 0xfe, 0xc7, 0x25, 0xe8, 0xe4, 0x92, 0x59, 0x2a, 0x78, 0xc6, 0x48, 0x0f, 0xea, 0x99, + 0x12, 0x92, 0x0d, 0xb6, 0xad, 0x60, 0x3e, 0x25, 0xcf, 0x41, 0x27, 0x63, 0xf2, 0x51, 0x14, 0xb0, + 0x5b, 0x61, 0x28, 0x59, 0x96, 0xf5, 0x16, 0x91, 0xe1, 0x0c, 0x8a, 0x2b, 0x1c, 0x51, 0x19, 0x0e, + 0xb6, 0x7b, 0xe5, 0xd5, 0xd2, 0x5a, 0xc5, 0xcb, 0xa7, 0x5a, 0x2d, 0xc9, 0xd2, 0x38, 0x0a, 0xe8, + 0x60, 0xbb, 0x57, 0x41, 0xda, 0x1c, 0x20, 0x57, 0x00, 0x62, 0x31, 0xde, 0xb7, 0xa2, 0x55, 0x24, + 0x17, 0x90, 0x82, 0xda, 0x6f, 0x80, 0x7b, 0x70, 0x6f, 0x5f, 0xc9, 0xa2, 0xde, 0xb8, 0xb6, 0x9a, + 0x4a, 0xbe, 0xaf, 0x66, 0x26, 0xcf, 0x80, 0x82, 0xec, 0x0f, 0x4b, 0x50, 0x7b, 0x97, 0x05, 0x4a, + 0x48, 0x42, 0xa0, 0x12, 0x52, 0x45, 0x91, 0xbb, 0xe5, 0xe1, 0x98, 0x5c, 0x83, 0x8a, 0x3a, 0x49, + 0x19, 0x9a, 0xe6, 0x6c, 0xc0, 0x3a, 0x7a, 0xf9, 0xe0, 0x24, 0x65, 0x9b, 0x95, 0x4f, 0x3e, 0xbf, + 0xba, 0xe0, 0x21, 0x95, 0xac, 0x40, 0x83, 0x4f, 0xe3, 0x98, 0x8e, 0x62, 0x86, 0x36, 0x36, 0xbc, + 0xd9, 0x9c, 0xb8, 0x50, 0xe6, 0x59, 0x8a, 0xe6, 0xb5, 0x3c, 0x3d, 0x24, 0x4f, 0x41, 0x23, 0xca, + 0xfc, 0x40, 0xf0, 0x4c, 0xa1, 0x59, 0x0d, 0xaf, 0x1e, 0x65, 0x5b, 0x7a, 0xaa, 0x99, 0x63, 0xc6, + 0x7b, 0xb5, 0xd5, 0xd2, 0x5a, 0xdb, 0xd3, 0x43, 0xad, 0x14, 0x95, 0x8c, 0xf6, 0xea, 0x46, 0x29, + 0x3d, 0xee, 0xbf, 0x0d, 0xd5, 0x4d, 0xaa, 0x82, 0x23, 0xb2, 0x02, 0x55, 0xaa, 0x94, 0xcc, 0x7a, + 0xa5, 0xd5, 0xf2, 0x5a, 0xd3, 0xaa, 0x64, 0x20, 0xf2, 0x2c, 0x54, 0x1e, 0xb1, 0x40, 0x6f, 0x4a, + 0x79, 0xcd, 0xd9, 0x70, 0xd6, 0x75, 0xbc, 0x19, 0x43, 0x73, 0xd5, 0x35, 0xb9, 0xff, 0xa3, 0x12, + 0xd4, 0x0f, 0xb4, 0xa2, 0x83, 0x6d, 0xb2, 0x0c, 0xd5, 0x70, 0xe4, 0x47, 0x21, 0x7a, 0xa0, 0xe2, + 0x55, 0xc2, 0xd1, 0x20, 0xd4, 0xa0, 0x42, 0x70, 0xd1, 0x80, 0x4a, 0x83, 0xff, 0x06, 0xad, 0x94, + 0x4a, 0x15, 0xa9, 0x48, 0x70, 0x4d, 0x33, 0x1b, 0xeb, 0xcc, 0xb0, 0x41, 0x48, 0x2e, 0x42, 0x8d, + 0x06, 0x81, 0x26, 0x56, 0xd0, 0x9a, 0x2a, 0x0d, 0x82, 0x41, 0x48, 0x2e, 0x43, 0x3d, 0x1c, 0xf9, + 0x9c, 0x26, 0x0c, 0x6d, 0x6f, 0x7a, 0xb5, 0x70, 0x74, 0x8f, 0x26, 0x4c, 0x13, 0x94, 0x25, 0xd4, + 0x0c, 0x41, 0x19, 0xc2, 0xb3, 0xd0, 0x49, 0x65, 0x94, 0x50, 0x79, 0xe2, 0x67, 0xec, 0x21, 0x9f, + 0x26, 0xe8, 0x8b, 0xb6, 0xd7, 0xb6, 0xe8, 0x3e, 0x82, 0xfd, 0xef, 0x95, 0xa0, 0xb3, 0x7f, 0xc2, + 0x83, 0xbb, 0x62, 0x7c, 0x40, 0xa3, 0xd8, 0x63, 0x0f, 0xc9, 0x4b, 0x50, 0x0f, 0xb8, 0x7f, 0x44, + 0x1f, 0x31, 0xb4, 0xc8, 0xd9, 0xb8, 0xb0, 0x3e, 0x3f, 0x36, 0x07, 0xf9, 0xc8, 0xab, 0x05, 0x7c, + 0x87, 0x3e, 0x62, 0x96, 0xfd, 0x31, 0xe5, 0xca, 0x6e, 0xf7, 0x57, 0xb2, 0xbf, 0x47, 0xb9, 0x22, + 0x7d, 0xa8, 0xaa, 0xd9, 0x8e, 0x3b, 0x1b, 0x2d, 0xf4, 0xb0, 0x75, 0xa5, 0x67, 0x48, 0xfd, 0xff, + 0x85, 0xee, 0x29, 0x9d, 0xb2, 0x54, 0xbb, 0x2e, 0x98, 0xa4, 0x7e, 0x2c, 0x02, 0xaa, 0x3d, 0x65, + 0x63, 0xd3, 0x09, 0x26, 0xe9, 0x5d, 0x0b, 0x91, 0xe7, 0xa0, 0x11, 0x88, 0x24, 0xa1, 0x3c, 0xcc, + 0xb7, 0x0f, 0x70, 0xf1, 0xb7, 0xb8, 0x92, 0x27, 0xde, 0x8c, 0xd6, 0xcf, 0x60, 0x69, 0x4f, 0x32, + 0x3d, 0x8d, 0xd4, 0x7b, 0x32, 0x52, 0x6c, 0x2b, 0x09, 0xc9, 0x0b, 0x00, 0x4c, 0xf3, 0xf9, 0x71, + 0x94, 0x29, 0x0c, 0x8c, 0xd3, 0xe2, 0x4d, 0xa4, 0xde, 0x8d, 0x32, 0x45, 0x5e, 0x81, 0x4b, 0xd9, + 0x09, 0x0f, 0x7c, 0x9d, 0x35, 0x58, 0x80, 0x7b, 0xf9, 0x40, 0xcc, 0xf6, 0xba, 0xe9, 0x2d, 0x6b, + 0xea, 0xde, 0x8c, 0xf8, 0xb6, 0x18, 0x0d, 0xc2, 0xfe, 0x5f, 0xca, 0x50, 0xc5, 0x95, 0xc8, 0x2b, + 0xf9, 0x97, 0xf0, 0x84, 0x68, 0x3b, 0x3a, 0x1b, 0x17, 0xe6, 0x5f, 0x32, 0xff, 0xfa, 0xac, 0xd8, + 0x6f, 0xea, 0xa1, 0x0e, 0x7e, 0x74, 0xcd, 0x3c, 0xa2, 0xea, 0x38, 0x1f, 0x84, 0xe4, 0x2a, 0x38, + 0xfa, 0xcc, 0x8d, 0x68, 0xc6, 0xe6, 0x31, 0x05, 0x39, 0x34, 0x08, 0xc9, 0xbf, 0x02, 0x18, 0x59, + 0x8c, 0x92, 0x8a, 0x39, 0xd4, 0x88, 0x60, 0xa0, 0x3c, 0x03, 0xed, 0x99, 0x7c, 0x21, 0xc0, 0x5a, + 0x39, 0x88, 0x4c, 0xff, 0x02, 0xcd, 0xc3, 0x28, 0x5f, 0xc2, 0x04, 0x5a, 0x43, 0x03, 0x48, 0x7c, + 0x1a, 0xca, 0x23, 0xaa, 0x30, 0xbe, 0x72, 0xa7, 0xe1, 0x41, 0xf3, 0x34, 0x4c, 0x9e, 0x81, 0x4e, + 0x3a, 0xf1, 0x83, 0x23, 0x16, 0x4c, 0xfc, 0xd1, 0x89, 0xaf, 0x78, 0xaf, 0xb1, 0x5a, 0x5a, 0xab, + 0x7a, 0x4e, 0x3a, 0xd9, 0xd2, 0xe0, 0xe6, 0xc9, 0x81, 0xde, 0xbb, 0x2e, 0x9d, 0x2a, 0xe1, 0x47, + 0x3c, 0x90, 0x3e, 0x4b, 0x45, 0x70, 0xd4, 0x6b, 0x9a, 0x70, 0xd5, 0xf0, 0x80, 0x07, 0xf2, 0x2d, + 0x0d, 0x92, 0x97, 0xe1, 0xe2, 0x19, 0x3e, 0x7f, 0xc2, 0xc5, 0x63, 0xde, 0x03, 0xcc, 0x08, 0xe4, + 0x14, 0xf7, 0x3b, 0x9a, 0xd2, 0x97, 0xd0, 0x9c, 0xb9, 0x94, 0x00, 0xd4, 0x06, 0x3c, 0x63, 0x52, + 0xb9, 0x0b, 0x7a, 0xbc, 0xcd, 0x62, 0xa6, 0x98, 0x5b, 0xd2, 0xe3, 0xfb, 0x69, 0x48, 0x15, 0x73, + 0x17, 0x49, 0x13, 0xaa, 0xb7, 0x62, 0xc5, 0xa4, 0x5b, 0x26, 0x4b, 0xd0, 0xde, 0x4f, 0x59, 0x10, + 0xd1, 0xd8, 0x72, 0x56, 0x48, 0x07, 0x60, 0x9b, 0x2a, 0x3a, 0x1c, 0x3d, 0x60, 0x81, 0x72, 0xab, + 0x64, 0x19, 0xba, 0x07, 0x22, 0x19, 0x65, 0x4a, 0x70, 0x66, 0xc1, 0x5a, 0xff, 0xff, 0x4b, 0x00, + 0x68, 0x5c, 0x2a, 0x22, 0xae, 0xc8, 0x8b, 0x50, 0x4b, 0x22, 0xee, 0xab, 0xec, 0x6b, 0x0f, 0x54, + 0x35, 0x89, 0xf8, 0x41, 0x86, 0xcc, 0xf4, 0x58, 0x33, 0x2f, 0x7e, 0x2d, 0x33, 0x3d, 0x3e, 0xc8, + 0x72, 0xd7, 0x97, 0xcf, 0x75, 0xbd, 0x51, 0x83, 0x2a, 0x1a, 0x8b, 0xf1, 0xd6, 0x24, 0xfd, 0xd6, + 0xd4, 0xf8, 0x4e, 0x09, 0x9c, 0x5d, 0xa6, 0xa8, 0x8e, 0xa8, 0x6f, 0x53, 0x8f, 0x3f, 0x97, 0xc0, + 0xc5, 0x9d, 0xc5, 0x74, 0xb3, 0x27, 0xe2, 0x28, 0x38, 0x21, 0xeb, 0xb0, 0xac, 0x95, 0x11, 0x59, + 0xf4, 0x01, 0xf3, 0x1f, 0x4e, 0x69, 0x14, 0x47, 0x87, 0xcc, 0xe4, 0xf2, 0xb6, 0xb7, 0x94, 0x44, + 0x7c, 0xa8, 0x29, 0xff, 0x93, 0x13, 0xc8, 0x35, 0xe8, 0x68, 0x7d, 0xc4, 0xe8, 0x81, 0x2f, 0x38, + 0x93, 0x53, 0x8e, 0x7a, 0xb5, 0xbd, 0x56, 0x42, 0x8f, 0x87, 0xa3, 0x07, 0x43, 0xc4, 0xc8, 0x0d, + 0xb8, 0x80, 0x5c, 0xb8, 0x6a, 0xc2, 0xe4, 0x98, 0x85, 0x5a, 0x04, 0x35, 0xd3, 0xcb, 0xd2, 0x63, + 0x5c, 0x76, 0x17, 0x29, 0xc3, 0xd1, 0x03, 0x72, 0x0d, 0xaa, 0x47, 0x11, 0x57, 0x59, 0xaf, 0xb2, + 0x5a, 0x5e, 0xeb, 0x6c, 0x74, 0x50, 0x77, 0x24, 0xef, 0x44, 0x5c, 0x79, 0x86, 0x48, 0x5e, 0x00, + 0xad, 0x91, 0x1f, 0x70, 0xb3, 0xa6, 0xaf, 0xd7, 0xb0, 0x35, 0xbe, 0x93, 0x44, 0x7c, 0x8b, 0xa3, + 0xc4, 0x7e, 0xf4, 0x01, 0xeb, 0xbf, 0x06, 0x17, 0xe6, 0xb6, 0x62, 0x99, 0x94, 0x54, 0xc7, 0xe2, + 0x2a, 0x38, 0xc1, 0x6c, 0x96, 0xd9, 0xaa, 0x5d, 0x84, 0xfa, 0x2f, 0xc1, 0x52, 0x51, 0x32, 0x49, + 0x18, 0x57, 0xba, 0x1d, 0x09, 0xcc, 0x30, 0x6f, 0x68, 0xec, 0xb4, 0xbf, 0x0b, 0x17, 0xe7, 0xec, + 0x1e, 0xd3, 0x19, 0x02, 0x87, 0x3a, 0x67, 0x89, 0x38, 0x34, 0x29, 0xc3, 0xca, 0x88, 0x38, 0xc4, + 0x8c, 0xf1, 0x14, 0x34, 0x38, 0x7b, 0x6c, 0x48, 0x26, 0x69, 0xd6, 0x39, 0x7b, 0xac, 0x49, 0x7d, + 0x0e, 0xcb, 0x67, 0x97, 0xdb, 0x12, 0xf1, 0x3f, 0xb6, 0x98, 0xae, 0x1a, 0x99, 0x6e, 0xe6, 0x78, + 0xc0, 0x7c, 0x5d, 0x02, 0x8d, 0xfb, 0x9d, 0x1c, 0xbb, 0x37, 0x4d, 0xfa, 0x61, 0xf1, 0x7b, 0xb7, + 0xc2, 0x70, 0x4b, 0xc4, 0xd3, 0x84, 0x93, 0x6b, 0x50, 0x0b, 0x70, 0x64, 0x63, 0xb4, 0x65, 0x7a, + 0x98, 0x2d, 0x11, 0x6f, 0xb3, 0x43, 0xcf, 0xd2, 0xc8, 0xf3, 0xd0, 0x8d, 0x30, 0x9d, 0xf8, 0xa9, + 0xc8, 0xb0, 0x84, 0xa3, 0x06, 0x55, 0xaf, 0x63, 0xe0, 0x3d, 0x8b, 0x9e, 0xde, 0x0d, 0x8f, 0xa5, + 0x31, 0x0d, 0xd8, 0x36, 0x3b, 0x24, 0xab, 0x50, 0x0e, 0xd9, 0xa1, 0xfd, 0x46, 0xc7, 0xf6, 0x49, + 0x9a, 0x47, 0x7f, 0x45, 0x93, 0xfa, 0xef, 0x17, 0x25, 0xb7, 0xa5, 0x48, 0xad, 0x82, 0x57, 0xc1, + 0x89, 0xc5, 0x38, 0x0a, 0x68, 0xec, 0x47, 0xe1, 0xb1, 0x8d, 0x57, 0xb0, 0xd0, 0x20, 0x3c, 0x7e, + 0xc2, 0xf6, 0xc5, 0x27, 0x6d, 0xbf, 0x03, 0x97, 0x0b, 0xb6, 0xdb, 0xd4, 0xc9, 0x70, 0xbf, 0x2f, + 0x41, 0x4d, 0x1c, 0x1e, 0x66, 0x4c, 0xd9, 0xae, 0xc6, 0xce, 0xc8, 0x05, 0xa8, 0x9a, 0xf4, 0x6c, + 0x96, 0x33, 0x93, 0xfe, 0xc7, 0x55, 0x68, 0x17, 0xed, 0x7b, 0x78, 0xaa, 0x60, 0x95, 0x4e, 0x17, + 0xac, 0x59, 0xbf, 0xb4, 0x58, 0xe8, 0x97, 0xfa, 0x50, 0x99, 0x44, 0xdc, 0x94, 0xaf, 0x3c, 0xfc, + 0x71, 0xc5, 0x77, 0x22, 0x1e, 0x7a, 0x48, 0x23, 0xaf, 0x03, 0xd0, 0x30, 0xf4, 0xed, 0xbe, 0x54, + 0xd0, 0x67, 0xbd, 0x39, 0xe7, 0xe9, 0x1d, 0xdc, 0x59, 0xf0, 0x9a, 0x74, 0xb6, 0x9d, 0x37, 0xc1, + 0x09, 0xa5, 0x48, 0x73, 0xd9, 0x2a, 0xca, 0x3e, 0x75, 0x46, 0x76, 0xee, 0xdd, 0x9d, 0x05, 0x0f, + 0xc2, 0xb9, 0xaf, 0xdf, 0x84, 0x96, 0xc4, 0x48, 0xf4, 0x4d, 0xeb, 0x52, 0x43, 0xf1, 0x95, 0x33, + 0xe2, 0x85, 0xd8, 0xdf, 0x59, 0xf0, 0x1c, 0x59, 0x38, 0x0a, 0x6f, 0x42, 0x67, 0x8a, 0xe5, 0xc5, + 0xcf, 0x0f, 0x91, 0x29, 0x96, 0x97, 0xce, 0x2c, 0x61, 0x4f, 0xdb, 0xce, 0x82, 0xd7, 0x36, 0xfc, + 0xf9, 0xf1, 0xbb, 0x09, 0x4e, 0xbe, 0x40, 0xa6, 0x24, 0x56, 0xd0, 0x27, 0xf5, 0x9f, 0x9f, 0x72, + 0xad, 0xbf, 0x5d, 0x20, 0x53, 0x92, 0xdc, 0x04, 0xbb, 0x9c, 0x9f, 0x62, 0xd2, 0xc3, 0xda, 0xea, + 0x6c, 0x5c, 0x3c, 0x23, 0x6f, 0x32, 0xe2, 0xce, 0x82, 0xd7, 0x32, 0xdc, 0x36, 0x43, 0xbe, 0x0e, + 0x60, 0xad, 0x0f, 0x44, 0xdc, 0x73, 0xce, 0x75, 0xfb, 0xec, 0xa0, 0x6a, 0xb7, 0xcb, 0xd9, 0xa9, + 0xbd, 0x09, 0x8e, 0x34, 0xc1, 0xee, 0xeb, 0x30, 0x6f, 0x9d, 0xab, 0xf6, 0xfc, 0x38, 0x68, 0xb5, + 0xe5, 0xfc, 0x70, 0x78, 0x70, 0xd1, 0xaa, 0x3d, 0xab, 0xf9, 0x18, 0x9c, 0xbd, 0x36, 0xae, 0xf3, + 0xf4, 0xd9, 0xad, 0x2f, 0x06, 0xf0, 0xce, 0x82, 0xb7, 0x6c, 0x84, 0x4f, 0xc1, 0x9b, 0x0e, 0x34, + 0x45, 0xca, 0x24, 0x76, 0x8c, 0xfd, 0x1f, 0x54, 0xc1, 0xd9, 0x0f, 0x8e, 0x58, 0x42, 0xdf, 0x3a, + 0x56, 0x92, 0xea, 0x2e, 0x84, 0xb3, 0x63, 0xa5, 0xed, 0xcc, 0x9b, 0x66, 0x73, 0xae, 0xda, 0x1a, + 0xde, 0x12, 0xb1, 0x69, 0x9a, 0xb1, 0x65, 0x92, 0x22, 0x4d, 0x59, 0xe8, 0x9b, 0x8b, 0x84, 0x6e, + 0x37, 0x75, 0xcb, 0x64, 0xc0, 0x5b, 0xf6, 0x26, 0xd1, 0x31, 0xd1, 0xe6, 0x07, 0x47, 0x94, 0x8f, + 0x59, 0x68, 0xef, 0x38, 0x6d, 0x83, 0x6e, 0x19, 0xf0, 0x54, 0x62, 0xab, 0x9c, 0x4e, 0x6c, 0x5f, + 0x51, 0x9a, 0xaa, 0x7f, 0x7f, 0x69, 0xaa, 0x7d, 0x83, 0xd2, 0x54, 0xff, 0x9b, 0xa5, 0xa9, 0xf1, + 0x8d, 0x4b, 0x53, 0xf3, 0xbc, 0xd2, 0xa4, 0xf5, 0x1c, 0xc5, 0x22, 0x98, 0xf8, 0x5a, 0x0f, 0x29, + 0x1e, 0x67, 0xd8, 0xbd, 0xb5, 0xbd, 0x16, 0xa2, 0xbb, 0xf4, 0xd8, 0x13, 0x8f, 0x33, 0x72, 0x1d, + 0x96, 0x04, 0xf6, 0x53, 0xc8, 0x86, 0xa4, 0x0c, 0xa3, 0xaf, 0xed, 0x75, 0x0d, 0x61, 0x97, 0x1e, + 0x6f, 0x22, 0xac, 0x8b, 0xda, 0x6d, 0x46, 0xd5, 0x54, 0xb2, 0xdb, 0x31, 0x1d, 0x63, 0x9c, 0x55, + 0xbc, 0x22, 0xa4, 0x39, 0x06, 0x3c, 0x64, 0xc7, 0x18, 0x29, 0x59, 0xaf, 0xbd, 0x5a, 0xd6, 0x1c, + 0x05, 0x88, 0x5c, 0x83, 0xf6, 0x1e, 0x95, 0x8c, 0x2b, 0x7b, 0x19, 0xe9, 0x75, 0x70, 0x95, 0xd3, + 0x20, 0x59, 0x83, 0xee, 0x6d, 0x29, 0x92, 0xbd, 0xe9, 0x48, 0xdf, 0xb7, 0x31, 0xe3, 0x77, 0x71, + 0x5b, 0xcf, 0xc2, 0x64, 0x0d, 0xdc, 0x79, 0xab, 0x6a, 0x73, 0xa9, 0x6b, 0xfc, 0x91, 0x77, 0xa9, + 0x43, 0x93, 0x53, 0xcf, 0x69, 0x7e, 0x97, 0xce, 0x69, 0x7e, 0xfb, 0x21, 0x34, 0x06, 0x5c, 0xfd, + 0xe7, 0xab, 0xbb, 0x34, 0x25, 0x7d, 0x28, 0x25, 0xf6, 0x9a, 0x62, 0x2e, 0x0f, 0x39, 0x65, 0x7d, + 0xd7, 0x5c, 0x58, 0x4a, 0xc9, 0xca, 0xab, 0x50, 0x33, 0x13, 0x7d, 0x41, 0x9e, 0xb0, 0x13, 0x0c, + 0xe6, 0xb2, 0xa7, 0x87, 0x3a, 0x8f, 0x3f, 0xa2, 0xf1, 0xd4, 0x54, 0xcc, 0xb2, 0x67, 0x26, 0x6f, + 0x2c, 0xbe, 0x56, 0xea, 0xbf, 0x0b, 0xad, 0x03, 0x49, 0x79, 0xb6, 0xcd, 0x32, 0x5d, 0xbf, 0xb0, + 0x12, 0x8c, 0x1e, 0x0c, 0x6c, 0x8d, 0xa9, 0x7a, 0x76, 0xa6, 0xf1, 0x51, 0x3c, 0xd1, 0xb8, 0x29, + 0x79, 0x76, 0xa6, 0x71, 0x29, 0x1e, 0x6b, 0xbc, 0x6c, 0x70, 0x33, 0xeb, 0xff, 0x5f, 0x09, 0x9c, + 0xcd, 0x78, 0x82, 0x6b, 0x6b, 0x0b, 0x5e, 0x9c, 0x5b, 0x70, 0xd9, 0x74, 0x6a, 0x73, 0xa2, 0x35, + 0xc2, 0x5e, 0xb9, 0x4b, 0xc9, 0xca, 0x9d, 0xf3, 0x4c, 0xa9, 0x1a, 0x53, 0x9e, 0x2f, 0x9a, 0xe2, + 0x6c, 0x2c, 0x99, 0x1b, 0x65, 0xc1, 0x84, 0xa2, 0x75, 0x3b, 0x40, 0xf2, 0xef, 0x1c, 0x32, 0xb9, + 0x29, 0xc4, 0x24, 0xe2, 0x63, 0xb2, 0x01, 0x8d, 0x84, 0xa6, 0x69, 0xc4, 0xc7, 0x99, 0x55, 0xc9, + 0x3d, 0xab, 0x92, 0xd5, 0x65, 0xc6, 0xd7, 0xff, 0x6c, 0x11, 0x5c, 0x8c, 0xe9, 0x2d, 0xbc, 0x49, + 0x1a, 0xed, 0xce, 0x7d, 0x0b, 0xb8, 0x08, 0x35, 0x35, 0x8a, 0xe7, 0x15, 0xaf, 0xaa, 0x46, 0xf1, + 0x13, 0xf7, 0xb2, 0xf2, 0xd9, 0x7b, 0xd9, 0x7f, 0x40, 0x23, 0x53, 0x54, 0x2a, 0x1f, 0x9b, 0xc2, + 0xaf, 0x6c, 0x7d, 0xad, 0x5e, 0x75, 0xe4, 0x3d, 0xc8, 0x74, 0x5f, 0x30, 0x3f, 0xd4, 0x59, 0xaf, + 0xba, 0x5a, 0x5e, 0x6b, 0x79, 0x90, 0xe4, 0xa7, 0x39, 0xc3, 0x9b, 0xb4, 0x64, 0x54, 0xe5, 0x1c, + 0x35, 0xe4, 0x70, 0x2c, 0x86, 0x2c, 0x2f, 0x43, 0x7d, 0x64, 0x3c, 0x63, 0xeb, 0xd4, 0xe9, 0x0d, + 0x9a, 0x3b, 0xce, 0xcb, 0xf9, 0xf4, 0x67, 0xed, 0x50, 0xdf, 0xd1, 0x31, 0x55, 0x34, 0x3d, 0xb0, + 0xd0, 0x5d, 0x11, 0xe8, 0x7d, 0x63, 0x52, 0x62, 0x46, 0x68, 0x7a, 0x7a, 0xa8, 0x43, 0x30, 0x66, + 0x8f, 0x58, 0x8c, 0xa7, 0xbf, 0xea, 0x99, 0x49, 0xff, 0xfb, 0x8b, 0xd0, 0x41, 0xb7, 0x1e, 0xd0, + 0x6c, 0xf2, 0x4f, 0x77, 0x6a, 0xe1, 0x1d, 0xa5, 0x72, 0xea, 0x1d, 0xa5, 0x0f, 0x6d, 0x25, 0x6c, + 0xea, 0x2a, 0x38, 0xce, 0x51, 0x02, 0x95, 0x41, 0xb7, 0xac, 0xc3, 0x32, 0xcb, 0x54, 0x94, 0xa0, + 0xef, 0x12, 0x96, 0xf8, 0xd3, 0x8c, 0x8e, 0x4d, 0x37, 0x50, 0xf1, 0x96, 0x66, 0xa4, 0x5d, 0x96, + 0xdc, 0xd7, 0x04, 0xad, 0x0b, 0x0d, 0x02, 0x31, 0xe5, 0x4a, 0xab, 0x69, 0xf2, 0x6b, 0xd3, 0x22, + 0xe6, 0x4d, 0x67, 0x9a, 0x31, 0xa9, 0x69, 0x0d, 0xa4, 0xd5, 0xf4, 0xd4, 0x10, 0xa4, 0x30, 0xad, + 0x93, 0xb9, 0x04, 0xd7, 0xf4, 0x74, 0x10, 0xf6, 0xef, 0x41, 0x67, 0x7e, 0xab, 0xc4, 0x67, 0x91, + 0x15, 0x68, 0xdc, 0x3d, 0xfd, 0x24, 0x32, 0x9b, 0xeb, 0x94, 0xa7, 0xe4, 0x94, 0x07, 0x54, 0xb1, + 0xbb, 0x19, 0xb7, 0x6e, 0x2a, 0x42, 0xd7, 0xbf, 0x5b, 0x86, 0xda, 0x30, 0xdd, 0x12, 0x21, 0x23, + 0x75, 0x28, 0xdf, 0x13, 0xa9, 0xbb, 0x40, 0x96, 0xa0, 0x35, 0x4c, 0xef, 0x30, 0x65, 0x1f, 0x5f, + 0xdc, 0x3f, 0xd6, 0x89, 0x0b, 0xce, 0x30, 0xdd, 0x93, 0x36, 0xd0, 0xdd, 0x3f, 0xd5, 0x89, 0xa3, + 0xe5, 0xf6, 0x22, 0x3e, 0x76, 0x3f, 0xed, 0x92, 0x16, 0xd4, 0x87, 0xe9, 0xed, 0x78, 0x9a, 0x1d, + 0xb9, 0x3f, 0xee, 0x1a, 0xf9, 0xb9, 0x96, 0xee, 0x4f, 0xba, 0xa4, 0x03, 0xcd, 0x61, 0x3a, 0xe0, + 0x59, 0xaa, 0x2f, 0xc7, 0x9f, 0x75, 0xc9, 0x05, 0xe8, 0x0e, 0xd3, 0x5b, 0x61, 0x78, 0x9b, 0x4e, + 0x63, 0xb5, 0x87, 0x5c, 0x3f, 0xed, 0x92, 0x36, 0x34, 0x86, 0xe9, 0x26, 0x0d, 0x26, 0xd3, 0xd4, + 0xfd, 0x59, 0xd7, 0x7c, 0xf4, 0x40, 0xd2, 0x80, 0xed, 0xa7, 0x94, 0xbb, 0x3f, 0xef, 0x92, 0x65, + 0xe8, 0x0c, 0xd3, 0x7d, 0x25, 0x24, 0x1d, 0x33, 0x74, 0xb0, 0xfb, 0x8b, 0x2e, 0xb9, 0x0c, 0x64, + 0x98, 0xde, 0x89, 0xc5, 0x88, 0xc6, 0x85, 0x8f, 0xfe, 0xb2, 0x4b, 0x2e, 0xc1, 0x92, 0xfe, 0xa8, + 0x62, 0x32, 0x60, 0xa9, 0xb2, 0xaa, 0xff, 0xaa, 0x4b, 0x08, 0xb4, 0xb5, 0xc9, 0x7a, 0x8a, 0x3b, + 0xeb, 0xfe, 0xda, 0xf2, 0x6e, 0x47, 0xd9, 0x44, 0xff, 0xb6, 0x62, 0x46, 0x39, 0x93, 0xee, 0x6f, + 0xac, 0x4a, 0x1e, 0xa3, 0x21, 0x93, 0xee, 0x6f, 0xbb, 0x64, 0x05, 0x2e, 0x1a, 0xd7, 0x50, 0xc5, + 0x32, 0x55, 0xf8, 0xdc, 0xe7, 0xb9, 0x72, 0x9c, 0xa6, 0xd9, 0x91, 0x50, 0x5a, 0xc4, 0xfd, 0xdd, + 0x5c, 0xc0, 0xd6, 0x7a, 0xac, 0x21, 0x77, 0xa3, 0x4c, 0xb9, 0x5f, 0x58, 0x3d, 0xd0, 0x03, 0x03, + 0x8e, 0xaf, 0x06, 0xbf, 0xef, 0x5e, 0xff, 0xb4, 0x04, 0xcd, 0x59, 0xd3, 0x4b, 0x1c, 0xa8, 0x0f, + 0xf8, 0x23, 0x1a, 0x47, 0xa1, 0xbb, 0x40, 0xda, 0xd0, 0x9c, 0xb5, 0xb6, 0x6e, 0x09, 0x5f, 0x21, + 0x66, 0xfd, 0xa9, 0xbb, 0x48, 0xba, 0xe0, 0x14, 0xda, 0x4f, 0xf3, 0x72, 0x71, 0xbf, 0xd8, 0x41, + 0xba, 0x15, 0x72, 0x01, 0xdc, 0x1c, 0xca, 0xfb, 0x44, 0xb7, 0x4a, 0x5c, 0x68, 0xdd, 0x2f, 0x74, + 0x7b, 0x6e, 0x4d, 0x23, 0xb7, 0xc2, 0x70, 0x2f, 0x7f, 0x94, 0x74, 0x75, 0x00, 0xb4, 0x66, 0x0d, + 0x9e, 0xfe, 0x5e, 0x43, 0x7f, 0x7f, 0xde, 0xb6, 0xb9, 0x4d, 0x72, 0x19, 0x96, 0xef, 0x3f, 0xd9, + 0x6d, 0xb9, 0x70, 0xfd, 0x0e, 0x34, 0x67, 0xad, 0x02, 0x69, 0x40, 0x45, 0xd3, 0x8d, 0x39, 0xf7, + 0x84, 0x79, 0x53, 0xc9, 0xdc, 0x12, 0x69, 0x41, 0x63, 0x33, 0x1a, 0x1b, 0xdd, 0x17, 0xc9, 0x32, + 0x74, 0xb7, 0x04, 0x57, 0x11, 0x9f, 0x8a, 0x69, 0x86, 0x2f, 0x74, 0x6e, 0x79, 0xf3, 0xbf, 0x3f, + 0xf9, 0xf2, 0x4a, 0xe9, 0xd3, 0x2f, 0xaf, 0x94, 0xbe, 0xf8, 0xf2, 0xca, 0xc2, 0x87, 0x7f, 0xb8, + 0x52, 0x7a, 0xff, 0xdf, 0x0b, 0x6f, 0xff, 0x09, 0x55, 0x32, 0x3a, 0x16, 0x32, 0x1a, 0x47, 0x3c, + 0x9f, 0x70, 0x76, 0x23, 0x9d, 0x8c, 0x6f, 0xa4, 0xa3, 0x1b, 0x34, 0x8d, 0x46, 0x35, 0x7c, 0xe4, + 0x7f, 0xe5, 0xaf, 0x01, 0x00, 0x00, 0xff, 0xff, 0xf8, 0x46, 0x76, 0xdb, 0x42, 0x18, 0x00, 0x00, } func (m *TNPingRequest) Marshal() (dAtA []byte, err error) { @@ -3146,6 +3262,21 @@ func (m *Entry) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } + if m.AutoIncrEpochKnown { + i-- + if m.AutoIncrEpochKnown { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x50 + } + if m.AutoIncrEpoch != 0 { + i = encodeVarintApi(dAtA, i, uint64(m.AutoIncrEpoch)) + i-- + dAtA[i] = 0x48 + } if m.PkCheckByTn != 0 { i = encodeVarintApi(dAtA, i, uint64(m.PkCheckByTn)) i-- @@ -3731,6 +3862,43 @@ func (m *AlterTableDropColumn) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } +func (m *AlterTableAutoIncrement) Marshal() (dAtA []byte, err error) { + size := m.ProtoSize() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *AlterTableAutoIncrement) MarshalTo(dAtA []byte) (int, error) { + size := m.ProtoSize() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *AlterTableAutoIncrement) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } + if m.Epoch != 0 { + i = encodeVarintApi(dAtA, i, uint64(m.Epoch)) + i-- + dAtA[i] = 0x10 + } + if m.Offset != 0 { + i = encodeVarintApi(dAtA, i, uint64(m.Offset)) + i-- + dAtA[i] = 0x8 + } + return len(dAtA) - i, nil +} + func (m *AlterTableReq) Marshal() (dAtA []byte, err error) { size := m.ProtoSize() dAtA = make([]byte, size) @@ -3950,6 +4118,27 @@ func (m *AlterTableReq_ReplaceDef) MarshalToSizedBuffer(dAtA []byte) (int, error } return len(dAtA) - i, nil } +func (m *AlterTableReq_UpdateAutoIncrement) MarshalTo(dAtA []byte) (int, error) { + size := m.ProtoSize() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *AlterTableReq_UpdateAutoIncrement) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + if m.UpdateAutoIncrement != nil { + { + size, err := m.UpdateAutoIncrement.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintApi(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x6a + } + return len(dAtA) - i, nil +} func (m *SchemaExtra) Marshal() (dAtA []byte, err error) { size := m.ProtoSize() dAtA = make([]byte, size) @@ -3974,6 +4163,20 @@ func (m *SchemaExtra) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } + if m.AutoIncrEpoch != 0 { + i = encodeVarintApi(dAtA, i, uint64(m.AutoIncrEpoch)) + i-- + dAtA[i] = 0x1 + i-- + dAtA[i] = 0x88 + } + if m.AutoIncrOffset != 0 { + i = encodeVarintApi(dAtA, i, uint64(m.AutoIncrOffset)) + i-- + dAtA[i] = 0x1 + i-- + dAtA[i] = 0x80 + } if m.FromPublication { i-- if m.FromPublication { @@ -3990,20 +4193,20 @@ func (m *SchemaExtra) MarshalToSizedBuffer(dAtA []byte) (int, error) { dAtA[i] = 0x70 } if len(m.IndexTables) > 0 { - dAtA28 := make([]byte, len(m.IndexTables)*10) - var j27 int + dAtA29 := make([]byte, len(m.IndexTables)*10) + var j28 int for _, num := range m.IndexTables { for num >= 1<<7 { - dAtA28[j27] = uint8(uint64(num)&0x7f | 0x80) + dAtA29[j28] = uint8(uint64(num)&0x7f | 0x80) num >>= 7 - j27++ + j28++ } - dAtA28[j27] = uint8(num) - j27++ + dAtA29[j28] = uint8(num) + j28++ } - i -= j27 - copy(dAtA[i:], dAtA28[:j27]) - i = encodeVarintApi(dAtA, i, uint64(j27)) + i -= j28 + copy(dAtA[i:], dAtA29[:j28]) + i = encodeVarintApi(dAtA, i, uint64(j28)) i-- dAtA[i] = 0x6a } @@ -4028,20 +4231,20 @@ func (m *SchemaExtra) MarshalToSizedBuffer(dAtA []byte) (int, error) { dAtA[i] = 0x48 } if len(m.Hints) > 0 { - dAtA30 := make([]byte, len(m.Hints)*10) - var j29 int + dAtA31 := make([]byte, len(m.Hints)*10) + var j30 int for _, num := range m.Hints { for num >= 1<<7 { - dAtA30[j29] = uint8(uint64(num)&0x7f | 0x80) + dAtA31[j30] = uint8(uint64(num)&0x7f | 0x80) num >>= 7 - j29++ + j30++ } - dAtA30[j29] = uint8(num) - j29++ + dAtA31[j30] = uint8(num) + j30++ } - i -= j29 - copy(dAtA[i:], dAtA30[:j29]) - i = encodeVarintApi(dAtA, i, uint64(j29)) + i -= j30 + copy(dAtA[i:], dAtA31[:j30]) + i = encodeVarintApi(dAtA, i, uint64(j30)) i-- dAtA[i] = 0x42 } @@ -4760,6 +4963,12 @@ func (m *Entry) ProtoSize() (n int) { if m.PkCheckByTn != 0 { n += 1 + sovApi(uint64(m.PkCheckByTn)) } + if m.AutoIncrEpoch != 0 { + n += 1 + sovApi(uint64(m.AutoIncrEpoch)) + } + if m.AutoIncrEpochKnown { + n += 2 + } if m.XXX_unrecognized != nil { n += len(m.XXX_unrecognized) } @@ -4997,6 +5206,24 @@ func (m *AlterTableDropColumn) ProtoSize() (n int) { return n } +func (m *AlterTableAutoIncrement) ProtoSize() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Offset != 0 { + n += 1 + sovApi(uint64(m.Offset)) + } + if m.Epoch != 0 { + n += 1 + sovApi(uint64(m.Epoch)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + func (m *AlterTableReq) ProtoSize() (n int) { if m == nil { return 0 @@ -5117,6 +5344,18 @@ func (m *AlterTableReq_ReplaceDef) ProtoSize() (n int) { } return n } +func (m *AlterTableReq_UpdateAutoIncrement) ProtoSize() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.UpdateAutoIncrement != nil { + l = m.UpdateAutoIncrement.ProtoSize() + n += 1 + l + sovApi(uint64(l)) + } + return n +} func (m *SchemaExtra) ProtoSize() (n int) { if m == nil { return 0 @@ -5180,6 +5419,12 @@ func (m *SchemaExtra) ProtoSize() (n int) { if m.FromPublication { n += 2 } + if m.AutoIncrOffset != 0 { + n += 2 + sovApi(uint64(m.AutoIncrOffset)) + } + if m.AutoIncrEpoch != 0 { + n += 2 + sovApi(uint64(m.AutoIncrEpoch)) + } if m.XXX_unrecognized != nil { n += len(m.XXX_unrecognized) } @@ -6928,6 +7173,45 @@ func (m *Entry) Unmarshal(dAtA []byte) error { break } } + case 9: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field AutoIncrEpoch", wireType) + } + m.AutoIncrEpoch = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowApi + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.AutoIncrEpoch |= uint32(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 10: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field AutoIncrEpochKnown", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowApi + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.AutoIncrEpochKnown = bool(v != 0) default: iNdEx = preIndex skippy, err := skipApi(dAtA[iNdEx:]) @@ -8322,6 +8606,95 @@ func (m *AlterTableDropColumn) Unmarshal(dAtA []byte) error { } return nil } +func (m *AlterTableAutoIncrement) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowApi + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: AlterTableAutoIncrement: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: AlterTableAutoIncrement: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Offset", wireType) + } + m.Offset = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowApi + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Offset |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Epoch", wireType) + } + m.Epoch = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowApi + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Epoch |= uint32(b&0x7F) << shift + if b < 0x80 { + break + } + } + default: + iNdEx = preIndex + skippy, err := skipApi(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthApi + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func (m *AlterTableReq) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 @@ -8688,6 +9061,41 @@ func (m *AlterTableReq) Unmarshal(dAtA []byte) error { } m.Operation = &AlterTableReq_ReplaceDef{v} iNdEx = postIndex + case 13: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field UpdateAutoIncrement", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowApi + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthApi + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthApi + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + v := &AlterTableAutoIncrement{} + if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + m.Operation = &AlterTableReq_UpdateAutoIncrement{v} + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipApi(dAtA[iNdEx:]) @@ -9159,6 +9567,44 @@ func (m *SchemaExtra) Unmarshal(dAtA []byte) error { } } m.FromPublication = bool(v != 0) + case 16: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field AutoIncrOffset", wireType) + } + m.AutoIncrOffset = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowApi + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.AutoIncrOffset |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 17: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field AutoIncrEpoch", wireType) + } + m.AutoIncrEpoch = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowApi + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.AutoIncrEpoch |= uint32(b&0x7F) << shift + if b < 0x80 { + break + } + } default: iNdEx = preIndex skippy, err := skipApi(dAtA[iNdEx:]) diff --git a/pkg/pb/pipeline/pipeline.pb.go b/pkg/pb/pipeline/pipeline.pb.go index a39724262cfaf..37b297535ee78 100644 --- a/pkg/pb/pipeline/pipeline.pb.go +++ b/pkg/pb/pipeline/pipeline.pb.go @@ -243,7 +243,7 @@ type Message struct { } func (m *Message) Reset() { *m = Message{} } -func (m *Message) String() string { return messageString(m) } +func (m *Message) String() string { return proto.CompactTextString(m) } func (*Message) ProtoMessage() {} func (*Message) Descriptor() ([]byte, []int) { return fileDescriptor_7ac67a7adf3df9c7, []int{0} @@ -3226,7 +3226,7 @@ type IcebergDataFileTask struct { } func (m *IcebergDataFileTask) Reset() { *m = IcebergDataFileTask{} } -func (m *IcebergDataFileTask) String() string { return icebergDataFileTaskString(m) } +func (m *IcebergDataFileTask) String() string { return proto.CompactTextString(m) } func (*IcebergDataFileTask) ProtoMessage() {} func (*IcebergDataFileTask) Descriptor() ([]byte, []int) { return fileDescriptor_7ac67a7adf3df9c7, []int{32} @@ -3371,7 +3371,7 @@ type IcebergDeleteFileTask struct { } func (m *IcebergDeleteFileTask) Reset() { *m = IcebergDeleteFileTask{} } -func (m *IcebergDeleteFileTask) String() string { return icebergDeleteFileTaskString(m) } +func (m *IcebergDeleteFileTask) String() string { return proto.CompactTextString(m) } func (*IcebergDeleteFileTask) ProtoMessage() {} func (*IcebergDeleteFileTask) Descriptor() ([]byte, []int) { return fileDescriptor_7ac67a7adf3df9c7, []int{33} @@ -3822,7 +3822,7 @@ type ExternalScan struct { } func (m *ExternalScan) Reset() { *m = ExternalScan{} } -func (m *ExternalScan) String() string { return externalScanString(m) } +func (m *ExternalScan) String() string { return proto.CompactTextString(m) } func (*ExternalScan) ProtoMessage() {} func (*ExternalScan) Descriptor() ([]byte, []int) { return fileDescriptor_7ac67a7adf3df9c7, []int{37} @@ -4586,7 +4586,7 @@ type Instruction struct { } func (m *Instruction) Reset() { *m = Instruction{} } -func (m *Instruction) String() string { return instructionString(m) } +func (m *Instruction) String() string { return proto.CompactTextString(m) } func (*Instruction) ProtoMessage() {} func (*Instruction) Descriptor() ([]byte, []int) { return fileDescriptor_7ac67a7adf3df9c7, []int{45} @@ -5720,7 +5720,7 @@ type Pipeline struct { } func (m *Pipeline) Reset() { *m = Pipeline{} } -func (m *Pipeline) String() string { return pipelineString(m) } +func (m *Pipeline) String() string { return proto.CompactTextString(m) } func (*Pipeline) ProtoMessage() {} func (*Pipeline) Descriptor() ([]byte, []int) { return fileDescriptor_7ac67a7adf3df9c7, []int{54} diff --git a/pkg/pb/plan/plan.pb.go b/pkg/pb/plan/plan.pb.go index 87a9d46550ce8..77ca6e93d9cbc 100644 --- a/pkg/pb/plan/plan.pb.go +++ b/pkg/pb/plan/plan.pb.go @@ -4458,21 +4458,23 @@ type TableDef struct { // XXX: Deprecated and to be removed soon. Defs []*TableDef_DefType `protobuf:"bytes,25,rep,name=defs,proto3" json:"defs,omitempty"` // letter case: lower - Name2ColIndex map[string]int32 `protobuf:"bytes,26,rep,name=name2col_index,json=name2colIndex,proto3" json:"name2col_index,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"varint,2,opt,name=value,proto3"` - IsLocked bool `protobuf:"varint,27,opt,name=isLocked,proto3" json:"isLocked,omitempty"` - TableLockType TableLockType `protobuf:"varint,28,opt,name=tableLockType,proto3,enum=plan.TableLockType" json:"tableLockType,omitempty"` - IsTemporary bool `protobuf:"varint,29,opt,name=is_temporary,json=isTemporary,proto3" json:"is_temporary,omitempty"` - AutoIncrOffset uint64 `protobuf:"varint,30,opt,name=auto_incr_offset,json=autoIncrOffset,proto3" json:"auto_incr_offset,omitempty"` - IsDynamic bool `protobuf:"varint,31,opt,name=is_dynamic,json=isDynamic,proto3" json:"is_dynamic,omitempty"` - DbName string `protobuf:"bytes,32,opt,name=db_name,json=dbName,proto3" json:"db_name,omitempty"` - DbId uint64 `protobuf:"varint,33,opt,name=db_id,json=dbId,proto3" json:"db_id,omitempty"` - Partition *Partition `protobuf:"bytes,34,opt,name=partition,proto3" json:"partition,omitempty"` - FeatureFlag uint64 `protobuf:"varint,35,opt,name=FeatureFlag,proto3" json:"FeatureFlag,omitempty"` - LogicalId uint64 `protobuf:"varint,36,opt,name=logical_id,json=logicalId,proto3" json:"logical_id,omitempty"` - OriginalName string `protobuf:"bytes,37,opt,name=original_name,json=originalName,proto3" json:"original_name,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + Name2ColIndex map[string]int32 `protobuf:"bytes,26,rep,name=name2col_index,json=name2colIndex,proto3" json:"name2col_index,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"varint,2,opt,name=value,proto3"` + IsLocked bool `protobuf:"varint,27,opt,name=isLocked,proto3" json:"isLocked,omitempty"` + TableLockType TableLockType `protobuf:"varint,28,opt,name=tableLockType,proto3,enum=plan.TableLockType" json:"tableLockType,omitempty"` + IsTemporary bool `protobuf:"varint,29,opt,name=is_temporary,json=isTemporary,proto3" json:"is_temporary,omitempty"` + AutoIncrOffset uint64 `protobuf:"varint,30,opt,name=auto_incr_offset,json=autoIncrOffset,proto3" json:"auto_incr_offset,omitempty"` + IsDynamic bool `protobuf:"varint,31,opt,name=is_dynamic,json=isDynamic,proto3" json:"is_dynamic,omitempty"` + DbName string `protobuf:"bytes,32,opt,name=db_name,json=dbName,proto3" json:"db_name,omitempty"` + DbId uint64 `protobuf:"varint,33,opt,name=db_id,json=dbId,proto3" json:"db_id,omitempty"` + Partition *Partition `protobuf:"bytes,34,opt,name=partition,proto3" json:"partition,omitempty"` + FeatureFlag uint64 `protobuf:"varint,35,opt,name=FeatureFlag,proto3" json:"FeatureFlag,omitempty"` + LogicalId uint64 `protobuf:"varint,36,opt,name=logical_id,json=logicalId,proto3" json:"logical_id,omitempty"` + OriginalName string `protobuf:"bytes,37,opt,name=original_name,json=originalName,proto3" json:"original_name,omitempty"` + // Persistent cache epoch for AUTO_INCREMENT allocation. + AutoIncrEpoch uint32 `protobuf:"varint,38,opt,name=auto_incr_epoch,json=autoIncrEpoch,proto3" json:"auto_incr_epoch,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } func (m *TableDef) Reset() { *m = TableDef{} } @@ -4711,6 +4713,13 @@ func (m *TableDef) GetOriginalName() string { return "" } +func (m *TableDef) GetAutoIncrEpoch() uint32 { + if m != nil { + return m.AutoIncrEpoch + } + return 0 +} + // XXX: Deprecated and to be removed soon. type TableDef_DefType struct { // Types that are valid to be assigned to Def: @@ -13878,843 +13887,845 @@ func init() { func init() { proto.RegisterFile("plan.proto", fileDescriptor_2d655ab2f7683c23) } var fileDescriptor_2d655ab2f7683c23 = []byte{ - // 13374 bytes of a gzipped FileDescriptorProto + // 13393 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0xbd, 0x5b, 0x8c, 0x23, 0x47, 0x96, 0x18, 0x5a, 0x2c, 0xbe, 0x0f, 0x1f, 0x95, 0x15, 0xfd, 0x62, 0xb7, 0x5a, 0xdd, 0xa5, 0xec, 0x56, 0xab, 0xd4, 0x92, 0x5a, 0x52, 0xb7, 0x9e, 0xb3, 0xb3, 0x3b, 0xc3, 0x22, 0x59, 0x5d, 0x94, 0x58, 0x64, 0x4d, 0x92, 0xd5, 0x2d, 0xcd, 0xde, 0x45, 0x22, 0x8b, 0x99, 0xac, 0x4a, 0x55, 0x32, 0x93, 0xca, 0x4c, 0x76, 0x55, 0x0d, 0xb0, 0xb8, 0x83, 0xfb, 0xb1, 0x8f, 0x8b, 0xfb, 0x77, 0xe1, 0xf5, 0xd7, 0xc2, 0x6b, 0x03, 0x86, 0x01, 0xc3, 0x86, 0x61, 0x63, 0x80, 0xf5, 0xfe, 0x79, 0xe1, - 0x9f, 0x35, 0x6c, 0xaf, 0x0d, 0x1b, 0xf6, 0x62, 0x6d, 0x60, 0x6d, 0x8f, 0xbf, 0x0d, 0x1b, 0xb0, - 0xff, 0xfc, 0x61, 0xe3, 0x9c, 0x88, 0xcc, 0x8c, 0x24, 0xd9, 0xdd, 0x92, 0x66, 0x16, 0xf0, 0x4f, - 0x15, 0xe3, 0x3c, 0xe2, 0x1d, 0x27, 0xce, 0x39, 0x71, 0x22, 0x12, 0x60, 0xe6, 0x18, 0xee, 0x83, - 0x99, 0xef, 0x85, 0x1e, 0xcb, 0xe1, 0xef, 0x1b, 0xef, 0x1c, 0xdb, 0xe1, 0xc9, 0xfc, 0xe8, 0xc1, - 0xd8, 0x9b, 0xbe, 0x7b, 0xec, 0x1d, 0x7b, 0xef, 0x12, 0xf2, 0x68, 0x3e, 0xa1, 0x14, 0x25, 0xe8, - 0x17, 0x67, 0xba, 0x01, 0x8e, 0x37, 0x3e, 0x15, 0xbf, 0x37, 0x42, 0x7b, 0x6a, 0x05, 0xa1, 0x31, - 0x9d, 0x71, 0x80, 0xfa, 0x87, 0x19, 0xc8, 0x8d, 0x2e, 0x66, 0x16, 0xab, 0xc3, 0xba, 0x6d, 0x36, - 0x32, 0x5b, 0x99, 0xed, 0xbc, 0xb6, 0x6e, 0x9b, 0x6c, 0x0b, 0x2a, 0xae, 0x17, 0xf6, 0xe7, 0x8e, - 0x63, 0x1c, 0x39, 0x56, 0x63, 0x7d, 0x2b, 0xb3, 0x5d, 0xd2, 0x64, 0x10, 0x7b, 0x05, 0xca, 0xc6, - 0x3c, 0xf4, 0x74, 0xdb, 0x1d, 0xfb, 0x8d, 0x2c, 0xe1, 0x4b, 0x08, 0xe8, 0xba, 0x63, 0x9f, 0x5d, - 0x86, 0xfc, 0x99, 0x6d, 0x86, 0x27, 0x8d, 0x1c, 0xe5, 0xc8, 0x13, 0x08, 0x0d, 0xc6, 0x86, 0x63, - 0x35, 0xf2, 0x1c, 0x4a, 0x09, 0x84, 0x86, 0x54, 0x48, 0x61, 0x2b, 0xb3, 0x5d, 0xd6, 0x78, 0x82, - 0xdd, 0x02, 0xb0, 0xdc, 0xf9, 0xf4, 0x99, 0xe1, 0xcc, 0xad, 0xa0, 0x51, 0x24, 0x94, 0x04, 0x51, - 0x7f, 0x00, 0xe5, 0x69, 0x70, 0xbc, 0x67, 0x19, 0xa6, 0xe5, 0xb3, 0x6b, 0x50, 0x9c, 0x06, 0xc7, - 0x7a, 0x68, 0x1c, 0x8b, 0x26, 0x14, 0xa6, 0xc1, 0xf1, 0xc8, 0x38, 0x66, 0xd7, 0xa1, 0x44, 0x88, - 0x8b, 0x19, 0x6f, 0x43, 0x5e, 0x43, 0x42, 0x6c, 0xb1, 0xfa, 0xbb, 0x05, 0x28, 0xf6, 0xec, 0xd0, - 0xf2, 0x0d, 0x87, 0x5d, 0x85, 0x82, 0x1d, 0xb8, 0x73, 0xc7, 0x21, 0xf6, 0x92, 0x26, 0x52, 0xec, - 0x2a, 0xe4, 0xed, 0x4f, 0x9e, 0x19, 0x0e, 0xe7, 0xdd, 0x5b, 0xd3, 0x78, 0x92, 0x35, 0xa0, 0x60, - 0xbf, 0xff, 0x11, 0x22, 0xb2, 0x02, 0x21, 0xd2, 0x84, 0x79, 0xf4, 0x10, 0x31, 0xb9, 0x18, 0x43, - 0x69, 0xc2, 0x7c, 0xf4, 0x01, 0x62, 0xb0, 0xf5, 0x59, 0xc2, 0x50, 0x1a, 0x4b, 0x99, 0x53, 0x29, - 0xd8, 0x01, 0x35, 0x2c, 0x65, 0x1e, 0x95, 0x32, 0xe7, 0xa5, 0x14, 0x05, 0x42, 0xa4, 0x09, 0xc3, - 0x4b, 0x29, 0xc5, 0x98, 0xb8, 0x94, 0x39, 0x2f, 0xa5, 0xbc, 0x95, 0xd9, 0xce, 0x11, 0x86, 0x97, - 0x72, 0x19, 0x72, 0x26, 0xc2, 0x61, 0x2b, 0xb3, 0x9d, 0xd9, 0x5b, 0xd3, 0x28, 0x85, 0xd0, 0x00, - 0xa1, 0x15, 0xec, 0x60, 0x84, 0x06, 0x02, 0x7a, 0x84, 0xd0, 0x2a, 0xf6, 0x06, 0x42, 0x8f, 0x04, - 0x74, 0x82, 0xd0, 0xda, 0x56, 0x66, 0x7b, 0x1d, 0xa1, 0x98, 0x62, 0x37, 0xa0, 0x68, 0x1a, 0xa1, - 0x85, 0x88, 0xba, 0x68, 0x72, 0x04, 0x40, 0x1c, 0xce, 0x38, 0xc4, 0x6d, 0x88, 0x46, 0x47, 0x00, - 0xa6, 0x42, 0x05, 0xc9, 0x22, 0xbc, 0x22, 0xf0, 0x32, 0x90, 0x7d, 0x08, 0x55, 0xd3, 0x1a, 0xdb, - 0x53, 0xc3, 0xe1, 0x6d, 0xda, 0xdc, 0xca, 0x6c, 0x57, 0x1e, 0x6e, 0x3c, 0xa0, 0x35, 0x11, 0x63, - 0xf6, 0xd6, 0xb4, 0x14, 0x19, 0xfb, 0x04, 0x6a, 0x22, 0xfd, 0xfe, 0x43, 0xea, 0x58, 0x46, 0x7c, - 0x4a, 0x8a, 0xef, 0xfd, 0x87, 0x9f, 0xec, 0xad, 0x69, 0x69, 0x42, 0x76, 0x17, 0xaa, 0xf1, 0x12, - 0x41, 0xc6, 0x4b, 0xa2, 0x56, 0x29, 0x28, 0x36, 0xeb, 0xab, 0xc0, 0x73, 0x91, 0xe0, 0xb2, 0xe8, - 0xb7, 0x08, 0xc0, 0xb6, 0x00, 0x4c, 0x6b, 0x62, 0xcc, 0x9d, 0x10, 0xd1, 0x57, 0x44, 0x07, 0x4a, - 0x30, 0x76, 0x0b, 0xca, 0xf3, 0x19, 0xb6, 0xf2, 0x89, 0xe1, 0x34, 0xae, 0x0a, 0x82, 0x04, 0x84, - 0xb9, 0xe3, 0x3c, 0x47, 0xec, 0x35, 0x31, 0xba, 0x11, 0x00, 0x87, 0xf7, 0x99, 0x35, 0x46, 0x54, - 0x43, 0x14, 0x2c, 0xd2, 0xb8, 0x8a, 0xec, 0x60, 0xc7, 0x76, 0x1b, 0xd7, 0x69, 0x06, 0xf3, 0x04, - 0xbb, 0x09, 0xd9, 0xc0, 0x1f, 0x37, 0x6e, 0x50, 0xfb, 0x81, 0xb7, 0xbf, 0x73, 0x3e, 0xf3, 0x35, - 0x04, 0xef, 0x14, 0x21, 0x4f, 0xab, 0x49, 0xbd, 0x09, 0xa5, 0x03, 0xc3, 0x37, 0xa6, 0x9a, 0x35, - 0x61, 0x0a, 0x64, 0x67, 0x5e, 0x20, 0xd6, 0x11, 0xfe, 0x54, 0x7b, 0x50, 0x78, 0x62, 0xf8, 0x88, - 0x63, 0x90, 0x73, 0x8d, 0xa9, 0x45, 0xc8, 0xb2, 0x46, 0xbf, 0x71, 0xed, 0x04, 0x17, 0x41, 0x68, - 0x4d, 0x85, 0x90, 0x10, 0x29, 0x84, 0x1f, 0x3b, 0xde, 0x91, 0x58, 0x23, 0x25, 0x4d, 0xa4, 0xd4, - 0xff, 0x27, 0x03, 0x85, 0x96, 0xe7, 0x60, 0x76, 0xd7, 0xa0, 0xe8, 0x5b, 0x8e, 0x9e, 0x14, 0x57, - 0xf0, 0x2d, 0xe7, 0xc0, 0x0b, 0x10, 0x31, 0xf6, 0x38, 0x82, 0xaf, 0xda, 0xc2, 0xd8, 0x23, 0x44, - 0x54, 0x81, 0xac, 0x54, 0x81, 0xeb, 0x50, 0x0a, 0x8f, 0x1c, 0x9d, 0xe0, 0x39, 0x82, 0x17, 0xc3, - 0x23, 0xa7, 0x8f, 0xa8, 0x6b, 0x50, 0x34, 0x8f, 0x38, 0x26, 0x4f, 0x98, 0x82, 0x79, 0x84, 0x08, - 0xf5, 0x53, 0x28, 0x6b, 0xc6, 0x99, 0xa8, 0xc6, 0x15, 0x28, 0x60, 0x06, 0x42, 0xfe, 0xe5, 0xb4, - 0x7c, 0x78, 0xe4, 0x74, 0x4d, 0x04, 0x63, 0x25, 0x6c, 0x93, 0xea, 0x90, 0xd3, 0xf2, 0x63, 0xcf, - 0xe9, 0x9a, 0xea, 0x08, 0xa0, 0xe5, 0xf9, 0xfe, 0x77, 0x6e, 0xc2, 0x65, 0xc8, 0x9b, 0xd6, 0x2c, - 0x3c, 0xe1, 0xa2, 0x43, 0xe3, 0x09, 0xf5, 0x3e, 0x94, 0x70, 0x5c, 0x7a, 0x76, 0x10, 0xb2, 0x5b, - 0x90, 0x73, 0xec, 0x20, 0x6c, 0x64, 0xb6, 0xb2, 0x0b, 0xa3, 0x46, 0x70, 0x75, 0x0b, 0x4a, 0xfb, - 0xc6, 0xf9, 0x13, 0x1c, 0x39, 0xcc, 0x8d, 0x86, 0x50, 0x0c, 0x89, 0x18, 0xcf, 0x2a, 0xc0, 0xc8, - 0xf0, 0x8f, 0xad, 0x90, 0x24, 0xdd, 0x7f, 0xcf, 0x40, 0x65, 0x38, 0x3f, 0xfa, 0x7a, 0x6e, 0xf9, - 0x17, 0x58, 0xe7, 0x6d, 0xc8, 0x86, 0x17, 0x33, 0xe2, 0xa8, 0x3f, 0xbc, 0xca, 0xb3, 0x97, 0xf0, - 0x0f, 0x90, 0x49, 0x43, 0x12, 0x6c, 0x84, 0xeb, 0x99, 0x56, 0xd4, 0x07, 0x79, 0xad, 0x80, 0xc9, - 0xae, 0x89, 0xdb, 0x85, 0x37, 0x13, 0xa3, 0xb0, 0xee, 0xcd, 0xd8, 0x16, 0xe4, 0xc7, 0x27, 0xb6, - 0x63, 0xd2, 0x00, 0xa4, 0xeb, 0xcc, 0x11, 0x38, 0x4a, 0xbe, 0x77, 0xa6, 0x07, 0xf6, 0x4f, 0x22, - 0xf1, 0x5f, 0xf4, 0xbd, 0xb3, 0xa1, 0xfd, 0x13, 0x4b, 0x1d, 0x89, 0x3d, 0x08, 0xa0, 0x30, 0x6c, - 0x35, 0x7b, 0x4d, 0x4d, 0x59, 0xc3, 0xdf, 0x9d, 0x2f, 0xba, 0xc3, 0xd1, 0x50, 0xc9, 0xb0, 0x3a, - 0x40, 0x7f, 0x30, 0xd2, 0x45, 0x7a, 0x9d, 0x15, 0x60, 0xbd, 0xdb, 0x57, 0xb2, 0x48, 0x83, 0xf0, - 0x6e, 0x5f, 0xc9, 0xb1, 0x22, 0x64, 0x9b, 0xfd, 0x2f, 0x95, 0x3c, 0xfd, 0xe8, 0xf5, 0x94, 0x82, - 0xfa, 0xa7, 0xeb, 0x50, 0x1e, 0x1c, 0x7d, 0x65, 0x8d, 0x43, 0x6c, 0x33, 0xce, 0x52, 0xcb, 0x7f, - 0x66, 0xf9, 0xd4, 0xec, 0xac, 0x26, 0x52, 0xd8, 0x10, 0xf3, 0x88, 0x1a, 0x97, 0xd5, 0xd6, 0xcd, - 0x23, 0xa2, 0x1b, 0x9f, 0x58, 0x53, 0x83, 0x1a, 0x87, 0x74, 0x94, 0xc2, 0x55, 0xe1, 0x1d, 0x7d, - 0x45, 0xcd, 0xcb, 0x6a, 0xf8, 0x93, 0xdd, 0x86, 0x0a, 0xcf, 0x43, 0x9e, 0x5f, 0xc0, 0x41, 0x8b, - 0x93, 0xaf, 0x20, 0x4f, 0x3e, 0xe2, 0xa4, 0x5c, 0x39, 0x52, 0xec, 0x6d, 0x1c, 0xd4, 0x17, 0x33, - 0xda, 0x3b, 0xfa, 0x8a, 0x63, 0x4b, 0x7c, 0x46, 0x7b, 0x47, 0x5f, 0x11, 0xea, 0x2d, 0xd8, 0x0c, - 0xe6, 0x47, 0xc1, 0xd8, 0xb7, 0x67, 0xa1, 0xed, 0xb9, 0x9c, 0xa6, 0x4c, 0x34, 0x8a, 0x8c, 0x20, - 0xe2, 0x6d, 0x28, 0xcd, 0xe6, 0x47, 0xba, 0xed, 0x4e, 0x3c, 0x12, 0xfb, 0x95, 0x87, 0x35, 0x3e, - 0x30, 0x07, 0xf3, 0xa3, 0xae, 0x3b, 0xf1, 0xb4, 0xe2, 0x8c, 0xff, 0x60, 0x2a, 0xd4, 0x5c, 0x2f, - 0xd4, 0x51, 0x55, 0xd0, 0xa7, 0x56, 0x68, 0xd0, 0x7e, 0xc0, 0x37, 0xfc, 0x9e, 0x37, 0x3e, 0xdd, - 0xb7, 0x42, 0x43, 0xbd, 0x07, 0x45, 0xc1, 0x87, 0x7b, 0x7f, 0x68, 0xb9, 0x86, 0x1b, 0xea, 0xb1, - 0xd2, 0x50, 0xe2, 0x80, 0xae, 0xa9, 0xfe, 0x2c, 0x03, 0xca, 0x50, 0xaa, 0x0a, 0x32, 0xaf, 0x94, - 0x1c, 0xaf, 0x02, 0x18, 0xe3, 0xb1, 0x37, 0xe7, 0xd9, 0xf0, 0x09, 0x56, 0x16, 0x90, 0xae, 0x29, - 0xf7, 0x5f, 0x36, 0xd5, 0x7f, 0xaf, 0x41, 0x35, 0xe2, 0x93, 0x16, 0x7d, 0x45, 0xc0, 0xa2, 0x1e, - 0x0c, 0xe6, 0xa9, 0x95, 0x5f, 0x0c, 0xe6, 0x9c, 0xfb, 0x2a, 0x14, 0x48, 0xc3, 0x08, 0xa2, 0x51, - 0xe1, 0x29, 0xf5, 0xcf, 0x32, 0x50, 0xeb, 0xba, 0xa6, 0x75, 0x3e, 0x1c, 0x1b, 0x6e, 0xd4, 0x29, - 0x76, 0xa0, 0xdb, 0x08, 0xd3, 0x83, 0xb1, 0xe1, 0x0a, 0xe5, 0xa0, 0x62, 0x07, 0x31, 0x1d, 0xb6, - 0x81, 0x13, 0x50, 0x51, 0xeb, 0x94, 0x63, 0x99, 0x20, 0x54, 0xd8, 0x3d, 0xd8, 0x38, 0xb2, 0x1c, - 0xcf, 0x3d, 0xd6, 0x43, 0x4f, 0xe7, 0x5a, 0x0e, 0x6f, 0x4b, 0x8d, 0x83, 0x47, 0xde, 0x88, 0xb4, - 0x9d, 0xcb, 0x90, 0x9f, 0x19, 0x7e, 0x18, 0x34, 0x72, 0x5b, 0x59, 0x5c, 0xc6, 0x94, 0xc0, 0x6e, - 0xb6, 0x03, 0x7d, 0xee, 0xda, 0x5f, 0xcf, 0x79, 0x33, 0x4a, 0x5a, 0xc9, 0x0e, 0x0e, 0x29, 0xcd, - 0xb6, 0x41, 0xe1, 0x25, 0x53, 0xb6, 0xf2, 0x3c, 0xab, 0x13, 0x9c, 0x32, 0x26, 0x61, 0xf7, 0xff, - 0xae, 0x43, 0x69, 0x77, 0xee, 0x8e, 0x71, 0x30, 0xd8, 0x1d, 0xc8, 0x4d, 0xe6, 0xee, 0x98, 0xda, - 0x12, 0x6f, 0xa5, 0xf1, 0x3a, 0xd1, 0x08, 0x89, 0x12, 0xc8, 0xf0, 0x8f, 0x51, 0x72, 0x2d, 0x49, - 0x20, 0x84, 0xab, 0xff, 0x30, 0xc3, 0x73, 0xdc, 0x75, 0x8c, 0x63, 0x56, 0x82, 0x5c, 0x7f, 0xd0, - 0xef, 0x28, 0x6b, 0xac, 0x0a, 0xa5, 0x6e, 0x7f, 0xd4, 0xd1, 0xfa, 0xcd, 0x9e, 0x92, 0xa1, 0xe5, - 0x3c, 0x6a, 0xee, 0xf4, 0x3a, 0xca, 0x3a, 0x62, 0x9e, 0x0c, 0x7a, 0xcd, 0x51, 0xb7, 0xd7, 0x51, - 0x72, 0x1c, 0xa3, 0x75, 0x5b, 0x23, 0xa5, 0xc4, 0x14, 0xa8, 0x1e, 0x68, 0x83, 0xf6, 0x61, 0xab, - 0xa3, 0xf7, 0x0f, 0x7b, 0x3d, 0x45, 0x61, 0x97, 0x60, 0x23, 0x86, 0x0c, 0x38, 0x70, 0x0b, 0x59, - 0x9e, 0x34, 0xb5, 0xa6, 0xf6, 0x58, 0xf9, 0x21, 0x2b, 0x41, 0xb6, 0xf9, 0xf8, 0xb1, 0xf2, 0x53, - 0x94, 0x0c, 0xe5, 0xa7, 0xdd, 0xbe, 0xfe, 0xa4, 0xd9, 0x3b, 0xec, 0x28, 0x3f, 0x5d, 0x8f, 0xd2, - 0x03, 0xad, 0xdd, 0xd1, 0x94, 0x9f, 0xe6, 0xd8, 0x26, 0x54, 0x7f, 0x3c, 0xe8, 0x77, 0xf6, 0x9b, - 0x07, 0x07, 0x54, 0x91, 0x9f, 0x96, 0xd4, 0xff, 0x92, 0x83, 0x1c, 0xb6, 0x84, 0xa9, 0x89, 0x14, - 0x8c, 0x9b, 0x88, 0x62, 0x68, 0x27, 0xf7, 0x27, 0x7f, 0x71, 0x7b, 0x8d, 0xcb, 0xbf, 0xd7, 0x20, - 0xeb, 0xd8, 0x21, 0x0d, 0x6b, 0xbc, 0x76, 0x84, 0xce, 0xb8, 0xb7, 0xa6, 0x21, 0x8e, 0xdd, 0x82, - 0x0c, 0x17, 0x84, 0x95, 0x87, 0x75, 0xb1, 0xb8, 0xc4, 0x4e, 0xba, 0xb7, 0xa6, 0x65, 0x66, 0xec, - 0x26, 0x64, 0x9e, 0x09, 0xa9, 0x58, 0xe5, 0x78, 0xbe, 0x97, 0x22, 0xf6, 0x19, 0xdb, 0x82, 0xec, - 0xd8, 0xe3, 0x1a, 0x61, 0x8c, 0xe7, 0x3b, 0x0b, 0xe6, 0x3f, 0xf6, 0x1c, 0x76, 0x07, 0xb2, 0xbe, - 0x71, 0x46, 0x23, 0x1b, 0x0f, 0x57, 0xbc, 0x75, 0x21, 0x91, 0x6f, 0x9c, 0x61, 0x25, 0x26, 0x24, - 0x47, 0xe2, 0x4a, 0x44, 0xe3, 0x8d, 0xc5, 0x4c, 0xd8, 0x16, 0x64, 0xce, 0x48, 0x92, 0xc4, 0x4a, - 0xd0, 0x53, 0xdb, 0x35, 0xbd, 0xb3, 0xe1, 0xcc, 0x1a, 0x23, 0xc5, 0x19, 0x7b, 0x1d, 0xb2, 0xc1, - 0xfc, 0x88, 0x24, 0x49, 0xe5, 0xe1, 0xe6, 0xd2, 0x9e, 0x80, 0x05, 0x05, 0xf3, 0x23, 0x76, 0x0f, - 0x72, 0x63, 0xcf, 0xf7, 0x85, 0x34, 0x51, 0xa2, 0x0a, 0x47, 0xdb, 0x21, 0x2a, 0x85, 0x88, 0xc7, - 0x02, 0x43, 0x92, 0x21, 0x31, 0x51, 0xb2, 0x1f, 0x61, 0x81, 0x21, 0xbb, 0x2b, 0x36, 0xb9, 0xaa, - 0x5c, 0xeb, 0x68, 0x0b, 0xc4, 0x7c, 0x10, 0x8b, 0x83, 0x34, 0x35, 0xce, 0x49, 0xe3, 0x8c, 0x89, - 0xa2, 0xbd, 0x0f, 0xeb, 0x34, 0x35, 0xce, 0xd9, 0x5d, 0xc8, 0x3e, 0xb3, 0xc6, 0xa4, 0x7c, 0xc6, - 0xa5, 0x89, 0x41, 0x7a, 0x42, 0xcd, 0x43, 0x34, 0xcd, 0x7b, 0xcf, 0x31, 0x49, 0x0f, 0x8d, 0xc7, - 0x72, 0xd7, 0x73, 0xcc, 0x27, 0x34, 0x96, 0x84, 0xc4, 0x2d, 0xdf, 0x98, 0x9f, 0xa3, 0x34, 0x52, - 0xf8, 0xe6, 0x6c, 0xcc, 0xcf, 0xbb, 0x26, 0x0a, 0x7f, 0xd7, 0x7c, 0x46, 0xda, 0x67, 0x46, 0xc3, - 0x9f, 0x68, 0x1e, 0x05, 0x96, 0x63, 0x8d, 0x43, 0xfb, 0x99, 0x1d, 0x5e, 0x90, 0x7e, 0x99, 0xd1, - 0x64, 0xd0, 0x4e, 0x01, 0x72, 0xd6, 0xf9, 0xcc, 0x57, 0xf7, 0xa0, 0x28, 0x4a, 0x59, 0xb2, 0xb1, - 0xae, 0x43, 0xc9, 0x0e, 0xf4, 0xb1, 0xe7, 0x06, 0xa1, 0xd0, 0x9d, 0x8a, 0x76, 0xd0, 0xc2, 0x24, - 0x8a, 0x4b, 0xd3, 0x08, 0xf9, 0x26, 0x54, 0xd5, 0xe8, 0xb7, 0xfa, 0x10, 0x20, 0x69, 0x16, 0xd6, - 0xc9, 0xb1, 0xdc, 0x48, 0x4d, 0x73, 0x2c, 0x37, 0xe6, 0x59, 0x97, 0x78, 0xae, 0x43, 0x39, 0xd6, - 0x8c, 0x59, 0x15, 0x32, 0x86, 0xd8, 0xfe, 0x32, 0x86, 0xba, 0x8d, 0x8a, 0x6a, 0xa4, 0xfb, 0xa6, - 0x71, 0x98, 0x8a, 0x36, 0xc5, 0xcc, 0x91, 0xfa, 0x7d, 0xa8, 0x6a, 0x56, 0x30, 0x77, 0xc2, 0x96, - 0xe7, 0xb4, 0xad, 0x09, 0x7b, 0x1b, 0x20, 0x4e, 0x07, 0x42, 0x4b, 0x49, 0xe6, 0x6e, 0xdb, 0x9a, - 0x68, 0x12, 0x5e, 0xfd, 0x4f, 0x39, 0xd2, 0xf7, 0xda, 0x5c, 0xd1, 0x12, 0x1a, 0x55, 0x46, 0xd2, - 0xa8, 0xe2, 0xbd, 0x61, 0x3d, 0xad, 0x55, 0x9e, 0xd8, 0xa6, 0x69, 0xb9, 0x91, 0xf6, 0xc8, 0x53, - 0x38, 0xd8, 0x86, 0x73, 0x4c, 0x0b, 0xaa, 0xfe, 0x90, 0x45, 0x85, 0x4e, 0x67, 0xbe, 0x15, 0x04, - 0x5c, 0x6f, 0x31, 0x9c, 0xe3, 0x68, 0x6d, 0xe7, 0x5f, 0xb4, 0xb6, 0xaf, 0x43, 0x09, 0xb7, 0x3c, - 0xb2, 0xfa, 0x0a, 0xbc, 0xf7, 0x85, 0x79, 0xcb, 0xde, 0x80, 0xa2, 0xd0, 0xd7, 0xc5, 0xa2, 0x12, - 0xd3, 0xa5, 0xcd, 0x81, 0x5a, 0x84, 0x65, 0x0d, 0x54, 0xf2, 0xa6, 0x53, 0xcb, 0x0d, 0xa3, 0x7d, - 0x5a, 0x24, 0xd9, 0x5b, 0x50, 0xf6, 0x5c, 0x9d, 0x2b, 0xf5, 0x62, 0x55, 0x89, 0xe9, 0x3b, 0x70, - 0x0f, 0x09, 0xaa, 0x95, 0x3c, 0xf1, 0x0b, 0xab, 0xe2, 0x78, 0x67, 0xfa, 0xd8, 0xf0, 0x4d, 0x5a, - 0x59, 0x25, 0xad, 0xe8, 0x78, 0x67, 0x2d, 0xc3, 0x37, 0xb9, 0xde, 0xf2, 0xb5, 0x3b, 0x9f, 0xd2, - 0x6a, 0xaa, 0x69, 0x22, 0xc5, 0x6e, 0x42, 0x79, 0xec, 0xcc, 0x83, 0xd0, 0xf2, 0x77, 0x2e, 0xb8, - 0x99, 0xa6, 0x25, 0x00, 0xac, 0xd7, 0xcc, 0xb7, 0xa7, 0x86, 0x7f, 0x41, 0x4b, 0xa7, 0xa4, 0x45, - 0x49, 0xda, 0x68, 0x4e, 0x6d, 0xf3, 0x9c, 0xdb, 0x6a, 0x1a, 0x4f, 0x20, 0xfd, 0x09, 0x59, 0xd2, - 0x01, 0xad, 0x8f, 0x92, 0x16, 0x25, 0x69, 0x1c, 0xe8, 0x27, 0xad, 0x88, 0xb2, 0x26, 0x52, 0x29, - 0xa5, 0x7b, 0xf3, 0xb9, 0x4a, 0x37, 0x5b, 0xd4, 0x7b, 0x3c, 0xdf, 0x3e, 0xb6, 0x85, 0xd6, 0x72, - 0x89, 0xeb, 0x3d, 0x1c, 0x44, 0x04, 0x1f, 0x43, 0xed, 0xd8, 0x72, 0x2d, 0xdf, 0x08, 0x2d, 0x53, - 0x47, 0xb9, 0x78, 0x99, 0x3a, 0x4e, 0x0c, 0xf3, 0xe3, 0x08, 0x85, 0xb2, 0xa6, 0x7a, 0x2c, 0xa5, - 0xd4, 0xaf, 0xa1, 0x28, 0xc6, 0x06, 0xb7, 0x2e, 0x5c, 0x77, 0x69, 0xb9, 0xce, 0xb7, 0x2e, 0x84, - 0xb3, 0x3b, 0x50, 0x13, 0x95, 0x08, 0x42, 0xdf, 0x76, 0x8f, 0xc5, 0xac, 0xab, 0x72, 0xe0, 0x90, - 0x60, 0xa8, 0x61, 0xe0, 0xbc, 0xd0, 0x8d, 0x23, 0xdb, 0xc1, 0xf5, 0x9d, 0x15, 0xda, 0xd0, 0xdc, - 0x71, 0x9a, 0x1c, 0xa4, 0x0e, 0xa0, 0x14, 0x8d, 0xe4, 0x2f, 0xa5, 0x4c, 0x75, 0x06, 0x55, 0xb9, - 0x85, 0xbf, 0x9c, 0x86, 0x70, 0x0d, 0x22, 0x08, 0x3d, 0xdf, 0x32, 0x23, 0x27, 0x8d, 0x1d, 0x0c, - 0x29, 0xad, 0xfe, 0x56, 0x06, 0x2a, 0xa4, 0xc9, 0x0c, 0x48, 0x4f, 0x63, 0x6f, 0x03, 0x1b, 0xfb, - 0x96, 0x11, 0x5a, 0xba, 0x75, 0x1e, 0xfa, 0x86, 0xd0, 0x57, 0xb8, 0xd2, 0xa3, 0x70, 0x4c, 0x07, - 0x11, 0x5c, 0x65, 0xb9, 0x0d, 0x95, 0x99, 0xe1, 0x07, 0x91, 0xfe, 0xcb, 0x4b, 0x07, 0x0e, 0x12, - 0xda, 0xa7, 0xe2, 0x1e, 0xfb, 0xc6, 0x54, 0x0f, 0xbd, 0x53, 0xcb, 0xe5, 0x9a, 0x3f, 0xb7, 0x79, - 0xea, 0x04, 0x1f, 0x21, 0x98, 0x0c, 0x80, 0x7f, 0x97, 0x81, 0xda, 0x01, 0x9f, 0xa0, 0x9f, 0x5b, - 0x17, 0x6d, 0x6e, 0x68, 0x8e, 0x23, 0xe1, 0x92, 0xd3, 0xe8, 0x37, 0xbb, 0x05, 0x95, 0xd9, 0xa9, - 0x75, 0xa1, 0xa7, 0x8c, 0xb2, 0x32, 0x82, 0x5a, 0x24, 0x46, 0xde, 0x84, 0x82, 0x47, 0x0d, 0x11, - 0xdb, 0xb1, 0xd8, 0xc5, 0xa4, 0x16, 0x6a, 0x82, 0x00, 0x35, 0xbb, 0x38, 0x2b, 0x59, 0x85, 0x14, - 0x99, 0x51, 0xf5, 0x2f, 0x43, 0x1e, 0x51, 0x41, 0x23, 0xcf, 0x55, 0x32, 0x4a, 0xb0, 0xf7, 0xa0, - 0x36, 0xf6, 0xa6, 0x33, 0x3d, 0x62, 0x17, 0x1b, 0x73, 0x5a, 0xfc, 0x55, 0x90, 0xe4, 0x80, 0xe7, - 0xa5, 0xfe, 0x5e, 0x16, 0x4a, 0x54, 0x07, 0x21, 0x01, 0x6d, 0xf3, 0x3c, 0x92, 0x80, 0x65, 0x2d, - 0x6f, 0x9b, 0xb8, 0xc1, 0xbc, 0x44, 0x8b, 0x8c, 0xb5, 0xc3, 0xac, 0xac, 0x1d, 0x5e, 0x85, 0x82, - 0x50, 0x0d, 0x73, 0x5c, 0x44, 0xce, 0x9f, 0xaf, 0x18, 0xe6, 0x57, 0x29, 0x86, 0x38, 0x84, 0x9c, - 0xc6, 0x3a, 0xc7, 0xad, 0x98, 0x4b, 0x41, 0x20, 0x50, 0x07, 0x21, 0xb2, 0x7c, 0x2b, 0xa6, 0xe5, - 0x5b, 0x03, 0x8a, 0xcf, 0xec, 0xc0, 0xc6, 0x09, 0x52, 0xe2, 0x12, 0x43, 0x24, 0xa5, 0x61, 0x28, - 0xbf, 0x6c, 0x18, 0xe2, 0x66, 0x1b, 0xce, 0x31, 0xb7, 0x50, 0xa2, 0x66, 0x37, 0x9d, 0x63, 0x8f, - 0xbd, 0x0f, 0x57, 0x12, 0xb4, 0x68, 0x0d, 0x79, 0xf2, 0xc8, 0x59, 0xa5, 0xb1, 0x98, 0x92, 0x5a, - 0x44, 0x26, 0xe4, 0x7d, 0xd8, 0x94, 0x58, 0x66, 0xa8, 0x89, 0x05, 0x24, 0x1e, 0xcb, 0xda, 0x46, - 0x4c, 0x4e, 0x0a, 0x5a, 0xa0, 0xfe, 0x93, 0x75, 0xa8, 0xed, 0x7a, 0xbe, 0x65, 0x1f, 0xbb, 0xc9, - 0xac, 0x5b, 0x32, 0x52, 0xa2, 0x99, 0xb8, 0x2e, 0xcd, 0xc4, 0xdb, 0x50, 0x99, 0x70, 0x46, 0x3d, - 0x3c, 0xe2, 0xfe, 0x8d, 0x9c, 0x06, 0x02, 0x34, 0x3a, 0x72, 0x50, 0x7e, 0x44, 0x04, 0xc4, 0x9c, - 0x23, 0xe6, 0x88, 0x09, 0xb7, 0x45, 0xf6, 0x3d, 0xda, 0x20, 0x4c, 0xcb, 0xb1, 0x42, 0x3e, 0x3c, - 0xf5, 0x87, 0xaf, 0x46, 0x4a, 0x89, 0x54, 0xa7, 0x07, 0x9a, 0x35, 0x69, 0x92, 0x26, 0x87, 0xfb, - 0x45, 0x9b, 0xc8, 0x05, 0xaf, 0xd8, 0x5c, 0x0a, 0xdf, 0x90, 0x97, 0xcb, 0x2a, 0x75, 0x04, 0xe5, - 0x18, 0x8c, 0x6a, 0xb9, 0xd6, 0x11, 0xaa, 0xf8, 0x1a, 0xab, 0x40, 0xb1, 0xd5, 0x1c, 0xb6, 0x9a, - 0xed, 0x8e, 0x92, 0x41, 0xd4, 0xb0, 0x33, 0xe2, 0xea, 0xf7, 0x3a, 0xdb, 0x80, 0x0a, 0xa6, 0xda, - 0x9d, 0xdd, 0xe6, 0x61, 0x6f, 0xa4, 0x64, 0x59, 0x0d, 0xca, 0xfd, 0x81, 0xde, 0x6c, 0x8d, 0xba, - 0x83, 0xbe, 0x92, 0x53, 0x7f, 0x08, 0xa5, 0xd6, 0x89, 0x35, 0x3e, 0x7d, 0x5e, 0x2f, 0x92, 0x7f, - 0xc0, 0x1a, 0x9f, 0x0a, 0x55, 0x7a, 0xc1, 0x3f, 0x60, 0x8d, 0x4f, 0xd5, 0x0e, 0x94, 0x0f, 0x0c, - 0x3f, 0xb4, 0xa9, 0x5e, 0x9f, 0x40, 0x2d, 0x4e, 0xb4, 0xad, 0x49, 0xa4, 0x64, 0xb0, 0x58, 0xc1, - 0x8e, 0x51, 0x5a, 0x9a, 0x50, 0x7d, 0x1b, 0xaa, 0x32, 0x80, 0xdd, 0x84, 0xac, 0x69, 0x4d, 0x56, - 0x08, 0x51, 0x04, 0xab, 0x4f, 0xa0, 0xda, 0x8a, 0x36, 0xcd, 0xe7, 0x55, 0xfd, 0x21, 0xd4, 0x69, - 0xc5, 0x8f, 0x8f, 0xa2, 0x25, 0xbf, 0xbe, 0x62, 0xc9, 0x57, 0x91, 0xa6, 0x75, 0x24, 0xd6, 0xfc, - 0x87, 0x50, 0x39, 0xf0, 0xbd, 0x99, 0xe5, 0x87, 0x94, 0xad, 0x02, 0xd9, 0x53, 0xeb, 0x42, 0xe4, - 0x8a, 0x3f, 0x13, 0xb7, 0xcd, 0xba, 0xec, 0xb6, 0x79, 0x08, 0xa5, 0x88, 0xed, 0x1b, 0xf3, 0xfc, - 0x00, 0x45, 0x27, 0xf1, 0xd8, 0x56, 0x80, 0x85, 0x3d, 0x00, 0x98, 0xc5, 0x00, 0xd1, 0x71, 0x91, - 0x65, 0x22, 0x32, 0xd7, 0x24, 0x0a, 0xf5, 0x55, 0x28, 0x3e, 0xb1, 0xad, 0x33, 0xd1, 0xfc, 0x67, - 0xb6, 0x75, 0x16, 0x35, 0x1f, 0x7f, 0xab, 0xff, 0xa2, 0x0c, 0x25, 0x5a, 0x5f, 0xed, 0xe7, 0x7b, - 0xca, 0xbe, 0x8d, 0x02, 0xb7, 0x25, 0xd6, 0x53, 0x6e, 0x85, 0xda, 0xc8, 0x57, 0xd7, 0xab, 0x00, - 0xd2, 0x5a, 0xe7, 0x92, 0xab, 0x1c, 0xc6, 0x4b, 0x1c, 0x35, 0x1f, 0xda, 0x8b, 0x82, 0xaf, 0x1d, - 0x61, 0xf0, 0x26, 0x00, 0xf6, 0x80, 0xeb, 0x25, 0x64, 0xe2, 0x72, 0xdd, 0xed, 0x52, 0x64, 0x7f, - 0x1c, 0x39, 0x56, 0x64, 0x15, 0x91, 0xb2, 0x82, 0x09, 0x92, 0x63, 0x96, 0x1f, 0xa0, 0xb8, 0x22, - 0x57, 0xba, 0x16, 0x25, 0xd9, 0x1b, 0x90, 0x43, 0x21, 0x2f, 0xac, 0x98, 0x4b, 0x51, 0x0f, 0x4a, - 0xbb, 0x94, 0x46, 0x04, 0x6c, 0x1b, 0x8a, 0x24, 0x5a, 0x2c, 0x94, 0x34, 0x52, 0x6f, 0x47, 0x42, - 0x5f, 0x8b, 0xd0, 0xec, 0x4d, 0xc8, 0x4f, 0x4e, 0xad, 0x8b, 0xa0, 0x51, 0x23, 0xba, 0x4b, 0x2b, - 0xd6, 0xac, 0xc6, 0x29, 0xd8, 0x5d, 0xa8, 0xfb, 0xd6, 0x44, 0x27, 0xdf, 0x19, 0x0a, 0x99, 0xa0, - 0x51, 0x27, 0x19, 0x52, 0xf5, 0xad, 0x49, 0x0b, 0x81, 0xa3, 0x23, 0x27, 0x60, 0xf7, 0xa0, 0x40, - 0xab, 0x07, 0xd5, 0x36, 0xa9, 0xe4, 0x68, 0x29, 0x6a, 0x02, 0xcb, 0xde, 0x07, 0x10, 0xca, 0xa1, - 0x7e, 0x74, 0x41, 0x3e, 0xe7, 0x78, 0x31, 0xc9, 0xf3, 0x5f, 0x56, 0x21, 0xdf, 0x80, 0x3c, 0x4e, - 0x92, 0xa0, 0x71, 0x8d, 0x72, 0xde, 0x4c, 0xcf, 0x20, 0xaa, 0x29, 0xe1, 0xd9, 0x36, 0x94, 0x70, - 0xa2, 0xe8, 0x38, 0x1c, 0x0d, 0x59, 0x5b, 0x16, 0xb3, 0x0a, 0x77, 0x06, 0xeb, 0x6c, 0xf8, 0xb5, - 0xc3, 0xee, 0x43, 0xce, 0xc4, 0xc5, 0x7c, 0x9d, 0x72, 0xbc, 0x2a, 0x8d, 0x0b, 0x0a, 0xab, 0xb6, - 0x35, 0x21, 0x05, 0x9e, 0x68, 0xd8, 0x1e, 0xd4, 0x71, 0x1a, 0x3d, 0xa4, 0xcd, 0x1e, 0xbb, 0xaf, - 0x71, 0x83, 0xb8, 0x5e, 0x5b, 0xe0, 0xea, 0x0b, 0x22, 0xea, 0xec, 0x8e, 0x1b, 0xfa, 0x17, 0x5a, - 0xcd, 0x95, 0x61, 0xec, 0x06, 0x5a, 0x59, 0x3d, 0x6f, 0x7c, 0x6a, 0x99, 0x8d, 0x57, 0x22, 0x0d, - 0x88, 0xa7, 0xd9, 0xa7, 0x50, 0xa3, 0x89, 0x85, 0x49, 0x2c, 0xbc, 0x71, 0x93, 0x84, 0xa9, 0x3c, - 0x65, 0x22, 0x94, 0x96, 0xa6, 0x44, 0x11, 0x6f, 0x07, 0x7a, 0x68, 0x4d, 0x67, 0x9e, 0x8f, 0x7a, - 0xf6, 0xab, 0x91, 0x6f, 0x68, 0x14, 0x81, 0x70, 0x23, 0x8e, 0x4f, 0xc8, 0x74, 0x6f, 0x32, 0x09, - 0xac, 0xb0, 0x71, 0x8b, 0xd6, 0x4d, 0x3d, 0x3a, 0x28, 0x1b, 0x10, 0x94, 0x36, 0xc2, 0x40, 0x37, - 0x2f, 0x5c, 0x63, 0x6a, 0x8f, 0x1b, 0xb7, 0xb9, 0x3a, 0x6f, 0x07, 0x6d, 0x0e, 0x90, 0x35, 0xea, - 0xad, 0x94, 0x46, 0x7d, 0x09, 0xf2, 0xe6, 0x11, 0x2e, 0xc7, 0xd7, 0x28, 0xdb, 0x9c, 0x79, 0xd4, - 0x35, 0xd9, 0x3b, 0x50, 0x9e, 0x45, 0x22, 0xb0, 0xa1, 0xca, 0x7e, 0x83, 0x58, 0x32, 0x6a, 0x09, - 0x05, 0x9a, 0xb2, 0xbb, 0x96, 0x11, 0xce, 0x7d, 0x6b, 0xd7, 0x31, 0x8e, 0x1b, 0x77, 0x28, 0x27, - 0x19, 0x84, 0xb5, 0x73, 0xbc, 0x63, 0x7b, 0x6c, 0xd0, 0xca, 0xbf, 0xcb, 0xf5, 0x2e, 0x01, 0xe9, - 0x9a, 0x89, 0x22, 0x6a, 0x08, 0x65, 0xea, 0x75, 0x59, 0x11, 0x35, 0x48, 0x9b, 0xba, 0xf1, 0x98, - 0x34, 0x74, 0xea, 0xb9, 0x0f, 0x17, 0x04, 0x54, 0x6a, 0x79, 0x49, 0x92, 0x6c, 0x6f, 0x4d, 0x96, - 0x53, 0x3b, 0x79, 0x92, 0xe4, 0x37, 0x7e, 0x08, 0x6c, 0x79, 0xcc, 0x5f, 0x26, 0x2d, 0xf3, 0x42, - 0x5a, 0x7e, 0x6f, 0xfd, 0x93, 0x8c, 0xfa, 0x04, 0x6a, 0x29, 0x61, 0xb0, 0x52, 0xea, 0x73, 0x95, - 0xcb, 0x98, 0x0a, 0x6b, 0x9a, 0x27, 0x22, 0x75, 0xda, 0x76, 0x8f, 0x85, 0x23, 0x8f, 0xab, 0xd3, - 0x94, 0x56, 0xff, 0x34, 0x0b, 0xd5, 0x3d, 0x23, 0x38, 0xd9, 0x37, 0x66, 0xc3, 0xd0, 0x08, 0x03, - 0x9c, 0x22, 0x27, 0x46, 0x70, 0x32, 0x35, 0x66, 0x5c, 0xf9, 0xcd, 0x70, 0x2f, 0x81, 0x80, 0xa1, - 0xe6, 0x8b, 0x93, 0x13, 0x93, 0x03, 0xf7, 0xe0, 0x73, 0xe1, 0x02, 0x88, 0xd3, 0x28, 0x9a, 0x82, - 0x93, 0xf9, 0x64, 0x12, 0x17, 0x15, 0x25, 0xd9, 0x5d, 0xa8, 0x89, 0x9f, 0xa4, 0xf9, 0x9e, 0x8b, - 0x53, 0xd6, 0x34, 0x90, 0x3d, 0x82, 0x8a, 0x00, 0x8c, 0x22, 0x41, 0x5a, 0x8f, 0x5d, 0x3b, 0x09, - 0x42, 0x93, 0xa9, 0xd8, 0x8f, 0xe0, 0x8a, 0x94, 0xdc, 0xf5, 0xfc, 0xfd, 0xb9, 0x13, 0xda, 0xad, - 0xbe, 0x50, 0x33, 0x5e, 0x59, 0x62, 0x4f, 0x48, 0xb4, 0xd5, 0x9c, 0xe9, 0xda, 0xee, 0xdb, 0x2e, - 0xc9, 0xe5, 0xac, 0x96, 0x06, 0x2e, 0x50, 0x19, 0xe7, 0x24, 0x8e, 0xd3, 0x54, 0xc6, 0x39, 0x2e, - 0x58, 0x01, 0xd8, 0xb7, 0xc2, 0x13, 0xcf, 0x24, 0x1d, 0x33, 0x5e, 0xb0, 0x43, 0x19, 0xa5, 0xa5, - 0x29, 0xb1, 0x3b, 0xd1, 0x7e, 0x1b, 0xbb, 0x21, 0x69, 0x9a, 0x59, 0x2d, 0x4a, 0xe2, 0x56, 0xe5, - 0x1b, 0xee, 0xb1, 0x15, 0x34, 0x2a, 0x5b, 0xd9, 0xed, 0x8c, 0x26, 0x52, 0xea, 0xdf, 0x5c, 0x87, - 0x3c, 0x1f, 0xc9, 0x57, 0xa0, 0x7c, 0x44, 0xbe, 0x71, 0x34, 0xc4, 0x85, 0xbf, 0x9b, 0x00, 0xfd, - 0xf9, 0x94, 0x6b, 0x88, 0xc2, 0x85, 0x93, 0xd1, 0xe8, 0x37, 0x66, 0xe9, 0xcd, 0x43, 0x2c, 0x2b, - 0x4b, 0x50, 0x91, 0xc2, 0x4a, 0xf8, 0xde, 0x19, 0xcd, 0x86, 0x1c, 0x21, 0xa2, 0x24, 0xb9, 0xd4, - 0x69, 0xd7, 0x43, 0xa6, 0x3c, 0xe1, 0x4a, 0x04, 0x68, 0xb9, 0xe1, 0xa2, 0xbb, 0xa9, 0xb0, 0xe4, - 0x6e, 0x62, 0xb7, 0x00, 0xf5, 0xcf, 0xb1, 0x35, 0x70, 0xad, 0x56, 0x9f, 0x7a, 0xb8, 0xa4, 0x49, - 0x10, 0x5c, 0x20, 0xa6, 0x37, 0xa3, 0x4e, 0xcd, 0x6b, 0xf8, 0x93, 0x7d, 0x14, 0xcf, 0x4e, 0x6a, - 0xa3, 0xd0, 0xd6, 0xc5, 0xae, 0x20, 0xcf, 0x63, 0x2d, 0x45, 0x87, 0x39, 0xa1, 0xa8, 0xe7, 0xda, - 0x3a, 0xfe, 0x54, 0x3b, 0x00, 0x9a, 0x77, 0x16, 0x58, 0x21, 0xf9, 0x55, 0xaf, 0x51, 0x13, 0x53, - 0x27, 0x62, 0xde, 0xd9, 0x81, 0x17, 0xc4, 0x06, 0xed, 0xfa, 0x6a, 0x83, 0x56, 0x7d, 0x17, 0x8a, - 0xa8, 0x07, 0x18, 0xa1, 0xc1, 0xee, 0x0a, 0x57, 0x16, 0xd7, 0x5e, 0x84, 0x4f, 0x2f, 0x29, 0x43, - 0x38, 0xb7, 0x7a, 0x51, 0xb9, 0xc4, 0xf3, 0x9a, 0x64, 0x32, 0xc6, 0x7b, 0x90, 0xc8, 0x50, 0x68, - 0x16, 0xaf, 0x40, 0x19, 0xab, 0x46, 0xc7, 0x04, 0x42, 0x2e, 0x94, 0x7c, 0xef, 0xac, 0x85, 0x69, - 0xf5, 0xdf, 0x67, 0xa0, 0x32, 0xf0, 0x4d, 0xdc, 0xfc, 0x86, 0x33, 0x6b, 0xfc, 0x52, 0xfb, 0x1b, - 0xf5, 0x10, 0xcf, 0x71, 0x0c, 0x12, 0xb3, 0xc2, 0x64, 0x8b, 0x01, 0xec, 0x7d, 0xc8, 0x4d, 0x50, - 0x9c, 0x66, 0x65, 0xed, 0x5c, 0xca, 0x3e, 0xfa, 0x8d, 0x02, 0x56, 0x23, 0x52, 0xf5, 0xd7, 0xe3, - 0xf2, 0x49, 0xea, 0xca, 0xce, 0xf4, 0x35, 0x3a, 0xd6, 0x1a, 0xb6, 0x94, 0x0c, 0x2b, 0x41, 0xae, - 0xdd, 0x19, 0xb6, 0xb8, 0x4e, 0x8e, 0xda, 0xf9, 0x50, 0xdf, 0xed, 0x6a, 0xc3, 0x91, 0x92, 0xa3, - 0x73, 0x32, 0x02, 0xf4, 0x9a, 0xc3, 0x91, 0x52, 0x62, 0x00, 0x85, 0xc3, 0x7e, 0xf7, 0x47, 0x87, - 0x1d, 0x45, 0x51, 0xff, 0x75, 0x06, 0x20, 0xf1, 0xf9, 0xb2, 0xb7, 0xa0, 0x72, 0x46, 0x29, 0x5d, - 0x3a, 0x0c, 0x90, 0xdb, 0x08, 0x1c, 0x4d, 0x3a, 0xd2, 0x3b, 0x50, 0x8d, 0xb7, 0x0b, 0xd4, 0x1f, - 0x96, 0x4f, 0x05, 0x2a, 0x31, 0x7e, 0xe7, 0x82, 0xbd, 0x0d, 0x25, 0x0f, 0xdb, 0x81, 0xa4, 0x59, - 0x59, 0x79, 0x90, 0x9a, 0xaf, 0x15, 0x3d, 0x9e, 0x40, 0x3d, 0x63, 0xe2, 0x47, 0x26, 0x78, 0x4c, - 0xba, 0x8b, 0xa0, 0x96, 0x63, 0xcc, 0x03, 0x4b, 0xe3, 0xf8, 0x58, 0x4a, 0xe7, 0x13, 0x29, 0xad, - 0xfe, 0x18, 0xea, 0x43, 0x63, 0x3a, 0xe3, 0xb2, 0x9c, 0x1a, 0xc6, 0x20, 0x87, 0x73, 0x42, 0x4c, - 0x3d, 0xfa, 0x8d, 0x8b, 0xee, 0xc0, 0xf2, 0xc7, 0x96, 0x1b, 0xad, 0xd1, 0x28, 0x89, 0xe2, 0xf7, - 0x10, 0xa5, 0xb9, 0xe6, 0x9d, 0x45, 0xe2, 0x3c, 0x4a, 0xab, 0x7f, 0x27, 0x03, 0x15, 0xa9, 0x1a, - 0xec, 0x5d, 0xc8, 0x91, 0x42, 0x9a, 0x91, 0x05, 0xa1, 0x44, 0xc0, 0x7f, 0x73, 0x15, 0x06, 0x09, - 0xd9, 0x3d, 0xc8, 0x07, 0xa1, 0xe1, 0x47, 0xc7, 0x07, 0x8a, 0xc4, 0xb1, 0xe3, 0xcd, 0x5d, 0x53, - 0xe3, 0x68, 0xa6, 0x42, 0xd6, 0x72, 0x4d, 0xe1, 0xb4, 0x58, 0xa6, 0x42, 0xa4, 0xba, 0x05, 0xe5, - 0x38, 0x7b, 0x9c, 0x02, 0xda, 0xe0, 0xe9, 0x50, 0x59, 0x63, 0x65, 0xc8, 0x6b, 0xcd, 0xfe, 0xe3, - 0x8e, 0x92, 0x51, 0x7f, 0x96, 0x01, 0x48, 0xb8, 0xd8, 0x83, 0x54, 0x6d, 0x6f, 0x2c, 0xe6, 0xfa, - 0x80, 0xfe, 0x4a, 0x95, 0xbd, 0x09, 0xe5, 0xb9, 0x4b, 0x40, 0xcb, 0x14, 0x3b, 0x51, 0x02, 0x40, - 0x2b, 0x2a, 0x0a, 0x76, 0x59, 0xb0, 0xa2, 0x9e, 0x19, 0x8e, 0xfa, 0x3d, 0x28, 0xc7, 0xd9, 0xa1, - 0x61, 0xb8, 0x3b, 0xe8, 0xf5, 0x06, 0x4f, 0xbb, 0xfd, 0xc7, 0xca, 0x1a, 0x26, 0x0f, 0xb4, 0x4e, - 0xab, 0xd3, 0xc6, 0x64, 0x06, 0xe7, 0x6c, 0xeb, 0x50, 0xd3, 0x3a, 0xfd, 0x91, 0xae, 0x0d, 0x9e, - 0x2a, 0xeb, 0xea, 0x6f, 0x67, 0xa0, 0x36, 0x70, 0xcc, 0x96, 0xe7, 0xb4, 0x8c, 0x19, 0x6a, 0x1c, - 0xec, 0x07, 0xb0, 0x79, 0x34, 0x47, 0xad, 0x77, 0xe6, 0x18, 0x63, 0xeb, 0xc4, 0x73, 0x4c, 0x2b, - 0x5a, 0x84, 0xa9, 0x03, 0x12, 0xe1, 0xcb, 0x55, 0x88, 0xf8, 0x20, 0xa1, 0x65, 0x1f, 0x42, 0x75, - 0xe6, 0x7b, 0x47, 0x96, 0x1e, 0x78, 0x73, 0x7f, 0x6c, 0x2d, 0x99, 0x6b, 0x09, 0x6f, 0x85, 0xe8, - 0x86, 0x44, 0xa6, 0xfe, 0xbd, 0x75, 0xa8, 0xb6, 0x2d, 0x73, 0x3e, 0xfb, 0xcc, 0xb3, 0xdd, 0x56, - 0x78, 0xce, 0x3e, 0x80, 0xaa, 0xe7, 0x90, 0x1f, 0x52, 0x97, 0x8e, 0xe3, 0x57, 0xe5, 0x03, 0x1e, - 0xb5, 0x80, 0x0e, 0xef, 0xdf, 0x81, 0x4b, 0xdc, 0x30, 0x17, 0x7e, 0xaa, 0x73, 0xce, 0x8c, 0x6b, - 0x26, 0xaf, 0x29, 0x1c, 0xc5, 0x37, 0x68, 0x22, 0xff, 0x15, 0xb8, 0x2c, 0x91, 0xa3, 0x60, 0xe1, - 0xf4, 0xd9, 0xa5, 0x35, 0xb6, 0x19, 0xf3, 0xc6, 0x81, 0x02, 0x9f, 0xc1, 0xe5, 0xa8, 0x86, 0x63, - 0xde, 0x7b, 0x9c, 0x39, 0x27, 0x9b, 0x17, 0xa9, 0xde, 0x15, 0x15, 0xde, 0xf4, 0x64, 0x20, 0xe5, - 0xf5, 0x3e, 0x5c, 0x31, 0xb1, 0xf5, 0x3a, 0xef, 0xfc, 0x53, 0xcb, 0x9a, 0xe9, 0x8e, 0x11, 0x84, - 0xe2, 0xdc, 0x91, 0x11, 0x72, 0x07, 0x71, 0x9f, 0x5b, 0xd6, 0xac, 0x67, 0x04, 0xa1, 0xfa, 0xd7, - 0xb2, 0x50, 0xe6, 0x5e, 0x05, 0xec, 0xae, 0x6d, 0x28, 0x7a, 0x47, 0x5f, 0xe9, 0x7e, 0x6c, 0x6d, - 0x2f, 0x9d, 0x2d, 0x16, 0xbc, 0xa3, 0xaf, 0x34, 0x6b, 0xc2, 0xde, 0x8a, 0xb6, 0x3a, 0xb4, 0xcc, - 0xd7, 0x65, 0xdf, 0x78, 0xa4, 0xd6, 0x8b, 0xad, 0x0f, 0x4d, 0xce, 0x47, 0x50, 0xb1, 0xdd, 0xc0, - 0xf2, 0x43, 0xee, 0x49, 0x29, 0x3e, 0x7f, 0x10, 0x38, 0x19, 0x39, 0x57, 0x1e, 0x41, 0x85, 0x7b, - 0x56, 0x38, 0x53, 0xe9, 0xf9, 0x4c, 0x9c, 0x8c, 0x98, 0x3e, 0x85, 0x7a, 0x22, 0xe6, 0x88, 0xaf, - 0xfc, 0x5c, 0xbe, 0x5a, 0x4c, 0x49, 0xac, 0x0f, 0xe1, 0x6a, 0x70, 0x6a, 0xcf, 0x74, 0x51, 0x53, - 0xcf, 0xa5, 0x63, 0x05, 0x7d, 0x76, 0x2a, 0xdc, 0xf9, 0x0c, 0xb1, 0x5d, 0x42, 0x0e, 0xdc, 0xfe, - 0xdc, 0x71, 0x0e, 0x4e, 0xd9, 0x9b, 0xb0, 0x29, 0xc8, 0x67, 0xa7, 0xd1, 0x5c, 0x21, 0x63, 0x33, - 0xaf, 0xd5, 0x39, 0xe2, 0xe0, 0x54, 0x68, 0x72, 0x1f, 0x43, 0x83, 0x1f, 0x77, 0x8b, 0x46, 0x19, - 0x93, 0x89, 0x35, 0x0e, 0x75, 0x54, 0x1d, 0x84, 0xef, 0xff, 0x0a, 0xe1, 0xb9, 0x7b, 0xa8, 0x49, - 0x58, 0x94, 0x7c, 0xea, 0xdf, 0xcf, 0x40, 0x99, 0x17, 0x8b, 0x23, 0xf4, 0x1a, 0x64, 0x5f, 0x30, - 0x3a, 0x88, 0x63, 0xf7, 0x61, 0xd3, 0x30, 0x4d, 0x51, 0x80, 0x65, 0xf2, 0x22, 0xb8, 0x38, 0xd8, - 0x30, 0x4c, 0xb3, 0x29, 0xe0, 0x24, 0x56, 0xb7, 0x41, 0xb1, 0x03, 0x3d, 0xb2, 0x2b, 0x93, 0xc3, - 0xed, 0x92, 0x56, 0xb7, 0x03, 0x61, 0x56, 0x72, 0x57, 0x71, 0x6a, 0xc0, 0x73, 0x2f, 0x1e, 0x70, - 0x95, 0x01, 0x68, 0x16, 0xad, 0xfd, 0x56, 0x78, 0xfe, 0x59, 0xae, 0x94, 0x51, 0x40, 0xfd, 0xa7, - 0x15, 0xa8, 0x34, 0x5d, 0xc3, 0xb9, 0xf8, 0x89, 0x45, 0x27, 0xf3, 0xe4, 0x38, 0x9c, 0xcd, 0x45, - 0x17, 0xf0, 0x63, 0xab, 0x32, 0x41, 0xa8, 0x66, 0xb7, 0xa1, 0xe2, 0xcd, 0xc3, 0x18, 0xcf, 0x0f, - 0xb2, 0x80, 0x83, 0x88, 0x20, 0xe6, 0x8f, 0x9d, 0xd2, 0x11, 0x3f, 0x69, 0xe5, 0x09, 0x7f, 0xac, - 0xa9, 0xc5, 0xfc, 0x44, 0x70, 0x07, 0x6a, 0xa1, 0x3d, 0xb5, 0xe8, 0xec, 0x6e, 0x3e, 0xb5, 0x4c, - 0x1e, 0xd2, 0xc7, 0xa3, 0xc4, 0x5a, 0x02, 0x86, 0xb9, 0x4c, 0xad, 0xa9, 0xe7, 0x5f, 0xf0, 0x5c, - 0x0a, 0x3c, 0x17, 0x0e, 0xa2, 0x5c, 0xde, 0x06, 0x76, 0x66, 0xd8, 0xa1, 0x9e, 0xce, 0x8a, 0x6b, - 0xc7, 0x0a, 0x62, 0x46, 0x72, 0x76, 0x57, 0xa1, 0x60, 0xda, 0xc1, 0x69, 0x77, 0x20, 0x34, 0x63, - 0x91, 0xc2, 0xb6, 0x04, 0x63, 0x03, 0x37, 0xe6, 0xd0, 0xe2, 0x5a, 0x5c, 0x56, 0x2b, 0x23, 0x64, - 0x07, 0x01, 0x28, 0xd8, 0x5d, 0x2b, 0x3c, 0xf3, 0x7c, 0xe4, 0xe4, 0x8a, 0x6f, 0x02, 0xc0, 0x0d, - 0x10, 0x49, 0xb1, 0x20, 0x9a, 0x7b, 0x59, 0x2d, 0x4e, 0xa3, 0x4a, 0xc9, 0xe7, 0x21, 0x61, 0xab, - 0xbc, 0xfa, 0x09, 0x84, 0xdd, 0x85, 0x3a, 0x55, 0x9f, 0x14, 0x63, 0x6c, 0x03, 0x9d, 0x35, 0x65, - 0xb5, 0x2a, 0x42, 0xc9, 0x4e, 0x46, 0xaa, 0x4f, 0xe1, 0x7a, 0xaa, 0x7d, 0xba, 0xe1, 0xfb, 0xc6, - 0x85, 0x3e, 0x35, 0xbe, 0xf2, 0x7c, 0xf2, 0x69, 0x64, 0xb5, 0xab, 0x72, 0xb7, 0x35, 0x11, 0xbd, - 0x8f, 0xd8, 0xe7, 0xb2, 0xda, 0xae, 0xe7, 0x93, 0xc3, 0x63, 0x25, 0x2b, 0x62, 0xc9, 0x3a, 0xa7, - 0x01, 0x26, 0x2d, 0x3d, 0xe0, 0xd1, 0x85, 0x5a, 0x85, 0x60, 0x3b, 0x04, 0x42, 0x3d, 0x35, 0x78, - 0xc4, 0xe5, 0xe5, 0xa6, 0x08, 0xf5, 0x79, 0x44, 0x92, 0x90, 0x23, 0x4e, 0x2c, 0xc3, 0xa4, 0xf3, - 0x2b, 0x42, 0xec, 0x59, 0x06, 0x9d, 0x0e, 0x07, 0x8f, 0xf4, 0xd9, 0x3c, 0xe4, 0x61, 0x81, 0x5a, - 0x3e, 0x78, 0x74, 0x30, 0x0f, 0x05, 0xf8, 0xd8, 0x0a, 0xe9, 0xb8, 0x8a, 0xc0, 0x8f, 0xad, 0x10, - 0x95, 0xcd, 0xe0, 0x51, 0xe4, 0xe0, 0xbd, 0x22, 0xfa, 0xf6, 0x91, 0xf0, 0xe0, 0xaa, 0x50, 0x8b, - 0x91, 0xfa, 0x74, 0xce, 0xe3, 0x00, 0xb3, 0x5a, 0x25, 0x22, 0xd8, 0x9f, 0x3b, 0x38, 0xb0, 0x63, - 0x63, 0x7c, 0x62, 0xe9, 0x3e, 0x56, 0xe5, 0x1a, 0x1f, 0x3a, 0x82, 0x68, 0x58, 0x9b, 0x57, 0x80, - 0x27, 0xf4, 0x13, 0x3b, 0x24, 0xc7, 0x4b, 0x56, 0x2b, 0x11, 0x60, 0xcf, 0x0e, 0x71, 0x1d, 0x73, - 0xa4, 0x98, 0x81, 0x94, 0xc5, 0x75, 0x22, 0xda, 0x20, 0xc4, 0x3e, 0xc1, 0x29, 0xa3, 0x6d, 0x50, - 0x52, 0xb4, 0x98, 0xdf, 0x0d, 0x22, 0xad, 0x4b, 0xa4, 0x98, 0xeb, 0x3d, 0xe0, 0xcc, 0x3a, 0x4e, - 0x3d, 0x9e, 0xe7, 0x2b, 0xdc, 0x4a, 0x23, 0x70, 0xdb, 0x0e, 0x4e, 0x29, 0xc7, 0xbb, 0x50, 0x97, - 0xe8, 0x30, 0xbf, 0x9b, 0x7c, 0x66, 0xc4, 0x64, 0xa9, 0x3a, 0xfa, 0xd6, 0xd4, 0x0b, 0x45, 0x33, - 0x5f, 0x95, 0xea, 0xa8, 0x11, 0x3c, 0x5d, 0x47, 0x41, 0x8b, 0x79, 0xde, 0x92, 0xea, 0xc8, 0x49, - 0x31, 0xd7, 0xd7, 0xa0, 0x7a, 0xe6, 0xdb, 0x61, 0x68, 0xb9, 0x7c, 0xf1, 0xdf, 0xe6, 0x1d, 0x2b, - 0x60, 0xb4, 0xfa, 0x5f, 0x83, 0x2a, 0xef, 0x79, 0x21, 0xdf, 0xb6, 0x38, 0x89, 0x80, 0x45, 0x02, - 0x42, 0xf4, 0xc6, 0xd4, 0x76, 0xc9, 0xbb, 0x92, 0xd5, 0xca, 0x1c, 0x82, 0xc6, 0xaa, 0x84, 0x36, - 0xce, 0xc9, 0xc7, 0x92, 0xa0, 0x8d, 0x73, 0x5a, 0x92, 0x33, 0xdb, 0x71, 0xf8, 0xc2, 0xbf, 0x23, - 0x96, 0x24, 0x42, 0x68, 0xdd, 0xc7, 0x68, 0x2a, 0xfd, 0xae, 0x84, 0xa6, 0xb2, 0x71, 0xe2, 0x10, - 0x1a, 0x8b, 0x7e, 0x5d, 0x4c, 0x1c, 0x04, 0x60, 0xc9, 0x09, 0xd2, 0x38, 0x6f, 0xdc, 0x93, 0x91, - 0xc6, 0xb9, 0x90, 0x5b, 0x98, 0x2b, 0xf1, 0xbe, 0x11, 0xcb, 0x2d, 0x04, 0x21, 0xb7, 0x4c, 0x60, - 0x9c, 0x37, 0xb6, 0xd3, 0x04, 0xc6, 0x39, 0x59, 0x48, 0x96, 0x61, 0xf2, 0x8a, 0xbf, 0xc9, 0xb3, - 0x47, 0x00, 0xd5, 0x7b, 0x0b, 0xaa, 0xc1, 0x23, 0x3d, 0xc1, 0xdf, 0xe7, 0xec, 0xc1, 0x23, 0x2d, - 0xa2, 0xb8, 0x0b, 0xf5, 0x78, 0x6a, 0x70, 0x9a, 0xb7, 0xf8, 0xc0, 0x9b, 0x62, 0x6a, 0xd0, 0x71, - 0xdf, 0x4f, 0x33, 0x70, 0x63, 0x40, 0xce, 0x21, 0x12, 0xff, 0xfb, 0x56, 0x10, 0x18, 0xc7, 0xd6, - 0xae, 0xe7, 0xef, 0xce, 0x7f, 0xf2, 0x93, 0x0b, 0xb6, 0x0d, 0x1b, 0x07, 0x86, 0x6f, 0xb9, 0x61, - 0x7c, 0x50, 0x25, 0x3c, 0x33, 0x8b, 0x60, 0xf6, 0x09, 0x28, 0x1c, 0xc4, 0x43, 0xa2, 0x5a, 0xd1, - 0x39, 0xcd, 0xa2, 0x5f, 0x79, 0x89, 0x0a, 0x8d, 0xbd, 0x72, 0xdb, 0x0e, 0x42, 0x0d, 0x2d, 0x7d, - 0xf6, 0x29, 0x28, 0x8e, 0x77, 0x86, 0x16, 0x0b, 0xaa, 0xb1, 0xba, 0xa4, 0x38, 0x8b, 0x5d, 0x32, - 0xd1, 0x96, 0xeb, 0x44, 0x98, 0xa8, 0xbb, 0x9f, 0x82, 0x32, 0x9f, 0xcd, 0xd2, 0xac, 0xeb, 0xcf, - 0x61, 0x25, 0xc2, 0x84, 0xf5, 0x2d, 0xa8, 0x48, 0xa5, 0xae, 0x50, 0xae, 0x21, 0x29, 0x0b, 0x89, - 0xa5, 0x72, 0x56, 0x84, 0x59, 0x42, 0x92, 0xbb, 0xfa, 0xff, 0xad, 0x83, 0x42, 0xce, 0x31, 0x8d, - 0x0e, 0xeb, 0xe9, 0xbc, 0x2b, 0x65, 0x96, 0x65, 0x5e, 0x6a, 0x96, 0x6d, 0x41, 0xde, 0xb1, 0xa7, - 0x71, 0xec, 0x53, 0xea, 0xc0, 0x86, 0x10, 0x38, 0xd6, 0x9e, 0x6f, 0x1f, 0x93, 0x01, 0x29, 0x47, - 0xe9, 0x91, 0xdf, 0x0f, 0xed, 0x31, 0x1a, 0xa2, 0x07, 0x00, 0xa6, 0x1d, 0x84, 0x3a, 0xb9, 0x54, - 0x44, 0xb5, 0x45, 0xcf, 0xc4, 0xfd, 0xaf, 0x95, 0xcd, 0x78, 0x28, 0xb6, 0x41, 0x91, 0x94, 0x30, - 0x37, 0xf6, 0x86, 0xe4, 0xb5, 0x44, 0x39, 0x6b, 0xb9, 0x2d, 0x37, 0x5c, 0xa2, 0x44, 0xf5, 0xa9, - 0xb0, 0x44, 0xd9, 0x35, 0xcf, 0xd5, 0x3f, 0x53, 0x21, 0xd7, 0xf7, 0x4c, 0x8b, 0xbd, 0x07, 0x65, - 0x0a, 0x67, 0x95, 0x06, 0x58, 0x28, 0xc9, 0x88, 0xa6, 0x3f, 0x34, 0x52, 0x25, 0x57, 0xfc, 0x7a, - 0x7e, 0x00, 0xec, 0x6b, 0x64, 0xdc, 0xd1, 0x91, 0x2c, 0x36, 0xa9, 0x22, 0x1c, 0x50, 0xe4, 0x2f, - 0xe1, 0x18, 0xdc, 0x5b, 0xc9, 0x7d, 0xef, 0x5b, 0x2e, 0x69, 0xe4, 0x79, 0x2d, 0x4e, 0x93, 0x49, - 0xed, 0x7b, 0xa8, 0x7a, 0xf1, 0x1d, 0x28, 0xbf, 0xc2, 0xa4, 0xe6, 0x78, 0xda, 0x92, 0xde, 0x83, - 0xf2, 0x57, 0x9e, 0xed, 0xf2, 0x8a, 0x17, 0x96, 0x2a, 0x8e, 0x16, 0x0b, 0xaf, 0xf8, 0x57, 0xe2, - 0x17, 0xbb, 0x03, 0x45, 0xcf, 0xe5, 0x79, 0x17, 0x97, 0xf2, 0x2e, 0x78, 0x6e, 0x8f, 0x47, 0x57, - 0xd5, 0xec, 0x40, 0xf7, 0xed, 0xe3, 0x93, 0x50, 0x47, 0x4e, 0x71, 0x94, 0x5b, 0xb1, 0x03, 0x0d, - 0x61, 0x98, 0x2d, 0x4e, 0xbc, 0x89, 0xed, 0xa0, 0x86, 0x47, 0x99, 0x95, 0x97, 0x32, 0x03, 0x8e, - 0xa6, 0x0c, 0x5f, 0x87, 0xd2, 0xb1, 0xef, 0xa1, 0x11, 0x71, 0xd1, 0x80, 0x25, 0xca, 0x22, 0xe1, - 0x76, 0x2e, 0x50, 0x7d, 0xa2, 0x9f, 0xb6, 0x7b, 0xac, 0x93, 0x97, 0xa4, 0xb2, 0x95, 0xdd, 0x2e, - 0x69, 0xd5, 0x08, 0x48, 0xfe, 0x8f, 0xd7, 0xa1, 0x64, 0x1c, 0x1f, 0xeb, 0x22, 0x48, 0x6c, 0x29, - 0x2f, 0xe3, 0xf8, 0x98, 0x8a, 0x7c, 0x00, 0xb5, 0x33, 0xdb, 0xd5, 0x83, 0x99, 0x35, 0xe6, 0xb4, - 0xb5, 0xe5, 0xae, 0x3c, 0xb3, 0x5d, 0x9c, 0xdd, 0x44, 0x2f, 0x2f, 0x83, 0xfa, 0x37, 0x5f, 0x06, - 0x1b, 0xcf, 0x5b, 0x06, 0x2a, 0x14, 0x84, 0x6b, 0x5f, 0x59, 0x22, 0x11, 0x18, 0xf6, 0x3e, 0x54, - 0x7c, 0xc3, 0x3d, 0xd5, 0xc5, 0xb9, 0xf8, 0x97, 0xb2, 0xa5, 0xaf, 0x19, 0xee, 0xa9, 0x38, 0x16, - 0x07, 0x3f, 0xfe, 0x9d, 0x56, 0x99, 0x37, 0x5f, 0x62, 0x23, 0x49, 0xa6, 0x17, 0x7b, 0xb1, 0xe9, - 0xf5, 0x21, 0xd9, 0x38, 0x96, 0x1b, 0xea, 0x11, 0xc3, 0xa5, 0xd5, 0x0c, 0x55, 0x4e, 0x36, 0xe0, - 0x6c, 0xd8, 0x00, 0xf2, 0xb4, 0xe9, 0xe4, 0x96, 0xbb, 0x9c, 0x6a, 0x40, 0xec, 0x82, 0xd3, 0xc0, - 0x4f, 0xdc, 0x71, 0x4d, 0xd8, 0x48, 0x22, 0x67, 0x79, 0x08, 0xf2, 0x15, 0xd9, 0xd5, 0x9f, 0x0a, - 0xb5, 0x8d, 0xac, 0x2a, 0x3b, 0x15, 0x7f, 0x7b, 0x07, 0x6a, 0x3c, 0x10, 0x85, 0xf7, 0x5b, 0x40, - 0x4a, 0x52, 0x59, 0xab, 0x12, 0x90, 0xf7, 0x53, 0x40, 0x02, 0x46, 0x98, 0x7a, 0xe1, 0x39, 0x69, - 0x49, 0x89, 0x80, 0xe1, 0xb6, 0x5d, 0x78, 0xae, 0x95, 0xcd, 0xe8, 0x27, 0x6e, 0xfe, 0x47, 0xb6, - 0x6b, 0xe2, 0xd4, 0x0b, 0x8d, 0xe3, 0xa0, 0xd1, 0xa0, 0x95, 0x59, 0x11, 0xb0, 0x91, 0x71, 0x1c, - 0xa0, 0xe1, 0x6f, 0x70, 0x63, 0x83, 0xd7, 0xfb, 0xba, 0xec, 0x99, 0x92, 0xcc, 0x10, 0xad, 0x62, - 0x48, 0x36, 0xc9, 0xc7, 0xc0, 0xa2, 0x93, 0x47, 0xc9, 0x8e, 0xbf, 0xb1, 0x34, 0x1b, 0x37, 0xc4, - 0xd1, 0x63, 0x6c, 0xc5, 0xdf, 0x86, 0x0a, 0xf7, 0x54, 0xe8, 0x41, 0x68, 0xcd, 0x1a, 0xaf, 0x50, - 0x85, 0x80, 0x83, 0x86, 0xa1, 0x35, 0x63, 0x1f, 0x43, 0x2d, 0x6d, 0x65, 0xdd, 0x5c, 0x71, 0x80, - 0x47, 0xd3, 0x42, 0xab, 0x8e, 0x65, 0xbb, 0xeb, 0x0e, 0x8f, 0xea, 0x26, 0x0d, 0x89, 0x18, 0xf9, - 0x21, 0x55, 0xd5, 0xf5, 0xc2, 0x56, 0x04, 0xc3, 0x0e, 0x8c, 0x0c, 0xec, 0xf0, 0x9c, 0x94, 0xaa, - 0xb8, 0x03, 0x63, 0xd3, 0x11, 0x8d, 0xa3, 0xc8, 0x8a, 0x6c, 0x03, 0x0f, 0xbc, 0xa0, 0x4d, 0xde, - 0xf2, 0x79, 0x90, 0x05, 0xe9, 0x50, 0xf1, 0x99, 0xde, 0xe2, 0xde, 0xa3, 0xf1, 0x80, 0x14, 0x79, - 0x37, 0xfa, 0x04, 0xea, 0x33, 0xdf, 0xd2, 0xa5, 0x92, 0x55, 0xb9, 0x51, 0x07, 0xbe, 0x95, 0x14, - 0x5e, 0x9d, 0x49, 0x29, 0xf6, 0x03, 0xd8, 0x94, 0x38, 0xe7, 0xa7, 0xc4, 0x7c, 0x87, 0x98, 0x2f, - 0x2f, 0x30, 0x1f, 0x9e, 0x22, 0x7b, 0x7d, 0x96, 0x4a, 0xb3, 0xcb, 0x90, 0xef, 0x06, 0x1d, 0xd7, - 0x24, 0xdd, 0xaa, 0xa4, 0xf1, 0x04, 0x7b, 0x04, 0x55, 0x6e, 0xc8, 0x50, 0x9c, 0x6a, 0xd0, 0xb8, - 0x27, 0xbb, 0x9e, 0xc9, 0x9a, 0x21, 0x84, 0x56, 0x71, 0xe2, 0xdf, 0x01, 0xfb, 0x08, 0x36, 0xf9, - 0xb9, 0x80, 0x2c, 0x22, 0xdf, 0x58, 0x1e, 0x72, 0x22, 0xda, 0x4d, 0xe4, 0xa4, 0x06, 0xd7, 0xfd, - 0xb9, 0x4b, 0xc6, 0x8d, 0xe0, 0xe4, 0x1e, 0x2b, 0xe2, 0xdf, 0x26, 0xfe, 0x6b, 0x62, 0x75, 0x71, - 0x32, 0xce, 0x4b, 0xb2, 0xe9, 0xaa, 0x2f, 0x83, 0x0e, 0x90, 0xef, 0x39, 0x79, 0x72, 0x4f, 0x0e, - 0xe5, 0xf9, 0xe6, 0xb7, 0xc9, 0x93, 0xbc, 0x3c, 0x94, 0x27, 0x83, 0xdc, 0x7c, 0x6e, 0x9b, 0xa4, - 0xe9, 0x55, 0x35, 0xfa, 0xcd, 0x5e, 0x87, 0xba, 0x6f, 0x8d, 0xe7, 0x7e, 0x60, 0x3f, 0xb3, 0xf4, - 0xc0, 0x76, 0x4f, 0x49, 0xc7, 0x2b, 0x69, 0xb5, 0x18, 0x3a, 0xb4, 0xdd, 0x53, 0x14, 0x19, 0xd6, - 0x79, 0x68, 0xf9, 0x2e, 0x0f, 0x9d, 0x7f, 0x5b, 0x16, 0x19, 0x1d, 0x42, 0xe0, 0x3a, 0xd7, 0xc0, - 0x8a, 0x7f, 0x2f, 0x8c, 0x6c, 0xc0, 0x47, 0xf6, 0xc1, 0x37, 0x1a, 0xd9, 0x21, 0x8d, 0xec, 0x3d, - 0x28, 0xd9, 0x6e, 0x68, 0xf9, 0xcf, 0x0c, 0xa7, 0xf1, 0xee, 0x92, 0x34, 0x8e, 0x71, 0xec, 0x2e, - 0x14, 0x03, 0xc7, 0xc6, 0xf5, 0xde, 0x78, 0x6f, 0x89, 0x2c, 0x42, 0xb1, 0x6d, 0x28, 0xc7, 0xb7, - 0xbe, 0x1a, 0xef, 0x2f, 0xd1, 0x25, 0x48, 0x76, 0x0b, 0x72, 0x67, 0x38, 0xa1, 0x1e, 0x2e, 0x1f, - 0x15, 0x20, 0x1c, 0xb7, 0xef, 0x09, 0xea, 0xec, 0xb4, 0x7d, 0x3f, 0x5a, 0xda, 0xbe, 0x77, 0x6d, - 0xc7, 0xe1, 0xdb, 0xf7, 0x44, 0xfc, 0xc2, 0xcd, 0x8f, 0x38, 0xb0, 0x25, 0x1f, 0x2c, 0x6f, 0x7e, - 0x88, 0x7b, 0x42, 0xf7, 0xe3, 0x2a, 0x01, 0xf9, 0xbf, 0xb9, 0x1b, 0xff, 0x43, 0xb9, 0xaf, 0xd2, - 0x8e, 0x71, 0x0d, 0x82, 0x38, 0x8d, 0x06, 0x88, 0xf0, 0xfe, 0xa3, 0xd2, 0xf4, 0x11, 0xbf, 0x78, - 0xc1, 0x21, 0x5d, 0xf3, 0x9c, 0xbd, 0x07, 0xb5, 0x28, 0x5c, 0x08, 0x8b, 0x0b, 0x1a, 0x1f, 0x2f, - 0xd5, 0x20, 0x4d, 0xc0, 0xda, 0x50, 0x9d, 0xa0, 0xee, 0x3e, 0xe5, 0xaa, 0x7c, 0xe3, 0x13, 0xaa, - 0xc8, 0x56, 0xb4, 0xb1, 0x3e, 0x4f, 0xd5, 0xd7, 0x52, 0x5c, 0xec, 0x01, 0x30, 0x7b, 0xc2, 0xc7, - 0x73, 0xd7, 0xf7, 0xa6, 0x5c, 0x5d, 0x6f, 0x7c, 0xca, 0x3d, 0x68, 0xcb, 0x18, 0x3a, 0x0c, 0xb4, - 0x5c, 0x53, 0x9f, 0x06, 0x42, 0x4d, 0xf8, 0x1e, 0xd5, 0x53, 0x08, 0xaf, 0xf8, 0x76, 0x68, 0xe4, - 0xec, 0x45, 0xda, 0xfd, 0x80, 0x6b, 0x0d, 0x9f, 0x02, 0x4e, 0xd7, 0x67, 0x09, 0xeb, 0xaf, 0xbc, - 0x90, 0x15, 0x69, 0x23, 0xd6, 0x4f, 0xa0, 0xce, 0x1d, 0xa5, 0xa4, 0x91, 0xe1, 0x14, 0xfd, 0xbe, - 0x2c, 0xb9, 0x64, 0x17, 0xb2, 0x56, 0x35, 0x65, 0x87, 0xf2, 0xc7, 0xb0, 0x11, 0xf9, 0x7a, 0x43, - 0xe1, 0x16, 0xfe, 0x55, 0xb9, 0xd8, 0xd8, 0x97, 0xaa, 0xd5, 0xe6, 0xd1, 0x4f, 0x2a, 0xf2, 0x11, - 0xd4, 0x68, 0x17, 0x0d, 0x5c, 0x63, 0x16, 0x9c, 0x78, 0x61, 0xe3, 0xd7, 0x64, 0x85, 0x60, 0x28, - 0xa0, 0x5a, 0x15, 0x89, 0xa2, 0x14, 0x0a, 0xff, 0x64, 0x9d, 0x8e, 0x43, 0xab, 0xf1, 0x03, 0x2e, - 0xfc, 0x63, 0x60, 0x2b, 0xb4, 0xd8, 0x23, 0x00, 0x63, 0x36, 0x73, 0x2e, 0xf8, 0xd4, 0xfc, 0x21, - 0x4d, 0xcd, 0xcb, 0xd2, 0xd4, 0x6c, 0x22, 0x92, 0xe6, 0x66, 0xd9, 0x88, 0x7e, 0xb2, 0x87, 0x50, - 0x9d, 0x79, 0x41, 0xa8, 0x9b, 0x53, 0x87, 0xda, 0xdf, 0x94, 0xd7, 0xf6, 0x81, 0x17, 0x84, 0xed, - 0xa9, 0x83, 0xad, 0x80, 0x59, 0xfc, 0x9b, 0xf5, 0xe0, 0x92, 0xe7, 0xea, 0xe6, 0x7c, 0xe6, 0xd8, - 0x63, 0xec, 0x01, 0x83, 0x8e, 0xde, 0x1b, 0x3b, 0x54, 0xe2, 0x4d, 0xa9, 0xc4, 0x81, 0xdb, 0x8e, - 0x88, 0x44, 0xec, 0xda, 0xa6, 0xb7, 0x08, 0x22, 0x3b, 0x93, 0xc6, 0x20, 0x0e, 0xe0, 0x6c, 0x71, - 0xd5, 0x80, 0xa0, 0x51, 0x04, 0xe7, 0x27, 0xb0, 0x91, 0x50, 0x61, 0x03, 0x83, 0x46, 0x5b, 0x9e, - 0xc9, 0x52, 0x44, 0x78, 0x2d, 0x62, 0x44, 0x58, 0x40, 0x7d, 0xe7, 0x39, 0xce, 0x7c, 0x26, 0x44, - 0x69, 0xa3, 0x23, 0xfa, 0x8e, 0x80, 0x5c, 0x4a, 0x4a, 0xa6, 0xb8, 0x35, 0x6d, 0xec, 0xca, 0xa6, - 0xb8, 0x35, 0x45, 0x35, 0x43, 0x44, 0xe7, 0x3e, 0xb3, 0xad, 0xb3, 0xa0, 0xf1, 0x98, 0x22, 0x37, - 0x45, 0xfc, 0xf3, 0x13, 0x04, 0xe1, 0xbe, 0x6f, 0xda, 0x3e, 0x9a, 0x00, 0x14, 0x74, 0xb5, 0xc7, - 0x03, 0x68, 0x39, 0x08, 0x29, 0x58, 0x0b, 0x1a, 0x24, 0xce, 0xc5, 0x5a, 0x4d, 0x9d, 0xc1, 0x75, - 0x97, 0x96, 0xe4, 0x15, 0xa4, 0xe5, 0x47, 0x7c, 0x07, 0xd2, 0x69, 0xdc, 0x0f, 0xe1, 0xd5, 0xd5, - 0x99, 0x44, 0xb7, 0x13, 0x3f, 0x23, 0x7d, 0xe3, 0xfa, 0x0a, 0xee, 0x16, 0x5d, 0x58, 0x54, 0x7f, - 0x96, 0x87, 0x52, 0x64, 0x1a, 0xb1, 0x0a, 0x14, 0x0f, 0xfb, 0x9f, 0xf7, 0x07, 0x4f, 0xfb, 0xfc, - 0x92, 0x5e, 0x73, 0x38, 0xec, 0x68, 0x23, 0xc5, 0x64, 0x75, 0x00, 0xba, 0x86, 0xa3, 0x0f, 0x5b, - 0xcd, 0x3e, 0xbf, 0xb4, 0x47, 0x97, 0x7f, 0x78, 0x7a, 0x9d, 0x6d, 0x42, 0x6d, 0xf7, 0xb0, 0x4f, - 0xf1, 0x82, 0x1c, 0x94, 0x45, 0x50, 0xe7, 0x0b, 0x7e, 0xc2, 0xc9, 0x41, 0x39, 0x04, 0xed, 0x37, - 0x47, 0x1d, 0xad, 0x1b, 0x81, 0xf2, 0x14, 0x7a, 0x38, 0x38, 0xd4, 0x5a, 0x22, 0xa7, 0x02, 0xbb, - 0x02, 0x9b, 0x31, 0x5b, 0x94, 0xa5, 0x52, 0xc4, 0x9a, 0x1d, 0x68, 0x83, 0xcf, 0x3a, 0xad, 0x91, - 0x02, 0x74, 0x5c, 0xfa, 0xf8, 0xb1, 0x52, 0x61, 0x55, 0x28, 0xb5, 0xbb, 0xc3, 0x51, 0xb7, 0xdf, - 0x1a, 0x29, 0x55, 0xac, 0xf0, 0x6e, 0xb7, 0x37, 0xea, 0x68, 0x4a, 0x8d, 0x95, 0x20, 0xf7, 0xd9, - 0xa0, 0xdb, 0x57, 0xea, 0x74, 0x1d, 0xa9, 0xb9, 0x7f, 0xd0, 0xeb, 0x28, 0x1b, 0x08, 0x1d, 0x0e, - 0xb4, 0x91, 0xa2, 0x20, 0xf4, 0x69, 0xb7, 0xdf, 0x1e, 0x3c, 0x55, 0x36, 0x59, 0x19, 0xf2, 0x87, - 0x7d, 0x2c, 0x86, 0xb1, 0x1a, 0x94, 0xe9, 0xa7, 0xde, 0xec, 0xf5, 0x94, 0x4b, 0xd2, 0x19, 0xeb, - 0x65, 0x44, 0xd1, 0x89, 0xed, 0x10, 0xeb, 0x70, 0x05, 0xdb, 0x12, 0x27, 0x89, 0xfa, 0x2a, 0xe6, - 0xb3, 0xdf, 0xed, 0x1f, 0x0e, 0x95, 0x6b, 0x48, 0x4c, 0x3f, 0x09, 0xd3, 0xc0, 0x7c, 0xba, 0x7d, - 0xea, 0xca, 0x5b, 0xf8, 0xbb, 0xdd, 0xe9, 0x75, 0x46, 0x1d, 0xe5, 0x36, 0xb6, 0xaa, 0x37, 0x68, - 0x7d, 0xae, 0x0f, 0x0e, 0x94, 0xd7, 0xb0, 0x4f, 0x0f, 0xb4, 0x8e, 0x2e, 0x08, 0xef, 0x30, 0x05, - 0xaa, 0xbb, 0x87, 0x3f, 0xfe, 0xf1, 0x97, 0xba, 0x68, 0xd4, 0xeb, 0x58, 0x66, 0x42, 0xa1, 0x1f, - 0x7e, 0xae, 0xdc, 0x5b, 0x00, 0x0d, 0x3f, 0x57, 0xde, 0xc0, 0x4e, 0x89, 0x7a, 0x59, 0xd9, 0x46, - 0x02, 0xad, 0xd3, 0x3a, 0xd4, 0x86, 0xdd, 0x27, 0x1d, 0xbd, 0x35, 0xea, 0x28, 0x6f, 0x52, 0x2f, - 0x74, 0xfb, 0x9f, 0x2b, 0xf7, 0xb1, 0x9a, 0xf8, 0x8b, 0xf7, 0xfd, 0x5b, 0x8c, 0x41, 0x3d, 0xa1, - 0x25, 0xd8, 0xdb, 0x48, 0xb2, 0xa3, 0x0d, 0x9a, 0xed, 0x56, 0x73, 0x38, 0x52, 0xde, 0xc1, 0x36, - 0x0e, 0x0f, 0x7a, 0xdd, 0x91, 0xf2, 0x00, 0x1b, 0xf2, 0xb8, 0x39, 0xda, 0xeb, 0x68, 0xca, 0xbb, - 0x38, 0x8c, 0xa3, 0xee, 0x7e, 0x47, 0x17, 0x7d, 0xfa, 0x10, 0xcb, 0xd8, 0xed, 0xf6, 0x7a, 0xca, - 0x23, 0x3a, 0x23, 0x6c, 0x6a, 0xa3, 0x2e, 0x0d, 0xe4, 0x07, 0x98, 0x41, 0xf3, 0xe0, 0xa0, 0xf7, - 0xa5, 0xf2, 0x21, 0x36, 0x70, 0xff, 0xb0, 0x37, 0xea, 0xea, 0x87, 0x07, 0xed, 0xe6, 0xa8, 0xa3, - 0x7c, 0x44, 0xa3, 0x3c, 0x18, 0x8e, 0xda, 0xfb, 0x3d, 0xe5, 0x63, 0xca, 0x93, 0xe6, 0x58, 0xab, - 0x37, 0xe8, 0x77, 0x94, 0x4f, 0xd4, 0x5c, 0x69, 0x4b, 0xd9, 0x52, 0x73, 0x25, 0x55, 0x51, 0xd5, - 0xdf, 0x84, 0x52, 0x64, 0x17, 0x63, 0x96, 0xdd, 0x7e, 0xbf, 0xa3, 0x29, 0x6b, 0x58, 0x6c, 0xaf, - 0xb3, 0x3b, 0x52, 0x32, 0x74, 0x78, 0xda, 0x7d, 0xbc, 0x37, 0x52, 0xd6, 0xf1, 0xe7, 0xe0, 0x10, - 0x7b, 0x30, 0x4b, 0x4d, 0xef, 0xec, 0x77, 0x95, 0x1c, 0xfe, 0x6a, 0xf6, 0x47, 0x5d, 0x25, 0x4f, - 0x13, 0xa4, 0xdb, 0x7f, 0xdc, 0xeb, 0x28, 0x05, 0x84, 0xee, 0x37, 0xb5, 0xcf, 0x95, 0x22, 0xcf, - 0xb4, 0xdd, 0xf9, 0x42, 0x29, 0xb1, 0x02, 0xac, 0xf7, 0x1e, 0x2a, 0x65, 0x04, 0xb5, 0x3b, 0xed, - 0xc3, 0x03, 0x05, 0xd4, 0x6d, 0x28, 0x36, 0x8f, 0x8f, 0xf7, 0x3d, 0x93, 0xce, 0x6b, 0x77, 0x0f, - 0x7b, 0x3d, 0xbe, 0x60, 0x76, 0x06, 0xa3, 0xd1, 0x60, 0x5f, 0xc9, 0xe0, 0x14, 0x1d, 0x0d, 0x0e, - 0x94, 0x75, 0xb5, 0x0b, 0xa5, 0x48, 0x03, 0x90, 0xee, 0xd2, 0x95, 0x20, 0x77, 0xa0, 0x75, 0x9e, - 0xf0, 0x13, 0xff, 0x7e, 0xe7, 0x0b, 0xac, 0x26, 0xfe, 0xc2, 0x8c, 0xb2, 0x58, 0x10, 0xbf, 0xf4, - 0x46, 0x97, 0xe9, 0x7a, 0xdd, 0x7e, 0xa7, 0xa9, 0x29, 0x79, 0xf5, 0x43, 0xd8, 0x5c, 0x92, 0x9f, - 0x54, 0x7c, 0xb3, 0x2b, 0x8a, 0xef, 0x3e, 0xee, 0x0f, 0xb4, 0x0e, 0xbf, 0x9d, 0x27, 0x3a, 0x75, - 0x5d, 0x7d, 0x0b, 0xca, 0xb1, 0xa0, 0xc7, 0x49, 0xd6, 0xd2, 0x06, 0xc3, 0x21, 0x1f, 0x83, 0x35, - 0x4c, 0x53, 0xdf, 0xf0, 0x74, 0xe6, 0xb3, 0x5c, 0xe9, 0xb6, 0xb2, 0xf5, 0x59, 0xae, 0x74, 0x57, - 0x79, 0x5d, 0x1d, 0xc2, 0x66, 0xb4, 0xdf, 0xd0, 0xcd, 0x00, 0x32, 0x84, 0x2e, 0x43, 0xbe, 0x67, - 0x3d, 0xb3, 0x9c, 0x28, 0xc4, 0x9d, 0x12, 0x08, 0x1d, 0x1c, 0x7d, 0xd5, 0x8d, 0x2f, 0x53, 0x53, - 0x02, 0x15, 0xcc, 0xbe, 0x74, 0x9f, 0x9b, 0xae, 0x2b, 0xfe, 0x95, 0x0c, 0x94, 0xe2, 0x5d, 0xec, - 0x2e, 0xac, 0x8f, 0x86, 0xe2, 0xc8, 0xea, 0xf2, 0x83, 0xe4, 0xf9, 0x8a, 0x51, 0xf4, 0x4b, 0x5b, - 0x1f, 0x0d, 0xd9, 0xdb, 0x50, 0xe0, 0xd7, 0x4f, 0x85, 0xbb, 0xea, 0x72, 0x7a, 0x67, 0x1c, 0x11, - 0x4e, 0x13, 0x34, 0xec, 0x43, 0x28, 0xc7, 0xb5, 0x15, 0xfe, 0x9b, 0x6b, 0x69, 0x86, 0x18, 0xad, - 0x25, 0x94, 0x6a, 0x0f, 0xea, 0xe9, 0x0c, 0xd9, 0x2d, 0x00, 0x9e, 0xa5, 0xe4, 0xa4, 0x94, 0x20, - 0xec, 0x06, 0x44, 0xb7, 0x62, 0xdb, 0x54, 0xb1, 0x5a, 0x7c, 0x4b, 0xb6, 0xad, 0xfe, 0xab, 0x2c, - 0x40, 0xa2, 0x07, 0x63, 0x47, 0xc4, 0x5e, 0xa9, 0xbc, 0x38, 0x93, 0x7f, 0x05, 0xca, 0x8e, 0x67, - 0x98, 0xf2, 0xeb, 0x15, 0x25, 0x04, 0xd0, 0x30, 0xc9, 0x37, 0xc4, 0xca, 0x3c, 0x20, 0x86, 0x5d, - 0x85, 0xc2, 0xc4, 0xf3, 0xa7, 0x46, 0x28, 0xee, 0x33, 0x88, 0x14, 0x6e, 0x67, 0xf6, 0xb1, 0xeb, - 0xf9, 0x16, 0x5a, 0x03, 0x2e, 0x5d, 0x69, 0xc0, 0x31, 0xa8, 0x0a, 0x60, 0x0f, 0x61, 0xb8, 0x1d, - 0x59, 0xee, 0xd8, 0xf1, 0x02, 0xcb, 0xc4, 0x0d, 0xa6, 0x40, 0x2a, 0x3f, 0x44, 0xa0, 0x9d, 0x0b, - 0xde, 0x5a, 0x7f, 0x6a, 0xbb, 0x46, 0x28, 0x8e, 0xa9, 0xa8, 0xb5, 0x11, 0x04, 0xab, 0xfb, 0x55, - 0xe0, 0x09, 0x27, 0x15, 0xbf, 0x0e, 0x55, 0x42, 0x00, 0x55, 0xf7, 0x55, 0x00, 0x2b, 0x18, 0x1b, - 0x33, 0x9e, 0x79, 0x99, 0x32, 0x2f, 0x0b, 0xc8, 0xce, 0x05, 0xeb, 0x41, 0x7d, 0x74, 0x84, 0xdb, - 0xaf, 0xd7, 0x36, 0x42, 0xa3, 0xe5, 0x39, 0xc2, 0x7d, 0x74, 0x77, 0xd1, 0x60, 0x78, 0x90, 0x26, - 0xe3, 0x11, 0x9f, 0x0b, 0xbc, 0x68, 0xc0, 0xdb, 0x63, 0xeb, 0xc8, 0xf2, 0x8f, 0xb9, 0xf1, 0x51, - 0x49, 0x5d, 0x44, 0xe0, 0x18, 0xb2, 0x3e, 0x2a, 0x76, 0x92, 0xb8, 0xd1, 0x84, 0x4b, 0x2b, 0x32, - 0xff, 0x56, 0xa1, 0x85, 0xff, 0x6c, 0x1d, 0x2a, 0x52, 0xfe, 0x74, 0x4e, 0x60, 0xcc, 0xc8, 0xcf, - 0x15, 0xc7, 0x4c, 0x97, 0x05, 0x84, 0x5f, 0xfb, 0x18, 0x1b, 0xa1, 0xe1, 0x78, 0xc7, 0xd2, 0x85, - 0x16, 0x01, 0xe9, 0x9a, 0x74, 0x74, 0x67, 0x4c, 0xad, 0x60, 0x66, 0x8c, 0xa3, 0x15, 0x92, 0x00, - 0x92, 0x67, 0x53, 0x72, 0xf2, 0xb3, 0x29, 0x0a, 0x3f, 0xe3, 0xe5, 0x41, 0x32, 0x74, 0xa4, 0x7b, - 0x1b, 0x2a, 0x91, 0xde, 0x88, 0xa5, 0x88, 0x63, 0xc8, 0x08, 0xd4, 0x35, 0xd9, 0x3d, 0x48, 0x9e, - 0x85, 0xd1, 0x8d, 0x40, 0xf7, 0x26, 0x51, 0x84, 0x5e, 0x0c, 0x6e, 0x06, 0x83, 0x49, 0x7c, 0x36, - 0x30, 0xf5, 0xcc, 0x78, 0x7c, 0x11, 0x40, 0x32, 0xee, 0x01, 0x5c, 0x12, 0x0e, 0x4b, 0xcb, 0xd4, - 0x27, 0xb6, 0xe5, 0x98, 0xba, 0x6d, 0xf2, 0x13, 0xf4, 0xbc, 0xb6, 0x19, 0xa3, 0x76, 0x11, 0xd3, - 0x35, 0x49, 0xc3, 0x12, 0x56, 0xaa, 0x69, 0x1f, 0x5b, 0x41, 0x28, 0xe2, 0xc9, 0xaa, 0x1c, 0xd8, - 0x26, 0x98, 0xea, 0x44, 0x4b, 0xa4, 0x19, 0x86, 0x74, 0xe5, 0x2c, 0x56, 0xf7, 0x32, 0xd1, 0x6d, - 0x14, 0xae, 0xe9, 0xbd, 0x42, 0xb1, 0x58, 0x22, 0x50, 0x58, 0xac, 0x94, 0x38, 0x00, 0xf8, 0x1e, - 0x6c, 0x20, 0x52, 0x54, 0x8a, 0x48, 0xf8, 0x35, 0xa4, 0xda, 0xd8, 0x73, 0x78, 0x85, 0x10, 0xa8, - 0xfe, 0xd5, 0x3c, 0x40, 0x62, 0xe8, 0xd3, 0x0d, 0x37, 0xf2, 0xc0, 0xc5, 0x23, 0x57, 0xa4, 0x74, - 0xd7, 0x64, 0x0f, 0xe1, 0xaa, 0xb8, 0x4f, 0x17, 0x07, 0x79, 0xd8, 0xae, 0x7e, 0x64, 0x44, 0x41, - 0x65, 0x4c, 0x60, 0xf9, 0xf1, 0x7d, 0xd7, 0xdd, 0x31, 0xd0, 0x6c, 0xd8, 0x90, 0x79, 0xc2, 0x8b, - 0x59, 0xda, 0xe3, 0x2f, 0x2b, 0xa3, 0x09, 0xfb, 0xe8, 0x62, 0xc6, 0xde, 0x83, 0x2b, 0xbe, 0x35, - 0xf1, 0xad, 0xe0, 0x44, 0x0f, 0x03, 0xb9, 0x30, 0x1e, 0xf5, 0xb9, 0x29, 0x90, 0xa3, 0x20, 0x2e, - 0xeb, 0x3d, 0xb8, 0x22, 0x3a, 0x77, 0xa1, 0x7a, 0xdc, 0x93, 0xbe, 0xc9, 0x91, 0x72, 0xed, 0x28, - 0xc4, 0x97, 0xbc, 0x1f, 0xd1, 0x43, 0x3c, 0x25, 0xad, 0xcc, 0x3d, 0x1d, 0xe2, 0x7a, 0x3a, 0xb9, - 0x30, 0x68, 0xe1, 0x96, 0x34, 0x9e, 0x60, 0x2a, 0xe4, 0x70, 0xec, 0x69, 0xe8, 0xea, 0x0f, 0xeb, - 0x0f, 0xe8, 0xa1, 0x21, 0x7a, 0x2e, 0xc0, 0x33, 0x2d, 0x8d, 0x70, 0xec, 0x1d, 0x9c, 0x17, 0x49, - 0xb3, 0xa3, 0xb7, 0x32, 0x78, 0x9c, 0x83, 0x92, 0x34, 0x54, 0xe3, 0xaf, 0x66, 0xbc, 0x05, 0x4c, - 0xaa, 0x79, 0x44, 0x5d, 0x25, 0xea, 0x8d, 0xb8, 0xda, 0x82, 0xf8, 0x0d, 0xa0, 0x2a, 0xf2, 0x63, - 0xb4, 0xda, 0xb2, 0xbd, 0x8f, 0x48, 0x3a, 0x51, 0x7b, 0x0f, 0xae, 0x24, 0xad, 0xd3, 0x8d, 0x50, - 0x0f, 0x4f, 0x2c, 0xdd, 0x72, 0x4d, 0xba, 0x04, 0x59, 0xd2, 0x36, 0xe3, 0x86, 0x36, 0xc3, 0xd1, - 0x89, 0x85, 0x16, 0xbb, 0xe4, 0x51, 0xdd, 0x78, 0xb1, 0x47, 0xf5, 0x23, 0x68, 0xa4, 0x75, 0x6a, - 0xa9, 0xbb, 0xf9, 0x25, 0xe2, 0xcb, 0x72, 0xac, 0x48, 0xdc, 0xe3, 0xf7, 0x61, 0xf3, 0xc4, 0x08, - 0xd2, 0xfa, 0x38, 0x39, 0x7a, 0x4b, 0xda, 0xc6, 0x89, 0x11, 0xc8, 0x4a, 0xb8, 0xfa, 0xfb, 0x19, - 0xa8, 0xa7, 0x5d, 0x1f, 0xfc, 0x66, 0x96, 0x33, 0x9f, 0xba, 0x3c, 0xe0, 0x31, 0xaf, 0x45, 0x49, - 0x5c, 0x0b, 0x3c, 0xa0, 0x64, 0x3e, 0x75, 0xa3, 0xb5, 0x30, 0x3b, 0x6d, 0x51, 0x9a, 0xbd, 0x09, - 0xc5, 0xd9, 0x29, 0x97, 0xd0, 0xcf, 0x9b, 0x7d, 0x85, 0x19, 0x0f, 0x70, 0x7f, 0x13, 0x8a, 0x73, - 0x41, 0x9a, 0x7b, 0x1e, 0xe9, 0x9c, 0x48, 0xd5, 0x7f, 0xbe, 0x0e, 0x55, 0xd9, 0x63, 0xf7, 0x4d, - 0x22, 0x4d, 0xbe, 0x55, 0x10, 0xd0, 0x16, 0xc5, 0xaa, 0xea, 0x14, 0x4d, 0x8f, 0xfd, 0xc4, 0xc3, - 0x4c, 0xe0, 0xc4, 0x08, 0x9a, 0xf3, 0xd0, 0x43, 0x91, 0x8f, 0xa2, 0xd4, 0x73, 0xa2, 0x28, 0x7b, - 0xbe, 0x32, 0x50, 0x26, 0x88, 0x00, 0xfb, 0xf7, 0xc4, 0x25, 0x1e, 0xba, 0xb6, 0x47, 0x61, 0x9d, - 0xf9, 0xa5, 0xf9, 0x52, 0x8d, 0x6e, 0xed, 0x51, 0x18, 0xeb, 0x43, 0xd8, 0x48, 0xae, 0x4c, 0x70, - 0x96, 0xc2, 0x12, 0x4b, 0x2d, 0xbe, 0x2f, 0x21, 0x9e, 0x14, 0xa8, 0xd9, 0x81, 0xee, 0x39, 0x66, - 0x74, 0x37, 0xab, 0x18, 0x9d, 0xa7, 0x0c, 0x1c, 0x53, 0xdc, 0x15, 0xe5, 0x34, 0xae, 0x75, 0x16, - 0xd1, 0xc4, 0x67, 0x2e, 0x7d, 0xeb, 0x4c, 0xdc, 0xd1, 0xfa, 0xf3, 0x0c, 0x6c, 0x2e, 0x39, 0xe9, - 0x50, 0xb4, 0x27, 0x0f, 0x5c, 0xe1, 0x4f, 0x34, 0x32, 0xa7, 0x46, 0x38, 0x3e, 0xd1, 0x67, 0xbe, - 0x35, 0xb1, 0xcf, 0xa3, 0x57, 0xba, 0x08, 0x76, 0x40, 0x20, 0x94, 0xfe, 0xfc, 0xdc, 0x90, 0x1f, - 0x63, 0x70, 0xc1, 0xc7, 0xcf, 0x0a, 0x7b, 0x74, 0x7e, 0x11, 0x85, 0xb9, 0xe6, 0x9e, 0x13, 0xe6, - 0x7a, 0x03, 0xca, 0xae, 0x47, 0x21, 0x4d, 0xb3, 0x53, 0x11, 0x0b, 0x56, 0x74, 0xbd, 0x70, 0xe0, - 0x1e, 0x9c, 0xb2, 0x87, 0x70, 0x65, 0x1e, 0x50, 0xdc, 0xc0, 0x91, 0xe5, 0x07, 0x27, 0x76, 0x6c, - 0x2e, 0x73, 0x01, 0x72, 0x69, 0x1e, 0x58, 0xfb, 0x31, 0x8e, 0xb7, 0x44, 0xbd, 0x09, 0x85, 0x6e, - 0xec, 0x5c, 0x8c, 0xe3, 0xea, 0xb2, 0xe2, 0x69, 0x1b, 0x0f, 0xca, 0xdc, 0xea, 0xdc, 0x37, 0x66, - 0xec, 0x3e, 0x64, 0xa7, 0xc6, 0x4c, 0x1c, 0x56, 0x36, 0xe2, 0x13, 0x5d, 0x8e, 0x7d, 0xb0, 0x6f, - 0xcc, 0xf8, 0xee, 0x8f, 0x44, 0x37, 0x3e, 0x82, 0x52, 0x04, 0xf8, 0x56, 0x3b, 0xf6, 0xbf, 0x5d, - 0x87, 0x72, 0x5b, 0x3e, 0x1c, 0x18, 0x1b, 0xae, 0x1e, 0xfa, 0x73, 0x17, 0x15, 0xe8, 0xe8, 0xc1, - 0x8f, 0xb1, 0xe1, 0x8e, 0x04, 0x28, 0x9a, 0xda, 0xeb, 0x2f, 0x98, 0xda, 0x37, 0x01, 0x7c, 0xf2, - 0xad, 0x91, 0x7b, 0x2d, 0x1b, 0xc7, 0x19, 0x77, 0xcd, 0xae, 0x79, 0xbe, 0x3a, 0xc4, 0x2a, 0xf7, - 0xcd, 0x43, 0xac, 0xf2, 0x2b, 0x43, 0xac, 0xee, 0x25, 0xdb, 0x0b, 0x4e, 0x71, 0x2c, 0xb8, 0xcc, - 0x37, 0xb9, 0x59, 0x7c, 0x65, 0x09, 0x4b, 0xff, 0x1e, 0xd4, 0xa3, 0xd6, 0x89, 0xfc, 0x20, 0x75, - 0x4b, 0x4a, 0xe0, 0xf8, 0x69, 0x42, 0x2d, 0x94, 0x93, 0xe9, 0x25, 0x5b, 0x79, 0x49, 0x18, 0xd7, - 0x5f, 0xcf, 0x00, 0x13, 0xbe, 0xa0, 0xdd, 0xb9, 0xe3, 0x8c, 0xac, 0x73, 0x92, 0x0c, 0xf7, 0x61, - 0x53, 0x1c, 0x76, 0x48, 0xb7, 0x53, 0xc5, 0xf1, 0x3e, 0x47, 0x24, 0xc7, 0xfb, 0xab, 0x2e, 0xb2, - 0xae, 0xaf, 0xbc, 0xc8, 0xba, 0xfa, 0x82, 0xec, 0x6d, 0xa8, 0xc8, 0xd7, 0x40, 0xb9, 0x9e, 0x04, - 0x46, 0x72, 0x03, 0xf4, 0xcf, 0xd7, 0x01, 0x12, 0x7f, 0xd5, 0x2f, 0x3b, 0x3e, 0x6e, 0xc5, 0x90, - 0x64, 0x57, 0x0d, 0xc9, 0x36, 0x28, 0x32, 0x9d, 0x74, 0x1f, 0xb9, 0x9e, 0x10, 0x46, 0x6a, 0x8e, - 0x1d, 0xc8, 0x77, 0x46, 0xe9, 0xfa, 0x89, 0x08, 0x29, 0xe2, 0x48, 0xee, 0x3c, 0x17, 0x0b, 0xb0, - 0x64, 0x07, 0x5c, 0x26, 0xb3, 0x4f, 0xe1, 0x7a, 0xcc, 0xa9, 0x9f, 0xd9, 0xe1, 0x89, 0x37, 0x0f, - 0xc5, 0x62, 0x0d, 0x84, 0x94, 0xba, 0x1a, 0xe5, 0xf4, 0x94, 0xa3, 0xf9, 0x7a, 0x0d, 0xd0, 0x5a, - 0x9a, 0xcc, 0x1d, 0x47, 0x0f, 0xad, 0xf3, 0x50, 0xbc, 0x21, 0xd2, 0x48, 0xb9, 0xfa, 0xa4, 0xe1, - 0xd5, 0x4a, 0x13, 0x91, 0x50, 0xff, 0x67, 0x16, 0xf2, 0x3f, 0x9a, 0x5b, 0xfe, 0x05, 0xfb, 0x08, - 0xca, 0x41, 0x38, 0x0d, 0xe5, 0x53, 0xf7, 0xeb, 0x3c, 0x03, 0xc2, 0xd3, 0xa1, 0xb9, 0x35, 0xb5, - 0xdc, 0x90, 0xfb, 0xc0, 0x91, 0x96, 0x36, 0xa0, 0xcb, 0x90, 0x0f, 0x42, 0x6b, 0x16, 0x88, 0xd8, - 0x59, 0x9e, 0x60, 0x5b, 0x90, 0x77, 0x3d, 0xd3, 0x0a, 0xd2, 0x11, 0xb2, 0x7d, 0xd4, 0x38, 0x38, - 0x82, 0xa9, 0x50, 0x88, 0x47, 0x7c, 0xe9, 0xe4, 0x9b, 0x63, 0xe8, 0xde, 0x8d, 0x65, 0x98, 0xb6, - 0x7b, 0x1c, 0xdd, 0xef, 0x8e, 0xd3, 0xb8, 0xb5, 0x92, 0x95, 0x65, 0x1c, 0x47, 0xef, 0x42, 0x88, - 0x24, 0xdb, 0x82, 0x0a, 0xfe, 0x7c, 0xea, 0xdb, 0xa1, 0x35, 0x7c, 0x14, 0x49, 0x77, 0x09, 0x84, - 0x36, 0x92, 0x69, 0x85, 0xd6, 0x38, 0x1c, 0x7e, 0x2d, 0xe2, 0x4e, 0xcb, 0x9a, 0x04, 0x61, 0xdf, - 0x03, 0x76, 0x64, 0x8c, 0x4f, 0x8f, 0x7d, 0x8a, 0x16, 0xf9, 0x7a, 0x6e, 0xf9, 0xb6, 0x15, 0xc5, - 0x99, 0x56, 0xa4, 0x4e, 0xd1, 0x36, 0x13, 0xb2, 0x1f, 0x71, 0x2a, 0xb4, 0xee, 0xa6, 0xc6, 0x79, - 0xdb, 0x9b, 0x89, 0x30, 0x3e, 0x91, 0x62, 0x8f, 0xe0, 0x2a, 0x6e, 0x8e, 0xd1, 0x85, 0x63, 0x9c, - 0x43, 0xc2, 0xbb, 0xca, 0x1f, 0x71, 0xba, 0x74, 0x62, 0x04, 0xc9, 0x1d, 0x43, 0xee, 0x14, 0x50, - 0x7f, 0x03, 0x6a, 0xa9, 0x7e, 0x5f, 0x72, 0xec, 0x0d, 0x3b, 0xbd, 0x4e, 0x6b, 0xc4, 0x1d, 0x05, - 0xc2, 0xe1, 0xb4, 0x2e, 0x79, 0xa6, 0x72, 0x92, 0x03, 0x21, 0x4f, 0x7e, 0xad, 0x8e, 0xf6, 0xb8, - 0xa3, 0x14, 0xd4, 0x5c, 0x29, 0xab, 0x64, 0xd5, 0xbf, 0xb1, 0x0e, 0x9b, 0x23, 0xdf, 0x70, 0x03, - 0x83, 0xeb, 0x30, 0x6e, 0xe8, 0x7b, 0x0e, 0xfb, 0x1e, 0x94, 0xc2, 0xb1, 0x23, 0x4f, 0x84, 0xdb, - 0x91, 0xd8, 0x59, 0x20, 0x7d, 0x30, 0x1a, 0xf3, 0x23, 0x91, 0x62, 0xc8, 0x7f, 0xb0, 0x77, 0x20, - 0x7f, 0x64, 0x1d, 0xdb, 0xae, 0x90, 0xbc, 0x57, 0x16, 0x19, 0x77, 0x10, 0xb9, 0xb7, 0xa6, 0x71, - 0x2a, 0xf6, 0x1e, 0x14, 0xc6, 0xde, 0x34, 0xda, 0xf2, 0x92, 0xdb, 0x86, 0x52, 0x41, 0x88, 0xdd, - 0x5b, 0xd3, 0x04, 0x1d, 0xfb, 0x08, 0x4a, 0xbe, 0xe7, 0x38, 0xd8, 0xef, 0x62, 0x33, 0x6c, 0x2c, - 0xf2, 0x68, 0x02, 0xbf, 0xb7, 0xa6, 0xc5, 0xb4, 0xea, 0x03, 0x28, 0x8a, 0xca, 0x62, 0x37, 0xec, - 0x74, 0x1e, 0x77, 0x45, 0x0f, 0xb6, 0x06, 0xfb, 0xfb, 0xdd, 0x11, 0xbf, 0x4a, 0xad, 0x0d, 0x7a, - 0xbd, 0x9d, 0x66, 0xeb, 0x73, 0x65, 0x7d, 0xa7, 0x04, 0x05, 0x3e, 0x3c, 0xea, 0x6f, 0x65, 0x60, - 0x63, 0xa1, 0x01, 0xec, 0x13, 0xc8, 0x91, 0x7d, 0xc5, 0xbb, 0xe7, 0xee, 0xca, 0x56, 0x4a, 0x69, - 0xae, 0x69, 0x23, 0x87, 0xfa, 0x29, 0xd4, 0xd3, 0x70, 0xc9, 0x99, 0x54, 0x83, 0xb2, 0xd6, 0x69, - 0xb6, 0xf5, 0x41, 0xbf, 0xf7, 0x25, 0xf7, 0xcd, 0x52, 0xf2, 0xa9, 0xd6, 0x25, 0xff, 0xcf, 0xaf, - 0x83, 0xb2, 0xd8, 0x31, 0xec, 0x31, 0x5a, 0x4d, 0xd3, 0x99, 0x63, 0x91, 0x72, 0x2a, 0x0d, 0xd9, - 0xad, 0x15, 0x3d, 0x29, 0xc8, 0x78, 0x98, 0xd3, 0x38, 0x95, 0x56, 0x7f, 0x03, 0xd8, 0x72, 0x0f, - 0xfe, 0xf2, 0xb2, 0xff, 0x1f, 0x19, 0xc8, 0x1d, 0x38, 0x86, 0xcb, 0xee, 0x40, 0x9e, 0x5e, 0x2b, - 0x12, 0xf2, 0x5b, 0x5e, 0x4d, 0x38, 0x2d, 0x08, 0xc7, 0xde, 0x82, 0x6c, 0x38, 0x8e, 0x6e, 0x70, - 0x5f, 0x7b, 0xce, 0xe4, 0xdb, 0x5b, 0xd3, 0x90, 0x8a, 0x6d, 0x43, 0xd6, 0x34, 0xa3, 0x5b, 0x0f, - 0xc2, 0xa5, 0xd4, 0x36, 0x42, 0xa3, 0x6d, 0x4d, 0x6c, 0xd7, 0x16, 0xaf, 0x2b, 0x21, 0x09, 0x7b, - 0x1d, 0xb2, 0xe6, 0xd8, 0x49, 0x5f, 0x61, 0xe1, 0x4e, 0x84, 0x38, 0x43, 0x73, 0xec, 0xa0, 0xee, - 0x17, 0xfa, 0x17, 0xba, 0x3f, 0x77, 0x29, 0x5e, 0x36, 0x10, 0xf6, 0x58, 0x05, 0xb5, 0x98, 0x39, - 0x05, 0xdd, 0x06, 0xe2, 0x2a, 0xe8, 0xcc, 0xb7, 0x66, 0x86, 0x1f, 0x5b, 0x62, 0x76, 0x70, 0xc0, - 0x01, 0x3b, 0x05, 0xa0, 0x47, 0x60, 0xd5, 0xb7, 0xe9, 0x29, 0x1d, 0x54, 0xe9, 0xd5, 0xe8, 0xd7, - 0x8a, 0xf7, 0x02, 0x05, 0x46, 0xfd, 0x8b, 0x2c, 0x54, 0xa4, 0xfa, 0xb0, 0x0f, 0xa0, 0x64, 0xa6, - 0x17, 0xe2, 0xf5, 0xa5, 0x4a, 0x3f, 0x68, 0x47, 0x4b, 0xd0, 0x14, 0xd3, 0x9b, 0xce, 0xdb, 0x42, - 0xfd, 0x99, 0xe1, 0xdb, 0xfc, 0x01, 0xb5, 0x75, 0xf9, 0xe0, 0x6b, 0x68, 0x85, 0x4f, 0x22, 0xcc, - 0xde, 0x9a, 0x56, 0x0d, 0xa4, 0x34, 0xd9, 0x1d, 0xa2, 0x49, 0xd9, 0xd4, 0x43, 0x74, 0x1c, 0xb8, - 0xb7, 0xa6, 0x45, 0x78, 0x24, 0xb5, 0xce, 0xad, 0xf1, 0x3c, 0x8c, 0xec, 0x8e, 0x5a, 0xd4, 0x20, - 0x02, 0xd2, 0x6b, 0x98, 0xfc, 0x27, 0x7b, 0x88, 0xd2, 0xd6, 0x70, 0x1c, 0x8f, 0x94, 0xb5, 0xbc, - 0x7c, 0x0c, 0xd5, 0x8e, 0xe1, 0xfc, 0xf5, 0xcd, 0x28, 0xc5, 0xee, 0x41, 0xde, 0x0b, 0x4f, 0xac, - 0x48, 0x9b, 0x8f, 0x1e, 0xe5, 0x41, 0x50, 0xbb, 0xd5, 0xc3, 0x99, 0x42, 0x68, 0xf5, 0x0f, 0x32, - 0x50, 0x14, 0x3d, 0xc0, 0x36, 0xa1, 0x36, 0xec, 0x8c, 0xf4, 0x27, 0x4d, 0xad, 0xdb, 0xdc, 0xe9, - 0x75, 0xc4, 0xcd, 0x9b, 0xc7, 0x5a, 0xb3, 0x2f, 0x04, 0xa4, 0xd6, 0x79, 0x32, 0xf8, 0xbc, 0xc3, - 0x3d, 0xb4, 0xed, 0x4e, 0xff, 0x4b, 0x25, 0xcb, 0x8f, 0x23, 0x3a, 0x07, 0x4d, 0x0d, 0x65, 0x65, - 0x05, 0x8a, 0x9d, 0x2f, 0x3a, 0xad, 0x43, 0x12, 0x96, 0x75, 0x80, 0x76, 0xa7, 0xd9, 0xeb, 0x0d, - 0x5a, 0x28, 0x3c, 0x0b, 0x8c, 0x41, 0xbd, 0xa5, 0x75, 0x9a, 0xa3, 0x8e, 0xde, 0x6c, 0xb5, 0x06, - 0x87, 0xfd, 0x91, 0x52, 0xc4, 0x12, 0x9b, 0xbd, 0x51, 0x47, 0x8b, 0x41, 0xf4, 0x50, 0x5a, 0x5b, - 0x1b, 0x1c, 0xc4, 0x90, 0xf2, 0x4e, 0x19, 0x6d, 0x40, 0x1a, 0x2b, 0xf5, 0x8f, 0x36, 0xa1, 0x9e, - 0x9e, 0x9a, 0xec, 0x63, 0x28, 0x99, 0x66, 0x6a, 0x8c, 0x6f, 0xae, 0x9a, 0xc2, 0x0f, 0xda, 0x66, - 0x34, 0xcc, 0xfc, 0x07, 0x7b, 0x2d, 0x5a, 0x48, 0xeb, 0x4b, 0x0b, 0x29, 0x5a, 0x46, 0x3f, 0x80, - 0x0d, 0xf1, 0x52, 0x8c, 0x69, 0x84, 0xc6, 0x91, 0x11, 0x58, 0xe9, 0x55, 0xd2, 0x22, 0x64, 0x5b, - 0xe0, 0xf6, 0xd6, 0xb4, 0xfa, 0x38, 0x05, 0x61, 0xdf, 0x87, 0xba, 0xc1, 0xbd, 0x3f, 0x11, 0x7f, - 0x4e, 0x56, 0x43, 0x9b, 0xe4, 0x04, 0x4a, 0xd8, 0x6b, 0x86, 0x0c, 0xc0, 0x89, 0x68, 0xfa, 0xde, - 0x2c, 0x61, 0xce, 0xa7, 0x4e, 0x60, 0x7d, 0x6f, 0x26, 0xf1, 0x56, 0x4d, 0x29, 0xcd, 0x3e, 0x82, - 0xaa, 0xa8, 0x79, 0xe2, 0xea, 0x88, 0x97, 0x2c, 0xaf, 0x36, 0xa9, 0x95, 0x7b, 0x6b, 0x5a, 0x65, - 0x9c, 0x24, 0xd9, 0x23, 0xd4, 0x25, 0x13, 0x25, 0xbc, 0x28, 0xcf, 0x35, 0xaa, 0x6d, 0xc4, 0x05, - 0x46, 0x9c, 0x62, 0xef, 0x01, 0x50, 0x3d, 0x39, 0x4f, 0x29, 0x15, 0x9b, 0xe4, 0x7b, 0xb3, 0x88, - 0xa5, 0x6c, 0x46, 0x09, 0xa9, 0x7a, 0xdc, 0x51, 0x55, 0x5e, 0xae, 0x1e, 0x39, 0xab, 0x92, 0xea, - 0x71, 0x1f, 0x57, 0x5c, 0x3d, 0xce, 0x06, 0x4b, 0xd5, 0x8b, 0xb8, 0x78, 0xf5, 0x38, 0x53, 0x54, - 0x3d, 0xce, 0x53, 0x59, 0xac, 0x5e, 0xc4, 0x42, 0xd5, 0xe3, 0x1c, 0xdf, 0x5f, 0xb2, 0x1e, 0xaa, - 0xcf, 0xb5, 0x1e, 0x70, 0xd8, 0xd2, 0xf6, 0xc3, 0xf7, 0xa1, 0x1e, 0x9c, 0x78, 0x67, 0x92, 0x00, - 0xa9, 0xc9, 0xdc, 0xc3, 0x13, 0xef, 0x4c, 0x96, 0x20, 0xb5, 0x40, 0x06, 0x60, 0x6d, 0x79, 0x13, - 0xe9, 0xb4, 0xb4, 0x2e, 0xd7, 0x96, 0x5a, 0xf8, 0xc4, 0xb6, 0xce, 0xb0, 0xb6, 0x46, 0x94, 0xc0, - 0x4e, 0x49, 0xdc, 0x3e, 0x81, 0x70, 0xe4, 0xa4, 0x22, 0x7a, 0x44, 0x49, 0x10, 0x3b, 0x80, 0x02, - 0x9c, 0x5b, 0x73, 0x57, 0x66, 0x53, 0xe4, 0xb9, 0x75, 0xe8, 0xa6, 0x18, 0xab, 0x9c, 0x54, 0xb0, - 0x26, 0xab, 0x22, 0xb0, 0xbe, 0x9e, 0x5b, 0xee, 0xd8, 0x12, 0x91, 0x7b, 0xa9, 0x55, 0x31, 0x14, - 0xb8, 0x64, 0x55, 0x44, 0x90, 0x78, 0x5e, 0xc7, 0xec, 0x6c, 0x71, 0x5e, 0x4b, 0xcc, 0x34, 0xaf, - 0x63, 0xd6, 0x78, 0x41, 0xc5, 0xbc, 0x97, 0x96, 0x16, 0x94, 0xc4, 0xcc, 0x17, 0x54, 0xcc, 0xfd, - 0x08, 0xc4, 0x6c, 0xe2, 0x9d, 0x9b, 0x8a, 0xef, 0xe3, 0xb5, 0x16, 0xbd, 0x0b, 0xe3, 0x38, 0x85, - 0x73, 0xd5, 0xb7, 0xd0, 0x5a, 0x11, 0x53, 0xe1, 0x8a, 0x3c, 0x57, 0x35, 0xc2, 0xc4, 0x4b, 0xc9, - 0x4f, 0x92, 0x52, 0x61, 0x33, 0x3b, 0xf4, 0x1b, 0xe6, 0x72, 0x61, 0x07, 0x76, 0xe8, 0x27, 0x85, - 0x61, 0x8a, 0xbd, 0x03, 0x34, 0x0d, 0x39, 0x8b, 0x25, 0x8b, 0x6e, 0xec, 0x16, 0xc1, 0x50, 0x32, - 0xc5, 0x6f, 0x9c, 0x2c, 0xa2, 0x8c, 0xb1, 0x39, 0x6e, 0x4c, 0xe4, 0xc9, 0xc2, 0x8b, 0x68, 0xb5, - 0x5b, 0x38, 0x59, 0x38, 0x51, 0xcb, 0x1c, 0xb3, 0xfb, 0x40, 0xdc, 0x44, 0x7f, 0x9c, 0x7a, 0xf4, - 0xcd, 0xf7, 0x66, 0x9c, 0xba, 0x88, 0x04, 0x48, 0x8b, 0x2d, 0x70, 0x3c, 0x37, 0x6a, 0xf8, 0x49, - 0xaa, 0x05, 0x88, 0x88, 0x85, 0xc1, 0x38, 0x4e, 0xa9, 0xbf, 0x53, 0x80, 0xa2, 0x90, 0xb5, 0xec, - 0x12, 0x6c, 0x08, 0x91, 0xdf, 0x6e, 0x8e, 0x9a, 0x3b, 0xcd, 0x21, 0x2a, 0x69, 0x0c, 0xea, 0x5c, - 0xe6, 0xc7, 0xb0, 0x0c, 0xee, 0x03, 0x24, 0xf4, 0x63, 0xd0, 0x3a, 0xee, 0x03, 0x82, 0x97, 0x3f, - 0xae, 0x99, 0x65, 0x1b, 0x50, 0xe1, 0x8c, 0x1c, 0x40, 0x17, 0x81, 0x89, 0x8b, 0xa7, 0xf3, 0x12, - 0x0b, 0x3f, 0xb0, 0x2c, 0x24, 0x2c, 0x1c, 0x50, 0x8c, 0x59, 0xa2, 0x13, 0x4d, 0x06, 0xf5, 0x91, - 0x76, 0xd8, 0x6f, 0x25, 0xe5, 0x94, 0xe9, 0xf2, 0x26, 0xcf, 0xe6, 0x49, 0xb7, 0xf3, 0x54, 0x01, - 0x64, 0xe2, 0xb9, 0x50, 0xba, 0x82, 0x6a, 0x26, 0x65, 0x42, 0xc9, 0x2a, 0xbb, 0x06, 0x97, 0x86, - 0x7b, 0x83, 0xa7, 0x3a, 0x67, 0x8a, 0x9b, 0x50, 0x63, 0x97, 0x41, 0x91, 0x10, 0x3c, 0xfb, 0x3a, - 0x16, 0x49, 0xd0, 0x88, 0x70, 0xa8, 0x6c, 0xd0, 0xe1, 0x3f, 0xc2, 0x46, 0x7c, 0xdf, 0x55, 0xb0, - 0x29, 0x9c, 0x75, 0xd0, 0x3b, 0xdc, 0xef, 0x0f, 0x95, 0x4d, 0xac, 0x04, 0x41, 0x78, 0xcd, 0x59, - 0x9c, 0x4d, 0xb2, 0x5b, 0x5f, 0xa2, 0x0d, 0x1c, 0x61, 0x4f, 0x9b, 0x5a, 0xbf, 0xdb, 0x7f, 0x3c, - 0x54, 0x2e, 0xc7, 0x39, 0x77, 0x34, 0x6d, 0xa0, 0x0d, 0x95, 0x2b, 0x31, 0x60, 0x38, 0x6a, 0x8e, - 0x0e, 0x87, 0xca, 0xd5, 0xb8, 0x96, 0x07, 0xda, 0xa0, 0xd5, 0x19, 0x0e, 0x7b, 0xdd, 0xe1, 0x48, - 0xb9, 0xc6, 0xae, 0xc0, 0x66, 0x52, 0xa3, 0x88, 0xb8, 0x21, 0x55, 0x54, 0x7b, 0xdc, 0x19, 0x29, - 0xd7, 0xe3, 0x6a, 0xb4, 0x06, 0xbd, 0x5e, 0x93, 0x4e, 0xb6, 0x6f, 0x20, 0x11, 0x1d, 0xe6, 0x8b, - 0xd6, 0xbc, 0x82, 0xf5, 0x3a, 0xec, 0xcb, 0xa0, 0x9b, 0xd2, 0xd4, 0x18, 0x76, 0x7e, 0x74, 0xd8, - 0xe9, 0xb7, 0x3a, 0xca, 0xab, 0xc9, 0xd4, 0x88, 0x61, 0xb7, 0xe2, 0xa9, 0x11, 0x83, 0x6e, 0xc7, - 0x65, 0x46, 0xa0, 0xa1, 0xb2, 0x85, 0xf9, 0x89, 0x7a, 0xf4, 0xfb, 0x9d, 0xd6, 0x08, 0xdb, 0xfa, - 0x5a, 0xdc, 0x8b, 0x87, 0x07, 0x8f, 0xb5, 0x66, 0xbb, 0xa3, 0xa8, 0x08, 0xd1, 0x3a, 0xfd, 0xe6, - 0x7e, 0x34, 0xda, 0x77, 0xa4, 0xd1, 0x3e, 0xe8, 0x8e, 0x34, 0xe5, 0x6e, 0x3c, 0xba, 0x94, 0x7c, - 0x9d, 0xbd, 0x02, 0xd7, 0xe4, 0x79, 0xa8, 0x3f, 0xed, 0x8e, 0xf6, 0xc4, 0x41, 0xfc, 0x3d, 0x7e, - 0x88, 0x4c, 0xc8, 0x56, 0xbb, 0xc5, 0x23, 0x0e, 0x88, 0x17, 0x53, 0xdb, 0x3b, 0x55, 0x7a, 0x23, - 0x5d, 0x28, 0x20, 0xea, 0x67, 0xc0, 0xe4, 0xe7, 0x82, 0x45, 0x00, 0x34, 0x83, 0xdc, 0xc4, 0xf7, - 0xa6, 0xd1, 0xa3, 0x1c, 0xf8, 0x1b, 0xed, 0xef, 0xd9, 0xfc, 0x88, 0x0e, 0xb7, 0x93, 0x4b, 0xf7, - 0x32, 0x48, 0xfd, 0xbb, 0x19, 0xa8, 0xa7, 0x95, 0x0f, 0x72, 0xb8, 0x4e, 0x74, 0xd7, 0x0b, 0xf9, - 0x2b, 0x67, 0x41, 0xfc, 0x8a, 0xef, 0xa4, 0xef, 0x85, 0xf4, 0xcc, 0x19, 0xb9, 0x03, 0x62, 0x5d, - 0x82, 0xe7, 0x1a, 0xa7, 0x59, 0x17, 0x2e, 0xa5, 0x5e, 0x5c, 0x4e, 0xbd, 0x31, 0xd7, 0x88, 0x5f, - 0x4a, 0x5d, 0xa8, 0xbf, 0xc6, 0x82, 0xe5, 0x36, 0x89, 0xa7, 0x13, 0x72, 0xc9, 0xd3, 0x09, 0x7b, - 0x50, 0x4b, 0xe9, 0x3a, 0xe4, 0xc5, 0x99, 0xa4, 0x6b, 0x5a, 0xb2, 0x27, 0x2f, 0xaf, 0xa6, 0xfa, - 0xb7, 0x33, 0x50, 0x95, 0x35, 0x9f, 0xef, 0x9c, 0x13, 0xc5, 0x25, 0x89, 0xdf, 0xba, 0x6d, 0x46, - 0xaf, 0x9b, 0x45, 0xa0, 0x2e, 0x7d, 0x1b, 0x82, 0xfb, 0xae, 0x77, 0x4f, 0x87, 0x71, 0x73, 0x64, - 0x10, 0xbb, 0x05, 0x40, 0x2f, 0x0f, 0xed, 0x7e, 0x8e, 0x04, 0xe2, 0x69, 0xec, 0x04, 0xa2, 0xde, - 0x86, 0xf2, 0xee, 0x69, 0x14, 0xa6, 0x25, 0xbf, 0xf5, 0x57, 0xe6, 0x2f, 0x35, 0xa8, 0x7f, 0x98, - 0x81, 0x7a, 0xe2, 0xb3, 0xa0, 0xb0, 0x02, 0xfe, 0x52, 0x37, 0x9f, 0x0e, 0xeb, 0xe6, 0x51, 0x72, - 0xfe, 0xb9, 0x2e, 0x9f, 0x7f, 0xde, 0x11, 0x99, 0x65, 0x65, 0x91, 0x1f, 0x97, 0x25, 0xde, 0x81, - 0x78, 0x04, 0x55, 0xfc, 0xaf, 0x59, 0x13, 0xcb, 0xf7, 0x2d, 0x33, 0x7d, 0x2d, 0x25, 0x21, 0x4e, - 0x11, 0x91, 0x8d, 0x27, 0x4e, 0x56, 0x9f, 0xf3, 0x74, 0x13, 0x3d, 0x29, 0xf6, 0xdf, 0xb2, 0x50, - 0x91, 0xf4, 0xc8, 0x6f, 0x34, 0xfd, 0x6e, 0x42, 0x39, 0x79, 0x48, 0x48, 0x5c, 0xbe, 0x8f, 0x01, - 0xa9, 0xb1, 0xca, 0x2e, 0x8c, 0x55, 0x03, 0x8a, 0x3e, 0xbf, 0x2c, 0x2b, 0x5c, 0xc8, 0x51, 0x32, - 0xed, 0xac, 0xcd, 0xbf, 0xe4, 0x7c, 0xe5, 0x7d, 0xa8, 0x4a, 0x9e, 0xd6, 0xa0, 0x51, 0x90, 0x5f, - 0x93, 0x8a, 0xe9, 0x2b, 0x89, 0xd7, 0x35, 0x60, 0x57, 0xa0, 0x30, 0x39, 0xd5, 0xcd, 0x23, 0x7e, - 0x25, 0xbb, 0xac, 0xe5, 0x27, 0xa7, 0xed, 0x23, 0x3a, 0x7d, 0x9a, 0xc4, 0xaa, 0x13, 0xf7, 0x7f, - 0x95, 0x26, 0x91, 0x82, 0xb4, 0x0d, 0xc5, 0xc9, 0xa9, 0x7c, 0xb5, 0x7a, 0xa9, 0xcb, 0x0b, 0x93, - 0x53, 0xba, 0x50, 0xfd, 0x2e, 0x5c, 0x16, 0xfb, 0xb7, 0x11, 0xe8, 0xfc, 0x9d, 0x13, 0x7a, 0x60, - 0x8a, 0xbf, 0xfc, 0xb7, 0xc9, 0x71, 0xcd, 0x60, 0x48, 0x18, 0x9c, 0x71, 0x2a, 0x54, 0xa5, 0x09, - 0xc8, 0x5f, 0xe2, 0x2a, 0x6b, 0x29, 0x18, 0xfb, 0x04, 0xaa, 0x93, 0x53, 0x3e, 0xa0, 0x23, 0x6f, - 0xdf, 0x12, 0x37, 0x45, 0x2e, 0x2f, 0x0e, 0x25, 0xc5, 0x7d, 0xa4, 0x28, 0xd9, 0x55, 0x28, 0x68, - 0xc6, 0xd9, 0xf0, 0x47, 0x3d, 0x52, 0x22, 0xcb, 0x9a, 0x48, 0x7d, 0x96, 0x2b, 0xd5, 0x95, 0x0d, - 0xf5, 0x1f, 0x67, 0xa0, 0x9e, 0xd8, 0x00, 0xb8, 0x08, 0xd9, 0x7d, 0xf9, 0x89, 0xfd, 0xc6, 0xa2, - 0x99, 0x80, 0x24, 0x0f, 0x46, 0x17, 0x33, 0xfe, 0x10, 0xed, 0xaa, 0xd7, 0xd3, 0x56, 0xb9, 0xbe, - 0xb3, 0x2b, 0x1f, 0xf7, 0x7e, 0x0c, 0xd9, 0xd1, 0xc5, 0x8c, 0xfb, 0x9b, 0x70, 0x4b, 0xe4, 0xb6, - 0x29, 0xdf, 0x0c, 0x29, 0xc8, 0xe8, 0xf3, 0xce, 0x97, 0xfc, 0xb1, 0x90, 0x03, 0xad, 0xbb, 0xdf, - 0xd4, 0xbe, 0xd4, 0x11, 0x40, 0x4a, 0xc3, 0xee, 0x40, 0xeb, 0x74, 0x1f, 0xf7, 0x09, 0x90, 0x23, - 0x6f, 0x54, 0x52, 0xc5, 0xa6, 0x69, 0xee, 0x9e, 0xca, 0x0f, 0x4f, 0x65, 0x52, 0x0f, 0x4f, 0xc5, - 0x6f, 0xb4, 0xc9, 0x0f, 0x56, 0x86, 0xb1, 0x3f, 0x9e, 0xc5, 0xab, 0x30, 0x5e, 0xd2, 0xec, 0x0d, - 0xc8, 0x4d, 0x4e, 0xad, 0x8b, 0xb4, 0xa1, 0x97, 0x5e, 0x40, 0x44, 0xa0, 0xfe, 0x3c, 0x03, 0x2c, - 0x55, 0x11, 0x6e, 0x7b, 0x7c, 0xd7, 0xba, 0x7c, 0x0c, 0x0d, 0x11, 0x89, 0xc9, 0xa9, 0x24, 0x5f, - 0xbb, 0xe8, 0xd2, 0x2b, 0x5e, 0x12, 0xa1, 0x9c, 0x3c, 0xf0, 0xc6, 0xde, 0x05, 0xfe, 0x16, 0x25, - 0x85, 0x09, 0xe5, 0x9e, 0x63, 0x27, 0x6a, 0x09, 0x4d, 0xf2, 0xf8, 0xa4, 0xfc, 0xa8, 0x26, 0x77, - 0xd3, 0x6f, 0x24, 0xa3, 0x46, 0x6b, 0x5e, 0xfd, 0xbd, 0x0c, 0x5c, 0x4a, 0x4f, 0x88, 0x5f, 0xac, - 0x95, 0xe9, 0x17, 0x44, 0xb3, 0x8b, 0x2f, 0x88, 0xae, 0x9a, 0x4f, 0xb9, 0x95, 0xf3, 0xe9, 0xb7, - 0x33, 0x70, 0x59, 0xea, 0xfd, 0xc4, 0x5a, 0xfc, 0x4b, 0xaa, 0x99, 0xf4, 0x90, 0x68, 0x2e, 0xf5, - 0x90, 0xa8, 0xfa, 0xc7, 0x19, 0xb8, 0xba, 0x50, 0x13, 0xcd, 0xfa, 0x4b, 0xad, 0x4b, 0xfa, 0xc1, - 0x51, 0x3a, 0x2a, 0x88, 0x1e, 0xd4, 0xc8, 0x6c, 0x67, 0xa5, 0x07, 0x47, 0xe9, 0xfc, 0x88, 0x0e, - 0x31, 0x5f, 0x15, 0xef, 0x2e, 0xe9, 0xc1, 0x85, 0x3b, 0x16, 0x83, 0x5d, 0x26, 0xc8, 0xf0, 0xc2, - 0x1d, 0xab, 0x7f, 0x94, 0x81, 0xeb, 0x0b, 0x6d, 0x68, 0xce, 0x43, 0x4f, 0x9c, 0x05, 0xff, 0x25, - 0x35, 0xe3, 0x36, 0x54, 0xe8, 0xa4, 0x5c, 0x1c, 0x30, 0xf3, 0x6e, 0x05, 0x23, 0x29, 0x57, 0x81, - 0xac, 0x69, 0x5c, 0x88, 0x47, 0x0b, 0xf0, 0x27, 0x2e, 0xd8, 0x13, 0x6f, 0xee, 0x8b, 0xe8, 0x20, - 0xfa, 0xad, 0x7e, 0x00, 0x9b, 0x49, 0xd5, 0x5b, 0xe2, 0xdd, 0xd7, 0xdb, 0x50, 0x71, 0xad, 0x33, - 0x3d, 0x7a, 0x15, 0x56, 0xc4, 0xbc, 0xb9, 0xd6, 0x99, 0x20, 0x50, 0x77, 0x65, 0x59, 0x18, 0x7f, - 0xcd, 0xc2, 0x31, 0x53, 0x71, 0x3b, 0x9e, 0x63, 0x46, 0x28, 0xcc, 0x4d, 0x6a, 0x65, 0xd1, 0xb5, - 0xce, 0x68, 0x1e, 0x9e, 0x89, 0x7c, 0x9a, 0xa6, 0x29, 0x62, 0x17, 0x56, 0x3d, 0xd3, 0x76, 0x1d, - 0x4a, 0x33, 0x3f, 0xd5, 0x4d, 0xc5, 0x99, 0xcf, 0x8b, 0xbd, 0x2b, 0x22, 0xea, 0x9e, 0x17, 0xe7, - 0xc0, 0x63, 0xec, 0xc4, 0xd7, 0x6e, 0x72, 0xc9, 0xd7, 0x6e, 0x3e, 0x14, 0x62, 0x90, 0xec, 0x3e, - 0x5e, 0xb2, 0x02, 0x59, 0xdb, 0x3c, 0xa7, 0x82, 0x6b, 0x1a, 0xfe, 0x24, 0x4d, 0xce, 0xfa, 0x5a, - 0x04, 0xf5, 0xe1, 0x4f, 0x75, 0x07, 0x2a, 0x5a, 0xca, 0xc8, 0xad, 0x4a, 0xfe, 0xa2, 0x20, 0xfd, - 0x92, 0x55, 0xd2, 0x41, 0x5a, 0x25, 0x71, 0x17, 0x05, 0x6a, 0x20, 0x04, 0xdf, 0x13, 0xc3, 0x1f, - 0x9f, 0x18, 0x7e, 0xcf, 0x72, 0x8f, 0xc3, 0x13, 0xec, 0x72, 0xee, 0xc6, 0x95, 0xbb, 0x10, 0x38, - 0x28, 0x9a, 0x0e, 0xd8, 0x8b, 0x0e, 0x91, 0x47, 0xdf, 0xd1, 0x70, 0xad, 0x33, 0xc1, 0xff, 0x2a, - 0x00, 0xf6, 0xbf, 0x40, 0xf3, 0x23, 0xc8, 0xb2, 0xe7, 0x98, 0x1c, 0xad, 0x6e, 0x8a, 0xf6, 0x8a, - 0x47, 0x37, 0xda, 0xd6, 0x44, 0x75, 0xc4, 0xc8, 0xf3, 0x06, 0x89, 0x4e, 0xf8, 0x4e, 0xc3, 0xc8, - 0x5e, 0x83, 0x6a, 0xe4, 0x91, 0xa0, 0xc7, 0xd3, 0x78, 0xf1, 0x95, 0x08, 0xd6, 0x9f, 0x4f, 0xd5, - 0xdf, 0xcf, 0x42, 0xb5, 0xc9, 0x23, 0x7b, 0x66, 0x17, 0x83, 0x59, 0xc8, 0x7e, 0x03, 0xae, 0xd0, - 0x6b, 0x2a, 0xfc, 0x3d, 0x63, 0x0a, 0xa8, 0xa1, 0xf0, 0x7c, 0xd1, 0x89, 0xf7, 0xa5, 0x4e, 0x14, - 0x2c, 0x0f, 0x86, 0xa7, 0xf6, 0x8c, 0xdf, 0x0a, 0xe9, 0x9a, 0xe7, 0x74, 0x05, 0x83, 0xc7, 0x06, - 0xd0, 0xc3, 0x2b, 0x69, 0x04, 0xbd, 0xbd, 0x80, 0xd9, 0xcf, 0x4e, 0x45, 0xb6, 0x22, 0x6c, 0x02, - 0x81, 0x07, 0xa7, 0x9c, 0xe6, 0x3e, 0x6c, 0xf2, 0x8b, 0x60, 0xcb, 0x1b, 0xf0, 0x06, 0x47, 0x24, - 0xf3, 0x7b, 0x08, 0x9b, 0xe2, 0xf1, 0x17, 0x7a, 0xe5, 0x53, 0x1f, 0x7b, 0xb3, 0x0b, 0x71, 0xf4, - 0xf8, 0xc6, 0x73, 0xaa, 0xda, 0xe5, 0xa4, 0x08, 0xe2, 0xf5, 0xdc, 0x08, 0xd2, 0xd0, 0x1b, 0x1d, - 0xb8, 0xf6, 0x9c, 0x36, 0xbd, 0x2c, 0xbc, 0xa1, 0x24, 0x85, 0x37, 0xdc, 0xd8, 0x81, 0xcb, 0xab, - 0xca, 0xfb, 0x36, 0x79, 0xa8, 0x3f, 0xab, 0x01, 0x24, 0x33, 0x36, 0xa5, 0x8e, 0x66, 0x16, 0xd4, - 0xd1, 0x6f, 0x15, 0xd4, 0xf3, 0x01, 0xd4, 0xb1, 0xab, 0xf4, 0x84, 0x23, 0xbb, 0x92, 0xa3, 0x8a, - 0x54, 0xa3, 0xe4, 0xae, 0xeb, 0x72, 0x48, 0x44, 0x6e, 0x65, 0x48, 0xc4, 0xfb, 0x50, 0xe4, 0x07, - 0x6d, 0x81, 0xb8, 0x5e, 0x7d, 0x6d, 0x71, 0xf5, 0x3d, 0x10, 0x37, 0x4c, 0x22, 0x3a, 0xd6, 0x81, - 0x3a, 0x8a, 0x7e, 0xdf, 0x0e, 0x4f, 0xa6, 0xf2, 0x65, 0xeb, 0x5b, 0xcb, 0x9c, 0x11, 0x19, 0x7f, - 0x1b, 0xd4, 0x90, 0x93, 0x92, 0xf6, 0x1a, 0x4e, 0x85, 0xf7, 0x97, 0xb4, 0xd7, 0xa2, 0xac, 0xbd, - 0x8e, 0xa6, 0xdc, 0xe7, 0x8b, 0xda, 0xeb, 0x3b, 0x70, 0x49, 0xdc, 0x7a, 0x43, 0x06, 0xec, 0x4e, - 0xa2, 0xe7, 0x41, 0x96, 0x8a, 0x78, 0x73, 0x65, 0x4a, 0xb6, 0x1d, 0x92, 0x7f, 0x01, 0x97, 0xc7, - 0x27, 0x86, 0x7b, 0x6c, 0xe9, 0xe1, 0x91, 0xa3, 0xd3, 0x47, 0x14, 0xf4, 0xa9, 0x31, 0x13, 0x4a, - 0xf5, 0x1b, 0x4b, 0x95, 0x6d, 0x11, 0xf1, 0xe8, 0xc8, 0xa1, 0x00, 0xb4, 0x38, 0x70, 0x66, 0x73, - 0xbc, 0x08, 0x5f, 0x38, 0xbf, 0x86, 0xa5, 0xf3, 0xeb, 0x45, 0x35, 0xbb, 0xb2, 0x42, 0xcd, 0x4e, - 0x94, 0xe5, 0xaa, 0xac, 0x2c, 0xb3, 0xb7, 0xa1, 0x28, 0x2e, 0xed, 0x0a, 0xbf, 0x2f, 0x5b, 0x5e, - 0x1d, 0x5a, 0x44, 0x82, 0x25, 0x45, 0xd1, 0x14, 0xf4, 0xae, 0x43, 0x9d, 0x97, 0x24, 0xc3, 0xd8, - 0x8e, 0x70, 0x7a, 0xc6, 0xc1, 0x72, 0xc2, 0xc7, 0x7b, 0x43, 0xca, 0x38, 0xc6, 0x09, 0xbb, 0x7c, - 0x81, 0xe3, 0xc6, 0x3f, 0x2a, 0x40, 0x41, 0x04, 0xca, 0xdf, 0x87, 0x9c, 0xe9, 0x7b, 0xb3, 0x38, - 0xda, 0x7c, 0x85, 0xd6, 0x4e, 0xdf, 0xcd, 0x43, 0x05, 0xff, 0x01, 0x14, 0x0c, 0xd3, 0xd4, 0x27, - 0xa7, 0xe9, 0xf3, 0xe8, 0x05, 0x05, 0x7a, 0x6f, 0x4d, 0xcb, 0x1b, 0xa4, 0x49, 0x7f, 0x0c, 0x65, - 0xa4, 0x4f, 0xc2, 0x4f, 0x2b, 0xcb, 0x66, 0x41, 0xa4, 0xea, 0xee, 0xad, 0x69, 0x25, 0x23, 0x52, - 0x7b, 0x7f, 0x35, 0xed, 0xd9, 0xcf, 0x2d, 0x35, 0x70, 0x41, 0x4f, 0x5b, 0xf0, 0xf1, 0xff, 0x1a, - 0x70, 0x57, 0x6f, 0xbc, 0x63, 0xe7, 0xe5, 0xa3, 0xcf, 0xa5, 0xfd, 0x7d, 0x6f, 0x4d, 0xe3, 0xfb, - 0x56, 0xb4, 0xdf, 0x7f, 0x18, 0x79, 0xdd, 0xe3, 0xef, 0x0b, 0xad, 0xe8, 0x19, 0x14, 0x83, 0xb1, - 0xeb, 0x9d, 0x64, 0x22, 0xb2, 0x99, 0x66, 0x14, 0x85, 0x58, 0x5c, 0x62, 0x8b, 0x77, 0x75, 0x62, - 0x8b, 0xb7, 0xf8, 0x4f, 0xa0, 0xc2, 0x9d, 0xb0, 0x9c, 0xaf, 0xb4, 0xd4, 0xb5, 0xc9, 0xa6, 0x4c, - 0xc7, 0x7a, 0xc9, 0x16, 0xdd, 0x8a, 0xda, 0xe9, 0x5b, 0xf2, 0xc9, 0xc9, 0xcd, 0x95, 0x1d, 0xa5, - 0xc5, 0x87, 0x28, 0xbc, 0xb1, 0x1a, 0xe7, 0x61, 0x3d, 0xb8, 0x2c, 0x8e, 0x18, 0xf8, 0x06, 0x1c, - 0xed, 0x99, 0xb0, 0x34, 0x5e, 0xa9, 0x1d, 0x7a, 0x6f, 0x4d, 0x63, 0xc6, 0xf2, 0xbe, 0xdd, 0x82, - 0xcd, 0xa8, 0x4a, 0xb4, 0xb3, 0x4a, 0x61, 0x53, 0x72, 0x93, 0x92, 0x7d, 0x77, 0x6f, 0x4d, 0xdb, - 0x30, 0xd2, 0x20, 0xd6, 0x85, 0x4b, 0x51, 0x26, 0xe4, 0x6a, 0x17, 0x3d, 0x53, 0x5d, 0x1a, 0x45, - 0x79, 0xaf, 0xde, 0x5b, 0xd3, 0x36, 0x8d, 0xa5, 0x0d, 0x7c, 0x3f, 0xaa, 0x8f, 0xac, 0x1c, 0xf2, - 0x95, 0x78, 0x7b, 0x65, 0x37, 0x25, 0x9a, 0x6a, 0x5c, 0xb3, 0x04, 0x94, 0xc4, 0x31, 0xdc, 0xd0, - 0xe0, 0xea, 0x6a, 0x09, 0x23, 0x6f, 0x33, 0x39, 0xbe, 0xcd, 0xa8, 0xf2, 0x36, 0xb3, 0xf8, 0x4e, - 0x8b, 0xb4, 0xe9, 0xfc, 0x10, 0x6a, 0x29, 0x11, 0xcb, 0x2a, 0x50, 0x8c, 0x5e, 0x9f, 0xa7, 0xcb, - 0x31, 0xad, 0xc1, 0xc1, 0x97, 0x4a, 0x06, 0xc1, 0xdd, 0xfe, 0x70, 0xd4, 0xec, 0x8f, 0x94, 0x75, - 0x9e, 0x38, 0xe8, 0x35, 0x5b, 0x1d, 0x25, 0xab, 0xfe, 0x71, 0x16, 0xca, 0xf1, 0x29, 0xdb, 0x77, - 0xf7, 0x86, 0xc5, 0x6e, 0xa6, 0xac, 0xec, 0x66, 0x5a, 0x30, 0xf5, 0xf8, 0x87, 0x22, 0xf8, 0xb7, - 0xbb, 0x36, 0xd2, 0x06, 0x55, 0xb0, 0x7c, 0x7d, 0x3f, 0xff, 0x0d, 0xaf, 0xef, 0xcb, 0x11, 0xe8, - 0x85, 0x74, 0x04, 0xfa, 0xc2, 0x17, 0x08, 0x8a, 0xf4, 0x36, 0xb8, 0xfc, 0x05, 0x02, 0xfa, 0xa2, - 0xe9, 0x13, 0xdb, 0x3a, 0x13, 0x21, 0xdb, 0x22, 0x95, 0xde, 0xa1, 0xe1, 0x25, 0x3b, 0xf4, 0x37, - 0x91, 0xf6, 0x0f, 0xe1, 0xf2, 0xe4, 0x34, 0x7e, 0x91, 0x3c, 0x71, 0xae, 0x54, 0xa9, 0x4a, 0x2b, - 0x71, 0xec, 0x8d, 0xf8, 0x13, 0x6c, 0x35, 0xd9, 0x0d, 0x14, 0x8f, 0x56, 0xfc, 0x4d, 0xb6, 0xff, - 0x3f, 0x03, 0x90, 0x9c, 0x3f, 0xfd, 0xc2, 0xae, 0x5c, 0xc9, 0x5b, 0x96, 0x7d, 0x81, 0xb7, 0xec, - 0x65, 0x2f, 0xd4, 0x7d, 0x0d, 0xe5, 0xf8, 0xc4, 0xf1, 0xbb, 0x4f, 0xac, 0x6f, 0x55, 0xe4, 0x6f, - 0x46, 0x6e, 0xed, 0xf8, 0xc8, 0xee, 0x17, 0xed, 0x8b, 0x54, 0xf1, 0xd9, 0x97, 0x14, 0x7f, 0xce, - 0x7d, 0xcb, 0x71, 0xe1, 0xbf, 0xe4, 0xd5, 0x24, 0x4f, 0xf4, 0x5c, 0x6a, 0xa2, 0xab, 0x73, 0xe1, - 0x20, 0xff, 0xc5, 0x8b, 0xfe, 0x56, 0x0d, 0xfe, 0xaf, 0x99, 0xc8, 0x8b, 0x1b, 0x3f, 0x22, 0xff, - 0x5c, 0xa5, 0x77, 0xb5, 0x23, 0xfa, 0xdb, 0x14, 0xf7, 0x42, 0x1f, 0x55, 0xee, 0x45, 0x3e, 0xaa, - 0x37, 0x20, 0xcf, 0xb7, 0xbb, 0xfc, 0xf3, 0xfc, 0x53, 0x1c, 0xff, 0xd2, 0x4f, 0xbd, 0xa8, 0xaa, - 0x50, 0xf2, 0x79, 0x7b, 0x2f, 0x47, 0xf9, 0x46, 0x9f, 0xa9, 0xa1, 0x1b, 0x32, 0xff, 0x17, 0x97, - 0xa8, 0xdf, 0xb5, 0x4b, 0x5e, 0xec, 0xb6, 0x50, 0xff, 0x57, 0x06, 0x6a, 0xa9, 0x08, 0x82, 0xef, - 0x50, 0xc4, 0x4a, 0xb9, 0x9c, 0xfd, 0x3f, 0x48, 0x2e, 0xa7, 0x42, 0x78, 0x4b, 0xe9, 0x10, 0x5e, - 0x14, 0x77, 0xd5, 0x94, 0x09, 0xb3, 0xca, 0xd8, 0xc9, 0xac, 0x34, 0x76, 0x6e, 0xc5, 0xdf, 0xd2, - 0xec, 0xb6, 0x79, 0xc4, 0x6c, 0x4d, 0x93, 0x20, 0xec, 0x53, 0xb8, 0x2e, 0x9c, 0x08, 0xbc, 0x7f, - 0xbc, 0x89, 0x1e, 0x7f, 0x69, 0x53, 0x18, 0xe5, 0x57, 0x39, 0x01, 0xff, 0x50, 0xcf, 0xa4, 0x19, - 0x61, 0xd5, 0x2e, 0xd4, 0x52, 0xa1, 0x19, 0xd2, 0x97, 0x7d, 0x33, 0xf2, 0x97, 0x7d, 0xd9, 0x16, - 0xe4, 0xcf, 0x4e, 0x2c, 0xdf, 0x5a, 0xf1, 0x40, 0x34, 0x47, 0xa8, 0xdf, 0x87, 0xaa, 0x1c, 0x26, - 0xc6, 0xde, 0x86, 0xbc, 0x1d, 0x5a, 0xd3, 0xc8, 0x3d, 0x72, 0x75, 0x39, 0x92, 0xac, 0x1b, 0x5a, - 0x53, 0x8d, 0x13, 0xa9, 0x7f, 0x90, 0x01, 0x65, 0x11, 0x27, 0x7d, 0x7e, 0x38, 0xf3, 0x9c, 0xcf, - 0x0f, 0xaf, 0xa7, 0x2a, 0xb9, 0xea, 0x0b, 0xc2, 0x5b, 0x91, 0x52, 0xb2, 0xe2, 0xeb, 0xb5, 0x84, - 0x60, 0xf7, 0xa0, 0xe4, 0x5b, 0xf4, 0x6d, 0x57, 0x73, 0xc5, 0xcd, 0x91, 0x18, 0xa7, 0xfe, 0x6e, - 0x06, 0x8a, 0x22, 0xa6, 0x6d, 0xa5, 0xbf, 0xea, 0x4d, 0x28, 0xf2, 0xef, 0xbc, 0x46, 0x0f, 0xd5, - 0x2d, 0x85, 0x99, 0x47, 0x78, 0x76, 0x8b, 0x47, 0xfa, 0xa5, 0xfd, 0x57, 0x07, 0x8e, 0xe1, 0x6a, - 0x04, 0x17, 0xdf, 0xdf, 0x32, 0xa6, 0xe2, 0x65, 0x03, 0xfe, 0xc2, 0x18, 0x10, 0x88, 0x1e, 0x31, - 0x50, 0x7f, 0x15, 0x8a, 0x22, 0x66, 0x6e, 0x65, 0x55, 0x5e, 0xf6, 0x8d, 0xcf, 0x2d, 0x80, 0x24, - 0x88, 0x6e, 0x55, 0x0e, 0xea, 0x7d, 0x28, 0x45, 0x71, 0x73, 0x38, 0xff, 0x92, 0xa2, 0xc5, 0x95, - 0x24, 0xb9, 0x32, 0x8e, 0xf8, 0xe8, 0x42, 0xcf, 0x1b, 0x9f, 0x92, 0xb3, 0xfc, 0x5d, 0xa0, 0xfb, - 0x59, 0xa3, 0xa5, 0xa7, 0xd8, 0xd2, 0x5f, 0xdd, 0x88, 0x89, 0xd8, 0x7d, 0x88, 0xe5, 0xe5, 0xcb, - 0x5c, 0x0b, 0x6a, 0x33, 0xba, 0xc9, 0x47, 0xb3, 0xec, 0x91, 0xf0, 0xa6, 0xf6, 0xe8, 0x29, 0xd0, - 0x8c, 0xfc, 0x38, 0x72, 0xaa, 0x4e, 0x9a, 0x44, 0xa6, 0xd6, 0xa1, 0x2a, 0x07, 0xfb, 0xa8, 0x4d, - 0xd8, 0xdc, 0xb7, 0x42, 0x03, 0xe5, 0x4f, 0xf4, 0x40, 0x15, 0x9f, 0xbf, 0xf8, 0x23, 0x3d, 0x7f, - 0x17, 0xe9, 0x34, 0x4e, 0xa4, 0xfe, 0x71, 0x0e, 0x94, 0x45, 0xdc, 0x8b, 0x6e, 0x35, 0xde, 0x86, - 0x8a, 0x47, 0xf3, 0x22, 0xf5, 0x85, 0x35, 0x0e, 0x92, 0xee, 0x03, 0xa4, 0x3e, 0xb3, 0x53, 0xb2, - 0x83, 0x3d, 0xfe, 0xa1, 0x9d, 0x6b, 0xfc, 0x0a, 0x9b, 0xe3, 0x8d, 0x69, 0x5a, 0x57, 0xe9, 0xc6, - 0x5a, 0xcf, 0x1b, 0xd3, 0x65, 0x49, 0xe1, 0x9d, 0xe0, 0x11, 0xa8, 0x55, 0xad, 0x24, 0x5c, 0x12, - 0x74, 0x7e, 0x27, 0x6e, 0x09, 0x84, 0x81, 0xb8, 0x03, 0x5c, 0xe2, 0x80, 0x51, 0x10, 0x3d, 0xed, - 0x3f, 0x16, 0x9f, 0x03, 0xcb, 0xd2, 0xd3, 0xfe, 0x2d, 0x97, 0xee, 0x4a, 0xd2, 0x83, 0xc7, 0x63, - 0xf1, 0x21, 0x44, 0xf1, 0x71, 0x05, 0x44, 0xdd, 0xe1, 0x1f, 0x4c, 0xf3, 0xad, 0x20, 0xe0, 0x2f, - 0x42, 0x96, 0xc5, 0x53, 0xa0, 0x02, 0x18, 0x3f, 0xb8, 0x2b, 0xbe, 0x65, 0x87, 0x24, 0x20, 0xde, - 0xa5, 0xe4, 0x5f, 0xb2, 0x43, 0x82, 0xeb, 0x50, 0xfa, 0x89, 0xe7, 0x5a, 0xe4, 0xe5, 0xa8, 0x50, - 0xad, 0x8a, 0x98, 0xde, 0x37, 0x66, 0xb8, 0x11, 0x38, 0x74, 0xdd, 0x9c, 0xdf, 0x12, 0xe4, 0x09, - 0xf5, 0xdf, 0x64, 0xe0, 0xf2, 0x62, 0x5f, 0xd3, 0x34, 0xaa, 0x42, 0xa9, 0x35, 0xe8, 0xe9, 0xfd, - 0xe6, 0x7e, 0x47, 0x59, 0x63, 0x1b, 0x50, 0x19, 0xec, 0x7c, 0xd6, 0x69, 0x8d, 0x38, 0x20, 0x43, - 0x6f, 0x38, 0x0c, 0xf5, 0xbd, 0x6e, 0xbb, 0xdd, 0xe9, 0x73, 0x8b, 0x62, 0xb0, 0xf3, 0x99, 0xde, - 0x1b, 0xb4, 0xf8, 0x37, 0xaf, 0xa2, 0x88, 0x87, 0xa1, 0x92, 0xa3, 0x78, 0x08, 0x0a, 0x86, 0xc7, - 0x64, 0x9e, 0x47, 0x79, 0x3f, 0x1d, 0xea, 0xad, 0xfe, 0x48, 0x29, 0x60, 0xaa, 0x7f, 0xd8, 0xeb, - 0x51, 0x8a, 0xc2, 0x39, 0x5b, 0x83, 0xfd, 0x03, 0xad, 0x33, 0x1c, 0xea, 0xc3, 0xee, 0x8f, 0x3b, - 0x4a, 0x89, 0x4a, 0xd6, 0xba, 0x8f, 0xbb, 0x7d, 0x0e, 0x28, 0xb3, 0x22, 0x64, 0xf7, 0xbb, 0x7d, - 0xfe, 0x76, 0xc5, 0x7e, 0xf3, 0x0b, 0xa5, 0x82, 0x3f, 0x86, 0x87, 0xfb, 0x4a, 0x95, 0x95, 0x21, - 0xdf, 0xeb, 0x3c, 0xe9, 0xf4, 0x94, 0x9a, 0xfa, 0x1f, 0xb2, 0x91, 0x46, 0x4c, 0x71, 0x4e, 0xdf, - 0x44, 0x0b, 0x5c, 0x75, 0xbe, 0x18, 0x77, 0x5a, 0x56, 0xea, 0xb4, 0x6f, 0xf2, 0x61, 0xe5, 0x3b, - 0x50, 0x8b, 0x83, 0x03, 0xa4, 0xe7, 0xf8, 0xab, 0x11, 0x70, 0xc5, 0xf1, 0x45, 0x61, 0xc5, 0xf1, - 0xc5, 0xcc, 0x0e, 0xd1, 0xca, 0x46, 0x99, 0xcb, 0x67, 0x52, 0x19, 0x21, 0xfc, 0x93, 0xe6, 0xaf, - 0x00, 0x25, 0xf4, 0xb9, 0x6b, 0x47, 0x9f, 0xd5, 0x2c, 0x21, 0xe0, 0xd0, 0xb5, 0xc3, 0xc5, 0xe0, - 0x84, 0xf2, 0x52, 0x70, 0x82, 0xbc, 0x39, 0x43, 0x7a, 0x73, 0x4e, 0x7f, 0x6f, 0x9a, 0x7f, 0x4f, - 0x53, 0xfa, 0xde, 0xf4, 0xdb, 0xc0, 0xc6, 0x73, 0x9f, 0x1e, 0xc7, 0x93, 0xc8, 0xaa, 0x44, 0xa6, - 0x08, 0x4c, 0xbc, 0x2b, 0xb2, 0x37, 0x60, 0x63, 0x81, 0x9a, 0x6c, 0xe9, 0xb2, 0x56, 0x4f, 0x93, - 0xb2, 0x07, 0x70, 0x49, 0xcc, 0xed, 0x54, 0xdf, 0x8a, 0xab, 0xa7, 0x1c, 0xd5, 0x4c, 0x7a, 0x58, - 0xfd, 0x15, 0x28, 0x45, 0x21, 0x6d, 0x2f, 0x56, 0x76, 0x57, 0x8c, 0xab, 0xfa, 0x0f, 0xd6, 0xa1, - 0x1c, 0x07, 0xb8, 0x7d, 0xa3, 0xd9, 0x41, 0xdf, 0x1d, 0x09, 0x4e, 0x65, 0x11, 0x53, 0x42, 0x40, - 0x34, 0x52, 0xe2, 0xb6, 0xd6, 0xdc, 0xb7, 0x23, 0x8d, 0x8d, 0x43, 0x0e, 0x7d, 0x9b, 0x5e, 0xc0, - 0xb1, 0x5d, 0xe9, 0x92, 0x68, 0x59, 0x2b, 0x21, 0x80, 0x16, 0xda, 0x75, 0xa0, 0xdf, 0xc4, 0x19, - 0x7d, 0x82, 0xdb, 0x76, 0x4f, 0x91, 0xef, 0x39, 0x9f, 0xe0, 0xa6, 0xaf, 0xa6, 0xf0, 0xe8, 0x1a, - 0x1e, 0x53, 0x10, 0x7d, 0x27, 0xf0, 0x15, 0x28, 0xcf, 0xe3, 0x0f, 0x4d, 0x8a, 0x19, 0x31, 0x8f, - 0x3e, 0x33, 0x99, 0x1e, 0xd5, 0xf2, 0xe2, 0xa8, 0x2e, 0xce, 0x69, 0x58, 0x9a, 0xd3, 0x6a, 0x08, - 0x45, 0x11, 0xe4, 0xf7, 0xe2, 0x0e, 0x7f, 0x61, 0x57, 0x29, 0x90, 0x35, 0x9c, 0xe8, 0x66, 0x2a, - 0xfe, 0x5c, 0xa8, 0x58, 0x6e, 0xa1, 0x62, 0xea, 0xdf, 0x5a, 0x07, 0x48, 0x82, 0x05, 0xd9, 0x3b, - 0x0b, 0x81, 0xc9, 0x99, 0xa5, 0x6d, 0x7f, 0x21, 0x1e, 0x79, 0xe1, 0x49, 0xa8, 0xf5, 0x6f, 0xf0, - 0x24, 0xd4, 0x43, 0xa8, 0x05, 0xfe, 0xf8, 0xa5, 0x0e, 0xf7, 0x4a, 0xe0, 0x8f, 0x63, 0x7f, 0xfb, - 0xbb, 0x80, 0x49, 0x7a, 0x2e, 0x32, 0x31, 0x54, 0x97, 0xb4, 0x96, 0x72, 0xe0, 0x8f, 0x07, 0x47, - 0x5f, 0xb5, 0xf9, 0x15, 0x39, 0x33, 0x08, 0xf5, 0x55, 0x52, 0x62, 0xc3, 0x0c, 0xc2, 0xb6, 0x2c, - 0x28, 0xee, 0x42, 0x1d, 0x69, 0x97, 0x84, 0x45, 0xd5, 0x0c, 0x92, 0x03, 0x16, 0xf5, 0x77, 0xa2, - 0x23, 0xe9, 0x05, 0x5f, 0x2e, 0xfb, 0x48, 0x18, 0xe2, 0x92, 0x12, 0xd1, 0x58, 0xe5, 0xfa, 0xe5, - 0x0f, 0x58, 0xc5, 0xa4, 0xcb, 0x9f, 0x17, 0x5c, 0xff, 0xa6, 0x9f, 0x17, 0xdc, 0x02, 0x48, 0x1e, - 0xec, 0xc4, 0x15, 0x18, 0x5f, 0xd6, 0x29, 0xf3, 0x6b, 0x38, 0xf7, 0x5f, 0x83, 0xaa, 0xfc, 0x3d, - 0x62, 0xba, 0x84, 0xe3, 0xb9, 0x16, 0xff, 0x84, 0x4b, 0xef, 0x27, 0x1f, 0x28, 0x99, 0xfb, 0x2a, - 0x54, 0xa4, 0x0f, 0x28, 0x21, 0xc5, 0x9e, 0x11, 0x9c, 0x88, 0xcf, 0x79, 0x18, 0xee, 0xb1, 0xa5, - 0x64, 0xee, 0xdf, 0x43, 0xa5, 0x5b, 0xfe, 0x7c, 0x11, 0x40, 0xa1, 0xef, 0xf9, 0x53, 0xc3, 0x11, - 0x74, 0xd6, 0x3c, 0x40, 0xba, 0x77, 0xe1, 0xca, 0xca, 0x8f, 0x31, 0xd1, 0x15, 0x2e, 0x7b, 0x3a, - 0x73, 0x2c, 0x7e, 0x19, 0x69, 0xef, 0xe2, 0xc8, 0xb7, 0x4d, 0x25, 0x73, 0xff, 0x93, 0x85, 0x8f, - 0x75, 0x1c, 0xf6, 0x77, 0x06, 0x87, 0xfd, 0x76, 0xa7, 0xcd, 0xaf, 0x09, 0x75, 0xfb, 0xad, 0xde, - 0xe1, 0xb0, 0xfb, 0x44, 0xec, 0x85, 0x9d, 0x2f, 0xa2, 0xe4, 0xfa, 0xfd, 0xbd, 0xe8, 0x35, 0x86, - 0xa8, 0xd6, 0xbd, 0x41, 0xb3, 0xcd, 0xf7, 0xd0, 0xf8, 0x3d, 0xa6, 0xd1, 0x0e, 0xff, 0xc8, 0x87, - 0xd6, 0x19, 0x1e, 0xf6, 0x46, 0xd1, 0xdb, 0x4f, 0x75, 0x80, 0x6e, 0xab, 0xb3, 0xd3, 0xd1, 0x1e, - 0x23, 0x41, 0xf6, 0xfe, 0x0f, 0xa1, 0xf1, 0xbc, 0xfb, 0x3d, 0xd8, 0xb6, 0xd6, 0x5e, 0x93, 0xee, - 0x50, 0xe1, 0x1e, 0x3a, 0xd0, 0x79, 0x8a, 0x3c, 0x7d, 0x5a, 0xa7, 0xd7, 0xa1, 0x20, 0xd8, 0xfb, - 0x3f, 0xcd, 0x48, 0xfa, 0x64, 0x74, 0x47, 0x23, 0x06, 0x88, 0x0e, 0x97, 0x41, 0x9a, 0x65, 0x98, - 0x4a, 0x86, 0x5d, 0x05, 0x96, 0x02, 0xf5, 0xbc, 0xb1, 0xe1, 0x28, 0xeb, 0x14, 0xee, 0x1a, 0xc1, - 0xe9, 0x2e, 0x9f, 0x92, 0x65, 0xaf, 0xc2, 0xf5, 0x18, 0xd6, 0xf3, 0xce, 0x0e, 0x7c, 0xdb, 0xf3, - 0xed, 0xf0, 0x82, 0xa3, 0x73, 0xf7, 0xff, 0x6f, 0x71, 0x58, 0x9b, 0x9a, 0x65, 0x58, 0x40, 0xd3, - 0x34, 0x13, 0x18, 0x09, 0x36, 0x65, 0x8d, 0x5d, 0x83, 0x4b, 0x24, 0xd5, 0x17, 0x10, 0x19, 0xf6, - 0x0a, 0x5c, 0x8b, 0x8c, 0xde, 0x45, 0xe4, 0x3a, 0x22, 0x35, 0x8b, 0x42, 0x25, 0x97, 0x90, 0xd9, - 0x9d, 0x1f, 0xfc, 0xc9, 0xcf, 0x6f, 0x65, 0xfe, 0xe5, 0xcf, 0x6f, 0x65, 0xfe, 0xe3, 0xcf, 0x6f, - 0xad, 0xfd, 0xc1, 0x7f, 0xbe, 0x95, 0xf9, 0xf1, 0x3b, 0xc7, 0x76, 0x78, 0x32, 0x3f, 0x7a, 0x30, - 0xf6, 0xa6, 0xef, 0x4e, 0x8d, 0xd0, 0xb7, 0xcf, 0xf9, 0xf6, 0x12, 0x25, 0x5c, 0xeb, 0xdd, 0xd9, - 0xe9, 0xf1, 0xbb, 0xb3, 0xa3, 0x77, 0x71, 0xa2, 0x1f, 0x15, 0x66, 0xbe, 0x17, 0x7a, 0x8f, 0xfe, - 0x77, 0x00, 0x00, 0x00, 0xff, 0xff, 0x74, 0xdd, 0x96, 0x1f, 0x63, 0x8a, 0x00, 0x00, + 0x9f, 0x35, 0x6c, 0x2f, 0x0c, 0x1b, 0xf6, 0x62, 0x6d, 0x60, 0x6d, 0x8f, 0xbf, 0x0d, 0x1b, 0xb0, + 0x01, 0x7f, 0xf8, 0xc3, 0xc6, 0x39, 0x11, 0x99, 0x19, 0x49, 0xb2, 0xbb, 0x25, 0xcd, 0x2c, 0xe0, + 0x9f, 0x2a, 0xc6, 0x79, 0xc4, 0x3b, 0x4e, 0x9c, 0x73, 0xe2, 0x44, 0x24, 0xc0, 0xcc, 0x31, 0xdc, + 0x07, 0x33, 0xdf, 0x0b, 0x3d, 0x96, 0xc3, 0xdf, 0x37, 0xde, 0x39, 0xb6, 0xc3, 0x93, 0xf9, 0xd1, + 0x83, 0xb1, 0x37, 0x7d, 0xf7, 0xd8, 0x3b, 0xf6, 0xde, 0x25, 0xe4, 0xd1, 0x7c, 0x42, 0x29, 0x4a, + 0xd0, 0x2f, 0xce, 0x74, 0x03, 0x1c, 0x6f, 0x7c, 0x2a, 0x7e, 0x6f, 0x84, 0xf6, 0xd4, 0x0a, 0x42, + 0x63, 0x3a, 0xe3, 0x00, 0xf5, 0x0f, 0x33, 0x90, 0x1b, 0x5d, 0xcc, 0x2c, 0x56, 0x87, 0x75, 0xdb, + 0x6c, 0x64, 0xb6, 0x32, 0xdb, 0x79, 0x6d, 0xdd, 0x36, 0xd9, 0x16, 0x54, 0x5c, 0x2f, 0xec, 0xcf, + 0x1d, 0xc7, 0x38, 0x72, 0xac, 0xc6, 0xfa, 0x56, 0x66, 0xbb, 0xa4, 0xc9, 0x20, 0xf6, 0x0a, 0x94, + 0x8d, 0x79, 0xe8, 0xe9, 0xb6, 0x3b, 0xf6, 0x1b, 0x59, 0xc2, 0x97, 0x10, 0xd0, 0x75, 0xc7, 0x3e, + 0xbb, 0x0c, 0xf9, 0x33, 0xdb, 0x0c, 0x4f, 0x1a, 0x39, 0xca, 0x91, 0x27, 0x10, 0x1a, 0x8c, 0x0d, + 0xc7, 0x6a, 0xe4, 0x39, 0x94, 0x12, 0x08, 0x0d, 0xa9, 0x90, 0xc2, 0x56, 0x66, 0xbb, 0xac, 0xf1, + 0x04, 0xbb, 0x05, 0x60, 0xb9, 0xf3, 0xe9, 0x33, 0xc3, 0x99, 0x5b, 0x41, 0xa3, 0x48, 0x28, 0x09, + 0xa2, 0xfe, 0x00, 0xca, 0xd3, 0xe0, 0x78, 0xcf, 0x32, 0x4c, 0xcb, 0x67, 0xd7, 0xa0, 0x38, 0x0d, + 0x8e, 0xf5, 0xd0, 0x38, 0x16, 0x4d, 0x28, 0x4c, 0x83, 0xe3, 0x91, 0x71, 0xcc, 0xae, 0x43, 0x89, + 0x10, 0x17, 0x33, 0xde, 0x86, 0xbc, 0x86, 0x84, 0xd8, 0x62, 0xf5, 0x77, 0x0b, 0x50, 0xec, 0xd9, + 0xa1, 0xe5, 0x1b, 0x0e, 0xbb, 0x0a, 0x05, 0x3b, 0x70, 0xe7, 0x8e, 0x43, 0xec, 0x25, 0x4d, 0xa4, + 0xd8, 0x55, 0xc8, 0xdb, 0x9f, 0x3c, 0x33, 0x1c, 0xce, 0xbb, 0xb7, 0xa6, 0xf1, 0x24, 0x6b, 0x40, + 0xc1, 0x7e, 0xff, 0x23, 0x44, 0x64, 0x05, 0x42, 0xa4, 0x09, 0xf3, 0xe8, 0x21, 0x62, 0x72, 0x31, + 0x86, 0xd2, 0x84, 0xf9, 0xe8, 0x03, 0xc4, 0x60, 0xeb, 0xb3, 0x84, 0xa1, 0x34, 0x96, 0x32, 0xa7, + 0x52, 0xb0, 0x03, 0x6a, 0x58, 0xca, 0x3c, 0x2a, 0x65, 0xce, 0x4b, 0x29, 0x0a, 0x84, 0x48, 0x13, + 0x86, 0x97, 0x52, 0x8a, 0x31, 0x71, 0x29, 0x73, 0x5e, 0x4a, 0x79, 0x2b, 0xb3, 0x9d, 0x23, 0x0c, + 0x2f, 0xe5, 0x32, 0xe4, 0x4c, 0x84, 0xc3, 0x56, 0x66, 0x3b, 0xb3, 0xb7, 0xa6, 0x51, 0x0a, 0xa1, + 0x01, 0x42, 0x2b, 0xd8, 0xc1, 0x08, 0x0d, 0x04, 0xf4, 0x08, 0xa1, 0x55, 0xec, 0x0d, 0x84, 0x1e, + 0x09, 0xe8, 0x04, 0xa1, 0xb5, 0xad, 0xcc, 0xf6, 0x3a, 0x42, 0x31, 0xc5, 0x6e, 0x40, 0xd1, 0x34, + 0x42, 0x0b, 0x11, 0x75, 0xd1, 0xe4, 0x08, 0x80, 0x38, 0x9c, 0x71, 0x88, 0xdb, 0x10, 0x8d, 0x8e, + 0x00, 0x4c, 0x85, 0x0a, 0x92, 0x45, 0x78, 0x45, 0xe0, 0x65, 0x20, 0xfb, 0x10, 0xaa, 0xa6, 0x35, + 0xb6, 0xa7, 0x86, 0xc3, 0xdb, 0xb4, 0xb9, 0x95, 0xd9, 0xae, 0x3c, 0xdc, 0x78, 0x40, 0x6b, 0x22, + 0xc6, 0xec, 0xad, 0x69, 0x29, 0x32, 0xf6, 0x09, 0xd4, 0x44, 0xfa, 0xfd, 0x87, 0xd4, 0xb1, 0x8c, + 0xf8, 0x94, 0x14, 0xdf, 0xfb, 0x0f, 0x3f, 0xd9, 0x5b, 0xd3, 0xd2, 0x84, 0xec, 0x2e, 0x54, 0xe3, + 0x25, 0x82, 0x8c, 0x97, 0x44, 0xad, 0x52, 0x50, 0x6c, 0xd6, 0x57, 0x81, 0xe7, 0x22, 0xc1, 0x65, + 0xd1, 0x6f, 0x11, 0x80, 0x6d, 0x01, 0x98, 0xd6, 0xc4, 0x98, 0x3b, 0x21, 0xa2, 0xaf, 0x88, 0x0e, + 0x94, 0x60, 0xec, 0x16, 0x94, 0xe7, 0x33, 0x6c, 0xe5, 0x13, 0xc3, 0x69, 0x5c, 0x15, 0x04, 0x09, + 0x08, 0x73, 0xc7, 0x79, 0x8e, 0xd8, 0x6b, 0x62, 0x74, 0x23, 0x00, 0x0e, 0xef, 0x33, 0x6b, 0x8c, + 0xa8, 0x86, 0x28, 0x58, 0xa4, 0x71, 0x15, 0xd9, 0xc1, 0x8e, 0xed, 0x36, 0xae, 0xd3, 0x0c, 0xe6, + 0x09, 0x76, 0x13, 0xb2, 0x81, 0x3f, 0x6e, 0xdc, 0xa0, 0xf6, 0x03, 0x6f, 0x7f, 0xe7, 0x7c, 0xe6, + 0x6b, 0x08, 0xde, 0x29, 0x42, 0x9e, 0x56, 0x93, 0x7a, 0x13, 0x4a, 0x07, 0x86, 0x6f, 0x4c, 0x35, + 0x6b, 0xc2, 0x14, 0xc8, 0xce, 0xbc, 0x40, 0xac, 0x23, 0xfc, 0xa9, 0xf6, 0xa0, 0xf0, 0xc4, 0xf0, + 0x11, 0xc7, 0x20, 0xe7, 0x1a, 0x53, 0x8b, 0x90, 0x65, 0x8d, 0x7e, 0xe3, 0xda, 0x09, 0x2e, 0x82, + 0xd0, 0x9a, 0x0a, 0x21, 0x21, 0x52, 0x08, 0x3f, 0x76, 0xbc, 0x23, 0xb1, 0x46, 0x4a, 0x9a, 0x48, + 0xa9, 0xff, 0x4f, 0x06, 0x0a, 0x2d, 0xcf, 0xc1, 0xec, 0xae, 0x41, 0xd1, 0xb7, 0x1c, 0x3d, 0x29, + 0xae, 0xe0, 0x5b, 0xce, 0x81, 0x17, 0x20, 0x62, 0xec, 0x71, 0x04, 0x5f, 0xb5, 0x85, 0xb1, 0x47, + 0x88, 0xa8, 0x02, 0x59, 0xa9, 0x02, 0xd7, 0xa1, 0x14, 0x1e, 0x39, 0x3a, 0xc1, 0x73, 0x04, 0x2f, + 0x86, 0x47, 0x4e, 0x1f, 0x51, 0xd7, 0xa0, 0x68, 0x1e, 0x71, 0x4c, 0x9e, 0x30, 0x05, 0xf3, 0x08, + 0x11, 0xea, 0xa7, 0x50, 0xd6, 0x8c, 0x33, 0x51, 0x8d, 0x2b, 0x50, 0xc0, 0x0c, 0x84, 0xfc, 0xcb, + 0x69, 0xf9, 0xf0, 0xc8, 0xe9, 0x9a, 0x08, 0xc6, 0x4a, 0xd8, 0x26, 0xd5, 0x21, 0xa7, 0xe5, 0xc7, + 0x9e, 0xd3, 0x35, 0xd5, 0x11, 0x40, 0xcb, 0xf3, 0xfd, 0xef, 0xdc, 0x84, 0xcb, 0x90, 0x37, 0xad, + 0x59, 0x78, 0xc2, 0x45, 0x87, 0xc6, 0x13, 0xea, 0x7d, 0x28, 0xe1, 0xb8, 0xf4, 0xec, 0x20, 0x64, + 0xb7, 0x20, 0xe7, 0xd8, 0x41, 0xd8, 0xc8, 0x6c, 0x65, 0x17, 0x46, 0x8d, 0xe0, 0xea, 0x16, 0x94, + 0xf6, 0x8d, 0xf3, 0x27, 0x38, 0x72, 0x98, 0x1b, 0x0d, 0xa1, 0x18, 0x12, 0x31, 0x9e, 0x55, 0x80, + 0x91, 0xe1, 0x1f, 0x5b, 0x21, 0x49, 0xba, 0xff, 0x96, 0x81, 0xca, 0x70, 0x7e, 0xf4, 0xf5, 0xdc, + 0xf2, 0x2f, 0xb0, 0xce, 0xdb, 0x90, 0x0d, 0x2f, 0x66, 0xc4, 0x51, 0x7f, 0x78, 0x95, 0x67, 0x2f, + 0xe1, 0x1f, 0x20, 0x93, 0x86, 0x24, 0xd8, 0x08, 0xd7, 0x33, 0xad, 0xa8, 0x0f, 0xf2, 0x5a, 0x01, + 0x93, 0x5d, 0x13, 0xb7, 0x0b, 0x6f, 0x26, 0x46, 0x61, 0xdd, 0x9b, 0xb1, 0x2d, 0xc8, 0x8f, 0x4f, + 0x6c, 0xc7, 0xa4, 0x01, 0x48, 0xd7, 0x99, 0x23, 0x70, 0x94, 0x7c, 0xef, 0x4c, 0x0f, 0xec, 0x9f, + 0x44, 0xe2, 0xbf, 0xe8, 0x7b, 0x67, 0x43, 0xfb, 0x27, 0x96, 0x3a, 0x12, 0x7b, 0x10, 0x40, 0x61, + 0xd8, 0x6a, 0xf6, 0x9a, 0x9a, 0xb2, 0x86, 0xbf, 0x3b, 0x5f, 0x74, 0x87, 0xa3, 0xa1, 0x92, 0x61, + 0x75, 0x80, 0xfe, 0x60, 0xa4, 0x8b, 0xf4, 0x3a, 0x2b, 0xc0, 0x7a, 0xb7, 0xaf, 0x64, 0x91, 0x06, + 0xe1, 0xdd, 0xbe, 0x92, 0x63, 0x45, 0xc8, 0x36, 0xfb, 0x5f, 0x2a, 0x79, 0xfa, 0xd1, 0xeb, 0x29, + 0x05, 0xf5, 0x4f, 0xd7, 0xa1, 0x3c, 0x38, 0xfa, 0xca, 0x1a, 0x87, 0xd8, 0x66, 0x9c, 0xa5, 0x96, + 0xff, 0xcc, 0xf2, 0xa9, 0xd9, 0x59, 0x4d, 0xa4, 0xb0, 0x21, 0xe6, 0x11, 0x35, 0x2e, 0xab, 0xad, + 0x9b, 0x47, 0x44, 0x37, 0x3e, 0xb1, 0xa6, 0x06, 0x35, 0x0e, 0xe9, 0x28, 0x85, 0xab, 0xc2, 0x3b, + 0xfa, 0x8a, 0x9a, 0x97, 0xd5, 0xf0, 0x27, 0xbb, 0x0d, 0x15, 0x9e, 0x87, 0x3c, 0xbf, 0x80, 0x83, + 0x16, 0x27, 0x5f, 0x41, 0x9e, 0x7c, 0xc4, 0x49, 0xb9, 0x72, 0xa4, 0xd8, 0xdb, 0x38, 0xa8, 0x2f, + 0x66, 0xb4, 0x77, 0xf4, 0x15, 0xc7, 0x96, 0xf8, 0x8c, 0xf6, 0x8e, 0xbe, 0x22, 0xd4, 0x5b, 0xb0, + 0x19, 0xcc, 0x8f, 0x82, 0xb1, 0x6f, 0xcf, 0x42, 0xdb, 0x73, 0x39, 0x4d, 0x99, 0x68, 0x14, 0x19, + 0x41, 0xc4, 0xdb, 0x50, 0x9a, 0xcd, 0x8f, 0x74, 0xdb, 0x9d, 0x78, 0x24, 0xf6, 0x2b, 0x0f, 0x6b, + 0x7c, 0x60, 0x0e, 0xe6, 0x47, 0x5d, 0x77, 0xe2, 0x69, 0xc5, 0x19, 0xff, 0xc1, 0x54, 0xa8, 0xb9, + 0x5e, 0xa8, 0xa3, 0xaa, 0xa0, 0x4f, 0xad, 0xd0, 0xa0, 0xfd, 0x80, 0x6f, 0xf8, 0x3d, 0x6f, 0x7c, + 0xba, 0x6f, 0x85, 0x86, 0x7a, 0x0f, 0x8a, 0x82, 0x0f, 0xf7, 0xfe, 0xd0, 0x72, 0x0d, 0x37, 0xd4, + 0x63, 0xa5, 0xa1, 0xc4, 0x01, 0x5d, 0x53, 0xfd, 0x59, 0x06, 0x94, 0xa1, 0x54, 0x15, 0x64, 0x5e, + 0x29, 0x39, 0x5e, 0x05, 0x30, 0xc6, 0x63, 0x6f, 0xce, 0xb3, 0xe1, 0x13, 0xac, 0x2c, 0x20, 0x5d, + 0x53, 0xee, 0xbf, 0x6c, 0xaa, 0xff, 0x5e, 0x83, 0x6a, 0xc4, 0x27, 0x2d, 0xfa, 0x8a, 0x80, 0x45, + 0x3d, 0x18, 0xcc, 0x53, 0x2b, 0xbf, 0x18, 0xcc, 0x39, 0xf7, 0x55, 0x28, 0x90, 0x86, 0x11, 0x44, + 0xa3, 0xc2, 0x53, 0xea, 0x9f, 0x65, 0xa0, 0xd6, 0x75, 0x4d, 0xeb, 0x7c, 0x38, 0x36, 0xdc, 0xa8, + 0x53, 0xec, 0x40, 0xb7, 0x11, 0xa6, 0x07, 0x63, 0xc3, 0x15, 0xca, 0x41, 0xc5, 0x0e, 0x62, 0x3a, + 0x6c, 0x03, 0x27, 0xa0, 0xa2, 0xd6, 0x29, 0xc7, 0x32, 0x41, 0xa8, 0xb0, 0x7b, 0xb0, 0x71, 0x64, + 0x39, 0x9e, 0x7b, 0xac, 0x87, 0x9e, 0xce, 0xb5, 0x1c, 0xde, 0x96, 0x1a, 0x07, 0x8f, 0xbc, 0x11, + 0x69, 0x3b, 0x97, 0x21, 0x3f, 0x33, 0xfc, 0x30, 0x68, 0xe4, 0xb6, 0xb2, 0xb8, 0x8c, 0x29, 0x81, + 0xdd, 0x6c, 0x07, 0xfa, 0xdc, 0xb5, 0xbf, 0x9e, 0xf3, 0x66, 0x94, 0xb4, 0x92, 0x1d, 0x1c, 0x52, + 0x9a, 0x6d, 0x83, 0xc2, 0x4b, 0xa6, 0x6c, 0xe5, 0x79, 0x56, 0x27, 0x38, 0x65, 0x4c, 0xc2, 0xee, + 0xff, 0x5d, 0x87, 0xd2, 0xee, 0xdc, 0x1d, 0xe3, 0x60, 0xb0, 0x3b, 0x90, 0x9b, 0xcc, 0xdd, 0x31, + 0xb5, 0x25, 0xde, 0x4a, 0xe3, 0x75, 0xa2, 0x11, 0x12, 0x25, 0x90, 0xe1, 0x1f, 0xa3, 0xe4, 0x5a, + 0x92, 0x40, 0x08, 0x57, 0xff, 0x61, 0x86, 0xe7, 0xb8, 0xeb, 0x18, 0xc7, 0xac, 0x04, 0xb9, 0xfe, + 0xa0, 0xdf, 0x51, 0xd6, 0x58, 0x15, 0x4a, 0xdd, 0xfe, 0xa8, 0xa3, 0xf5, 0x9b, 0x3d, 0x25, 0x43, + 0xcb, 0x79, 0xd4, 0xdc, 0xe9, 0x75, 0x94, 0x75, 0xc4, 0x3c, 0x19, 0xf4, 0x9a, 0xa3, 0x6e, 0xaf, + 0xa3, 0xe4, 0x38, 0x46, 0xeb, 0xb6, 0x46, 0x4a, 0x89, 0x29, 0x50, 0x3d, 0xd0, 0x06, 0xed, 0xc3, + 0x56, 0x47, 0xef, 0x1f, 0xf6, 0x7a, 0x8a, 0xc2, 0x2e, 0xc1, 0x46, 0x0c, 0x19, 0x70, 0xe0, 0x16, + 0xb2, 0x3c, 0x69, 0x6a, 0x4d, 0xed, 0xb1, 0xf2, 0x43, 0x56, 0x82, 0x6c, 0xf3, 0xf1, 0x63, 0xe5, + 0xa7, 0x28, 0x19, 0xca, 0x4f, 0xbb, 0x7d, 0xfd, 0x49, 0xb3, 0x77, 0xd8, 0x51, 0x7e, 0xba, 0x1e, + 0xa5, 0x07, 0x5a, 0xbb, 0xa3, 0x29, 0x3f, 0xcd, 0xb1, 0x4d, 0xa8, 0xfe, 0x78, 0xd0, 0xef, 0xec, + 0x37, 0x0f, 0x0e, 0xa8, 0x22, 0x3f, 0x2d, 0xa9, 0xff, 0x39, 0x07, 0x39, 0x6c, 0x09, 0x53, 0x13, + 0x29, 0x18, 0x37, 0x11, 0xc5, 0xd0, 0x4e, 0xee, 0x4f, 0xfe, 0xe2, 0xf6, 0x1a, 0x97, 0x7f, 0xaf, + 0x41, 0xd6, 0xb1, 0x43, 0x1a, 0xd6, 0x78, 0xed, 0x08, 0x9d, 0x71, 0x6f, 0x4d, 0x43, 0x1c, 0xbb, + 0x05, 0x19, 0x2e, 0x08, 0x2b, 0x0f, 0xeb, 0x62, 0x71, 0x89, 0x9d, 0x74, 0x6f, 0x4d, 0xcb, 0xcc, + 0xd8, 0x4d, 0xc8, 0x3c, 0x13, 0x52, 0xb1, 0xca, 0xf1, 0x7c, 0x2f, 0x45, 0xec, 0x33, 0xb6, 0x05, + 0xd9, 0xb1, 0xc7, 0x35, 0xc2, 0x18, 0xcf, 0x77, 0x16, 0xcc, 0x7f, 0xec, 0x39, 0xec, 0x0e, 0x64, + 0x7d, 0xe3, 0x8c, 0x46, 0x36, 0x1e, 0xae, 0x78, 0xeb, 0x42, 0x22, 0xdf, 0x38, 0xc3, 0x4a, 0x4c, + 0x48, 0x8e, 0xc4, 0x95, 0x88, 0xc6, 0x1b, 0x8b, 0x99, 0xb0, 0x2d, 0xc8, 0x9c, 0x91, 0x24, 0x89, + 0x95, 0xa0, 0xa7, 0xb6, 0x6b, 0x7a, 0x67, 0xc3, 0x99, 0x35, 0x46, 0x8a, 0x33, 0xf6, 0x3a, 0x64, + 0x83, 0xf9, 0x11, 0x49, 0x92, 0xca, 0xc3, 0xcd, 0xa5, 0x3d, 0x01, 0x0b, 0x0a, 0xe6, 0x47, 0xec, + 0x1e, 0xe4, 0xc6, 0x9e, 0xef, 0x0b, 0x69, 0xa2, 0x44, 0x15, 0x8e, 0xb6, 0x43, 0x54, 0x0a, 0x11, + 0x8f, 0x05, 0x86, 0x24, 0x43, 0x62, 0xa2, 0x64, 0x3f, 0xc2, 0x02, 0x43, 0x76, 0x57, 0x6c, 0x72, + 0x55, 0xb9, 0xd6, 0xd1, 0x16, 0x88, 0xf9, 0x20, 0x16, 0x07, 0x69, 0x6a, 0x9c, 0x93, 0xc6, 0x19, + 0x13, 0x45, 0x7b, 0x1f, 0xd6, 0x69, 0x6a, 0x9c, 0xb3, 0xbb, 0x90, 0x7d, 0x66, 0x8d, 0x49, 0xf9, + 0x8c, 0x4b, 0x13, 0x83, 0xf4, 0x84, 0x9a, 0x87, 0x68, 0x9a, 0xf7, 0x9e, 0x63, 0x92, 0x1e, 0x1a, + 0x8f, 0xe5, 0xae, 0xe7, 0x98, 0x4f, 0x68, 0x2c, 0x09, 0x89, 0x5b, 0xbe, 0x31, 0x3f, 0x47, 0x69, + 0xa4, 0xf0, 0xcd, 0xd9, 0x98, 0x9f, 0x77, 0x4d, 0x14, 0xfe, 0xae, 0xf9, 0x8c, 0xb4, 0xcf, 0x8c, + 0x86, 0x3f, 0xd1, 0x3c, 0x0a, 0x2c, 0xc7, 0x1a, 0x87, 0xf6, 0x33, 0x3b, 0xbc, 0x20, 0xfd, 0x32, + 0xa3, 0xc9, 0xa0, 0x9d, 0x02, 0xe4, 0xac, 0xf3, 0x99, 0xaf, 0xee, 0x41, 0x51, 0x94, 0xb2, 0x64, + 0x63, 0x5d, 0x87, 0x92, 0x1d, 0xe8, 0x63, 0xcf, 0x0d, 0x42, 0xa1, 0x3b, 0x15, 0xed, 0xa0, 0x85, + 0x49, 0x14, 0x97, 0xa6, 0x11, 0xf2, 0x4d, 0xa8, 0xaa, 0xd1, 0x6f, 0xf5, 0x21, 0x40, 0xd2, 0x2c, + 0xac, 0x93, 0x63, 0xb9, 0x91, 0x9a, 0xe6, 0x58, 0x6e, 0xcc, 0xb3, 0x2e, 0xf1, 0x5c, 0x87, 0x72, + 0xac, 0x19, 0xb3, 0x2a, 0x64, 0x0c, 0xb1, 0xfd, 0x65, 0x0c, 0x75, 0x1b, 0x15, 0xd5, 0x48, 0xf7, + 0x4d, 0xe3, 0x30, 0x15, 0x6d, 0x8a, 0x99, 0x23, 0xf5, 0xfb, 0x50, 0xd5, 0xac, 0x60, 0xee, 0x84, + 0x2d, 0xcf, 0x69, 0x5b, 0x13, 0xf6, 0x36, 0x40, 0x9c, 0x0e, 0x84, 0x96, 0x92, 0xcc, 0xdd, 0xb6, + 0x35, 0xd1, 0x24, 0xbc, 0xfa, 0x1f, 0x73, 0xa4, 0xef, 0xb5, 0xb9, 0xa2, 0x25, 0x34, 0xaa, 0x8c, + 0xa4, 0x51, 0xc5, 0x7b, 0xc3, 0x7a, 0x5a, 0xab, 0x3c, 0xb1, 0x4d, 0xd3, 0x72, 0x23, 0xed, 0x91, + 0xa7, 0x70, 0xb0, 0x0d, 0xe7, 0x98, 0x16, 0x54, 0xfd, 0x21, 0x8b, 0x0a, 0x9d, 0xce, 0x7c, 0x2b, + 0x08, 0xb8, 0xde, 0x62, 0x38, 0xc7, 0xd1, 0xda, 0xce, 0xbf, 0x68, 0x6d, 0x5f, 0x87, 0x12, 0x6e, + 0x79, 0x64, 0xf5, 0x15, 0x78, 0xef, 0x0b, 0xf3, 0x96, 0xbd, 0x01, 0x45, 0xa1, 0xaf, 0x8b, 0x45, + 0x25, 0xa6, 0x4b, 0x9b, 0x03, 0xb5, 0x08, 0xcb, 0x1a, 0xa8, 0xe4, 0x4d, 0xa7, 0x96, 0x1b, 0x46, + 0xfb, 0xb4, 0x48, 0xb2, 0xb7, 0xa0, 0xec, 0xb9, 0x3a, 0x57, 0xea, 0xc5, 0xaa, 0x12, 0xd3, 0x77, + 0xe0, 0x1e, 0x12, 0x54, 0x2b, 0x79, 0xe2, 0x17, 0x56, 0xc5, 0xf1, 0xce, 0xf4, 0xb1, 0xe1, 0x9b, + 0xb4, 0xb2, 0x4a, 0x5a, 0xd1, 0xf1, 0xce, 0x5a, 0x86, 0x6f, 0x72, 0xbd, 0xe5, 0x6b, 0x77, 0x3e, + 0xa5, 0xd5, 0x54, 0xd3, 0x44, 0x8a, 0xdd, 0x84, 0xf2, 0xd8, 0x99, 0x07, 0xa1, 0xe5, 0xef, 0x5c, + 0x70, 0x33, 0x4d, 0x4b, 0x00, 0x58, 0xaf, 0x99, 0x6f, 0x4f, 0x0d, 0xff, 0x82, 0x96, 0x4e, 0x49, + 0x8b, 0x92, 0xb4, 0xd1, 0x9c, 0xda, 0xe6, 0x39, 0xb7, 0xd5, 0x34, 0x9e, 0x40, 0xfa, 0x13, 0xb2, + 0xa4, 0x03, 0x5a, 0x1f, 0x25, 0x2d, 0x4a, 0xd2, 0x38, 0xd0, 0x4f, 0x5a, 0x11, 0x65, 0x4d, 0xa4, + 0x52, 0x4a, 0xf7, 0xe6, 0x73, 0x95, 0x6e, 0xb6, 0xa8, 0xf7, 0x78, 0xbe, 0x7d, 0x6c, 0x0b, 0xad, + 0xe5, 0x12, 0xd7, 0x7b, 0x38, 0x88, 0x08, 0x3e, 0x86, 0xda, 0xb1, 0xe5, 0x5a, 0xbe, 0x11, 0x5a, + 0xa6, 0x8e, 0x72, 0xf1, 0x32, 0x75, 0x9c, 0x18, 0xe6, 0xc7, 0x11, 0x0a, 0x65, 0x4d, 0xf5, 0x58, + 0x4a, 0xa9, 0x5f, 0x43, 0x51, 0x8c, 0x0d, 0x6e, 0x5d, 0xb8, 0xee, 0xd2, 0x72, 0x9d, 0x6f, 0x5d, + 0x08, 0x67, 0x77, 0xa0, 0x26, 0x2a, 0x11, 0x84, 0xbe, 0xed, 0x1e, 0x8b, 0x59, 0x57, 0xe5, 0xc0, + 0x21, 0xc1, 0x50, 0xc3, 0xc0, 0x79, 0xa1, 0x1b, 0x47, 0xb6, 0x83, 0xeb, 0x3b, 0x2b, 0xb4, 0xa1, + 0xb9, 0xe3, 0x34, 0x39, 0x48, 0x1d, 0x40, 0x29, 0x1a, 0xc9, 0x5f, 0x4a, 0x99, 0xea, 0x0c, 0xaa, + 0x72, 0x0b, 0x7f, 0x39, 0x0d, 0xe1, 0x1a, 0x44, 0x10, 0x7a, 0xbe, 0x65, 0x46, 0x4e, 0x1a, 0x3b, + 0x18, 0x52, 0x5a, 0xfd, 0xad, 0x0c, 0x54, 0x48, 0x93, 0x19, 0x90, 0x9e, 0xc6, 0xde, 0x06, 0x36, + 0xf6, 0x2d, 0x23, 0xb4, 0x74, 0xeb, 0x3c, 0xf4, 0x0d, 0xa1, 0xaf, 0x70, 0xa5, 0x47, 0xe1, 0x98, + 0x0e, 0x22, 0xb8, 0xca, 0x72, 0x1b, 0x2a, 0x33, 0xc3, 0x0f, 0x22, 0xfd, 0x97, 0x97, 0x0e, 0x1c, + 0x24, 0xb4, 0x4f, 0xc5, 0x3d, 0xf6, 0x8d, 0xa9, 0x1e, 0x7a, 0xa7, 0x96, 0xcb, 0x35, 0x7f, 0x6e, + 0xf3, 0xd4, 0x09, 0x3e, 0x42, 0x30, 0x19, 0x00, 0xff, 0x36, 0x03, 0xb5, 0x03, 0x3e, 0x41, 0x3f, + 0xb7, 0x2e, 0xda, 0xdc, 0xd0, 0x1c, 0x47, 0xc2, 0x25, 0xa7, 0xd1, 0x6f, 0x76, 0x0b, 0x2a, 0xb3, + 0x53, 0xeb, 0x42, 0x4f, 0x19, 0x65, 0x65, 0x04, 0xb5, 0x48, 0x8c, 0xbc, 0x09, 0x05, 0x8f, 0x1a, + 0x22, 0xb6, 0x63, 0xb1, 0x8b, 0x49, 0x2d, 0xd4, 0x04, 0x01, 0x6a, 0x76, 0x71, 0x56, 0xb2, 0x0a, + 0x29, 0x32, 0xa3, 0xea, 0x5f, 0x86, 0x3c, 0xa2, 0x82, 0x46, 0x9e, 0xab, 0x64, 0x94, 0x60, 0xef, + 0x41, 0x6d, 0xec, 0x4d, 0x67, 0x7a, 0xc4, 0x2e, 0x36, 0xe6, 0xb4, 0xf8, 0xab, 0x20, 0xc9, 0x01, + 0xcf, 0x4b, 0xfd, 0xbd, 0x2c, 0x94, 0xa8, 0x0e, 0x42, 0x02, 0xda, 0xe6, 0x79, 0x24, 0x01, 0xcb, + 0x5a, 0xde, 0x36, 0x71, 0x83, 0x79, 0x89, 0x16, 0x19, 0x6b, 0x87, 0x59, 0x59, 0x3b, 0xbc, 0x0a, + 0x05, 0xa1, 0x1a, 0xe6, 0xb8, 0x88, 0x9c, 0x3f, 0x5f, 0x31, 0xcc, 0xaf, 0x52, 0x0c, 0x71, 0x08, + 0x39, 0x8d, 0x75, 0x8e, 0x5b, 0x31, 0x97, 0x82, 0x40, 0xa0, 0x0e, 0x42, 0x64, 0xf9, 0x56, 0x4c, + 0xcb, 0xb7, 0x06, 0x14, 0x9f, 0xd9, 0x81, 0x8d, 0x13, 0xa4, 0xc4, 0x25, 0x86, 0x48, 0x4a, 0xc3, + 0x50, 0x7e, 0xd9, 0x30, 0xc4, 0xcd, 0x36, 0x9c, 0x63, 0x6e, 0xa1, 0x44, 0xcd, 0x6e, 0x3a, 0xc7, + 0x1e, 0x7b, 0x1f, 0xae, 0x24, 0x68, 0xd1, 0x1a, 0xf2, 0xe4, 0x91, 0xb3, 0x4a, 0x63, 0x31, 0x25, + 0xb5, 0x88, 0x4c, 0xc8, 0xfb, 0xb0, 0x29, 0xb1, 0xcc, 0x50, 0x13, 0x0b, 0x48, 0x3c, 0x96, 0xb5, + 0x8d, 0x98, 0x9c, 0x14, 0xb4, 0x40, 0xfd, 0x27, 0xeb, 0x50, 0xdb, 0xf5, 0x7c, 0xcb, 0x3e, 0x76, + 0x93, 0x59, 0xb7, 0x64, 0xa4, 0x44, 0x33, 0x71, 0x5d, 0x9a, 0x89, 0xb7, 0xa1, 0x32, 0xe1, 0x8c, + 0x7a, 0x78, 0xc4, 0xfd, 0x1b, 0x39, 0x0d, 0x04, 0x68, 0x74, 0xe4, 0xa0, 0xfc, 0x88, 0x08, 0x88, + 0x39, 0x47, 0xcc, 0x11, 0x13, 0x6e, 0x8b, 0xec, 0x7b, 0xb4, 0x41, 0x98, 0x96, 0x63, 0x85, 0x7c, + 0x78, 0xea, 0x0f, 0x5f, 0x8d, 0x94, 0x12, 0xa9, 0x4e, 0x0f, 0x34, 0x6b, 0xd2, 0x24, 0x4d, 0x0e, + 0xf7, 0x8b, 0x36, 0x91, 0x0b, 0x5e, 0xb1, 0xb9, 0x14, 0xbe, 0x21, 0x2f, 0x97, 0x55, 0xea, 0x08, + 0xca, 0x31, 0x18, 0xd5, 0x72, 0xad, 0x23, 0x54, 0xf1, 0x35, 0x56, 0x81, 0x62, 0xab, 0x39, 0x6c, + 0x35, 0xdb, 0x1d, 0x25, 0x83, 0xa8, 0x61, 0x67, 0xc4, 0xd5, 0xef, 0x75, 0xb6, 0x01, 0x15, 0x4c, + 0xb5, 0x3b, 0xbb, 0xcd, 0xc3, 0xde, 0x48, 0xc9, 0xb2, 0x1a, 0x94, 0xfb, 0x03, 0xbd, 0xd9, 0x1a, + 0x75, 0x07, 0x7d, 0x25, 0xa7, 0xfe, 0x10, 0x4a, 0xad, 0x13, 0x6b, 0x7c, 0xfa, 0xbc, 0x5e, 0x24, + 0xff, 0x80, 0x35, 0x3e, 0x15, 0xaa, 0xf4, 0x82, 0x7f, 0xc0, 0x1a, 0x9f, 0xaa, 0x1d, 0x28, 0x1f, + 0x18, 0x7e, 0x68, 0x53, 0xbd, 0x3e, 0x81, 0x5a, 0x9c, 0x68, 0x5b, 0x93, 0x48, 0xc9, 0x60, 0xb1, + 0x82, 0x1d, 0xa3, 0xb4, 0x34, 0xa1, 0xfa, 0x36, 0x54, 0x65, 0x00, 0xbb, 0x09, 0x59, 0xd3, 0x9a, + 0xac, 0x10, 0xa2, 0x08, 0x56, 0x9f, 0x40, 0xb5, 0x15, 0x6d, 0x9a, 0xcf, 0xab, 0xfa, 0x43, 0xa8, + 0xd3, 0x8a, 0x1f, 0x1f, 0x45, 0x4b, 0x7e, 0x7d, 0xc5, 0x92, 0xaf, 0x22, 0x4d, 0xeb, 0x48, 0xac, + 0xf9, 0x0f, 0xa1, 0x72, 0xe0, 0x7b, 0x33, 0xcb, 0x0f, 0x29, 0x5b, 0x05, 0xb2, 0xa7, 0xd6, 0x85, + 0xc8, 0x15, 0x7f, 0x26, 0x6e, 0x9b, 0x75, 0xd9, 0x6d, 0xf3, 0x10, 0x4a, 0x11, 0xdb, 0x37, 0xe6, + 0xf9, 0x01, 0x8a, 0x4e, 0xe2, 0xb1, 0xad, 0x00, 0x0b, 0x7b, 0x00, 0x30, 0x8b, 0x01, 0xa2, 0xe3, + 0x22, 0xcb, 0x44, 0x64, 0xae, 0x49, 0x14, 0xea, 0xab, 0x50, 0x7c, 0x62, 0x5b, 0x67, 0xa2, 0xf9, + 0xcf, 0x6c, 0xeb, 0x2c, 0x6a, 0x3e, 0xfe, 0x56, 0xff, 0x47, 0x19, 0x4a, 0xb4, 0xbe, 0xda, 0xcf, + 0xf7, 0x94, 0x7d, 0x1b, 0x05, 0x6e, 0x4b, 0xac, 0xa7, 0xdc, 0x0a, 0xb5, 0x91, 0xaf, 0xae, 0x57, + 0x01, 0xa4, 0xb5, 0xce, 0x25, 0x57, 0x39, 0x8c, 0x97, 0x38, 0x6a, 0x3e, 0xb4, 0x17, 0x05, 0x5f, + 0x3b, 0xc2, 0xe0, 0x4d, 0x00, 0xec, 0x01, 0xd7, 0x4b, 0xc8, 0xc4, 0xe5, 0xba, 0xdb, 0xa5, 0xc8, + 0xfe, 0x38, 0x72, 0xac, 0xc8, 0x2a, 0x22, 0x65, 0x05, 0x13, 0x24, 0xc7, 0x2c, 0x3f, 0x40, 0x71, + 0x45, 0xae, 0x74, 0x2d, 0x4a, 0xb2, 0x37, 0x20, 0x87, 0x42, 0x5e, 0x58, 0x31, 0x97, 0xa2, 0x1e, + 0x94, 0x76, 0x29, 0x8d, 0x08, 0xd8, 0x36, 0x14, 0x49, 0xb4, 0x58, 0x28, 0x69, 0xa4, 0xde, 0x8e, + 0x84, 0xbe, 0x16, 0xa1, 0xd9, 0x9b, 0x90, 0x9f, 0x9c, 0x5a, 0x17, 0x41, 0xa3, 0x46, 0x74, 0x97, + 0x56, 0xac, 0x59, 0x8d, 0x53, 0xb0, 0xbb, 0x50, 0xf7, 0xad, 0x89, 0x4e, 0xbe, 0x33, 0x14, 0x32, + 0x41, 0xa3, 0x4e, 0x32, 0xa4, 0xea, 0x5b, 0x93, 0x16, 0x02, 0x47, 0x47, 0x4e, 0xc0, 0xee, 0x41, + 0x81, 0x56, 0x0f, 0xaa, 0x6d, 0x52, 0xc9, 0xd1, 0x52, 0xd4, 0x04, 0x96, 0xbd, 0x0f, 0x20, 0x94, + 0x43, 0xfd, 0xe8, 0x82, 0x7c, 0xce, 0xf1, 0x62, 0x92, 0xe7, 0xbf, 0xac, 0x42, 0xbe, 0x01, 0x79, + 0x9c, 0x24, 0x41, 0xe3, 0x1a, 0xe5, 0xbc, 0x99, 0x9e, 0x41, 0x54, 0x53, 0xc2, 0xb3, 0x6d, 0x28, + 0xe1, 0x44, 0xd1, 0x71, 0x38, 0x1a, 0xb2, 0xb6, 0x2c, 0x66, 0x15, 0xee, 0x0c, 0xd6, 0xd9, 0xf0, + 0x6b, 0x87, 0xdd, 0x87, 0x9c, 0x89, 0x8b, 0xf9, 0x3a, 0xe5, 0x78, 0x55, 0x1a, 0x17, 0x14, 0x56, + 0x6d, 0x6b, 0x42, 0x0a, 0x3c, 0xd1, 0xb0, 0x3d, 0xa8, 0xe3, 0x34, 0x7a, 0x48, 0x9b, 0x3d, 0x76, + 0x5f, 0xe3, 0x06, 0x71, 0xbd, 0xb6, 0xc0, 0xd5, 0x17, 0x44, 0xd4, 0xd9, 0x1d, 0x37, 0xf4, 0x2f, + 0xb4, 0x9a, 0x2b, 0xc3, 0xd8, 0x0d, 0xb4, 0xb2, 0x7a, 0xde, 0xf8, 0xd4, 0x32, 0x1b, 0xaf, 0x44, + 0x1a, 0x10, 0x4f, 0xb3, 0x4f, 0xa1, 0x46, 0x13, 0x0b, 0x93, 0x58, 0x78, 0xe3, 0x26, 0x09, 0x53, + 0x79, 0xca, 0x44, 0x28, 0x2d, 0x4d, 0x89, 0x22, 0xde, 0x0e, 0xf4, 0xd0, 0x9a, 0xce, 0x3c, 0x1f, + 0xf5, 0xec, 0x57, 0x23, 0xdf, 0xd0, 0x28, 0x02, 0xe1, 0x46, 0x1c, 0x9f, 0x90, 0xe9, 0xde, 0x64, + 0x12, 0x58, 0x61, 0xe3, 0x16, 0xad, 0x9b, 0x7a, 0x74, 0x50, 0x36, 0x20, 0x28, 0x6d, 0x84, 0x81, + 0x6e, 0x5e, 0xb8, 0xc6, 0xd4, 0x1e, 0x37, 0x6e, 0x73, 0x75, 0xde, 0x0e, 0xda, 0x1c, 0x20, 0x6b, + 0xd4, 0x5b, 0x29, 0x8d, 0xfa, 0x12, 0xe4, 0xcd, 0x23, 0x5c, 0x8e, 0xaf, 0x51, 0xb6, 0x39, 0xf3, + 0xa8, 0x6b, 0xb2, 0x77, 0xa0, 0x3c, 0x8b, 0x44, 0x60, 0x43, 0x95, 0xfd, 0x06, 0xb1, 0x64, 0xd4, + 0x12, 0x0a, 0x34, 0x65, 0x77, 0x2d, 0x23, 0x9c, 0xfb, 0xd6, 0xae, 0x63, 0x1c, 0x37, 0xee, 0x50, + 0x4e, 0x32, 0x08, 0x6b, 0xe7, 0x78, 0xc7, 0xf6, 0xd8, 0xa0, 0x95, 0x7f, 0x97, 0xeb, 0x5d, 0x02, + 0xd2, 0x35, 0x13, 0x45, 0xd4, 0x10, 0xca, 0xd4, 0xeb, 0xb2, 0x22, 0x6a, 0x38, 0x91, 0x23, 0x2c, + 0xe9, 0x0b, 0x6b, 0xe6, 0x8d, 0x4f, 0x1a, 0xf7, 0x68, 0xbd, 0xd5, 0xa2, 0xae, 0xe8, 0x20, 0xf0, + 0xc6, 0x63, 0xd2, 0xe4, 0xa9, 0x87, 0x3f, 0x5c, 0x10, 0x64, 0xa9, 0x65, 0x28, 0x49, 0xbc, 0xbd, + 0x35, 0x59, 0x9e, 0xed, 0xe4, 0x49, 0xe2, 0xdf, 0xf8, 0x21, 0xb0, 0xe5, 0xb9, 0xf1, 0x32, 0xa9, + 0x9a, 0x17, 0x52, 0xf5, 0x7b, 0xeb, 0x9f, 0x64, 0xd4, 0x27, 0x50, 0x4b, 0x09, 0x8d, 0x95, 0xbb, + 0x03, 0x57, 0xcd, 0x8c, 0xa9, 0xb0, 0xba, 0x79, 0x22, 0x52, 0xbb, 0x6d, 0xf7, 0x58, 0x38, 0xfc, + 0xb8, 0xda, 0x4d, 0x69, 0xf5, 0x4f, 0xb3, 0x50, 0xdd, 0x33, 0x82, 0x93, 0x7d, 0x63, 0x36, 0x0c, + 0x8d, 0x30, 0xc0, 0xa9, 0x74, 0x62, 0x04, 0x27, 0x53, 0x63, 0xc6, 0x95, 0xe4, 0x0c, 0xf7, 0x26, + 0x08, 0x18, 0x6a, 0xc8, 0x38, 0x89, 0x31, 0x39, 0x70, 0x0f, 0x3e, 0x17, 0xae, 0x82, 0x38, 0x8d, + 0x22, 0x2c, 0x38, 0x99, 0x4f, 0x26, 0x71, 0x51, 0x51, 0x92, 0xdd, 0x85, 0x9a, 0xf8, 0x49, 0x1a, + 0xf2, 0xb9, 0x38, 0x8d, 0x4d, 0x03, 0xd9, 0x23, 0xa8, 0x08, 0xc0, 0x28, 0x12, 0xb8, 0xf5, 0xd8, + 0x05, 0x94, 0x20, 0x34, 0x99, 0x8a, 0xfd, 0x08, 0xae, 0x48, 0xc9, 0x5d, 0xcf, 0xdf, 0x9f, 0x3b, + 0xa1, 0xdd, 0xea, 0x0b, 0x75, 0xe4, 0x95, 0x25, 0xf6, 0x84, 0x44, 0x5b, 0xcd, 0x99, 0xae, 0xed, + 0xbe, 0xed, 0x92, 0xfc, 0xce, 0x6a, 0x69, 0xe0, 0x02, 0x95, 0x71, 0x4e, 0x62, 0x3b, 0x4d, 0x65, + 0x9c, 0xe3, 0xc2, 0x16, 0x80, 0x7d, 0x2b, 0x3c, 0xf1, 0x4c, 0xd2, 0x45, 0xe3, 0x85, 0x3d, 0x94, + 0x51, 0x5a, 0x9a, 0x12, 0xbb, 0x13, 0xed, 0xbc, 0xb1, 0x1b, 0x92, 0x46, 0x9a, 0xd5, 0xa2, 0x24, + 0x6e, 0x69, 0xbe, 0xe1, 0x1e, 0x5b, 0x41, 0xa3, 0xb2, 0x95, 0xdd, 0xce, 0x68, 0x22, 0xa5, 0xfe, + 0xcd, 0x75, 0xc8, 0xf3, 0x91, 0x7c, 0x05, 0xca, 0x47, 0xe4, 0x43, 0x47, 0x83, 0x5d, 0xf8, 0xc5, + 0x09, 0xd0, 0x9f, 0x4f, 0xb9, 0x26, 0x29, 0x5c, 0x3d, 0x19, 0x8d, 0x7e, 0x63, 0x96, 0xde, 0x3c, + 0xc4, 0xb2, 0xb2, 0x04, 0x15, 0x29, 0xac, 0x84, 0xef, 0x9d, 0xd1, 0x6c, 0xc8, 0x11, 0x22, 0x4a, + 0x92, 0xeb, 0x9d, 0x76, 0x47, 0x64, 0xca, 0x13, 0xae, 0x44, 0x80, 0x96, 0x1b, 0x2e, 0xba, 0xa5, + 0x0a, 0x4b, 0x6e, 0x29, 0x76, 0x0b, 0x50, 0x4f, 0x1d, 0x5b, 0x03, 0xd7, 0x6a, 0xf5, 0xa9, 0x87, + 0x4b, 0x9a, 0x04, 0xc1, 0x05, 0x62, 0x7a, 0x33, 0xea, 0xd4, 0xbc, 0x86, 0x3f, 0xd9, 0x47, 0xf1, + 0xec, 0xa4, 0x36, 0x0a, 0xad, 0x5e, 0xec, 0x1e, 0xf2, 0x3c, 0xd6, 0x52, 0x74, 0x98, 0x13, 0x6e, + 0x09, 0x5c, 0xab, 0xc7, 0x9f, 0x6a, 0x07, 0x40, 0xf3, 0xce, 0x02, 0x2b, 0x24, 0xff, 0xeb, 0x35, + 0x6a, 0x62, 0xea, 0xe4, 0xcc, 0x3b, 0x3b, 0xf0, 0x82, 0xd8, 0xf0, 0x5d, 0x5f, 0x6d, 0xf8, 0xaa, + 0xef, 0x42, 0x11, 0xf5, 0x05, 0x23, 0x34, 0xd8, 0x5d, 0xe1, 0xf2, 0xe2, 0x5a, 0x8e, 0xf0, 0xfd, + 0x25, 0x65, 0x08, 0x27, 0x58, 0x2f, 0x2a, 0x97, 0x78, 0x5e, 0x93, 0x4c, 0xcb, 0x78, 0xaf, 0x12, + 0x19, 0x0a, 0x0d, 0xe4, 0x15, 0x28, 0x63, 0xd5, 0xe8, 0x38, 0x41, 0xc8, 0x85, 0x92, 0xef, 0x9d, + 0xb5, 0x30, 0xad, 0xfe, 0xbb, 0x0c, 0x54, 0x06, 0xbe, 0x89, 0x9b, 0xe4, 0x70, 0x66, 0x8d, 0x5f, + 0x6a, 0xa7, 0xa3, 0xbe, 0xe2, 0x39, 0x8e, 0x41, 0xe2, 0x58, 0x98, 0x76, 0x31, 0x80, 0xbd, 0x0f, + 0xb9, 0x09, 0x8a, 0xdd, 0xac, 0xac, 0xc5, 0x4b, 0xd9, 0x47, 0xbf, 0x51, 0x10, 0x6b, 0x44, 0xaa, + 0xfe, 0x7a, 0x5c, 0x3e, 0x49, 0x67, 0xd9, 0xe9, 0xbe, 0x46, 0xc7, 0x5f, 0xc3, 0x96, 0x92, 0x61, + 0x25, 0xc8, 0xb5, 0x3b, 0xc3, 0x16, 0xd7, 0xdd, 0x51, 0x8b, 0x1f, 0xea, 0xbb, 0x5d, 0x6d, 0x38, + 0x52, 0x72, 0x74, 0x9e, 0x46, 0x80, 0x5e, 0x73, 0x38, 0x52, 0x4a, 0x0c, 0xa0, 0x70, 0xd8, 0xef, + 0xfe, 0xe8, 0xb0, 0xa3, 0x28, 0xea, 0xbf, 0xca, 0x00, 0x24, 0xbe, 0x61, 0xf6, 0x16, 0x54, 0xce, + 0x28, 0xa5, 0x4b, 0x87, 0x06, 0x72, 0x1b, 0x81, 0xa3, 0x49, 0x97, 0x7a, 0x07, 0xaa, 0xf1, 0xb6, + 0x82, 0x7a, 0xc6, 0xf2, 0xe9, 0x41, 0x25, 0xc6, 0xef, 0x5c, 0xb0, 0xb7, 0xa1, 0xe4, 0x61, 0x3b, + 0x90, 0x34, 0x2b, 0x2b, 0x19, 0x52, 0xf3, 0xb5, 0xa2, 0xc7, 0x13, 0xa8, 0x8f, 0x4c, 0xfc, 0xc8, + 0x54, 0x8f, 0x49, 0x77, 0x11, 0xd4, 0x72, 0x8c, 0x79, 0x60, 0x69, 0x1c, 0x1f, 0x4b, 0xe9, 0x7c, + 0x22, 0xa5, 0xd5, 0x1f, 0x43, 0x7d, 0x68, 0x4c, 0x67, 0x5c, 0x96, 0x53, 0xc3, 0x18, 0xe4, 0x70, + 0x4e, 0x88, 0xa9, 0x47, 0xbf, 0x71, 0xd1, 0x1d, 0x58, 0xfe, 0xd8, 0x72, 0xa3, 0x35, 0x1a, 0x25, + 0x51, 0xfc, 0x1e, 0xa2, 0x34, 0xd7, 0xbc, 0xb3, 0x48, 0x9c, 0x47, 0x69, 0xf5, 0xef, 0x64, 0xa0, + 0x22, 0x55, 0x83, 0xbd, 0x0b, 0x39, 0x52, 0x5c, 0x33, 0xb2, 0x20, 0x94, 0x08, 0xf8, 0x6f, 0xae, + 0xea, 0x20, 0x21, 0xbb, 0x07, 0xf9, 0x20, 0x34, 0xfc, 0xe8, 0x98, 0x41, 0x91, 0x38, 0x76, 0xbc, + 0xb9, 0x6b, 0x6a, 0x1c, 0xcd, 0x54, 0xc8, 0x5a, 0xae, 0x29, 0x9c, 0x1b, 0xcb, 0x54, 0x88, 0x54, + 0xb7, 0xa0, 0x1c, 0x67, 0x8f, 0x53, 0x40, 0x1b, 0x3c, 0x1d, 0x2a, 0x6b, 0xac, 0x0c, 0x79, 0xad, + 0xd9, 0x7f, 0xdc, 0x51, 0x32, 0xea, 0xcf, 0x32, 0x00, 0x09, 0x17, 0x7b, 0x90, 0xaa, 0xed, 0x8d, + 0xc5, 0x5c, 0x1f, 0xd0, 0x5f, 0xa9, 0xb2, 0x37, 0xa1, 0x3c, 0x77, 0x09, 0x68, 0x99, 0x62, 0x27, + 0x4a, 0x00, 0x68, 0x6d, 0x45, 0x41, 0x31, 0x0b, 0xd6, 0xd6, 0x33, 0xc3, 0x51, 0xbf, 0x07, 0xe5, + 0x38, 0x3b, 0x34, 0x20, 0x77, 0x07, 0xbd, 0xde, 0xe0, 0x69, 0xb7, 0xff, 0x58, 0x59, 0xc3, 0xe4, + 0x81, 0xd6, 0x69, 0x75, 0xda, 0x98, 0xcc, 0xe0, 0x9c, 0x6d, 0x1d, 0x6a, 0x5a, 0xa7, 0x3f, 0xd2, + 0xb5, 0xc1, 0x53, 0x65, 0x5d, 0xfd, 0xed, 0x0c, 0xd4, 0x06, 0x8e, 0xd9, 0xf2, 0x9c, 0x96, 0x31, + 0x43, 0xcd, 0x84, 0xfd, 0x00, 0x36, 0x8f, 0xe6, 0xa8, 0x1d, 0xcf, 0x1c, 0x63, 0x6c, 0x9d, 0x78, + 0x8e, 0x69, 0x45, 0x8b, 0x30, 0x75, 0x90, 0x22, 0x7c, 0xbe, 0x0a, 0x11, 0x1f, 0x24, 0xb4, 0xec, + 0x43, 0xa8, 0xce, 0x7c, 0xef, 0xc8, 0xd2, 0x03, 0x6f, 0xee, 0x8f, 0xad, 0x25, 0xb3, 0x2e, 0xe1, + 0xad, 0x10, 0xdd, 0x90, 0xc8, 0xd4, 0xbf, 0xb7, 0x0e, 0xd5, 0xb6, 0x65, 0xce, 0x67, 0x9f, 0x79, + 0xb6, 0xdb, 0x0a, 0xcf, 0xd9, 0x07, 0x50, 0xf5, 0x1c, 0xf2, 0x57, 0xea, 0xd2, 0xb1, 0xfd, 0xaa, + 0x7c, 0xc0, 0xa3, 0x16, 0xd0, 0x21, 0xff, 0x3b, 0x70, 0x89, 0x1b, 0xf0, 0xc2, 0x9f, 0x75, 0xce, + 0x99, 0x71, 0xcd, 0xe4, 0x35, 0x85, 0xa3, 0xf8, 0x06, 0x4d, 0xe4, 0xbf, 0x02, 0x97, 0x25, 0x72, + 0x14, 0x2c, 0x9c, 0x3e, 0xbb, 0xb4, 0xc6, 0x36, 0x63, 0xde, 0x38, 0xa0, 0xe0, 0x33, 0xb8, 0x1c, + 0xd5, 0x70, 0xcc, 0x7b, 0x8f, 0x33, 0xe7, 0x64, 0x33, 0x24, 0xd5, 0xbb, 0xa2, 0xc2, 0x9b, 0x9e, + 0x0c, 0xa4, 0xbc, 0xde, 0x87, 0x2b, 0x26, 0xb6, 0x5e, 0xe7, 0x9d, 0x7f, 0x6a, 0x59, 0x33, 0xdd, + 0x31, 0x82, 0x50, 0x9c, 0x4f, 0x32, 0x42, 0xee, 0x20, 0xee, 0x73, 0xcb, 0x9a, 0xf5, 0x8c, 0x20, + 0x54, 0xff, 0x5a, 0x16, 0xca, 0xdc, 0xfb, 0x80, 0xdd, 0xb5, 0x0d, 0x45, 0xef, 0xe8, 0x2b, 0xdd, + 0x8f, 0xad, 0xf2, 0xa5, 0x33, 0xc8, 0x82, 0x77, 0xf4, 0x95, 0x66, 0x4d, 0xd8, 0x5b, 0xd1, 0x56, + 0x87, 0x16, 0xfc, 0xba, 0xec, 0x43, 0x8f, 0xd4, 0x7f, 0xb1, 0xf5, 0xa1, 0x69, 0xfa, 0x08, 0x2a, + 0xb6, 0x1b, 0x58, 0x7e, 0xc8, 0x3d, 0x2e, 0xc5, 0xe7, 0x0f, 0x02, 0x27, 0x23, 0x27, 0xcc, 0x23, + 0xa8, 0x70, 0x0f, 0x0c, 0x67, 0x2a, 0x3d, 0x9f, 0x89, 0x93, 0x11, 0xd3, 0xa7, 0x50, 0x4f, 0xc4, + 0x1c, 0xf1, 0x95, 0x9f, 0xcb, 0x57, 0x8b, 0x29, 0x89, 0xf5, 0x21, 0x5c, 0x0d, 0x4e, 0xed, 0x99, + 0x2e, 0x6a, 0xea, 0xb9, 0x74, 0xfc, 0xa0, 0xcf, 0x4e, 0x85, 0xdb, 0x9f, 0x21, 0xb6, 0x4b, 0xc8, + 0x81, 0xdb, 0x9f, 0x3b, 0xce, 0xc1, 0x29, 0x7b, 0x13, 0x36, 0x05, 0xf9, 0xec, 0x34, 0x9a, 0x2b, + 0x64, 0x94, 0xe6, 0xb5, 0x3a, 0x47, 0x1c, 0x9c, 0x0a, 0x4d, 0xee, 0x63, 0x68, 0xf0, 0x63, 0x71, + 0xd1, 0x28, 0x63, 0x32, 0xb1, 0xc6, 0xa1, 0x8e, 0xaa, 0x83, 0x38, 0x23, 0xb8, 0x42, 0x78, 0xee, + 0x46, 0x6a, 0x12, 0x16, 0x25, 0x9f, 0xfa, 0xf7, 0x33, 0x50, 0xe6, 0xc5, 0xe2, 0x08, 0xbd, 0x06, + 0xd9, 0x17, 0x8c, 0x0e, 0xe2, 0xd8, 0x7d, 0xd8, 0x34, 0x4c, 0x53, 0x14, 0x60, 0x99, 0xbc, 0x08, + 0x2e, 0x0e, 0x36, 0x0c, 0xd3, 0x6c, 0x0a, 0x38, 0x89, 0xd5, 0x6d, 0x50, 0xec, 0x40, 0x8f, 0xec, + 0xcf, 0xe4, 0x10, 0xbc, 0xa4, 0xd5, 0xed, 0x40, 0x98, 0x9f, 0xdc, 0xa5, 0x9c, 0x1a, 0xf0, 0xdc, + 0x8b, 0x07, 0x5c, 0x65, 0x00, 0x9a, 0x45, 0x6b, 0xbf, 0x15, 0x9e, 0x7f, 0x96, 0x2b, 0x65, 0x14, + 0x50, 0xff, 0x69, 0x05, 0x2a, 0x4d, 0xd7, 0x70, 0x2e, 0x7e, 0x62, 0xd1, 0x09, 0x3e, 0x39, 0x18, + 0x67, 0x73, 0xd1, 0x05, 0xfc, 0x78, 0xab, 0x4c, 0x10, 0xaa, 0xd9, 0x6d, 0xa8, 0x78, 0xf3, 0x30, + 0xc6, 0xf3, 0x03, 0x2f, 0xe0, 0x20, 0x22, 0x88, 0xf9, 0x63, 0xe7, 0x75, 0xc4, 0x4f, 0x5a, 0x79, + 0xc2, 0x1f, 0x6b, 0x6a, 0x31, 0x3f, 0x11, 0xdc, 0x81, 0x5a, 0x68, 0x4f, 0x2d, 0x3a, 0xe3, 0x9b, + 0x4f, 0x2d, 0x93, 0x87, 0xfe, 0xf1, 0x68, 0xb2, 0x96, 0x80, 0x61, 0x2e, 0x53, 0x6b, 0xea, 0xf9, + 0x17, 0x3c, 0x97, 0x02, 0xcf, 0x85, 0x83, 0x28, 0x97, 0xb7, 0x81, 0x9d, 0x19, 0x76, 0xa8, 0xa7, + 0xb3, 0xe2, 0xda, 0xb1, 0x82, 0x98, 0x91, 0x9c, 0xdd, 0x55, 0x28, 0x98, 0x76, 0x70, 0xda, 0x1d, + 0x08, 0xcd, 0x58, 0xa4, 0xb0, 0x2d, 0xc1, 0xd8, 0xc0, 0x8d, 0x39, 0xb4, 0xb8, 0x16, 0x97, 0xd5, + 0xca, 0x08, 0xd9, 0x41, 0x00, 0x0a, 0x76, 0xd7, 0x0a, 0xcf, 0x3c, 0x1f, 0x39, 0xb9, 0xe2, 0x9b, + 0x00, 0x70, 0x03, 0x44, 0x52, 0x2c, 0x88, 0xe6, 0x5e, 0x56, 0x8b, 0xd3, 0xa8, 0x52, 0xf2, 0x79, + 0x48, 0xd8, 0x2a, 0xaf, 0x7e, 0x02, 0x61, 0x77, 0xa1, 0x4e, 0xd5, 0x27, 0xc5, 0x18, 0xdb, 0x40, + 0x67, 0x52, 0x59, 0xad, 0x8a, 0x50, 0xb2, 0xa7, 0x91, 0xea, 0x53, 0xb8, 0x9e, 0x6a, 0x9f, 0x6e, + 0xf8, 0xbe, 0x71, 0xa1, 0x4f, 0x8d, 0xaf, 0x3c, 0x9f, 0x7c, 0x1f, 0x59, 0xed, 0xaa, 0xdc, 0x6d, + 0x4d, 0x44, 0xef, 0x23, 0xf6, 0xb9, 0xac, 0xb6, 0xeb, 0xf9, 0xe4, 0x18, 0x59, 0xc9, 0x8a, 0x58, + 0xb2, 0xe2, 0x69, 0x80, 0x49, 0x4b, 0x0f, 0x78, 0x14, 0xa2, 0x56, 0x21, 0xd8, 0x0e, 0x81, 0x50, + 0x4f, 0x0d, 0x1e, 0x71, 0x79, 0xb9, 0x29, 0x42, 0x82, 0x1e, 0x91, 0x24, 0xe4, 0x88, 0x13, 0xcb, + 0x30, 0xe9, 0x9c, 0x8b, 0x10, 0x7b, 0x96, 0x41, 0xa7, 0xc8, 0xc1, 0x23, 0x7d, 0x36, 0x0f, 0x79, + 0xf8, 0xa0, 0x96, 0x0f, 0x1e, 0x1d, 0xcc, 0x43, 0x01, 0x3e, 0xb6, 0x42, 0x3a, 0xd6, 0x22, 0xf0, + 0x63, 0x2b, 0x44, 0x65, 0x33, 0x78, 0x14, 0x39, 0x82, 0xaf, 0x88, 0xbe, 0x7d, 0x24, 0x3c, 0xbd, + 0x2a, 0xd4, 0x62, 0xa4, 0x3e, 0x9d, 0xf3, 0x78, 0xc1, 0xac, 0x56, 0x89, 0x08, 0xf6, 0xe7, 0x0e, + 0x0e, 0xec, 0xd8, 0x18, 0x9f, 0x58, 0xba, 0x8f, 0x55, 0xb9, 0xc6, 0x87, 0x8e, 0x20, 0x1a, 0xd6, + 0xe6, 0x15, 0xe0, 0x09, 0xfd, 0xc4, 0x0e, 0xc9, 0x41, 0x93, 0xd5, 0x4a, 0x04, 0xd8, 0xb3, 0x43, + 0x5c, 0xc7, 0x1c, 0x29, 0x66, 0x20, 0x65, 0x71, 0x9d, 0x88, 0x36, 0x08, 0xb1, 0x4f, 0x70, 0xca, + 0x68, 0x1b, 0x94, 0x14, 0x2d, 0xe6, 0x77, 0x83, 0x48, 0xeb, 0x12, 0x29, 0xe6, 0x7a, 0x0f, 0x38, + 0xb3, 0x8e, 0x53, 0x8f, 0xe7, 0xf9, 0x0a, 0xb7, 0xd2, 0x08, 0xdc, 0xb6, 0x83, 0x53, 0xca, 0xf1, + 0x2e, 0xd4, 0x25, 0x3a, 0xcc, 0xef, 0x26, 0x9f, 0x19, 0x31, 0x59, 0xaa, 0x8e, 0xbe, 0x35, 0xf5, + 0x42, 0xd1, 0xcc, 0x57, 0xa5, 0x3a, 0x6a, 0x04, 0x4f, 0xd7, 0x51, 0xd0, 0x62, 0x9e, 0xb7, 0xa4, + 0x3a, 0x72, 0x52, 0xcc, 0xf5, 0x35, 0xa8, 0x9e, 0xf9, 0x76, 0x18, 0x5a, 0x2e, 0x5f, 0xfc, 0xb7, + 0x79, 0xc7, 0x0a, 0x18, 0xad, 0xfe, 0xd7, 0xa0, 0xca, 0x7b, 0x5e, 0xc8, 0xb7, 0x2d, 0x4e, 0x22, + 0x60, 0x91, 0x80, 0x10, 0xbd, 0x31, 0xb5, 0x5d, 0xf2, 0xc2, 0x64, 0xb5, 0x32, 0x87, 0xa0, 0xb1, + 0x2a, 0xa1, 0x8d, 0x73, 0xf2, 0xc5, 0x24, 0x68, 0xe3, 0x9c, 0x96, 0xe4, 0xcc, 0x76, 0x1c, 0xbe, + 0xf0, 0xef, 0x88, 0x25, 0x89, 0x10, 0x5a, 0xf7, 0x31, 0x9a, 0x4a, 0xbf, 0x2b, 0xa1, 0xa9, 0x6c, + 0x9c, 0x38, 0x84, 0xc6, 0xa2, 0x5f, 0x17, 0x13, 0x07, 0x01, 0x58, 0x72, 0x82, 0x34, 0xce, 0xc9, + 0xd3, 0x12, 0x23, 0x8d, 0x73, 0x21, 0xb7, 0x30, 0x57, 0xe2, 0x7d, 0x23, 0x96, 0x5b, 0x08, 0x42, + 0x6e, 0x99, 0xc0, 0x38, 0x6f, 0x6c, 0xa7, 0x09, 0x8c, 0x73, 0xb2, 0x90, 0x2c, 0xc3, 0xe4, 0x15, + 0x7f, 0x93, 0x67, 0x8f, 0x00, 0xaa, 0xf7, 0x16, 0x54, 0x83, 0x47, 0x7a, 0x82, 0xbf, 0xcf, 0xd9, + 0x83, 0x47, 0x5a, 0x44, 0x71, 0x17, 0xea, 0xf1, 0xd4, 0xe0, 0x34, 0x6f, 0xf1, 0x81, 0x37, 0xc5, + 0xd4, 0xa0, 0x63, 0xc1, 0x9f, 0x66, 0xe0, 0xc6, 0x80, 0x9c, 0x48, 0x24, 0xfe, 0xf7, 0xad, 0x20, + 0x30, 0x8e, 0xad, 0x5d, 0xcf, 0xdf, 0x9d, 0xff, 0xe4, 0x27, 0x17, 0x6c, 0x1b, 0x36, 0x0e, 0x0c, + 0xdf, 0x72, 0xc3, 0xf8, 0x40, 0x4b, 0x78, 0x66, 0x16, 0xc1, 0xec, 0x13, 0x50, 0x38, 0x88, 0x87, + 0x4e, 0xb5, 0xa2, 0xf3, 0x9c, 0x45, 0xff, 0xf3, 0x12, 0x15, 0x1a, 0x7b, 0xe5, 0xb6, 0x1d, 0x84, + 0x1a, 0x5a, 0xfa, 0xec, 0x53, 0x50, 0x1c, 0xef, 0x0c, 0x2d, 0x16, 0x54, 0x63, 0x75, 0x49, 0x71, + 0x16, 0xbb, 0x64, 0xa2, 0x2d, 0xd7, 0x89, 0x30, 0x51, 0x77, 0x3f, 0x05, 0x65, 0x3e, 0x9b, 0xa5, + 0x59, 0xd7, 0x9f, 0xc3, 0x4a, 0x84, 0x09, 0xeb, 0x5b, 0x50, 0x91, 0x4a, 0x5d, 0xa1, 0x5c, 0x43, + 0x52, 0x16, 0x12, 0x4b, 0xe5, 0xac, 0x08, 0xc7, 0x84, 0x24, 0x77, 0xf5, 0xff, 0x5b, 0x07, 0x85, + 0x9c, 0x63, 0x1a, 0x1d, 0xea, 0xd3, 0xb9, 0x58, 0xca, 0x2c, 0xcb, 0xbc, 0xd4, 0x2c, 0xdb, 0x82, + 0xbc, 0x63, 0x4f, 0xe3, 0x18, 0xa9, 0xd4, 0xc1, 0x0e, 0x21, 0x70, 0xac, 0x3d, 0xdf, 0x3e, 0x26, + 0x03, 0x52, 0x8e, 0xe6, 0x23, 0xff, 0x20, 0xda, 0x63, 0x34, 0x44, 0x0f, 0x00, 0x4c, 0x3b, 0x08, + 0x75, 0x72, 0xa9, 0x88, 0x6a, 0x8b, 0x9e, 0x89, 0xfb, 0x5f, 0x2b, 0x9b, 0xf1, 0x50, 0x6c, 0x83, + 0x22, 0x29, 0x61, 0x6e, 0xec, 0x0d, 0xc9, 0x6b, 0x89, 0x72, 0xd6, 0x72, 0x5b, 0x6e, 0xb8, 0x44, + 0x89, 0xea, 0x53, 0x61, 0x89, 0xb2, 0x6b, 0x9e, 0xab, 0x7f, 0xa6, 0x42, 0xae, 0xef, 0x99, 0x16, + 0x7b, 0x0f, 0xca, 0x14, 0xf6, 0x2a, 0x0d, 0xb0, 0x50, 0x92, 0x11, 0x4d, 0x7f, 0x68, 0xa4, 0x4a, + 0xae, 0xf8, 0xf5, 0xfc, 0x40, 0xd9, 0xd7, 0xc8, 0xb8, 0xa3, 0xa3, 0x5b, 0x6c, 0x52, 0x45, 0x38, + 0xa0, 0xc8, 0x5f, 0xc2, 0x31, 0xb8, 0xb7, 0x92, 0x9b, 0xdf, 0xb7, 0x5c, 0xd2, 0xc8, 0xf3, 0x5a, + 0x9c, 0x26, 0x93, 0xda, 0xf7, 0x50, 0xf5, 0xe2, 0x3b, 0x50, 0x7e, 0x85, 0x49, 0xcd, 0xf1, 0xb4, + 0x25, 0xbd, 0x07, 0xe5, 0xaf, 0x3c, 0xdb, 0xe5, 0x15, 0x2f, 0x2c, 0x55, 0x1c, 0x2d, 0x16, 0x5e, + 0xf1, 0xaf, 0xc4, 0x2f, 0x76, 0x07, 0x8a, 0x9e, 0xcb, 0xf3, 0x2e, 0x2e, 0xe5, 0x5d, 0xf0, 0xdc, + 0x1e, 0x8f, 0xc2, 0xaa, 0xd9, 0x81, 0xee, 0xdb, 0xc7, 0x27, 0xa1, 0x8e, 0x9c, 0xe2, 0xc8, 0xb7, + 0x62, 0x07, 0x1a, 0xc2, 0x30, 0x5b, 0x9c, 0x78, 0x13, 0xdb, 0x41, 0x0d, 0x8f, 0x32, 0x2b, 0x2f, + 0x65, 0x06, 0x1c, 0x4d, 0x19, 0xbe, 0x0e, 0xa5, 0x63, 0xdf, 0x43, 0x23, 0xe2, 0xa2, 0x01, 0x4b, + 0x94, 0x45, 0xc2, 0xed, 0x5c, 0xa0, 0xfa, 0x44, 0x3f, 0x6d, 0xf7, 0x58, 0x27, 0x2f, 0x49, 0x65, + 0x2b, 0xbb, 0x5d, 0xd2, 0xaa, 0x11, 0x90, 0xfc, 0x1f, 0xaf, 0x43, 0xc9, 0x38, 0x3e, 0xd6, 0x45, + 0x30, 0xd9, 0x52, 0x5e, 0xc6, 0xf1, 0x31, 0x15, 0xf9, 0x00, 0x6a, 0x67, 0xb6, 0xab, 0x07, 0x33, + 0x6b, 0xcc, 0x69, 0x6b, 0xcb, 0x5d, 0x79, 0x66, 0xbb, 0x38, 0xbb, 0x89, 0x5e, 0x5e, 0x06, 0xf5, + 0x6f, 0xbe, 0x0c, 0x36, 0x9e, 0xb7, 0x0c, 0x54, 0x28, 0x88, 0x23, 0x00, 0x65, 0x89, 0x44, 0x60, + 0xd8, 0xfb, 0x50, 0xf1, 0x0d, 0xf7, 0x54, 0x17, 0xe7, 0xe7, 0x5f, 0xca, 0x96, 0xbe, 0x66, 0xb8, + 0xa7, 0xe2, 0xf8, 0x1c, 0xfc, 0xf8, 0x77, 0x5a, 0x65, 0xde, 0x7c, 0x89, 0x8d, 0x24, 0x99, 0x5e, + 0xec, 0xc5, 0xa6, 0xd7, 0x87, 0x64, 0xe3, 0x58, 0x6e, 0xa8, 0x47, 0x0c, 0x97, 0x56, 0x33, 0x54, + 0x39, 0xd9, 0x80, 0xb3, 0x61, 0x03, 0xc8, 0xd3, 0xa6, 0x93, 0x5b, 0xee, 0x72, 0xaa, 0x01, 0xb1, + 0x0b, 0x4e, 0x03, 0x3f, 0x71, 0xc7, 0x35, 0x61, 0x23, 0x89, 0xb0, 0xe5, 0xa1, 0xca, 0x57, 0x64, + 0x57, 0x7f, 0x2a, 0x24, 0x37, 0xb2, 0xaa, 0xec, 0x54, 0x9c, 0xee, 0x1d, 0xa8, 0xf1, 0x80, 0x15, + 0xde, 0x6f, 0x01, 0x29, 0x49, 0x65, 0xad, 0x4a, 0x40, 0xde, 0x4f, 0x01, 0x09, 0x18, 0x61, 0xea, + 0x85, 0xe7, 0xa4, 0x25, 0x25, 0x02, 0x86, 0xdb, 0x76, 0xe1, 0xb9, 0x56, 0x36, 0xa3, 0x9f, 0xb8, + 0xf9, 0x1f, 0xd9, 0xae, 0x89, 0x53, 0x2f, 0x34, 0x8e, 0x83, 0x46, 0x83, 0x56, 0x66, 0x45, 0xc0, + 0x46, 0xc6, 0x71, 0x80, 0x86, 0xbf, 0xc1, 0x8d, 0x0d, 0x5e, 0xef, 0xeb, 0xb2, 0x67, 0x4a, 0x32, + 0x43, 0xb4, 0x8a, 0x21, 0xd9, 0x24, 0x1f, 0x03, 0x8b, 0x4e, 0x28, 0x25, 0x3b, 0xfe, 0xc6, 0xd2, + 0x6c, 0xdc, 0x10, 0x47, 0x94, 0xb1, 0x15, 0x7f, 0x1b, 0x2a, 0xdc, 0x53, 0xa1, 0x07, 0xa1, 0x35, + 0x6b, 0xbc, 0x42, 0x15, 0x02, 0x0e, 0x1a, 0x86, 0xd6, 0x8c, 0x7d, 0x0c, 0xb5, 0xb4, 0x95, 0x75, + 0x73, 0xc5, 0x41, 0x1f, 0x4d, 0x0b, 0xad, 0x3a, 0x96, 0xed, 0xae, 0x3b, 0x3c, 0xfa, 0x9b, 0x34, + 0x24, 0x62, 0xe4, 0x87, 0x59, 0x55, 0xd7, 0x0b, 0x5b, 0x11, 0x0c, 0x3b, 0x30, 0x32, 0xb0, 0xc3, + 0x73, 0x52, 0xaa, 0xe2, 0x0e, 0x8c, 0x4d, 0x47, 0x34, 0x8e, 0x22, 0x2b, 0xb2, 0x0d, 0x3c, 0x40, + 0x83, 0x36, 0x79, 0xcb, 0xe7, 0xc1, 0x18, 0xa4, 0x43, 0xc5, 0x67, 0x7f, 0x8b, 0x7b, 0x8f, 0xc6, + 0x03, 0x57, 0xe4, 0xdd, 0xe8, 0x13, 0xa8, 0xcf, 0x7c, 0x4b, 0x97, 0x4a, 0x56, 0xe5, 0x46, 0x1d, + 0xf8, 0x56, 0x52, 0x78, 0x75, 0x26, 0xa5, 0xd8, 0x0f, 0x60, 0x53, 0xe2, 0x9c, 0x9f, 0x12, 0xf3, + 0x1d, 0x62, 0xbe, 0xbc, 0xc0, 0x7c, 0x78, 0x8a, 0xec, 0xf5, 0x59, 0x2a, 0xcd, 0x2e, 0x43, 0xbe, + 0x1b, 0x74, 0x5c, 0x93, 0x74, 0xab, 0x92, 0xc6, 0x13, 0xec, 0x11, 0x54, 0xb9, 0x21, 0x43, 0xf1, + 0xac, 0x41, 0xe3, 0x9e, 0xec, 0x7a, 0x26, 0x6b, 0x86, 0x10, 0x5a, 0xc5, 0x89, 0x7f, 0x07, 0xec, + 0x23, 0xd8, 0xe4, 0xe7, 0x02, 0xb2, 0x88, 0x7c, 0x63, 0x79, 0xc8, 0x89, 0x68, 0x37, 0x91, 0x93, + 0x1a, 0x5c, 0xf7, 0xe7, 0x2e, 0x19, 0x37, 0x82, 0x93, 0x7b, 0xac, 0x88, 0x7f, 0x9b, 0xf8, 0xaf, + 0x89, 0xd5, 0xc5, 0xc9, 0x38, 0x2f, 0xc9, 0xa6, 0xab, 0xbe, 0x0c, 0x3a, 0x40, 0xbe, 0xe7, 0xe4, + 0xc9, 0x3d, 0x39, 0x94, 0xe7, 0x9b, 0xdf, 0x26, 0x4f, 0xf2, 0xf2, 0x50, 0x9e, 0x0c, 0x72, 0xf3, + 0xb9, 0x6d, 0x92, 0xa6, 0x57, 0xd5, 0xe8, 0x37, 0x7b, 0x1d, 0xea, 0xbe, 0x35, 0x9e, 0xfb, 0x81, + 0xfd, 0xcc, 0xd2, 0x03, 0xdb, 0x3d, 0x25, 0x1d, 0xaf, 0xa4, 0xd5, 0x62, 0xe8, 0xd0, 0x76, 0x4f, + 0x51, 0x64, 0x58, 0xe7, 0xa1, 0xe5, 0xbb, 0x3c, 0xc4, 0xfe, 0x6d, 0x59, 0x64, 0x74, 0x08, 0x81, + 0xeb, 0x5c, 0x03, 0x2b, 0xfe, 0xbd, 0x30, 0xb2, 0x01, 0x1f, 0xd9, 0x07, 0xdf, 0x68, 0x64, 0x87, + 0x34, 0xb2, 0xf7, 0xa0, 0x64, 0xbb, 0xa1, 0xe5, 0x3f, 0x33, 0x9c, 0xc6, 0xbb, 0x4b, 0xd2, 0x38, + 0xc6, 0xb1, 0xbb, 0x50, 0x0c, 0x1c, 0x1b, 0xd7, 0x7b, 0xe3, 0xbd, 0x25, 0xb2, 0x08, 0xc5, 0xb6, + 0xa1, 0x1c, 0xdf, 0x0e, 0x6b, 0xbc, 0xbf, 0x44, 0x97, 0x20, 0xd9, 0x2d, 0xc8, 0x9d, 0xe1, 0x84, + 0x7a, 0xb8, 0x7c, 0x54, 0x80, 0x70, 0xdc, 0xbe, 0x27, 0xa8, 0xb3, 0xd3, 0xf6, 0xfd, 0x68, 0x69, + 0xfb, 0xde, 0xb5, 0x1d, 0x87, 0x6f, 0xdf, 0x13, 0xf1, 0x0b, 0x37, 0x3f, 0xe2, 0xc0, 0x96, 0x7c, + 0xb0, 0xbc, 0xf9, 0x21, 0xee, 0x09, 0xdd, 0xa3, 0xab, 0x04, 0xe4, 0xff, 0xe6, 0x6e, 0xfc, 0x0f, + 0xe5, 0xbe, 0x4a, 0x3b, 0xc6, 0x35, 0x08, 0xe2, 0x34, 0x1a, 0x20, 0xc2, 0xfb, 0x8f, 0x4a, 0xd3, + 0x47, 0xfc, 0x82, 0x06, 0x87, 0x74, 0xcd, 0x73, 0xf6, 0x1e, 0xd4, 0xa2, 0xb0, 0x22, 0x2c, 0x2e, + 0x68, 0x7c, 0xbc, 0x54, 0x83, 0x34, 0x01, 0x6b, 0x43, 0x75, 0x82, 0xba, 0xfb, 0x94, 0xab, 0xf2, + 0x8d, 0x4f, 0xa8, 0x22, 0x5b, 0xd1, 0xc6, 0xfa, 0x3c, 0x55, 0x5f, 0x4b, 0x71, 0xb1, 0x07, 0xc0, + 0xec, 0x09, 0x1f, 0xcf, 0x5d, 0xdf, 0x9b, 0x72, 0x75, 0xbd, 0xf1, 0x29, 0xf7, 0xa0, 0x2d, 0x63, + 0xe8, 0x30, 0xd0, 0x72, 0x4d, 0x7d, 0x1a, 0x08, 0x35, 0xe1, 0x7b, 0x54, 0x4f, 0x21, 0xbc, 0xe2, + 0x5b, 0xa4, 0x91, 0xb3, 0x17, 0x69, 0xf7, 0x03, 0xae, 0x35, 0x7c, 0x0a, 0x38, 0x5d, 0x9f, 0x25, + 0xac, 0xbf, 0xf2, 0x42, 0x56, 0xa4, 0x8d, 0x58, 0x3f, 0x81, 0x3a, 0x77, 0x94, 0x92, 0x46, 0x86, + 0x53, 0xf4, 0xfb, 0xb2, 0xe4, 0x92, 0x5d, 0xc8, 0x5a, 0xd5, 0x94, 0x1d, 0xca, 0x1f, 0xc3, 0x46, + 0xe4, 0xeb, 0x0d, 0x85, 0x5b, 0xf8, 0x57, 0xe5, 0x62, 0x63, 0x5f, 0xaa, 0x56, 0x9b, 0x47, 0x3f, + 0xa9, 0xc8, 0x47, 0x50, 0xa3, 0x5d, 0x34, 0x70, 0x8d, 0x59, 0x70, 0xe2, 0x85, 0x8d, 0x5f, 0x93, + 0x15, 0x82, 0xa1, 0x80, 0x6a, 0x55, 0x24, 0x8a, 0x52, 0x28, 0xfc, 0x93, 0x75, 0x3a, 0x0e, 0xad, + 0xc6, 0x0f, 0xb8, 0xf0, 0x8f, 0x81, 0xad, 0xd0, 0x62, 0x8f, 0x00, 0x8c, 0xd9, 0xcc, 0xb9, 0xe0, + 0x53, 0xf3, 0x87, 0x34, 0x35, 0x2f, 0x4b, 0x53, 0xb3, 0x89, 0x48, 0x9a, 0x9b, 0x65, 0x23, 0xfa, + 0xc9, 0x1e, 0x42, 0x75, 0xe6, 0x05, 0xa1, 0x6e, 0x4e, 0x1d, 0x6a, 0x7f, 0x53, 0x5e, 0xdb, 0x07, + 0x5e, 0x10, 0xb6, 0xa7, 0x0e, 0xb6, 0x02, 0x66, 0xf1, 0x6f, 0xd6, 0x83, 0x4b, 0x9e, 0xab, 0x9b, + 0xf3, 0x99, 0x63, 0x8f, 0xb1, 0x07, 0x0c, 0x3a, 0x7a, 0x6f, 0xec, 0x50, 0x89, 0x37, 0xa5, 0x12, + 0x07, 0x6e, 0x3b, 0x22, 0x12, 0x31, 0x6e, 0x9b, 0xde, 0x22, 0x88, 0xec, 0x4c, 0x1a, 0x83, 0x38, + 0xd0, 0xb3, 0xc5, 0x55, 0x03, 0x82, 0x46, 0x91, 0x9e, 0x9f, 0xc0, 0x46, 0x42, 0x85, 0x0d, 0x0c, + 0x1a, 0x6d, 0x79, 0x26, 0x4b, 0x91, 0xe3, 0xb5, 0x88, 0x11, 0x61, 0x01, 0xf5, 0x9d, 0xe7, 0x38, + 0xf3, 0x99, 0x10, 0xa5, 0x8d, 0x8e, 0xe8, 0x3b, 0x02, 0x72, 0x29, 0x29, 0x99, 0xe2, 0xd6, 0xb4, + 0xb1, 0x2b, 0x9b, 0xe2, 0xd6, 0x14, 0xd5, 0x0c, 0x11, 0xc5, 0xfb, 0xcc, 0xb6, 0xce, 0x82, 0xc6, + 0x63, 0x8a, 0xf0, 0x14, 0x71, 0xd2, 0x4f, 0x10, 0x84, 0xfb, 0xbe, 0x69, 0xfb, 0x68, 0x02, 0x50, + 0x70, 0xd6, 0x1e, 0x0f, 0xb4, 0xe5, 0x20, 0xa4, 0x60, 0x2d, 0x68, 0x90, 0x38, 0x17, 0x6b, 0x35, + 0x75, 0x06, 0xd7, 0x5d, 0x5a, 0x92, 0x57, 0x90, 0x96, 0x1f, 0xf1, 0x1d, 0x48, 0xa7, 0x71, 0x3f, + 0x84, 0x57, 0x57, 0x67, 0x12, 0xdd, 0x62, 0xfc, 0x8c, 0xf4, 0x8d, 0xeb, 0x2b, 0xb8, 0x5b, 0x74, + 0xb1, 0x51, 0xfd, 0x59, 0x1e, 0x4a, 0x91, 0x69, 0xc4, 0x2a, 0x50, 0x3c, 0xec, 0x7f, 0xde, 0x1f, + 0x3c, 0xed, 0xf3, 0xcb, 0x7c, 0xcd, 0xe1, 0xb0, 0xa3, 0x8d, 0x14, 0x93, 0xd5, 0x01, 0xe8, 0xba, + 0x8e, 0x3e, 0x6c, 0x35, 0xfb, 0xfc, 0x72, 0x1f, 0x5d, 0x12, 0xe2, 0xe9, 0x75, 0xb6, 0x09, 0xb5, + 0xdd, 0xc3, 0x3e, 0xc5, 0x15, 0x72, 0x50, 0x16, 0x41, 0x9d, 0x2f, 0xf8, 0x09, 0x27, 0x07, 0xe5, + 0x10, 0xb4, 0xdf, 0x1c, 0x75, 0xb4, 0x6e, 0x04, 0xca, 0x53, 0x88, 0xe2, 0xe0, 0x50, 0x6b, 0x89, + 0x9c, 0x0a, 0xec, 0x0a, 0x6c, 0xc6, 0x6c, 0x51, 0x96, 0x4a, 0x11, 0x6b, 0x76, 0xa0, 0x0d, 0x3e, + 0xeb, 0xb4, 0x46, 0x0a, 0xd0, 0x71, 0xe9, 0xe3, 0xc7, 0x4a, 0x85, 0x55, 0xa1, 0xd4, 0xee, 0x0e, + 0x47, 0xdd, 0x7e, 0x6b, 0xa4, 0x54, 0xb1, 0xc2, 0xbb, 0xdd, 0xde, 0xa8, 0xa3, 0x29, 0x35, 0x56, + 0x82, 0xdc, 0x67, 0x83, 0x6e, 0x5f, 0xa9, 0xd3, 0xb5, 0xa5, 0xe6, 0xfe, 0x41, 0xaf, 0xa3, 0x6c, + 0x20, 0x74, 0x38, 0xd0, 0x46, 0x8a, 0x82, 0xd0, 0xa7, 0xdd, 0x7e, 0x7b, 0xf0, 0x54, 0xd9, 0x64, + 0x65, 0xc8, 0x1f, 0xf6, 0xb1, 0x18, 0xc6, 0x6a, 0x50, 0xa6, 0x9f, 0x7a, 0xb3, 0xd7, 0x53, 0x2e, + 0x49, 0x67, 0xac, 0x97, 0x11, 0x45, 0x27, 0xb6, 0x43, 0xac, 0xc3, 0x15, 0x6c, 0x4b, 0x9c, 0x24, + 0xea, 0xab, 0x98, 0xcf, 0x7e, 0xb7, 0x7f, 0x38, 0x54, 0xae, 0x21, 0x31, 0xfd, 0x24, 0x4c, 0x03, + 0xf3, 0xe9, 0xf6, 0xa9, 0x2b, 0x6f, 0xe1, 0xef, 0x76, 0xa7, 0xd7, 0x19, 0x75, 0x94, 0xdb, 0xd8, + 0xaa, 0xde, 0xa0, 0xf5, 0xb9, 0x3e, 0x38, 0x50, 0x5e, 0xc3, 0x3e, 0x3d, 0xd0, 0x3a, 0xba, 0x20, + 0xbc, 0xc3, 0x14, 0xa8, 0xee, 0x1e, 0xfe, 0xf8, 0xc7, 0x5f, 0xea, 0xa2, 0x51, 0xaf, 0x63, 0x99, + 0x09, 0x85, 0x7e, 0xf8, 0xb9, 0x72, 0x6f, 0x01, 0x34, 0xfc, 0x5c, 0x79, 0x03, 0x3b, 0x25, 0xea, + 0x65, 0x65, 0x1b, 0x09, 0xb4, 0x4e, 0xeb, 0x50, 0x1b, 0x76, 0x9f, 0x74, 0xf4, 0xd6, 0xa8, 0xa3, + 0xbc, 0x49, 0xbd, 0xd0, 0xed, 0x7f, 0xae, 0xdc, 0xc7, 0x6a, 0xe2, 0x2f, 0xde, 0xf7, 0x6f, 0x31, + 0x06, 0xf5, 0x84, 0x96, 0x60, 0x6f, 0x23, 0xc9, 0x8e, 0x36, 0x68, 0xb6, 0x5b, 0xcd, 0xe1, 0x48, + 0x79, 0x07, 0xdb, 0x38, 0x3c, 0xe8, 0x75, 0x47, 0xca, 0x03, 0x6c, 0xc8, 0xe3, 0xe6, 0x68, 0xaf, + 0xa3, 0x29, 0xef, 0xe2, 0x30, 0x8e, 0xba, 0xfb, 0x1d, 0x5d, 0xf4, 0xe9, 0x43, 0x2c, 0x63, 0xb7, + 0xdb, 0xeb, 0x29, 0x8f, 0xe8, 0x8c, 0xb0, 0xa9, 0x8d, 0xba, 0x34, 0x90, 0x1f, 0x60, 0x06, 0xcd, + 0x83, 0x83, 0xde, 0x97, 0xca, 0x87, 0xd8, 0xc0, 0xfd, 0xc3, 0xde, 0xa8, 0xab, 0x1f, 0x1e, 0xb4, + 0x9b, 0xa3, 0x8e, 0xf2, 0x11, 0x8d, 0xf2, 0x60, 0x38, 0x6a, 0xef, 0xf7, 0x94, 0x8f, 0x29, 0x4f, + 0x9a, 0x63, 0xad, 0xde, 0xa0, 0xdf, 0x51, 0x3e, 0x51, 0x73, 0xa5, 0x2d, 0x65, 0x4b, 0xcd, 0x95, + 0x54, 0x45, 0x55, 0x7f, 0x13, 0x4a, 0x91, 0x5d, 0x8c, 0x59, 0x76, 0xfb, 0xfd, 0x8e, 0xa6, 0xac, + 0x61, 0xb1, 0xbd, 0xce, 0xee, 0x48, 0xc9, 0xd0, 0xe1, 0x69, 0xf7, 0xf1, 0xde, 0x48, 0x59, 0xc7, + 0x9f, 0x83, 0x43, 0xec, 0xc1, 0x2c, 0x35, 0xbd, 0xb3, 0xdf, 0x55, 0x72, 0xf8, 0xab, 0xd9, 0x1f, + 0x75, 0x95, 0x3c, 0x4d, 0x90, 0x6e, 0xff, 0x71, 0xaf, 0xa3, 0x14, 0x10, 0xba, 0xdf, 0xd4, 0x3e, + 0x57, 0x8a, 0x3c, 0xd3, 0x76, 0xe7, 0x0b, 0xa5, 0xc4, 0x0a, 0xb0, 0xde, 0x7b, 0xa8, 0x94, 0x11, + 0xd4, 0xee, 0xb4, 0x0f, 0x0f, 0x14, 0x50, 0xb7, 0xa1, 0xd8, 0x3c, 0x3e, 0xde, 0xf7, 0x4c, 0x3a, + 0xaf, 0xdd, 0x3d, 0xec, 0xf5, 0xf8, 0x82, 0xd9, 0x19, 0x8c, 0x46, 0x83, 0x7d, 0x25, 0x83, 0x53, + 0x74, 0x34, 0x38, 0x50, 0xd6, 0xd5, 0x2e, 0x94, 0x22, 0x0d, 0x40, 0xba, 0x73, 0x57, 0x82, 0xdc, + 0x81, 0xd6, 0x79, 0xc2, 0x4f, 0xfc, 0xfb, 0x9d, 0x2f, 0xb0, 0x9a, 0xf8, 0x0b, 0x33, 0xca, 0x62, + 0x41, 0xfc, 0x72, 0x1c, 0x5d, 0xba, 0xeb, 0x75, 0xfb, 0x9d, 0xa6, 0xa6, 0xe4, 0xd5, 0x0f, 0x61, + 0x73, 0x49, 0x7e, 0x52, 0xf1, 0xcd, 0xae, 0x28, 0xbe, 0xfb, 0xb8, 0x3f, 0xd0, 0x3a, 0xfc, 0x16, + 0x9f, 0xe8, 0xd4, 0x75, 0xf5, 0x2d, 0x28, 0xc7, 0x82, 0x1e, 0x27, 0x59, 0x4b, 0x1b, 0x0c, 0x87, + 0x7c, 0x0c, 0xd6, 0x30, 0x4d, 0x7d, 0xc3, 0xd3, 0x99, 0xcf, 0x72, 0xa5, 0xdb, 0xca, 0xd6, 0x67, + 0xb9, 0xd2, 0x5d, 0xe5, 0x75, 0x75, 0x08, 0x9b, 0xd1, 0x7e, 0x43, 0x37, 0x08, 0xc8, 0x10, 0xba, + 0x0c, 0xf9, 0x9e, 0xf5, 0xcc, 0x72, 0xa2, 0x50, 0x78, 0x4a, 0x20, 0x74, 0x70, 0xf4, 0x55, 0x37, + 0xbe, 0x74, 0x4d, 0x09, 0x54, 0x30, 0xfb, 0xd2, 0xbd, 0x6f, 0xba, 0xd6, 0xf8, 0x57, 0x32, 0x50, + 0x8a, 0x77, 0xb1, 0xbb, 0xb0, 0x3e, 0x1a, 0x8a, 0x23, 0xab, 0xcb, 0x0f, 0x92, 0x67, 0x2e, 0x46, + 0xd1, 0x2f, 0x6d, 0x7d, 0x34, 0x64, 0x6f, 0x43, 0x81, 0x5f, 0x53, 0x15, 0xee, 0xaa, 0xcb, 0xe9, + 0x9d, 0x71, 0x44, 0x38, 0x4d, 0xd0, 0xb0, 0x0f, 0xa1, 0x1c, 0xd7, 0x56, 0xf8, 0x6f, 0xae, 0xa5, + 0x19, 0x62, 0xb4, 0x96, 0x50, 0xaa, 0x3d, 0xa8, 0xa7, 0x33, 0x64, 0xb7, 0x00, 0x78, 0x96, 0x92, + 0x93, 0x52, 0x82, 0xb0, 0x1b, 0x10, 0xdd, 0x9e, 0x6d, 0x53, 0xc5, 0x6a, 0xf1, 0x6d, 0xda, 0xb6, + 0xfa, 0x2f, 0xb3, 0x00, 0x89, 0x1e, 0x8c, 0x1d, 0x11, 0x7b, 0xa5, 0xf2, 0xe2, 0x4c, 0xfe, 0x15, + 0x28, 0x3b, 0x9e, 0x61, 0xca, 0xaf, 0x5c, 0x94, 0x10, 0x40, 0xc3, 0x24, 0xdf, 0x24, 0x2b, 0xf3, + 0x80, 0x18, 0x76, 0x15, 0x0a, 0x13, 0xcf, 0x9f, 0x1a, 0xa1, 0xb8, 0xf7, 0x20, 0x52, 0xb8, 0x9d, + 0xd9, 0xc7, 0xae, 0xe7, 0x5b, 0x68, 0x0d, 0xb8, 0x74, 0xf5, 0x01, 0xc7, 0xa0, 0x2a, 0x80, 0x3d, + 0x84, 0xe1, 0x76, 0x64, 0xb9, 0x63, 0xc7, 0x0b, 0x2c, 0x13, 0x37, 0x98, 0x02, 0xa9, 0xfc, 0x10, + 0x81, 0x76, 0x2e, 0x78, 0x6b, 0xfd, 0xa9, 0xed, 0x1a, 0xa1, 0x38, 0xa6, 0xa2, 0xd6, 0x46, 0x10, + 0xac, 0xee, 0x57, 0x81, 0x27, 0x9c, 0x54, 0xfc, 0xda, 0x54, 0x09, 0x01, 0x54, 0xdd, 0x57, 0x01, + 0xac, 0x60, 0x6c, 0xcc, 0x78, 0xe6, 0x65, 0xca, 0xbc, 0x2c, 0x20, 0x3b, 0x17, 0xac, 0x07, 0xf5, + 0xd1, 0x11, 0x6e, 0xbf, 0x5e, 0xdb, 0x08, 0x8d, 0x96, 0xe7, 0x08, 0xf7, 0xd1, 0xdd, 0x45, 0x83, + 0xe1, 0x41, 0x9a, 0x8c, 0x47, 0x86, 0x2e, 0xf0, 0xa2, 0x01, 0x6f, 0x8f, 0xad, 0x23, 0xcb, 0x3f, + 0xe6, 0xc6, 0x47, 0x25, 0x75, 0x61, 0x81, 0x63, 0xc8, 0xfa, 0xa8, 0xd8, 0x49, 0xe2, 0x46, 0x13, + 0x2e, 0xad, 0xc8, 0xfc, 0x5b, 0x85, 0x16, 0xfe, 0xb3, 0x75, 0xa8, 0x48, 0xf9, 0xd3, 0x39, 0x81, + 0x31, 0x23, 0x3f, 0x57, 0x1c, 0x5b, 0x5d, 0x16, 0x10, 0x7e, 0x3d, 0x64, 0x6c, 0x84, 0x86, 0xe3, + 0x1d, 0x4b, 0x17, 0x5f, 0x04, 0xa4, 0x6b, 0xd2, 0xd1, 0x9d, 0x31, 0xb5, 0x82, 0x99, 0x31, 0x8e, + 0x56, 0x48, 0x02, 0x48, 0x9e, 0x57, 0xc9, 0xc9, 0xcf, 0xab, 0x28, 0xfc, 0x8c, 0x97, 0x07, 0xc9, + 0xd0, 0x91, 0xee, 0x6d, 0xa8, 0x44, 0x7a, 0x23, 0x96, 0x22, 0x8e, 0x21, 0x23, 0x50, 0xd7, 0x64, + 0xf7, 0x20, 0x79, 0x3e, 0x46, 0x37, 0x02, 0xdd, 0x9b, 0x44, 0x11, 0x7a, 0x31, 0xb8, 0x19, 0x0c, + 0x26, 0xf1, 0xd9, 0xc0, 0xd4, 0x33, 0xe3, 0xf1, 0x45, 0x00, 0xc9, 0xb8, 0x07, 0x70, 0x49, 0x38, + 0x2c, 0x2d, 0x53, 0x9f, 0xd8, 0x96, 0x63, 0xea, 0xb6, 0xc9, 0x4f, 0xd0, 0xf3, 0xda, 0x66, 0x8c, + 0xda, 0x45, 0x4c, 0xd7, 0x24, 0x0d, 0x4b, 0x58, 0xa9, 0xa6, 0x7d, 0x6c, 0x05, 0xa1, 0x88, 0x27, + 0xab, 0x72, 0x60, 0x9b, 0x60, 0xaa, 0x13, 0x2d, 0x91, 0x66, 0x18, 0xd2, 0xd5, 0xb4, 0x58, 0xdd, + 0xcb, 0x44, 0xb7, 0x56, 0xb8, 0xa6, 0xf7, 0x0a, 0xc5, 0x62, 0x89, 0x80, 0x62, 0xb1, 0x52, 0xe2, + 0x40, 0xe1, 0x7b, 0xb0, 0x81, 0x48, 0x51, 0x29, 0x22, 0xe1, 0xd7, 0x95, 0x6a, 0x63, 0xcf, 0xe1, + 0x15, 0x42, 0xa0, 0xfa, 0x57, 0xf3, 0x00, 0x89, 0xa1, 0x4f, 0x37, 0xe1, 0xc8, 0x03, 0x17, 0x8f, + 0x5c, 0x91, 0xd2, 0x5d, 0x93, 0x3d, 0x84, 0xab, 0xe2, 0xde, 0x5d, 0x1c, 0xe4, 0x61, 0xbb, 0xfa, + 0x91, 0x11, 0x05, 0x95, 0x31, 0x81, 0xe5, 0xc7, 0xf7, 0x5d, 0x77, 0xc7, 0x40, 0xb3, 0x61, 0x43, + 0xe6, 0x09, 0x2f, 0x66, 0x69, 0x8f, 0xbf, 0xac, 0x8c, 0x26, 0xec, 0xa3, 0x8b, 0x19, 0x7b, 0x0f, + 0xae, 0xf8, 0xd6, 0xc4, 0xb7, 0x82, 0x13, 0x3d, 0x0c, 0xe4, 0xc2, 0x78, 0xd4, 0xe7, 0xa6, 0x40, + 0x8e, 0x82, 0xb8, 0xac, 0xf7, 0xe0, 0x8a, 0xe8, 0xdc, 0x85, 0xea, 0x71, 0x4f, 0xfa, 0x26, 0x47, + 0xca, 0xb5, 0xa3, 0x50, 0x60, 0xf2, 0x7e, 0x44, 0x0f, 0xf6, 0x94, 0xb4, 0x32, 0xf7, 0x74, 0x88, + 0x6b, 0xec, 0xe4, 0xc2, 0xa0, 0x85, 0x5b, 0xd2, 0x78, 0x82, 0xa9, 0x90, 0xc3, 0xb1, 0xa7, 0xa1, + 0xab, 0x3f, 0xac, 0x3f, 0xa0, 0x07, 0x89, 0xe8, 0x59, 0x01, 0xcf, 0xb4, 0x34, 0xc2, 0xb1, 0x77, + 0x70, 0x5e, 0x24, 0xcd, 0x8e, 0xde, 0xd4, 0xe0, 0x71, 0x0e, 0x4a, 0xd2, 0x50, 0x8d, 0xbf, 0xae, + 0xf1, 0x16, 0x30, 0xa9, 0xe6, 0x11, 0x75, 0x95, 0xa8, 0x37, 0xe2, 0x6a, 0x0b, 0xe2, 0x37, 0x80, + 0xaa, 0xc8, 0x8f, 0xd1, 0x6a, 0xcb, 0xf6, 0x3e, 0x22, 0xe9, 0x44, 0xed, 0x3d, 0xb8, 0x92, 0xb4, + 0x4e, 0x37, 0x42, 0x3d, 0x3c, 0xb1, 0x74, 0xcb, 0x35, 0xe9, 0xb2, 0x64, 0x49, 0xdb, 0x8c, 0x1b, + 0xda, 0x0c, 0x47, 0x27, 0x16, 0x5a, 0xec, 0x92, 0x47, 0x75, 0xe3, 0xc5, 0x1e, 0xd5, 0x8f, 0xa0, + 0x91, 0xd6, 0xa9, 0xa5, 0xee, 0xe6, 0x97, 0x8d, 0x2f, 0xcb, 0xb1, 0x22, 0x71, 0x8f, 0xdf, 0x87, + 0xcd, 0x13, 0x23, 0x48, 0xeb, 0xe3, 0xe4, 0xe8, 0x2d, 0x69, 0x1b, 0x27, 0x46, 0x20, 0x2b, 0xe1, + 0xea, 0xef, 0x67, 0xa0, 0x9e, 0x76, 0x7d, 0xf0, 0x1b, 0x5c, 0xce, 0x7c, 0xea, 0xf2, 0x80, 0xc7, + 0xbc, 0x16, 0x25, 0x71, 0x2d, 0xf0, 0x80, 0x92, 0xf9, 0xd4, 0x8d, 0xd6, 0xc2, 0xec, 0xb4, 0x45, + 0x69, 0xf6, 0x26, 0x14, 0x67, 0xa7, 0x5c, 0x42, 0x3f, 0x6f, 0xf6, 0x15, 0x66, 0x3c, 0x10, 0xfe, + 0x4d, 0x28, 0xce, 0x05, 0x69, 0xee, 0x79, 0xa4, 0x73, 0x22, 0x55, 0xff, 0xf9, 0x3a, 0x54, 0x65, + 0x8f, 0xdd, 0x37, 0x89, 0x34, 0xf9, 0x56, 0x41, 0x40, 0x5b, 0x14, 0xab, 0xaa, 0x53, 0xa4, 0x39, + 0xf6, 0x13, 0x0f, 0x33, 0x81, 0x13, 0x23, 0x68, 0xce, 0x43, 0x0f, 0x45, 0x3e, 0x8a, 0x52, 0xcf, + 0x89, 0xa2, 0xf1, 0xf9, 0xca, 0x40, 0x99, 0x20, 0x02, 0xf1, 0xdf, 0x13, 0x97, 0x7d, 0xe8, 0x7a, + 0x1f, 0x85, 0x75, 0xe6, 0x97, 0xe6, 0x4b, 0x35, 0xba, 0xdd, 0x47, 0x61, 0xac, 0x0f, 0x61, 0x23, + 0xb9, 0x5a, 0xc1, 0x59, 0x0a, 0x4b, 0x2c, 0xb5, 0xf8, 0x5e, 0x85, 0x78, 0x7a, 0xa0, 0x66, 0x07, + 0xba, 0xe7, 0x98, 0xd1, 0x1d, 0xae, 0x62, 0x74, 0x9e, 0x32, 0x70, 0x4c, 0x71, 0xa7, 0x94, 0xd3, + 0xb8, 0xd6, 0x59, 0x44, 0x13, 0x9f, 0xb9, 0xf4, 0xad, 0x33, 0x71, 0x97, 0xeb, 0xcf, 0x33, 0xb0, + 0xb9, 0xe4, 0xa4, 0x43, 0xd1, 0x9e, 0x3c, 0x84, 0x85, 0x3f, 0xd1, 0xc8, 0x9c, 0x1a, 0xe1, 0xf8, + 0x44, 0x9f, 0xf9, 0xd6, 0xc4, 0x3e, 0x8f, 0x5e, 0xf3, 0x22, 0xd8, 0x01, 0x81, 0x50, 0xfa, 0xf3, + 0x73, 0x43, 0x7e, 0x8c, 0xc1, 0x05, 0x1f, 0x3f, 0x2b, 0xec, 0xd1, 0xf9, 0x45, 0x14, 0xe6, 0x9a, + 0x7b, 0x4e, 0x98, 0xeb, 0x0d, 0x28, 0xbb, 0x1e, 0x85, 0x34, 0xcd, 0x4e, 0x45, 0x2c, 0x58, 0xd1, + 0xf5, 0xc2, 0x81, 0x7b, 0x70, 0xca, 0x1e, 0xc2, 0x95, 0x79, 0x40, 0x71, 0x03, 0x47, 0x96, 0x1f, + 0x9c, 0xd8, 0xb1, 0xb9, 0xcc, 0x05, 0xc8, 0xa5, 0x79, 0x60, 0xed, 0xc7, 0x38, 0xde, 0x12, 0xf5, + 0x26, 0x14, 0xba, 0xb1, 0x73, 0x31, 0x8e, 0xab, 0xcb, 0x8a, 0x27, 0x70, 0x3c, 0x28, 0x73, 0xab, + 0x73, 0xdf, 0x98, 0xb1, 0xfb, 0x90, 0x9d, 0x1a, 0x33, 0x71, 0x58, 0xd9, 0x88, 0x4f, 0x74, 0x39, + 0xf6, 0xc1, 0xbe, 0x31, 0xe3, 0xbb, 0x3f, 0x12, 0xdd, 0xf8, 0x08, 0x4a, 0x11, 0xe0, 0x5b, 0xed, + 0xd8, 0xff, 0x66, 0x1d, 0xca, 0x6d, 0xf9, 0x70, 0x60, 0x6c, 0xb8, 0x7a, 0xe8, 0xcf, 0x5d, 0x54, + 0xa0, 0xa3, 0x87, 0x41, 0xc6, 0x86, 0x3b, 0x12, 0xa0, 0x68, 0x6a, 0xaf, 0xbf, 0x60, 0x6a, 0xdf, + 0x04, 0xf0, 0xc9, 0xb7, 0x46, 0xee, 0xb5, 0x6c, 0x1c, 0x67, 0xdc, 0x35, 0xbb, 0xe6, 0xf9, 0xea, + 0x10, 0xab, 0xdc, 0x37, 0x0f, 0xb1, 0xca, 0xaf, 0x0c, 0xb1, 0xba, 0x97, 0x6c, 0x2f, 0x38, 0xc5, + 0xb1, 0xe0, 0x32, 0xdf, 0xe4, 0x66, 0xf1, 0xd5, 0x26, 0x2c, 0xfd, 0x7b, 0x50, 0x8f, 0x5a, 0x27, + 0xf2, 0x83, 0xd4, 0x6d, 0x2a, 0x81, 0xe3, 0xa7, 0x09, 0xb5, 0x50, 0x4e, 0xa6, 0x97, 0x6c, 0xe5, + 0x25, 0x61, 0x5c, 0x7f, 0x3d, 0x03, 0x4c, 0xf8, 0x82, 0x76, 0xe7, 0x8e, 0x33, 0xb2, 0xce, 0x49, + 0x32, 0xdc, 0x87, 0x4d, 0x71, 0xd8, 0x21, 0xdd, 0x62, 0x15, 0xc7, 0xfb, 0x1c, 0x91, 0x1c, 0xef, + 0xaf, 0xba, 0xf0, 0xba, 0xbe, 0xf2, 0xc2, 0xeb, 0xea, 0x8b, 0xb4, 0xb7, 0xa1, 0x22, 0x5f, 0x17, + 0xe5, 0x7a, 0x12, 0x18, 0xc9, 0x4d, 0xd1, 0x3f, 0x5f, 0x07, 0x48, 0xfc, 0x55, 0xbf, 0xec, 0xf8, + 0xb8, 0x15, 0x43, 0x92, 0x5d, 0x35, 0x24, 0xdb, 0xa0, 0xc8, 0x74, 0xd2, 0xbd, 0xe5, 0x7a, 0x42, + 0x18, 0xa9, 0x39, 0x76, 0x20, 0xdf, 0x2d, 0xa5, 0xeb, 0x27, 0x22, 0xa4, 0x88, 0x23, 0xb9, 0xf3, + 0x5c, 0x2c, 0xc0, 0x92, 0x1d, 0x70, 0x99, 0xcc, 0x3e, 0x85, 0xeb, 0x31, 0xa7, 0x7e, 0x66, 0x87, + 0x27, 0xde, 0x3c, 0x14, 0x8b, 0x35, 0x10, 0x52, 0xea, 0x6a, 0x94, 0xd3, 0x53, 0x8e, 0xe6, 0xeb, + 0x35, 0x40, 0x6b, 0x69, 0x32, 0x77, 0x1c, 0x3d, 0xb4, 0xce, 0x43, 0xf1, 0xd6, 0x48, 0x23, 0xe5, + 0xea, 0x93, 0x86, 0x57, 0x2b, 0x4d, 0x44, 0x42, 0xfd, 0x9f, 0x59, 0xc8, 0xff, 0x68, 0x6e, 0xf9, + 0x17, 0xec, 0x23, 0x28, 0x07, 0xe1, 0x34, 0x94, 0x4f, 0xdd, 0xaf, 0xf3, 0x0c, 0x08, 0x4f, 0x87, + 0xe6, 0xd6, 0xd4, 0x72, 0x43, 0xee, 0x03, 0x47, 0x5a, 0xda, 0x80, 0x2e, 0x43, 0x3e, 0x08, 0xad, + 0x59, 0x20, 0x62, 0x67, 0x79, 0x82, 0x6d, 0x41, 0xde, 0xf5, 0x4c, 0x2b, 0x48, 0x47, 0xc8, 0xf6, + 0x51, 0xe3, 0xe0, 0x08, 0xa6, 0x42, 0x21, 0x1e, 0xf1, 0xa5, 0x93, 0x6f, 0x8e, 0xa1, 0x7b, 0x37, + 0x96, 0x61, 0xda, 0xee, 0x71, 0x74, 0x0f, 0x3c, 0x4e, 0xe3, 0xd6, 0x4a, 0x56, 0x96, 0x71, 0x1c, + 0xbd, 0x1f, 0x21, 0x92, 0x6c, 0x0b, 0x2a, 0xf8, 0xf3, 0xa9, 0x6f, 0x87, 0xd6, 0xf0, 0x51, 0x24, + 0xdd, 0x25, 0x10, 0xda, 0x48, 0xa6, 0x15, 0x5a, 0xe3, 0x70, 0xf8, 0xb5, 0x88, 0x3b, 0x2d, 0x6b, + 0x12, 0x84, 0x7d, 0x0f, 0xd8, 0x91, 0x31, 0x3e, 0x3d, 0xf6, 0x29, 0x5a, 0xe4, 0xeb, 0xb9, 0xe5, + 0xdb, 0x56, 0x14, 0x67, 0x5a, 0x91, 0x3a, 0x45, 0xdb, 0x4c, 0xc8, 0x7e, 0xc4, 0xa9, 0xd0, 0xba, + 0x9b, 0x1a, 0xe7, 0x6d, 0x6f, 0x26, 0xc2, 0xf8, 0x44, 0x8a, 0x3d, 0x82, 0xab, 0xb8, 0x39, 0x46, + 0x17, 0x93, 0x71, 0x0e, 0x09, 0xef, 0x2a, 0x7f, 0xec, 0xe9, 0xd2, 0x89, 0x11, 0x24, 0x77, 0x11, + 0xb9, 0x53, 0x40, 0xfd, 0x0d, 0xa8, 0xa5, 0xfa, 0x7d, 0xc9, 0xb1, 0x37, 0xec, 0xf4, 0x3a, 0xad, + 0x11, 0x77, 0x14, 0x08, 0x87, 0xd3, 0xba, 0xe4, 0x99, 0xca, 0x49, 0x0e, 0x84, 0x3c, 0xf9, 0xb5, + 0x3a, 0xda, 0xe3, 0x8e, 0x52, 0x50, 0x73, 0xa5, 0xac, 0x92, 0x55, 0xff, 0xc6, 0x3a, 0x6c, 0x8e, + 0x7c, 0xc3, 0x0d, 0x0c, 0xae, 0xc3, 0xb8, 0xa1, 0xef, 0x39, 0xec, 0x7b, 0x50, 0x0a, 0xc7, 0x8e, + 0x3c, 0x11, 0x6e, 0x47, 0x62, 0x67, 0x81, 0xf4, 0xc1, 0x68, 0xcc, 0x8f, 0x44, 0x8a, 0x21, 0xff, + 0xc1, 0xde, 0x81, 0xfc, 0x91, 0x75, 0x6c, 0xbb, 0x42, 0xf2, 0x5e, 0x59, 0x64, 0xdc, 0x41, 0xe4, + 0xde, 0x9a, 0xc6, 0xa9, 0xd8, 0x7b, 0x50, 0x18, 0x7b, 0xd3, 0x68, 0xcb, 0x4b, 0x6e, 0x25, 0x4a, + 0x05, 0x21, 0x76, 0x6f, 0x4d, 0x13, 0x74, 0xec, 0x23, 0x28, 0xf9, 0x9e, 0xe3, 0x60, 0xbf, 0x8b, + 0xcd, 0xb0, 0xb1, 0xc8, 0xa3, 0x09, 0xfc, 0xde, 0x9a, 0x16, 0xd3, 0xaa, 0x0f, 0xa0, 0x28, 0x2a, + 0x8b, 0xdd, 0xb0, 0xd3, 0x79, 0xdc, 0x15, 0x3d, 0xd8, 0x1a, 0xec, 0xef, 0x77, 0x47, 0xfc, 0xca, + 0xb5, 0x36, 0xe8, 0xf5, 0x76, 0x9a, 0xad, 0xcf, 0x95, 0xf5, 0x9d, 0x12, 0x14, 0xf8, 0xf0, 0xa8, + 0xbf, 0x95, 0x81, 0x8d, 0x85, 0x06, 0xb0, 0x4f, 0x20, 0x47, 0xf6, 0x15, 0xef, 0x9e, 0xbb, 0x2b, + 0x5b, 0x29, 0xa5, 0xb9, 0xa6, 0x8d, 0x1c, 0xea, 0xa7, 0x50, 0x4f, 0xc3, 0x25, 0x67, 0x52, 0x0d, + 0xca, 0x5a, 0xa7, 0xd9, 0xd6, 0x07, 0xfd, 0xde, 0x97, 0xdc, 0x37, 0x4b, 0xc9, 0xa7, 0x5a, 0x97, + 0xfc, 0x3f, 0xbf, 0x0e, 0xca, 0x62, 0xc7, 0xb0, 0xc7, 0x68, 0x35, 0x4d, 0x67, 0x8e, 0x45, 0xca, + 0xa9, 0x34, 0x64, 0xb7, 0x56, 0xf4, 0xa4, 0x20, 0xe3, 0x61, 0x4e, 0xe3, 0x54, 0x5a, 0xfd, 0x0d, + 0x60, 0xcb, 0x3d, 0xf8, 0xcb, 0xcb, 0xfe, 0xbf, 0x67, 0x20, 0x77, 0xe0, 0x18, 0x2e, 0xbb, 0x03, + 0x79, 0x7a, 0xd5, 0x48, 0xc8, 0x6f, 0x79, 0x35, 0xe1, 0xb4, 0x20, 0x1c, 0x7b, 0x0b, 0xb2, 0xe1, + 0x38, 0xba, 0xe9, 0x7d, 0xed, 0x39, 0x93, 0x6f, 0x6f, 0x4d, 0x43, 0x2a, 0xb6, 0x0d, 0x59, 0xd3, + 0x8c, 0x6e, 0x3d, 0x08, 0x97, 0x52, 0xdb, 0x08, 0x8d, 0xb6, 0x35, 0xb1, 0x5d, 0x5b, 0xbc, 0xc2, + 0x84, 0x24, 0xec, 0x75, 0xc8, 0x9a, 0x63, 0x27, 0x7d, 0x85, 0x85, 0x3b, 0x11, 0xe2, 0x0c, 0xcd, + 0xb1, 0x83, 0xba, 0x5f, 0xe8, 0x5f, 0xe8, 0xfe, 0xdc, 0xa5, 0x78, 0xd9, 0x40, 0xd8, 0x63, 0x15, + 0xd4, 0x62, 0xe6, 0x14, 0x74, 0x1b, 0x88, 0x2b, 0xa3, 0x33, 0xdf, 0x9a, 0x19, 0x7e, 0x6c, 0x89, + 0xd9, 0xc1, 0x01, 0x07, 0xec, 0x14, 0x80, 0x1e, 0x8b, 0x55, 0xdf, 0xa6, 0x27, 0x77, 0x50, 0xa5, + 0x57, 0xa3, 0x5f, 0x2b, 0xde, 0x15, 0x14, 0x18, 0xf5, 0x2f, 0xb2, 0x50, 0x91, 0xea, 0xc3, 0x3e, + 0x80, 0x92, 0x99, 0x5e, 0x88, 0xd7, 0x97, 0x2a, 0xfd, 0xa0, 0x1d, 0x2d, 0x41, 0x53, 0x4c, 0x6f, + 0x3a, 0x6f, 0x0b, 0xf5, 0x67, 0x86, 0x6f, 0xf3, 0x87, 0xd6, 0xd6, 0xe5, 0x83, 0xaf, 0xa1, 0x15, + 0x3e, 0x89, 0x30, 0x7b, 0x6b, 0x5a, 0x35, 0x90, 0xd2, 0x64, 0x77, 0x88, 0x26, 0x65, 0x53, 0x0f, + 0xd6, 0x71, 0xe0, 0xde, 0x9a, 0x16, 0xe1, 0x91, 0xd4, 0x3a, 0xb7, 0xc6, 0xf3, 0x30, 0xb2, 0x3b, + 0x6a, 0x51, 0x83, 0x08, 0x48, 0xaf, 0x66, 0xf2, 0x9f, 0xec, 0x21, 0x4a, 0x5b, 0xc3, 0x71, 0x3c, + 0x52, 0xd6, 0xf2, 0xf2, 0x31, 0x54, 0x3b, 0x86, 0xf3, 0x57, 0x3a, 0xa3, 0x14, 0xbb, 0x07, 0x79, + 0x2f, 0x3c, 0xb1, 0x22, 0x6d, 0x3e, 0x7a, 0xbc, 0x07, 0x41, 0xed, 0x56, 0x0f, 0x67, 0x0a, 0xa1, + 0xd5, 0x3f, 0xc8, 0x40, 0x51, 0xf4, 0x00, 0xdb, 0x84, 0xda, 0xb0, 0x33, 0xd2, 0x9f, 0x34, 0xb5, + 0x6e, 0x73, 0xa7, 0xd7, 0x11, 0x37, 0x6f, 0x1e, 0x6b, 0xcd, 0xbe, 0x10, 0x90, 0x5a, 0xe7, 0xc9, + 0xe0, 0xf3, 0x0e, 0xf7, 0xd0, 0xb6, 0x3b, 0xfd, 0x2f, 0x95, 0x2c, 0x3f, 0x8e, 0xe8, 0x1c, 0x34, + 0x35, 0x94, 0x95, 0x15, 0x28, 0x76, 0xbe, 0xe8, 0xb4, 0x0e, 0x49, 0x58, 0xd6, 0x01, 0xda, 0x9d, + 0x66, 0xaf, 0x37, 0x68, 0xa1, 0xf0, 0x2c, 0x30, 0x06, 0xf5, 0x96, 0xd6, 0x69, 0x8e, 0x3a, 0x7a, + 0xb3, 0xd5, 0x1a, 0x1c, 0xf6, 0x47, 0x4a, 0x11, 0x4b, 0x6c, 0xf6, 0x46, 0x1d, 0x2d, 0x06, 0xd1, + 0x83, 0x6a, 0x6d, 0x6d, 0x70, 0x10, 0x43, 0xca, 0x3b, 0x65, 0xb4, 0x01, 0x69, 0xac, 0xd4, 0x3f, + 0xda, 0x84, 0x7a, 0x7a, 0x6a, 0xb2, 0x8f, 0xa1, 0x64, 0x9a, 0xa9, 0x31, 0xbe, 0xb9, 0x6a, 0x0a, + 0x3f, 0x68, 0x9b, 0xd1, 0x30, 0xf3, 0x1f, 0xec, 0xb5, 0x68, 0x21, 0xad, 0x2f, 0x2d, 0xa4, 0x68, + 0x19, 0xfd, 0x00, 0x36, 0xc4, 0x8b, 0x32, 0xa6, 0x11, 0x1a, 0x47, 0x46, 0x60, 0xa5, 0x57, 0x49, + 0x8b, 0x90, 0x6d, 0x81, 0xdb, 0x5b, 0xd3, 0xea, 0xe3, 0x14, 0x84, 0x7d, 0x1f, 0xea, 0x06, 0xf7, + 0xfe, 0x44, 0xfc, 0x39, 0x59, 0x0d, 0x6d, 0x92, 0x13, 0x28, 0x61, 0xaf, 0x19, 0x32, 0x00, 0x27, + 0xa2, 0xe9, 0x7b, 0xb3, 0x84, 0x39, 0x9f, 0x3a, 0x81, 0xf5, 0xbd, 0x99, 0xc4, 0x5b, 0x35, 0xa5, + 0x34, 0xfb, 0x08, 0xaa, 0xa2, 0xe6, 0x89, 0xab, 0x23, 0x5e, 0xb2, 0xbc, 0xda, 0xa4, 0x56, 0xee, + 0xad, 0x69, 0x95, 0x71, 0x92, 0x64, 0x8f, 0x50, 0x97, 0x4c, 0x94, 0xf0, 0xa2, 0x3c, 0xd7, 0xa8, + 0xb6, 0x11, 0x17, 0x18, 0x71, 0x8a, 0xbd, 0x07, 0x40, 0xf5, 0xe4, 0x3c, 0xa5, 0x54, 0x6c, 0x92, + 0xef, 0xcd, 0x22, 0x96, 0xb2, 0x19, 0x25, 0xa4, 0xea, 0x71, 0x47, 0x55, 0x79, 0xb9, 0x7a, 0xe4, + 0xac, 0x4a, 0xaa, 0xc7, 0x7d, 0x5c, 0x71, 0xf5, 0x38, 0x1b, 0x2c, 0x55, 0x2f, 0xe2, 0xe2, 0xd5, + 0xe3, 0x4c, 0x51, 0xf5, 0x38, 0x4f, 0x65, 0xb1, 0x7a, 0x11, 0x0b, 0x55, 0x8f, 0x73, 0x7c, 0x7f, + 0xc9, 0x7a, 0xa8, 0x3e, 0xd7, 0x7a, 0xc0, 0x61, 0x4b, 0xdb, 0x0f, 0xdf, 0x87, 0x7a, 0x70, 0xe2, + 0x9d, 0x49, 0x02, 0xa4, 0x26, 0x73, 0x0f, 0x4f, 0xbc, 0x33, 0x59, 0x82, 0xd4, 0x02, 0x19, 0x80, + 0xb5, 0xe5, 0x4d, 0xa4, 0xd3, 0xd2, 0xba, 0x5c, 0x5b, 0x6a, 0xe1, 0x13, 0xdb, 0x3a, 0xc3, 0xda, + 0x1a, 0x51, 0x02, 0x3b, 0x25, 0x71, 0xfb, 0x04, 0xc2, 0x91, 0x93, 0x8a, 0xe8, 0x11, 0x25, 0x41, + 0xec, 0x00, 0x0a, 0x70, 0x6e, 0xcd, 0x5d, 0x99, 0x4d, 0x91, 0xe7, 0xd6, 0xa1, 0x9b, 0x62, 0xac, + 0x72, 0x52, 0xc1, 0x9a, 0xac, 0x8a, 0xc0, 0xfa, 0x7a, 0x6e, 0xb9, 0x63, 0x4b, 0x44, 0xee, 0xa5, + 0x56, 0xc5, 0x50, 0xe0, 0x92, 0x55, 0x11, 0x41, 0xe2, 0x79, 0x1d, 0xb3, 0xb3, 0xc5, 0x79, 0x2d, + 0x31, 0xd3, 0xbc, 0x8e, 0x59, 0xe3, 0x05, 0x15, 0xf3, 0x5e, 0x5a, 0x5a, 0x50, 0x12, 0x33, 0x5f, + 0x50, 0x31, 0xf7, 0x23, 0x10, 0xb3, 0x89, 0x77, 0x6e, 0x2a, 0xbe, 0x8f, 0xd7, 0x5a, 0xf4, 0x2e, + 0x8c, 0xe3, 0x14, 0xce, 0x55, 0xdf, 0x42, 0x6b, 0x45, 0x4c, 0x85, 0x2b, 0xf2, 0x5c, 0xd5, 0x08, + 0x13, 0x2f, 0x25, 0x3f, 0x49, 0x4a, 0x85, 0xcd, 0xec, 0xd0, 0x6f, 0x98, 0xcb, 0x85, 0x1d, 0xd8, + 0xa1, 0x9f, 0x14, 0x86, 0x29, 0xf6, 0x0e, 0xd0, 0x34, 0xe4, 0x2c, 0x96, 0x2c, 0xba, 0xb1, 0x5b, + 0x04, 0x43, 0xc9, 0x14, 0xbf, 0x71, 0xb2, 0x88, 0x32, 0xc6, 0xe6, 0xb8, 0x31, 0x91, 0x27, 0x0b, + 0x2f, 0xa2, 0xd5, 0x6e, 0xe1, 0x64, 0xe1, 0x44, 0x2d, 0x73, 0xcc, 0xee, 0x03, 0x71, 0x13, 0xfd, + 0x71, 0xea, 0x71, 0x38, 0xdf, 0x9b, 0x71, 0xea, 0x22, 0x12, 0x20, 0x2d, 0xb6, 0xc0, 0xf1, 0xdc, + 0xa8, 0xe1, 0x27, 0xa9, 0x16, 0x20, 0x22, 0x16, 0x06, 0xe3, 0x38, 0xa5, 0xfe, 0x4e, 0x01, 0x8a, + 0x42, 0xd6, 0xb2, 0x4b, 0xb0, 0x21, 0x44, 0x7e, 0xbb, 0x39, 0x6a, 0xee, 0x34, 0x87, 0xa8, 0xa4, + 0x31, 0xa8, 0x73, 0x99, 0x1f, 0xc3, 0x32, 0xb8, 0x0f, 0x90, 0xd0, 0x8f, 0x41, 0xeb, 0xb8, 0x0f, + 0x08, 0x5e, 0xfe, 0x08, 0x67, 0x96, 0x6d, 0x40, 0x85, 0x33, 0x72, 0x00, 0x5d, 0x04, 0x26, 0x2e, + 0x9e, 0xce, 0x4b, 0x2c, 0xfc, 0xc0, 0xb2, 0x90, 0xb0, 0x70, 0x40, 0x31, 0x66, 0x89, 0x4e, 0x34, + 0x19, 0xd4, 0x47, 0xda, 0x61, 0xbf, 0x95, 0x94, 0x53, 0xa6, 0xcb, 0x9b, 0x3c, 0x9b, 0x27, 0xdd, + 0xce, 0x53, 0x05, 0x90, 0x89, 0xe7, 0x42, 0xe9, 0x0a, 0xaa, 0x99, 0x94, 0x09, 0x25, 0xab, 0xec, + 0x1a, 0x5c, 0x1a, 0xee, 0x0d, 0x9e, 0xea, 0x9c, 0x29, 0x6e, 0x42, 0x8d, 0x5d, 0x06, 0x45, 0x42, + 0xf0, 0xec, 0xeb, 0x58, 0x24, 0x41, 0x23, 0xc2, 0xa1, 0xb2, 0x41, 0x87, 0xff, 0x08, 0x1b, 0xf1, + 0x7d, 0x57, 0xc1, 0xa6, 0x70, 0xd6, 0x41, 0xef, 0x70, 0xbf, 0x3f, 0x54, 0x36, 0xb1, 0x12, 0x04, + 0xe1, 0x35, 0x67, 0x71, 0x36, 0xc9, 0x6e, 0x7d, 0x89, 0x36, 0x70, 0x84, 0x3d, 0x6d, 0x6a, 0xfd, + 0x6e, 0xff, 0xf1, 0x50, 0xb9, 0x1c, 0xe7, 0xdc, 0xd1, 0xb4, 0x81, 0x36, 0x54, 0xae, 0xc4, 0x80, + 0xe1, 0xa8, 0x39, 0x3a, 0x1c, 0x2a, 0x57, 0xe3, 0x5a, 0x1e, 0x68, 0x83, 0x56, 0x67, 0x38, 0xec, + 0x75, 0x87, 0x23, 0xe5, 0x1a, 0xbb, 0x02, 0x9b, 0x49, 0x8d, 0x22, 0xe2, 0x86, 0x54, 0x51, 0xed, + 0x71, 0x67, 0xa4, 0x5c, 0x8f, 0xab, 0xd1, 0x1a, 0xf4, 0x7a, 0x4d, 0x3a, 0xd9, 0xbe, 0x81, 0x44, + 0x74, 0x98, 0x2f, 0x5a, 0xf3, 0x0a, 0xd6, 0xeb, 0xb0, 0x2f, 0x83, 0x6e, 0x4a, 0x53, 0x63, 0xd8, + 0xf9, 0xd1, 0x61, 0xa7, 0xdf, 0xea, 0x28, 0xaf, 0x26, 0x53, 0x23, 0x86, 0xdd, 0x8a, 0xa7, 0x46, + 0x0c, 0xba, 0x1d, 0x97, 0x19, 0x81, 0x86, 0xca, 0x16, 0xe6, 0x27, 0xea, 0xd1, 0xef, 0x77, 0x5a, + 0x23, 0x6c, 0xeb, 0x6b, 0x71, 0x2f, 0x1e, 0x1e, 0x3c, 0xd6, 0x9a, 0xed, 0x8e, 0xa2, 0x22, 0x44, + 0xeb, 0xf4, 0x9b, 0xfb, 0xd1, 0x68, 0xdf, 0x91, 0x46, 0xfb, 0xa0, 0x3b, 0xd2, 0x94, 0xbb, 0xf1, + 0xe8, 0x52, 0xf2, 0x75, 0xf6, 0x0a, 0x5c, 0x93, 0xe7, 0xa1, 0xfe, 0xb4, 0x3b, 0xda, 0x13, 0x07, + 0xf1, 0xf7, 0xf8, 0x21, 0x32, 0x21, 0x5b, 0xed, 0x16, 0x8f, 0x38, 0x20, 0x5e, 0x4c, 0x6d, 0xef, + 0x54, 0xe9, 0x2d, 0x75, 0xa1, 0x80, 0xa8, 0x9f, 0x01, 0x93, 0x9f, 0x15, 0x16, 0x01, 0xd0, 0x0c, + 0x72, 0x13, 0xdf, 0x9b, 0x46, 0x8f, 0x72, 0xe0, 0x6f, 0xb4, 0xbf, 0x67, 0xf3, 0x23, 0x3a, 0xdc, + 0x4e, 0x2e, 0xdd, 0xcb, 0x20, 0xf5, 0xef, 0x66, 0xa0, 0x9e, 0x56, 0x3e, 0xc8, 0xe1, 0x3a, 0xd1, + 0x5d, 0x2f, 0xe4, 0xaf, 0xa1, 0x05, 0xf1, 0x6b, 0xbf, 0x93, 0xbe, 0x17, 0xd2, 0x73, 0x68, 0xe4, + 0x0e, 0x88, 0x75, 0x09, 0x9e, 0x6b, 0x9c, 0x66, 0x5d, 0xb8, 0x94, 0x7a, 0x99, 0x39, 0xf5, 0x16, + 0x5d, 0x23, 0x7e, 0x51, 0x75, 0xa1, 0xfe, 0x1a, 0x0b, 0x96, 0xdb, 0x24, 0x9e, 0x4e, 0xc8, 0x25, + 0x4f, 0x27, 0xec, 0x41, 0x2d, 0xa5, 0xeb, 0x90, 0x17, 0x67, 0x92, 0xae, 0x69, 0xc9, 0x9e, 0xbc, + 0xbc, 0x9a, 0xea, 0xdf, 0xce, 0x40, 0x55, 0xd6, 0x7c, 0xbe, 0x73, 0x4e, 0x14, 0x97, 0x24, 0x7e, + 0xeb, 0xb6, 0x19, 0xbd, 0x82, 0x16, 0x81, 0xba, 0xf4, 0x0d, 0x09, 0xee, 0xbb, 0xde, 0x3d, 0x1d, + 0xc6, 0xcd, 0x91, 0x41, 0xec, 0x16, 0x00, 0xbd, 0x50, 0xb4, 0xfb, 0x39, 0x12, 0x88, 0x27, 0xb4, + 0x13, 0x88, 0x7a, 0x1b, 0xca, 0xbb, 0xa7, 0x51, 0x98, 0x96, 0xfc, 0x26, 0x60, 0x99, 0xbf, 0xd4, + 0xa0, 0xfe, 0x61, 0x06, 0xea, 0x89, 0xcf, 0x82, 0xc2, 0x0a, 0xf8, 0x8b, 0xde, 0x7c, 0x3a, 0xac, + 0x9b, 0x47, 0xc9, 0xf9, 0xe7, 0xba, 0x7c, 0xfe, 0x79, 0x47, 0x64, 0x96, 0x95, 0x45, 0x7e, 0x5c, + 0x96, 0x78, 0x07, 0xe2, 0x11, 0x54, 0xf1, 0xbf, 0x66, 0x4d, 0x2c, 0xdf, 0xb7, 0xcc, 0xf4, 0xb5, + 0x94, 0x84, 0x38, 0x45, 0x44, 0x36, 0x9e, 0x38, 0x59, 0x7d, 0xce, 0x13, 0x4f, 0xf4, 0xf4, 0xd8, + 0x7f, 0xcd, 0x42, 0x45, 0xd2, 0x23, 0xbf, 0xd1, 0xf4, 0xbb, 0x09, 0xe5, 0xe4, 0xc1, 0x21, 0x71, + 0xf9, 0x3e, 0x06, 0xa4, 0xc6, 0x2a, 0xbb, 0x30, 0x56, 0x0d, 0x28, 0xfa, 0xfc, 0xb2, 0xac, 0x70, + 0x21, 0x47, 0xc9, 0xb4, 0xb3, 0x36, 0xff, 0x92, 0xf3, 0x95, 0xf7, 0xa1, 0x2a, 0x79, 0x5a, 0x83, + 0x46, 0x41, 0x7e, 0x75, 0x2a, 0xa6, 0xaf, 0x24, 0x5e, 0xd7, 0x80, 0x5d, 0x81, 0xc2, 0xe4, 0x54, + 0x37, 0x8f, 0xf8, 0x95, 0xec, 0xb2, 0x96, 0x9f, 0x9c, 0xb6, 0x8f, 0xe8, 0xf4, 0x69, 0x12, 0xab, + 0x4e, 0xdc, 0xff, 0x55, 0x9a, 0x44, 0x0a, 0xd2, 0x36, 0x14, 0x27, 0xa7, 0xf2, 0xd5, 0xea, 0xa5, + 0x2e, 0x2f, 0x4c, 0x4e, 0xe9, 0x42, 0xf5, 0xbb, 0x70, 0x59, 0xec, 0xdf, 0x46, 0xa0, 0xf3, 0x77, + 0x4e, 0xe8, 0x21, 0x2a, 0xfe, 0x42, 0xe0, 0x26, 0xc7, 0x35, 0x83, 0x21, 0x61, 0x70, 0xc6, 0xa9, + 0x50, 0x95, 0x26, 0x20, 0x7f, 0xb1, 0xab, 0xac, 0xa5, 0x60, 0xec, 0x13, 0xa8, 0x4e, 0x4e, 0xf9, + 0x80, 0x8e, 0xbc, 0x7d, 0x4b, 0xdc, 0x14, 0xb9, 0xbc, 0x38, 0x94, 0x14, 0xf7, 0x91, 0xa2, 0x64, + 0x57, 0xa1, 0xa0, 0x19, 0x67, 0xc3, 0x1f, 0xf5, 0x48, 0x89, 0x2c, 0x6b, 0x22, 0xf5, 0x59, 0xae, + 0x54, 0x57, 0x36, 0xd4, 0x7f, 0x9c, 0x81, 0x7a, 0x62, 0x03, 0xe0, 0x22, 0x64, 0xf7, 0xe5, 0xa7, + 0xf8, 0x1b, 0x8b, 0x66, 0x02, 0x92, 0x3c, 0x18, 0x5d, 0xcc, 0xf8, 0x83, 0xb5, 0xab, 0x5e, 0x59, + 0x5b, 0xe5, 0xfa, 0xce, 0xae, 0x7c, 0x04, 0xfc, 0x31, 0x64, 0x47, 0x17, 0x33, 0xee, 0x6f, 0xc2, + 0x2d, 0x91, 0xdb, 0xa6, 0x7c, 0x33, 0xa4, 0x20, 0xa3, 0xcf, 0x3b, 0x5f, 0xf2, 0xc7, 0x42, 0x0e, + 0xb4, 0xee, 0x7e, 0x53, 0xfb, 0x52, 0x47, 0x00, 0x29, 0x0d, 0xbb, 0x03, 0xad, 0xd3, 0x7d, 0xdc, + 0x27, 0x40, 0x8e, 0xbc, 0x51, 0x49, 0x15, 0x9b, 0xa6, 0xb9, 0x7b, 0x2a, 0x3f, 0x50, 0x95, 0x49, + 0x3d, 0x50, 0x15, 0xbf, 0xe5, 0x26, 0x3f, 0x6c, 0x19, 0xc6, 0xfe, 0x78, 0x16, 0xaf, 0xc2, 0x78, + 0x49, 0xb3, 0x37, 0x20, 0x37, 0x39, 0xb5, 0x2e, 0xd2, 0x86, 0x5e, 0x7a, 0x01, 0x11, 0x81, 0xfa, + 0xf3, 0x0c, 0xb0, 0x54, 0x45, 0xb8, 0xed, 0xf1, 0x5d, 0xeb, 0xf2, 0x31, 0x34, 0x44, 0x24, 0x26, + 0xa7, 0x92, 0x7c, 0xed, 0xa2, 0x4b, 0xaf, 0x78, 0x49, 0x84, 0x72, 0xf2, 0x10, 0x1c, 0x7b, 0x17, + 0xf8, 0x9b, 0x95, 0x14, 0x26, 0x94, 0x7b, 0x8e, 0x9d, 0xa8, 0x25, 0x34, 0xc9, 0x23, 0x95, 0xf2, + 0xe3, 0x9b, 0xdc, 0x4d, 0xbf, 0x91, 0x8c, 0x1a, 0xad, 0x79, 0xf5, 0xf7, 0x32, 0x70, 0x29, 0x3d, + 0x21, 0x7e, 0xb1, 0x56, 0xa6, 0x5f, 0x1a, 0xcd, 0x2e, 0xbe, 0x34, 0xba, 0x6a, 0x3e, 0xe5, 0x56, + 0xce, 0xa7, 0xdf, 0xce, 0xc0, 0x65, 0xa9, 0xf7, 0x13, 0x6b, 0xf1, 0x2f, 0xa9, 0x66, 0xd2, 0x83, + 0xa3, 0xb9, 0xd4, 0x83, 0xa3, 0xea, 0x1f, 0x67, 0xe0, 0xea, 0x42, 0x4d, 0x34, 0xeb, 0x2f, 0xb5, + 0x2e, 0xe9, 0x87, 0x49, 0xe9, 0xa8, 0x20, 0x7a, 0x50, 0x23, 0xb3, 0x9d, 0x95, 0x1e, 0x26, 0xa5, + 0xf3, 0x23, 0x3a, 0xc4, 0x7c, 0x55, 0xbc, 0xbb, 0xa4, 0x07, 0x17, 0xee, 0x58, 0x0c, 0x76, 0x99, + 0x20, 0xc3, 0x0b, 0x77, 0xac, 0xfe, 0x51, 0x06, 0xae, 0x2f, 0xb4, 0xa1, 0x39, 0x0f, 0x3d, 0x71, + 0x16, 0xfc, 0x97, 0xd4, 0x8c, 0xdb, 0x50, 0xa1, 0x93, 0x72, 0x71, 0xc0, 0xcc, 0xbb, 0x15, 0x8c, + 0xa4, 0x5c, 0x05, 0xb2, 0xa6, 0x71, 0x21, 0x1e, 0x2d, 0xc0, 0x9f, 0xb8, 0x60, 0x4f, 0xbc, 0xb9, + 0x2f, 0xa2, 0x83, 0xe8, 0xb7, 0xfa, 0x01, 0x6c, 0x26, 0x55, 0x6f, 0x89, 0xf7, 0x61, 0x6f, 0x43, + 0xc5, 0xb5, 0xce, 0xf4, 0xe8, 0xf5, 0x58, 0x11, 0xf3, 0xe6, 0x5a, 0x67, 0x82, 0x40, 0xdd, 0x95, + 0x65, 0x61, 0xfc, 0xd5, 0x0b, 0xc7, 0x4c, 0xc5, 0xed, 0x78, 0x8e, 0x19, 0xa1, 0x30, 0x37, 0xa9, + 0x95, 0x45, 0xd7, 0x3a, 0xa3, 0x79, 0x78, 0x26, 0xf2, 0x69, 0x9a, 0xa6, 0x88, 0x5d, 0x58, 0xf5, + 0x4c, 0xdb, 0x75, 0x28, 0xcd, 0xfc, 0x54, 0x37, 0x15, 0x67, 0x3e, 0x2f, 0xf6, 0xae, 0x88, 0xa8, + 0x7b, 0x5e, 0x9c, 0x03, 0x8f, 0xb1, 0x13, 0x5f, 0xc5, 0xc9, 0x25, 0x5f, 0xc5, 0xf9, 0x50, 0x88, + 0x41, 0xb2, 0xfb, 0x78, 0xc9, 0x0a, 0x64, 0x6d, 0xf3, 0x9c, 0x0a, 0xae, 0x69, 0xf8, 0x93, 0x34, + 0x39, 0xeb, 0x6b, 0x11, 0xd4, 0x87, 0x3f, 0xd5, 0x1d, 0xa8, 0x68, 0x29, 0x23, 0xb7, 0x2a, 0xf9, + 0x8b, 0x82, 0xf4, 0x4b, 0x56, 0x49, 0x07, 0x69, 0x95, 0xc4, 0x5d, 0x14, 0xa8, 0x81, 0x10, 0x7c, + 0x4f, 0x0c, 0x7f, 0x7c, 0x62, 0xf8, 0x3d, 0xcb, 0x3d, 0x0e, 0x4f, 0xb0, 0xcb, 0xb9, 0x1b, 0x57, + 0xee, 0x42, 0xe0, 0xa0, 0x68, 0x3a, 0x60, 0x2f, 0x3a, 0x44, 0x1e, 0x7d, 0x6f, 0xc3, 0xb5, 0xce, + 0x04, 0xff, 0xab, 0x00, 0xd8, 0xff, 0x02, 0xcd, 0x8f, 0x20, 0xcb, 0x9e, 0x63, 0x72, 0xb4, 0xba, + 0x29, 0xda, 0x2b, 0x1e, 0xdd, 0x68, 0x5b, 0x13, 0xd5, 0x11, 0x23, 0xcf, 0x1b, 0x24, 0x3a, 0xe1, + 0x3b, 0x0d, 0x23, 0x7b, 0x0d, 0xaa, 0x91, 0x47, 0x82, 0x1e, 0x4f, 0xe3, 0xc5, 0x57, 0x22, 0x58, + 0x7f, 0x3e, 0x55, 0x7f, 0x3f, 0x0b, 0xd5, 0x26, 0x8f, 0xec, 0x99, 0x5d, 0x0c, 0x66, 0x21, 0xfb, + 0x0d, 0xb8, 0x42, 0xaf, 0xa9, 0xf0, 0x77, 0x8f, 0x29, 0xa0, 0x86, 0xc2, 0xf3, 0x45, 0x27, 0xde, + 0x97, 0x3a, 0x51, 0xb0, 0x3c, 0x18, 0x9e, 0xda, 0x33, 0x7e, 0x2b, 0xa4, 0x6b, 0x9e, 0xd3, 0x15, + 0x0c, 0x1e, 0x1b, 0x40, 0x0f, 0xaf, 0xa4, 0x11, 0xf4, 0xf6, 0x02, 0x66, 0x3f, 0x3b, 0x15, 0xd9, + 0x8a, 0xb0, 0x09, 0x04, 0x1e, 0x9c, 0x72, 0x9a, 0xfb, 0xb0, 0xc9, 0x2f, 0x82, 0x2d, 0x6f, 0xc0, + 0x1b, 0x1c, 0x91, 0xcc, 0xef, 0x21, 0x6c, 0x8a, 0xc7, 0x5f, 0xe8, 0x35, 0x50, 0x7d, 0xec, 0xcd, + 0x2e, 0xc4, 0xd1, 0xe3, 0x1b, 0xcf, 0xa9, 0x6a, 0x97, 0x93, 0x22, 0x88, 0xd7, 0x73, 0x23, 0x48, + 0x43, 0x6f, 0x74, 0xe0, 0xda, 0x73, 0xda, 0xf4, 0xb2, 0xf0, 0x86, 0x92, 0x14, 0xde, 0x70, 0x63, + 0x07, 0x2e, 0xaf, 0x2a, 0xef, 0xdb, 0xe4, 0xa1, 0xfe, 0xac, 0x06, 0x90, 0xcc, 0xd8, 0x94, 0x3a, + 0x9a, 0x59, 0x50, 0x47, 0xbf, 0x55, 0x50, 0xcf, 0x07, 0x50, 0xc7, 0xae, 0xd2, 0x13, 0x8e, 0xec, + 0x4a, 0x8e, 0x2a, 0x52, 0x8d, 0x92, 0xbb, 0xae, 0xcb, 0x21, 0x11, 0xb9, 0x95, 0x21, 0x11, 0xef, + 0x43, 0x91, 0x1f, 0xb4, 0x05, 0xe2, 0x7a, 0xf5, 0xb5, 0xc5, 0xd5, 0xf7, 0x40, 0xdc, 0x30, 0x89, + 0xe8, 0x58, 0x07, 0xea, 0x28, 0xfa, 0x7d, 0x3b, 0x3c, 0x99, 0xca, 0x97, 0xad, 0x6f, 0x2d, 0x73, + 0x46, 0x64, 0xfc, 0x0d, 0x51, 0x43, 0x4e, 0x4a, 0xda, 0x6b, 0x38, 0x15, 0xde, 0x5f, 0xd2, 0x5e, + 0x8b, 0xb2, 0xf6, 0x3a, 0x9a, 0x72, 0x9f, 0x2f, 0x6a, 0xaf, 0xef, 0xc0, 0x25, 0x71, 0xeb, 0x0d, + 0x19, 0xb0, 0x3b, 0x89, 0x9e, 0x07, 0x59, 0x2a, 0xe2, 0xcd, 0x95, 0x29, 0xd9, 0x76, 0x48, 0xfe, + 0x05, 0x5c, 0x1e, 0x9f, 0x18, 0xee, 0xb1, 0xa5, 0x87, 0x47, 0x8e, 0x4e, 0x1f, 0x5b, 0xd0, 0xa7, + 0xc6, 0x4c, 0x28, 0xd5, 0x6f, 0x2c, 0x55, 0xb6, 0x45, 0xc4, 0xa3, 0x23, 0x87, 0x02, 0xd0, 0xe2, + 0xc0, 0x99, 0xcd, 0xf1, 0x22, 0x7c, 0xe1, 0xfc, 0x1a, 0x96, 0xce, 0xaf, 0x17, 0xd5, 0xec, 0xca, + 0x0a, 0x35, 0x3b, 0x51, 0x96, 0xab, 0xb2, 0xb2, 0xcc, 0xde, 0x86, 0xa2, 0xb8, 0xb4, 0x2b, 0xfc, + 0xbe, 0x6c, 0x79, 0x75, 0x68, 0x11, 0x09, 0x96, 0x14, 0x45, 0x53, 0xd0, 0xbb, 0x0e, 0x75, 0x5e, + 0x92, 0x0c, 0x63, 0x3b, 0xc2, 0xe9, 0x19, 0x07, 0xcb, 0x09, 0x1f, 0xef, 0x0d, 0x29, 0xe3, 0x18, + 0x27, 0xec, 0xf2, 0x05, 0x8e, 0x1b, 0xff, 0xa8, 0x00, 0x05, 0x11, 0x28, 0x7f, 0x1f, 0x72, 0xa6, + 0xef, 0xcd, 0xe2, 0x68, 0xf3, 0x15, 0x5a, 0x3b, 0x7d, 0x5f, 0x0f, 0x15, 0xfc, 0x07, 0x50, 0x30, + 0x4c, 0x53, 0x9f, 0x9c, 0xa6, 0xcf, 0xa3, 0x17, 0x14, 0xe8, 0xbd, 0x35, 0x2d, 0x6f, 0x90, 0x26, + 0xfd, 0x31, 0x94, 0x91, 0x3e, 0x09, 0x3f, 0xad, 0x2c, 0x9b, 0x05, 0x91, 0xaa, 0xbb, 0xb7, 0xa6, + 0x95, 0x8c, 0x48, 0xed, 0xfd, 0xd5, 0xb4, 0x67, 0x3f, 0xb7, 0xd4, 0xc0, 0x05, 0x3d, 0x6d, 0xc1, + 0xc7, 0xff, 0x6b, 0xc0, 0x5d, 0xbd, 0xf1, 0x8e, 0x9d, 0x97, 0x8f, 0x3e, 0x97, 0xf6, 0xf7, 0xbd, + 0x35, 0x8d, 0xef, 0x5b, 0xd1, 0x7e, 0xff, 0x61, 0xe4, 0x75, 0x8f, 0xbf, 0x43, 0xb4, 0xa2, 0x67, + 0x50, 0x0c, 0xc6, 0xae, 0x77, 0x92, 0x89, 0xc8, 0x66, 0x9a, 0x51, 0x14, 0x62, 0x71, 0x89, 0x2d, + 0xde, 0xd5, 0x89, 0x2d, 0xde, 0xe2, 0x3f, 0x81, 0x0a, 0x77, 0xc2, 0x72, 0xbe, 0xd2, 0x52, 0xd7, + 0x26, 0x9b, 0x32, 0x1d, 0xeb, 0x25, 0x5b, 0x74, 0x2b, 0x6a, 0xa7, 0x6f, 0xc9, 0x27, 0x27, 0x37, + 0x57, 0x76, 0x94, 0x16, 0x1f, 0xa2, 0xf0, 0xc6, 0x6a, 0x9c, 0x87, 0xf5, 0xe0, 0xb2, 0x38, 0x62, + 0xe0, 0x1b, 0x70, 0xb4, 0x67, 0xc2, 0xd2, 0x78, 0xa5, 0x76, 0xe8, 0xbd, 0x35, 0x8d, 0x19, 0xcb, + 0xfb, 0x76, 0x0b, 0x36, 0xa3, 0x2a, 0xd1, 0xce, 0x2a, 0x85, 0x4d, 0xc9, 0x4d, 0x4a, 0xf6, 0xdd, + 0xbd, 0x35, 0x6d, 0xc3, 0x48, 0x83, 0x58, 0x17, 0x2e, 0x45, 0x99, 0x90, 0xab, 0x5d, 0xf4, 0x4c, + 0x75, 0x69, 0x14, 0xe5, 0xbd, 0x7a, 0x6f, 0x4d, 0xdb, 0x34, 0x96, 0x36, 0xf0, 0xfd, 0xa8, 0x3e, + 0xb2, 0x72, 0xc8, 0x57, 0xe2, 0xed, 0x95, 0xdd, 0x94, 0x68, 0xaa, 0x71, 0xcd, 0x12, 0x50, 0x12, + 0xc7, 0x70, 0x43, 0x83, 0xab, 0xab, 0x25, 0x8c, 0xbc, 0xcd, 0xe4, 0xf8, 0x36, 0xa3, 0xca, 0xdb, + 0xcc, 0xe2, 0x3b, 0x2d, 0xd2, 0xa6, 0xf3, 0x43, 0xa8, 0xa5, 0x44, 0x2c, 0xab, 0x40, 0x31, 0x7a, + 0xa5, 0x9e, 0x2e, 0xc7, 0xb4, 0x06, 0x07, 0x5f, 0x2a, 0x19, 0x04, 0x77, 0xfb, 0xc3, 0x51, 0xb3, + 0x3f, 0x52, 0xd6, 0x79, 0xe2, 0xa0, 0xd7, 0x6c, 0x75, 0x94, 0xac, 0xfa, 0xc7, 0x59, 0x28, 0xc7, + 0xa7, 0x6c, 0xdf, 0xdd, 0x1b, 0x16, 0xbb, 0x99, 0xb2, 0xb2, 0x9b, 0x69, 0xc1, 0xd4, 0xe3, 0x1f, + 0x94, 0xe0, 0xdf, 0xf8, 0xda, 0x48, 0x1b, 0x54, 0xc1, 0xf2, 0xf5, 0xfd, 0xfc, 0x37, 0xbc, 0xbe, + 0x2f, 0x47, 0xa0, 0x17, 0xd2, 0x11, 0xe8, 0x0b, 0x5f, 0x2a, 0x28, 0xd2, 0x1b, 0xe2, 0xf2, 0x97, + 0x0a, 0xe8, 0xcb, 0xa7, 0x4f, 0x6c, 0xeb, 0x4c, 0x84, 0x6c, 0x8b, 0x54, 0x7a, 0x87, 0x86, 0x97, + 0xec, 0xd0, 0xdf, 0x44, 0xda, 0x3f, 0x84, 0xcb, 0x93, 0xd3, 0xf8, 0xe5, 0xf2, 0xc4, 0xb9, 0x52, + 0xa5, 0x2a, 0xad, 0xc4, 0xb1, 0x37, 0xe2, 0x4f, 0xb5, 0xd5, 0x64, 0x37, 0x50, 0x3c, 0x5a, 0xf1, + 0xb7, 0xdb, 0xfe, 0xff, 0x0c, 0x40, 0x72, 0xfe, 0xf4, 0x0b, 0xbb, 0x72, 0x25, 0x6f, 0x59, 0xf6, + 0x05, 0xde, 0xb2, 0x97, 0xbd, 0x50, 0xf7, 0x35, 0x94, 0xe3, 0x13, 0xc7, 0xef, 0x3e, 0xb1, 0xbe, + 0x55, 0x91, 0xbf, 0x19, 0xb9, 0xb5, 0xe3, 0x23, 0xbb, 0x5f, 0xb4, 0x2f, 0x52, 0xc5, 0x67, 0x5f, + 0x52, 0xfc, 0x39, 0xf7, 0x2d, 0xc7, 0x85, 0xff, 0x92, 0x57, 0x93, 0x3c, 0xd1, 0x73, 0xa9, 0x89, + 0xae, 0xce, 0x85, 0x83, 0xfc, 0x17, 0x2f, 0xfa, 0x5b, 0x35, 0xf8, 0xbf, 0x64, 0x22, 0x2f, 0x6e, + 0xfc, 0xd8, 0xfc, 0x73, 0x95, 0xde, 0xd5, 0x8e, 0xe8, 0x6f, 0x53, 0xdc, 0x0b, 0x7d, 0x54, 0xb9, + 0x17, 0xf9, 0xa8, 0xde, 0x80, 0x3c, 0xdf, 0xee, 0xf2, 0xcf, 0xf3, 0x4f, 0x71, 0xfc, 0x4b, 0x3f, + 0x09, 0xa3, 0xaa, 0x42, 0xc9, 0xe7, 0xed, 0xbd, 0x1c, 0xe5, 0x1b, 0x7d, 0xce, 0x86, 0x6e, 0xc8, + 0xfc, 0x5f, 0x5c, 0xa2, 0x7e, 0xd7, 0x2e, 0x79, 0xb1, 0xdb, 0x42, 0xfd, 0x5f, 0x19, 0xa8, 0xa5, + 0x22, 0x08, 0xbe, 0x43, 0x11, 0x2b, 0xe5, 0x72, 0xf6, 0xff, 0x20, 0xb9, 0x9c, 0x0a, 0xe1, 0x2d, + 0xa5, 0x43, 0x78, 0x51, 0xdc, 0x55, 0x53, 0x26, 0xcc, 0x2a, 0x63, 0x27, 0xb3, 0xd2, 0xd8, 0xb9, + 0x15, 0x7f, 0x73, 0xb3, 0xdb, 0xe6, 0x11, 0xb3, 0x35, 0x4d, 0x82, 0xb0, 0x4f, 0xe1, 0xba, 0x70, + 0x22, 0xf0, 0xfe, 0xf1, 0x26, 0x7a, 0xfc, 0x45, 0x4e, 0x61, 0x94, 0x5f, 0xe5, 0x04, 0xfc, 0x83, + 0x3e, 0x93, 0x66, 0x84, 0x55, 0xbb, 0x50, 0x4b, 0x85, 0x66, 0x48, 0x5f, 0x00, 0xce, 0xc8, 0x5f, + 0x00, 0x66, 0x5b, 0x90, 0x3f, 0x3b, 0xb1, 0x7c, 0x6b, 0xc5, 0x03, 0xd1, 0x1c, 0xa1, 0x7e, 0x1f, + 0xaa, 0x72, 0x98, 0x18, 0x7b, 0x1b, 0xf2, 0x76, 0x68, 0x4d, 0x23, 0xf7, 0xc8, 0xd5, 0xe5, 0x48, + 0xb2, 0x6e, 0x68, 0x4d, 0x35, 0x4e, 0xa4, 0xfe, 0x41, 0x06, 0x94, 0x45, 0x9c, 0xf4, 0x99, 0xe2, + 0xcc, 0x73, 0x3e, 0x53, 0xbc, 0x9e, 0xaa, 0xe4, 0xaa, 0x2f, 0x0d, 0x6f, 0x45, 0x4a, 0xc9, 0x8a, + 0xaf, 0xdc, 0x12, 0x82, 0xdd, 0x83, 0x92, 0x6f, 0xd1, 0x37, 0x60, 0xcd, 0x15, 0x37, 0x47, 0x62, + 0x9c, 0xfa, 0xbb, 0x19, 0x28, 0x8a, 0x98, 0xb6, 0x95, 0xfe, 0xaa, 0x37, 0xa1, 0xc8, 0xbf, 0x07, + 0x1b, 0x3d, 0x54, 0xb7, 0x14, 0x66, 0x1e, 0xe1, 0xd9, 0x2d, 0x1e, 0xe9, 0x97, 0xf6, 0x5f, 0x1d, + 0x38, 0x86, 0xab, 0x11, 0x5c, 0x7c, 0xa7, 0xcb, 0x98, 0x8a, 0x97, 0x0d, 0xf8, 0x0b, 0x63, 0x40, + 0x20, 0x7a, 0xc4, 0x40, 0xfd, 0x55, 0x28, 0x8a, 0x98, 0xb9, 0x95, 0x55, 0x79, 0xd9, 0xb7, 0x40, + 0xb7, 0x00, 0x92, 0x20, 0xba, 0x55, 0x39, 0xa8, 0xf7, 0xa1, 0x14, 0xc5, 0xcd, 0xe1, 0xfc, 0x4b, + 0x8a, 0x16, 0x57, 0x92, 0xe4, 0xca, 0x38, 0xe2, 0xa3, 0x0b, 0x3d, 0x6f, 0x7c, 0x4a, 0xce, 0xf2, + 0x77, 0x81, 0xee, 0x67, 0x8d, 0x96, 0x9e, 0x62, 0x4b, 0x7f, 0x9d, 0x23, 0x26, 0x62, 0xf7, 0x21, + 0x96, 0x97, 0x2f, 0x73, 0x2d, 0xa8, 0xcd, 0xe8, 0x26, 0x1f, 0xcd, 0xb2, 0x47, 0xc2, 0x9b, 0xda, + 0xa3, 0xa7, 0x40, 0x33, 0xf2, 0xe3, 0xc8, 0xa9, 0x3a, 0x69, 0x12, 0x99, 0x5a, 0x87, 0xaa, 0x1c, + 0xec, 0xa3, 0x36, 0x61, 0x73, 0xdf, 0x0a, 0x0d, 0x94, 0x3f, 0xd1, 0x03, 0x55, 0x7c, 0xfe, 0xe2, + 0x8f, 0xf4, 0xfc, 0x5d, 0xa4, 0xd3, 0x38, 0x91, 0xfa, 0xc7, 0x39, 0x50, 0x16, 0x71, 0x2f, 0xba, + 0xd5, 0x78, 0x1b, 0x2a, 0x1e, 0xcd, 0x8b, 0xd4, 0x97, 0xd8, 0x38, 0x48, 0xba, 0x0f, 0x90, 0xfa, + 0x1c, 0x4f, 0xc9, 0x0e, 0xf6, 0xf8, 0x07, 0x79, 0xae, 0xf1, 0x2b, 0x6c, 0x8e, 0x37, 0xa6, 0x69, + 0x5d, 0xa5, 0x1b, 0x6b, 0x3d, 0x6f, 0x4c, 0x97, 0x25, 0x85, 0x77, 0x82, 0x47, 0xa0, 0x56, 0xb5, + 0x92, 0x70, 0x49, 0xd0, 0xf9, 0x9d, 0xb8, 0x25, 0x10, 0x06, 0xe2, 0x0e, 0x70, 0x89, 0x03, 0x46, + 0x41, 0xf4, 0xb4, 0xff, 0x58, 0x7c, 0x36, 0x2c, 0x4b, 0x4f, 0xfb, 0xb7, 0x5c, 0xba, 0x2b, 0x49, + 0x0f, 0x1e, 0x8f, 0xc5, 0x07, 0x13, 0xc5, 0xc7, 0x15, 0x10, 0x75, 0x87, 0x7f, 0x58, 0xcd, 0xb7, + 0x82, 0x80, 0xbf, 0x08, 0x59, 0x16, 0x4f, 0x81, 0x0a, 0x60, 0xfc, 0xe0, 0xae, 0xf8, 0xe6, 0x1d, + 0x92, 0x80, 0x78, 0x97, 0x92, 0x7f, 0xf1, 0x0e, 0x09, 0xae, 0x43, 0xe9, 0x27, 0x9e, 0x6b, 0x91, + 0x97, 0xa3, 0x42, 0xb5, 0x2a, 0x62, 0x7a, 0xdf, 0x98, 0xe1, 0x46, 0xe0, 0xd0, 0x75, 0x73, 0x7e, + 0x4b, 0x90, 0x27, 0xd4, 0x7f, 0x9d, 0x81, 0xcb, 0x8b, 0x7d, 0x4d, 0xd3, 0xa8, 0x0a, 0xa5, 0xd6, + 0xa0, 0xa7, 0xf7, 0x9b, 0xfb, 0x1d, 0x65, 0x8d, 0x6d, 0x40, 0x65, 0xb0, 0xf3, 0x59, 0xa7, 0x35, + 0xe2, 0x80, 0x0c, 0xbd, 0xe1, 0x30, 0xd4, 0xf7, 0xba, 0xed, 0x76, 0xa7, 0xcf, 0x2d, 0x8a, 0xc1, + 0xce, 0x67, 0x7a, 0x6f, 0xd0, 0xe2, 0xdf, 0xc6, 0x8a, 0x22, 0x1e, 0x86, 0x4a, 0x8e, 0xe2, 0x21, + 0x28, 0x18, 0x1e, 0x93, 0x79, 0x1e, 0xe5, 0xfd, 0x74, 0xa8, 0xb7, 0xfa, 0x23, 0xa5, 0x80, 0xa9, + 0xfe, 0x61, 0xaf, 0x47, 0x29, 0x0a, 0xe7, 0x6c, 0x0d, 0xf6, 0x0f, 0xb4, 0xce, 0x70, 0xa8, 0x0f, + 0xbb, 0x3f, 0xee, 0x28, 0x25, 0x2a, 0x59, 0xeb, 0x3e, 0xee, 0xf6, 0x39, 0xa0, 0xcc, 0x8a, 0x90, + 0xdd, 0xef, 0xf6, 0xf9, 0xdb, 0x15, 0xfb, 0xcd, 0x2f, 0x94, 0x0a, 0xfe, 0x18, 0x1e, 0xee, 0x2b, + 0x55, 0x56, 0x86, 0x7c, 0xaf, 0xf3, 0xa4, 0xd3, 0x53, 0x6a, 0xea, 0xbf, 0xcf, 0x46, 0x1a, 0x31, + 0xc5, 0x39, 0x7d, 0x13, 0x2d, 0x70, 0xd5, 0xf9, 0x62, 0xdc, 0x69, 0x59, 0xa9, 0xd3, 0xbe, 0xc9, + 0x07, 0x98, 0xef, 0x40, 0x2d, 0x0e, 0x0e, 0x90, 0x9e, 0xe3, 0xaf, 0x46, 0xc0, 0x15, 0xc7, 0x17, + 0x85, 0x15, 0xc7, 0x17, 0x33, 0x3b, 0x44, 0x2b, 0x1b, 0x65, 0x2e, 0x9f, 0x49, 0x65, 0x84, 0xf0, + 0x4f, 0x9f, 0xbf, 0x02, 0x94, 0xd0, 0xe7, 0xae, 0x1d, 0x7d, 0x7e, 0xb3, 0x84, 0x80, 0x43, 0xd7, + 0x0e, 0x17, 0x83, 0x13, 0xca, 0x4b, 0xc1, 0x09, 0xf2, 0xe6, 0x0c, 0xe9, 0xcd, 0x39, 0xfd, 0x5d, + 0x6a, 0xfe, 0xdd, 0x4d, 0xe9, 0xbb, 0xd4, 0x6f, 0x03, 0x1b, 0xcf, 0x7d, 0x7a, 0x1c, 0x4f, 0x22, + 0xab, 0x12, 0x99, 0x22, 0x30, 0xf1, 0xae, 0xc8, 0xde, 0x80, 0x8d, 0x05, 0x6a, 0xb2, 0xa5, 0xcb, + 0x5a, 0x3d, 0x4d, 0xca, 0x1e, 0xc0, 0x25, 0x31, 0xb7, 0x53, 0x7d, 0x2b, 0xae, 0x9e, 0x72, 0x54, + 0x33, 0xe9, 0x61, 0xf5, 0x57, 0xa0, 0x14, 0x85, 0xb4, 0xbd, 0x58, 0xd9, 0x5d, 0x31, 0xae, 0xea, + 0x3f, 0x58, 0x87, 0x72, 0x1c, 0xe0, 0xf6, 0x8d, 0x66, 0x07, 0x7d, 0x77, 0x24, 0x38, 0x95, 0x45, + 0x4c, 0x09, 0x01, 0xd1, 0x48, 0x89, 0xdb, 0x5a, 0x73, 0xdf, 0x8e, 0x34, 0x36, 0x0e, 0x39, 0xf4, + 0x6d, 0x7a, 0x01, 0xc7, 0x76, 0xa5, 0x4b, 0xa2, 0x65, 0xad, 0x84, 0x00, 0x5a, 0x68, 0xd7, 0x81, + 0x7e, 0x13, 0x67, 0xf4, 0xa9, 0x6e, 0xdb, 0x3d, 0x45, 0xbe, 0xe7, 0x7c, 0xaa, 0x9b, 0xbe, 0x9a, + 0xc2, 0xa3, 0x6b, 0x78, 0x4c, 0x41, 0xf4, 0x3d, 0xc1, 0x57, 0xa0, 0x3c, 0x8f, 0x3f, 0x48, 0x29, + 0x66, 0xc4, 0x3c, 0xfa, 0x1c, 0x65, 0x7a, 0x54, 0xcb, 0x8b, 0xa3, 0xba, 0x38, 0xa7, 0x61, 0x69, + 0x4e, 0xab, 0x21, 0x14, 0x45, 0x90, 0xdf, 0x8b, 0x3b, 0xfc, 0x85, 0x5d, 0xa5, 0x40, 0xd6, 0x70, + 0xa2, 0x9b, 0xa9, 0xf8, 0x73, 0xa1, 0x62, 0xb9, 0x85, 0x8a, 0xa9, 0x7f, 0x6b, 0x1d, 0x20, 0x09, + 0x16, 0x64, 0xef, 0x2c, 0x04, 0x26, 0x67, 0x96, 0xb6, 0xfd, 0x85, 0x78, 0xe4, 0x85, 0x27, 0xa1, + 0xd6, 0xbf, 0xc1, 0x93, 0x50, 0x0f, 0xa1, 0x16, 0xf8, 0xe3, 0x97, 0x3a, 0xdc, 0x2b, 0x81, 0x3f, + 0x8e, 0xfd, 0xed, 0xef, 0x02, 0x26, 0xe9, 0xb9, 0xc8, 0xc4, 0x50, 0x5d, 0xd2, 0x5a, 0xca, 0x81, + 0x3f, 0x1e, 0x1c, 0x7d, 0xd5, 0xe6, 0x57, 0xe4, 0xcc, 0x20, 0xd4, 0x57, 0x49, 0x89, 0x0d, 0x33, + 0x08, 0xdb, 0xb2, 0xa0, 0xb8, 0x0b, 0x75, 0xa4, 0x5d, 0x12, 0x16, 0x55, 0x33, 0x48, 0x0e, 0x58, + 0xd4, 0xdf, 0x89, 0x8e, 0xa4, 0x17, 0x7c, 0xb9, 0xec, 0x23, 0x61, 0x88, 0x4b, 0x4a, 0x44, 0x63, + 0x95, 0xeb, 0x97, 0x3f, 0x60, 0x15, 0x93, 0x2e, 0x7f, 0x86, 0x70, 0xfd, 0x9b, 0x7e, 0x86, 0x70, + 0x0b, 0x20, 0x79, 0xb0, 0x13, 0x57, 0x60, 0x7c, 0x59, 0xa7, 0xcc, 0xaf, 0xe1, 0xdc, 0x7f, 0x0d, + 0xaa, 0xf2, 0x77, 0x8b, 0xe9, 0x12, 0x8e, 0xe7, 0x5a, 0xfc, 0x13, 0x2e, 0xbd, 0x9f, 0x7c, 0xa0, + 0x64, 0xee, 0xab, 0x50, 0x91, 0x3e, 0xa0, 0x84, 0x14, 0x7b, 0x46, 0x70, 0x22, 0x3e, 0xe7, 0x61, + 0xb8, 0xc7, 0x96, 0x92, 0xb9, 0x7f, 0x0f, 0x95, 0x6e, 0xf9, 0xf3, 0x45, 0x00, 0x85, 0xbe, 0xe7, + 0x4f, 0x0d, 0x47, 0xd0, 0x59, 0xf3, 0x00, 0xe9, 0xde, 0x85, 0x2b, 0x2b, 0x3f, 0xc6, 0x44, 0x57, + 0xb8, 0xec, 0xe9, 0xcc, 0xb1, 0xf8, 0x65, 0xa4, 0xbd, 0x8b, 0x23, 0xdf, 0x36, 0x95, 0xcc, 0xfd, + 0x4f, 0x16, 0x3e, 0xd6, 0x71, 0xd8, 0xdf, 0x19, 0x1c, 0xf6, 0xdb, 0x9d, 0x36, 0xbf, 0x26, 0xd4, + 0xed, 0xb7, 0x7a, 0x87, 0xc3, 0xee, 0x13, 0xb1, 0x17, 0x76, 0xbe, 0x88, 0x92, 0xeb, 0xf7, 0xf7, + 0xa2, 0xd7, 0x18, 0xa2, 0x5a, 0xf7, 0x06, 0xcd, 0x36, 0xdf, 0x43, 0xe3, 0xf7, 0x98, 0x46, 0x3b, + 0xfc, 0x23, 0x1f, 0x5a, 0x67, 0x78, 0xd8, 0x1b, 0x45, 0x6f, 0x3f, 0xd5, 0x01, 0xba, 0xad, 0xce, + 0x4e, 0x47, 0x7b, 0x8c, 0x04, 0xd9, 0xfb, 0x3f, 0x84, 0xc6, 0xf3, 0xee, 0xf7, 0x60, 0xdb, 0x5a, + 0x7b, 0x4d, 0xba, 0x43, 0x85, 0x7b, 0xe8, 0x40, 0xe7, 0x29, 0xf2, 0xf4, 0x69, 0x9d, 0x5e, 0x87, + 0x82, 0x60, 0xef, 0xff, 0x34, 0x23, 0xe9, 0x93, 0xd1, 0x1d, 0x8d, 0x18, 0x20, 0x3a, 0x5c, 0x06, + 0x69, 0x96, 0x61, 0x2a, 0x19, 0x76, 0x15, 0x58, 0x0a, 0xd4, 0xf3, 0xc6, 0x86, 0xa3, 0xac, 0x53, + 0xb8, 0x6b, 0x04, 0xa7, 0xbb, 0x7c, 0x4a, 0x96, 0xbd, 0x0a, 0xd7, 0x63, 0x58, 0xcf, 0x3b, 0x3b, + 0xf0, 0x6d, 0xcf, 0xb7, 0xc3, 0x0b, 0x8e, 0xce, 0xdd, 0xff, 0xbf, 0xc5, 0x61, 0x6d, 0x6a, 0x96, + 0x61, 0x01, 0x4d, 0xd3, 0x4c, 0x60, 0x24, 0xd8, 0x94, 0x35, 0x76, 0x0d, 0x2e, 0x91, 0x54, 0x5f, + 0x40, 0x64, 0xd8, 0x2b, 0x70, 0x2d, 0x32, 0x7a, 0x17, 0x91, 0xeb, 0x88, 0xd4, 0x2c, 0x0a, 0x95, + 0x5c, 0x42, 0x66, 0x77, 0x7e, 0xf0, 0x27, 0x3f, 0xbf, 0x95, 0xf9, 0x17, 0x3f, 0xbf, 0x95, 0xf9, + 0x0f, 0x3f, 0xbf, 0xb5, 0xf6, 0x07, 0xff, 0xe9, 0x56, 0xe6, 0xc7, 0xef, 0x1c, 0xdb, 0xe1, 0xc9, + 0xfc, 0xe8, 0xc1, 0xd8, 0x9b, 0xbe, 0x3b, 0x35, 0x42, 0xdf, 0x3e, 0xe7, 0xdb, 0x4b, 0x94, 0x70, + 0xad, 0x77, 0x67, 0xa7, 0xc7, 0xef, 0xce, 0x8e, 0xde, 0xc5, 0x89, 0x7e, 0x54, 0x98, 0xf9, 0x5e, + 0xe8, 0x3d, 0xfa, 0xdf, 0x01, 0x00, 0x00, 0xff, 0xff, 0x92, 0xd0, 0xeb, 0x72, 0x8b, 0x8a, 0x00, + 0x00, } func (m *Type) Marshal() (dAtA []byte, err error) { @@ -17584,6 +17595,13 @@ func (m *TableDef) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } + if m.AutoIncrEpoch != 0 { + i = encodeVarintPlan(dAtA, i, uint64(m.AutoIncrEpoch)) + i-- + dAtA[i] = 0x2 + i-- + dAtA[i] = 0xb0 + } if len(m.OriginalName) > 0 { i -= len(m.OriginalName) copy(dAtA[i:], m.OriginalName) @@ -28106,6 +28124,9 @@ func (m *TableDef) ProtoSize() (n int) { if l > 0 { n += 2 + l + sovPlan(uint64(l)) } + if m.AutoIncrEpoch != 0 { + n += 2 + sovPlan(uint64(m.AutoIncrEpoch)) + } if m.XXX_unrecognized != nil { n += len(m.XXX_unrecognized) } @@ -39828,6 +39849,25 @@ func (m *TableDef) Unmarshal(dAtA []byte) error { } m.OriginalName = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex + case 38: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field AutoIncrEpoch", wireType) + } + m.AutoIncrEpoch = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowPlan + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.AutoIncrEpoch |= uint32(b&0x7F) << shift + if b < 0x80 { + break + } + } default: iNdEx = preIndex skippy, err := skipPlan(dAtA[iNdEx:]) diff --git a/pkg/sql/plan/deepcopy.go b/pkg/sql/plan/deepcopy.go index af8e7b15bd6e1..525403b8f971a 100644 --- a/pkg/sql/plan/deepcopy.go +++ b/pkg/sql/plan/deepcopy.go @@ -507,6 +507,7 @@ func DeepCopyTableDef(table *plan.TableDef, withCols bool) *plan.TableDef { TableLockType: table.TableLockType, IsTemporary: table.IsTemporary, AutoIncrOffset: table.AutoIncrOffset, + AutoIncrEpoch: table.AutoIncrEpoch, DbName: table.DbName, DbId: table.DbId, FeatureFlag: table.FeatureFlag, diff --git a/pkg/vm/engine/cmd_util/operations.go b/pkg/vm/engine/cmd_util/operations.go index 4df39b339dc9b..b4fa9a5d3c102 100644 --- a/pkg/vm/engine/cmd_util/operations.go +++ b/pkg/vm/engine/cmd_util/operations.go @@ -162,13 +162,13 @@ type WriteReq struct { TableID uint64 DatabaseName string TableName string - // TableDefVersion is the schema version used by CN to plan the write. - // TableDefVersionKnown distinguishes a valid initial zero version from an + // AutoIncrEpoch is the allocator epoch used by CN to plan the write. + // AutoIncrEpochKnown distinguishes a valid initial zero epoch from an // old CN that did not send the dependency. - TableDefVersion uint32 - TableDefVersionKnown bool - Schema *catalog2.Schema - Batch *batch.Batch + AutoIncrEpoch uint32 + AutoIncrEpochKnown bool + Schema *catalog2.Schema + Batch *batch.Batch //[IncrementalDedup|FullSkipWorkspaceDedup|FullDedup], default is IncrementalDedup. //If incremental-dedup in dn.toml is false, IncrementalDedup will be treated as FullSkipWorkspaceDedup. //IncrementalDedup do not check uniqueness of PK before txn's snapshot TS. diff --git a/pkg/vm/engine/disttae/cache/catalog.go b/pkg/vm/engine/disttae/cache/catalog.go index d19a5d673d760..4432dfe45588c 100644 --- a/pkg/vm/engine/disttae/cache/catalog.go +++ b/pkg/vm/engine/disttae/cache/catalog.go @@ -853,24 +853,26 @@ func getTableDef(tblItem *TableItem, coldefs []engine.TableDef) (*plan.TableDef, } return &plan.TableDef{ - TblId: tblItem.Id, - Name: tblItem.Name, - DbName: tblItem.DatabaseName, - Cols: cols, - Name2ColIndex: name2index, - Defs: defs, - TableType: TableType, - Createsql: Createsql, - Pkey: primarykey, - ViewSql: viewSql, - Fkeys: foreignKeys, - RefChildTbls: refChildTbls, - ClusterBy: clusterByDef, - Indexes: indexes, - Version: tblItem.Version, - DbId: tblItem.DatabaseId, - Partition: partition, - FeatureFlag: tblItem.ExtraInfo.GetFeatureFlag(), - LogicalId: tblItem.LogicalId, + TblId: tblItem.Id, + Name: tblItem.Name, + DbName: tblItem.DatabaseName, + Cols: cols, + Name2ColIndex: name2index, + Defs: defs, + TableType: TableType, + Createsql: Createsql, + Pkey: primarykey, + ViewSql: viewSql, + Fkeys: foreignKeys, + RefChildTbls: refChildTbls, + ClusterBy: clusterByDef, + Indexes: indexes, + Version: tblItem.Version, + DbId: tblItem.DatabaseId, + Partition: partition, + FeatureFlag: tblItem.ExtraInfo.GetFeatureFlag(), + AutoIncrOffset: tblItem.ExtraInfo.GetAutoIncrOffset(), + AutoIncrEpoch: tblItem.ExtraInfo.GetAutoIncrEpoch(), + LogicalId: tblItem.LogicalId, }, tableDef } diff --git a/pkg/vm/engine/disttae/tools.go b/pkg/vm/engine/disttae/tools.go index e80e0fdf9ee82..0ecbcdc6f004d 100644 --- a/pkg/vm/engine/disttae/tools.go +++ b/pkg/vm/engine/disttae/tools.go @@ -173,16 +173,16 @@ func toPBEntry(e Entry) (*api.Entry, error) { return nil, err } return &api.Entry{ - Bat: bat, - EntryType: typ, - TableId: e.tableId, - DatabaseId: e.databaseId, - TableName: e.tableName, - DatabaseName: e.databaseName, - FileName: e.fileName, - PkCheckByTn: int32(e.pkChkByTN), - TableDefVersion: e.tableDefVersion, - TableDefVersionKnown: e.tableDefVersionKnown, + Bat: bat, + EntryType: typ, + TableId: e.tableId, + DatabaseId: e.databaseId, + TableName: e.tableName, + DatabaseName: e.databaseName, + FileName: e.fileName, + PkCheckByTn: int32(e.pkChkByTN), + AutoIncrEpoch: e.autoIncrEpoch, + AutoIncrEpochKnown: e.autoIncrEpochKnown, }, nil } diff --git a/pkg/vm/engine/disttae/transfer.go b/pkg/vm/engine/disttae/transfer.go index 9c976bd84e3f0..84d5e1cbc6e97 100644 --- a/pkg/vm/engine/disttae/transfer.go +++ b/pkg/vm/engine/disttae/transfer.go @@ -148,12 +148,12 @@ func transferTombstoneObjects( if bat.RowCount() > 0 { fileName := slist[0].ObjectName().String() - if err = txn.writeFileLockedWithVersion( + if err = txn.writeFileLockedWithAutoIncrEpoch( DELETE, tbl.accountId, tbl.db.databaseId, tbl.tableId, tbl.db.databaseName, tbl.tableName, fileName, bat, txn.tnStores[0], - tbl.version, + tbl.extraInfo.AutoIncrEpoch, ); err != nil { return err } diff --git a/pkg/vm/engine/disttae/txn.go b/pkg/vm/engine/disttae/txn.go index 6aa7d90163bde..6f885b300a06b 100644 --- a/pkg/vm/engine/disttae/txn.go +++ b/pkg/vm/engine/disttae/txn.go @@ -95,11 +95,11 @@ func (txn *Transaction) WriteBatch( tableName string, bat *batch.Batch, tnStore DNStore) (genRowidVec *vector.Vector, err error) { - return txn.writeBatchWithVersionKnown(typ, note, accountId, databaseId, tableId, + return txn.writeBatchWithAutoIncrEpochKnown(typ, note, accountId, databaseId, tableId, databaseName, tableName, bat, tnStore, 0, false) } -func (txn *Transaction) writeBatchWithVersion( +func (txn *Transaction) writeBatchWithAutoIncrEpoch( typ int, note string, accountId uint32, databaseId uint64, @@ -108,13 +108,13 @@ func (txn *Transaction) writeBatchWithVersion( tableName string, bat *batch.Batch, tnStore DNStore, - tableDefVersion uint32, + autoIncrEpoch uint32, ) (genRowidVec *vector.Vector, err error) { - return txn.writeBatchWithVersionKnown(typ, note, accountId, databaseId, tableId, - databaseName, tableName, bat, tnStore, tableDefVersion, true) + return txn.writeBatchWithAutoIncrEpochKnown(typ, note, accountId, databaseId, tableId, + databaseName, tableName, bat, tnStore, autoIncrEpoch, true) } -func (txn *Transaction) writeBatchWithVersionKnown( +func (txn *Transaction) writeBatchWithAutoIncrEpochKnown( typ int, note string, accountId uint32, databaseId uint64, @@ -123,8 +123,8 @@ func (txn *Transaction) writeBatchWithVersionKnown( tableName string, bat *batch.Batch, tnStore DNStore, - tableDefVersion uint32, - tableDefVersionKnown bool, + autoIncrEpoch uint32, + autoIncrEpochKnown bool, ) (genRowidVec *vector.Vector, err error) { start := time.Now() seq := txn.op.NextSequence() @@ -267,19 +267,19 @@ func (txn *Transaction) writeBatchWithVersionKnown( } e := Entry{ - typ: typ, - accountId: accountId, - bat: bat, - tableId: tableId, - databaseId: databaseId, - tableName: tableName, - databaseName: databaseName, - tnStore: tnStore, - tableDefVersion: tableDefVersion, - tableDefVersionKnown: tableDefVersionKnown, - note: note, - pkCheckPos: pkCheckPos, - pkCheckReady: pkCheckReady, + typ: typ, + accountId: accountId, + bat: bat, + tableId: tableId, + databaseId: databaseId, + tableName: tableName, + databaseName: databaseName, + tnStore: tnStore, + autoIncrEpoch: autoIncrEpoch, + autoIncrEpochKnown: autoIncrEpochKnown, + note: note, + pkCheckPos: pkCheckPos, + pkCheckReady: pkCheckReady, } txn.writes = append(txn.writes, e) txn.pkCount += bat.RowCount() @@ -885,14 +885,14 @@ func (txn *Transaction) dumpInsertBatchLocked( dbName: txn.writes[i].databaseName, name: txn.writes[i].tableName, }, - tableDefVersion: txn.writes[i].tableDefVersion, - tableDefVersionKnown: txn.writes[i].tableDefVersionKnown, + autoIncrEpoch: txn.writes[i].autoIncrEpoch, + autoIncrEpochKnown: txn.writes[i].autoIncrEpochKnown, } // Tables not resolved in the pre-resolution pass were appended // to the workspace while the lock was released; keep them in // memory for the next dump instead of calling getTable with // the lock held. - if _, ok := tables[tbKey]; ok { + if _, ok := tables[tbKey.tableKey]; ok { bat := txn.writes[i].bat *size += uint64(bat.Size()) *pkCount += bat.RowCount() @@ -931,7 +931,7 @@ func (txn *Transaction) dumpInsertBatchLocked( for tbKey := range mp { // scenario 2 for cn write s3, more info in the comment of S3Writer - tbl := tables[tbKey] + tbl := tables[tbKey.tableKey] tableDef := tbl.GetTableDef(txn.proc.Ctx) s3Writer = colexec.NewCNS3DataWriter( @@ -960,7 +960,7 @@ func (txn *Transaction) dumpInsertBatchLocked( table = tbl.(*txnTable) } - if err = table.getTxn().writeFileLockedWithVersionKnown( + if err = table.getTxn().writeFileLockedWithAutoIncrEpochKnown( INSERT, table.accountId, table.db.databaseId, @@ -970,8 +970,8 @@ func (txn *Transaction) dumpInsertBatchLocked( fileName, bat, table.getTxn().tnStores[0], - tbKey.tableDefVersion, - tbKey.tableDefVersionKnown, + tbKey.autoIncrEpoch, + tbKey.autoIncrEpochKnown, ); err != nil { return err } @@ -1026,14 +1026,14 @@ func (txn *Transaction) dumpDeleteBatchLocked( dbName: txn.writes[i].databaseName, name: txn.writes[i].tableName, }, - tableDefVersion: txn.writes[i].tableDefVersion, - tableDefVersionKnown: txn.writes[i].tableDefVersionKnown, + autoIncrEpoch: txn.writes[i].autoIncrEpoch, + autoIncrEpochKnown: txn.writes[i].autoIncrEpochKnown, } // Tables not resolved in the pre-resolution pass were appended // to the workspace while the lock was released; keep them in // memory for the next dump instead of calling getTable with // the lock held. - if _, ok := tables[tbKey]; ok { + if _, ok := tables[tbKey.tableKey]; ok { bat := txn.writes[i].bat deleteCnt += bat.RowCount() *size += uint64(bat.Size()) @@ -1075,7 +1075,7 @@ func (txn *Transaction) dumpDeleteBatchLocked( for tbKey := range mp { // scenario 2 for cn write s3, more info in the comment of S3Writer - tbl := tables[tbKey] + tbl := tables[tbKey.tableKey] pkCol = plan2.PkColByTableDef(tbl.GetTableDef(txn.proc.Ctx)) s3Writer = colexec.NewCNS3TombstoneWriter( @@ -1105,7 +1105,7 @@ func (txn *Transaction) dumpDeleteBatchLocked( table = tbl.(*txnTable) } - if err = table.getTxn().writeFileLockedWithVersionKnown( + if err = table.getTxn().writeFileLockedWithAutoIncrEpochKnown( DELETE, table.accountId, table.db.databaseId, @@ -1115,8 +1115,8 @@ func (txn *Transaction) dumpDeleteBatchLocked( fileName, bat, table.getTxn().tnStores[0], - tbKey.tableDefVersion, - tbKey.tableDefVersionKnown, + tbKey.autoIncrEpoch, + tbKey.autoIncrEpochKnown, ); err != nil { return err } @@ -1334,16 +1334,16 @@ func (txn *Transaction) registerCNObjects( objBat *batch.Batch, dbName string, tbName string, - tableDefVersion uint32, - tableDefVersionKnown bool, + autoIncrEpoch uint32, + autoIncrEpochKnown bool, ) { txn.cnObjsSummary[objId] = Summary{ - objBat: objBat, - accountId: accountId, - dbName: dbName, - tbName: tbName, - tableDefVersion: tableDefVersion, - tableDefVersionKnown: tableDefVersionKnown, + objBat: objBat, + accountId: accountId, + dbName: dbName, + tbName: tbName, + autoIncrEpoch: autoIncrEpoch, + autoIncrEpochKnown: autoIncrEpochKnown, } } @@ -1358,11 +1358,11 @@ func (txn *Transaction) WriteFileLocked( inputBat *batch.Batch, tnStore DNStore, ) (err error) { - return txn.writeFileLockedWithVersionKnown(typ, accountId, databaseId, tableId, + return txn.writeFileLockedWithAutoIncrEpochKnown(typ, accountId, databaseId, tableId, databaseName, tableName, fileName, inputBat, tnStore, 0, false) } -func (txn *Transaction) writeFileLockedWithVersion( +func (txn *Transaction) writeFileLockedWithAutoIncrEpoch( typ int, accountId uint32, databaseId, @@ -1372,13 +1372,13 @@ func (txn *Transaction) writeFileLockedWithVersion( fileName string, inputBat *batch.Batch, tnStore DNStore, - tableDefVersion uint32, + autoIncrEpoch uint32, ) (err error) { - return txn.writeFileLockedWithVersionKnown(typ, accountId, databaseId, tableId, - databaseName, tableName, fileName, inputBat, tnStore, tableDefVersion, true) + return txn.writeFileLockedWithAutoIncrEpochKnown(typ, accountId, databaseId, tableId, + databaseName, tableName, fileName, inputBat, tnStore, autoIncrEpoch, true) } -func (txn *Transaction) writeFileLockedWithVersionKnown( +func (txn *Transaction) writeFileLockedWithAutoIncrEpochKnown( typ int, accountId uint32, databaseId, @@ -1388,8 +1388,8 @@ func (txn *Transaction) writeFileLockedWithVersionKnown( fileName string, inputBat *batch.Batch, tnStore DNStore, - tableDefVersion uint32, - tableDefVersionKnown bool, + autoIncrEpoch uint32, + autoIncrEpochKnown bool, ) (err error) { txn.hasS3Op.Store(true) @@ -1411,7 +1411,7 @@ func (txn *Transaction) writeFileLockedWithVersionKnown( sid := oid.Segment() server.PutCnSegment(txn.op.Txn().ID, tableId, sid, colexec.TxnWorkspaceUnCommitType) - txn.registerCNObjects(*oid, accountId, copied, databaseName, tableName, tableDefVersion, tableDefVersionKnown) + txn.registerCNObjects(*oid, accountId, copied, databaseName, tableName, autoIncrEpoch, autoIncrEpochKnown) } } @@ -1427,19 +1427,19 @@ func (txn *Transaction) writeFileLockedWithVersionKnown( } entry := Entry{ - typ: typ, - accountId: accountId, - tableId: tableId, - databaseId: databaseId, - tableName: tableName, - databaseName: databaseName, - fileName: fileName, - bat: copied, - tnStore: tnStore, - pkCheckPos: -1, - pkCheckReady: true, - tableDefVersion: tableDefVersion, - tableDefVersionKnown: tableDefVersionKnown, + typ: typ, + accountId: accountId, + tableId: tableId, + databaseId: databaseId, + tableName: tableName, + databaseName: databaseName, + fileName: fileName, + bat: copied, + tnStore: tnStore, + pkCheckPos: -1, + pkCheckReady: true, + autoIncrEpoch: autoIncrEpoch, + autoIncrEpochKnown: autoIncrEpochKnown, } txn.writes = append(txn.writes, entry) @@ -1460,11 +1460,11 @@ func (txn *Transaction) WriteFileLockedSkipTransfer( inputBat *batch.Batch, tnStore DNStore, ) (err error) { - return txn.writeFileLockedSkipTransferWithVersionKnown(typ, accountId, databaseId, tableId, + return txn.writeFileLockedSkipTransferWithAutoIncrEpochKnown(typ, accountId, databaseId, tableId, databaseName, tableName, fileName, inputBat, tnStore, 0, false) } -func (txn *Transaction) writeFileLockedSkipTransferWithVersion( +func (txn *Transaction) writeFileLockedSkipTransferWithAutoIncrEpoch( typ int, accountId uint32, databaseId, @@ -1474,13 +1474,13 @@ func (txn *Transaction) writeFileLockedSkipTransferWithVersion( fileName string, inputBat *batch.Batch, tnStore DNStore, - tableDefVersion uint32, + autoIncrEpoch uint32, ) (err error) { - return txn.writeFileLockedSkipTransferWithVersionKnown(typ, accountId, databaseId, tableId, - databaseName, tableName, fileName, inputBat, tnStore, tableDefVersion, true) + return txn.writeFileLockedSkipTransferWithAutoIncrEpochKnown(typ, accountId, databaseId, tableId, + databaseName, tableName, fileName, inputBat, tnStore, autoIncrEpoch, true) } -func (txn *Transaction) writeFileLockedSkipTransferWithVersionKnown( +func (txn *Transaction) writeFileLockedSkipTransferWithAutoIncrEpochKnown( typ int, accountId uint32, databaseId, @@ -1490,8 +1490,8 @@ func (txn *Transaction) writeFileLockedSkipTransferWithVersionKnown( fileName string, inputBat *batch.Batch, tnStore DNStore, - tableDefVersion uint32, - tableDefVersionKnown bool, + autoIncrEpoch uint32, + autoIncrEpochKnown bool, ) (err error) { txn.hasS3Op.Store(true) @@ -1513,7 +1513,7 @@ func (txn *Transaction) writeFileLockedSkipTransferWithVersionKnown( sid := oid.Segment() server.PutCnSegment(txn.op.Txn().ID, tableId, sid, colexec.TxnWorkspaceUnCommitType) - txn.registerCNObjects(*oid, accountId, copied, databaseName, tableName, tableDefVersion, tableDefVersionKnown) + txn.registerCNObjects(*oid, accountId, copied, databaseName, tableName, autoIncrEpoch, autoIncrEpochKnown) } } @@ -1529,18 +1529,18 @@ func (txn *Transaction) writeFileLockedSkipTransferWithVersionKnown( } entry := Entry{ - typ: typ, - accountId: accountId, - tableId: tableId, - databaseId: databaseId, - tableName: tableName, - databaseName: databaseName, - fileName: fileName, - bat: copied, - tnStore: tnStore, - skipTransfer: true, - tableDefVersion: tableDefVersion, - tableDefVersionKnown: tableDefVersionKnown, + typ: typ, + accountId: accountId, + tableId: tableId, + databaseId: databaseId, + tableName: tableName, + databaseName: databaseName, + fileName: fileName, + bat: copied, + tnStore: tnStore, + skipTransfer: true, + autoIncrEpoch: autoIncrEpoch, + autoIncrEpochKnown: autoIncrEpochKnown, } txn.writes = append(txn.writes, entry) @@ -1561,11 +1561,11 @@ func (txn *Transaction) WriteFile( bat *batch.Batch, tnStore DNStore, ) error { - return txn.writeFileWithVersionKnown(typ, accountId, databaseId, tableId, + return txn.writeFileWithAutoIncrEpochKnown(typ, accountId, databaseId, tableId, databaseName, tableName, fileName, bat, tnStore, 0, false) } -func (txn *Transaction) writeFileWithVersion( +func (txn *Transaction) writeFileWithAutoIncrEpoch( typ int, accountId uint32, databaseId, @@ -1575,13 +1575,13 @@ func (txn *Transaction) writeFileWithVersion( fileName string, bat *batch.Batch, tnStore DNStore, - tableDefVersion uint32, + autoIncrEpoch uint32, ) error { - return txn.writeFileWithVersionKnown(typ, accountId, databaseId, tableId, - databaseName, tableName, fileName, bat, tnStore, tableDefVersion, true) + return txn.writeFileWithAutoIncrEpochKnown(typ, accountId, databaseId, tableId, + databaseName, tableName, fileName, bat, tnStore, autoIncrEpoch, true) } -func (txn *Transaction) writeFileWithVersionKnown( +func (txn *Transaction) writeFileWithAutoIncrEpochKnown( typ int, accountId uint32, databaseId, @@ -1591,14 +1591,14 @@ func (txn *Transaction) writeFileWithVersionKnown( fileName string, bat *batch.Batch, tnStore DNStore, - tableDefVersion uint32, - tableDefVersionKnown bool, + autoIncrEpoch uint32, + autoIncrEpochKnown bool, ) error { txn.Lock() defer txn.Unlock() - return txn.writeFileLockedWithVersionKnown( + return txn.writeFileLockedWithAutoIncrEpochKnown( typ, accountId, databaseId, @@ -1608,8 +1608,8 @@ func (txn *Transaction) writeFileWithVersionKnown( fileName, bat, tnStore, - tableDefVersion, - tableDefVersionKnown, + autoIncrEpoch, + autoIncrEpochKnown, ) } @@ -2068,8 +2068,8 @@ func (txn *Transaction) compactDeletionOnObjsLocked(ctx context.Context) error { dbName: summary.dbName, name: summary.tbName, }, - tableDefVersion: summary.tableDefVersion, - tableDefVersionKnown: summary.tableDefVersionKnown, + autoIncrEpoch: summary.autoIncrEpoch, + autoIncrEpochKnown: summary.autoIncrEpochKnown, } } @@ -2102,7 +2102,7 @@ func (txn *Transaction) compactDeletionOnObjsLocked(ctx context.Context) error { // resolveCompactTablesLocked guarantees every table referenced by // txn.deletedBlocks is in the map - rel, ok := tables[tbKey] + rel, ok := tables[tbKey.tableKey] if !ok { panicWhenFailed(moerr.NewInternalErrorNoCtx( "table not pre-resolved for object compaction"), "get table failed") @@ -2125,7 +2125,7 @@ func (txn *Transaction) compactDeletionOnObjsLocked(ctx context.Context) error { locker.Lock() defer locker.Unlock() - if err = txn.writeFileLockedWithVersionKnown( + if err = txn.writeFileLockedWithAutoIncrEpochKnown( INSERT, tbl.accountId, tbl.db.databaseId, @@ -2135,8 +2135,8 @@ func (txn *Transaction) compactDeletionOnObjsLocked(ctx context.Context) error { fileName, bat, txn.tnStores[0], - tbKey.tableDefVersion, - tbKey.tableDefVersionKnown, + tbKey.autoIncrEpoch, + tbKey.autoIncrEpochKnown, ); err != nil { bat.Clean(txn.proc.Mp()) panicWhenFailed(err, "write txn file failed") @@ -2184,7 +2184,7 @@ func (txn *Transaction) compactDeletionOnObjsLocked(ctx context.Context) error { bat.SetRowCount(bat.Vecs[0].Length()) - if err := txn.writeFileLockedWithVersionKnown( + if err := txn.writeFileLockedWithAutoIncrEpochKnown( INSERT, entry.accountId, entry.databaseId, @@ -2194,8 +2194,8 @@ func (txn *Transaction) compactDeletionOnObjsLocked(ctx context.Context) error { stats.ObjectName().String(), bat, entry.tnStore, - entry.tableDefVersion, - entry.tableDefVersionKnown, + entry.autoIncrEpoch, + entry.autoIncrEpochKnown, ); err != nil { bat.Clean(txn.proc.Mp()) return err diff --git a/pkg/vm/engine/disttae/txn_table.go b/pkg/vm/engine/disttae/txn_table.go index 2e959b765f1b0..edfa27f2dce86 100644 --- a/pkg/vm/engine/disttae/txn_table.go +++ b/pkg/vm/engine/disttae/txn_table.go @@ -1595,6 +1595,8 @@ func (tbl *txnTable) GetTableDef(ctx context.Context) *plan.TableDef { } if tbl.extraInfo != nil { tbl.tableDef.FeatureFlag = tbl.extraInfo.FeatureFlag + tbl.tableDef.AutoIncrOffset = tbl.extraInfo.AutoIncrOffset + tbl.tableDef.AutoIncrEpoch = tbl.extraInfo.AutoIncrEpoch } } return tbl.tableDef @@ -1652,6 +1654,8 @@ func (tbl *txnTable) AlterTable(ctx context.Context, c *engine.ConstraintDef, re oldPartInfo := tbl.partition oldComment := tbl.comment oldConstraint := tbl.constraint + oldAutoIncrOffset := tbl.extraInfo.AutoIncrOffset + oldAutoIncrEpoch := tbl.extraInfo.AutoIncrEpoch // The fact that the tableDef brought by alter requests can appended to the tail of original defs presupposes: // 1. late arriving tableDef will overwrite the existing tableDef // 2. any TableDef about columns, like AttritebuteDef, PrimaryKeyDef, or CluterbyDef do not change, ensuring genColumnsFromDefs works well @@ -1674,6 +1678,9 @@ func (tbl *txnTable) AlterTable(ctx context.Context, c *engine.ConstraintDef, re // Rollback for ReplaceDef is handled by restoring defs case api.AlterKind_RenameColumn: // RenameColumn takes effect in form of ReplaceDef + case api.AlterKind_UpdateAutoIncrement: + tbl.extraInfo.AutoIncrOffset = oldAutoIncrOffset + tbl.extraInfo.AutoIncrEpoch = oldAutoIncrEpoch } } tbl.defs = olddefs @@ -1711,6 +1718,10 @@ func (tbl *txnTable) AlterTable(ctx context.Context, c *engine.ConstraintDef, re hasReplaceDef = true re := req.GetRenameCol() renameColMap[re.OldName] = re.NewName + case api.AlterKind_UpdateAutoIncrement: + tbl.extraInfo.AutoIncrOffset = req.GetUpdateAutoIncrement().GetOffset() + tbl.extraInfo.AutoIncrEpoch++ + req.GetUpdateAutoIncrement().Epoch = tbl.extraInfo.AutoIncrEpoch default: panic("not supported") } @@ -1867,7 +1878,7 @@ func (tbl *txnTable) Write(ctx context.Context, bat *batch.Batch) error { tbl.getTxn().hasS3Op.Store(true) //bocks maybe come from different S3 object, here we just need to make sure fileName is not Nil. fileName := objectio.DecodeBlockInfo(bat.Vecs[0].GetBytesAt(0)).MetaLocation().Name().String() - return tbl.getTxn().writeFileWithVersion( + return tbl.getTxn().writeFileWithAutoIncrEpoch( INSERT, tbl.accountId, tbl.db.databaseId, @@ -1876,13 +1887,13 @@ func (tbl *txnTable) Write(ctx context.Context, bat *batch.Batch) error { tbl.tableName, fileName, bat, - tbl.getTxn().tnStores[0], tbl.version) + tbl.getTxn().tnStores[0], tbl.extraInfo.AutoIncrEpoch) } ibat, err := util.CopyBatch(bat, tbl.getTxn().proc) if err != nil { return err } - if _, err := tbl.getTxn().writeBatchWithVersion( + if _, err := tbl.getTxn().writeBatchWithAutoIncrEpoch( INSERT, "", tbl.accountId, @@ -1892,7 +1903,7 @@ func (tbl *txnTable) Write(ctx context.Context, bat *batch.Batch) error { tbl.tableName, ibat, tbl.getTxn().tnStores[0], - tbl.version, + tbl.extraInfo.AutoIncrEpoch, ); err != nil { ibat.Clean(tbl.getTxn().proc.Mp()) return err @@ -2058,14 +2069,14 @@ func (tbl *txnTable) Delete( skipTransfer := ctx.Value(defines.SkipTransferKey{}) != nil if skipTransfer { tbl.getTxn().Lock() - err := tbl.getTxn().writeFileLockedSkipTransferWithVersion(DELETE, tbl.accountId, tbl.db.databaseId, tbl.tableId, - tbl.db.databaseName, tbl.tableName, fileName, bat, tbl.getTxn().tnStores[0], tbl.version) + err := tbl.getTxn().writeFileLockedSkipTransferWithAutoIncrEpoch(DELETE, tbl.accountId, tbl.db.databaseId, tbl.tableId, + tbl.db.databaseName, tbl.tableName, fileName, bat, tbl.getTxn().tnStores[0], tbl.extraInfo.AutoIncrEpoch) tbl.getTxn().Unlock() return err } - if err := tbl.getTxn().writeFileWithVersion(DELETE, tbl.accountId, tbl.db.databaseId, tbl.tableId, - tbl.db.databaseName, tbl.tableName, fileName, bat, tbl.getTxn().tnStores[0], tbl.version); err != nil { + if err := tbl.getTxn().writeFileWithAutoIncrEpoch(DELETE, tbl.accountId, tbl.db.databaseId, tbl.tableId, + tbl.db.databaseName, tbl.tableName, fileName, bat, tbl.getTxn().tnStores[0], tbl.extraInfo.AutoIncrEpoch); err != nil { return err } @@ -2099,17 +2110,17 @@ func (tbl *txnTable) SoftDeleteObject(ctx context.Context, objID *objectio.Objec // Create entry with EntrySoftDeleteObject type entry := Entry{ - typ: SOFT_DELETE_OBJECT, - bat: bat, - tnStore: tbl.getTxn().tnStores[0], - tableId: tbl.tableId, - databaseId: tbl.db.databaseId, - tableName: tbl.tableName, - databaseName: tbl.db.databaseName, - accountId: tbl.accountId, - fileName: makeSoftDeleteFileName(isTombstone), - tableDefVersion: tbl.version, - tableDefVersionKnown: true, + typ: SOFT_DELETE_OBJECT, + bat: bat, + tnStore: tbl.getTxn().tnStores[0], + tableId: tbl.tableId, + databaseId: tbl.db.databaseId, + tableName: tbl.tableName, + databaseName: tbl.db.databaseName, + accountId: tbl.accountId, + fileName: makeSoftDeleteFileName(isTombstone), + autoIncrEpoch: tbl.extraInfo.AutoIncrEpoch, + autoIncrEpochKnown: true, } tbl.getTxn().writes = append(tbl.getTxn().writes, entry) @@ -2121,8 +2132,8 @@ func (tbl *txnTable) writeTnPartition(_ context.Context, bat *batch.Batch) error if err != nil { return err } - if _, err := tbl.getTxn().writeBatchWithVersion(DELETE, "", tbl.accountId, tbl.db.databaseId, tbl.tableId, - tbl.db.databaseName, tbl.tableName, ibat, tbl.getTxn().tnStores[0], tbl.version); err != nil { + if _, err := tbl.getTxn().writeBatchWithAutoIncrEpoch(DELETE, "", tbl.accountId, tbl.db.databaseId, tbl.tableId, + tbl.db.databaseName, tbl.tableName, ibat, tbl.getTxn().tnStores[0], tbl.extraInfo.AutoIncrEpoch); err != nil { ibat.Clean(tbl.getTxn().proc.Mp()) return err } diff --git a/pkg/vm/engine/disttae/txn_test.go b/pkg/vm/engine/disttae/txn_test.go index 60bbe574b0e2e..145636a0fc4e8 100644 --- a/pkg/vm/engine/disttae/txn_test.go +++ b/pkg/vm/engine/disttae/txn_test.go @@ -44,7 +44,7 @@ import ( "github.com/stretchr/testify/require" ) -func TestPrecommitEntryCarriesTableDefVersion(t *testing.T) { +func TestPrecommitEntryCarriesAutoIncrEpoch(t *testing.T) { proc := testutil.NewProc(t) bat := newDeleteBatchForTest(t, proc, []int64{1}) defer bat.Clean(proc.Mp()) @@ -60,12 +60,12 @@ func TestPrecommitEntryCarriesTableDefVersion(t *testing.T) { } { t.Run(tc.name, func(t *testing.T) { encoded, err := toPBEntry(Entry{ - typ: DELETE, - tableId: 42, - databaseId: 7, - bat: bat, - tableDefVersion: tc.version, - tableDefVersionKnown: tc.known, + typ: DELETE, + tableId: 42, + databaseId: 7, + bat: bat, + autoIncrEpoch: tc.version, + autoIncrEpochKnown: tc.known, }) require.NoError(t, err) @@ -73,17 +73,17 @@ func TestPrecommitEntryCarriesTableDefVersion(t *testing.T) { require.NoError(t, err) decoded := new(api.Entry) require.NoError(t, decoded.Unmarshal(data)) - require.Equal(t, tc.version, decoded.TableDefVersion) - require.Equal(t, tc.known, decoded.TableDefVersionKnown) + require.Equal(t, tc.version, decoded.AutoIncrEpoch) + require.Equal(t, tc.known, decoded.AutoIncrEpochKnown) }) } } -func TestWorkspaceFlushKeySeparatesTableDefVersions(t *testing.T) { +func TestWorkspaceFlushKeySeparatesAutoIncrEpochs(t *testing.T) { base := tableKey{accountId: 1, databaseId: 7, dbName: "db", name: "tbl"} batches := map[workspaceTableKey]int{ - {tableKey: base, tableDefVersion: 0, tableDefVersionKnown: false}: 1, - {tableKey: base, tableDefVersion: 0, tableDefVersionKnown: true}: 1, + {tableKey: base, autoIncrEpoch: 0, autoIncrEpochKnown: false}: 1, + {tableKey: base, autoIncrEpoch: 0, autoIncrEpochKnown: true}: 1, } require.Len(t, batches, 2) } @@ -225,7 +225,7 @@ func TestWriteBatchRecordsPKCheckState(t *testing.T) { require.Len(t, txn.writes, 1) require.False(t, txn.writes[0].pkCheckReady) require.Equal(t, -1, txn.writes[0].pkCheckPos) - require.False(t, txn.writes[0].tableDefVersionKnown) + require.False(t, txn.writes[0].autoIncrEpochKnown) bat.Clean(proc.Mp()) }) @@ -256,15 +256,15 @@ func TestWriteBatchRecordsPKCheckState(t *testing.T) { bat.Clean(txn.proc.Mp()) }) - t.Run("user write records planned table version", func(t *testing.T) { + t.Run("user write records planned AUTO_INCREMENT epoch", func(t *testing.T) { txn := newTransactionWithActivePKTableForTest(t, "pk") bat := newInt64BatchForTest(t, txn.proc, []string{"pk"}, []int64{1}) - _, err := txn.writeBatchWithVersion(INSERT, "", 1, 7, 42, "db", "tbl", bat, DNStore{}, 7) + _, err := txn.writeBatchWithAutoIncrEpoch(INSERT, "", 1, 7, 42, "db", "tbl", bat, DNStore{}, 7) require.NoError(t, err) require.Len(t, txn.writes, 1) - require.Equal(t, uint32(7), txn.writes[0].tableDefVersion) - require.True(t, txn.writes[0].tableDefVersionKnown) + require.Equal(t, uint32(7), txn.writes[0].autoIncrEpoch) + require.True(t, txn.writes[0].autoIncrEpochKnown) bat.Clean(txn.proc.Mp()) }) diff --git a/pkg/vm/engine/disttae/types.go b/pkg/vm/engine/disttae/types.go index cb0a8af240d27..451b05290d3d0 100644 --- a/pkg/vm/engine/disttae/types.go +++ b/pkg/vm/engine/disttae/types.go @@ -497,12 +497,12 @@ func (txn *Transaction) GetSyncProtectionJobID() string { } type Summary struct { - objBat *batch.Batch - accountId uint32 - tbName string - dbName string - tableDefVersion uint32 - tableDefVersionKnown bool + objBat *batch.Batch + accountId uint32 + tbName string + dbName string + autoIncrEpoch uint32 + autoIncrEpochKnown bool } // FIXME: The map inside this one will be accessed concurrently, using @@ -1137,11 +1137,11 @@ type Entry struct { bat *batch.Batch tnStore DNStore pkChkByTN int8 - // tableDefVersion is the schema version used to plan this user-table write. - // tableDefVersionKnown distinguishes a valid initial zero version from an + // autoIncrEpoch is the allocator epoch used to plan this user-table write. + // autoIncrEpochKnown distinguishes a valid initial zero epoch from an // old CN that did not send the dependency. - tableDefVersion uint32 - tableDefVersionKnown bool + autoIncrEpoch uint32 + autoIncrEpochKnown bool // skipTransfer indicates this entry should skip transfer processing // Used by CCPR to avoid transfer errors for cross-cluster tombstones @@ -1204,8 +1204,8 @@ type tableKey struct { // from being coalesced when the CN workspace is flushed to S3. type workspaceTableKey struct { tableKey - tableDefVersion uint32 - tableDefVersionKnown bool + autoIncrEpoch uint32 + autoIncrEpochKnown bool } func (k tableKey) String() string { diff --git a/pkg/vm/engine/tae/catalog/schema.go b/pkg/vm/engine/tae/catalog/schema.go index 3b2ac6a0c3aa0..d458543dbb2e4 100644 --- a/pkg/vm/engine/tae/catalog/schema.go +++ b/pkg/vm/engine/tae/catalog/schema.go @@ -204,6 +204,9 @@ func (s *Schema) ApplyAlterTable(req *apipb.AlterTableReq) error { s.Constraint = req.GetUpdateCstr().GetConstraints() case apipb.AlterKind_UpdateComment: s.Comment = req.GetUpdateComment().GetComment() + case apipb.AlterKind_UpdateAutoIncrement: + s.Extra.AutoIncrOffset = req.GetUpdateAutoIncrement().GetOffset() + s.Extra.AutoIncrEpoch = req.GetUpdateAutoIncrement().GetEpoch() case apipb.AlterKind_RenameColumn: rename := req.GetRenameCol() var targetCol *ColDef diff --git a/pkg/vm/engine/tae/catalog/table.go b/pkg/vm/engine/tae/catalog/table.go index 8deee0aa3abfd..2aabc9cbd8c73 100644 --- a/pkg/vm/engine/tae/catalog/table.go +++ b/pkg/vm/engine/tae/catalog/table.go @@ -21,6 +21,7 @@ import ( "fmt" "math" "slices" + "sync" "sync/atomic" "time" @@ -54,6 +55,15 @@ type TableEntry struct { tableData data.Table rows atomic.Uint64 + // latestKnownDMLPrepare is the greatest visibility timestamp of accepted + // epoch-aware DML. An AUTO_INCREMENT reset uses it to reject a snapshot + // that did not observe a later durable write. + latestKnownDMLPrepare atomic.Pointer[types.TS] + replayedPreparedDML struct { + sync.Mutex + txns map[string]struct{} + } + // fullname is format as 'tenantID-tableName', the tenantID prefix is only used 'mo_catalog' database fullName string @@ -61,6 +71,54 @@ type TableEntry struct { tombstoneObjects *ObjectList } +func (entry *TableEntry) RecordKnownDMLPrepare(ts types.TS) { + for old := entry.latestKnownDMLPrepare.Load(); old == nil || ts.GT(old); old = entry.latestKnownDMLPrepare.Load() { + candidate := ts + if entry.latestKnownDMLPrepare.CompareAndSwap(old, &candidate) { + return + } + } +} + +func (entry *TableEntry) GetLatestKnownDMLPrepare() types.TS { + if ts := entry.latestKnownDMLPrepare.Load(); ts != nil { + return *ts + } + return types.TS{} +} + +func (entry *TableEntry) RegisterReplayedPreparedDML(txnID string) { + entry.replayedPreparedDML.Lock() + defer entry.replayedPreparedDML.Unlock() + if entry.replayedPreparedDML.txns == nil { + entry.replayedPreparedDML.txns = make(map[string]struct{}) + } + entry.replayedPreparedDML.txns[txnID] = struct{}{} +} + +func (entry *TableEntry) ResolveReplayedPreparedDML(txnID string, visibilityTS *types.TS) { + entry.replayedPreparedDML.Lock() + defer entry.replayedPreparedDML.Unlock() + if _, ok := entry.replayedPreparedDML.txns[txnID]; !ok { + return + } + if visibilityTS != nil { + entry.RecordKnownDMLPrepare(*visibilityTS) + } + delete(entry.replayedPreparedDML.txns, txnID) +} + +func (entry *TableEntry) ShouldRetryAutoIncrementAlter(startTS types.TS) bool { + entry.replayedPreparedDML.Lock() + unresolved := len(entry.replayedPreparedDML.txns) > 0 + entry.replayedPreparedDML.Unlock() + if unresolved { + return true + } + latestDML := entry.GetLatestKnownDMLPrepare() + return latestDML.GT(&startTS) +} + func genTblFullName(tenantID uint32, name string) string { if name == pkgcatalog.MO_DATABASE || name == pkgcatalog.MO_TABLES || name == pkgcatalog.MO_COLUMNS { tenantID = 0 @@ -833,6 +891,8 @@ func (entry *TableEntry) AlterTable(ctx context.Context, txn txnif.TxnReader, re BlockMaxRows: newSchema.Extra.BlockMaxRows, ObjectMaxBlocks: newSchema.Extra.ObjectMaxBlocks, Hints: hints, + AutoIncrOffset: newSchema.Extra.AutoIncrOffset, + AutoIncrEpoch: newSchema.Extra.AutoIncrEpoch, } } diff --git a/pkg/vm/engine/tae/catalog/table_test.go b/pkg/vm/engine/tae/catalog/table_test.go index 28c54bbfd5ce0..859622b736cba 100644 --- a/pkg/vm/engine/tae/catalog/table_test.go +++ b/pkg/vm/engine/tae/catalog/table_test.go @@ -41,6 +41,33 @@ func TestTableObjectStats(t *testing.T) { require.Equal(t, "TOMBSTONES\n\n000000000000_0 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAAAAAAAAAAA==\n", detail.String()) } +func TestReplayedPreparedDMLFenceLifecycle(t *testing.T) { + table := MockTableEntryWithDB(nil, 1) + other := MockTableEntryWithDB(nil, 2) + oldStart := types.BuildTS(10, 0) + + table.RegisterReplayedPreparedDML("txn-1") + table.RegisterReplayedPreparedDML("txn-1") + table.RegisterReplayedPreparedDML("txn-2") + require.False(t, other.ShouldRetryAutoIncrementAlter(oldStart)) + other.RegisterReplayedPreparedDML("other") + require.True(t, table.ShouldRetryAutoIncrementAlter(oldStart)) + require.True(t, other.ShouldRetryAutoIncrementAlter(oldStart)) + + table.ResolveReplayedPreparedDML("txn-1", nil) + table.ResolveReplayedPreparedDML("txn-1", nil) + require.True(t, table.ShouldRetryAutoIncrementAlter(oldStart)) + + replayedPrepare := types.BuildTS(12, 0) + replayedCommit := types.BuildTS(13, 0) + table.ResolveReplayedPreparedDML("txn-2", &replayedCommit) + require.True(t, table.ShouldRetryAutoIncrementAlter(oldStart)) + require.True(t, table.ShouldRetryAutoIncrementAlter(replayedPrepare)) + require.False(t, table.ShouldRetryAutoIncrementAlter(replayedCommit)) + table.ResolveReplayedPreparedDML("missing", &replayedCommit) + require.False(t, table.ShouldRetryAutoIncrementAlter(types.BuildTS(22, 0))) +} + func TestObjectList(t *testing.T) { ll := NewObjectList(false) nobjid := objectio.NewObjectid() diff --git a/pkg/vm/engine/tae/db/test/db_test.go b/pkg/vm/engine/tae/db/test/db_test.go index 37095c9dbe959..5d3e24fc36254 100644 --- a/pkg/vm/engine/tae/db/test/db_test.go +++ b/pkg/vm/engine/tae/db/test/db_test.go @@ -6571,7 +6571,7 @@ func TestAlterAutoIncrementSchemaCommitAndRollback(t *testing.T) { require.NoError(t, txn.Commit(ctx)) txn, rel = testutil.GetDefaultRelation(t, tae, schema.Name) - require.NoError(t, rel.AlterTable(ctx, api.NewUpdateAutoIncrementReq(0, rel.ID(), 123))) + require.NoError(t, rel.AlterTable(ctx, api.NewUpdateAutoIncrementReq(0, rel.ID(), 123, 2))) uncommitted := rel.Schema(false).(*catalog.Schema) require.Equal(t, committedVersion+1, uncommitted.Version) require.Equal(t, uint64(123), uncommitted.Extra.AutoIncrOffset) @@ -6584,8 +6584,8 @@ func TestAlterAutoIncrementSchemaCommitAndRollback(t *testing.T) { require.NoError(t, txn.Commit(ctx)) } -type tableDefVersionSetter interface { - SetTableDefVersion(uint32) error +type autoIncrEpochSetter interface { + SetAutoIncrEpoch(uint32) error } func waitTableVersionBarrier(t *testing.T, ch <-chan struct{}, name string) { @@ -6597,7 +6597,7 @@ func waitTableVersionBarrier(t *testing.T, ch <-chan struct{}, name string) { } } -func TestTableDefVersionCommitFence(t *testing.T) { +func TestAutoIncrEpochCommitFence(t *testing.T) { defer testutils.AfterTest(t)() testutils.EnsureNoLeak(t) ctx := context.Background() @@ -6613,7 +6613,7 @@ func TestTableDefVersionCommitFence(t *testing.T) { require.NoError(t, txn.Commit(ctx)) txn, rel = testutil.GetDefaultRelation(t, tae, schema.Name) - version := rel.Schema(false).(*catalog.Schema).Version + version := rel.Schema(false).(*catalog.Schema).Extra.AutoIncrEpoch require.NotZero(t, version) require.NoError(t, txn.Commit(ctx)) return tae, schema, version @@ -6622,7 +6622,7 @@ func TestTableDefVersionCommitFence(t *testing.T) { appendWithVersion := func(t *testing.T, tae *db.DB, schema *catalog.Schema, version uint32) txnif.AsyncTxn { t.Helper() txn, rel := testutil.GetDefaultRelation(t, tae, schema.Name) - require.NoError(t, rel.(tableDefVersionSetter).SetTableDefVersion(version)) + require.NoError(t, rel.(autoIncrEpochSetter).SetAutoIncrEpoch(version)) bat := catalog.MockBatch(schema, 1) t.Cleanup(bat.Close) require.NoError(t, rel.Append(ctx, bat)) @@ -6643,18 +6643,20 @@ func TestTableDefVersionCommitFence(t *testing.T) { require.True(t, moerr.IsMoErrCode(err, moerr.ErrTxnNeedRetryWithDefChanged), err) }) - t.Run("unknown initial zero remains compatible", func(t *testing.T) { + t.Run("unknown initial zero fails closed after first alter", func(t *testing.T) { tae := testutil.InitTestDB(ctx, ModuleName, t, config.WithLongScanAndCKPOpts(nil)) defer tae.Close() schema := catalog.MockSchemaAll(3, 1) testutil.CreateRelation(t, tae, testutil.DefaultTestDB, schema, true) - unknownTxn, _ := testutil.GetDefaultRelation(t, tae, schema.Name) + unknownTxn, unknownRel := testutil.GetDefaultRelation(t, tae, schema.Name) + require.NoError(t, unknownRel.(autoIncrEpochSetter).SetAutoIncrEpoch(0)) require.NoError(t, unknownTxn.MockIncWriteCnt()) alterTxn, alterRel := testutil.GetDefaultRelation(t, tae, schema.Name) require.NoError(t, alterRel.AlterTable(ctx, api.NewUpdateAutoIncrementReq(0, alterRel.ID(), 10))) require.NoError(t, alterTxn.Commit(ctx)) - require.NoError(t, unknownTxn.Commit(ctx)) + err := unknownTxn.Commit(ctx) + require.True(t, moerr.IsMoErrCode(err, moerr.ErrTxnNeedRetryWithDefChanged), err) }) t.Run("matching version", func(t *testing.T) { @@ -6667,13 +6669,13 @@ func TestTableDefVersionCommitFence(t *testing.T) { tae, schema, version := newVersionedTable(t) defer tae.Close() txn, rel := testutil.GetDefaultRelation(t, tae, schema.Name) - require.NoError(t, rel.(tableDefVersionSetter).SetTableDefVersion(version)) + require.NoError(t, rel.(autoIncrEpochSetter).SetAutoIncrEpoch(version)) bat := containers.MockBatchWithAttrsAndOffset(schema.Types(), schema.Attrs(), 1, 0) defer bat.Close() require.NoError(t, rel.Append(ctx, bat)) _, _, err := rel.GetByFilter(ctx, handle.NewEQFilter(bat.Vecs[schema.GetSingleSortKeyIdx()].Get(0))) require.NoError(t, err) - require.NoError(t, rel.AlterTable(ctx, api.NewUpdateAutoIncrementReq(0, rel.ID(), 20))) + require.NoError(t, rel.AlterTable(ctx, api.NewUpdateAutoIncrementReq(0, rel.ID(), 20, version+1))) require.NoError(t, txn.Commit(ctx)) }) @@ -6681,10 +6683,10 @@ func TestTableDefVersionCommitFence(t *testing.T) { tae, schema, version := newVersionedTable(t) defer tae.Close() txn, rel := testutil.GetDefaultRelation(t, tae, schema.Name) - require.NoError(t, rel.AlterTable(ctx, api.NewUpdateAutoIncrementReq(0, rel.ID(), 20))) - localVersion := rel.Schema(false).(*catalog.Schema).Version - require.Equal(t, version+1, localVersion) - require.NoError(t, rel.(tableDefVersionSetter).SetTableDefVersion(localVersion)) + require.NoError(t, rel.AlterTable(ctx, api.NewUpdateAutoIncrementReq(0, rel.ID(), 20, version+1))) + localEpoch := rel.Schema(false).(*catalog.Schema).Extra.AutoIncrEpoch + require.Equal(t, version+1, localEpoch) + require.NoError(t, rel.(autoIncrEpochSetter).SetAutoIncrEpoch(localEpoch)) bat := containers.MockBatchWithAttrsAndOffset(schema.Types(), schema.Attrs(), 1, 0) defer bat.Close() require.NoError(t, rel.Append(ctx, bat)) @@ -6697,14 +6699,14 @@ func TestTableDefVersionCommitFence(t *testing.T) { tae, schema, version := newVersionedTable(t) defer tae.Close() txn, rel := testutil.GetDefaultRelation(t, tae, schema.Name) - require.NoError(t, rel.(tableDefVersionSetter).SetTableDefVersion(version)) + require.NoError(t, rel.(autoIncrEpochSetter).SetAutoIncrEpoch(version)) before := containers.MockBatchWithAttrsAndOffset(schema.Types(), schema.Attrs(), 1, 0) defer before.Close() require.NoError(t, rel.Append(ctx, before)) - require.NoError(t, rel.AlterTable(ctx, api.NewUpdateAutoIncrementReq(0, rel.ID(), 20))) - localVersion := rel.Schema(false).(*catalog.Schema).Version - require.Equal(t, version+1, localVersion) - require.NoError(t, rel.(tableDefVersionSetter).SetTableDefVersion(localVersion)) + require.NoError(t, rel.AlterTable(ctx, api.NewUpdateAutoIncrementReq(0, rel.ID(), 20, version+1))) + localEpoch := rel.Schema(false).(*catalog.Schema).Extra.AutoIncrEpoch + require.Equal(t, version+1, localEpoch) + require.NoError(t, rel.(autoIncrEpochSetter).SetAutoIncrEpoch(localEpoch)) after := containers.MockBatchWithAttrsAndOffset(schema.Types(), schema.Attrs(), 1, 10) defer after.Close() require.NoError(t, rel.Append(ctx, after)) @@ -6721,7 +6723,7 @@ func TestTableDefVersionCommitFence(t *testing.T) { dmlTxn := appendWithVersion(t, tae, schema, version) alterTxn, alterRel := testutil.GetDefaultRelation(t, tae, schema.Name) - require.NoError(t, alterRel.AlterTable(ctx, api.NewUpdateAutoIncrementReq(0, alterRel.ID(), 20))) + require.NoError(t, alterRel.AlterTable(ctx, api.NewUpdateAutoIncrementReq(0, alterRel.ID(), 20, version+1))) require.NoError(t, alterTxn.Commit(ctx)) err := dmlTxn.Commit(ctx) @@ -6734,7 +6736,7 @@ func TestTableDefVersionCommitFence(t *testing.T) { dmlTxn := appendWithVersion(t, tae, schema, version) alterTxn, alterRel := testutil.GetDefaultRelation(t, tae, schema.Name) - require.NoError(t, alterRel.AlterTable(ctx, api.NewUpdateAutoIncrementReq(0, alterRel.ID(), 20))) + require.NoError(t, alterRel.AlterTable(ctx, api.NewUpdateAutoIncrementReq(0, alterRel.ID(), 20, version+1))) alterPrepared, releaseAlter := make(chan struct{}), make(chan struct{}) alterTxn.SetPrepareCommitFn(func(txn txnif.AsyncTxn) error { close(alterPrepared) @@ -6759,7 +6761,7 @@ func TestTableDefVersionCommitFence(t *testing.T) { require.True(t, moerr.IsMoErrCode(err, moerr.ErrTxnNeedRetryWithDefChanged), err) }) - t.Run("dml prepared first may commit before alter", func(t *testing.T) { + t.Run("dml prepared first forces alter retry", func(t *testing.T) { tae, schema, version := newVersionedTable(t) defer tae.Close() dmlTxn := appendWithVersion(t, tae, schema, version) @@ -6775,7 +6777,7 @@ func TestTableDefVersionCommitFence(t *testing.T) { waitTableVersionBarrier(t, dmlPrepared, "DML prepare") alterTxn, alterRel := testutil.GetDefaultRelation(t, tae, schema.Name) - require.NoError(t, alterRel.AlterTable(ctx, api.NewUpdateAutoIncrementReq(0, alterRel.ID(), 20))) + require.NoError(t, alterRel.AlterTable(ctx, api.NewUpdateAutoIncrementReq(0, alterRel.ID(), 20, version+1))) alterStarted := make(chan struct{}) alterResult := make(chan error, 1) go func() { @@ -6786,7 +6788,8 @@ func TestTableDefVersionCommitFence(t *testing.T) { close(releaseDML) require.NoError(t, <-dmlResult) - require.NoError(t, <-alterResult) + err := <-alterResult + require.True(t, moerr.IsMoErrCode(err, moerr.ErrTxnNeedRetryWithDefChanged), err) }) } diff --git a/pkg/vm/engine/tae/rpc/handle.go b/pkg/vm/engine/tae/rpc/handle.go index 9c7bda32794f7..b0daa415c9471 100644 --- a/pkg/vm/engine/tae/rpc/handle.go +++ b/pkg/vm/engine/tae/rpc/handle.go @@ -315,7 +315,7 @@ func (h *Handle) handleRequests( wr = h.apiEntryToWriteEntry(ctx, txnMeta, ae, true) // Check if this is a soft delete object request if wr.FileName != "" && isSoftDeleteEntry(wr.FileName) { - if err = h.registerWriteTableDefVersion(txn, wr); err != nil { + if err = h.registerWriteAutoIncrEpoch(txn, wr); err != nil { return } // Handle soft delete object separately @@ -329,7 +329,7 @@ func (h *Handle) handleRequests( wr = req.(*cmd_util.WriteReq) // Check if this is a soft delete object request if wr.Type == cmd_util.EntrySoftDeleteObject { - if err = h.registerWriteTableDefVersion(txn, wr); err != nil { + if err = h.registerWriteAutoIncrEpoch(txn, wr); err != nil { return } err = h.HandleSoftDeleteObject(ctx, txn, wr) @@ -411,25 +411,22 @@ func (h *Handle) handleRequests( return } -type tableDefVersionRecorder interface { - SetTableDefVersion(uint32) error +type autoIncrEpochRecorder interface { + SetAutoIncrEpoch(uint32) error } -func setTableDefVersionDependency(rel handle.Relation, version uint32, known bool) error { +func setAutoIncrEpochDependency(rel handle.Relation, epoch uint32, known bool) error { if !known { - return nil + epoch = 0 } - recorder, ok := rel.(tableDefVersionRecorder) + recorder, ok := rel.(autoIncrEpochRecorder) if !ok { - return moerr.NewInternalErrorNoCtxf("relation %T cannot record table definition version", rel) + return moerr.NewInternalErrorNoCtxf("relation %T cannot record AUTO_INCREMENT epoch", rel) } - return recorder.SetTableDefVersion(version) + return recorder.SetAutoIncrEpoch(epoch) } -func (h *Handle) registerWriteTableDefVersion(txn txnif.AsyncTxn, req *cmd_util.WriteReq) error { - if !req.TableDefVersionKnown { - return nil - } +func (h *Handle) registerWriteAutoIncrEpoch(txn txnif.AsyncTxn, req *cmd_util.WriteReq) error { dbase, err := txn.GetDatabaseByID(req.DatabaseId) if err != nil { return err @@ -438,7 +435,7 @@ func (h *Handle) registerWriteTableDefVersion(txn txnif.AsyncTxn, req *cmd_util. if err != nil { return err } - return setTableDefVersionDependency(rel, req.TableDefVersion, req.TableDefVersionKnown) + return setAutoIncrEpochDependency(rel, req.AutoIncrEpoch, req.AutoIncrEpochKnown) } //#endregion @@ -459,16 +456,16 @@ func (h *Handle) apiEntryToWriteEntry( } req := &cmd_util.WriteReq{ - Type: cmd_util.EntryType(pe.EntryType), - DatabaseId: pe.GetDatabaseId(), - TableID: pe.GetTableId(), - DatabaseName: pe.GetDatabaseName(), - TableName: pe.GetTableName(), - TableDefVersion: pe.GetTableDefVersion(), - TableDefVersionKnown: pe.GetTableDefVersionKnown(), - FileName: pe.GetFileName(), - Batch: moBat, - PkCheck: cmd_util.PKCheckType(pe.GetPkCheckByTn()), + Type: cmd_util.EntryType(pe.EntryType), + DatabaseId: pe.GetDatabaseId(), + TableID: pe.GetTableId(), + DatabaseName: pe.GetDatabaseName(), + TableName: pe.GetTableName(), + AutoIncrEpoch: pe.GetAutoIncrEpoch(), + AutoIncrEpochKnown: pe.GetAutoIncrEpochKnown(), + FileName: pe.GetFileName(), + Batch: moBat, + PkCheck: cmd_util.PKCheckType(pe.GetPkCheckByTn()), } // Handle soft delete object: parse ObjectID from batch and IsTombstone from FileName @@ -933,7 +930,7 @@ func (h *Handle) HandleWrite( fmt.Sprintf("%d-%s", req.TableID, req.TableName))) return } - if err = setTableDefVersionDependency(tb, req.TableDefVersion, req.TableDefVersionKnown); err != nil { + if err = setAutoIncrEpochDependency(tb, req.AutoIncrEpoch, req.AutoIncrEpochKnown); err != nil { return } diff --git a/pkg/vm/engine/tae/rpc/rpc_test.go b/pkg/vm/engine/tae/rpc/rpc_test.go index 48b8fce45eeb3..337ad1102caf8 100644 --- a/pkg/vm/engine/tae/rpc/rpc_test.go +++ b/pkg/vm/engine/tae/rpc/rpc_test.go @@ -46,7 +46,7 @@ import ( "github.com/stretchr/testify/assert" ) -func TestTableDefVersionFenceIsModeIndependent(t *testing.T) { +func TestAutoIncrEpochFenceIsModeIndependent(t *testing.T) { defer testutils.AfterTest(t)() for _, mode := range []txnpb.TxnMode{txnpb.TxnMode_Optimistic, txnpb.TxnMode_Pessimistic} { t.Run(mode.String(), func(t *testing.T) { @@ -69,8 +69,8 @@ func TestTableDefVersionFenceIsModeIndependent(t *testing.T) { entry, err := makePBEntry(INSERT, databaseID, tableID, testutil.DefaultTestDB, schema.Name, "", containers.ToCNBatch(insertBatch)) require.NoError(t, err) - entry.TableDefVersion = 0 - entry.TableDefVersionKnown = true + entry.AutoIncrEpoch = 0 + entry.AutoIncrEpochKnown = true payload, err := (&api.PrecommitWriteCmd{EntryList: []*api.Entry{entry}}).MarshalBinary() require.NoError(t, err) commitReq := &txnpb.TxnCommitRequest{Payload: []*txnpb.TxnRequest{{ @@ -82,16 +82,16 @@ func TestTableDefVersionFenceIsModeIndependent(t *testing.T) { _, err = h.HandleCommit(ctx, meta, nil, commitReq) require.True(t, moerr.IsMoErrCode(err, moerr.ErrTxnNeedRetryWithDefChanged), err) - // The same raw V0 from an old CN has no presence bit and therefore - // remains wire-compatible after the ALTER. - entry.TableDefVersionKnown = false + // Legacy writers are accepted while the table is at epoch zero, but + // fail closed after the first allocator reset. + entry.AutoIncrEpochKnown = false payload, err = (&api.PrecommitWriteCmd{EntryList: []*api.Entry{entry}}).MarshalBinary() require.NoError(t, err) commitReq.Payload[0].CNRequest.Payload = payload meta = mock1PCTxn(h.db) meta.Mode = mode _, err = h.HandleCommit(ctx, meta, nil, commitReq) - require.NoError(t, err) + require.True(t, moerr.IsMoErrCode(err, moerr.ErrTxnNeedRetryWithDefChanged), err) }) } } diff --git a/pkg/vm/engine/tae/txn/txnimpl/relation.go b/pkg/vm/engine/tae/txn/txnimpl/relation.go index fa3eccd0afd28..b358377d215cf 100644 --- a/pkg/vm/engine/tae/txn/txnimpl/relation.go +++ b/pkg/vm/engine/tae/txn/txnimpl/relation.go @@ -115,9 +115,9 @@ type txnRelation struct { table *txnTable } -// SetTableDefVersion records the CN schema dependency for this relation. -func (h *txnRelation) SetTableDefVersion(version uint32) error { - return h.table.setExpectedTableDefVersion(version) +// SetAutoIncrEpoch records the CN schema dependency for this relation. +func (h *txnRelation) SetAutoIncrEpoch(version uint32) error { + return h.table.setExpectedAutoIncrEpoch(version) } func newRelation(table *txnTable) *txnRelation { diff --git a/pkg/vm/engine/tae/txn/txnimpl/replaystore.go b/pkg/vm/engine/tae/txn/txnimpl/replaystore.go index ae6f5815111da..e94079d60db5b 100644 --- a/pkg/vm/engine/tae/txn/txnimpl/replaystore.go +++ b/pkg/vm/engine/tae/txn/txnimpl/replaystore.go @@ -18,6 +18,7 @@ import ( "context" "github.com/matrixorigin/matrixone/pkg/common/moerr" + "github.com/matrixorigin/matrixone/pkg/container/types" "github.com/matrixorigin/matrixone/pkg/logutil" "github.com/matrixorigin/matrixone/pkg/util/fault" "github.com/matrixorigin/matrixone/pkg/vm/engine/tae/catalog" @@ -32,10 +33,12 @@ var ErrDebugReplay = moerr.NewInternalErrorNoCtx("debug") type replayTxnStore struct { txnbase.NoopTxnStore - Cmd *txnbase.TxnCmd - Observer wal.ReplayObserver - catalog *catalog.Catalog - ctx context.Context + Cmd *txnbase.TxnCmd + Observer wal.ReplayObserver + catalog *catalog.Catalog + ctx context.Context + preparedTables map[uint64]*catalog.TableEntry + preparedTxnID string } func MakeReplayTxn( @@ -79,19 +82,51 @@ func (store *replayTxnStore) prepareCommit(txn txnif.AsyncTxn) (err error) { command.SetReplayTxn(txn) store.prepareCmd(command) } + store.registerPreparedDMLTables(txn) return } func (store *replayTxnStore) applyCommit(txn txnif.AsyncTxn) (err error) { store.Cmd.ApplyCommit() + visibilityTS := txn.GetCommitTS() + store.resolvePreparedDMLTables(&visibilityTS) return } func (store *replayTxnStore) applyRollback(txn txnif.AsyncTxn) (err error) { store.Cmd.ApplyRollback() + store.resolvePreparedDMLTables(nil) return } +func (store *replayTxnStore) registerPreparedDMLTables(txn txnif.AsyncTxn) { + dirty := txn.GetMemo().GetDirty() + if dirty == nil || dirty.IsEmpty() { + return + } + store.preparedTxnID = txn.GetID() + store.preparedTables = make(map[uint64]*catalog.TableEntry, dirty.TableCount()) + for _, record := range dirty.Tables { + db, err := store.catalog.GetDatabaseByID(record.DbID) + if err != nil { + panic(err) + } + table, err := db.GetTableEntryByID(record.ID) + if err != nil { + panic(err) + } + table.RegisterReplayedPreparedDML(store.preparedTxnID) + store.preparedTables[record.ID] = table + } +} + +func (store *replayTxnStore) resolvePreparedDMLTables(visibilityTS *types.TS) { + for _, table := range store.preparedTables { + table.ResolveReplayedPreparedDML(store.preparedTxnID, visibilityTS) + } + store.preparedTables = nil +} + func (store *replayTxnStore) prepareRollback(txn txnif.AsyncTxn) (err error) { panic(moerr.NewInternalErrorNoCtxf("cannot prepareRollback rollback replay txn: %s", txn.String())) diff --git a/pkg/vm/engine/tae/txn/txnimpl/table.go b/pkg/vm/engine/tae/txn/txnimpl/table.go index 781ccb5cb6588..8524ebd5ea985 100644 --- a/pkg/vm/engine/tae/txn/txnimpl/table.go +++ b/pkg/vm/engine/tae/txn/txnimpl/table.go @@ -119,23 +119,37 @@ type txnTable struct { idx int - // expectedTableDefVersions are the known CN schema versions this + // expectedAutoIncrEpochs are the known CN allocator epochs this // transaction's user-table writes were planned against. A transaction can // legitimately use both the committed version and the version created by // its own ALTER TABLE. - expectedTableDefVersions map[uint32]struct{} + expectedAutoIncrEpochs map[uint32]struct{} + autoIncrementAlter bool } -func (tbl *txnTable) setExpectedTableDefVersion(version uint32) error { - if tbl.expectedTableDefVersions == nil { - tbl.expectedTableDefVersions = make(map[uint32]struct{}, 2) +func (tbl *txnTable) validateAutoIncrementDMLOrder() error { + if tbl.autoIncrementAlter { + if tbl.entry.ShouldRetryAutoIncrementAlter(tbl.store.txn.GetStartTS()) { + return moerr.NewTxnNeedRetryWithDefChangedNoCtx() + } + return nil + } + if len(tbl.expectedAutoIncrEpochs) > 0 { + tbl.entry.RecordKnownDMLPrepare(tbl.store.txn.GetPrepareTS()) + } + return nil +} + +func (tbl *txnTable) setExpectedAutoIncrEpoch(epoch uint32) error { + if tbl.expectedAutoIncrEpochs == nil { + tbl.expectedAutoIncrEpochs = make(map[uint32]struct{}, 2) } - tbl.expectedTableDefVersions[version] = struct{}{} + tbl.expectedAutoIncrEpochs[epoch] = struct{}{} return nil } -func (tbl *txnTable) validateTableDefVersion() error { - if len(tbl.expectedTableDefVersions) == 0 { +func (tbl *txnTable) validateAutoIncrEpoch() error { + if len(tbl.expectedAutoIncrEpochs) == 0 { return nil } @@ -151,15 +165,15 @@ func (tbl *txnTable) validateTableDefVersion() error { } } - baseVersion := uint32(0) - localVersion := uint32(0) - hasLocalVersion := false + baseEpoch := uint32(0) + localEpoch := uint32(0) + hasLocalEpoch := false tbl.entry.LoopChainLocked(func(node *catalog.MVCCNode[*catalog.TableMVCCNode]) bool { // A same-transaction ALTER is unordered with the transaction's DML. // Keep scanning for the committed base version as both are valid. if node.IsSameTxn(tbl.store.txn) { - localVersion = node.BaseNode.Schema.Version - hasLocalVersion = true + localEpoch = node.BaseNode.Schema.Extra.AutoIncrEpoch + hasLocalEpoch = true return true } if node.IsActive() || node.IsCommitting() || node.IsAborted() { @@ -171,13 +185,13 @@ func (tbl *txnTable) validateTableDefVersion() error { if nodePrepareTS.GT(&prepareTS) { return true } - baseVersion = node.BaseNode.Schema.Version + baseEpoch = node.BaseNode.Schema.Extra.AutoIncrEpoch return false }) tbl.entry.RUnlock() - for expected := range tbl.expectedTableDefVersions { - if expected != baseVersion && (!hasLocalVersion || expected != localVersion) { + for expected := range tbl.expectedAutoIncrEpochs { + if expected != baseEpoch && (!hasLocalEpoch || expected != localEpoch) { return moerr.NewTxnNeedRetryWithDefChangedNoCtx() } } @@ -1074,7 +1088,8 @@ func (tbl *txnTable) AlterTable(ctx context.Context, req *apipb.AlterTableReq) e apipb.AlterKind_RenameTable, apipb.AlterKind_UpdatePolicy, apipb.AlterKind_AddPartition, - apipb.AlterKind_RenameColumn: + apipb.AlterKind_RenameColumn, + apipb.AlterKind_UpdateAutoIncrement: case apipb.AlterKind_ReplaceDef: return nil default: @@ -1100,6 +1115,9 @@ func (tbl *txnTable) AlterTable(ctx context.Context, req *apipb.AlterTableReq) e return err } } + if req.Kind == apipb.AlterKind_UpdateAutoIncrement { + tbl.autoIncrementAlter = true + } tbl.dataTable.schema = newSchema // update new schema to txn local schema //TODO(aptend): handle written data in localobj, keep the batch aligned with the new schema @@ -1511,7 +1529,10 @@ func (tbl *txnTable) dumpCore(errMsg string) { } func (tbl *txnTable) PrepareCommit() (err error) { - if err = tbl.validateTableDefVersion(); err != nil { + if err = tbl.validateAutoIncrEpoch(); err != nil { + return err + } + if err = tbl.validateAutoIncrementDMLOrder(); err != nil { return err } nodeCount := len(tbl.txnEntries.entries) diff --git a/pkg/vm/engine/tae/txn/txnimpl/txn_test.go b/pkg/vm/engine/tae/txn/txnimpl/txn_test.go index e234b7d2ea82d..d8e71f7a2d329 100644 --- a/pkg/vm/engine/tae/txn/txnimpl/txn_test.go +++ b/pkg/vm/engine/tae/txn/txnimpl/txn_test.go @@ -45,6 +45,72 @@ const ( ModuleName = "TAETXN" ) +type noopReplayObserver struct{} + +func (noopReplayObserver) OnTimeStamp(types.TS) {} + +func newPreparingEpochTestTxn(t *testing.T, id string, start, prepare types.TS) *txnbase.Txn { + t.Helper() + txn := txnbase.NewTxn(nil, nil, []byte(id), start, types.TS{}) + txn.Lock() + assert.NoError(t, txn.ToPreparingLocked(prepare)) + txn.Unlock() + return txn +} + +func TestAutoIncrementAlterDetectsAcceptedDMLAfterSnapshot(t *testing.T) { + entry := catalog.MockTableEntryWithDB(nil, 42) + var wg sync.WaitGroup + for _, ts := range []types.TS{types.BuildTS(5, 0), types.BuildTS(3, 0), types.BuildTS(7, 0)} { + wg.Add(1) + go func() { + defer wg.Done() + entry.RecordKnownDMLPrepare(ts) + }() + } + wg.Wait() + assert.Equal(t, types.BuildTS(7, 0), entry.GetLatestKnownDMLPrepare()) + + unsafeTxn := newPreparingEpochTestTxn(t, "alter-retry", types.BuildTS(6, 0), types.BuildTS(8, 0)) + unsafe := &txnTable{store: &txnStore{txn: unsafeTxn}, entry: entry, autoIncrementAlter: true} + err := unsafe.validateAutoIncrementDMLOrder() + assert.True(t, moerr.IsMoErrCode(err, moerr.ErrTxnNeedRetryWithDefChanged), err) + + safeTxn := newPreparingEpochTestTxn(t, "alter-safe", types.BuildTS(7, 0), types.BuildTS(8, 0)) + safe := &txnTable{store: &txnStore{txn: safeTxn}, entry: entry, autoIncrementAlter: true} + assert.NoError(t, safe.validateAutoIncrementDMLOrder()) +} + +func TestReplayOnePCRebuildsAutoIncrementDMLWatermark(t *testing.T) { + c := catalog.MockCatalog(nil) + defer c.Close() + mgr := txnbase.NewTxnManager(catalog.MockTxnStoreFactory(c), catalog.MockTxnFactory(c), types.NewMockHLCClock(1)) + mgr.Start(context.Background()) + defer mgr.Stop() + + setupTxn, err := mgr.StartTxn(nil) + assert.NoError(t, err) + dbEntry, err := c.CreateDBEntry("replay_1pc", "", "", setupTxn) + assert.NoError(t, err) + tableEntry, err := dbEntry.CreateTableEntry(catalog.MockSchemaAll(3, 1), setupTxn, nil) + assert.NoError(t, err) + assert.NoError(t, setupTxn.Commit(context.Background())) + + startTS := types.BuildTS(10, 0) + prepareTS := types.BuildTS(11, 0) + commitTS := types.BuildTS(12, 0) + replayTxn := newPreparingEpochTestTxn(t, "replay-1pc", startTS, prepareTS) + assert.False(t, replayTxn.Is2PC()) + replayTxn.GetMemo().AddTable(dbEntry.ID, tableEntry.ID) + assert.NoError(t, replayTxn.SetCommitTS(commitTS)) + store := &replayTxnStore{Cmd: &txnbase.TxnCmd{ComposedCmd: txnbase.NewComposedCmd()}, Observer: noopReplayObserver{}, catalog: c} + + assert.NoError(t, store.prepareCommit(replayTxn)) + assert.True(t, tableEntry.ShouldRetryAutoIncrementAlter(startTS.Prev())) + assert.NoError(t, store.applyCommit(replayTxn)) + assert.Equal(t, commitTS, tableEntry.GetLatestKnownDMLPrepare()) +} + type waitingSchemaTxn struct { txnif.TxnReader prepareTS types.TS @@ -64,7 +130,7 @@ func (txn *waitingSchemaTxn) GetTxnState(wait bool) txnif.TxnState { return txnif.TxnStateCommitted } -func TestTableDefVersionFenceWaitsForEarlierSchemaPrepare(t *testing.T) { +func TestAutoIncrEpochFenceWaitsForEarlierSchemaPrepare(t *testing.T) { for _, tc := range []struct { name string rollback bool @@ -75,6 +141,7 @@ func TestTableDefVersionFenceWaitsForEarlierSchemaPrepare(t *testing.T) { t.Run(tc.name, func(t *testing.T) { schema := catalog.MockSchemaAll(3, 1) schema.Version = 7 + schema.Extra.AutoIncrEpoch = 7 entry := catalog.MockTableEntryWithDB(nil, 42) entry.CreateWithTSLocked(types.BuildTS(1, 0), &catalog.TableMVCCNode{ Schema: schema, @@ -89,7 +156,7 @@ func TestTableDefVersionFenceWaitsForEarlierSchemaPrepare(t *testing.T) { release: make(chan struct{}), } _, _, err := entry.AlterTable(context.Background(), alterTxn, - apipb.NewUpdateAutoIncrementReq(0, 42, 20)) + apipb.NewUpdateAutoIncrementReq(0, 42, 20, 8)) assert.NoError(t, err) dmlTxn := txnbase.NewTxn(nil, nil, []byte("dml"), types.BuildTS(2, 1), types.TS{}) @@ -97,13 +164,13 @@ func TestTableDefVersionFenceWaitsForEarlierSchemaPrepare(t *testing.T) { assert.NoError(t, dmlTxn.ToPreparingLocked(types.BuildTS(4, 0))) dmlTxn.Unlock() tbl := &txnTable{ - store: &txnStore{txn: dmlTxn}, - entry: entry, - expectedTableDefVersions: map[uint32]struct{}{7: {}}, + store: &txnStore{txn: dmlTxn}, + entry: entry, + expectedAutoIncrEpochs: map[uint32]struct{}{7: {}}, } result := make(chan error, 1) - go func() { result <- tbl.validateTableDefVersion() }() + go func() { result <- tbl.validateAutoIncrEpoch() }() select { case <-alterTxn.waited: case <-time.After(5 * time.Second): @@ -133,18 +200,19 @@ func TestTableDefVersionFenceWaitsForEarlierSchemaPrepare(t *testing.T) { } } -func TestTableDefVersionDependencyRecordsMultipleExpectations(t *testing.T) { +func TestAutoIncrEpochDependencyRecordsMultipleExpectations(t *testing.T) { tbl := new(txnTable) - assert.NoError(t, tbl.setExpectedTableDefVersion(0)) - assert.NoError(t, tbl.setExpectedTableDefVersion(7)) - assert.NoError(t, tbl.setExpectedTableDefVersion(7)) - assert.NoError(t, tbl.setExpectedTableDefVersion(8)) - assert.Equal(t, map[uint32]struct{}{0: {}, 7: {}, 8: {}}, tbl.expectedTableDefVersions) + assert.NoError(t, tbl.setExpectedAutoIncrEpoch(0)) + assert.NoError(t, tbl.setExpectedAutoIncrEpoch(7)) + assert.NoError(t, tbl.setExpectedAutoIncrEpoch(7)) + assert.NoError(t, tbl.setExpectedAutoIncrEpoch(8)) + assert.Equal(t, map[uint32]struct{}{0: {}, 7: {}, 8: {}}, tbl.expectedAutoIncrEpochs) } -func TestTableDefVersionFenceUsesPrepareOrderForCommittedSchema(t *testing.T) { +func TestAutoIncrEpochFenceUsesPrepareOrderForCommittedSchema(t *testing.T) { schema := catalog.MockSchemaAll(3, 1) schema.Version = 7 + schema.Extra.AutoIncrEpoch = 7 entry := catalog.MockTableEntryWithDB(nil, 42) entry.CreateWithTSLocked(types.BuildTS(1, 0), &catalog.TableMVCCNode{ Schema: schema, TombstoneSchema: catalog.GetTombstoneSchema(schema), @@ -158,7 +226,7 @@ func TestTableDefVersionFenceUsesPrepareOrderForCommittedSchema(t *testing.T) { release: make(chan struct{}), } _, _, err := entry.AlterTable(context.Background(), alterTxn, - apipb.NewUpdateAutoIncrementReq(0, 42, 20)) + apipb.NewUpdateAutoIncrementReq(0, 42, 20, 8)) assert.NoError(t, err) assert.NoError(t, entry.BaseEntryImpl.PrepareCommit()) assert.NoError(t, entry.BaseEntryImpl.ApplyCommit(alterTxn.GetID())) @@ -168,16 +236,17 @@ func TestTableDefVersionFenceUsesPrepareOrderForCommittedSchema(t *testing.T) { assert.NoError(t, dmlTxn.ToPreparingLocked(types.BuildTS(4, 0))) dmlTxn.Unlock() tbl := &txnTable{ - store: &txnStore{txn: dmlTxn}, - entry: entry, - expectedTableDefVersions: map[uint32]struct{}{7: {}}, + store: &txnStore{txn: dmlTxn}, + entry: entry, + expectedAutoIncrEpochs: map[uint32]struct{}{7: {}}, } - assert.NoError(t, tbl.validateTableDefVersion()) + assert.NoError(t, tbl.validateAutoIncrEpoch()) } -func TestTableDefVersionFenceRejectsMultipleVersionsWithoutLocalAlter(t *testing.T) { +func TestAutoIncrEpochFenceRejectsMultipleVersionsWithoutLocalAlter(t *testing.T) { schema := catalog.MockSchemaAll(3, 1) schema.Version = 7 + schema.Extra.AutoIncrEpoch = 7 entry := catalog.MockTableEntryWithDB(nil, 42) entry.CreateWithTSLocked(types.BuildTS(1, 0), &catalog.TableMVCCNode{ Schema: schema, TombstoneSchema: catalog.GetTombstoneSchema(schema), @@ -188,11 +257,11 @@ func TestTableDefVersionFenceRejectsMultipleVersionsWithoutLocalAlter(t *testing assert.NoError(t, dmlTxn.ToPreparingLocked(types.BuildTS(3, 0))) dmlTxn.Unlock() tbl := &txnTable{ - store: &txnStore{txn: dmlTxn}, - entry: entry, - expectedTableDefVersions: map[uint32]struct{}{7: {}, 8: {}}, + store: &txnStore{txn: dmlTxn}, + entry: entry, + expectedAutoIncrEpochs: map[uint32]struct{}{7: {}, 8: {}}, } - err := tbl.validateTableDefVersion() + err := tbl.validateAutoIncrEpoch() assert.True(t, moerr.IsMoErrCode(err, moerr.ErrTxnNeedRetryWithDefChanged), err) } diff --git a/pkg/vm/engine/types.go b/pkg/vm/engine/types.go index 7206d2f71bfca..f10a43b94793b 100644 --- a/pkg/vm/engine/types.go +++ b/pkg/vm/engine/types.go @@ -152,7 +152,9 @@ var PlanDefsToExeDefs = func(tableDef *plan.TableDef) ([]TableDef, *api.SchemaEx exeDefs = append(exeDefs, propDef) } extra := &api.SchemaExtra{ - FeatureFlag: tableDef.FeatureFlag, + FeatureFlag: tableDef.FeatureFlag, + AutoIncrOffset: tableDef.AutoIncrOffset, + AutoIncrEpoch: tableDef.AutoIncrEpoch, } propDef.Properties = append( propDef.Properties, diff --git a/proto/api.proto b/proto/api.proto index 85c84b97876e8..c94aa19733a44 100644 --- a/proto/api.proto +++ b/proto/api.proto @@ -244,11 +244,11 @@ message Entry { Batch bat = 7; // whether TN do the PK uniqueness check against txn's workspace or not. int32 pk_check_by_tn = 8; - // table definition version used by the CN when planning this write. - // Consult table_def_version_known because zero is a valid initial version. - uint32 table_def_version = 9; - // whether table_def_version was supplied by a version-aware CN. - bool table_def_version_known = 10; + // AUTO_INCREMENT epoch used by the CN when planning this write. + // Consult auto_incr_epoch_known because zero is a valid initial epoch. + uint32 auto_incr_epoch = 9; + // whether auto_incr_epoch was supplied by an epoch-aware CN. + bool auto_incr_epoch_known = 10; }; // There are two kinds of checkpoint: delta checkpoint and base checkpoint, @@ -301,6 +301,7 @@ enum AlterKind { AddPartition = 7; RenameColumn = 8; ReplaceDef = 9; + UpdateAutoIncrement = 10; } message AlterTablePolicy { @@ -345,6 +346,11 @@ message AlterTableDropColumn { uint32 sequence_num = 2; // used to double check } +message AlterTableAutoIncrement { + uint64 offset = 1; + uint32 epoch = 2; +} + message AlterTableReq { uint64 table_id = 1; uint64 db_id = 2; @@ -359,6 +365,7 @@ message AlterTableReq { AlterTablePolicy update_policy = 9; AlterTableRenameCol rename_col = 11; AlterTableReplaceDef replace_def = 12; + AlterTableAutoIncrement update_auto_increment = 13; } } @@ -390,6 +397,9 @@ message SchemaExtra { uint64 ParentTableID = 14; // mark if table is created by publication (CCPR), should skip merge bool FromPublication = 15; + uint64 auto_incr_offset = 16; + // Advances only when AUTO_INCREMENT allocation is reset. + uint32 auto_incr_epoch = 17; } // Int64Map mainly used in unit test diff --git a/proto/plan.proto b/proto/plan.proto index 7c667a4df255e..5547bb95925c7 100644 --- a/proto/plan.proto +++ b/proto/plan.proto @@ -453,6 +453,8 @@ message TableDef { uint64 FeatureFlag = 35; uint64 logical_id = 36; string original_name = 37; + // Persistent cache epoch for AUTO_INCREMENT allocation. + uint32 auto_incr_epoch = 38; } message TableFunction { From 3a14d52c7e3313c8481f621c8358887f2899cab4 Mon Sep 17 00:00:00 2001 From: VioletQwQ-0 <1659648118@qq.com> Date: Wed, 22 Jul 2026 16:32:55 +0800 Subject: [PATCH 4/6] chore: keep unrelated pipeline protobuf unchanged --- pkg/pb/pipeline/pipeline.pb.go | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/pkg/pb/pipeline/pipeline.pb.go b/pkg/pb/pipeline/pipeline.pb.go index 37b297535ee78..a39724262cfaf 100644 --- a/pkg/pb/pipeline/pipeline.pb.go +++ b/pkg/pb/pipeline/pipeline.pb.go @@ -243,7 +243,7 @@ type Message struct { } func (m *Message) Reset() { *m = Message{} } -func (m *Message) String() string { return proto.CompactTextString(m) } +func (m *Message) String() string { return messageString(m) } func (*Message) ProtoMessage() {} func (*Message) Descriptor() ([]byte, []int) { return fileDescriptor_7ac67a7adf3df9c7, []int{0} @@ -3226,7 +3226,7 @@ type IcebergDataFileTask struct { } func (m *IcebergDataFileTask) Reset() { *m = IcebergDataFileTask{} } -func (m *IcebergDataFileTask) String() string { return proto.CompactTextString(m) } +func (m *IcebergDataFileTask) String() string { return icebergDataFileTaskString(m) } func (*IcebergDataFileTask) ProtoMessage() {} func (*IcebergDataFileTask) Descriptor() ([]byte, []int) { return fileDescriptor_7ac67a7adf3df9c7, []int{32} @@ -3371,7 +3371,7 @@ type IcebergDeleteFileTask struct { } func (m *IcebergDeleteFileTask) Reset() { *m = IcebergDeleteFileTask{} } -func (m *IcebergDeleteFileTask) String() string { return proto.CompactTextString(m) } +func (m *IcebergDeleteFileTask) String() string { return icebergDeleteFileTaskString(m) } func (*IcebergDeleteFileTask) ProtoMessage() {} func (*IcebergDeleteFileTask) Descriptor() ([]byte, []int) { return fileDescriptor_7ac67a7adf3df9c7, []int{33} @@ -3822,7 +3822,7 @@ type ExternalScan struct { } func (m *ExternalScan) Reset() { *m = ExternalScan{} } -func (m *ExternalScan) String() string { return proto.CompactTextString(m) } +func (m *ExternalScan) String() string { return externalScanString(m) } func (*ExternalScan) ProtoMessage() {} func (*ExternalScan) Descriptor() ([]byte, []int) { return fileDescriptor_7ac67a7adf3df9c7, []int{37} @@ -4586,7 +4586,7 @@ type Instruction struct { } func (m *Instruction) Reset() { *m = Instruction{} } -func (m *Instruction) String() string { return proto.CompactTextString(m) } +func (m *Instruction) String() string { return instructionString(m) } func (*Instruction) ProtoMessage() {} func (*Instruction) Descriptor() ([]byte, []int) { return fileDescriptor_7ac67a7adf3df9c7, []int{45} @@ -5720,7 +5720,7 @@ type Pipeline struct { } func (m *Pipeline) Reset() { *m = Pipeline{} } -func (m *Pipeline) String() string { return proto.CompactTextString(m) } +func (m *Pipeline) String() string { return pipelineString(m) } func (*Pipeline) ProtoMessage() {} func (*Pipeline) Descriptor() ([]byte, []int) { return fileDescriptor_7ac67a7adf3df9c7, []int{54} From 3190c7d36d620c8ffe9f9830c70a9b6dc782cf03 Mon Sep 17 00:00:00 2001 From: VioletQwQ-0 <1659648118@qq.com> Date: Wed, 22 Jul 2026 16:42:43 +0800 Subject: [PATCH 5/6] fix: enforce monotonic auto increment epochs Co-authored-by: ULookup --- pkg/pb/api/api.go | 6 +-- pkg/vm/engine/disttae/txn_table.go | 17 +++++++++ pkg/vm/engine/disttae/txn_test.go | 7 ++++ pkg/vm/engine/tae/catalog/schema.go | 9 +++++ pkg/vm/engine/tae/catalog/table_test.go | 17 +++++++++ pkg/vm/engine/tae/db/test/db_test.go | 46 +++++++++++------------ pkg/vm/engine/tae/rpc/rpc_test.go | 2 +- pkg/vm/engine/tae/txn/txnimpl/txn_test.go | 2 +- 8 files changed, 76 insertions(+), 30 deletions(-) diff --git a/pkg/pb/api/api.go b/pkg/pb/api/api.go index 2f590d4259ec2..cc02b9100d8f9 100644 --- a/pkg/pb/api/api.go +++ b/pkg/pb/api/api.go @@ -81,11 +81,7 @@ func CloneExtra(info *SchemaExtra) *SchemaExtra { } } -func NewUpdateAutoIncrementReq(did, tid, offset uint64, epochs ...uint32) *AlterTableReq { - epoch := uint32(1) - if len(epochs) > 0 { - epoch = epochs[0] - } +func NewUpdateAutoIncrementReq(did, tid, offset uint64, epoch uint32) *AlterTableReq { return &AlterTableReq{ DbId: did, TableId: tid, diff --git a/pkg/vm/engine/disttae/txn_table.go b/pkg/vm/engine/disttae/txn_table.go index edfa27f2dce86..9c8a9ce51338a 100644 --- a/pkg/vm/engine/disttae/txn_table.go +++ b/pkg/vm/engine/disttae/txn_table.go @@ -18,6 +18,7 @@ import ( "bytes" "context" "fmt" + "math" "slices" "strings" "sync" @@ -1640,11 +1641,27 @@ func (tbl *txnTable) isCreatedInTxn(_ context.Context) (bool, error) { } +func validateAutoIncrEpochAdvance(current uint32, resets uint64) error { + if uint64(current)+resets > math.MaxUint32 { + return moerr.NewInternalErrorNoCtx("AUTO_INCREMENT epoch exhausted") + } + return nil +} + func (tbl *txnTable) AlterTable(ctx context.Context, c *engine.ConstraintDef, reqs []*api.AlterTableReq) error { // AlterTale Inplace do not touch columns, we don't use NextSeqNum at the moment. if tbl.db.op.IsSnapOp() { return moerr.NewInternalErrorNoCtx("cannot alter table in snapshot operation") } + var autoIncrResetCount uint64 + for _, req := range reqs { + if req.GetKind() == api.AlterKind_UpdateAutoIncrement { + autoIncrResetCount++ + } + } + if err := validateAutoIncrEpochAdvance(tbl.extraInfo.AutoIncrEpoch, autoIncrResetCount); err != nil { + return err + } var err error var checkCstr []byte diff --git a/pkg/vm/engine/disttae/txn_test.go b/pkg/vm/engine/disttae/txn_test.go index 145636a0fc4e8..2c6f41a3369cf 100644 --- a/pkg/vm/engine/disttae/txn_test.go +++ b/pkg/vm/engine/disttae/txn_test.go @@ -44,6 +44,13 @@ import ( "github.com/stretchr/testify/require" ) +func TestValidateAutoIncrEpochAdvance(t *testing.T) { + require.NoError(t, validateAutoIncrEpochAdvance(0, 0)) + require.NoError(t, validateAutoIncrEpochAdvance(math.MaxUint32-1, 1)) + require.Error(t, validateAutoIncrEpochAdvance(math.MaxUint32, 1)) + require.Error(t, validateAutoIncrEpochAdvance(math.MaxUint32-1, 2)) +} + func TestPrecommitEntryCarriesAutoIncrEpoch(t *testing.T) { proc := testutil.NewProc(t) bat := newDeleteBatchForTest(t, proc, []int64{1}) diff --git a/pkg/vm/engine/tae/catalog/schema.go b/pkg/vm/engine/tae/catalog/schema.go index d458543dbb2e4..61f223cdbeb2d 100644 --- a/pkg/vm/engine/tae/catalog/schema.go +++ b/pkg/vm/engine/tae/catalog/schema.go @@ -20,6 +20,7 @@ import ( "encoding/json" "fmt" "io" + "math" "slices" "strings" "time" @@ -205,6 +206,14 @@ func (s *Schema) ApplyAlterTable(req *apipb.AlterTableReq) error { case apipb.AlterKind_UpdateComment: s.Comment = req.GetUpdateComment().GetComment() case apipb.AlterKind_UpdateAutoIncrement: + if s.Extra.AutoIncrEpoch == math.MaxUint32 || + req.GetUpdateAutoIncrement().GetEpoch() != s.Extra.AutoIncrEpoch+1 { + return moerr.NewInternalErrorNoCtxf( + "invalid AUTO_INCREMENT epoch transition %d -> %d", + s.Extra.AutoIncrEpoch, + req.GetUpdateAutoIncrement().GetEpoch(), + ) + } s.Extra.AutoIncrOffset = req.GetUpdateAutoIncrement().GetOffset() s.Extra.AutoIncrEpoch = req.GetUpdateAutoIncrement().GetEpoch() case apipb.AlterKind_RenameColumn: diff --git a/pkg/vm/engine/tae/catalog/table_test.go b/pkg/vm/engine/tae/catalog/table_test.go index 859622b736cba..86a9fee1cce9e 100644 --- a/pkg/vm/engine/tae/catalog/table_test.go +++ b/pkg/vm/engine/tae/catalog/table_test.go @@ -15,6 +15,7 @@ package catalog import ( + "math" "testing" "github.com/stretchr/testify/assert" @@ -22,6 +23,7 @@ import ( "github.com/matrixorigin/matrixone/pkg/container/types" "github.com/matrixorigin/matrixone/pkg/objectio" + apipb "github.com/matrixorigin/matrixone/pkg/pb/api" "github.com/matrixorigin/matrixone/pkg/vm/engine/tae/common" "github.com/matrixorigin/matrixone/pkg/vm/engine/tae/txn/txnbase" ) @@ -68,6 +70,21 @@ func TestReplayedPreparedDMLFenceLifecycle(t *testing.T) { require.False(t, table.ShouldRetryAutoIncrementAlter(types.BuildTS(22, 0))) } +func TestAutoIncrementEpochTransition(t *testing.T) { + schema := MockSchemaAll(3, 1) + require.Error(t, schema.ApplyAlterTable(apipb.NewUpdateAutoIncrementReq(0, 1, 10, 2))) + require.Equal(t, uint32(0), schema.Extra.AutoIncrEpoch) + + require.NoError(t, schema.ApplyAlterTable(apipb.NewUpdateAutoIncrementReq(0, 1, 10, 1))) + require.Equal(t, uint32(1), schema.Extra.AutoIncrEpoch) + require.NoError(t, schema.ApplyAlterTable(apipb.NewUpdateConstraintReq(0, 1, "constraint"))) + require.Equal(t, uint32(1), schema.Extra.AutoIncrEpoch) + + schema.Extra.AutoIncrEpoch = math.MaxUint32 + require.Error(t, schema.ApplyAlterTable(apipb.NewUpdateAutoIncrementReq(0, 1, 20, 0))) + require.Equal(t, uint32(math.MaxUint32), schema.Extra.AutoIncrEpoch) +} + func TestObjectList(t *testing.T) { ll := NewObjectList(false) nobjid := objectio.NewObjectid() diff --git a/pkg/vm/engine/tae/db/test/db_test.go b/pkg/vm/engine/tae/db/test/db_test.go index 5d3e24fc36254..9b9c7a63c3673 100644 --- a/pkg/vm/engine/tae/db/test/db_test.go +++ b/pkg/vm/engine/tae/db/test/db_test.go @@ -6557,7 +6557,7 @@ func TestAlterAutoIncrementSchemaCommitAndRollback(t *testing.T) { txn, rel := testutil.GetDefaultRelation(t, tae, schema.Name) initial := rel.Schema(false).(*catalog.Schema) require.Equal(t, uint64(10), initial.Extra.AutoIncrOffset) - require.NoError(t, rel.AlterTable(ctx, api.NewUpdateAutoIncrementReq(0, rel.ID(), 99))) + require.NoError(t, rel.AlterTable(ctx, api.NewUpdateAutoIncrementReq(0, rel.ID(), 99, 1))) altered := rel.Schema(false).(*catalog.Schema) require.Equal(t, initial.Version+1, altered.Version) require.Equal(t, uint64(99), altered.Extra.AutoIncrOffset) @@ -6588,7 +6588,7 @@ type autoIncrEpochSetter interface { SetAutoIncrEpoch(uint32) error } -func waitTableVersionBarrier(t *testing.T, ch <-chan struct{}, name string) { +func waitAutoIncrEpochBarrier(t *testing.T, ch <-chan struct{}, name string) { t.Helper() select { case <-ch: @@ -6602,14 +6602,14 @@ func TestAutoIncrEpochCommitFence(t *testing.T) { testutils.EnsureNoLeak(t) ctx := context.Background() - newVersionedTable := func(t *testing.T) (*db.DB, *catalog.Schema, uint32) { + newEpochTable := func(t *testing.T) (*db.DB, *catalog.Schema, uint32) { t.Helper() tae := testutil.InitTestDB(ctx, ModuleName, t, config.WithLongScanAndCKPOpts(nil)) schema := catalog.MockSchemaAll(3, 1) testutil.CreateRelation(t, tae, testutil.DefaultTestDB, schema, true) txn, rel := testutil.GetDefaultRelation(t, tae, schema.Name) - require.NoError(t, rel.AlterTable(ctx, api.NewUpdateAutoIncrementReq(0, rel.ID(), 10))) + require.NoError(t, rel.AlterTable(ctx, api.NewUpdateAutoIncrementReq(0, rel.ID(), 10, 1))) require.NoError(t, txn.Commit(ctx)) txn, rel = testutil.GetDefaultRelation(t, tae, schema.Name) @@ -6619,7 +6619,7 @@ func TestAutoIncrEpochCommitFence(t *testing.T) { return tae, schema, version } - appendWithVersion := func(t *testing.T, tae *db.DB, schema *catalog.Schema, version uint32) txnif.AsyncTxn { + appendWithEpoch := func(t *testing.T, tae *db.DB, schema *catalog.Schema, version uint32) txnif.AsyncTxn { t.Helper() txn, rel := testutil.GetDefaultRelation(t, tae, schema.Name) require.NoError(t, rel.(autoIncrEpochSetter).SetAutoIncrEpoch(version)) @@ -6634,10 +6634,10 @@ func TestAutoIncrEpochCommitFence(t *testing.T) { defer tae.Close() schema := catalog.MockSchemaAll(3, 1) testutil.CreateRelation(t, tae, testutil.DefaultTestDB, schema, true) - dmlTxn := appendWithVersion(t, tae, schema, 0) + dmlTxn := appendWithEpoch(t, tae, schema, 0) alterTxn, alterRel := testutil.GetDefaultRelation(t, tae, schema.Name) - require.NoError(t, alterRel.AlterTable(ctx, api.NewUpdateAutoIncrementReq(0, alterRel.ID(), 10))) + require.NoError(t, alterRel.AlterTable(ctx, api.NewUpdateAutoIncrementReq(0, alterRel.ID(), 10, 1))) require.NoError(t, alterTxn.Commit(ctx)) err := dmlTxn.Commit(ctx) require.True(t, moerr.IsMoErrCode(err, moerr.ErrTxnNeedRetryWithDefChanged), err) @@ -6653,20 +6653,20 @@ func TestAutoIncrEpochCommitFence(t *testing.T) { require.NoError(t, unknownTxn.MockIncWriteCnt()) alterTxn, alterRel := testutil.GetDefaultRelation(t, tae, schema.Name) - require.NoError(t, alterRel.AlterTable(ctx, api.NewUpdateAutoIncrementReq(0, alterRel.ID(), 10))) + require.NoError(t, alterRel.AlterTable(ctx, api.NewUpdateAutoIncrementReq(0, alterRel.ID(), 10, 1))) require.NoError(t, alterTxn.Commit(ctx)) err := unknownTxn.Commit(ctx) require.True(t, moerr.IsMoErrCode(err, moerr.ErrTxnNeedRetryWithDefChanged), err) }) t.Run("matching version", func(t *testing.T) { - tae, schema, version := newVersionedTable(t) + tae, schema, version := newEpochTable(t) defer tae.Close() - require.NoError(t, appendWithVersion(t, tae, schema, version).Commit(ctx)) + require.NoError(t, appendWithEpoch(t, tae, schema, version).Commit(ctx)) }) t.Run("same txn dml then alter", func(t *testing.T) { - tae, schema, version := newVersionedTable(t) + tae, schema, version := newEpochTable(t) defer tae.Close() txn, rel := testutil.GetDefaultRelation(t, tae, schema.Name) require.NoError(t, rel.(autoIncrEpochSetter).SetAutoIncrEpoch(version)) @@ -6680,7 +6680,7 @@ func TestAutoIncrEpochCommitFence(t *testing.T) { }) t.Run("same txn alter then dml", func(t *testing.T) { - tae, schema, version := newVersionedTable(t) + tae, schema, version := newEpochTable(t) defer tae.Close() txn, rel := testutil.GetDefaultRelation(t, tae, schema.Name) require.NoError(t, rel.AlterTable(ctx, api.NewUpdateAutoIncrementReq(0, rel.ID(), 20, version+1))) @@ -6696,7 +6696,7 @@ func TestAutoIncrEpochCommitFence(t *testing.T) { }) t.Run("same txn dml alter dml", func(t *testing.T) { - tae, schema, version := newVersionedTable(t) + tae, schema, version := newEpochTable(t) defer tae.Close() txn, rel := testutil.GetDefaultRelation(t, tae, schema.Name) require.NoError(t, rel.(autoIncrEpochSetter).SetAutoIncrEpoch(version)) @@ -6718,9 +6718,9 @@ func TestAutoIncrEpochCommitFence(t *testing.T) { }) t.Run("committed newer schema retries", func(t *testing.T) { - tae, schema, version := newVersionedTable(t) + tae, schema, version := newEpochTable(t) defer tae.Close() - dmlTxn := appendWithVersion(t, tae, schema, version) + dmlTxn := appendWithEpoch(t, tae, schema, version) alterTxn, alterRel := testutil.GetDefaultRelation(t, tae, schema.Name) require.NoError(t, alterRel.AlterTable(ctx, api.NewUpdateAutoIncrementReq(0, alterRel.ID(), 20, version+1))) @@ -6731,9 +6731,9 @@ func TestAutoIncrEpochCommitFence(t *testing.T) { }) t.Run("alter prepared first is ordered before dml", func(t *testing.T) { - tae, schema, version := newVersionedTable(t) + tae, schema, version := newEpochTable(t) defer tae.Close() - dmlTxn := appendWithVersion(t, tae, schema, version) + dmlTxn := appendWithEpoch(t, tae, schema, version) alterTxn, alterRel := testutil.GetDefaultRelation(t, tae, schema.Name) require.NoError(t, alterRel.AlterTable(ctx, api.NewUpdateAutoIncrementReq(0, alterRel.ID(), 20, version+1))) @@ -6745,7 +6745,7 @@ func TestAutoIncrEpochCommitFence(t *testing.T) { }) alterResult := make(chan error, 1) go func() { alterResult <- alterTxn.Commit(ctx) }() - waitTableVersionBarrier(t, alterPrepared, "ALTER prepare") + waitAutoIncrEpochBarrier(t, alterPrepared, "ALTER prepare") dmlStarted := make(chan struct{}) dmlResult := make(chan error, 1) @@ -6753,7 +6753,7 @@ func TestAutoIncrEpochCommitFence(t *testing.T) { close(dmlStarted) dmlResult <- dmlTxn.Commit(ctx) }() - waitTableVersionBarrier(t, dmlStarted, "DML commit start") + waitAutoIncrEpochBarrier(t, dmlStarted, "DML commit start") close(releaseAlter) require.NoError(t, <-alterResult) @@ -6762,9 +6762,9 @@ func TestAutoIncrEpochCommitFence(t *testing.T) { }) t.Run("dml prepared first forces alter retry", func(t *testing.T) { - tae, schema, version := newVersionedTable(t) + tae, schema, version := newEpochTable(t) defer tae.Close() - dmlTxn := appendWithVersion(t, tae, schema, version) + dmlTxn := appendWithEpoch(t, tae, schema, version) dmlPrepared, releaseDML := make(chan struct{}), make(chan struct{}) dmlTxn.SetPrepareCommitFn(func(txn txnif.AsyncTxn) error { @@ -6774,7 +6774,7 @@ func TestAutoIncrEpochCommitFence(t *testing.T) { }) dmlResult := make(chan error, 1) go func() { dmlResult <- dmlTxn.Commit(ctx) }() - waitTableVersionBarrier(t, dmlPrepared, "DML prepare") + waitAutoIncrEpochBarrier(t, dmlPrepared, "DML prepare") alterTxn, alterRel := testutil.GetDefaultRelation(t, tae, schema.Name) require.NoError(t, alterRel.AlterTable(ctx, api.NewUpdateAutoIncrementReq(0, alterRel.ID(), 20, version+1))) @@ -6784,7 +6784,7 @@ func TestAutoIncrEpochCommitFence(t *testing.T) { close(alterStarted) alterResult <- alterTxn.Commit(ctx) }() - waitTableVersionBarrier(t, alterStarted, "ALTER commit start") + waitAutoIncrEpochBarrier(t, alterStarted, "ALTER commit start") close(releaseDML) require.NoError(t, <-dmlResult) diff --git a/pkg/vm/engine/tae/rpc/rpc_test.go b/pkg/vm/engine/tae/rpc/rpc_test.go index 337ad1102caf8..1b16641ce1d2b 100644 --- a/pkg/vm/engine/tae/rpc/rpc_test.go +++ b/pkg/vm/engine/tae/rpc/rpc_test.go @@ -61,7 +61,7 @@ func TestAutoIncrEpochFenceIsModeIndependent(t *testing.T) { databaseID := createdRel.GetMeta().(*catalog.TableEntry).GetDB().ID alterTxn, alterRel := testutil.GetDefaultRelation(t, h.db, schema.Name) - require.NoError(t, alterRel.AlterTable(ctx, api.NewUpdateAutoIncrementReq(0, tableID, 10))) + require.NoError(t, alterRel.AlterTable(ctx, api.NewUpdateAutoIncrementReq(0, tableID, 10, 1))) require.NoError(t, alterTxn.Commit(ctx)) insertBatch := catalog.MockBatch(schema, 1) diff --git a/pkg/vm/engine/tae/txn/txnimpl/txn_test.go b/pkg/vm/engine/tae/txn/txnimpl/txn_test.go index d8e71f7a2d329..7cc965886d3c0 100644 --- a/pkg/vm/engine/tae/txn/txnimpl/txn_test.go +++ b/pkg/vm/engine/tae/txn/txnimpl/txn_test.go @@ -243,7 +243,7 @@ func TestAutoIncrEpochFenceUsesPrepareOrderForCommittedSchema(t *testing.T) { assert.NoError(t, tbl.validateAutoIncrEpoch()) } -func TestAutoIncrEpochFenceRejectsMultipleVersionsWithoutLocalAlter(t *testing.T) { +func TestAutoIncrEpochFenceRejectsMultipleEpochsWithoutLocalAlter(t *testing.T) { schema := catalog.MockSchemaAll(3, 1) schema.Version = 7 schema.Extra.AutoIncrEpoch = 7 From 0ebd1e78549bebbbf715dd688ad322ef95588176 Mon Sep 17 00:00:00 2001 From: VioletQwQ-0 <1659648118@qq.com> Date: Wed, 22 Jul 2026 16:44:25 +0800 Subject: [PATCH 6/6] test: close epoch fence boundary cases Co-authored-by: ULookup --- pkg/vm/engine/tae/txn/txnimpl/txn_test.go | 30 +++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/pkg/vm/engine/tae/txn/txnimpl/txn_test.go b/pkg/vm/engine/tae/txn/txnimpl/txn_test.go index 7cc965886d3c0..b2ddaba4aa158 100644 --- a/pkg/vm/engine/tae/txn/txnimpl/txn_test.go +++ b/pkg/vm/engine/tae/txn/txnimpl/txn_test.go @@ -111,6 +111,36 @@ func TestReplayOnePCRebuildsAutoIncrementDMLWatermark(t *testing.T) { assert.Equal(t, commitTS, tableEntry.GetLatestKnownDMLPrepare()) } +func TestReplayPreparedRollbackReleasesAutoIncrementFence(t *testing.T) { + c := catalog.MockCatalog(nil) + defer c.Close() + mgr := txnbase.NewTxnManager(catalog.MockTxnStoreFactory(c), catalog.MockTxnFactory(c), types.NewMockHLCClock(1)) + mgr.Start(context.Background()) + defer mgr.Stop() + + setupTxn, err := mgr.StartTxn(nil) + assert.NoError(t, err) + dbEntry, err := c.CreateDBEntry("replay_rollback", "", "", setupTxn) + assert.NoError(t, err) + tableEntry, err := dbEntry.CreateTableEntry(catalog.MockSchemaAll(3, 1), setupTxn, nil) + assert.NoError(t, err) + assert.NoError(t, setupTxn.Commit(context.Background())) + + startTS := types.BuildTS(10, 0) + replayTxn := newPreparingEpochTestTxn(t, "replay-2pc", startTS, types.BuildTS(11, 0)) + assert.NoError(t, replayTxn.SetParticipants([]uint64{1, 2})) + assert.True(t, replayTxn.Is2PC()) + replayTxn.GetMemo().AddTable(dbEntry.ID, tableEntry.ID) + store := &replayTxnStore{Cmd: &txnbase.TxnCmd{ComposedCmd: txnbase.NewComposedCmd()}, Observer: noopReplayObserver{}, catalog: c} + + assert.NoError(t, store.prepareCommit(replayTxn)) + assert.True(t, tableEntry.ShouldRetryAutoIncrementAlter(startTS)) + assert.NoError(t, store.applyRollback(replayTxn)) + assert.False(t, tableEntry.ShouldRetryAutoIncrementAlter(startTS)) + watermark := tableEntry.GetLatestKnownDMLPrepare() + assert.True(t, watermark.IsEmpty()) +} + type waitingSchemaTxn struct { txnif.TxnReader prepareTS types.TS