From 4e34e6fe61553e89ed7d8249cacd286b145d971e Mon Sep 17 00:00:00 2001 From: Maddiaa <47148561+Maddiaa0@users.noreply.github.com> Date: Thu, 27 Jul 2023 05:23:26 -0600 Subject: [PATCH] feat(blocks_tree): add blocks tree information to blocks (#1189) * feat: add blocks tree data to l2 block * feat: use constants to represent offsets * chore: forge fmt * fix: linter * fix: stub circuit output for the meantime * fix: update constant names * fix: calc constants rather than hardcoding where possible * hello darkness yada yada --- l1-contracts/src/core/libraries/Constants.sol | 10 +- l1-contracts/src/core/libraries/Decoder.sol | 114 ++++++++++-------- l1-contracts/test/Decoder.t.sol | 18 +-- .../src/integration_l1_publisher.test.ts | 6 +- .../block_builder/solo_block_builder.test.ts | 2 + .../src/block_builder/solo_block_builder.ts | 5 +- yarn-project/types/src/l2_block.ts | 34 +++++- .../server_world_state_synchroniser.test.ts | 2 + 8 files changed, 124 insertions(+), 67 deletions(-) diff --git a/l1-contracts/src/core/libraries/Constants.sol b/l1-contracts/src/core/libraries/Constants.sol index 2784a5d9e88..c86fb7d0ec0 100644 --- a/l1-contracts/src/core/libraries/Constants.sol +++ b/l1-contracts/src/core/libraries/Constants.sol @@ -14,10 +14,10 @@ library Constants { // Constants used for decoding rollup blocks // TODO(962): Make this constant consistent across the codebase. - uint256 internal constant COMMITMENTS_PER_KERNEL = 16; - uint256 internal constant NULLIFIERS_PER_KERNEL = 16; - uint256 internal constant PUBLIC_DATA_WRITES_PER_KERNEL = 4; - uint256 internal constant CONTRACTS_PER_KERNEL = 1; - uint256 internal constant L2_TO_L1_MSGS_PER_KERNEL = 2; + uint256 internal constant COMMITMENTS_PER_TX = 16; + uint256 internal constant NULLIFIERS_PER_TX = 16; + uint256 internal constant PUBLIC_DATA_WRITES_PER_TX = 4; + uint256 internal constant CONTRACTS_PER_TX = 1; + uint256 internal constant L2_TO_L1_MSGS_PER_TX = 2; uint256 internal constant L1_TO_L2_MSGS_PER_ROLLUP = 16; } diff --git a/l1-contracts/src/core/libraries/Decoder.sol b/l1-contracts/src/core/libraries/Decoder.sol index 2c4bc324ca3..1b3690476a9 100644 --- a/l1-contracts/src/core/libraries/Decoder.sol +++ b/l1-contracts/src/core/libraries/Decoder.sol @@ -39,34 +39,37 @@ import {Hash} from "@aztec/core/libraries/Hash.sol"; * | 0x0174 | 0x04 | startL1ToL2MessagesTreeSnapshot.nextAvailableLeafIndex * | 0x0178 | 0x20 | startTreeOfHistoricL1ToL2MessagesTreeRootsSnapshot.root * | 0x0198 | 0x04 | startTreeOfHistoricL1ToL2MessagesTreeRootsSnapshot.nextAvailableLeafIndex - * | 0x019c | 0x20 | endPrivateDataTreeSnapshot.root - * | 0x01bc | 0x04 | endPrivateDataTreeSnapshot.nextAvailableLeafIndex - * | 0x01c0 | 0x20 | endNullifierTreeSnapshot.root - * | 0x01e0 | 0x04 | endNullifierTreeSnapshot.nextAvailableLeafIndex - * | 0x01e4 | 0x20 | endContractTreeSnapshot.root - * | 0x0204 | 0x04 | endContractTreeSnapshot.nextAvailableLeafIndex - * | 0x0208 | 0x20 | endTreeOfHistoricPrivateDataTreeRootsSnapshot.root - * | 0x0228 | 0x04 | endTreeOfHistoricPrivateDataTreeRootsSnapshot.nextAvailableLeafIndex - * | 0x022c | 0x20 | endTreeOfHistoricContractTreeRootsSnapshot.root - * | 0x024c | 0x04 | endTreeOfHistoricContractTreeRootsSnapshot.nextAvailableLeafIndex - * | 0x0250 | 0x20 | endPublicDataTreeRoot - * | 0x0270 | 0x20 | endL1ToL2MessagesTreeSnapshot.root - * | 0x0290 | 0x04 | endL1ToL2MessagesTreeSnapshot.nextAvailableLeafIndex - * | 0x0294 | 0x20 | endTreeOfHistoricL1ToL2MessagesTreeRootsSnapshot.root - * | 0x02b4 | 0x04 | endTreeOfHistoricL1ToL2MessagesTreeRootsSnapshot.nextAvailableLeafIndex - * | 0x02b8 | 0x04 | len(newCommitments) denoted a - * | 0x02bc | a * 0x20 | newCommitments (each element 32 bytes) - * | 0x02bc + a * 0x20 | 0x04 | len(newNullifiers) denoted b - * | 0x02c0 + a * 0x20 | b * 0x20 | newNullifiers (each element 32 bytes) - * | 0x02c0 + (a + b) * 0x20 | 0x04 | len(newPublicDataWrites) denoted c - * | 0x02c4 + (a + b) * 0x20 | c * 0x40 | newPublicDataWrites (each element 64 bytes) - * | 0x02c4 + (a + b) * 0x20 + c * 0x40 | 0x04 | len(newL2ToL1msgs) denoted d - * | 0x02c8 + (a + b) * 0x20 + c * 0x40 | d * 0x20 | newL2ToL1msgs (each element 32 bytes) - * | 0x02c8 + (a + b + d) * 0x20 + c * 0x40 | 0x04 | len(newContracts) denoted e - * | 0x02cc + (a + b + d) * 0x20 + c * 0x40 | e * 0x20 | newContracts (each element 32 bytes) - * | 0x02cc + (a + b + d) * 0x20 + c * 0x40 + e * 0x20 | e * 0x34 | newContractData (each element 52 bytes) - * | 0x02cc + (a + b + d) * 0x20 + c * 0x40 + e * 0x54 | 0x04 | len(l1ToL2Messages) denoted f - * | K := 0x02cc + (a + b + d) * 0x20 + c * 0x40 + e * 0x54 | f * 0x20 | l1ToL2Messages (each element 32 bytes) + * | 0x019c | 0x20 | startBlocksTreeSnapshot.root + * | 0x01bc | 0x04 | startBlocksTreeSnapshot.nextAvailableLeafIndex + * | 0x01c0 | 0x20 | endPrivateDataTreeSnapshot.root + * | 0x01e0 | 0x04 | endPrivateDataTreeSnapshot.nextAvailableLeafIndex + * | 0x01e4 | 0x20 | endNullifierTreeSnapshot.root + * | 0x0204 | 0x04 | endNullifierTreeSnapshot.nextAvailableLeafIndex + * | 0x0208 | 0x20 | endContractTreeSnapshot.root + * | 0x0228 | 0x04 | endContractTreeSnapshot.nextAvailableLeafIndex + * | 0x022c | 0x20 | endTreeOfHistoricPrivateDataTreeRootsSnapshot.root + * | 0x024c | 0x04 | endTreeOfHistoricPrivateDataTreeRootsSnapshot.nextAvailableLeafIndex + * | 0x0250 | 0x20 | endTreeOfHistoricContractTreeRootsSnapshot.root + * | 0x0270 | 0x04 | endTreeOfHistoricContractTreeRootsSnapshot.nextAvailableLeafIndex + * | 0x0274 | 0x20 | endPublicDataTreeRoot + * | 0x0294 | 0x20 | endL1ToL2MessagesTreeSnapshot.root + * | 0x02b4 | 0x04 | endL1ToL2MessagesTreeSnapshot.nextAvailableLeafIndex + * | 0x0300 | 0x20 | endTreeOfHistoricL1ToL2MessagesTreeRootsSnapshot.root + * | 0x02d8 | 0x04 | endTreeOfHistoricL1ToL2MessagesTreeRootsSnapshot.nextAvailableLeafIndex + * | 0x02dc | 0x20 | endBlocksTreeSnapshot.root + * | 0x02fc | 0x04 | endBlocksTreeSnapshot.nextAvailableLeafIndex + * | 0x0300 | a * 0x20 | newCommitments (each element 32 bytes) + * | 0x0300 + a * 0x20 | 0x04 | len(newNullifiers) denoted b + * | 0x0304 + a * 0x20 | b * 0x20 | newNullifiers (each element 32 bytes) + * | 0x0304 + (a + b) * 0x20 | 0x04 | len(newPublicDataWrites) denoted c + * | 0x0308 + (a + b) * 0x20 | c * 0x40 | newPublicDataWrites (each element 64 bytes) + * | 0x0308 + (a + b) * 0x20 + c * 0x40 | 0x04 | len(newL2ToL1msgs) denoted d + * | 0x030c + (a + b) * 0x20 + c * 0x40 | d * 0x20 | newL2ToL1msgs (each element 32 bytes) + * | 0x030c + (a + b + d) * 0x20 + c * 0x40 | 0x04 | len(newContracts) denoted e + * | 0x0310 + (a + b + d) * 0x20 + c * 0x40 | e * 0x20 | newContracts (each element 32 bytes) + * | 0x0310 + (a + b + d) * 0x20 + c * 0x40 + e * 0x20 | e * 0x34 | newContractData (each element 52 bytes) + * | 0x0310 + (a + b + d) * 0x20 + c * 0x40 + e * 0x54 | 0x04 | len(l1ToL2Messages) denoted f + * | K := 0x0310 + (a + b + d) * 0x20 + c * 0x40 + e * 0x54 | f * 0x20 | l1ToL2Messages (each element 32 bytes) * | K + f * 0x20 | 0x04 | byteLen(newEncryptedLogs) denoted g * | K + f * 0x20 + 0x04 | g | newEncryptedLogs * | K + f * 0x20 + 0x04 + g | 0x04 | byteLen(newUnencryptedLogs) denoted h @@ -108,6 +111,21 @@ library Decoder { bytes32 unencryptedLogsHashKernel2; } + // DECODING OFFSET CONSTANTS + // Where the start of trees metadata begins in the block + uint256 private constant START_TREES_BLOCK_HEADER_OFFSET = 0x80; + + // The size of the block header elements + uint256 private constant TREES_BLOCK_HEADER_SIZE = 0x140; + + // Where the end of trees metadata begns in the block + uint256 private constant END_TREES_BLOCK_HEADER_OFFSET = + START_TREES_BLOCK_HEADER_OFFSET + TREES_BLOCK_HEADER_SIZE; + + // Where the metadata ends and the block data begins. + // This is really (START_TREES_BLOCK_HEADER_OFFSET + 2 * TREES_BLOCK_HEADER_SIZE) but assembly doesnt allow comptime constant use + uint256 private constant BLOCK_HEADER_OFFSET = 0x0300; + /** * @notice Decodes the inputs and computes values to check state against * @param _l2Block - The L2 block calldata. @@ -133,8 +151,8 @@ library Decoder { l2BlockNumber = getL2BlockNumber(_l2Block); // Note, for startStateHash to match the storage, the l2 block number must be new - 1. // Only jumping 1 block at a time. - startStateHash = computeStateHash(l2BlockNumber - 1, 0x80, _l2Block); - endStateHash = computeStateHash(l2BlockNumber, 0x19c, _l2Block); + startStateHash = computeStateHash(l2BlockNumber - 1, START_TREES_BLOCK_HEADER_OFFSET, _l2Block); + endStateHash = computeStateHash(l2BlockNumber, END_TREES_BLOCK_HEADER_OFFSET, _l2Block); bytes32 diffRoot; bytes32 l1ToL2MsgsHash; @@ -155,11 +173,11 @@ library Decoder { bytes32 _diffRoot, bytes32 _l1ToL2MsgsHash ) internal pure returns (bytes32) { - bytes memory temp = new bytes(0x02b8 + 0x20 + 0x20); + bytes memory temp = new bytes(BLOCK_HEADER_OFFSET + 0x20 + 0x20); assembly { - calldatacopy(add(temp, 0x20), _l2Block.offset, 0x02b8) - mstore(add(temp, add(0x20, 0x02b8)), _diffRoot) - mstore(add(temp, add(0x40, 0x02b8)), _l1ToL2MsgsHash) + calldatacopy(add(temp, 0x20), _l2Block.offset, BLOCK_HEADER_OFFSET) + mstore(add(temp, add(0x20, BLOCK_HEADER_OFFSET)), _diffRoot) + mstore(add(temp, add(0x40, BLOCK_HEADER_OFFSET)), _l1ToL2MsgsHash) } return Hash.sha256ToField(temp); } @@ -190,14 +208,14 @@ library Decoder { pure returns (bytes32) { - // 0x20 for the block number + 0x11c for the header elements - bytes memory temp = new bytes(0x20 + 0x11c); + // 0x20 for the block number + TREES_BLOCK_HEADER_SIZE for the header elements + bytes memory temp = new bytes(0x20 + TREES_BLOCK_HEADER_SIZE); assembly { // Copy block number mstore(add(temp, 0x20), _l2BlockNumber) // Copy header elements (not including block number) for start or end - calldatacopy(add(temp, 0x40), add(_l2Block.offset, _offset), 0x11c) + calldatacopy(add(temp, 0x40), add(_l2Block.offset, _offset), TREES_BLOCK_HEADER_SIZE) } return sha256(temp); @@ -222,7 +240,7 @@ library Decoder { ArrayOffsets memory offsets; { assembly { - let offset := add(_l2Block.offset, 0x02b8) + let offset := add(_l2Block.offset, BLOCK_HEADER_OFFSET) let commitmentCount := and(shr(224, calldataload(offset)), 0xffffffff) offset := add(add(offset, 0x4), mul(commitmentCount, 0x20)) let nullifierCount := and(shr(224, calldataload(offset)), 0xffffffff) @@ -253,7 +271,7 @@ library Decoder { ConsumablesVars memory vars; vars.baseLeaves = new bytes32[]( - lengths.commitmentCount / (Constants.COMMITMENTS_PER_KERNEL * 2) + lengths.commitmentCount / (Constants.COMMITMENTS_PER_TX * 2) ); vars.l2ToL1Msgs = new bytes32[]( lengths.l2ToL1MsgsCount @@ -261,7 +279,7 @@ library Decoder { // Data starts after header. Look at L2 Block Data specification at the top of this file. { - offsets.commitmentOffset = 0x02bc; + offsets.commitmentOffset = BLOCK_HEADER_OFFSET + 0x4; offsets.nullifierOffset = offsets.commitmentOffset + 0x4 + lengths.commitmentCount * 0x20; offsets.publicDataOffset = offsets.nullifierOffset + 0x4 + lengths.nullifierCount * 0x20; offsets.l2ToL1MsgsOffset = offsets.publicDataOffset + 0x4 + lengths.dataWritesCount * 0x40; @@ -282,10 +300,10 @@ library Decoder { ) } - // Create the leaf to contain commitments (2 * COMMITMENTS_PER_KERNEL * 0x20) + nullifiers (2 * NULLIFIERS_PER_KERNEL * 0x20) + // Create the leaf to contain commitments (2 * COMMITMENTS_PER_TX * 020) + nullifiers (2 * NULLIFIERS_PER_TX * 0x20) // + new public data writes (8 * 0x40) + contract deployments (2 * 0x60) + logs hashes (2 * 4 * 0x20) vars.baseLeaf = - new bytes(2 * Constants.COMMITMENTS_PER_KERNEL * 0x20 + 2 * Constants.NULLIFIERS_PER_KERNEL * 0x20 + 2 * Constants.PUBLIC_DATA_WRITES_PER_KERNEL * 0x40 + 2 * Constants.CONTRACTS_PER_KERNEL * 0x60 + 2 * 4 * 0x20); + new bytes(2 * Constants.COMMITMENTS_PER_TX * 0x20 + 2 * Constants.NULLIFIERS_PER_TX * 0x20 + 2 * Constants.PUBLIC_DATA_WRITES_PER_TX * 0x40 + 2 * Constants.CONTRACTS_PER_TX * 0x60 + 2 * 4 * 0x20); for (uint256 i = 0; i < vars.baseLeaves.length; i++) { /* @@ -328,8 +346,8 @@ library Decoder { (vars.unencryptedLogsHashKernel2, offsets.unencryptedLogsOffset) = computeKernelLogsHash(offsets.unencryptedLogsOffset, _l2Block); - uint256 commitmentsPerBase = 2 * Constants.COMMITMENTS_PER_KERNEL; - uint256 nullifiersPerBase = 2 * Constants.NULLIFIERS_PER_KERNEL; + uint256 commitmentsPerBase = 2 * Constants.COMMITMENTS_PER_TX; + uint256 nullifiersPerBase = 2 * Constants.NULLIFIERS_PER_TX; assembly { let baseLeaf := mload(add(vars, 0x40)) // Load the pointer to `vars.baseLeaf` @@ -394,10 +412,10 @@ library Decoder { mstore(dstPtr, mload(add(vars, 0xc0))) // `unencryptedLogsHashKernel2` starts at 0xc0 in `vars` } - offsets.commitmentOffset += 2 * Constants.COMMITMENTS_PER_KERNEL * 0x20; - offsets.nullifierOffset += 2 * Constants.NULLIFIERS_PER_KERNEL * 0x20; - offsets.publicDataOffset += 2 * Constants.PUBLIC_DATA_WRITES_PER_KERNEL * 0x40; - offsets.l2ToL1MsgsOffset += 2 * Constants.L2_TO_L1_MSGS_PER_KERNEL * 0x20; + offsets.commitmentOffset += 2 * Constants.COMMITMENTS_PER_TX * 0x20; + offsets.nullifierOffset += 2 * Constants.NULLIFIERS_PER_TX * 0x20; + offsets.publicDataOffset += 2 * Constants.PUBLIC_DATA_WRITES_PER_TX * 0x40; + offsets.l2ToL1MsgsOffset += 2 * Constants.L2_TO_L1_MSGS_PER_TX * 0x20; offsets.contractOffset += 2 * 0x20; offsets.contractDataOffset += 2 * 0x34; diff --git a/l1-contracts/test/Decoder.t.sol b/l1-contracts/test/Decoder.t.sol index 4761e0dcf31..58c06e1eb1c 100644 --- a/l1-contracts/test/Decoder.t.sol +++ b/l1-contracts/test/Decoder.t.sol @@ -25,10 +25,10 @@ contract DecoderTest is Test { Rollup internal rollup; bytes internal block_empty_1 = - hex"0000000000000000000000000000000000000000000000000000000000007a6900000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000027378c30a97c642a3b78bd34c54beac15a4dadcd7a3378e66d2384c485fda541000000002adc67712c2f7afc4e827551236adb46a693d572fbb29f3993dbedbef8d2d87d000000200668938c4a4167faa2b5031e427d74d6e38638d2eef68834b70480c5a93f8e15000000002e04e54c3675ba6bd68f104ce19d391c57488f31736639dee94d707989843f110000000119c36f7bc2e4116d082865cc0b4ac8e16e9efa00ace9fb2222dd1dfd719cb671000000012b72136df9bc7dc9cbfe6b84ec743e8e1d73dd93aecfa79f18afb86be977d3eb0668938c4a4167faa2b5031e427d74d6e38638d2eef68834b70480c5a93f8e150000000019c36f7bc2e4116d082865cc0b4ac8e16e9efa00ace9fb2222dd1dfd719cb6710000000127378c30a97c642a3b78bd34c54beac15a4dadcd7a3378e66d2384c485fda541000000402adc67712c2f7afc4e827551236adb46a693d572fbb29f3993dbedbef8d2d87d000000600668938c4a4167faa2b5031e427d74d6e38638d2eef68834b70480c5a93f8e15000000040b217b2a07953bc0e8f56aac96308f81a2682074c229dc0034f091674d23993d00000002238b20b7bc1d5190f8e928eb2aa2094412588f9cad6c7862f69c09a9b246d6ed000000022b72136df9bc7dc9cbfe6b84ec743e8e1d73dd93aecfa79f18afb86be977d3eb0668938c4a4167faa2b5031e427d74d6e38638d2eef68834b70480c5a93f8e1500000010238b20b7bc1d5190f8e928eb2aa2094412588f9cad6c7862f69c09a9b246d6ed00000002000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000001000000000000000000000000000000000"; + hex"0000000000000000000000000000000000000000000000000000000000007a6900000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000020efbe2c7b675f26ab71689279908bbab33a6963e7e0dcb80e4c46583d094113000000002adc67712c2f7afc4e827551236adb46a693d572fbb29f3993dbedbef8d2d87d0000002027378c30a97c642a3b78bd34c54beac15a4dadcd7a3378e66d2384c485fda54100000000135bc361c9ed85a1b86f54458c343d580d84efb1e147cd568fa6abd4231a402d000000010ef76ed2c9210c834484aa185fdcfe317880955e8594b319f701f39f65846219000000012b72136df9bc7dc9cbfe6b84ec743e8e1d73dd93aecfa79f18afb86be977d3eb27378c30a97c642a3b78bd34c54beac15a4dadcd7a3378e66d2384c485fda541000000000ef76ed2c9210c834484aa185fdcfe317880955e8594b319f701f39f658462190000000127378c30a97c642a3b78bd34c54beac15a4dadcd7a3378e66d2384c485fda5410000000020efbe2c7b675f26ab71689279908bbab33a6963e7e0dcb80e4c46583d094113000000402adc67712c2f7afc4e827551236adb46a693d572fbb29f3993dbedbef8d2d87d0000006027378c30a97c642a3b78bd34c54beac15a4dadcd7a3378e66d2384c485fda541000000040050f7a38e7222792175befc9d6af3433c94309b86f3d2cccb3d9dafb178071a000000022bc197200c41b8fdfb11e86d0670056ce5d36d22815e3acd48f5f8ae9283f119000000022b72136df9bc7dc9cbfe6b84ec743e8e1d73dd93aecfa79f18afb86be977d3eb27378c30a97c642a3b78bd34c54beac15a4dadcd7a3378e66d2384c485fda541000000102bc197200c41b8fdfb11e86d0670056ce5d36d22815e3acd48f5f8ae9283f11900000002000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000001000000000000000000000000000000000"; bytes internal block_mixed_1 = - hex"0000000000000000000000000000000000000000000000000000000000007a6900000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000027378c30a97c642a3b78bd34c54beac15a4dadcd7a3378e66d2384c485fda541000000002adc67712c2f7afc4e827551236adb46a693d572fbb29f3993dbedbef8d2d87d000000200668938c4a4167faa2b5031e427d74d6e38638d2eef68834b70480c5a93f8e15000000002e04e54c3675ba6bd68f104ce19d391c57488f31736639dee94d707989843f110000000119c36f7bc2e4116d082865cc0b4ac8e16e9efa00ace9fb2222dd1dfd719cb671000000012b72136df9bc7dc9cbfe6b84ec743e8e1d73dd93aecfa79f18afb86be977d3eb0668938c4a4167faa2b5031e427d74d6e38638d2eef68834b70480c5a93f8e150000000019c36f7bc2e4116d082865cc0b4ac8e16e9efa00ace9fb2222dd1dfd719cb67100000001242440bb6a4cba1d719e5fffa6d5fbcc0bd922ec70f00da8f6e1e23aaedbb88a0000004026f32989eb2870f2ed00774f54a82e8266fc2a2b3392b64e8199aacac71aabea000000601578dee3629aa301b877887a478484ab676934bd9f8228be7c5cdb5873f97558000000040144f7bcbcded272bdd50475ae0e017d487e184e66630b29968b31214eb45f2d00000002091367641fbcfd08d2b16d6ec75bb365bd807a436fce9163516a1de3532e8de3000000022d9b8d2353587ca56bdf967b4bb8847af3671bd6901e9e28f82c240c6e33129a1b3ab03f9b9fb0f8a31ed10a930e476c7b8bfcc9018d6dfbe20eb15838a701e9000000103036ed03e75f4893197d647af9e8f5dae3659ac9003c6b144dbb86b71820307400000002000000400000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000012100000000000000000000000000000000000000000000000000000000000001220000000000000000000000000000000000000000000000000000000000000123000000000000000000000000000000000000000000000000000000000000012400000000000000000000000000000000000000000000000000000000000001250000000000000000000000000000000000000000000000000000000000000126000000000000000000000000000000000000000000000000000000000000012700000000000000000000000000000000000000000000000000000000000001280000000000000000000000000000000000000000000000000000000000000129000000000000000000000000000000000000000000000000000000000000012a000000000000000000000000000000000000000000000000000000000000012b000000000000000000000000000000000000000000000000000000000000012c000000000000000000000000000000000000000000000000000000000000012d000000000000000000000000000000000000000000000000000000000000012e000000000000000000000000000000000000000000000000000000000000012f0000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000014100000000000000000000000000000000000000000000000000000000000001420000000000000000000000000000000000000000000000000000000000000143000000000000000000000000000000000000000000000000000000000000014400000000000000000000000000000000000000000000000000000000000001450000000000000000000000000000000000000000000000000000000000000146000000000000000000000000000000000000000000000000000000000000014700000000000000000000000000000000000000000000000000000000000001480000000000000000000000000000000000000000000000000000000000000149000000000000000000000000000000000000000000000000000000000000014a000000000000000000000000000000000000000000000000000000000000014b000000000000000000000000000000000000000000000000000000000000014c000000000000000000000000000000000000000000000000000000000000014d000000000000000000000000000000000000000000000000000000000000014e000000000000000000000000000000000000000000000000000000000000014f0000000000000000000000000000000000000000000000000000000000000160000000000000000000000000000000000000000000000000000000000000016100000000000000000000000000000000000000000000000000000000000001620000000000000000000000000000000000000000000000000000000000000163000000000000000000000000000000000000000000000000000000000000016400000000000000000000000000000000000000000000000000000000000001650000000000000000000000000000000000000000000000000000000000000166000000000000000000000000000000000000000000000000000000000000016700000000000000000000000000000000000000000000000000000000000001680000000000000000000000000000000000000000000000000000000000000169000000000000000000000000000000000000000000000000000000000000016a000000000000000000000000000000000000000000000000000000000000016b000000000000000000000000000000000000000000000000000000000000016c000000000000000000000000000000000000000000000000000000000000016d000000000000000000000000000000000000000000000000000000000000016e000000000000000000000000000000000000000000000000000000000000016f0000000000000000000000000000000000000000000000000000000000000180000000000000000000000000000000000000000000000000000000000000018100000000000000000000000000000000000000000000000000000000000001820000000000000000000000000000000000000000000000000000000000000183000000000000000000000000000000000000000000000000000000000000018400000000000000000000000000000000000000000000000000000000000001850000000000000000000000000000000000000000000000000000000000000186000000000000000000000000000000000000000000000000000000000000018700000000000000000000000000000000000000000000000000000000000001880000000000000000000000000000000000000000000000000000000000000189000000000000000000000000000000000000000000000000000000000000018a000000000000000000000000000000000000000000000000000000000000018b000000000000000000000000000000000000000000000000000000000000018c000000000000000000000000000000000000000000000000000000000000018d000000000000000000000000000000000000000000000000000000000000018e000000000000000000000000000000000000000000000000000000000000018f000000400000000000000000000000000000000000000000000000000000000000000220000000000000000000000000000000000000000000000000000000000000022100000000000000000000000000000000000000000000000000000000000002220000000000000000000000000000000000000000000000000000000000000223000000000000000000000000000000000000000000000000000000000000022400000000000000000000000000000000000000000000000000000000000002250000000000000000000000000000000000000000000000000000000000000226000000000000000000000000000000000000000000000000000000000000022700000000000000000000000000000000000000000000000000000000000002280000000000000000000000000000000000000000000000000000000000000229000000000000000000000000000000000000000000000000000000000000022a000000000000000000000000000000000000000000000000000000000000022b000000000000000000000000000000000000000000000000000000000000022c000000000000000000000000000000000000000000000000000000000000022d000000000000000000000000000000000000000000000000000000000000022e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000240000000000000000000000000000000000000000000000000000000000000024100000000000000000000000000000000000000000000000000000000000002420000000000000000000000000000000000000000000000000000000000000243000000000000000000000000000000000000000000000000000000000000024400000000000000000000000000000000000000000000000000000000000002450000000000000000000000000000000000000000000000000000000000000246000000000000000000000000000000000000000000000000000000000000024700000000000000000000000000000000000000000000000000000000000002480000000000000000000000000000000000000000000000000000000000000249000000000000000000000000000000000000000000000000000000000000024a000000000000000000000000000000000000000000000000000000000000024b000000000000000000000000000000000000000000000000000000000000024c000000000000000000000000000000000000000000000000000000000000024d000000000000000000000000000000000000000000000000000000000000024e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000260000000000000000000000000000000000000000000000000000000000000026100000000000000000000000000000000000000000000000000000000000002620000000000000000000000000000000000000000000000000000000000000263000000000000000000000000000000000000000000000000000000000000026400000000000000000000000000000000000000000000000000000000000002650000000000000000000000000000000000000000000000000000000000000266000000000000000000000000000000000000000000000000000000000000026700000000000000000000000000000000000000000000000000000000000002680000000000000000000000000000000000000000000000000000000000000269000000000000000000000000000000000000000000000000000000000000026a000000000000000000000000000000000000000000000000000000000000026b000000000000000000000000000000000000000000000000000000000000026c000000000000000000000000000000000000000000000000000000000000026d000000000000000000000000000000000000000000000000000000000000026e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000280000000000000000000000000000000000000000000000000000000000000028100000000000000000000000000000000000000000000000000000000000002820000000000000000000000000000000000000000000000000000000000000283000000000000000000000000000000000000000000000000000000000000028400000000000000000000000000000000000000000000000000000000000002850000000000000000000000000000000000000000000000000000000000000286000000000000000000000000000000000000000000000000000000000000028700000000000000000000000000000000000000000000000000000000000002880000000000000000000000000000000000000000000000000000000000000289000000000000000000000000000000000000000000000000000000000000028a000000000000000000000000000000000000000000000000000000000000028b000000000000000000000000000000000000000000000000000000000000028c000000000000000000000000000000000000000000000000000000000000028d000000000000000000000000000000000000000000000000000000000000028e0000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000520000000000000000000000000000000000000000000000000000000000000052a0000000000000000000000000000000000000000000000000000000000000521000000000000000000000000000000000000000000000000000000000000052b0000000000000000000000000000000000000000000000000000000000000522000000000000000000000000000000000000000000000000000000000000052c0000000000000000000000000000000000000000000000000000000000000523000000000000000000000000000000000000000000000000000000000000052d0000000000000000000000000000000000000000000000000000000000000540000000000000000000000000000000000000000000000000000000000000054a0000000000000000000000000000000000000000000000000000000000000541000000000000000000000000000000000000000000000000000000000000054b0000000000000000000000000000000000000000000000000000000000000542000000000000000000000000000000000000000000000000000000000000054c0000000000000000000000000000000000000000000000000000000000000543000000000000000000000000000000000000000000000000000000000000054d0000000000000000000000000000000000000000000000000000000000000560000000000000000000000000000000000000000000000000000000000000056a0000000000000000000000000000000000000000000000000000000000000561000000000000000000000000000000000000000000000000000000000000056b0000000000000000000000000000000000000000000000000000000000000562000000000000000000000000000000000000000000000000000000000000056c0000000000000000000000000000000000000000000000000000000000000563000000000000000000000000000000000000000000000000000000000000056d0000000000000000000000000000000000000000000000000000000000000580000000000000000000000000000000000000000000000000000000000000058a0000000000000000000000000000000000000000000000000000000000000581000000000000000000000000000000000000000000000000000000000000058b0000000000000000000000000000000000000000000000000000000000000582000000000000000000000000000000000000000000000000000000000000058c0000000000000000000000000000000000000000000000000000000000000583000000000000000000000000000000000000000000000000000000000000058d00000008000000000000000000000000000000000000000000000000000000000000032000000000000000000000000000000000000000000000000000000000000003210000000000000000000000000000000000000000000000000000000000000340000000000000000000000000000000000000000000000000000000000000034100000000000000000000000000000000000000000000000000000000000003600000000000000000000000000000000000000000000000000000000000000361000000000000000000000000000000000000000000000000000000000000038000000000000000000000000000000000000000000000000000000000000003810000000426fcb9639d15aabe6d792e23ab12fb9633046d4be6911a60d64471d7560d3f6809143b7d4943a3485115d37e7596938a16c91b6055f3837640d8c36b8303bb3c06fb5fb553496e5e0b48834087e036acf99d6d935dc2ebf43c82788cb5ed1c6a2f4bd77ac2bb5474d48c2856135d18168cd6f69f77143c60b3cc370319419dac0000000000000000000000000000000000000000000000000000000000001020212121212121212121212121212121212121212100000000000000000000000000000000000000000000000000000000000010404141414141414141414141414141414141414141000000000000000000000000000000000000000000000000000000000000106061616161616161616161616161616161616161610000000000000000000000000000000000000000000000000000000000001080818181818181818181818181818181818181818100000010151de48ca3efbae39f180fe00b8f472ec9f25be10b4f283a87c6d7839353703914c2ea9dedf77698d4afe23bc663263eed0bf9aa3a8b17d9b74812f185610f9e1570cc6641699e3ae87fa258d80a6d853f7b8ccb211dc244d017e2ca6530f8a12806c860af67e9cd50000378411b8c4c4db172ceb2daa862b259b689ccbdc1e005f140c7c95624c8006774279a01ec1ea88617999e4fe6997b6576c4e1c7395a22048b96b586596bd740d0402e15f5577f7ceb5496b65aafc6d89d7c3b34924b0c3f2d50d16279970d682cada30bfa6b29bc0bac0ee2389f6a0444853eccaa932b2a60561da46a58569d71044a84c639e7f88429826e5622581536eb906d9cdd25a2c0a76f7da6924e10751c755227d2535f4ad258b984e78f9f452a853c52300e212d8e2069e4254d81af07744bcbb81121a38f0e2dbed69a523d3fbf85b75c287ca6f33aadbac2e4f058e05924c140d7895a6ed167caf804b710d2ae3ba62b1b51297b3ea37637af6bd56cf33425d95cc5c96e9c2ee3077322fbec86a0c7f32c15d2a888c6cc122e99478c92470a1311635142d82ad7ae67410beeef4ae31f0902ba2fb964922a4610bb18901f7b923885c1d034da5769a48203ae6f0206a92855e2c01ddb3d6553386b5580d681b8230fa4062948668f834f23e0636eaff70aaa64519aafdf4b040bd2f9836e76b9dc13cfec8065dcdf2834d786e06260d100000e1000000380000001bc00000090f21fa38445a09b3855af8539b818332b0cef11e3e6ddae06267dcf1953f526969a4b3089d62ae012e3ea2f135de7ed894e39715824002fb1bbf2e219758fd7a29e39ee77d412544315ad059f91c50ba6b6089aff12ef4f081f6ea81450f35437bf47970969a9e6996190fe130c21a1105e9cb2140869cb36022ffd737122d3e34fcb7b264d366a1eaef3bdf7301f16c7000000901050ee850e5b7e4852b04d14378b9e62a2d01ea2cde9d54ce58c3c8796112adb7893cf9e1c88cdd05a45b3d4eaa2d56aa47bb3045311c2e3ba90ca91c140e2adbf6aab51ac52c108c89cccdca5e96bf1d1fb64f70f76dd0ffb5a80eb5fbb0ec0e3c211d880eb0e58f28e7bcbe3fbacd2e40cad2e12f94a88bc215ce56e5942982b1eef9fd695d2ed2cb896894746e86500000090e46d0d6a97d4b7aad44eeb433974ebb8744db1403649c48f7fd051659a9150ceebc7cfd002a65d2576adf0f47390490281bc30e6772141ebcde7278d9c22ad4a6019445580e35b37b2b4c9f18de59dcc69cf9b48a12f147db3fb9839faae8945248527910be911d9c947a9ddc15da3422950f2553a929ef8810be79f316fc46fa2b4a7732e8f53139086f235155bf21b000001bc00000090eddfd2b61a0f2f5a8c058e5de37fe557f352626d31f20971f0e4abeffd339f07292965b240e4180d7324b31f38338136992070391d027bfcdbfd2500ea48f01c4118cb4c0343ee94b79b1bec82fa9a13c1699d9082042e4ca0cce04bb919afaa3380ad7966aa1fc23a4f8fb379537e5823b43379179632b9578f5f8b4b5a8623c1e0a3ea73680413544550faa20e7467000000907efd26757319985f114ae6c93a96b01d3094458cfc94a1abf63a107ee6de54e8a6a582fd177dbdd6289fd5835c2ad25dd36f9ecd7ec7b81d889050c65e3c934948f81480f7ec4e192fa8fc67b5761c61c7f815028fa6aaa089d31aab9d97fb006abe28afd6c30ff01e78d6a37945cd7b55d6fa4f8c38c41789fae8a2f7000dc1a76bb40851c75518436572239186a60d0000009061ea102e02927ac017a5350527462d5f0801130753e5eee35b0040fe0a38d418ae55f5a8f12ae578d88b58b3993c7767a98cd280d606dd8d792e3ce69be001c277fd81342937dd728ffa0dcd4ed1e20669582a436fe61e8c4d2189d383bda18d03a56280d96814539d5b541c0c6bee120f1f3d0930305768f99408642ae924068d5023cb9d630be52a6c99ff49a6f56c00000380000001bc000000908d89dd62f1a9e8efeeffb5783d79925676208dbb2da5fc9d763eb6dc55ff53788132e6dd1ddc3620fbc6b112010e705071c7938fa0776053a51b9806dc6b4bbb78685fe1b6a9d71989b9b5c9fcaaf353eb8e0b7f5355585f881f14797a97dd70b6a9dfaaeecc5237a1cd72c999355702f9fcfe47ca4390976f55c47d4c7896836ac4967b7edd9a29683c0746a434a71a00000090f87eb5f7213825c5302ca14fd08cdb888a7305a2b89f99d91d70650e8c28e97dbda23cf38603440434f7a12deb50d1504b4ec95543e346c191c64a401f94ddc56aaf71a0d890a923214f8407c236aafd5e338b9bd8d9a816e2d1a15096a99c3033e7af3518810f37f48b8181395cdd9fed563036d3d0f6c2bdfaa782ec4d47d32d469d6792c024afed5855985670308200000090e303a876f0ede03a95d81028cf9d0d6e1adffe1794bc47b8def60ac28e649bedd1134cf9477a8fc678af5350342bd1717a610f843d9faa13e20d78a8ee5beca0f8d2ff84ea1bda582d8f738e09814150404cbcf8271918994bb95f8add7308ea474555d85305adfd7db53140c36ee34c9515b46c28b817baaf26415b2578d6a52f2f817a1c8b1181c3c6cba8058a3cbc000001bc00000090fff0205387dc89eb6266969c890aacc8a8d59999b8987bae7a2bf7fe973a5aae5603a966be5ed08a6a5c3db164a3104cbdc4a19b018ecf599e0169d89ed23e1c344acef85021215ca0c1c13bc06b880ee6583999abe9f46b8833c2acde156cbc0509ce46e0f73d3109da346c48d1ddd578a7a7d309ee3b99e48decdd6b4f4be1d1f230fe29e769b7aa2948b8fe98eef800000090c449ea62e5cd6c02fe0fb57a42872087a2b68e0108e34f4e833a736c97f7047987aca10af787769db659c6461e75f332aa435b24d762e60a584db62dccb4fd1a01beb1b41b9de47c503b4638e7463be159cb774ce98fbf40e859d850e25561516968c57aa0765298dcf7ba7a57303f5c03504f3eeeaba538c2793e17f77d309d65fd150c703b050abaf6dbed43072dd300000090828e250313368bdf9c5d09d7264ebd64d64441ee6b563fabe80dad3c89716ff2096bf4ad372920f3505770f7f4acfaab7c5e66d9e0faee355c673ddad1f6976aa1cad2487c514f2ec06d8b3acfd7ddaef64e7a6a981148448793b9fb1d5d796ccc214c98a2d32291458d4236302e210bc03dbc85e4b64d66649afd0a23f0261b8e68341926a5aadea633e438d16ec32100000380000001bc000000904eacb6cb59c1a33adf2690038cf379d466d1b32961adc7601071a0767b71ecf7b90d9aa6aaf6d839b5d26754723c6aec83daed2bb792334ef264e7c540599732048cdd0a761f6b22ae86a2415a7eb833f26aee9cf4398df43b108125361467c1ae23a67e2a5ece87c76027d27a9db961718aff7e79c3eab3be5b72aada786756708914685359d46810d18b160cb40b8c00000090a4e27900119abdfcc87f9568c372ded71ff1ff4ffb4d57118a5831c5307bc3b38e613b939db6b0b62e5a36778768668fad6e8b6286f942bd89a19119524379ba7ddfa9d8a4e1875143d9efe84f33c42a08619e98067e5703c4917d66f57b3ab5919e4beda65707dae2ce67e3aa728ec06c4a282b77766c70438ef2cb0ab185f75a987ab12472ba789cad84aa5a84b347000000903f4087602a05e0271233a89a7250d639b556a58e976eb72fb7c4202aeb0c8da66dad81d098d9b3dd103371409aef5916af78d4f764417c743eae2a647e97cac0b3f5ce2721f965f84fc353606a3a0e9a8d58bb2655128d4409c19a4ecfe16e19161ae6519c22ca0c7e3a45449296869e2c8e3753d337527bafeef204e979f83b41737dfe7e4dad8236099043a50a68e3000001bc0000009048aa18b754fc1544d35051fa4c61bf0bd94801f44dd426b747577082666c2966733e1edd7b7ef9568a32bd695d4b1e5b4b79fc31af9792ce914547eca11d2e07a4bc3fc26b7c12bb40d1b6ae78e48c597775c3318b0173ee168e4b63c72873363f303e7c254826239f569f6dcb8ca20dbc4484e66ce4beb5cde45c3c2c8acd930d35b1b1995b3fabd1c553607b4a0b3e00000090694ecb347804cfe4fd7270b20e2127e17e84ad8be47634623f40aff39276a33f290727156c37b97537f5a584f94fdc26a1b442e69510ded48756893f6c440658126cd4dcf0b8c5ebbd5f5b37000eaad205058a941f28f1340c4b4396db48972a2b768cd5ffbe3c3222b70f068bf70a30ecced926a2a6e552abff8bf3ece2af2aafbe4fe1de64853f1a84edf2bb5875460000009034a5d72f382f83769f48b44e7e3afb47d4c21aaec2e2b1ef6bd12ee8d623ae284678462241026016f43e4720a8d4a63e46b19c323b3e2434f83dbcae72d7f798e57832ec4975ed563b3a9fe34f77cbb70e78153878fb33e40ee5cd8b8ca2bd26f2762cb81d2242263df384f882b63bc0e8f7c673db86220628ad0f8bdd3f00e879ee0036349a1731c471945aa00c6af100000380000001bc00000090ef0f4d6a0057d777cebc56c808a6c3a50c70737b0735fbe33fdc004bea7cdd82d5b9e70c73b07dcf2027f01da3d86314fe58ed5955d1208b1425cdbf2f8cd9a0e7006f2ae02bc2f443ab75f8ba99fe7df8e48d9c30dc8f65fc1632d3c482783fc3f67261ac2213c23203f2053cec1d065ecdd1820daf446b9a8ff8be4bb8f94ca9b819585b149fd63fb50654fbe6bdc500000090074c924696ee8b9a02f205017a468b9272d911c86f62f961aad7ae468d8c371738dc8b31b927d53d9b036756bd6b2dadd074bb1441e02ee31ec78e429a84eafd2e86d8a6ab9c1bdeca68c3deb5dbc2f1226b627d7f174408206e7de1be9ce968628bbed166994e971e000fa55c9242e33a0c85b640fbf83a382b04945eb2808d6ff3a4767b9cd725f663471e85f8559900000090ea019a9677bc4489c290f36debb0c9939c845e6a6a1e317d00691d1aca708aa502b4d1ba67e802afd147570d4778be6395987cbb5db7e77fc74bc2f9fbf409417bc87e451a379b2b41107f53583b5f0a3c25aa772dce2b2615be7cce8bfbbecdf4790067de830ed6564f0ce855c56fe9066d7e77153a434ccc5f006b3b31fecd05bbbac2405af45808d528ea76e54567000001bc000000904970a7f50be3526216d3e6283ae0870cf3cd97f26d930cb6fe9a1803967053521c790105652c0f1d0a55f613318f8ed4ef5e7fc2c194f23b36524f3296a18cf6cff846bac6b50dfb14d1c1e39a590429bb85032cb107b060033ca0ae44afa299f304ed77af63d3d6efb4a6eb61acec8d408be7c844c1264362e05ad4f50fce9b23f22ab5ae96aa9c6f18c0faebe5691c00000090429644fd52c43f5b88410a2eab1c88c2f2d334e515d8d46e61ce1dd39fadf652d41ae8be999eada275d856672e1dcaf9a9c6cd61e8e18bd01804dc64bbc0b657d4635df57cc7f86273802804d1bf84166dc2a4266b4a2d389d98348708a952e34ba252d868072931472ea364e82cdcf281990da7aae85ae12de35d1ff0b7ee88f59b04d42ce42831bff0fbd23f55dfc2000000907c078d86f8d38b15dadb22cd5688119141b32934361d94d337334d5913bad13b253144d7e9dd81f4c1df9ed8afeabae972873f1de62d8cd8f0c8d20205a2209005a477906d5cf282bdf0a631cacc93396df37edc1c211576922eda972bec75d1a9bf5ca4c823ee5ff3f39a60ae1cb06479f2470ff6764749adcbf43a057d8f82730871fb33601a637c7aa9215912cdd3000000400000000c0000000000000000000000000000000c0000000000000000000000000000000c0000000000000000000000000000000c000000000000000000000000"; + hex"0000000000000000000000000000000000000000000000000000000000007a6900000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000020efbe2c7b675f26ab71689279908bbab33a6963e7e0dcb80e4c46583d094113000000002adc67712c2f7afc4e827551236adb46a693d572fbb29f3993dbedbef8d2d87d0000002027378c30a97c642a3b78bd34c54beac15a4dadcd7a3378e66d2384c485fda54100000000135bc361c9ed85a1b86f54458c343d580d84efb1e147cd568fa6abd4231a402d000000010ef76ed2c9210c834484aa185fdcfe317880955e8594b319f701f39f65846219000000012b72136df9bc7dc9cbfe6b84ec743e8e1d73dd93aecfa79f18afb86be977d3eb27378c30a97c642a3b78bd34c54beac15a4dadcd7a3378e66d2384c485fda541000000000ef76ed2c9210c834484aa185fdcfe317880955e8594b319f701f39f658462190000000127378c30a97c642a3b78bd34c54beac15a4dadcd7a3378e66d2384c485fda54100000000235f4e41a2440aa28f9ac14e7eed447ddd2e539179cee4c0941e6e408d2443e50000004026f32989eb2870f2ed00774f54a82e8266fc2a2b3392b64e8199aacac71aabea000000600b6abbab461cfb072b267bfc1ecf8dc3c943736341baf11c5c829e345c49b509000000041c1b17b2cb59cc2314fb65fe31dcfdb1b014630fab522a263d9935601ff78a5c000000022d02c42204d7182da24e9ca1e3244fbff1e00efb8c85ee3a1ac9488fe2e3aa9d000000022d9b8d2353587ca56bdf967b4bb8847af3671bd6901e9e28f82c240c6e33129a2fbbd267a1c9b23b3ac1609b2c2a7961a0338c56d62607d5f8d6b6a29e7fe4cb000000101d223d0a7bbe8cd9eace6507ee0fa9dbf84565685a1c6ceb978cdd46c47025ea00000002000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000012100000000000000000000000000000000000000000000000000000000000001220000000000000000000000000000000000000000000000000000000000000123000000000000000000000000000000000000000000000000000000000000012400000000000000000000000000000000000000000000000000000000000001250000000000000000000000000000000000000000000000000000000000000126000000000000000000000000000000000000000000000000000000000000012700000000000000000000000000000000000000000000000000000000000001280000000000000000000000000000000000000000000000000000000000000129000000000000000000000000000000000000000000000000000000000000012a000000000000000000000000000000000000000000000000000000000000012b000000000000000000000000000000000000000000000000000000000000012c000000000000000000000000000000000000000000000000000000000000012d000000000000000000000000000000000000000000000000000000000000012e000000000000000000000000000000000000000000000000000000000000012f0000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000014100000000000000000000000000000000000000000000000000000000000001420000000000000000000000000000000000000000000000000000000000000143000000000000000000000000000000000000000000000000000000000000014400000000000000000000000000000000000000000000000000000000000001450000000000000000000000000000000000000000000000000000000000000146000000000000000000000000000000000000000000000000000000000000014700000000000000000000000000000000000000000000000000000000000001480000000000000000000000000000000000000000000000000000000000000149000000000000000000000000000000000000000000000000000000000000014a000000000000000000000000000000000000000000000000000000000000014b000000000000000000000000000000000000000000000000000000000000014c000000000000000000000000000000000000000000000000000000000000014d000000000000000000000000000000000000000000000000000000000000014e000000000000000000000000000000000000000000000000000000000000014f0000000000000000000000000000000000000000000000000000000000000160000000000000000000000000000000000000000000000000000000000000016100000000000000000000000000000000000000000000000000000000000001620000000000000000000000000000000000000000000000000000000000000163000000000000000000000000000000000000000000000000000000000000016400000000000000000000000000000000000000000000000000000000000001650000000000000000000000000000000000000000000000000000000000000166000000000000000000000000000000000000000000000000000000000000016700000000000000000000000000000000000000000000000000000000000001680000000000000000000000000000000000000000000000000000000000000169000000000000000000000000000000000000000000000000000000000000016a000000000000000000000000000000000000000000000000000000000000016b000000000000000000000000000000000000000000000000000000000000016c000000000000000000000000000000000000000000000000000000000000016d000000000000000000000000000000000000000000000000000000000000016e000000000000000000000000000000000000000000000000000000000000016f0000000000000000000000000000000000000000000000000000000000000180000000000000000000000000000000000000000000000000000000000000018100000000000000000000000000000000000000000000000000000000000001820000000000000000000000000000000000000000000000000000000000000183000000000000000000000000000000000000000000000000000000000000018400000000000000000000000000000000000000000000000000000000000001850000000000000000000000000000000000000000000000000000000000000186000000000000000000000000000000000000000000000000000000000000018700000000000000000000000000000000000000000000000000000000000001880000000000000000000000000000000000000000000000000000000000000189000000000000000000000000000000000000000000000000000000000000018a000000000000000000000000000000000000000000000000000000000000018b000000000000000000000000000000000000000000000000000000000000018c000000000000000000000000000000000000000000000000000000000000018d000000000000000000000000000000000000000000000000000000000000018e000000000000000000000000000000000000000000000000000000000000018f000000400000000000000000000000000000000000000000000000000000000000000220000000000000000000000000000000000000000000000000000000000000022100000000000000000000000000000000000000000000000000000000000002220000000000000000000000000000000000000000000000000000000000000223000000000000000000000000000000000000000000000000000000000000022400000000000000000000000000000000000000000000000000000000000002250000000000000000000000000000000000000000000000000000000000000226000000000000000000000000000000000000000000000000000000000000022700000000000000000000000000000000000000000000000000000000000002280000000000000000000000000000000000000000000000000000000000000229000000000000000000000000000000000000000000000000000000000000022a000000000000000000000000000000000000000000000000000000000000022b000000000000000000000000000000000000000000000000000000000000022c000000000000000000000000000000000000000000000000000000000000022d000000000000000000000000000000000000000000000000000000000000022e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000240000000000000000000000000000000000000000000000000000000000000024100000000000000000000000000000000000000000000000000000000000002420000000000000000000000000000000000000000000000000000000000000243000000000000000000000000000000000000000000000000000000000000024400000000000000000000000000000000000000000000000000000000000002450000000000000000000000000000000000000000000000000000000000000246000000000000000000000000000000000000000000000000000000000000024700000000000000000000000000000000000000000000000000000000000002480000000000000000000000000000000000000000000000000000000000000249000000000000000000000000000000000000000000000000000000000000024a000000000000000000000000000000000000000000000000000000000000024b000000000000000000000000000000000000000000000000000000000000024c000000000000000000000000000000000000000000000000000000000000024d000000000000000000000000000000000000000000000000000000000000024e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000260000000000000000000000000000000000000000000000000000000000000026100000000000000000000000000000000000000000000000000000000000002620000000000000000000000000000000000000000000000000000000000000263000000000000000000000000000000000000000000000000000000000000026400000000000000000000000000000000000000000000000000000000000002650000000000000000000000000000000000000000000000000000000000000266000000000000000000000000000000000000000000000000000000000000026700000000000000000000000000000000000000000000000000000000000002680000000000000000000000000000000000000000000000000000000000000269000000000000000000000000000000000000000000000000000000000000026a000000000000000000000000000000000000000000000000000000000000026b000000000000000000000000000000000000000000000000000000000000026c000000000000000000000000000000000000000000000000000000000000026d000000000000000000000000000000000000000000000000000000000000026e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000280000000000000000000000000000000000000000000000000000000000000028100000000000000000000000000000000000000000000000000000000000002820000000000000000000000000000000000000000000000000000000000000283000000000000000000000000000000000000000000000000000000000000028400000000000000000000000000000000000000000000000000000000000002850000000000000000000000000000000000000000000000000000000000000286000000000000000000000000000000000000000000000000000000000000028700000000000000000000000000000000000000000000000000000000000002880000000000000000000000000000000000000000000000000000000000000289000000000000000000000000000000000000000000000000000000000000028a000000000000000000000000000000000000000000000000000000000000028b000000000000000000000000000000000000000000000000000000000000028c000000000000000000000000000000000000000000000000000000000000028d000000000000000000000000000000000000000000000000000000000000028e0000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000520000000000000000000000000000000000000000000000000000000000000052a0000000000000000000000000000000000000000000000000000000000000521000000000000000000000000000000000000000000000000000000000000052b0000000000000000000000000000000000000000000000000000000000000522000000000000000000000000000000000000000000000000000000000000052c0000000000000000000000000000000000000000000000000000000000000523000000000000000000000000000000000000000000000000000000000000052d0000000000000000000000000000000000000000000000000000000000000540000000000000000000000000000000000000000000000000000000000000054a0000000000000000000000000000000000000000000000000000000000000541000000000000000000000000000000000000000000000000000000000000054b0000000000000000000000000000000000000000000000000000000000000542000000000000000000000000000000000000000000000000000000000000054c0000000000000000000000000000000000000000000000000000000000000543000000000000000000000000000000000000000000000000000000000000054d0000000000000000000000000000000000000000000000000000000000000560000000000000000000000000000000000000000000000000000000000000056a0000000000000000000000000000000000000000000000000000000000000561000000000000000000000000000000000000000000000000000000000000056b0000000000000000000000000000000000000000000000000000000000000562000000000000000000000000000000000000000000000000000000000000056c0000000000000000000000000000000000000000000000000000000000000563000000000000000000000000000000000000000000000000000000000000056d0000000000000000000000000000000000000000000000000000000000000580000000000000000000000000000000000000000000000000000000000000058a0000000000000000000000000000000000000000000000000000000000000581000000000000000000000000000000000000000000000000000000000000058b0000000000000000000000000000000000000000000000000000000000000582000000000000000000000000000000000000000000000000000000000000058c0000000000000000000000000000000000000000000000000000000000000583000000000000000000000000000000000000000000000000000000000000058d00000008000000000000000000000000000000000000000000000000000000000000032000000000000000000000000000000000000000000000000000000000000003210000000000000000000000000000000000000000000000000000000000000340000000000000000000000000000000000000000000000000000000000000034100000000000000000000000000000000000000000000000000000000000003600000000000000000000000000000000000000000000000000000000000000361000000000000000000000000000000000000000000000000000000000000038000000000000000000000000000000000000000000000000000000000000003810000000426fcb9639d15aabe6d792e23ab12fb9633046d4be6911a60d64471d7560d3f6809143b7d4943a3485115d37e7596938a16c91b6055f3837640d8c36b8303bb3c06fb5fb553496e5e0b48834087e036acf99d6d935dc2ebf43c82788cb5ed1c6a2f4bd77ac2bb5474d48c2856135d18168cd6f69f77143c60b3cc370319419dac0000000000000000000000000000000000000000000000000000000000001020212121212121212121212121212121212121212100000000000000000000000000000000000000000000000000000000000010404141414141414141414141414141414141414141000000000000000000000000000000000000000000000000000000000000106061616161616161616161616161616161616161610000000000000000000000000000000000000000000000000000000000001080818181818181818181818181818181818181818100000010151de48ca3efbae39f180fe00b8f472ec9f25be10b4f283a87c6d7839353703914c2ea9dedf77698d4afe23bc663263eed0bf9aa3a8b17d9b74812f185610f9e1570cc6641699e3ae87fa258d80a6d853f7b8ccb211dc244d017e2ca6530f8a12806c860af67e9cd50000378411b8c4c4db172ceb2daa862b259b689ccbdc1e005f140c7c95624c8006774279a01ec1ea88617999e4fe6997b6576c4e1c7395a22048b96b586596bd740d0402e15f5577f7ceb5496b65aafc6d89d7c3b34924b0c3f2d50d16279970d682cada30bfa6b29bc0bac0ee2389f6a0444853eccaa932b2a60561da46a58569d71044a84c639e7f88429826e5622581536eb906d9cdd25a2c0a76f7da6924e10751c755227d2535f4ad258b984e78f9f452a853c52300e212d8e2069e4254d81af07744bcbb81121a38f0e2dbed69a523d3fbf85b75c287ca6f33aadbac2e4f058e05924c140d7895a6ed167caf804b710d2ae3ba62b1b51297b3ea37637af6bd56cf33425d95cc5c96e9c2ee3077322fbec86a0c7f32c15d2a888c6cc122e99478c92470a1311635142d82ad7ae67410beeef4ae31f0902ba2fb964922a4610bb18901f7b923885c1d034da5769a48203ae6f0206a92855e2c01ddb3d6553386b5580d681b8230fa4062948668f834f23e0636eaff70aaa64519aafdf4b040bd2f9836e76b9dc13cfec8065dcdf2834d786e06260d10000381000000e00000001bc000000906eb2b444212e7fc5426b585fe92da7a94010f06dc82f8ae57dd4dc91cac317e141462fbe15290e7da75db817402d54bb34c3e36b82b681103e75a06b53742b0b225f76d3e207d15147eb3fa760d364422d4bb6a9ec10df5ac9b8fbedada4b6f97045637edc6c78f389dfd44a466e10e2cbfd84b112515666452a25e6877921275cc60bda20061ed54e6775087bd44cae00000090b3f361eebad14c9843114c3e6e2bd810b17a1381953eb6cbb0920e5412435c42cb36efa2ddf219d289c394700893caed500cb13b1d5724d57cb97922ec555d7fc40c94889a666bced531fbda4f9aff016a6b4267972abbd9f60287f6c1676f6b2b20577f3781e34a8cc4dd36cc6e2725d1b8f6f9aa612fc43358c1fc167a56d9bcb3a463fb9abf152723c36020393f5d00000090e084263ed67cf75ffbcf9f9922716125423be3ae02c0c3729c564a7d4209afe4534a20db0dc79f85a69ec8676eaa7b094857b5af72dbd40346c7bf2f79cb39bbbf37e977fb595639e0585abc2bc6ad67b097c23a286a2c4c62380ee2d496222ddced1e4d329d5fb47a9545927466e8c663e2a559d4fd78af3845efa3c09ebb3d6d01582609371337d6d83ecb704ce2e2000001bc00000090979ac1a9ccb8fa6b9f8d1747232ea8e8864f3cf83ac87f780d923d33e97a85f6265276e47faac640a966272722bbd297083a0c65244eb2af13e1606259957c60a88e03366a96fc328b0702cd760a399e1c3a1aaea86e4dea5ee70213ff3cec470cd54c52097126ba8556b129d085d5e393c78dfb03b4c3626a77cd5b0d2f42acdd3b5e975a06cc2582ce355071364a0f00000090359b86b1136c91f98136d693ca665141f5f7adf0ddc0b3d24ebe39ed6e4e41b9d239e64256b0609710419eff5f183af46cdb7407aec40ff9d3d291befc3e23e65fd6254b68848954eee73e0ff6964789f04ec290cc99421d4e0e56821a8a312a67970a7ebe83173b49ed73d8840b89a9d9cb0dc98fe9f4feaae4fa92b060a935d8c1406da1a627653baba6a8267cc62c00000090c194828fe951f3090d5c36d57dbe3998258d521b01ab426864e64d06e29e126a3ad8bf44eb471f87b57ab7a4ae675696029cd9ebb22d0531b43d8768a2c6426a1dce65ef024e065ea151a865b0c85a176d8c1e6f882fbe4d67d91820b6d412466f0dad365b4a824700c697093f14e8dd6c6262d7d377d014f64c941ebc6cbf9f6edc9d695fde67204b98c24c4975a621000001bc000000904bdaadd47d29131302d4a29451be409a04d7dfef42764e84acea034f5997dcbe37cb01583b3e82cb83e5c6f66818dc340b00d9e3a89c9b43045a69ed33478bf28bb11cce3ef0f7af62f96b40e80bbba69f3672751c10958bc365f2285c16012675d00111f440bdca78403ccc5411412c66e4e4da0e786295bc665b891221254152b8af23424761cdb74b45b4a9da854b000000905ae0304af7a3c27c9ea281ccc1f646de7110b4c4ed43e3739324c42dcc84d93fc6c6b4325bb3c081cd7159315060af0c6b2d1e60956ca9210ef483f7ec880282606f8a6ec48556f3badd07a2a0859bade234daba4801ca7c2b55766a4e62b3492c16e2b4077dcbeb2a3cd33fab95774791d743dba7dd5572d76d58cc65a95161d1c46fe75c05ba2cd1e8a994d9b2caba000000904314d956bc3d4990810346da528a4f7af2994e5a41e969346e41617b8a6cddb91268f8f471847037fc84388c60eb4cac3d15e774a3e243f151cdce2ce60bf348b1fabddb3adeff2f669172cd67eebd8ae153423391241572e335b54922c21f9db35c717babaec2c746ad769603696eaf7f4a7037893de3c4a2d7afbe6f8374ae39f1eb65835c02e41b176cde83fbc469000001bc000000900d2c37ba80eb50fa643e8bb1b2be6abfcb87e67b9a3199aa54911d35fea3f6e918b7d19c876d978c6af8d9416d334a02a380d5067d016d1c38e72efdd1dd82f89fc0ccf03ed4b02ecf0430f19c8f7d036a4ca56654acb8a6cca6aed4ef70e69226a73ff44595e59920650a1b1c4507efeb2540949a053bd59bd3225b7683d04eb845e22b4c2854f4ce3ad69404b8517a0000009046adc2c903a76594df533c486b5f0213e1bfb5ce70b22034e328d2b40b0c3126919fde6536d823bdd4b6429e3418199c5cdaab29240d4bf6466118f526c193d3cd8d7e9ec4e829271c230d3b558c8503b1e22d71a9e72473e18feb31ca5de0d9d57e77fb27c8f28c11b5e07dd8c2254540e3ea20650ef88d221732a4a9164bfdcebfc77a9f2badbba68231f5ef4ea3040000009062878ac127eb51ad6bb82e75f3d0d003c664b2010bcaf68e8b2cc6001a8911b57ac81fa23591d33248c0babdc70b53f53955ba124a852dc866ca6f32db37a4fcb0c39309e80f73c59ab0d76d41671aaed89b54ed6a85d306cef2c65afc2042893d6f858f8c5555a4e64180c3629acaeb813598f7b08328cefb69b413d5583ac0c4c5571e856bf556ba0c01d4af59f5e7000001bc00000090ff2435a0b914f0faebbd91d4473d7c139e093fb7fb5a7fbfd3976a36731bcf8bc1ceee34a855f3646e37f07c05bbfdc304c8b4e4105fe1ba8f620cac6ad84344ae67c9a98270792c376248abc54a3887fed1aa32da71444ef85cb0c5bf6754d067e543b18cfddb2a2bf05782018afc649a8d40cccc2cef80819321359ea87ed2840e321bafe6f6df4ce11895b969230600000090f01ef0a085fcda6760980143ece14b530125bfcd9c38b6ca47961cec36698d684a520168b9092ecb88d0384f90cb0262add2ee8a6c9752a1dab7f73738d95b87c2f4acbc816672097635bfe14f61937cb5baa0574172a2d84271e6c4dab145c3fda63e7099ea0e3949af3642e6d00d41c19d3d48d86455e6f6f168d9009d8780e81d3f9a125f360079aa0ea5774e44cd00000090303d2297696cd74d806fa47bcb234b1224a624737e75db864007d03a4d006c857384de3b141e2f0846f2c4cb2ff4db2cce6d75e727e02ac0d8bcf7185a00d7f177bd856967359edf67dbd6c41097dd03bd51d1b5523c54c2794e4d1323f4ecec113f36c7384b14e3cf95bfa98ff5357be32226a1825968b50fe076821f5afcb320c8ee22da0a669326cdee408481c431000001bc000000906cce662bc89f0e2bfc073f7fb02b5e4554c04245864b2f8602b3b5b8ce869b0b80809dd2abd376f7689aebf4eb9a9ddf4c1b45204f38eca18d00c03a6c1a7ee006b51552f21ef587bf99f532f0b9289f8e9378a8e70c04affcd6653339149435f6392edddd8631fe099e48a14a3f714a636a820243919b24c28af14eb67b949b3efc7bb1fc8592549f7cf417596ff50a00000090cf301578a705479b2c666d95ba9c33e6b446216ce84ebcb5c692cd64b70b5ff911a6a110725e656b5da4f5559c3fdbf660544f979fc6afde525bed51dcecef52e0d7c786c10dae116109ac08d0d42cb2417fe2e221cd8e195f82c859713f535ac972c169759aa3017a916cade68fd0fbf12ab770072571828122daea5e755e47eb2bb9c17858753d6fb7b50465554a58000000905b43550bbfc6b90c6c71e4e852d5c5965fad0bad906e057d7fce52b4931f46162925b802d2c59930528850130a421e5dce1b5a5b31f9dd5856dd11fb1265b64e6df9d3576b9b1b5492752a39f0941556df29a41d1ebd53b6e3a4076034b2b22a4572fbb47811d8cec4d811fb2f44ecba5c9e31ce6f24de219646a85d9535317828aa378309793ecf6d3955aeb9fef712000001bc0000009002d5ac96e04b1354d51222d6d525e6ba31104b2d19e076f1389f8a6cff3ecb73dd21c8161e41b470bb995cad44e7a4f4c61d0ae08c6acb6e4ec4a38c1e4957fe7b0f385a655164401c7a4f6e50de8c0588e83d37df12b64a79acba23f7ee0a6a0a7818fea578680d50ee7e289d911617a42f9728cce2bbc7f4a2cdf22f3e64dc697871edd0c33ce1c9b179b793a89c810000009006dae99b741eb1404deb4f716aa6b153d9e05ee4f1ca76b2495d9559b1d408939bac110c8dbac10957a5f709367885a802c9df7ae0b4dbf29b74e53b1d182639d2ed888a4e8c250ed8a6f4acefeab665e2a8481da550dee1ced20fae158e99d993a034fa78054330793a31574fc1d469b6689ae9d8d54162d82a6982f4ebd239f152ed0c53f962cdc7611a298c1d1592000000904ae4fb51433228123b9b6110d0cf7536ff9c13daba8e88ea129e44d451bafa159ae0c73e148f91b0b7f04e43230dc4860532d8b1bb623d0ef7e5636ea43fc8edf5a31135f50a0eb7b57a0a431c3531a80d354f9f199a9e36ce690946e8ac360a652b68c56c7df4ad623f10d99650ab6bdc95b401657481352a4aa5f48610d76c236f78b2b64e9799a338a7b18993a625000001bc000000903c5e8cf037296bef39b34178fc6704de6be6b9c4c977f13b9040a369b85b7579564bfbc3ef32baf2d59d016be685f44851f43ec4fc7a39417e4bc16278193c97776bc2bc06178d5dad9747e5a6eb8283ff8b3ac8b11299f8022ea8afedfb356c814c3cd9fb989d851d9e6722382e1b184d7fcae98f122dc70dcb57ef5536850a266c6c3061c0bc501a081531abd0335c00000090be24b50850949a6fb272128474fb4c9e44c4e9f21235c43134f06e36a8d5432724daf0258ffb72863d934b189725a9fb2ee95dfacc5d5568d0f70b7de4140befb4496fdf54e02d215e98b06b0fc32ad6ec2f9397b324c153d5d3dc88a988308460fcb61192b89021848e19f0efb11f6de7d9a344d696d292c960c567f4e2f3f3a45d30c7fc1b28b762476e613a45bb0500000090a58b1f5a78bae600267b40964f867160741759b2db895253e6629306741e9629a1d6eca76350864f297ca566a3ba2c707e3f7ac5633178a517de20edf98a9ae237474de5012f88ab0ed68ce79ba0cc9af44313bca966d78c44f76798775ab86123a53224c43805e4d668574646374c3b5d944a8583bbe508cf6516e68f5a21f1bf5f591fd1e965422ac31a07960249ce00000e00000001bc00000090f9e56638daabd6fc1023090b32bedcf471261843722a57589df71ae6a6fb9068fc9f7fd1a2746d7a3696b7e4552c6a6fbf8a709ad295ea66afd3201783748f5fec2ab3f2516703404e1149360415d8166646796b117adb6aa3294c81795dddad2ffc84d88828d21a751619c15d804dfa695b23298f03b1ed6f0b1b5aa5076c284fcf2d268a181c195d62c83cd6bbe15800000090ef28121a593a23b9575a043dbf21b4f7004de19f7f9d8b43b8685911aca0728843c35ea6ec86bf567e12414e458ba0c4eb73ad926d1c9834b0fe095cf0375a736a131bcdb899c59c46c9b6323f8468b118818e941ceca4af4b1235f6eb2fa0d1e9b6f9f5225a424fc95448d3249d3e672fc868b5b9cc2550f0b63ce2932a31e1c15fc4c8bcec304cd7dc5c91b21197b200000090e7812aca513f0efbaeb1f26d0dd854f2d959e8462a3df8510ef9151e027e4f6e0022c0fa5a5ae9b2fe2b07cf9737d5d3e3c14302ee2e0b7f94fb7c5a22b4f0768bfe97c8f292df7746f468569b93071072ee308dfc981df098886e07495f5545e69f5566b6b2049cbce7030decdb2b5cb7b41f0b6dff5cccbb90321752986fd36856a38e466e521fd4b2e0219dc11200000001bc00000090af74c11a88f7c49a1f09874652ba9ff762cf886bdd68768c15dad92b6f9e121e4337f607c653ac7527a675c4ae43fa036b11b3f401c49b0bd4b6c30e21d20ea4145e357279338288fa4f91ea704e8a5cdb739226b24b268f842c062554cdd33272f62fb85bc76c9545a9989dbaf9b7962c56812b8a972fc4142e97d02745b716576ad36e242813eb32b0d78a64a1fba2000000903d20a276fd09c048d101c8d78e69ec6ca4055f68e0b3ff07fda4cf6bfdf4b0be29d235a77951e58ab7c184554ae31f3e50331dba55308646321cf17c473cf2e8fd37f08cc65451a3e498d22256855afa8f1be99c5d7023363fa700f3acdd5a354035fd19633197559766a56f49222704f16ae8755e01aa305077f1ff2e1fb381db6ee2d45d60a2daf03489428defd79800000090561ca53af312ded7a6d1a45f6d93aa1b1079f2de66713b4a6a2c303ce78fd26fe6e9bc0f61b3a86a82e95ff52ea020a581dd45e2dba70bf76b474e752c260fba9b676e9dcd0a84f9aaa993882d584a0aba6282985a46eafba41305ac5767b163ed2a590d84629bc3d402b21f4c2ed4621dbdc432ffab8b2b4591d7ef05bdf11c0a34f9354189dbbd779617c765073876000001bc000000904ce42b5eec11797c1f8afc79114c6ea9cedd82426075ddfd8a6dbbca559c60094fe58300bf1a7107370f8c6bed505cd3bcea1aba6dc2be4367c69f1f79f45514118830b1424fb0e8ce93de8bdcbb95280169924700023e4f98aaf6419da9b08cd1a792c726434a03ef7b3059c4757d6e3e7328b4876b13bd0fcf7dbc7134ec3d92ddfa8846d014f09b04cf7037b901f90000009050b61813c794d0bf68daa228a05a5f6a95456520afed8a5a0c07ebb4ca7242a7594462868b811c95d65bb08a3c369162f6bc6fb1fc8b9267586dc03f411953e700ab00cf55764d79f429d21fac45539dff80233566854493d4159e35cd15d02840fec6cf5eea625b82c390df073898f3854f3c9f19d14a3f155118b91d629098ca8388ad5f260fac5dea06a5449b917a000000904bc2c01e9e4e3a2f2f148a881b87e635785c7b440d634a8ae7f894c732aedeb8f87367117b6b5ebb585282e3dcd53c42362c962af14bd4e370133ce2387ecc5102149a62089aeb02c8ffab68df211bbde384d0d9d5325c8e85de847b5d810eee257d18ddd970cf4ec90396d34725f691d2b21e0b6ca8debb8c2f894980ce2db28fe97c8c00d4182346cd335219d8c014000001bc0000009080d739bf38be185bab1564dc36940e345491b0ba1a0d519301f946ff88cd36c8ab9bae17bae9828c5aa4608851b9ea14cc6de10f8338bfdeef0890a31282fc30d1459e0f43c63ee33e150d9069b090b573857a013db7442b4147639d91768ce87a93e560dafe84e975f24b8967a91009cb5555fb2e3ca35e25ba3246cf307d00d050d906a8f1427da6eb0e49236e66320000009052160a2b2b01d3adb6ace0f043523e0baa2fee091941ff5b95ddf66db5170b22b8ba578f09fd8c8cf127920c5da841bd7c5d439fe6ab222ba2f7cbb69b0e34ca217afd282d4a1d85c76d8a108970528731c1e4f32703e0ee92410eedbd52d0fb7d2d7797c038e887d69c2e4016c56a4cf9a98df0fecdffe16be815b94b1a5cb382fd02c2ad91a49a5d1ec5882cc574ed00000090102ef5abafe1a801f359491349a458cc2b0bc567c7752fcae65a0408230fbc88334098c5c8ae4cde42d383eba6832d71abe6f4c450f5c14b6f56dd9e0c02d818d912a893ac1694dcab0cf9ec29fdb378b95fa3179a82757312ddf0d7852bb9f1a380f20e8851a2b7313900fbea3e07a3ae18e457ddf5639a0b1f3e7dbce05d8e42db93082774587393b3daf59ffbba7b000001bc000000905f9d5406ea0521e54cc2918df8c5b6b97473424f4d0107a32d0aa31ea5453a8bed2f4f455892d61bed404080577e7744bbcdd880f418d4a091b9f8482514ad04674abb41585d5558d36c03be687ea2be36a493ede581eac13fc309f0b3c74a2edc152217cc24c45fcb48bca15ef00900fd62429786c725a99d1b9edb9b03bc7cdb177909c0a8c3e6822f2e32269cc96900000090c927d7dc259777e39ac2a14352dd6a3743403cdd15c154c3d44d15014018603356e926eb1efe597d34708527cd952eba7a9fc1b3c527427d4732ab4830cbfdb10f315e4e11ec1eae6440dc7f5aa4f53b95a2921f19be7a5f9acabeee51d7d73af893305bb86855559e8bf31bdf56cfe732a504e5b4a2005a75c607031da39ec02a783d92222beb4aa8c4ca142d33bb5600000090c1a905e2bb0dd6c444a2f3f909be4e7d338651ed45be1ee8d55caef42b1df59cc1b2324db5fc9c999b94e14b1f0447ce0a42443028e2207f2df5f5a87a3e2f44390755f9908681a74703197b78d7c95d1a2771e8782388975e8e0eefa35a14cd6ea38bbb117632e8d4f3b4ddcffe3dfa4d63b86b51240e7d7d10f437b9495aaaf1270731bffe191410f6a90668f09deb000001bc00000090bab929e7b47f9ffc56a6698a8586afb23a4aa1c135394fc784dae3798fb20ba90a120b82855688b82f24f1ed8786b6364df9a68e2f0798704c17145749e9e1e4be89447f9cae3a4266199652501f57a779ee3649be8adc4c4e515e2bb5eb6b7662688fef126aaa71429e5c7a06c831d6a3b4fe014084e76c332b02be583144528799385b1adb5a227006e516c7c651c200000090b97b9efef32a05892ac56dce7dbd53422e989e83691ca29d8b33c2be35873522fb4618a8670a13922212d7e552915def6c707d8c7d5b7bf2c27eb86c1745bc79ab35f331c2f7d47bbf973f5e4061beab3d0363416bc6d512f1d3bcc01fe8b2200d690392bddeda24b48651ed9fc04fe54af774b6a474e2b4726d50b1068ace093509adcac756800a16af821d54ec7d1c000000909226c5084e16e186bd9e541267ee3d429c15bb43dbf0b763b357d5320de671721292478be795f2161612269c46f198116b4fc074fa67c80f18d1b4e357961645275e12a098aa4c2491c88033e83cec70998c0490b185fadfd1a5ed843b1f67de377a733e70b96f9a283739eb6a6cb91e3a0ad6cef9f36fc79a8c137e391ad860235728abb7d32d359e61a7c81d1d5e9a000001bc00000090cc0215e729382d3444ad0f362c10056bf719c015218de84e473dc849791d970f9eef969e1e029bcf044160e4b86c8de4e86a615a8826a4337775ae718f0c5249da0b7ced10a9097a6f5ce151b7256c2a901b827c57f6f0ce0574c366dbc01cf1349fb660ad93693d4cdeab0936e38498378823c74e1e6c905d503609b1705481589d96412b8dfed83d65f3c6292614f9000000909934e72118bae1be1466cf7aa6a7fff16e7b7ad069e0803caeed5c89fcc2962159bc74a1ac5798d03622e679750b324bd7e046c5b893cfe79b91da241b65800d912434f58bee9fb242c4c99ddbe6694f4f0a8777d7aa71e3bfdf5c207add86e13d6e96b3998ca754b3b1ab566f5b72a8229e85ab4acd20574e82849ab399ad2bbd593a35d2fbb284522ac11d5abd3df700000090896c70456c2b313d7af3ed9a5c2c525bda692a4eaee80933d90db9e96a419f4f7c89fbe5d578a12ff8e9825b245431f76b851f33a8e353f3267f8252bb4522165b6c4bf96fa512302ebdf8ff64bf1cc283236e096edcb7d3b726f96bd1c7cb2e91abcc042e3ec5e06e74d748fe76b432fade0eb0a9cb20b06806f71415fc8a27e3d803bf1ba923c090b509dde7168318000001bc0000009020562ad9bf630b1d12fefc8c620f2a403f54813c295e87c7e90f527ab1a83f2ca6e9e92d4896597a0aebfb3f63059b413b29f61ebd672aee82b842cd1c41c6e56378c332552195c3a924a4fcae0616f117bffd90494105c3358d9aeb389e1350bbae80dfa5b7bbc7c3a30422f177eae6297a332ce4d78ab39383f8983db42d78f7ba2e78137dcb3bad3964a4e287ec02000000908d9737b8984f04ac7c553973a24c6e3b42c916e97512ebb783a07d7cc71f39cc316c89a37a6ac719a050e31867aebf4dc15884ab4aa256e3bd7e85144f9ffaec76c3dddd8326974d55b4fdb20c1d09818c2241bf3094744e5da9d95e931d76d896241d07edf58792c6f272c4b8e67530fe4f05c662ad8b3239ad450cc084ae0eacaea4c928a730d98982773c8a9cfba4000000902d21ea94707238e11327f310cc5a1d61bcf3b230dd8358c66534dd1e61141a3e8f6eb32018fb065de3e271d2f58e93a73d3343ada4788dcbc38458e908a3236ac828b6260f81ba94e4dd8b361c695272575fccc0dbefc5c37ee856177898dfc6bf745e8e856e0bdc0f8ed1460ef0d31600ef32af4a5efa05d3c1dfc71b80087afb2c6356354e92953cb28285632a5e2700000e00000001bc00000090b6b785a893c9c0c4368bcd283bd218703dcc8f2ecc9f721af430d61dabc087c4e0b0c3c575b9dbb67bd9b18eb7ea50838216d8fffce548aefccd802598cf68ec879632163d9d3f424f5cde402f2e90c6aafdbff67f1d76138bdf0f07aa66f218d7fa82d5b71c96c428086521f0a1b3d99f6570c10c1570def6ebb734ce38fba2d31df12e13fafea1903d8059cea3b38a00000090379a72abb0a5df1331e887d28e17eb23e3868c552d316db9d6630362d9a9f0b18eec57ce9854d860a772b2b25bb7138b79bc060c7d426c6c08b3c850d8db8d96500704f9b43ee791c28c24ee4dcf55f66f4205d46208f33365f534f4d24e0240dee79567fa3959bcce06b3e4431d6207a1a01c97d3adbf3383c8ef83618bfa92e87c57b00fc5188b9092bf5ada6ce3200000009057cc225fc73ba28aea06a45d52d711e347438edde7f1cb29eb308515818601cbe5f722ec0e59b1be58a2db33ac0740bd9c726824cc807a0b6f84817c61c339c2fd95fdf0ebf4d31b3e713ad261bf09745821334d718216ea8c2feeb0d21e31bb6f695b6ba86f8ce95af1169727d3c83434305ebf2a5800ef53395addd383aa6a860f2ca133e7c173a02807ea8248f5d8000001bc0000009090438b8cbaa0fe2876ee6560b32b396f688f9a76e7968d1f81350d8ce0a94e0239940ba0c1a79dcff2e7b0894111ae4969f5b82a9d602fba69377f582be4ba8d1dfed2f84574ee6375c6317f8734a547f6dd457c9027e32bb9c807fcdd23d2beebc622ad99659610852a3f3ae3cf55fb4e5689147ca3329931df0ba8d69f44f9db5a2eee4fed51b3602d0ddc2ee2e1b0000000904679f91e736276795fddaa7f672ee5329fb2b2805ccbdd3344ead6beddc96e33cb9ecfd683b9f90997c47f4fdb8d1aa34c9b2e259d778956736a640cc6b3c49f43d012682b8966605d17066d490187f9fb7ec62e0ac58c151365ff968f5672ce87f5152181252407d6cf5fcf72aee330382c05f284c9bfa40048726d829d715675b02b1bbb158099ed76de7732dd87a300000090171df1386679177b3caaf165a29d44b91172ab5ba6e11e73abba018a0712fb7216150d9914802d24af90df73b5d10e5cfeee085ba89dc862e131675351e2fe066b5edab3ef380d47c225134aa6696c96fc979781acd6d92c1bf1d6fe5a22952fce22b40f9abab339e8c824ca182f5b564f852d5022cec42c1e5808063cad2c0a6899dc91f4b4e0f014d41ecf30b0733c000001bc00000090f73cda38e1011799114681aec8676d15cf04e1996f7bebd9620b3899d2a88fadd31bf6c00de4b90d3d33631049e855eb455a0af7b258a3c87c30c737972ac5240c474d9e18fba22dfb6cb19113b7af3646fa5b0c4cc78129e064ed53a5dfce38aee2cef0adc1ecc9526947508a0525ed50dcf5a64a6a34c8035e46f154b3dbc91d3b62396072e48b7927ceaf80a948a500000090a2c90c3fd62e6c3b9236753c545563ab765db750c0d46fb03313eb289c16e21800ea14b8461d404ca2a3c132e15a2eebdcdfda6fb26a53e1c543a9c15b223533b1647f7aca04960a0fe6f18ada9dd4013a0976129cfe596f6de5c0eabd25b48b582fc782a503ba4ec03a1cc0e07213b9a43b13551261e65fb070f85e226b2521ad441db4038781eed1185bc63ce3dc7b00000090e4da73a3e62cfd1e71baef3b802a0b10ccb723bcf26f6115ab679724e6e08d1a589baca7fc9b1088e8bda527540e3d2d37c06341ce746b8c4f4d6133375f7fd13d0ea62b1f99fe88b143a5731be5f648e8db78b0352b87bc7c114676ecbf14790f5e328ad74e914ceb0d87c7dd9908a8e012ae04d037bc0ddc5c582cebf384aa6553fa166b8c639046910afcbd64ad68000001bc00000090857e1aee424f91f5699f41b2b6f3bf426eec3b2aac6f23f18df162c275c5c981a1f1c50cdaaf71172438bf825711ff7ca25c98e693027bc89aabfe189498b4f5a3fb62aebe2428924afd861410d87ef97254e972470c67f4d60a4c4ab6f3619b151ff6384b4d969f41f9ebc7068940b006fc39dac0c91cc0e867a39bfb65b855fa75cce185ecd028ee9ec9e79534a9cf00000090167a6241e3a93f0138b987eac85ae919534d16dc9a80bd86ea97ffdb0b9b6042d75a6fd0db555bb907336f013dc8ebb30c42990c97fb0a770742fb27cec4e37b909788ce1338151890dcbcbc8c5af9916bec77f98d4cd2c358a72f3662eab1dd157fdb71b58ea8c95e44c6f6e842c107ea4042fdabeb88cd7772bb01939449b3a84c95589b7fbfc8b65275af7561537f0000009071d5c3c0bf428b360fa2d5b119e112662503032cddd90044d840d6230cd305bc1ef5629c4bdc326df89baa9b27f8ba45d932d8b193c01ef48659a4706c4f00ee893fc062155c71ee0a07d964106e57f8d4fa6fe30b75d32fc85cbb6bb51bfaf86c24842d317ff4fe76663ab6ab358ccd52d81d4ca5e1f51d2c63269c1667f6788d0a2ef5abee5676692c32c63eab63e8000001bc000000905447d0488946ca5c41b79d52ef05da1889d794eff409b97f7c0ba11327cee35fe4481a454324cddb7dccf17ea311fe6aaf0d7d5a8b813a5ae9796eb447b4e080e5e96420503f3ce734879dd26a945fcf3c0517a8fff0501034a03c12f8fe328dfb4179db4e9ebba66a1a4ec52e63c149159d0c7d85390fd7b458860afb0706bf6a9d4b4cf7bb519b105dcbdb69a8e47e00000090bb17f41eefaebbd2e8a125e590260bd565dd1160b71761a311d35e1fb466be6b4edfe197c926b16b21ec942637a24d5cba7b0a97ed452c8abfbaeea57f84f9147d85059d020805dd39e9a382707c6c50e3db9740a25c1cc806acd0f2b3b348732d0b40d230efd56be31b6c14c8db7f323872f465a8c8c2883d802b537cd033fa22dd2d94d41dffb719209c7066faf76800000090fb1d99c034031173cf99df92d2c1466c06bd9fd2ddf61d80c7764ec2e9b3fc39e3754f8385d47c7cbc91853a2e230d68c43ecbcdc05148c54bf4bdd589c0de19234f13628c5173e59e73a21009df9cb2ed5fb9c2f572f3b6eddbdf12140f810bbd0d43b740b45f16a6571e3890b7d0daf91382c6df2a6cf694f755a3a54f2ad7d4e08a3c34d136981ecbe959a88a10b6000001bc00000090394bd2a4044e0fa016de48eaf444b3166f1155216741ca6cddeb4a8635bf438146dc5d98811ba76954928ed4aca1ae6df227525a888987d4d8ba94b7c8616326ec01b5f37da8c4af05b846737a1ca500cb2865a53eeba6cff09cd48cb1ef61dd56adf08f0d02d6cb792db82dbf92b24b4fb3e6ee985fd11f2521dd4eaf6e208d76998c8d8ee2bcc58382e8e403a6061e00000090ceaebed596c0d16e317d6bbeefc1256611ecc3711ace9376cc4204cacff94326588f0f3114653d57af1d1c72ed28462e6820b3fc7392131938b575e04712c03216f04d2a8fc6d2413ade9058dfec7f5e36cc943ab8a741873017c17c57869929df35739e7b7ff6aa64182ed1d21beecc3c7c884746fb05eff157a60c13da5a04ee701972f5103422b5b20f875ead5fd600000090164177fa3d9453fbd6c7cb4884d3b7a77e056a7e2962273c809411486775c93e06b6e2f067a1b1da7b7deb8d1cb1cb3eaaea0880d2a898591d12e6656c44db58b466489f58567f88f9d5e1f19c26935fa13fc182a358b7067af8a9fad9265d3b05f1220ebda17412e2a5f579d58c7727d5d151d99530c5a68ca290c6014ad665eac46eccf1dd4beab4add602ee4a0b3a000001bc0000009013f0191618599cd9a94329b8941fcdac9e8f2c843cb1ad35077c6312c089d53369b012990d86772aab4184f99dab44d4dabcab6894c540ae40c03f3c97f0739d98dc70c26f3b2ec3ff78621f9e255f095448117aae033cfafd752da06b13bf47db123018a68019c84ea43ac1d534fd8b6ab5b160d5764d920cb896c2ccf492d713d6495a1f5507d26866b8d8ad24fe8e0000009088a2599f38885350473ee05bab6679aec3fd6753be0b0029d3ded6f1a7d781e6828c47a0c800da06454f58c27383aa7e6ca6dbe57453a74ec6effe58b52b0b36e972a1fc5b3d965f8d849dcde51921a6b0755e7e3dd1cb7ff046cf1496f3dded3bbe5bda67b253d6e09ac2ead6ae8d7c2b763831d67bf238756cf9feda6a0078dbf8404268be7c950a2be61e1726ef330000009094d580c24085ec765663c6290fcd6b482893e572d671dd593a8ac82e50c2899db396a0474cfa5ba8d6b8ed16dc32f95af966916ade952275b586589a81d0c7fae4462e5f7569002eee9e419369dd1f7585feab27fd512d387ec76c4a38a3008691bb586210d1f006aecf9f5053362341994b414a0afd445c9192368596000f3528002e99747a94749be62520a9941419000001bc00000090ab299d12da5d4400c0fb7ede1ce9a277dfefb8ac60ef4822a5d3f2e2cece137e0d386dbfc29d9e612821b416028b692eea91374c805d368c233bf6acb49c8ca1d814a95863ef18a0aaa6351550205a065010b875e2802729f30777c6442a9f3a725de94b37025c070de6ce4ec381e6bd2462bc35010939e34a13b802cb58455ea56c994263367e6d9d5c30c94fc3cea10000009085327a7bde96de64cf1ec0dd4ae3f6fe4893bb14ba8a8f210032294c990cf6b8532f184c440f93d61eeb66b7f8f4900026d77e3c7fce28e5e8479aaccdad7fd97792199b48289ee96021f658f9542994ca61997d4e3ce8de1ece2eeddcc76c745b4de2a263246f98a6c120d4c896c1cf1dbfda47b149f41523a6ac90883c32d41a82210ae996907d5215f87c20010a4400000090b9297568777df8232be5498e8608b7244657c6240ec9b869ca97ffbd5cca719f0a18759e2fa4b37a7cf41c753adfd4a4803e2c9439cbfa4420776dba88391c9c5a18c05111fcae73dc406a731e9d2296758d195b6823c5853772b44583059794fee392be61e2523602befa969cd93915e2a2354eaf942a28dee21baf732016656ebe18812de6682dcafd4b43a5ffdb4c00000e00000001bc00000090801ef9c2577ec82636d3cd9bddf8fe9faa1916f076983c1eb61db7cdf5284a554b54c708549f4a16fea0a64a7509a7656d7ff04c0b6dd5b92b76641930d3ecbf22c0c96082a97cad9030dbb6287e5c4c9ac5078e55f4f8a1bdcbd55a42d9c882c1563509b06f4484a793be80ecfe0e42cd3acf1f33fab869b03690d0e2c8995e3fef9bc8a02f4cb7e9d076ba2cb0e8aa00000090c932ad01f8bf981f307cd0678be81a254fcd35fe1dd01d89f4dbc1a08aa1b6d7821e4599904894618943195181dda479755864f7bbb228795182ce13ff45656bbca9f56112e7d630bd48f8490b013067141e69379d4ccc05f08c357f8e54b10bf8ac4731da861cea9b509b90c0f76fdd834371a2de507483b09b9d402065fa038b4591acc7c3a1726616c368d64ef87600000090875924116fbfe13068edea36b4029e0f8684bd7921447fd7cfb85f2ce489b755934b81eb2dfb0d318cb390cefead098c670756c2204a29d8b53f6284618638950529a0c5c6bc9e927efa083b460a275c69923a91038c0089470cbdab7fb51d7ac7b05e20bef690eaf28615d5de31b260257239137bceefac894dd3803070ebcf0a743b06accbe856b7785d0815427796000001bc00000090c1524c555d1de312b4d6dfd4498bb6f0689f10df8814c31dd2cc9f9e47cae78f4cf612c9de50d777cabf50e738f3076a1d4464e3d51631f72adf16337c02d58da83591df58291f8edc2055376691623215a04d791b2f70d724b4999523352553eebeb5a815c66504d1f6be97ae94c778e606d4ff110fad07a919469eba144602ad947f2f1cf21063d666f700bcdc152f00000090a4f0fa4eda04c3269acb3b63bd19447076a8df4d3c7f4ed3775da5c54afd384d84b0dcff3a2afc5dd9d9c604f0716208b997a22a7f0ebc3794dee40ae80031b4ae1e695636fd8675eeea73abe669097e05df866fde70faf4cf15c9d9eb01645ffb7fa40a8ec963802a6b838b47fd91466c838102ea392c72d20d1cd2e2cd525be013551576dffa28bb6fbf2bde78b6e20000009031a6d25d6b5bf8d27fcd97cb17614b487ae1fc7a3296a0e56c34492b7cfe3b52d542b80b0114fb19b7527a8b7fc497a0d88fd8e29e8d86552cf56e773dae95ad63502b0fd6d487cf69b9c23b808698ce7b707a40b5b765da987905f0979b836aaf6fec136f7427c9f53273c7145c1cf8236f43ea369ed0ef4250512935073d11e9f1a2605b9e6fdaf9953c89ebd1296a000001bc000000900f346de1f80bebd75770adeec5e1b40134cbb2c6d8f71bcecaddc6a162646a7dc1b546e104294f9d399e0b07274babe75668f43cf1bc1390c6c7f03479135102d76810e3006c7a1c5691a677f441380b3749e616b1853ae1086c2f9de1ec1158a5966587d30fc7a062a98b77de490774366ac4bd55176ae71ebcf97380e3458f99a64c68858d9a542d787c419407480c00000090afc3a982e9b18074b18f8e9241af438e78e8ac319bd7db91a3cc42b095e12a18dd961b24b8c863a0994234adbfc2d6e7483a79e4d54481048d90cccffc9465218ff5f5d901203764b62af6b4db57e2602543585602e1f94f4c086dd69c5c9b37edbc03abffdfe322f353c5abf54ce07eb8ed5e805a5bec7d59d15256362230beac173d50d74e67226306ffd589b5c0d5000000908c9f222581c07fb644955af88c1a00a64c28e97433755fb8d2b824a045ef3ef9718e05c4ef36217d6bf5167ad0a5f17798cbfc967d8db658d369d2ece607d90374f295103ae9d79a0695c5def30bd3a43c4e04d2d915f347f444225e75f01ad2d68492efd52ecb47064ff9632f5e47a8d35122a170d5d95428aa035584ea80b6ffe3e499ea40492da1d7e469a030ee11000001bc00000090f3aa49be1ef2da782a3a250d14a09a4571b0b2875223e27ecf0701a757e03405d9ec08c8bb839dea797c25693021bb0695d2e5629a2568ddaa8d79b3316a5ff059388a49c33c70e4ff39cbd33dde9f049c3a9aa1dc9f5c0d8143641736d572c1e3486a58835a47adc0d8fb9710f1563229892d45e055aec29e9531fccbe7b46ceb68ea5529ebf9d415a5dbdc86bda1820000009030629b2f31fbdcd559bda5bbc841d7fc7127e1fdcd05b92fef2dd6172ba516b3712c6c0919fea5c19246b15f5ece0e66ee60b84372b840b1e7b8b7e710f105b3406e167774acfa409263e612b92705475118cf88bf9bb02f87bfc8aa22602748f8b4dd0f60ffc56b4569ddfa8b2ea728a18f6de5bb6f67f302eb8284f7ee74b6ceb8343b52bd1bf47d478b3301c7dffc00000090219a86279f2a85edbb4d6f8431b1add2747a087197466d378490c9193749711b0bb59b38cb7fd15898272ca2dbef517963f6086978fda51cf685209158d6222adffc82ce8179e30ea9bf2661e10470f306835488e054e6b3253f78a2fe6959979ba5d7c27e3ce187fc6ad8d39e0575aa6ef7be38938bded99f596d09671890fdf64d98e4ac0c987228b144dcf6d3b3d9000001bc00000090b5680313dd737e26fb80af1b3a2652cab7da5447292c4317006f6699ecea9c48ed7cda8733edb6ceb0467610c4c454eb79779920fb67e1658e5cdbaa43780e0822997aa6341347fdcaa032bf10afc63c3e32c4ab0a79943d9069c2ee16c1ed6c0afb61b3b468e2dc389dc5255e53d29576e823d8a446c27146cf9edddad9cf73f800c123462852b2e5e4262db101a13400000090539c18db539b56c610e0ae6e65aff959cbbe87a2d1265e9641ac1c6e593a61e5430828e9cc6959ba079cd68372f5ebe403db4b3a765e6596118cb67b36ab498e09592873b5f65b5adf7ae22bdb1260a35d66eac4cec5ba2f25ea1aa098a014dc88b399e16d3bcbbdfba407ba23c652b8147e044a93b354b46ae70ff0132864d5da00cd9e3c3a3d3726698cd46813393800000090d689249495b3e90523cd0c7cfa1acd98c279a814ad02cead5651ca56edb9cff526005591fd5c5630035ba8383e59e11fccb45700e3f0f185ffdb7a2d6980e57536dc68d0f3f5ea5af29e04d3ab2a4cb396c6931839b74e6f516c13ab1c1705bce0c8bf55ac11796c0feee88162d3ca18daeb835c13d187dcf4494f582d5013b5b36cdfe0d8a01d2303f68e406643922e000001bc0000009033c59257596f42bcd14cc4931da340546eb7ed481e505983ea174a65f337e3ddd8694b4bc91fb9c6aecc02bb26bf4be45f7781d8c71268b898b0a88ab612969378e8746ededd98c2bf384005f182c002f356dc7e9f441aa18638f7cb970f68ff146335f746322443e427e941d567d8b2704e3369a4b7cafc3857e8f36fd05b3fc655dd4768421fad2db557b6c7c4fc4a000000904632ca5761f5e73e9c7c833817c97164030c0fa8b96816ac0d0240256c0b823ad8f114c1bf1da4785232cefbbaa1eb5c8e7148d795a8507f1878f04e61bc372413360ec0c89a590d82f66db9a7da440f04aac88af5e636d3316d211f44314469fe2bf49a563f73d4bf12b7b318fb30538c3dcbcf254e14cb686177c876e63a4f88868fb35289fa8de8a8d230ad7452a6000000904b24f06233a197ec6bad7cd38cf4bc9fd4268b7e1ec2e5d3e216b44c2fd39b7a091d74e4444021e4b2c34f7f6937c9c5eb60d20c2f5c3826ae13d21bbfdcabd5a1412cfb6e725ef24cfd96657034a248b4f9923f6e7ed377cb8082d928a0948f952eeefca63ad9fb5634dc801fc3d0a1552ce4d63b60f953c560e6a1ccc5dfd2ca0a91873b6dc19b5d16e4db432026c6000001bc00000090145a6a31edfe177e2a1f9722a3aeee99760da5a34a9b69ca0a23c351f41021478ee69c632627166c2e2bcacbfda3ed3e7274b0d71670bda552b51a53c98e334ef07f4f7ce8c1ec45010f4d875cd8a85ebe0af3c7644d564eed7b2909bbc7bfa0be1b43b65e660bd592476fe14e73478ea9e109473a89bce38e34a75d16cd09975a4043763fc1b17cc867e05888af015a00000090fc1864227ec8804b378b445c8d92eaf0935fc6e49a1bb5e62f5df74e576225a3ec1b98b06bff1ca40d896a0b3d1fd5da1592fb129528ba4d58f6f195866c7d6c48b26b475a0f72226099e52a51c2259b7ab9edf7765dba7454cee56064f27eeac649e798bb6353b2258b098cf8ba89f662075b9e3e7d5244df22b9a6f5d6c30e3da30db89aa20dfda1340667907efd3b000000903041f714a8934ad43722f849083e7a6585d66fddeea9be2f423e6d4f9a8b935d1a88c7e0394b53aac5bbe8606742dc2182be3e81be382fa0dc7506a120d7d832832b69f1094d04cd5b2c8613dc858963c5ef897758b5b5deefd5f8eeb76dc92dc996472cff8c2d8d2e840c843a7d7d44a7f7a7461b9819412fa8b93c1923b8a689ae21e8c6bc560cdc13455dd1ca74af000001bc00000090b3e2eec14675cfb9e6fae9e2839f095d822fd6181aea14152a4ea49cf7b89242da9ff57e0bf78e006dd3d83b0b8be5e884cee08bbc965f6953efd4ed3e86e25ea6048f35f4096c0f96503d21aa4990bfc28679707704e3b8a04be7fc25bdf4e509a0584c4772f9e08b1e9436ec371758298cb6a41a65fcfcdb333b12969e112ea444b6b1d1a32ed1f4498b1d3c8d990800000090f69263003adb1ebdadae02462f927195e4012704433ca265ae4302a17056e4ee1fde8ed8a24d804afc735761c06a5a0ed954ff73a9698e88aa68717a8055032cf0bf3d9eb51bf7c90dde3f8e351386c850281bcabe4da59e52582e05d64d74b4969e7480284bf8fd8062912d4cc469193ecad218a32fa941cd63761ed22b637a4401dd09847c9364389a8d780774a67d00000090e5dbafefb9b1634f77bb47a9183ede40562b5c9a0dc801d38d0b90fe57c0af4a5fa2a7a6fd5f079659e22b9aa6b79f9ff124df2ebba44bcf1942de81d7961420889728a12eb054ff6802fd4a20e5bd047addaad41b7d838cac5def04bfbae085b804c2caba0ba79df0230523629e59938442d6659a25d8a1d99e09a1397fa3768f57d79924ee76da4da67d008eaca622000033a000000ce40000012800000090639d486cdf8acd57ef037bd52e740d927260a038bbcbce4a25bde98af3f670bdc7368780be3cda17b9e8e1c825b02518927735957c6c50fc33f6083c635704a9cfe1d511917acf0f63b246303b2d782cc38fc32781d41e450dbea20b50c5cbf1a1b673c6326b538f94430f5db70085f3d9d01b328f165f0e790136b52e7ded86c38eeca0390ffb4463e537ddca0fbe48000000901d83225a50847a2925cb255c507dd38f4645f05d85941db543000b8cbf1252fe12a18668514c4565dea3f9b88f87fffc65a07af88a5f6ab57a79db7be69cc8d52a2064f511c7a2a04a85fff0e2688821b713c3994301835d056346690f9764e5a7d6991083b0484c5cbe7961f4bff6dc46658c8fcf3529e187d781990f2ad7459537733f81e8212205dde6a547409d900000012800000090cbe5f87209419bb150056d00d04fba5e7386c8d0926df7a3c619c1cb7285a80b542d105f55cab4a2929a1fa5fced09fd4391159d41bd97e3c48b8527f1a7fa720786f42e149ff3684b4602e9c721f841729c5240e02fbd72a69334f1fcae9925f661997b5a6f6885fb6fb35215570dc50accd2888b39a6edb340592c186a8f0c60ea6edb1c10fdecb84a6db4cab102f800000090a4057e4da28b2d51b0cb9a14ed984359df78af483ab432f408ed202c48c4b9cfe3d2bfbc69b3158ab635863f0cb918ce6f517be1a986235926174dc9f2e90752b1d4001accb4fd267f5ff6299d1831672848e7f17160c03364fb5a00e29822c884db91413bd63ae112db74a1fee36fd37709c5450548c1f11bd7274b518871cfc02606f22a0f47e2a0caaa158b4df7310000012800000090db4b8cdf217d4e8d5457bee548314bca5d7d83fc27aa60f87d459cfdc6ae82f757614de089da919dbae04ae77f9422bf1b008dce97058dae7a043cf1d9f82f6e3220ac8c8b5f1aced6bcbe786454e2156484dd8449e1633ace23b50b813d312b7be8a33c5e721730483d57a6a2ec3bb08da97a5ca5ca787ae34e4ffff000d9d001228941442dc2f3bcd9871a1dac37ae0000009065d2234018f4d38a5730ec5510036db0a1c6293e5ac5f5c97ee28729e2fe13357c1da0119880138d20e25590e624261b70794267f4433d4711adf2bac4c08757568c52d52e0cd182a40f3181a130fa4964886b5bdf34a102bda3b0e97830ee548a2e4ead76689aacaac714a62f640128165d477057b3c7b6c9b2448613c834decd7e5ef2ab4f50e9f32acd6d236a20fd0000012800000090a2fd7da86afaa8d81634276960ab4fc9b355c4fd2c3ea5114abe4caff0427f96f25cfdbee7cebf96d35d294b96c22a087c702a05914a24e5a115c69fbcbfd25e21c971cb3697127fdee46c11d4b9c30c2ce5de4259e41961522c4118c2ee00f2b70bd7d06c5422c26981683bd61a6ef754e087a9eeb53b16e3bcf087cbc8f390cfe97986f1ef6b0234493e9d8806275f0000009079d388084b1dad045b2f73306b13bf335be555ad14acdc26ae123224ada033592a2be1d2ad3a942c4c532ed1f0c1c1ca9316e10fe474e12dad4534eb8f4fa045803d50816bb9579304a7a00aef983b8fb834344fad8b4e572a766fde8676cab6f11436fbc448abcf88afad3969aaa988112a7c5b081416d4e70963f108dcad242fd5d15204d370b9ae2025c0f6faab620000012800000090e0156263f20bb92a39dd3049cf6f418143192d5904f2734340f55fea7854616030766503f2136688003134e058481035725434bb5a09b2f16a61ecd6f314368cb7e567ec36c42b17728f2d47d71b49d1853b4988d91dbd0fbabf36c98c327b19a267d56fad2dc1f05b2bee17002e3e00941af273c5e9f84a5cb3624a544abe94305c2d5e290fa0e8340a084825fcdd1100000090e755259e0e6fd3b0d8cfcdcc0a7ab644ecd780e405dc3996da1f784bb132cc34d7f800605d002a1fc88f9f49bcb408069b7f81e1f343aa1c6c3509fda4147b8cc2af53745e245f7d7bfbf177d49db1d6ffba6fec04c78f3556438ce455c18e9d54d1815229ed43eb4eccadb65162a90e0eccd7b628fa5649f3def35eb04361df8f863adb0ce47206df3b20fcbab8417d0000012800000090103ba4b387fd9e18befbe1321a17774de0a57791a98aa00ef7985afdfe51787931c2c20425516fd2474ad3bf2ea9a1dca54c7af84655cc99cba7c2bc82107809118d13fe2db6dd6e89304486c0ab9b2248628cd2a840cd379640bfb9c1125db845214c941bf00054baf2f7cde366ddfe94904277950663fc4ad23356875905a632d2f9b51135f6ee529fa7a0db622c8900000090a9f7c79016d72271446f8b8f28971a011db5e1c26dd313def999790a8b28b94165afb94360cc66edfec6afb41635cea260d3ecc87c0fdad7f7194e3b4b2e68b2ca1ccede1a7bbd9a1fa7cc75b3aea404052d0d158cc4be13757bc9f15c34f8326c2194ce4674fedfae84b0062f2fdbcbbaf3735191885d22eb23d7c37dbccb17c6c73bd6ce64e1b4efacf04b2bac202d000001280000009004bd547838a4f37fee8a1baefa39987c4c979636407bde403d8d4c132253e17d7a8582b5a0f883527c36c5b766b7e218e47cdf5867447ca50bd936c7d9d1443f06429beef8ef3cc0e3b4748bc87f65fc285fe5f34dd38207c9103418f9adc69427f697d1b2a10f8b80cd79224b64714ddfecb2ee3927a540bc0f14ff6c6f98d85397e4923c5ec144a1444fff4e7dc249000000905e80407b1c81e498717666a4ae03f9ca54ce14fb5ecb9322f0ca9214a2f35ec5475ea05f21b1b634b940169448ed2ec1d72c3ab9aed5ebbc3abeab2b5e1ed2b86db7940028e2125ab67427fc5399e605057f05642423c1618042318484ea12b7686b080a0162eaf692e3f8ed5729f9931c15a994127bbf8d9c2c3a2b41382a811804ea6eef3fd871505b44a43e1616460000012800000090be9b4fda861bf7888112ef635cdee9a91a3d21535b7362a6c0dd53f556681f20579748d7918f0dccd5752dcab5d3793e6f996af0ecc9d061686606dc42c1ff4f666473fc8091e1925887df5338eea6d50641af70b95cc5ac6c0f2d55005a6b4aa0c0358889cf9529e9fe997018ac9cb16b1186cf1a90fe071ae3bae3c602a6396db6ca6f499bbafdc8ac4610fbd33d94000000903498f0e293205cd2082af437d12d1619d59933be6f9d0d8563bf5c3926434ba6abc87b4056c775e78082a9a53a0357fc67eadf16643000af9c25a897de7a076b0dc6e73f5f39bb42a875e0121bfbf6d1c6817e970dccb8045e71e92ef1ed9ac033cafafec3ed0e61cf79b00b3917a7cc3e74d4eb6fdf4e4255185abbb966769fffa8c939e90805cba9c1d027f235eb12000001280000009072619021db2578b89f28361d759cb625b80707604a73e06e16da844e8e92953832a9d7d8703bfa56a6edb22fa80a55def20914c155f6576038437b26e348ef7613f4fd8616f6ca34eee1286c22b917337072c4fd7f056e2013c85d480b81b0295956f3413d532549f31bd5d1a7fff5928a68d6c808a21d12147beff79b97774dac67575e68654e0c9e4b0bdba043b0da00000090b96df6fc07703c2d4f7b60cc45c2ce90925465d435664666c162e2493fb6023a4472c5f6cada4017ae3fcfce8660c0872ae15efbdac00af8c391dc23d39fc94950b6b4254b8c8e64241976692a14e5a4c80bacf1a9091d76b3cb1b3ddec01d749c6469b28e55f457d44ed8540fbd9dec42b49e9b7eb3461b9e03b2b2db210fc9408bf399c69855bcbf5c94db97b0d6d300000128000000902bb67c2d333b2d72140e8125c20d524321de7130124c205c8033f5a52ef5751cbee212d1e9f8fbd55c9ab593bab90bd8d0fbbc74cfb7d2079f7fca70814457e1bd0f15193e3621e2ae2dcb4b666ffa95cd90f27ce22bacdf3c32bed9d1c077fa3d4b0029aeaaac7c0e21097573cac7833431105bd4f7cac41f950e81ce497d073fe041c0b267963d351e7f46bad85a2300000090989a5f287ba771b3c486594cb4e206a7fc8aba4e4b7894a5c95e92cf705983efe0dedcbf2966814be4a00aee6b386da748020ec285344fda37a0a533ce4a7161789a0c499b62b19c62bc80710f5d64dd8823e68b324a32e2b1c12335be5a8cfb55792f0f8dea993b24374838cbb74b1e067d79454b3753b758d12406fc63fb95887c8aeeef291add1091e21a21a531d90000012800000090086f352a63a2c15b771e0e95cc484d9ab851d45ece9022a2fc16979ccebdf6cd8a281d080d948dd0da7f84a3d037f11d57fa35a96a22f2b9d0ff7094e3dfb5b59b407bc65ab07c59c2b9738baf486dea809514987a7b46bdc7162db13c94a09580abb4ba31707e18fe0a83712de26f5d28b97877c9b4f6fb82521097d5fcee5159ae26c4e90f70b7b8a2ff3a0be9491e0000009025c7d37f4395d5a199c6c99fe93e7b7cf5c394699ca0564da5c668b1b4a0789681354ffa1142895c23a4115e7ca67ee112af0bcf0e5ccc798d9bd3eaf0fe14005b25256a460585325cd7c1f325edcc0e161c001fae73fbab5d24f9ee352c9ec770be8ba37ffa58c52b9e9ce3e5ef5a72d9e75a9dfe7e1237118eee1c6a8b21f0eaaa356fc29286ab04b212aa6d110bac00000ce40000012800000090dbb4d0d2a8ec9b5796f37e0276b93adfd82de35fa8ddedac71f24a3afcc1fc70cddb2f0d10966e8434bb4b7e5ea542b9fbf64f903effc84e1e089963e3aab331c4569d6d2ca5bcbe3ba69fce732432d3b7ff889c3c810e3a4fe597e10a1e51f9cd77e162887e3f12d0b2f1797e80c2c0ad744f4c78c290ea2bf3e3bf90251b5b304c7fe0e8881e9d6734da71614698dd00000090e15c9eef7b9c18bbddf844771bb2689cff590cd861b042087c7d5749e43bbf1b07c0a99a7db7fabc0f59f7e5f8c5e86f8867304654bc12e2ddcdf5066e3081348202c12fdeb0380f41bf7bf0bf12aef785960a82cab387ba3900e5efd50dbc7275452fb6b2a3c7e6d5905019b5627c3c9b177e8826a57737cca86a66ef73d541e80c25f2fa774f84117b434af3f03aa70000012800000090237b304e7115ef24ca0b6af4c6904442432c1653d1f91dda11667a3391e376a8c59b9494bd9fd8a3462a58a8ae2e43f38287965d68ff229f05db9ea2f05cb42621e99230c1b6eebec317dc511f75de10af0ca3f3d540ac79b4de653802d92487593d016741aac8d1e6f767c2632c80fc12b3fe9f84acb96f73f4e93573a0f9f4672356fb526981d00798e3d490ff622700000090d36abf7a4952bf867dd1c2d2ae4f5fd680a698e216c39969903b289cb79464bd00d28d7b81f3c19fd3870cea5d5152cea39d2b9ab6b00930075f258cc60b036150984914b301248279e5652d4ae7fd2767d574814ee68c9fb37a32532003e1bcb4875521e6a9f74b031cd71699689597753451dc29abc51026fdec1bf0b522e90071b356059ec3ca16d05047541581690000012800000090cb8402f03aa6f308556bf119609f6f02cc0d2aa1af938d6e56be76de6012a6ba66ad93d74a8be2e3758976c78a1d84352be6a8b1dc8deae64670304fd476d7d41e20e1b02ea33594014611ba725785fd0be257de48c00be120a5f233322741713f5da81edd9c6cba8afd48089d158d0dfe9eb236bae1290cffe993b9b8306c51ba8b6d88c2fdcd4cc5f3a94aa0be6a82000000908556eb17cbe123f2d0304c877536b7f6da54fe5c6a124b6df08098d77c7a79d7d871dae6f125410320f821dca432ed032ae877ac84f821568b7daf89631392f8186db2ebb30fa836234ef18d64aea7d13d2fd05aa3789c14c09a4938015343fc06a580a43fa333e6be0848f494e6fbc0e6c91ec752ee98e220897cc39808a1131c8f5811b4c60568755f1f419694673a000001280000009019bd42cfa2a996fc95214b0a1b7adbbd631dac971238e40a723b018b5a75787b34c00b7ee71f3d1cc2f160f6b395334543f03fe872d94cfc04c4570a9d3802362ad77d482d6c650696580ff7d50df656a14d82f9549a0c8c4b4a94d4b01730b50eafa7bf8348415b88dec562fa729e6cf4eb1192646d98c279ce586af89b0906c38ea22c1d7851c53639f3d598ff864800000090aef905153f7086f16d147b2ddcc9b602bdac77f4667032b7b874889fbdc7cda53099d931a61462d93a751ccaa750b3a8e55693a687cc02359177745540efb45f8355f5742f44bc19572ea9e5dc0c090288127569449d536728bddf98419cfb073cedc949b52cbf25e8d7371ec989708a452cc8819922688d639df27c5a6f1f89ad17b79a5345fefa4afb930b655170a700000128000000904d010d18bbc916ce1b9cf07a77761275b8452ee8432c84c45f2f477e964fc5bf1510da3445b0f879597fc2a1d0a6cda10c47c58313f76be11f9250e43082db2c2f2061a213c3d954141247ea2a6c7e4836ae3859b4be1b7e210d0f6174fcf171ba9d74991c74af9a6b188b56c7b86c08846880d5348b7522f31f15819b6db28434535142e1896f4063a84fcc40c9992a00000090716ded02fd483c28d914a74f40e01a1dacf169f6ecc39ff2769079726b77cc7dc3cfe9647970fda3ead30246f2bb8ce41e041a93b690c2c954c305aeef82193e086c1803c04ae989b9ac025ba9436fb36e855e2c7db6aaf202fe6cc400e78eef0d8471d1946b3b9103ba82bc0bbb3cbc22bdff6de9b614a08f3fa60695cf944f69f26ea7981dd80c39a78a4b6ab2e6170000012800000090482ddcea8042e342790b5636a5a253c4e2d242dff8aa93c4e42eaf144a7a43c645c3502bfd25b163904caefaf223321c08aff19bf387485183d163fbfbd2e4c4eb3851fb9c36ad06aa42eb3f77d02fc7d6dc85b104fadd34a87e1b1ff9f6888630e641f4110453f6ef24256db1e7f1a70e16bc995c5b4833b454876830d2337f884a2880bd3e851c7762343691fd642b000000909e394aa7821fba6dde93d161ad4d0a20fda7271f4e2f6e75e6aaa6e04879abdcdaeacb6a966c1377dfb0a9be44308338b5ce7eda23a9a132ef3dd00ad9e33aabf208014fa7d7eced6ee23094059a9c26a70777e1452ab451db4dfbd3701e04aaaa6ef712b609559504193c3e4f20ea1e7ffabd5d98d837722fa9633ddfb557dc2b28908364fbaa10ff224a6db2d759560000012800000090c298a805b2e680a8867e93addd9426e09d5570d808085b1c593da76a0400d27d559c39107d45e0ffc6d0737c8750605ea0ac4d8a339162f595c9b9e62488d921a22b120cfd1ccd2486cfdff659910b3cb3fdd671702b7540c85d27708f8ab86212816cc4c66624d9d1d9db16bc6d1272b277c887226c4dd3ea3d005b87196355f0e50eea16e4be3cc5993fc810228858000000904489997ef0faa1245cdd9d8c523aeb6710340f949b49edc38c89487f13a67e4c294a15957c598097d17155c07f67f5e3eb61f735dd5cfb4428f097696523942aa121ae82699fec94dde8b460ba6fde5113395b8fadd7ee8ff297b27b04745f73314a64f23c5e1d6a71a54c4c5d6f756eae8c17548bda4cc54b73a2efa316b7b85cbaa55e74bbc79a8f0c642059c8b2440000012800000090b99bcf815e1aa84e58f43e479149a40360fb1b016e51ee5af903e09e16afd3a1f43adccf0f4f7f6481f3725ff7dbc611ff78ed8589b37441e5bc4ffb51ee8c10cd8afdd2d4651a8723e00d42cbbddb31263269b8aec62bda4fd980942ccd3f2a0b2b7fd5e255e0e378635763d5007da49dfea0d93ed3feabd723daad70b689ca5d88f136018a755ba897ce4aff7a77e900000090cdad61ea71af30981f6a01c1c1f922d1006dcecd97d67ee300350c45c71bb02dd1cc93ff29ae59ee29f9a0b763fa0f184e5332d8b5c591acb33f384559460bef4c7cb663d37f15dbc321e2482d47a262923c2f9c121e0f8ad02b67e53963f0c00a4362c691f209039fd3fa4af613b447aed473c44f18a99a5f2e28f65c2fa11ccaaa88310f5dc64bbfd78c1301bef18f0000012800000090486fecef6b3ae95ac8e6ae9f636548cd2a1b3aba0710a3fd00a66cf0f4b7333b33944c0b0d0232bd8fd79b22daa745adf3a04314645ff0b6b984c152226931c0aa8b25a2e00d6406a3898b4957b45454c07d05c382529d7ebf344c77835dce02c49d0d55b56cca350cd2ba86659ee962909f9b72bc773806208af327f23b03f5b4014eb92f3fa476e85bf0b1343f33e0000000907bf2e48176476863d220b04a0b95b41f139fd6a2d1e8047f75e9010ff45fbd412a661ab30fa8549538fa4a69819cc2e7a2e2adc4eeca30c0aaee2403fa639035c535a7cfd331399569ee47d10df8f5faf860fd3193ad2d5c544cc91a6c753ef19a1f6c64e1e764b6b10ac4dcc40147571016a8371ff6601575956629a891b91dd238c262ba67705929b1edf4617162660000012800000090c3466ce7a4d524534483cc46fe71b134827ce2f7e313981ae63e7d6c0a433690db9c6f7564029066c585d50ebcb0e4a79280c4a31440aa66beb5fa6b1076c36630ff029c269ab377fbd32b8b2b46d337fc784b6ca7a8e150211fd5fd348f8495645940607733be947a216d4cb81c6f5147dd0b4cc5204f7600ec012273b312404d0f7088983a9da4851f32de157c526100000090664901ea78c6963fc43fa423d45f149992d9af67d74e3b49c9334becfd002e9ac159c7b4bfbeff96ffd74bc825a41493a2ddf1ec8154a3c6c9e3b6bd6af6c1cbc7e7e99a07c16538e5dcbb9864885e179ff5742d95d2a0bda32956c3d90d096eb9eb2c99746bbb66601700ed8536a126dd31986ea2b0299ed532b8dd623359453b20d821b27b712f3394db9619c496f0000001280000009067238c9e1a8236663c5d759d22f7c0b5571b4c3ce87609610e8c0b0c22513586b6091a099a865016383ac203315e83bbfba56380e251e40f460dd28d1f4f48847b1179f57912057e53b316301f603beb80f2fcc62e896c9fff553420163e005df74a455c6190e30b8a4276c7af0808c91bddab3f9dc147f6f31bea913ddc281647668e0521d44680cfac9748cf7fa679000000901554e014140980588ad1013f5514aa886ca1ffd5cb1e80f3ddcdf1652e9bcd2e418cd2b27d51a79658338c5c6e35d6e257e537d769357a0c565d766757b02ed40b720b751616d6408ebbc516271759fe0685feb6745da64dde0d7f95e85abf4dfdf7c1d98defacc660a6fb1a448bc6881e4d79869234f981095ad351b06e5f3bfc349b68affbdeeeceaf3296024d1e5900000ce40000012800000090f821f2e5485e3c0af4b84fae21d986dc642938632260220147ff8f0ec70c5f6f97e10343c0fcc465c93ad626a7112c96c9e29b9619e3430c79306697e4b79e28b2a0239a176a54234746e061b8859cd13329f145ede2524db4c02491a218ba19fca3149ad8919ded8aab2d9082594c666094ed5f3ed0296f5483194a86a6c09af2a1905020ee88ea4592f5891772da3e0000009083f8cf115bd237f940b6b6c0b070b835b3b1e16b004f565909845c1f775bd74479a0ffd4a260d337ca93253d9c15dacfdd648fe0be61716c8c8c8c7e6351ce8fc7555dc26409ca9633c3bb6cf126793f197fd40c3b80df76046f8e46bde2e11802c8a182468c8a900c612aa11a0edf37def572ff0ba72f1dc075b0aa5a9b37d9a3c2cc35663bf4e2d2a36f417a6a3fe90000012800000090fae3021c00189b073c016491925cbb782113fa0cd7559c94c8e2c12853689cf14da70ac3886a89f22e2f7b664fee4ecdce844163c3273a5112e33d709c1bb5138278512dcae2c767b90e178f102a0ef2540f30fa24cf05b7336952e34a4f4fc151aaa6d82fabe22a6baa5353684ed2bfbf0adfe7120ae8d1ed6c563bb2a87dc0e0c18298fa7a763f3aa2250f41228e0000000090620fe1d6a7da657aadd4e29e1bb09edb6f293a84f08055ee5e0568e2620ba4711cf8a0776b139ed24904139f442ce4390c988814b3b5b7b4afc27c4f8ca7c2bc1dfc9225e45afec25092031b38974666ff0db3fbe0082703eff4b153af602acdd9ee19e7023d2be09d6f567ce79929231e542eab9133b09d39b6cd149e8af3bd686d412afd06f2e88632a6098f3574400000012800000090dcaa62f948654f40d893c4a4c31662cc125b60c87075fae66b66a2183e781cf7beb587bf57437f9827a2b9fb78ab3dcdc5fe4867a4e8b8b4f012abf3626b64af0f552b9419d35d67aea4e48ec7ff8507de86e89b4354fba12751dba280f8a7f05d52449c5b4f5566fddf392e9e388d2b68b35df13454c60aa110b1a738e311d63eedc223421a48cd60bb0eb5cbed928d00000090d6bd5c8f5170af53e76f14b243f82a2c2b8b9d68bdd505c6c2fbfca36f53333b91c1f765d13b2b16ae48ab9b2d12ae0f1255f1f24c99692b71c19341d2e4776562dc543f5064fe9c7f0df630b0097dd62ef280f42b7ab50e53a42b31cf64064cd20ba1f044e24197b1eaeb1f53d5d7b3d7ef7de6ee682c5ae9f24993b11f42e627740af2e8e9c877b095b057d75714c60000012800000090f00a0370a0cd5ec57d9d79a44644cef128fd247847a671a4de662325cb879934430fdfb488edfee63fa4a177a76a5bbd7fea6aa4c3fbcd9d1926ac271ea7235fd3acd833d974be88a9e8df60c272a2a853d6a1876e84cb7857d2fab74086dfb7e56b205712d19a21e99465ada71395af3303ccb51417da3375faeef928696d9dd86cefd69cc400c166a75e7ccf78dd5000000090b085aacbaf54e57349dbce112679c344dfd54fde70c15d8c0e284c8c70f37dabf14207e638287f062c349e8b903a33f0046e6c5695a1c973223dd481cea29b899e80db83fc05380779664157dd9679ddf6e1ceda231712637b1e527bd5a0f14fa398cd793aba15a21a4776413e04139486b8e5b4924b0b5b0663b767dc5c44f3a3fb506616eb9627e72be73a445df38100000128000000904e04527a1fbc4918fb0f5dc938d33445bd450ad98eb25e3e1d34bf8aac57f60b2abab9fbe140c2784ceefc2e437a38ca309c9bfd2071f3809a28383e9faa063f57ad8667838dd1be75ea2b3e299cc4e417bb5705f1c22bb59e4a7254a6d408ae8f55772b4f2007ced955119173ce0e00a632de4a49e0a08414b308eb02da4a55231f8c0418131a63596955bf270f38350000009057b894cdba6c674382d0ca850af5dae67fd1f3dfc55cbdea681145d7bb6187ff3a0dba30eb41e19b3e6832c6beecff3350f116211f25c509918a4980c1c214bfee81f2aefc930c54004f0dd3263e106a002a12fb9c7796125ad555a1d7b37f5149bd1a27f28a7dd65ce85026647d18d10a0a3f56747e96f7b1e138a12bbbfe3b9001e0eaf0066c32a2d3687fc62116860000012800000090d4461f6118036ab697daf4e90fa5cff8c853f0b54e57aef00d9d4e81115576b4ab3a86cdc3653a3efe7dcb7fa650f176bd557b02b03cc139e9a3221cf7d3a7c2150bdbfb3c879d67e2460b69fec40a0e42ed5c0e359f6f91bebb6c506371b7338587e3d0feae6f7ce555e74da6e76302e62bbcac25d8509f3bda57e323ef7b166f1d2b391d2bb6860efdac1b809b9250000000909207e364faa20d0a1115a269393f9d98152e0019ed33b3c7156d0ef9113be7138f900c4d72e379426bde9b98e1aedc8aeab18ea9e756fa4eac2908038f003435e987d22132cadfaa9e430e452d78032e82a7ed64815063d08b4274c7cfac1a9520d10ff8140565f5986c9c2a135afee4f4d4bf19b1904acb3318d720584e3936de56aca310dd26b714f0a7dec1939b040000012800000090781ae925b7e0ebd9cb87e718b7c7ffeae45651552404fffdbc1df7d85686dd227cb4c1de22650479d3bc359ec4f9e81c79da28757035088b0ba2d1f7b2a321d1abcd3a4bb8b9010906dc7450b8d012dbee1d41e5314a7d094f797425ddfafc8728c6422c58805c0f9d698be9fc320ded25d0466880988f2dad98e0256fa89c288d8e99569f588cdab93ccf67cfab691a0000009092aa76893b5cf1b10cecea31187de1b6190aca3c4941659f077cd00ab9946f3192a2e9cff6a743b51d2217dee81a68541ce18b321fc30d4f5017f866dbab792dd00cd676ef3ac107b0e02420172a92d9f4b252a6cc4dfd4e6d506d1cdfac701ba017d16f692702e2d960c0c7e27794d30aced94c9661109af94d2381decc99211e8bc4dd401c6f2e197ef3057930655d000001280000009069825afeae91c9a0e5db75e73f9d1a1a24ff8398a6b8fce60791b611953a12eef7f0bdd08847bf4d7041aef2a144d2038aa8fbb78fd51a745b6967293dafdaa4f46cd6d0d06d53801cb9cd95c192c96183603c45c304a3332353411d8efd1f79a974f8993fe4e283975e9eef3b867cb60995a74b83383b688c102a4e0d78c6af78ed45a1f028bea71914d9d57c7ae79300000090fd9decd929d5172e46f45ba17fa6c49e4d265fb231e26df16e3f9a1baec1bd6c76a304217741ee8e638dc21c2a019d5d0cba632e13ddfdc7bfc615fde3895aec4ca4ab22291f5dcfb88f27b5d739d549d08d0db6f8fd27a095b6ab9d11728ece355a764e06f0822927716e589ec35d12123b316f1849deb6a9581502a2abd08d4a37b76400c65358d30cf4c4baa3a1e500000128000000902106ead6df33bd10b164d22be5509b1e0afdc774f1e1ff78ae3937c49c8a58c59c89ab7a254fdcc2260f641da11954b053d1869f8aff87c4ca2efb626e1a7f84c10533c1e65ddcf7e7cff35e1c3cd6e696317a1a37783a13cff580b2c614d797a03392c98f19bffa927dbb45de09a3dc25adf76acf2a041e253eef08fac1cdbf8e603383166b7a774f7175070e6c6a600000009072a7e284d2e397b224c4b8f8a20a52403abb3b28a8b788e4a091090c0b6fcbc1fb3539ad4458307722f696580048c4a492d201aab14dbd1af074d002858c522d195ee0bd0786c834a6f6445b476df280c5bea5d01e6369bc12cc2c3ac6e697de844671056cd7263f5604a835aadb448f79300cf927246b8b5220341fa78a6f3dbcbac09550a6ce546131822cad0621810000012800000090dd4294cd8f8c449ad02c6ea497fa35bb7111cccf47686d0b90d118145c1e04dcde092cdf362d408d95ef8925c9dde1ded107c16f4ac9ff46d39d96da2d7ac35e2b3e70583c3cfd6c34c9a9f5ae4a437b49510397a419f5e546ba3456763fdd8252ad584ffdbd5fd4ffda3adac48b8375255def1f7131eff0617799ce406733579c856618ad0db4b4523970c75e95de9100000090af2fd32856e57805ca74674c9d8e6147df5fd4e9367b7d43948d593fd825e10a09ec6066c96ed49ba88d680d7d2a8fe6a7d5518d3fed621fd71f37fb8ee851356ebf4d7efc2905693ce37641397880ffddb16bddd170b29a062e42b76b54171ad1b92c16dd50770cf954905e90a194c4bbbc580a13b432ba581a8456ebb371d337efd1b2f24c2812d51558c88adede8100000128000000905807262584c7578162ce616409b887dd2c861b7cc4e8f19853c008bbd4acaf0f19db1e572398ececfdef22aec0ae7030e7247fe8451984233c12b61b4afaf5804551d46100937b25b7023e5ce39a4f1d0babd330384e38030c2757abf5a7ec092c26349e1d54b83a6c0263a441e24090806168a061b708136f54a949598359283853f4c3c4abead7f6985d4fc393677b00000090ee85daf522efbc2636c7ce5c2a0ec0c99e3e905b753c34d5e6c5db2ff50c82c5aa57de538c88b78bce4c2c1b3f9a412aeaccc8a243694452962647fd3c8a0d53a2eec14ef97e1e224894d3e6db522850ac5c55d0b244bb4aea84143426ba6bfa4f5572a1ba7ba91f34e28bfe68107e34a552f3676c53b34e609675533fcc293d6e6e56ca9648f614cee0c52cbf6e03f900000ce4000001280000009008d66dd316e03c11f2f6f80d3970dc8c516fa76840e4074f4e19e0b95b59a0aebc11492effcdb0c820647a729c67ed95bf500412059c80ea48d48a26705115e659b893ef589d37268fac8809ce28919a4be38cc9e1f564ae77258a4147de79ead0d27dd159679f0f795b096e133eaa2bfff9900462c766b12b9d727c9f1981b4cbe1df4ca5da89bd4283dc4589a0642000000090c47110c0f4fae3f396a2b362bcf4e3c8a9d65fe0a21cb68d3841654a594561c12bfea7e3be27ca5a2ec93fdcff6258dc8215fed3305818baa19067acb03fccb46650250b15fd18a23f4cc1e3e62becb3df759030f92493baabc546feddb86fdea8f42749f994cefef3662465290dab5e53614405c899e27ee60b884823aa06daf2c18ffc69777040fccad493d1e5c84200000128000000904cfd8f43502458ab8ea4b7ed39a2768cd125681210de2ef0cefa30eee2c408642821bf9b19085330d22b43763c3b815dea6fe6396d3c8beaa80a795eb0ffa71e5af496632d65ef83ef4cc14288d20dd1000f6b024b26f5ed3006c6b1eeb67a3049b36fec9c76dd973745bcfe3bb6f37ecb6d08f698cac4da7ce4c781903e3b4e0fc3f3d15000e364adddcd15eaf961f2000000903efe093939d9ff98a01a5e8fd0ab75ee6476d77e279bee266831f6b15061278e9486e5d7d5c627969845f5344607a2eb666a0fbf8de1b24d1fdbd98287c037efa5877e20a4a53163a0c86f6603fb139118a93676525e98a105cc6b1e19ad925d9e131360a74aae10b31104f823e74ca6b16d485bcc131ac037aaba2b972fd445d1cad14efd641dd41a483236239c3cf80000012800000090604771ddf429cf224d4356e7446ec9cd85463670428be3e71568c06f6a9bbfeb9312f5b9cd803c9d36b9992f142a23b56c1ccd0f72b42a1bdc733ea0aa9d71531bffa31ffd6f0a2bd62155531c9ff88b9335846f76052c80bbf28fa854f8739d30e5eb965cc76d52577eed0aacdf17b49692e419cb2b3caaec46db1139e4c970244b030dcb61055d7b7db90bede37c0b0000009042e6ab0a6d746538d1bb5ad5594c60b28d89daa57b2b77c9a40090f69cfead34eccd04efd05d612586841b266c692d2f383a743f8a0ea860ed8129e7a2bfd916290021fc80fdc8c701ecab322cd98b1a1d0446d553da699ba8e672e90fad07ada6acf10d12653745581dea923b1d86b970966fa1d364890acffac86956efc5b30a11cb0f44bca296014e9a33af4ea5690000012800000090a7a6e87fd0cdb332a67c397b738c80deb4e3ff72cd7a1b3aabb891ffb5ce3d25f74e8b75816ba2b1ac000ec3034bc8da4b598d635d8f54d04c595d216b6e037f053d43233da9cf6f672ff6ffc6f6b729d6b0aac4a5ec4d5f847a717e75d027ed0dd660e502258408a639519fced9a1bc9699643f8b52582738c9243537d0945381c416af9d6d2e773add87b4942bb9460000009047e32fe86a0742d9473b758910c78e49372efe69852d111dbbc7da54b9bcf522087c4ee5e7396f2b4702bb5379c21c5a9400b7ddd1d40ee77c9ab05898fcbcf4ea65288f1b73c45267bbbde0540e2ad4af121924eefe85a3d54cabc7b10fb63b9fe3c429b75c9989e59f033df3e064b6c6237779303140bdfcf25653fe92348516f2651d6d0bb18faeea85b94bb660b9000001280000009078b9e99817350a9491dc6867f0cda5fdd9b39d1fe0a9ed58548978cfcc637957ab82784d3b2c30829c7edd6118bdf0a877635660a1d183a010d31390839af04587346dde9980e5b824a71f4e4148012d089842e4e59d5d9a89d6d78e7ec0e2513e6322b0977e3cd7b5f08d5d18cdcbf5dbcde57b87768a860cd76613fe40da8efc0618c34c12e409626b9c577fc00e4b00000090487671868ac16596ec7de56e973381703fe43929e74ff073e9c963aa22bda9d6f1a04e093a379e586f3d76954e318b6df1a823897ee5e4d7c5063597e130a81eeb4c9535a227c45974e78da48e0f7026f1e689ade61971444a449995919cc7431fc9e900129866c3a2ab7174f72cc8ed74b91e6e4c025f693045259f8c9e4cb1d32504c38443236025c37c4c7c0a5adb0000012800000090e734aaa308d6b54f9d7a52fbe20503bf80c73d593365fece0bf1aaaabbe87770833e54bf425e71ffe12ecbda6e9e1df258f94541f0d7f94fddd506653cf122f7c5386c659dadcdb6e6e92bdf9824aa69f775d39caf5b99b73226cbcbd95b82d070c2400fdbf0996937e67a5c513c3946e667fba983561b48a931e3cf3f68254e4f2fd86034fee3abcd82c97ecf88348700000090b96d8f7757738f0f7f58de967313433e3fe1733bf4d5c15a2078690187a1acde17ebc915b23cbc6dcf74219e3cd63362fa003391f19a3a92bf26390d441c1a1c69809270fc9d61da00d0695dbf73d67f37050d622c773829e929b8285955e82f16361fbbe9113658235b9afd0b7a784781b5bc6251126453aa973943410f16a85910376f0b609292e9b9e46104054f5f00000128000000904282cb9ca7cec0bea85b1a8e83379b5365bc8a843a3d79afe1e9d5dfe92184920e375d084c5c03d3d27d4aa4f142ccf6c89ceffaeb3068745e2c9dddebd6ce7dad36b0e76ae97feace5939660ad9dd79f8d75fbcb740a2254c39b9bf2787517cfb2cb48a0e26228f085e85dd15b7e873058334594d9fbb8e877ee498fc11ad0e430e3be518bc9e0c1afb4ad652ed2f9a000000909824f3e20d39014fe1ce0c25d27af4d1fc16aede6aa127d241ab74b62aeeff33691377f976b31216fe4d36161da0f8c7549047c9dfde650a5c9ae9a5357fb15c3e7dbe296ea10d76b46612bafe7824410bb297eceb346111a42b36663015e421a976697df83943d2365bf559b7406e147403547f78ac7b8fbc797275800eb6d46078e862c501eaebc40f16c837b4bba80000012800000090d78151e7a08ad4e11b8a2fb201f83ae713fdac255819cb3c024620025484b20fc3748b713279b0dd26b37b2e38933ea7039534b4e0f5974a4f96ab01d8181dfc988b9f5f495bac0a6ae67df7053157249f7baaf0c91a284db4d1d4345602134382388b5b4a3449214fed2956b221526e2e0dd60320449b4d725af164b212b69b8e0c4b7089c3a030407b9e861ef132c200000090a0539b668cca6c01fe2ed23f6f2d5df8145a48af96d7dd3dbfe6e675af044114c69c44ad4f150b889cbfba7eea026e9ea0f599c4d035d7b709ece6ad5988040a4d51ab2029d9cd88e4b791fdd0cbb6ac36fb943ad0b80e6b2bf4ece885b1048dd8d9b1524f44b75ef82d3fef0826c5d043b2fcf253758cf5e372a5b87d1cb94eb4cbabb547a28d3b8ee124ca5581bb9c000001280000009077ac86a4406764a86f704ff7139ee1f7a2f7e10253ea15f544502be3dd4eb0f4fc2a75653bb060ccc4d03c442f13361ab492775ea71761e90a7113ba55e3d5a10bf43f23fbce60e453aa76ef098b9c93560cf002bf2a52040f12a1b54cfb0c1e47384e91a05d774f558c47a01508e1b0b102ec96c16c2be6ea6d06c8fa1b29aecd8beff997fc4f0ea947c41be6dc7afb00000090be51c1520c12abb9c70648e88aebd75f67f72da3b12e7450a780ea1a8e3082b5bbe7db2ddea227fdd56d3312a3e440f3c1de5d7a1cbd17ed1e71b263fb50e6722c48d5005df3a9fc8b524c64a2de0cbba8dd04fec097af10540a193e0ceb30380c1e127931d154f19310644472722de34551b100eabb2146354debd5dc72f4dda786b3efc42fa91daa612f4986ca4733000001280000009005f1417483ec00421bd576190ca8d530a8b0ebca2abb3995897ba2fe24320056312adc6d898c0c8dcabcae7aecae0970e5640b9664479948de28fa79ca53c232044f5e97331d53dc4c177cc5df9bb46b9a9752b3846de4a72524ee262fbc12f2b25b57ea1da2d1b05ef5a250af84f5f1fdaf2157ec8dad2ed3bc1e5169fd9866be39bb91961bda0fd7fa1ec3e9b08bb4000000907f8517ea4d3422fc85946ad1e31e8f25d2a2a1374ec8b76917efe37eae76771c416cea99423ffac5ee56772105b8203db836ae6c5c33f8ccf371668f516eafc891e4ce29e6c055b473c27330e9e40adedc722c043e9aa74d64d98ce7e363fe2c36eafd9f92add125e075bcf6464d4d3cf35d335a0a70f07ee53e736d282004f45879f9015f0da7a1ad200a3eef7ba0c60000012800000090eaba354a29c93d1f132a1e369079a6db3ba8387cf8f02e36355b5b0997eff35d167ec7c07a7b20013d7665632ae9f5ae2e46671dc912ddfbe3e0b5c7c1db56496f3d464b7a741e764142cda0e2d2d5809c9c4ff4a095cfcf5e8f6b6b52aebf94e2454a7041aa434739b7c98e937cc62877e7ac129f07ca626e71a126880beddd01506d8c7d71b3d35679565eebad27c6000000903129008169633e4de7fc916e6dc182da1d8748aa8b736120f9498c842ef44a3a0540f78e2f5a0c817f38fdde511d5830a0bc185fb760d3581c127038546032768c0ca4d57821496f147047aa7a401171a4bfe3475c8dee1ae60d6752044946ab8181430484b0bf8537e17ec9856129776fb730cd06818524d3d96f8c8c0625b7e51e86f1308adff7423443ff0853ff3b"; function setUp() public virtual { helper = new DecoderHelper(); @@ -68,17 +68,17 @@ contract DecoderTest is Test { assertEq(l2BlockNumber, 1, "Invalid block number"); assertEq( startStateHash, - 0x24478b1db4779386486486617b4f4782d6944eb577f5f36048dc1df6e1a954ce, + 0xee92c70197159de635a227de74fcfd5fcf36ad07fca32b16f1714bf390bb461c, "Invalid start state hash" ); assertEq( endStateHash, - 0x9efc32b00d21e5f939c25063208804ec35049a7cbc007d4853d3d6763eeef358, + 0x173011f69ad87076762a588bdaf7cccc9e5dccf2aed60b70b62773db03b64348, "Invalid end state hash" ); assertEq( publicInputsHash, - 0x0485d38c108a89400e87936d3f29484bfd067857c3118c6dd75d8ce8bec558cf, + 0x121bff9d33e9dee94e5ea8d536d8e6aeca5c899711db653eda48ddc7284984d0, "Invalid public input hash" ); @@ -106,7 +106,7 @@ contract DecoderTest is Test { assertEq(l2BlockNumber, 1, "Invalid block number"); assertEq( diffRoot, - 0x68b62af526714af2f997d81e479990d40db54853a52e88521033581c73963580, + 0x77fb0c04b4d4a7cf3a680d5d6caef1c7f9d91e1c4d46220b22d20fa633f3e14c, "Invalid diff root/calldata hash" ); assertEq( @@ -116,17 +116,17 @@ contract DecoderTest is Test { ); assertEq( startStateHash, - 0x24478b1db4779386486486617b4f4782d6944eb577f5f36048dc1df6e1a954ce, + 0xee92c70197159de635a227de74fcfd5fcf36ad07fca32b16f1714bf390bb461c, "Invalid start state hash" ); assertEq( endStateHash, - 0xa5ffcd9610b1aec5f5c13c6fd4c289c976f18ebd0f03d09d4428749522115780, + 0x71b79f5d82c94fe5dbf89e5fa219e4338191bc35b10127a56e3ef49c467ba207, "Invalid end state hash" ); assertEq( publicInputsHash, - 0x0d7f318632079607ef72211a10718cd460ed7d86939b7f94eda460a849d94ce7, + 0x097fdc3b87eec47728e91f71cc57919387eaa7c3c2aae57bc88279e8c372bc90, "Invalid public input hash" ); diff --git a/yarn-project/end-to-end/src/integration_l1_publisher.test.ts b/yarn-project/end-to-end/src/integration_l1_publisher.test.ts index e2651f4fa1b..9d4d39b5f8f 100644 --- a/yarn-project/end-to-end/src/integration_l1_publisher.test.ts +++ b/yarn-project/end-to-end/src/integration_l1_publisher.test.ts @@ -287,14 +287,14 @@ describe('L1Publisher integration', () => { expect(await outbox.read.contains([block.newL2ToL1Msgs[j].toString(true)])).toBeFalsy(); } - /*// Useful for sol tests block generation - const encoded = block.encode(); + // Useful for sol tests block generation + /* const encoded = block.encode(); console.log(`Size (${encoded.length}): ${encoded.toString('hex')}`); console.log(`calldata hash: 0x${block.getCalldataHash().toString('hex')}`); console.log(`l1 to l2 message hash: 0x${block.getL1ToL2MessagesHash().toString('hex')}`); console.log(`start state hash: 0x${block.getStartStateHash().toString('hex')}`); console.log(`end state hash: 0x${block.getEndStateHash().toString('hex')}`); - console.log(`public inputs hash: 0x${block.getPublicInputsHash().toBuffer().toString('hex')}`);*/ + console.log(`public inputs hash: 0x${block.getPublicInputsHash().toBuffer().toString('hex')}`); */ await publisher.processL2Block(block); diff --git a/yarn-project/sequencer-client/src/block_builder/solo_block_builder.test.ts b/yarn-project/sequencer-client/src/block_builder/solo_block_builder.test.ts index d2ada0b618d..346f9c8b006 100644 --- a/yarn-project/sequencer-client/src/block_builder/solo_block_builder.test.ts +++ b/yarn-project/sequencer-client/src/block_builder/solo_block_builder.test.ts @@ -240,6 +240,8 @@ describe('sequencer/solo_block_builder', () => { startTreeOfHistoricL1ToL2MessageTreeRootsSnapshot: rootRollupOutput.startTreeOfHistoricL1ToL2MessageTreeRootsSnapshot, endTreeOfHistoricL1ToL2MessageTreeRootsSnapshot: rootRollupOutput.endTreeOfHistoricL1ToL2MessageTreeRootsSnapshot, + startHistoricBlocksTreeSnapshot: rootRollupOutput.startHistoricBlocksTreeSnapshot, + endHistoricBlocksTreeSnapshot: rootRollupOutput.endHistoricBlocksTreeSnapshot, newCommitments, newNullifiers, newContracts, diff --git a/yarn-project/sequencer-client/src/block_builder/solo_block_builder.ts b/yarn-project/sequencer-client/src/block_builder/solo_block_builder.ts index d36d378e8bd..afe959229e5 100644 --- a/yarn-project/sequencer-client/src/block_builder/solo_block_builder.ts +++ b/yarn-project/sequencer-client/src/block_builder/solo_block_builder.ts @@ -122,7 +122,7 @@ export class SoloBlockBuilder implements BlockBuilder { endTreeOfHistoricContractTreeRootsSnapshot, endL1ToL2MessageTreeSnapshot, endTreeOfHistoricL1ToL2MessageTreeRootsSnapshot, - // endHistoricBlocksTreeSnapshot + // endHistoricBlocksTreeSnapshot, } = circuitsOutput; // Collect all new nullifiers, commitments, and contracts from all txs in this block @@ -169,6 +169,9 @@ export class SoloBlockBuilder implements BlockBuilder { endL1ToL2MessageTreeSnapshot, startTreeOfHistoricL1ToL2MessageTreeRootsSnapshot, endTreeOfHistoricL1ToL2MessageTreeRootsSnapshot, + // TODO: Stubbed until #1162 + startHistoricBlocksTreeSnapshot: AppendOnlyTreeSnapshot.empty(), + endHistoricBlocksTreeSnapshot: AppendOnlyTreeSnapshot.empty(), newCommitments, newNullifiers, newL2ToL1Msgs, diff --git a/yarn-project/types/src/l2_block.ts b/yarn-project/types/src/l2_block.ts index b3fd3333ff8..1f89bb16097 100644 --- a/yarn-project/types/src/l2_block.ts +++ b/yarn-project/types/src/l2_block.ts @@ -86,6 +86,10 @@ export class L2Block { * The tree snapshot of the historic L2 message tree roots at the start of the rollup. */ public startTreeOfHistoricL1ToL2MessageTreeRootsSnapshot: AppendOnlyTreeSnapshot, + /** + * The tree snapshot of the historic blocks tree at the start of the rollup. + */ + public startHistoricBlocksTreeSnapshot: AppendOnlyTreeSnapshot, /** * The tree snapshot of the private data tree at the end of the rollup. */ @@ -118,6 +122,10 @@ export class L2Block { * The tree snapshot of the historic L2 message tree roots at the end of the rollup. */ public endTreeOfHistoricL1ToL2MessageTreeRootsSnapshot: AppendOnlyTreeSnapshot, + /** + * The tree snapshot of the historic blocks tree at the end of the rollup. + */ + public endHistoricBlocksTreeSnapshot: AppendOnlyTreeSnapshot, /** * The commitments to be inserted into the private data tree. */ @@ -200,6 +208,7 @@ export class L2Block { startTreeOfHistoricL1ToL2MessageTreeRootsSnapshot: makeAppendOnlyTreeSnapshot(0), startTreeOfHistoricPrivateDataTreeRootsSnapshot: makeAppendOnlyTreeSnapshot(0), startTreeOfHistoricContractTreeRootsSnapshot: makeAppendOnlyTreeSnapshot(0), + startHistoricBlocksTreeSnapshot: makeAppendOnlyTreeSnapshot(0), endPrivateDataTreeSnapshot: makeAppendOnlyTreeSnapshot(newCommitments.length), endNullifierTreeSnapshot: makeAppendOnlyTreeSnapshot(newNullifiers.length), endContractTreeSnapshot: makeAppendOnlyTreeSnapshot(newContracts.length), @@ -208,6 +217,7 @@ export class L2Block { endTreeOfHistoricL1ToL2MessageTreeRootsSnapshot: makeAppendOnlyTreeSnapshot(1), endTreeOfHistoricPrivateDataTreeRootsSnapshot: makeAppendOnlyTreeSnapshot(1), endTreeOfHistoricContractTreeRootsSnapshot: makeAppendOnlyTreeSnapshot(1), + endHistoricBlocksTreeSnapshot: makeAppendOnlyTreeSnapshot(1), newCommitments, newNullifiers, newContracts, @@ -266,6 +276,10 @@ export class L2Block { * The tree snapshot of the historic L2 message tree roots at the start of the rollup. */ startTreeOfHistoricL1ToL2MessageTreeRootsSnapshot: AppendOnlyTreeSnapshot; + /** + * The tree snapshot of the historic blocks tree at the start of the rollup. + */ + startHistoricBlocksTreeSnapshot: AppendOnlyTreeSnapshot; /** * The tree snapshot of the private data tree at the end of the rollup. */ @@ -298,6 +312,10 @@ export class L2Block { * The tree snapshot of the historic L2 message tree roots at the end of the rollup. */ endTreeOfHistoricL1ToL2MessageTreeRootsSnapshot: AppendOnlyTreeSnapshot; + /** + * The tree snapshot of the historic blocks tree at the end of the rollup. + */ + endHistoricBlocksTreeSnapshot: AppendOnlyTreeSnapshot; /** * The commitments to be inserted into the private data tree. */ @@ -346,6 +364,7 @@ export class L2Block { fields.startPublicDataTreeRoot, fields.startL1ToL2MessageTreeSnapshot, fields.startTreeOfHistoricL1ToL2MessageTreeRootsSnapshot, + fields.startHistoricBlocksTreeSnapshot, fields.endPrivateDataTreeSnapshot, fields.endNullifierTreeSnapshot, fields.endContractTreeSnapshot, @@ -354,6 +373,7 @@ export class L2Block { fields.endPublicDataTreeRoot, fields.endL1ToL2MessageTreeSnapshot, fields.endTreeOfHistoricL1ToL2MessageTreeRootsSnapshot, + fields.endHistoricBlocksTreeSnapshot, fields.newCommitments, fields.newNullifiers, fields.newPublicDataWrites, @@ -374,6 +394,7 @@ export class L2Block { if (this.newEncryptedLogs === undefined || this.newUnencryptedLogs === undefined) { throw new Error('newEncryptedLogs and newUnencryptedLogs must be defined when encoding L2BlockData'); } + return serializeToBuffer( this.globalVariables, this.startPrivateDataTreeSnapshot, @@ -384,6 +405,7 @@ export class L2Block { this.startPublicDataTreeRoot, this.startL1ToL2MessageTreeSnapshot, this.startTreeOfHistoricL1ToL2MessageTreeRootsSnapshot, + this.startHistoricBlocksTreeSnapshot, this.endPrivateDataTreeSnapshot, this.endNullifierTreeSnapshot, this.endContractTreeSnapshot, @@ -392,6 +414,7 @@ export class L2Block { this.endPublicDataTreeRoot, this.endL1ToL2MessageTreeSnapshot, this.endTreeOfHistoricL1ToL2MessageTreeRootsSnapshot, + this.endHistoricBlocksTreeSnapshot, this.newCommitments.length, this.newCommitments, this.newNullifiers.length, @@ -435,6 +458,7 @@ export class L2Block { const startPublicDataTreeRoot = reader.readObject(Fr); const startL1ToL2MessageTreeSnapshot = reader.readObject(AppendOnlyTreeSnapshot); const startTreeOfHistoricL1ToL2MessageTreeRootsSnapshot = reader.readObject(AppendOnlyTreeSnapshot); + const startHistoricBlocksTreeSnapshot = reader.readObject(AppendOnlyTreeSnapshot); const endPrivateDataTreeSnapshot = reader.readObject(AppendOnlyTreeSnapshot); const endNullifierTreeSnapshot = reader.readObject(AppendOnlyTreeSnapshot); const endContractTreeSnapshot = reader.readObject(AppendOnlyTreeSnapshot); @@ -443,6 +467,7 @@ export class L2Block { const endPublicDataTreeRoot = reader.readObject(Fr); const endL1ToL2MessageTreeSnapshot = reader.readObject(AppendOnlyTreeSnapshot); const endTreeOfHistoricL1ToL2MessageTreeRootsSnapshot = reader.readObject(AppendOnlyTreeSnapshot); + const endHistoricBlocksTreeSnapshot = reader.readObject(AppendOnlyTreeSnapshot); const newCommitments = reader.readVector(Fr); const newNullifiers = reader.readVector(Fr); const newPublicDataWrites = reader.readVector(PublicDataWrite); @@ -465,6 +490,7 @@ export class L2Block { startPublicDataTreeRoot, startL1ToL2MessageTreeSnapshot, startTreeOfHistoricL1ToL2MessageTreeRootsSnapshot, + startHistoricBlocksTreeSnapshot, endPrivateDataTreeSnapshot, endNullifierTreeSnapshot, endContractTreeSnapshot, @@ -473,6 +499,7 @@ export class L2Block { endPublicDataTreeRoot, endL1ToL2MessageTreeSnapshot, endTreeOfHistoricL1ToL2MessageTreeRootsSnapshot, + endHistoricBlocksTreeSnapshot, newCommitments, newNullifiers, newPublicDataWrites, @@ -533,6 +560,7 @@ export class L2Block { this.startPublicDataTreeRoot, this.startL1ToL2MessageTreeSnapshot, this.startTreeOfHistoricL1ToL2MessageTreeRootsSnapshot, + this.startHistoricBlocksTreeSnapshot, this.endPrivateDataTreeSnapshot, this.endNullifierTreeSnapshot, this.endContractTreeSnapshot, @@ -541,6 +569,7 @@ export class L2Block { this.endPublicDataTreeRoot, this.endL1ToL2MessageTreeSnapshot, this.endTreeOfHistoricL1ToL2MessageTreeRootsSnapshot, + this.endHistoricBlocksTreeSnapshot, this.getCalldataHash(), this.getL1ToL2MessagesHash(), ); @@ -563,8 +592,8 @@ export class L2Block { this.startPublicDataTreeRoot, this.startL1ToL2MessageTreeSnapshot, this.startTreeOfHistoricL1ToL2MessageTreeRootsSnapshot, + this.startHistoricBlocksTreeSnapshot, ); - return sha256(inputValue); } @@ -583,6 +612,7 @@ export class L2Block { this.endPublicDataTreeRoot, this.endL1ToL2MessageTreeSnapshot, this.endTreeOfHistoricL1ToL2MessageTreeRootsSnapshot, + this.endHistoricBlocksTreeSnapshot, ); return sha256(inputValue); } @@ -766,6 +796,7 @@ export class L2Block { `startTreeOfHistoricL1ToL2MessageTreeRootsSnapshot: ${inspectTreeSnapshot( this.startTreeOfHistoricL1ToL2MessageTreeRootsSnapshot, )}`, + `startHistoricBlocksTreeSnapshot: ${inspectTreeSnapshot(this.startHistoricBlocksTreeSnapshot)}`, `endPrivateDataTreeSnapshot: ${inspectTreeSnapshot(this.endPrivateDataTreeSnapshot)}`, `endNullifierTreeSnapshot: ${inspectTreeSnapshot(this.endNullifierTreeSnapshot)}`, `endContractTreeSnapshot: ${inspectTreeSnapshot(this.endContractTreeSnapshot)}`, @@ -781,6 +812,7 @@ export class L2Block { `endTreeOfHistoricL1ToL2MessageTreeRootsSnapshot: ${inspectTreeSnapshot( this.endTreeOfHistoricL1ToL2MessageTreeRootsSnapshot, )}`, + `endHistoricBlocksTreeSnapshot: ${inspectTreeSnapshot(this.endHistoricBlocksTreeSnapshot)}`, `newCommitments: ${inspectFrArray(this.newCommitments)}`, `newNullifiers: ${inspectFrArray(this.newNullifiers)}`, `newPublicDataWrite: ${inspectPublicDataWriteArray(this.newPublicDataWrites)}`, diff --git a/yarn-project/world-state/src/synchroniser/server_world_state_synchroniser.test.ts b/yarn-project/world-state/src/synchroniser/server_world_state_synchroniser.test.ts index 27f5a4c3663..9f7990560ee 100644 --- a/yarn-project/world-state/src/synchroniser/server_world_state_synchroniser.test.ts +++ b/yarn-project/world-state/src/synchroniser/server_world_state_synchroniser.test.ts @@ -80,6 +80,7 @@ const getMockBlock = (blockNumber: number, newContractsCommitments?: Buffer[]) = startPublicDataTreeRoot: Fr.random(), startL1ToL2MessageTreeSnapshot: getMockTreeSnapshot(), startTreeOfHistoricL1ToL2MessageTreeRootsSnapshot: getMockTreeSnapshot(), + startHistoricBlocksTreeSnapshot: getMockTreeSnapshot(), endPrivateDataTreeSnapshot: getMockTreeSnapshot(), endNullifierTreeSnapshot: getMockTreeSnapshot(), endContractTreeSnapshot: getMockTreeSnapshot(), @@ -88,6 +89,7 @@ const getMockBlock = (blockNumber: number, newContractsCommitments?: Buffer[]) = endPublicDataTreeRoot: Fr.random(), endL1ToL2MessageTreeSnapshot: getMockTreeSnapshot(), endTreeOfHistoricL1ToL2MessageTreeRootsSnapshot: getMockTreeSnapshot(), + endHistoricBlocksTreeSnapshot: getMockTreeSnapshot(), newCommitments: times(MAX_NEW_COMMITMENTS_PER_TX, Fr.random), newNullifiers: times(MAX_NEW_NULLIFIERS_PER_TX, Fr.random), newContracts: newContractsCommitments?.map(x => Fr.fromBuffer(x)) ?? [Fr.random()],