From dc0988f6b65bcef9baca5815b6cb36a8a438c2ae Mon Sep 17 00:00:00 2001 From: PhilippeR26 Date: Sun, 14 Jan 2024 18:08:18 +0100 Subject: [PATCH] feat: add doc for MerkleVerify contract --- README.md | 67 +- cairo/airdrop_poseidon.cairo | 100 + cairo/airdrop_poseidon.casm.json | 3749 +++++++++++++++++++ cairo/airdrop_poseidon.sierra.json | 1553 ++++++++ cairo/merkleTreeVerify.md | 193 + cairo/merkle_verify_poseidon.abi.json | 150 + package.json | 2 +- src/index.ts | 1 - typescript/4.deployMerkleVerify.ts | 82 + typescript/5.deployAirdropPoseidonDevnet.ts | 57 + typescript/6.testAirdropPoseidonDevnet.ts | 68 + 11 files changed, 6008 insertions(+), 14 deletions(-) create mode 100644 cairo/airdrop_poseidon.cairo create mode 100644 cairo/airdrop_poseidon.casm.json create mode 100644 cairo/airdrop_poseidon.sierra.json create mode 100644 cairo/merkleTreeVerify.md create mode 100644 cairo/merkle_verify_poseidon.abi.json create mode 100644 typescript/4.deployMerkleVerify.ts create mode 100644 typescript/5.deployAirdropPoseidonDevnet.ts create mode 100644 typescript/6.testAirdropPoseidonDevnet.ts diff --git a/README.md b/README.md index 8c96e00..18322b0 100644 --- a/README.md +++ b/README.md @@ -9,7 +9,7 @@ **This library has not been audited ; use at your own risks.** -This library is able to create Merkle trees, using very efficient and specifics hashes for the Starknet blockchain. You can use : +This library is able to create and handle Merkle trees, using very efficient and specifics hashes for the Starknet blockchain. You can use : - Pedersen hash (by default) - Poseidon hash (the most efficient one) @@ -37,38 +37,62 @@ For an Airdrop, you needs a list of granted addresses, and optionally the quanti ```typescript // address + quantity (u256.low + u256.high) const airdrop: Merkle.InputForMerkle[] = [ - ['0x69b49c2cc8b16e80e86bfc5b0614a59aa8c9b601569c7b80dde04d3f3151b79', '256','0'], - ['0x3cad9a072d3cf29729ab2fad2e08972b8cfde01d4979083fb6d15e8e66f8ab1', '25','0'], - ['0x27d32a3033df4277caa9e9396100b7ca8c66a4ef8ea5f6765b91a7c17f0109c', '56','0'], + ['0x69b49c2cc8b16e80e86bfc5b0614a59aa8c9b601569c7b80dde04d3f3151b79', '256','0'], + ['0x3cad9a072d3cf29729ab2fad2e08972b8cfde01d4979083fb6d15e8e66f8ab1', '25','0'], + ['0x27d32a3033df4277caa9e9396100b7ca8c66a4ef8ea5f6765b91a7c17f0109c', '56','0'], + ['0x7e00d496e324876bbc8531f2d9a82bf154d1a04a50218ee74cdd372f75a551a', '26','0'], + ['0x53c615080d35defd55569488bc48c1a91d82f2d2ce6199463e095b4a4ead551', '56','0'], ]; const tree = Merkle.StarknetMerkleTree.create(airdrop, Merkle.HashType.Poseidon); ``` +### 🫚 Get the root of the tree : +```typescript +const root = tree.root; +``` ### 🎰 Create a Merkle proof : ```typescript const inp = 3; // Nth leaf of the input list +// or +const inp = ['0x7e00d496e324876bbc8531f2d9a82bf154d1a04a50218ee74cdd372f75a551a', '26','0']; // leaf content + const proof = tree.getProof(inp); ``` ### Hash a leaf : ```typescript +const inp = 3; // Nth leaf of the input list const inpData = tree.getInputData(inp); const leafHash = Merkle.StarknetMerkleTree.leafHash(inpData, Merkle.HashType.Poseidon); ``` -### 🔎 Verify a proof with Starknet.js : +### 🔎 Verify a proof with your JS/TS script : ```typescript +const inp = 3; // Nth leaf of the input list const inpData = tree.getInputData(inp); const isValid = tree.verify(inpData, proof); ``` ### 🔎 Verify a proof in the Starknet blockchain : -A dedicated smart-contract is created, including only one value of the tree : the root. You send a proof (few numbers) to this contract, and it can say if an address is included in the tree or not. Just by storing a felt252 in Starknet, you can check that an address is included in a list of thousand of addresses, and trigger a distribution of token to this address. -> A Cairo 1 smart-contract is in preparation and will be released soon. It will show how to verify a Merkle proof in Starknet. Stay tune ; just need a couple of weeks to release it. +You have to deploy a new instance of an existing smart-contract. There is one contract dedicated for Pedersen hash, and one other for Poseidon hash. These contracts are already declared in Starknet Mainnet, Goerli Testnet and Sepolia Testnet, with the following class hashes : + +| Tree hash | Class hash | +| :---: | :--- | +| **Pedersen class hash** | Soon | +| **Poseidon class hash** | `0x03e2efc98f902c0b33eee6c3daa97b941912bcab61b6162884380c682e594eaf`| + +So, you will not have to pay fees to declare this part of the airdrop code ; it's already made. +You have to deploy this contract (called here contract 1) with only one parameter in the constructor : the tree root. + +You have to create/declare/deploy your dedicated smart-contract (called here contract 2) to handle the Airdrop (list of already performed airdrops, distribution of tokens, timing, administration, etc..). +This contract 2 has to call the contract 1 to verify if the data are correct and are part of the Merkle tree. +Contract 1 is able to say if an address and the corresponding data are included in the tree or not. Just by storing a felt252 in Starknet, you can check that an address is included in a list of thousand of addresses, and trigger a distribution of token to this address. + +You can find a documentation of this contract 1 [here](./cairo/merkleTreeVerify.md). -> Additional scripts will be released soon. +> Some demo Typescript files are available [here](./typescript). -> A demo DAPP for an Airdrop is in preparation, and will be listed here. +> A demo DAPP for an Airdrop is in preparation, and you will find the link here as soon as released. ## API : @@ -103,6 +127,12 @@ Returns a proof for the Nth value in the tree. Indices refer to the position of ```typescript const proof1 = tree.getProof(3); const proof2 = tree.getProof(["0x43af5", '100']); +// result = +[ + '0x40a6dba21b22596e979a1555a278ca58c11b5cd5e46f5801c1af8c4ab518845', + '0x7957d036cf1e60858a601df12e0fb2921114d4b5facccf638163e0bb2be3c34', + '0x12677ed42d2f73c92413c30d04d0b88e771bf2595c7060df46f095f2132eca2' +] ``` ### verify() : @@ -110,10 +140,11 @@ Returns a boolean that is `true` when the proof verifies that the value is conta ```typescript const result1 = tree.verify(3, proof); const result2 = tree.verify(["0x34e67d", '100'], proof); +// result = true ``` ### dump() : -Returns a description of the merkle tree for distribution. It contains all the necessary information to reproduce the tree, find the relevant leaves, and generate proofs. You should distribute this to users in a web application so they can generate proofs for their leaves of interest. +Returns a description of the Merkle tree for distribution. It contains all the necessary information to reproduce the tree, find the relevant leaves, and generate proofs. You should distribute this to users in a web application so they can generate proofs for some leaves. ```typescript fs.writeFileSync('data/treeTestPoseidon.json', JSON.stringify(tree.dump(),undefined,2)); ``` @@ -136,12 +167,23 @@ tree.validate(); The root of the tree is a commitment on the values of the tree. It can be published in a smart contract, to later prove that its values are part of the tree. ```typescript console.log(tree.root); +// result = 0x4bad3f80e8041eb3d32432fa4aed9f904db8c8ab34109879a99da696a0c5a81 ``` ### render() : Returns a visual representation of the tree that can be useful for debugging. ```typescript console.log(tree.render()); +// result = +0) 0x4bad3f80e8041eb3d32432fa4aed9f904db8c8ab34109879a99da696a0c5a81 +├─ 1) 0x4f9ffba9cb60723ecb53299f6b2359a9d32a1aa316ffcf83022c58d822abc55 +│ ├─ 3) 0x1cd0fa9d323f2de54979140bab80cb8077ac24e098c685da5ac6a4d9a17c25c +│ │ ├─ 7) 0x6e5bfc0a35b74af4395c2a60a7735c0f0cbcfba515e91d4edd3f7ea70287cbc +│ │ └─ 8) 0x40a6dba21b22596e979a1555a278ca58c11b5cd5e46f5801c1af8c4ab518845 +│ └─ 4) 0x7957d036cf1e60858a601df12e0fb2921114d4b5facccf638163e0bb2be3c34 +└─ 2) 0x12677ed42d2f73c92413c30d04d0b88e771bf2595c7060df46f095f2132eca2 + ├─ 5) 0x77dc74ab2217383b4c2a772e491f8177277af576fd426f8c59f9c64d7ef258b + └─ 6) 0x707142fb4ad00584910740c7d8207669b429cb93ce1985870b5fa5096ced91c ``` ### getInputData() : @@ -155,8 +197,9 @@ const data= tree.getInputData(3); Hash a leaf. Returns an hex string. ```typescript -const leaf: InputForMerkle = ['0x27d32a3033df4277caa9e9396100b7ca8c66a4ef8ea5f6765b91a7c17f0109c', '56','0']; +const leaf: InputForMerkle = ['0x7e00d496e324876bbc8531f2d9a82bf154d1a04a50218ee74cdd372f75a551a', '26', '0']; const hashedLeaf: string = Merkle.hashDataToHex(leaf, Merkle.HashType.Pedersen); +// result = 0x6e5bfc0a35b74af4395c2a60a7735c0f0cbcfba515e91d4edd3f7ea70287cbc ``` > Identical to `Merkle.StarknetMerkleTree.leafHash()` . > `Merkle.hashDataToBigint()` is similar, with a `bigint` result. @@ -173,7 +216,7 @@ const hash: bigint = Merkle.computePoseidonHashOnElements(["0x10e", "0xc4", "0x1 Calculate the hash of 2 bigint. ```typescript -const hash: bigint = Merkle.hashPair(200n, 300n,Merkle.HashType.Pedersen); +const hash: bigint = Merkle.hashPair(200n, 300n, Merkle.HashType.Pedersen); ``` ## ⚖️ License : diff --git a/cairo/airdrop_poseidon.cairo b/cairo/airdrop_poseidon.cairo new file mode 100644 index 0000000..d2f26cf --- /dev/null +++ b/cairo/airdrop_poseidon.cairo @@ -0,0 +1,100 @@ +// Example of Airdrop contract +// Coded with Cairo 2.4.0 +// contract not audited ; use at your own risks. + +use starknet::ContractAddress; + +#[starknet::interface] +trait IMerkleVerify { + fn get_merkle_address(self: @TContractState) -> ContractAddress; + fn get_time(self: @TContractState) -> u64; + fn is_address_airdropped(self: @TContractState, address: ContractAddress) -> bool; + fn request_airdrop( + ref self: TContractState, address: ContractAddress, amount: u256, proof: Array + ); +} + +#[starknet::contract] +mod merkle_verify { + use core::option::OptionTrait; + use super::IMerkleVerify; + use starknet::{ContractAddress, SyscallResultTrait, contract_address_const}; + use starknet::get_block_timestamp; + use core::poseidon::poseidon_hash_span; + use core::hash::HashStateExTrait; + use poseidon::{PoseidonTrait, HashState}; + use hash::{HashStateTrait, Hash}; + use array::{ArrayTrait, SpanTrait}; + + #[storage] + struct Storage { + erc20_address: ContractAddress, + start_time: u64, + merkle_address: ContractAddress, + merkle_root: felt252, + airdrop_performed: LegacyMap::, + } + + #[constructor] + fn constructor( + ref self: ContractState, + erc20_address: ContractAddress, + merkle_address: ContractAddress, + start_time: u64, + ) { + self.erc20_address.write(erc20_address); + self.merkle_address.write(merkle_address); + self.start_time.write(start_time); + } + + #[external(v0)] + impl MerkleVerifyContract of super::IMerkleVerify { + // returns the address of the merkle verify contract for this airdrop + fn get_merkle_address(self: @ContractState) -> ContractAddress { + self.merkle_address.read() + } + + // returns the time of start of the airdrop + fn get_time(self: @ContractState) -> u64 { + get_block_timestamp() + } + + fn is_address_airdropped(self: @ContractState, address: ContractAddress) -> bool { + self.airdrop_performed.read(address) + } + + fn request_airdrop( + ref self: ContractState, address: ContractAddress, amount: u256, proof: Array + ) { + let already_airdropped: bool = self.airdrop_performed.read(address); + assert(!already_airdropped, 'Address already airdropped'); + let current_time: u64 = get_block_timestamp(); + let airdrop_start_time: u64 = self.start_time.read(); + assert(current_time >= airdrop_start_time, 'Airdrop has not started yet.'); + let mut call_data: Array = ArrayTrait::new(); + call_data.append(address.into()); + call_data.append(amount.low.into()); + call_data.append(amount.high.into()); + Serde::serialize(@proof, ref call_data); + let mut is_leave_valid = starknet::call_contract_syscall( + self.merkle_address.read(), selector!("verify_from_leaf_airdrop"), call_data.span() + ) + .unwrap_syscall(); + let mut is_request_valid: bool = Serde::::deserialize(ref is_leave_valid) + .unwrap(); + + assert(is_request_valid, 'Proof not valid.'); // revert if not valid + + // Airdrop + // Register the address as already airdropped + self.airdrop_performed.write(address, true); + // to be sure to perform the airdrop only once per address. + + // Perform here your transfer of token. + + // if needed, create some events. + + return (); + } + } +} diff --git a/cairo/airdrop_poseidon.casm.json b/cairo/airdrop_poseidon.casm.json new file mode 100644 index 0000000..241880b --- /dev/null +++ b/cairo/airdrop_poseidon.casm.json @@ -0,0 +1,3749 @@ +{ + "prime": "0x800000000000011000000000000000000000000000000000000000000000001", + "compiler_version": "2.4.0", + "bytecode": [ + "0xa0680017fff8000", + "0x7", + "0x482680017ffa8000", + "0x100000000000000000000000000000000", + "0x400280007ff97fff", + "0x10780017fff7fff", + "0x5b", + "0x4825800180007ffa", + "0x0", + "0x400280007ff97fff", + "0x48297ffc80007ffd", + "0x482680017ff98000", + "0x1", + "0x4824800180007ffe", + "0x0", + "0x20680017fff7fff", + "0x4", + "0x10780017fff7fff", + "0x10", + "0x40780017fff7fff", + "0x1", + "0x480680017fff8000", + "0x496e70757420746f6f206c6f6e6720666f7220617267756d656e7473", + "0x400080007ffe7fff", + "0x48127ffc7fff8000", + "0x48127ff97fff8000", + "0x480a7ffb7fff8000", + "0x480680017fff8000", + "0x1", + "0x48127ffa7fff8000", + "0x482480017ff98000", + "0x1", + "0x208b7fff7fff7ffe", + "0x1104800180018000", + "0x971", + "0x482480017fff8000", + "0x970", + "0x480080007fff8000", + "0xa0680017fff8000", + "0x9", + "0x4824800180007ff7", + "0x28dc", + "0x482480017fff8000", + "0x100000000000000000000000000000000", + "0x400080007ff77fff", + "0x10780017fff7fff", + "0x24", + "0x4824800180007ff7", + "0x28dc", + "0x400080007ff87fff", + "0x482480017ff88000", + "0x1", + "0x48127ffe7fff8000", + "0x480a7ffb7fff8000", + "0x1104800180018000", + "0x2c2", + "0x20680017fff7ffd", + "0x11", + "0x40780017fff7fff", + "0x1", + "0x48127ffe7fff8000", + "0x48127ffe7fff8000", + "0x48127ffd7fff8000", + "0x1104800180018000", + "0x2d1", + "0x48127fed7fff8000", + "0x48127fed7fff8000", + "0x48127fed7fff8000", + "0x480680017fff8000", + "0x0", + "0x48127ffa7fff8000", + "0x48127ffa7fff8000", + "0x208b7fff7fff7ffe", + "0x48127ffa7fff8000", + "0x48127ffa7fff8000", + "0x48127ffa7fff8000", + "0x480680017fff8000", + "0x1", + "0x48127ffa7fff8000", + "0x48127ffa7fff8000", + "0x208b7fff7fff7ffe", + "0x40780017fff7fff", + "0x1", + "0x480680017fff8000", + "0x4f7574206f6620676173", + "0x400080007ffe7fff", + "0x482480017ff58000", + "0x1", + "0x48127ff27fff8000", + "0x480a7ffb7fff8000", + "0x480680017fff8000", + "0x1", + "0x48127ffa7fff8000", + "0x482480017ff98000", + "0x1", + "0x208b7fff7fff7ffe", + "0x40780017fff7fff", + "0x1", + "0x480680017fff8000", + "0x4f7574206f6620676173", + "0x400080007ffe7fff", + "0x482680017ff98000", + "0x1", + "0x480a7ffa7fff8000", + "0x480a7ffb7fff8000", + "0x480680017fff8000", + "0x1", + "0x48127ffa7fff8000", + "0x482480017ff98000", + "0x1", + "0x208b7fff7fff7ffe", + "0xa0680017fff8000", + "0x7", + "0x482680017ffa8000", + "0x100000000000000000000000000000000", + "0x400280007ff97fff", + "0x10780017fff7fff", + "0x58", + "0x4825800180007ffa", + "0x0", + "0x400280007ff97fff", + "0x48297ffc80007ffd", + "0x482680017ff98000", + "0x1", + "0x4824800180007ffe", + "0x0", + "0x20680017fff7fff", + "0x4", + "0x10780017fff7fff", + "0x10", + "0x40780017fff7fff", + "0x1", + "0x480680017fff8000", + "0x496e70757420746f6f206c6f6e6720666f7220617267756d656e7473", + "0x400080007ffe7fff", + "0x48127ffc7fff8000", + "0x48127ff97fff8000", + "0x480a7ffb7fff8000", + "0x480680017fff8000", + "0x1", + "0x48127ffa7fff8000", + "0x482480017ff98000", + "0x1", + "0x208b7fff7fff7ffe", + "0x1104800180018000", + "0x902", + "0x482480017fff8000", + "0x901", + "0x480080007fff8000", + "0xa0680017fff8000", + "0x9", + "0x4824800180007ff7", + "0x1cac", + "0x482480017fff8000", + "0x100000000000000000000000000000000", + "0x400080007ff77fff", + "0x10780017fff7fff", + "0x21", + "0x4824800180007ff7", + "0x1cac", + "0x400080007ff87fff", + "0x48127fff7fff8000", + "0x480a7ffb7fff8000", + "0x1104800180018000", + "0x273", + "0x482480017fd18000", + "0x1", + "0x20680017fff7ffc", + "0xe", + "0x40780017fff7fff", + "0x1", + "0x400080007fff7ffd", + "0x48127ffe7fff8000", + "0x48127ff87fff8000", + "0x48127ff87fff8000", + "0x480680017fff8000", + "0x0", + "0x48127ffb7fff8000", + "0x482480017ffa8000", + "0x1", + "0x208b7fff7fff7ffe", + "0x48127fff7fff8000", + "0x48127ff97fff8000", + "0x48127ff97fff8000", + "0x480680017fff8000", + "0x1", + "0x48127ff97fff8000", + "0x48127ff97fff8000", + "0x208b7fff7fff7ffe", + "0x40780017fff7fff", + "0x1", + "0x480680017fff8000", + "0x4f7574206f6620676173", + "0x400080007ffe7fff", + "0x482480017ff58000", + "0x1", + "0x48127ff27fff8000", + "0x480a7ffb7fff8000", + "0x480680017fff8000", + "0x1", + "0x48127ffa7fff8000", + "0x482480017ff98000", + "0x1", + "0x208b7fff7fff7ffe", + "0x40780017fff7fff", + "0x1", + "0x480680017fff8000", + "0x4f7574206f6620676173", + "0x400080007ffe7fff", + "0x482680017ff98000", + "0x1", + "0x480a7ffa7fff8000", + "0x480a7ffb7fff8000", + "0x480680017fff8000", + "0x1", + "0x48127ffa7fff8000", + "0x482480017ff98000", + "0x1", + "0x208b7fff7fff7ffe", + "0xa0680017fff8000", + "0x7", + "0x482680017ffa8000", + "0x100000000000000000000000000000000", + "0x400280007ff97fff", + "0x10780017fff7fff", + "0x77", + "0x4825800180007ffa", + "0x0", + "0x400280007ff97fff", + "0x482680017ff98000", + "0x1", + "0x480a7ffc7fff8000", + "0x480a7ffd7fff8000", + "0x1104800180018000", + "0x242", + "0x20680017fff7ffe", + "0x5d", + "0x48307ffc80007ffd", + "0x4824800180007fff", + "0x0", + "0x20680017fff7fff", + "0x4", + "0x10780017fff7fff", + "0x11", + "0x40780017fff7fff", + "0x1", + "0x480680017fff8000", + "0x496e70757420746f6f206c6f6e6720666f7220617267756d656e7473", + "0x400080007ffe7fff", + "0x480a7ff87fff8000", + "0x48127ff67fff8000", + "0x48127fda7fff8000", + "0x480a7ffb7fff8000", + "0x480680017fff8000", + "0x1", + "0x48127ff97fff8000", + "0x482480017ff88000", + "0x1", + "0x208b7fff7fff7ffe", + "0x1104800180018000", + "0x88f", + "0x482480017fff8000", + "0x88e", + "0x480080007fff8000", + "0x480080007fff8000", + "0x482480017fff8000", + "0x404c", + "0xa0680017fff8000", + "0x8", + "0x48307ffe80007fd7", + "0x482480017fff8000", + "0x100000000000000000000000000000000", + "0x400080007ff07fff", + "0x10780017fff7fff", + "0x27", + "0x48307ffe80007fd7", + "0x400080007ff17fff", + "0x482480017ff18000", + "0x1", + "0x48127ffe7fff8000", + "0x480a7ff87fff8000", + "0x480a7ffb7fff8000", + "0x48127ff17fff8000", + "0x1104800180018000", + "0x249", + "0x20680017fff7ffd", + "0x12", + "0x40780017fff7fff", + "0x1", + "0x48127ffe7fff8000", + "0x48127ffe7fff8000", + "0x48127ffd7fff8000", + "0x1104800180018000", + "0x25c", + "0x48127fee7fff8000", + "0x48127feb7fff8000", + "0x48127feb7fff8000", + "0x48127fec7fff8000", + "0x480680017fff8000", + "0x0", + "0x48127ff97fff8000", + "0x48127ff97fff8000", + "0x208b7fff7fff7ffe", + "0x48127ffb7fff8000", + "0x48127ff87fff8000", + "0x48127ff87fff8000", + "0x48127ff97fff8000", + "0x480680017fff8000", + "0x1", + "0x48127ff97fff8000", + "0x48127ff97fff8000", + "0x208b7fff7fff7ffe", + "0x40780017fff7fff", + "0x1", + "0x480680017fff8000", + "0x4f7574206f6620676173", + "0x400080007ffe7fff", + "0x480a7ff87fff8000", + "0x482480017fed8000", + "0x1", + "0x48127fd17fff8000", + "0x480a7ffb7fff8000", + "0x480680017fff8000", + "0x1", + "0x48127ff97fff8000", + "0x482480017ff88000", + "0x1", + "0x208b7fff7fff7ffe", + "0x40780017fff7fff", + "0x1", + "0x480680017fff8000", + "0x4661696c656420746f20646573657269616c697a6520706172616d202331", + "0x400080007ffe7fff", + "0x480a7ff87fff8000", + "0x48127ff87fff8000", + "0x48127fdc7fff8000", + "0x480a7ffb7fff8000", + "0x480680017fff8000", + "0x1", + "0x48127ff97fff8000", + "0x482480017ff88000", + "0x1", + "0x208b7fff7fff7ffe", + "0x40780017fff7fff", + "0x1", + "0x480680017fff8000", + "0x4f7574206f6620676173", + "0x400080007ffe7fff", + "0x480a7ff87fff8000", + "0x482680017ff98000", + "0x1", + "0x480a7ffa7fff8000", + "0x480a7ffb7fff8000", + "0x480680017fff8000", + "0x1", + "0x48127ff97fff8000", + "0x482480017ff88000", + "0x1", + "0x208b7fff7fff7ffe", + "0x40780017fff7fff", + "0x3", + "0xa0680017fff8000", + "0x7", + "0x482680017ffa8000", + "0xffffffffffffffffffffffffffffd5a8", + "0x400280007ff97fff", + "0x10780017fff7fff", + "0xb3", + "0x4825800180007ffa", + "0x2a58", + "0x400280007ff97fff", + "0x482680017ff98000", + "0x1", + "0x480a7ffc7fff8000", + "0x480a7ffd7fff8000", + "0x1104800180018000", + "0x1b4", + "0x20680017fff7ffe", + "0x99", + "0x48127ffb7fff8000", + "0x48127ffb7fff8000", + "0x48127ffb7fff8000", + "0x1104800180018000", + "0x20f", + "0x40137fcc7fff8002", + "0x20680017fff7ffd", + "0x82", + "0x48127ffa7fff8000", + "0x48127fac7fff8000", + "0x48127ff97fff8000", + "0x48127ff97fff8000", + "0x40137ffa7fff8000", + "0x40137ffb7fff8001", + "0x1104800180018000", + "0x266", + "0x20680017fff7ffa", + "0x6f", + "0x20680017fff7ffd", + "0x5e", + "0x48307ffb80007ffc", + "0x4824800180007fff", + "0x0", + "0x20680017fff7fff", + "0x4", + "0x10780017fff7fff", + "0x11", + "0x40780017fff7fff", + "0x1", + "0x480680017fff8000", + "0x496e70757420746f6f206c6f6e6720666f7220617267756d656e7473", + "0x400080007ffe7fff", + "0x480a7ff87fff8000", + "0x48127ff37fff8000", + "0x48127ff37fff8000", + "0x480a7ffb7fff8000", + "0x480680017fff8000", + "0x1", + "0x48127ff97fff8000", + "0x482480017ff88000", + "0x1", + "0x208b7fff7fff7ffe", + "0x1104800180018000", + "0x7ed", + "0x482480017fff8000", + "0x7ec", + "0x480080007fff8000", + "0x480080007fff8000", + "0x484480017fff8000", + "0x2", + "0x482480017fff8000", + "0x18c0e", + "0xa0680017fff8000", + "0x8", + "0x48307ffe80007fef", + "0x482480017fff8000", + "0x100000000000000000000000000000000", + "0x400080007fec7fff", + "0x10780017fff7fff", + "0x26", + "0x48307ffe80007fef", + "0x400080007fed7fff", + "0x482480017fed8000", + "0x1", + "0x48127ffe7fff8000", + "0x480a7ff87fff8000", + "0x480a7ffb7fff8000", + "0x480a80027fff8000", + "0x480a80007fff8000", + "0x480a80017fff8000", + "0x48127fec7fff8000", + "0x48127fec7fff8000", + "0x1104800180018000", + "0x274", + "0x20680017fff7ffd", + "0xd", + "0x40780017fff7fff", + "0x1", + "0x48127ffa7fff8000", + "0x48127ff77fff8000", + "0x48127ff77fff8000", + "0x48127ff87fff8000", + "0x480680017fff8000", + "0x0", + "0x48127ffa7fff8000", + "0x48127ff97fff8000", + "0x208b7fff7fff7ffe", + "0x48127ffb7fff8000", + "0x48127ff87fff8000", + "0x48127ff87fff8000", + "0x48127ff97fff8000", + "0x480680017fff8000", + "0x1", + "0x48127ff97fff8000", + "0x48127ff97fff8000", + "0x208b7fff7fff7ffe", + "0x40780017fff7fff", + "0x1", + "0x480680017fff8000", + "0x4f7574206f6620676173", + "0x400080007ffe7fff", + "0x480a7ff87fff8000", + "0x482480017fe98000", + "0x1", + "0x48127fe97fff8000", + "0x480a7ffb7fff8000", + "0x480680017fff8000", + "0x1", + "0x48127ff97fff8000", + "0x482480017ff88000", + "0x1", + "0x208b7fff7fff7ffe", + "0x40780017fff7fff", + "0x1", + "0x480680017fff8000", + "0x4661696c656420746f20646573657269616c697a6520706172616d202333", + "0x400080007ffe7fff", + "0x480a7ff87fff8000", + "0x48127ff57fff8000", + "0x48127ff57fff8000", + "0x480a7ffb7fff8000", + "0x480680017fff8000", + "0x1", + "0x48127ff97fff8000", + "0x482480017ff88000", + "0x1", + "0x208b7fff7fff7ffe", + "0x480a7ff87fff8000", + "0x48127ff77fff8000", + "0x48127ff77fff8000", + "0x480a7ffb7fff8000", + "0x480680017fff8000", + "0x1", + "0x48127ff97fff8000", + "0x48127ff97fff8000", + "0x208b7fff7fff7ffe", + "0x40780017fff7fff", + "0x1", + "0x480680017fff8000", + "0x4661696c656420746f20646573657269616c697a6520706172616d202332", + "0x400080007ffe7fff", + "0x480a7ff87fff8000", + "0x48127ff77fff8000", + "0x48127fa97fff8000", + "0x480a7ffb7fff8000", + "0x480680017fff8000", + "0x1", + "0x48127ff97fff8000", + "0x482480017ff88000", + "0x1", + "0x208b7fff7fff7ffe", + "0x40780017fff7fff", + "0x1", + "0x480680017fff8000", + "0x4661696c656420746f20646573657269616c697a6520706172616d202331", + "0x400080007ffe7fff", + "0x480a7ff87fff8000", + "0x48127ff87fff8000", + "0x48127fdc7fff8000", + "0x480a7ffb7fff8000", + "0x480680017fff8000", + "0x1", + "0x48127ff97fff8000", + "0x482480017ff88000", + "0x1", + "0x208b7fff7fff7ffe", + "0x40780017fff7fff", + "0x1", + "0x480680017fff8000", + "0x4f7574206f6620676173", + "0x400080007ffe7fff", + "0x480a7ff87fff8000", + "0x482680017ff98000", + "0x1", + "0x480a7ffa7fff8000", + "0x480a7ffb7fff8000", + "0x480680017fff8000", + "0x1", + "0x48127ff97fff8000", + "0x482480017ff88000", + "0x1", + "0x208b7fff7fff7ffe", + "0xa0680017fff8000", + "0x7", + "0x482680017ffa8000", + "0xfffffffffffffffffffffffffffff0e2", + "0x400280007ff97fff", + "0x10780017fff7fff", + "0xb3", + "0x4825800180007ffa", + "0xf1e", + "0x400280007ff97fff", + "0x482680017ff98000", + "0x1", + "0x480a7ffc7fff8000", + "0x480a7ffd7fff8000", + "0x1104800180018000", + "0xec", + "0x20680017fff7ffe", + "0x9a", + "0x48127ffb7fff8000", + "0x48127ffb7fff8000", + "0x48127ffb7fff8000", + "0x1104800180018000", + "0xe5", + "0x20680017fff7ffe", + "0x85", + "0x48307ffc80007ffd", + "0x20680017fff7fff", + "0x4", + "0x10780017fff7fff", + "0xa", + "0x482480017ffb8000", + "0x1", + "0x48127ffb7fff8000", + "0x480680017fff8000", + "0x0", + "0x48127ff87fff8000", + "0x10780017fff7fff", + "0x8", + "0x48127ffb7fff8000", + "0x48127ffb7fff8000", + "0x480680017fff8000", + "0x1", + "0x480680017fff8000", + "0x0", + "0x20680017fff7ffe", + "0x5f", + "0x48127ff67fff8000", + "0x480080007ffe8000", + "0x1104800180018000", + "0x2d3", + "0x20680017fff7ffe", + "0x56", + "0x48127fee7fff8000", + "0x48127fee7fff8000", + "0x48307ffe80007fff", + "0x4824800180007fff", + "0x0", + "0x20680017fff7fff", + "0x4", + "0x10780017fff7fff", + "0x10", + "0x40780017fff7fff", + "0x1", + "0x480680017fff8000", + "0x496e70757420746f6f206c6f6e6720666f7220617267756d656e7473", + "0x400080007ffe7fff", + "0x48127ff77fff8000", + "0x48127fa77fff8000", + "0x480a7ffb7fff8000", + "0x480680017fff8000", + "0x1", + "0x48127ffa7fff8000", + "0x482480017ff98000", + "0x1", + "0x208b7fff7fff7ffe", + "0x1104800180018000", + "0x716", + "0x482480017fff8000", + "0x715", + "0x480080007fff8000", + "0xa0680017fff8000", + "0x9", + "0x4824800180007fa5", + "0xa0f0", + "0x482480017fff8000", + "0x100000000000000000000000000000000", + "0x400080007ff27fff", + "0x10780017fff7fff", + "0x22", + "0x4824800180007fa5", + "0xa0f0", + "0x400080007ff37fff", + "0x48127fff7fff8000", + "0x480a7ffb7fff8000", + "0x48127fc17fff8000", + "0x48127fdf7fff8000", + "0x48127ff17fff8000", + "0x1104800180018000", + "0x2c8", + "0x482480017f9f8000", + "0x1", + "0x20680017fff7ffc", + "0xc", + "0x40780017fff7fff", + "0x1", + "0x48127ffe7fff8000", + "0x48127ff87fff8000", + "0x48127ff87fff8000", + "0x480680017fff8000", + "0x0", + "0x48127ffb7fff8000", + "0x48127ffa7fff8000", + "0x208b7fff7fff7ffe", + "0x48127fff7fff8000", + "0x48127ff97fff8000", + "0x48127ff97fff8000", + "0x480680017fff8000", + "0x1", + "0x48127ff97fff8000", + "0x48127ff97fff8000", + "0x208b7fff7fff7ffe", + "0x40780017fff7fff", + "0x1", + "0x480680017fff8000", + "0x4f7574206f6620676173", + "0x400080007ffe7fff", + "0x482480017ff08000", + "0x1", + "0x48127fa07fff8000", + "0x480a7ffb7fff8000", + "0x480680017fff8000", + "0x1", + "0x48127ffa7fff8000", + "0x482480017ff98000", + "0x1", + "0x208b7fff7fff7ffe", + "0x48127ffd7fff8000", + "0x10780017fff7fff", + "0x5", + "0x40780017fff7fff", + "0xe", + "0x48127fe87fff8000", + "0x40780017fff7fff", + "0x1", + "0x480680017fff8000", + "0x4661696c656420746f20646573657269616c697a6520706172616d202333", + "0x400080007ffe7fff", + "0x48127ffd7fff8000", + "0x48127faa7fff8000", + "0x480a7ffb7fff8000", + "0x480680017fff8000", + "0x1", + "0x48127ffa7fff8000", + "0x482480017ff98000", + "0x1", + "0x208b7fff7fff7ffe", + "0x40780017fff7fff", + "0x1", + "0x480680017fff8000", + "0x4661696c656420746f20646573657269616c697a6520706172616d202332", + "0x400080007ffe7fff", + "0x48127ff97fff8000", + "0x48127fbe7fff8000", + "0x480a7ffb7fff8000", + "0x480680017fff8000", + "0x1", + "0x48127ffa7fff8000", + "0x482480017ff98000", + "0x1", + "0x208b7fff7fff7ffe", + "0x40780017fff7fff", + "0x1", + "0x480680017fff8000", + "0x4661696c656420746f20646573657269616c697a6520706172616d202331", + "0x400080007ffe7fff", + "0x48127ff97fff8000", + "0x48127fdd7fff8000", + "0x480a7ffb7fff8000", + "0x480680017fff8000", + "0x1", + "0x48127ffa7fff8000", + "0x482480017ff98000", + "0x1", + "0x208b7fff7fff7ffe", + "0x40780017fff7fff", + "0x1", + "0x480680017fff8000", + "0x4f7574206f6620676173", + "0x400080007ffe7fff", + "0x482680017ff98000", + "0x1", + "0x480a7ffa7fff8000", + "0x480a7ffb7fff8000", + "0x480680017fff8000", + "0x1", + "0x48127ffa7fff8000", + "0x482480017ff98000", + "0x1", + "0x208b7fff7fff7ffe", + "0x480a7ffb7fff8000", + "0x480a7ffc7fff8000", + "0x480a7ffd7fff8000", + "0x1104800180018000", + "0x296", + "0x20680017fff7ffd", + "0xb", + "0x48127ffa7fff8000", + "0x48127ffa7fff8000", + "0x48127ffa7fff8000", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x48127ffa7fff8000", + "0x208b7fff7fff7ffe", + "0x48127ffa7fff8000", + "0x48127ffa7fff8000", + "0x48127ffa7fff8000", + "0x480680017fff8000", + "0x1", + "0x48127ffa7fff8000", + "0x48127ffa7fff8000", + "0x208b7fff7fff7ffe", + "0x480a7ffb7fff8000", + "0x480a7ffc7fff8000", + "0x480a7ffd7fff8000", + "0x1104800180018000", + "0x2cd", + "0x208b7fff7fff7ffe", + "0x480a7ffc7fff8000", + "0x480a7ffd7fff8000", + "0x1104800180018000", + "0x2cd", + "0x20680017fff7ffd", + "0xa", + "0x48127ffb7fff8000", + "0x48127ffb7fff8000", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x480080017ffb8000", + "0x208b7fff7fff7ffe", + "0x48127ffb7fff8000", + "0x48127ffb7fff8000", + "0x480680017fff8000", + "0x1", + "0x48127ffb7fff8000", + "0x48127ffb7fff8000", + "0x208b7fff7fff7ffe", + "0x480a7ffc7fff8000", + "0x480a7ffd7fff8000", + "0x1104800180018000", + "0x2cd", + "0x20680017fff7ffe", + "0x2b", + "0xa0680017fff8004", + "0xe", + "0x4824800180047ffe", + "0x800000000000000000000000000000000000000000000000000000000000000", + "0x484480017ffe8000", + "0x110000000000000000", + "0x48307ffe7fff8002", + "0x480280007ffb7ffc", + "0x480280017ffb7ffc", + "0x402480017ffb7ffd", + "0xffffffffffffffeeffffffffffffffff", + "0x400280027ffb7ffd", + "0x10780017fff7fff", + "0x14", + "0x484480017fff8001", + "0x8000000000000000000000000000000", + "0x48307fff80007ffd", + "0x480280007ffb7ffd", + "0x480280017ffb7ffd", + "0x402480017ffc7ffe", + "0xf8000000000000000000000000000000", + "0x400280027ffb7ffe", + "0x40780017fff7fff", + "0x1", + "0x482680017ffb8000", + "0x3", + "0x48127ff57fff8000", + "0x48127ff57fff8000", + "0x480680017fff8000", + "0x0", + "0x48127ff57fff8000", + "0x208b7fff7fff7ffe", + "0x482680017ffb8000", + "0x3", + "0x48127ff57fff8000", + "0x48127ff57fff8000", + "0x480680017fff8000", + "0x1", + "0x480680017fff8000", + "0x0", + "0x208b7fff7fff7ffe", + "0x40780017fff7fff", + "0x6", + "0x480a7ffb7fff8000", + "0x48127ff57fff8000", + "0x48127ff57fff8000", + "0x480680017fff8000", + "0x1", + "0x480680017fff8000", + "0x0", + "0x208b7fff7fff7ffe", + "0x480a7ff97fff8000", + "0x480a7ffa7fff8000", + "0x480a7ffb7fff8000", + "0x480a7ffc7fff8000", + "0x480a7ffd7fff8000", + "0x1104800180018000", + "0x2b5", + "0x20680017fff7ffd", + "0xc", + "0x48127ff97fff8000", + "0x48127ff97fff8000", + "0x48127ff97fff8000", + "0x48127ff97fff8000", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x48127ff97fff8000", + "0x208b7fff7fff7ffe", + "0x48127ff97fff8000", + "0x48127ff97fff8000", + "0x48127ff97fff8000", + "0x48127ff97fff8000", + "0x480680017fff8000", + "0x1", + "0x48127ff97fff8000", + "0x48127ff97fff8000", + "0x208b7fff7fff7ffe", + "0x20780017fff7ffb", + "0x6", + "0x480680017fff8000", + "0x0", + "0x10780017fff7fff", + "0x4", + "0x480680017fff8000", + "0x1", + "0x480a7ffc7fff8000", + "0x480a7ffd7fff8000", + "0x1104800180018000", + "0x256", + "0x208b7fff7fff7ffe", + "0x48297ffc80007ffd", + "0x20680017fff7fff", + "0x4", + "0x10780017fff7fff", + "0xa", + "0x482680017ffc8000", + "0x1", + "0x480a7ffd7fff8000", + "0x480680017fff8000", + "0x0", + "0x480a7ffc7fff8000", + "0x10780017fff7fff", + "0x8", + "0x480a7ffc7fff8000", + "0x480a7ffd7fff8000", + "0x480680017fff8000", + "0x1", + "0x480680017fff8000", + "0x0", + "0x48127ffc7fff8000", + "0x48127ffc7fff8000", + "0x20680017fff7ffc", + "0x41", + "0x480a7ffb7fff8000", + "0x480080007ffc8000", + "0x1104800180018000", + "0x2c1", + "0x20680017fff7ffe", + "0x36", + "0x48307ff180007ff2", + "0x20680017fff7fff", + "0x4", + "0x10780017fff7fff", + "0xa", + "0x482480017ff08000", + "0x1", + "0x48127ff07fff8000", + "0x480680017fff8000", + "0x0", + "0x48127fed7fff8000", + "0x10780017fff7fff", + "0x8", + "0x48127ff07fff8000", + "0x48127ff07fff8000", + "0x480680017fff8000", + "0x1", + "0x480680017fff8000", + "0x0", + "0x48127ffc7fff8000", + "0x48127ffc7fff8000", + "0x20680017fff7ffc", + "0x13", + "0x48127ff67fff8000", + "0x480080007ffc8000", + "0x1104800180018000", + "0x2a4", + "0x20680017fff7ffe", + "0xa", + "0x48127ffd7fff8000", + "0x48127ff07fff8000", + "0x48127ff07fff8000", + "0x480680017fff8000", + "0x0", + "0x48127fe77fff8000", + "0x48127ffa7fff8000", + "0x208b7fff7fff7ffe", + "0x48127ffd7fff8000", + "0x10780017fff7fff", + "0x5", + "0x40780017fff7fff", + "0xd", + "0x48127fe97fff8000", + "0x48127ff07fff8000", + "0x48127ff07fff8000", + "0x480680017fff8000", + "0x1", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x208b7fff7fff7ffe", + "0x40780017fff7fff", + "0x14", + "0x48127fe97fff8000", + "0x10780017fff7fff", + "0x5", + "0x40780017fff7fff", + "0x21", + "0x480a7ffb7fff8000", + "0x48127fdc7fff8000", + "0x48127fdc7fff8000", + "0x480680017fff8000", + "0x1", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x208b7fff7fff7ffe", + "0x48297ffc80007ffd", + "0x20680017fff7fff", + "0x4", + "0x10780017fff7fff", + "0xa", + "0x482680017ffc8000", + "0x1", + "0x480a7ffd7fff8000", + "0x480680017fff8000", + "0x0", + "0x480a7ffc7fff8000", + "0x10780017fff7fff", + "0x8", + "0x480a7ffc7fff8000", + "0x480a7ffd7fff8000", + "0x480680017fff8000", + "0x1", + "0x480680017fff8000", + "0x0", + "0x48127ffc7fff8000", + "0x48127ffc7fff8000", + "0x20680017fff7ffc", + "0x26", + "0x40780017fff7fff", + "0x1", + "0x480a7ffa7fff8000", + "0x480a7ffb7fff8000", + "0x48127ffb7fff8000", + "0x48127ffb7fff8000", + "0x48127ffb7fff8000", + "0x48127ffa7fff8000", + "0x480080007ff68000", + "0x1104800180018000", + "0x27f", + "0x20680017fff7ffa", + "0xc", + "0x48127ff87fff8000", + "0x48127ff87fff8000", + "0x480680017fff8000", + "0x0", + "0x48127ff87fff8000", + "0x48127ff87fff8000", + "0x48127ff87fff8000", + "0x48127ff87fff8000", + "0x48127ff87fff8000", + "0x208b7fff7fff7ffe", + "0x48127ff87fff8000", + "0x48127ff87fff8000", + "0x480680017fff8000", + "0x1", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x48127ff87fff8000", + "0x48127ff87fff8000", + "0x208b7fff7fff7ffe", + "0x480a7ffa7fff8000", + "0x480a7ffb7fff8000", + "0x480680017fff8000", + "0x0", + "0x48127ffb7fff8000", + "0x48127ffb7fff8000", + "0x480680017fff8000", + "0x1", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x208b7fff7fff7ffe", + "0x40780017fff7fff", + "0x2", + "0x480a7ff57fff8000", + "0x480a7ff67fff8000", + "0x480a7ff77fff8000", + "0x480a7ff87fff8000", + "0x480a7ff97fff8000", + "0x1104800180018000", + "0x1e0", + "0x40137ffb7fff8000", + "0x20680017fff7ffd", + "0xea", + "0x480680017fff8000", + "0x1", + "0x48307ffe80007fff", + "0x20680017fff7fff", + "0x11", + "0x40780017fff7fff", + "0x1", + "0x480680017fff8000", + "0x4164647265737320616c72656164792061697264726f70706564", + "0x400080007ffe7fff", + "0x48127ff57fff8000", + "0x48127ff57fff8000", + "0x480a80007fff8000", + "0x48127ff57fff8000", + "0x480680017fff8000", + "0x1", + "0x48127ff97fff8000", + "0x482480017ff88000", + "0x1", + "0x208b7fff7fff7ffe", + "0x48127ff87fff8000", + "0x48127ff97fff8000", + "0x1104800180018000", + "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffebe", + "0x20680017fff7ffd", + "0xc7", + "0x48127fd07fff8000", + "0x48127ffa7fff8000", + "0x48127ffa7fff8000", + "0x1104800180018000", + "0x29a", + "0x40137ffc7fff8001", + "0x20680017fff7ffd", + "0xb6", + "0x48307fff80017fd5", + "0xa0680017fff7fff", + "0x7", + "0x482480017fff8000", + "0x100000000000000000000000000000000", + "0x400080007ff77fff", + "0x10780017fff7fff", + "0x9e", + "0x400080007ff87fff", + "0x40780017fff7fff", + "0x1", + "0x400180007fff7ff9", + "0x400180017fff7ffa", + "0x400180027fff7ffb", + "0x482480017ff78000", + "0x1", + "0x48127ff77fff8000", + "0x480a7ffc7fff8000", + "0x480a7ffd7fff8000", + "0x48127ffb7fff8000", + "0x482480017ffa8000", + "0x3", + "0x1104800180018000", + "0x2ce", + "0x20680017fff7ffd", + "0x83", + "0x48127ffb7fff8000", + "0x48127ffb7fff8000", + "0x480a80017fff8000", + "0x1104800180018000", + "0x10f", + "0x20680017fff7ffd", + "0x73", + "0x480680017fff8000", + "0x35fae8f261ef41929c4c66cd55f6f7ce0595529b32d8de7d7bc8f02cdd97b8a", + "0x48127fd47fff8000", + "0x48127fd47fff8000", + "0x480680017fff8000", + "0x43616c6c436f6e7472616374", + "0x400080007ff87fff", + "0x400080017ff87ff7", + "0x400080027ff87ffb", + "0x400080037ff87ffc", + "0x400080047ff87ffd", + "0x400080057ff87ffe", + "0x480080077ff88000", + "0x20680017fff7fff", + "0xb", + "0x480080067ff78000", + "0x482480017ff68000", + "0xa", + "0x480680017fff8000", + "0x0", + "0x480080087ff48000", + "0x480080097ff38000", + "0x10780017fff7fff", + "0x9", + "0x480080067ff78000", + "0x482480017ff68000", + "0xa", + "0x480680017fff8000", + "0x1", + "0x480080087ff48000", + "0x480080097ff38000", + "0x1104800180018000", + "0x2bf", + "0x20680017fff7ffd", + "0x47", + "0x48127ffe7fff8000", + "0x48127ffe7fff8000", + "0x1104800180018000", + "0x2c5", + "0x20680017fff7ffe", + "0x32", + "0x20680017fff7fff", + "0x11", + "0x40780017fff7fff", + "0x1", + "0x480680017fff8000", + "0x50726f6f66206e6f742076616c69642e", + "0x400080007ffe7fff", + "0x48127fd67fff8000", + "0x48127fe07fff8000", + "0x480a80007fff8000", + "0x48127fdf7fff8000", + "0x480680017fff8000", + "0x1", + "0x48127ff97fff8000", + "0x482480017ff88000", + "0x1", + "0x208b7fff7fff7ffe", + "0x48127fd87fff8000", + "0x48127fe27fff8000", + "0x480a80007fff8000", + "0x48127fe17fff8000", + "0x480a7ff97fff8000", + "0x480680017fff8000", + "0x1", + "0x1104800180018000", + "0x2dc", + "0x20680017fff7ffd", + "0xd", + "0x48127ff97fff8000", + "0x48127ff97fff8000", + "0x48127ff97fff8000", + "0x48127ff97fff8000", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x208b7fff7fff7ffe", + "0x48127ff97fff8000", + "0x48127ff97fff8000", + "0x48127ff97fff8000", + "0x48127ff97fff8000", + "0x480680017fff8000", + "0x1", + "0x48127ff97fff8000", + "0x48127ff97fff8000", + "0x208b7fff7fff7ffe", + "0x40780017fff7fff", + "0x1", + "0x480680017fff8000", + "0x4f7074696f6e3a3a756e77726170206661696c65642e", + "0x400080007ffe7fff", + "0x48127fd67fff8000", + "0x48127fe07fff8000", + "0x480a80007fff8000", + "0x48127fdf7fff8000", + "0x480680017fff8000", + "0x1", + "0x48127ff97fff8000", + "0x482480017ff88000", + "0x1", + "0x208b7fff7fff7ffe", + "0x48127feb7fff8000", + "0x48127ff57fff8000", + "0x480a80007fff8000", + "0x48127ff47fff8000", + "0x480680017fff8000", + "0x1", + "0x48127ff97fff8000", + "0x48127ff97fff8000", + "0x208b7fff7fff7ffe", + "0x48127ffa7fff8000", + "0x48127ffa7fff8000", + "0x480a80007fff8000", + "0x48127ff97fff8000", + "0x480680017fff8000", + "0x1", + "0x48127ff97fff8000", + "0x48127ff97fff8000", + "0x208b7fff7fff7ffe", + "0x48127ffb7fff8000", + "0x48127ffb7fff8000", + "0x480a80007fff8000", + "0x480a80017fff8000", + "0x480680017fff8000", + "0x1", + "0x48127ff97fff8000", + "0x48127ff97fff8000", + "0x208b7fff7fff7ffe", + "0x40780017fff7fff", + "0x1", + "0x480680017fff8000", + "0x41697264726f7020686173206e6f742073746172746564207965742e", + "0x400080007ffe7fff", + "0x482480017ff58000", + "0x1", + "0x48127ff57fff8000", + "0x480a80007fff8000", + "0x480a80017fff8000", + "0x480680017fff8000", + "0x1", + "0x48127ff97fff8000", + "0x482480017ff88000", + "0x1", + "0x208b7fff7fff7ffe", + "0x48127ffa7fff8000", + "0x48127ffa7fff8000", + "0x480a80007fff8000", + "0x480a80017fff8000", + "0x480680017fff8000", + "0x1", + "0x48127ff97fff8000", + "0x48127ff97fff8000", + "0x208b7fff7fff7ffe", + "0x48127fd07fff8000", + "0x48127ffa7fff8000", + "0x480a80007fff8000", + "0x48127ff97fff8000", + "0x480680017fff8000", + "0x1", + "0x48127ff97fff8000", + "0x48127ff97fff8000", + "0x208b7fff7fff7ffe", + "0x48127ff97fff8000", + "0x48127ff97fff8000", + "0x480a80007fff8000", + "0x48127ff97fff8000", + "0x480680017fff8000", + "0x1", + "0x48127ff97fff8000", + "0x48127ff97fff8000", + "0x208b7fff7fff7ffe", + "0xa0680017fff8000", + "0x12", + "0x4825800180007ffd", + "0x10000000000000000", + "0x4844800180008002", + "0x8000000000000110000000000000000", + "0x4830800080017ffe", + "0x480280007ffc7fff", + "0x482480017ffe8000", + "0xefffffffffffffdeffffffffffffffff", + "0x480280017ffc7fff", + "0x400280027ffc7ffb", + "0x402480017fff7ffb", + "0xffffffffffffffffffffffffffffffff", + "0x20680017fff7fff", + "0x11", + "0x402780017fff7fff", + "0x1", + "0x400380007ffc7ffd", + "0x482680017ffd8000", + "0xffffffffffffffff0000000000000000", + "0x400280017ffc7fff", + "0x40780017fff7fff", + "0x5", + "0x482680017ffc8000", + "0x2", + "0x480680017fff8000", + "0x0", + "0x480a7ffd7fff8000", + "0x10780017fff7fff", + "0x8", + "0x482680017ffc8000", + "0x3", + "0x480680017fff8000", + "0x1", + "0x480680017fff8000", + "0x0", + "0x208b7fff7fff7ffe", + "0x480a7ff97fff8000", + "0x480a7ffa7fff8000", + "0x480a7ffb7fff8000", + "0x1104800180018000", + "0x281", + "0x20680017fff7ffd", + "0x29", + "0x48127ffb7fff8000", + "0x48127ffb7fff8000", + "0x480a7ffc7fff8000", + "0x1104800180018000", + "0x2ae", + "0x20680017fff7ffd", + "0x19", + "0x48127ffb7fff8000", + "0x48127ffb7fff8000", + "0x480a7ffd7fff8000", + "0x1104800180018000", + "0x2db", + "0x20680017fff7ffd", + "0xb", + "0x48127ffb7fff8000", + "0x48127ffb7fff8000", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x208b7fff7fff7ffe", + "0x48127ffb7fff8000", + "0x48127ffb7fff8000", + "0x480680017fff8000", + "0x1", + "0x48127ffb7fff8000", + "0x48127ffb7fff8000", + "0x208b7fff7fff7ffe", + "0x40780017fff7fff", + "0x18", + "0x48127fe37fff8000", + "0x48127fe37fff8000", + "0x480680017fff8000", + "0x1", + "0x48127fe37fff8000", + "0x48127fe37fff8000", + "0x208b7fff7fff7ffe", + "0x40780017fff7fff", + "0x30", + "0x48127fcb7fff8000", + "0x48127fcb7fff8000", + "0x480680017fff8000", + "0x1", + "0x48127fcb7fff8000", + "0x48127fcb7fff8000", + "0x208b7fff7fff7ffe", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x165dafc16f74eea9fc30525b0eaa11843ddcf48d38c73a5e474619514690164", + "0x480680017fff8000", + "0x53746f7261676552656164", + "0x400280007ffd7fff", + "0x400380017ffd7ffc", + "0x400280027ffd7ffd", + "0x400280037ffd7ffe", + "0x480280057ffd8000", + "0x20680017fff7fff", + "0x25", + "0x480a7ffb7fff8000", + "0x480280067ffd8000", + "0x1104800180018000", + "0x2da", + "0x480280047ffd8000", + "0x482680017ffd8000", + "0x7", + "0x20680017fff7ffc", + "0xc", + "0x48127ffb7fff8000", + "0x48127ffd7fff8000", + "0x48127ffd7fff8000", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x48127ff87fff8000", + "0x10780017fff7fff", + "0x1c", + "0x40780017fff7fff", + "0x9", + "0x40780017fff7fff", + "0x1", + "0x480680017fff8000", + "0x4e6f6e20436f6e747261637441646472657373", + "0x400080007ffe7fff", + "0x48127ff07fff8000", + "0x48127ff27fff8000", + "0x48127ff27fff8000", + "0x480680017fff8000", + "0x1", + "0x48127ffa7fff8000", + "0x482480017ff98000", + "0x1", + "0x208b7fff7fff7ffe", + "0x40780017fff7fff", + "0xf", + "0x480a7ffb7fff8000", + "0x480280047ffd8000", + "0x482680017ffd8000", + "0x8", + "0x480680017fff8000", + "0x1", + "0x480280067ffd8000", + "0x480280077ffd8000", + "0x1104800180018000", + "0x2d5", + "0x20680017fff7ffd", + "0xb", + "0x48127ff57fff8000", + "0x48127ff57fff8000", + "0x48127ff57fff8000", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x48127ffa7fff8000", + "0x208b7fff7fff7ffe", + "0x48127ff57fff8000", + "0x48127ff57fff8000", + "0x48127ff57fff8000", + "0x480680017fff8000", + "0x1", + "0x48127ffa7fff8000", + "0x48127ffa7fff8000", + "0x208b7fff7fff7ffe", + "0x400380007ffd7ffb", + "0x480a7ffc7fff8000", + "0x482680017ffd8000", + "0x1", + "0x208b7fff7fff7ffe", + "0x480a7ffc7fff8000", + "0x480a7ffd7fff8000", + "0x1104800180018000", + "0x2c6", + "0x20680017fff7ffd", + "0xa", + "0x48127ffb7fff8000", + "0x48127ffb7fff8000", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x480080007ffb8000", + "0x208b7fff7fff7ffe", + "0x48127ffb7fff8000", + "0x48127ffb7fff8000", + "0x480680017fff8000", + "0x1", + "0x48127ffb7fff8000", + "0x48127ffb7fff8000", + "0x208b7fff7fff7ffe", + "0x48297ffc80007ffd", + "0x20680017fff7fff", + "0x4", + "0x10780017fff7fff", + "0xa", + "0x482680017ffc8000", + "0x1", + "0x480a7ffd7fff8000", + "0x480680017fff8000", + "0x0", + "0x480a7ffc7fff8000", + "0x10780017fff7fff", + "0x8", + "0x480a7ffc7fff8000", + "0x480a7ffd7fff8000", + "0x480680017fff8000", + "0x1", + "0x480680017fff8000", + "0x0", + "0x48127ffc7fff8000", + "0x48127ffc7fff8000", + "0x20680017fff7ffc", + "0x8", + "0x48127ffe7fff8000", + "0x48127ffe7fff8000", + "0x480680017fff8000", + "0x0", + "0x480080007ffa8000", + "0x208b7fff7fff7ffe", + "0x48127ffe7fff8000", + "0x48127ffe7fff8000", + "0x480680017fff8000", + "0x1", + "0x480680017fff8000", + "0x0", + "0x208b7fff7fff7ffe", + "0x480a7ff97fff8000", + "0x480a7ffb7fff8000", + "0x480a7ffd7fff8000", + "0x1104800180018000", + "0x2b7", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x53746f7261676552656164", + "0x400280007ffc7fff", + "0x400380017ffc7ffa", + "0x400280027ffc7ffe", + "0x400280037ffc7ffd", + "0x480280057ffc8000", + "0x20680017fff7fff", + "0x1b", + "0x480280067ffc8000", + "0x4824800180007fff", + "0x0", + "0x480280047ffc8000", + "0x482680017ffc8000", + "0x7", + "0x20680017fff7ffd", + "0x6", + "0x480680017fff8000", + "0x1", + "0x10780017fff7fff", + "0x4", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x1", + "0x48127ffc7fff8000", + "0x48127ffc7fff8000", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x48307ffa80007ffb", + "0x10780017fff7fff", + "0xb", + "0x40780017fff7fff", + "0x6", + "0x480280047ffc8000", + "0x482680017ffc8000", + "0x8", + "0x480680017fff8000", + "0x1", + "0x480280067ffc8000", + "0x480280077ffc8000", + "0x1104800180018000", + "0x2b0", + "0x20680017fff7ffd", + "0xc", + "0x48127fea7fff8000", + "0x48127ff57fff8000", + "0x48127fe97fff8000", + "0x48127ff47fff8000", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x48127ff97fff8000", + "0x208b7fff7fff7ffe", + "0x48127fea7fff8000", + "0x48127ff57fff8000", + "0x48127fe97fff8000", + "0x48127ff47fff8000", + "0x480680017fff8000", + "0x1", + "0x48127ff97fff8000", + "0x48127ff97fff8000", + "0x208b7fff7fff7ffe", + "0xa0680017fff8000", + "0x16", + "0x480280007ffc8003", + "0x480280017ffc8003", + "0x4844800180017ffe", + "0x100000000000000000000000000000000", + "0x483180017ffd7ffd", + "0x482480017fff7ffd", + "0x800000000000010fffffffffffffffff7ffffffffffffef0000000000000001", + "0x20680017fff7ffc", + "0x6", + "0x402480017fff7ffd", + "0xffffffffffffffffffffffffffffffff", + "0x10780017fff7fff", + "0x4", + "0x402480017ffe7ffd", + "0xf7ffffffffffffef0000000000000000", + "0x400280027ffc7ffd", + "0x20680017fff7ffe", + "0xe", + "0x402780017fff7fff", + "0x1", + "0x400380007ffc7ffd", + "0x40780017fff7fff", + "0x5", + "0x482680017ffc8000", + "0x1", + "0x480680017fff8000", + "0x0", + "0x480a7ffd7fff8000", + "0x10780017fff7fff", + "0x8", + "0x482680017ffc8000", + "0x3", + "0x480680017fff8000", + "0x1", + "0x480680017fff8000", + "0x0", + "0x208b7fff7fff7ffe", + "0x1104800180018000", + "0x304", + "0x482480017fff8000", + "0x303", + "0x480080007fff8000", + "0xa0680017fff8000", + "0x9", + "0x4825800180007ff8", + "0x12a2", + "0x482480017fff8000", + "0x100000000000000000000000000000000", + "0x400280007ff77fff", + "0x10780017fff7fff", + "0x4c", + "0x4825800180007ff8", + "0x12a2", + "0x400280007ff77fff", + "0x482680017ff78000", + "0x1", + "0x20780017fff7ffd", + "0xd", + "0x48127fff7fff8000", + "0x48127ffd7fff8000", + "0x480680017fff8000", + "0x0", + "0x480a7ff97fff8000", + "0x480a7ffa7fff8000", + "0x480680017fff8000", + "0x0", + "0x480a7ffb7fff8000", + "0x480a7ffc7fff8000", + "0x208b7fff7fff7ffe", + "0x480a7ff97fff8000", + "0x480a7ffa7fff8000", + "0x1104800180018000", + "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffff4b", + "0x20680017fff7ffe", + "0x27", + "0x400280007ffc7fff", + "0x48127ff07fff8000", + "0x48127fee7fff8000", + "0x48127ffa7fff8000", + "0x48127ffa7fff8000", + "0x480a7ffb7fff8000", + "0x482680017ffc8000", + "0x1", + "0x4825800180007ffd", + "0x1", + "0x1104800180018000", + "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffd1", + "0x20680017fff7ffa", + "0xc", + "0x48127ff87fff8000", + "0x48127ff87fff8000", + "0x480680017fff8000", + "0x0", + "0x48127ff87fff8000", + "0x48127ff87fff8000", + "0x48127ff87fff8000", + "0x48127ff87fff8000", + "0x48127ff87fff8000", + "0x208b7fff7fff7ffe", + "0x48127ff87fff8000", + "0x48127ff87fff8000", + "0x480680017fff8000", + "0x1", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x48127ff87fff8000", + "0x48127ff87fff8000", + "0x208b7fff7fff7ffe", + "0x48127ff07fff8000", + "0x48127fee7fff8000", + "0x480680017fff8000", + "0x0", + "0x48127ff97fff8000", + "0x48127ff97fff8000", + "0x480680017fff8000", + "0x1", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x208b7fff7fff7ffe", + "0x40780017fff7fff", + "0x1", + "0x480680017fff8000", + "0x4f7574206f6620676173", + "0x400080007ffe7fff", + "0x482680017ff78000", + "0x1", + "0x480a7ff87fff8000", + "0x480680017fff8000", + "0x1", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x48127ff87fff8000", + "0x482480017ff78000", + "0x1", + "0x208b7fff7fff7ffe", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x1bcbbea36956a18f1c3523d4aa8c6f988ce1f864404a8f2506a925348f672c6", + "0x480680017fff8000", + "0x53746f7261676552656164", + "0x400280007ffd7fff", + "0x400380017ffd7ffc", + "0x400280027ffd7ffd", + "0x400280037ffd7ffe", + "0x480280057ffd8000", + "0x20680017fff7fff", + "0x25", + "0x480a7ffb7fff8000", + "0x480280067ffd8000", + "0x1104800180018000", + "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffe2c", + "0x480280047ffd8000", + "0x482680017ffd8000", + "0x7", + "0x20680017fff7ffc", + "0xc", + "0x48127ffb7fff8000", + "0x48127ffd7fff8000", + "0x48127ffd7fff8000", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x48127ff87fff8000", + "0x10780017fff7fff", + "0x1c", + "0x40780017fff7fff", + "0x9", + "0x40780017fff7fff", + "0x1", + "0x480680017fff8000", + "0x53746f7265553634202d206e6f6e20753634", + "0x400080007ffe7fff", + "0x48127ff07fff8000", + "0x48127ff27fff8000", + "0x48127ff27fff8000", + "0x480680017fff8000", + "0x1", + "0x48127ffa7fff8000", + "0x482480017ff98000", + "0x1", + "0x208b7fff7fff7ffe", + "0x40780017fff7fff", + "0x10", + "0x480a7ffb7fff8000", + "0x480280047ffd8000", + "0x482680017ffd8000", + "0x8", + "0x480680017fff8000", + "0x1", + "0x480280067ffd8000", + "0x480280077ffd8000", + "0x1104800180018000", + "0x1d9", + "0x20680017fff7ffd", + "0xb", + "0x48127ff57fff8000", + "0x48127ff57fff8000", + "0x48127ff57fff8000", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x48127ffa7fff8000", + "0x208b7fff7fff7ffe", + "0x48127ff57fff8000", + "0x48127ff57fff8000", + "0x48127ff57fff8000", + "0x480680017fff8000", + "0x1", + "0x48127ffa7fff8000", + "0x48127ffa7fff8000", + "0x208b7fff7fff7ffe", + "0x48297ffa80007ffb", + "0x400280007ffd7fff", + "0x480a7ff87fff8000", + "0x480a7ff97fff8000", + "0x480a7ffa7fff8000", + "0x480a7ffb7fff8000", + "0x480a7ffc7fff8000", + "0x482680017ffd8000", + "0x1", + "0x1104800180018000", + "0x1c8", + "0x20680017fff7ffd", + "0x9", + "0x48127ffb7fff8000", + "0x48127ffb7fff8000", + "0x480680017fff8000", + "0x0", + "0x48127ffb7fff8000", + "0x48127ffb7fff8000", + "0x208b7fff7fff7ffe", + "0x48127ffb7fff8000", + "0x48127ffb7fff8000", + "0x480680017fff8000", + "0x1", + "0x48127ffb7fff8000", + "0x48127ffb7fff8000", + "0x208b7fff7fff7ffe", + "0x20780017fff7ffb", + "0x7", + "0x480680017fff8000", + "0x0", + "0x480a7ffc7fff8000", + "0x480a7ffd7fff8000", + "0x208b7fff7fff7ffe", + "0x480680017fff8000", + "0x1", + "0x480a7ffc7fff8000", + "0x480a7ffd7fff8000", + "0x208b7fff7fff7ffe", + "0x48297ffc80007ffd", + "0x20680017fff7fff", + "0x4", + "0x10780017fff7fff", + "0xa", + "0x482680017ffc8000", + "0x1", + "0x480a7ffd7fff8000", + "0x480680017fff8000", + "0x0", + "0x480a7ffc7fff8000", + "0x10780017fff7fff", + "0x8", + "0x480a7ffc7fff8000", + "0x480a7ffd7fff8000", + "0x480680017fff8000", + "0x1", + "0x480680017fff8000", + "0x0", + "0x48127ffc7fff8000", + "0x48127ffc7fff8000", + "0x20680017fff7ffc", + "0x15", + "0x480080007ffd8000", + "0x4824800180007fff", + "0x0", + "0x20680017fff7fff", + "0x6", + "0x480680017fff8000", + "0x1", + "0x10780017fff7fff", + "0x4", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x1", + "0x48127ffa7fff8000", + "0x48127ffa7fff8000", + "0x480680017fff8000", + "0x0", + "0x48307ffb80007ffc", + "0x208b7fff7fff7ffe", + "0x40780017fff7fff", + "0x4", + "0x48127ffa7fff8000", + "0x48127ffa7fff8000", + "0x480680017fff8000", + "0x1", + "0x480680017fff8000", + "0x0", + "0x208b7fff7fff7ffe", + "0x480a7ff87fff8000", + "0x480a7ffa7fff8000", + "0x480a7ffc7fff8000", + "0x1104800180018000", + "0x132", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x53746f726167655772697465", + "0x400280007ffb7fff", + "0x400380017ffb7ff9", + "0x400280027ffb7ffe", + "0x400280037ffb7ffd", + "0x400380047ffb7ffd", + "0x480280067ffb8000", + "0x20680017fff7fff", + "0xd", + "0x480280057ffb8000", + "0x482680017ffb8000", + "0x7", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x10780017fff7fff", + "0x9", + "0x480280057ffb8000", + "0x482680017ffb8000", + "0x9", + "0x480680017fff8000", + "0x1", + "0x480280077ffb8000", + "0x480280087ffb8000", + "0x1104800180018000", + "0x1b1", + "0x20680017fff7ffd", + "0xd", + "0x48127ff07fff8000", + "0x48127ff57fff8000", + "0x48127fef7fff8000", + "0x48127ff47fff8000", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x208b7fff7fff7ffe", + "0x48127ff07fff8000", + "0x48127ff57fff8000", + "0x48127fef7fff8000", + "0x48127ff47fff8000", + "0x480680017fff8000", + "0x1", + "0x48127ff97fff8000", + "0x48127ff97fff8000", + "0x208b7fff7fff7ffe", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x5557131bdd4d763644fea797874ddeab7cc5b8b0c01b4dc64002cbbd1758a3", + "0x480680017fff8000", + "0x53746f726167655772697465", + "0x400280007ffc7fff", + "0x400380017ffc7ffb", + "0x400280027ffc7ffd", + "0x400280037ffc7ffe", + "0x400380047ffc7ffd", + "0x480280067ffc8000", + "0x20680017fff7fff", + "0xd", + "0x480280057ffc8000", + "0x482680017ffc8000", + "0x7", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x10780017fff7fff", + "0x9", + "0x480280057ffc8000", + "0x482680017ffc8000", + "0x9", + "0x480680017fff8000", + "0x1", + "0x480280077ffc8000", + "0x480280087ffc8000", + "0x1104800180018000", + "0x179", + "0x20680017fff7ffd", + "0xb", + "0x48127ff67fff8000", + "0x48127ff67fff8000", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x208b7fff7fff7ffe", + "0x48127ff67fff8000", + "0x48127ff67fff8000", + "0x480680017fff8000", + "0x1", + "0x48127ffb7fff8000", + "0x48127ffb7fff8000", + "0x208b7fff7fff7ffe", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x165dafc16f74eea9fc30525b0eaa11843ddcf48d38c73a5e474619514690164", + "0x480680017fff8000", + "0x53746f726167655772697465", + "0x400280007ffc7fff", + "0x400380017ffc7ffb", + "0x400280027ffc7ffd", + "0x400280037ffc7ffe", + "0x400380047ffc7ffd", + "0x480280067ffc8000", + "0x20680017fff7fff", + "0xd", + "0x480280057ffc8000", + "0x482680017ffc8000", + "0x7", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x10780017fff7fff", + "0x9", + "0x480280057ffc8000", + "0x482680017ffc8000", + "0x9", + "0x480680017fff8000", + "0x1", + "0x480280077ffc8000", + "0x480280087ffc8000", + "0x1104800180018000", + "0x145", + "0x20680017fff7ffd", + "0xb", + "0x48127ff67fff8000", + "0x48127ff67fff8000", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x208b7fff7fff7ffe", + "0x48127ff67fff8000", + "0x48127ff67fff8000", + "0x480680017fff8000", + "0x1", + "0x48127ffb7fff8000", + "0x48127ffb7fff8000", + "0x208b7fff7fff7ffe", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x1bcbbea36956a18f1c3523d4aa8c6f988ce1f864404a8f2506a925348f672c6", + "0x480680017fff8000", + "0x53746f726167655772697465", + "0x400280007ffc7fff", + "0x400380017ffc7ffb", + "0x400280027ffc7ffd", + "0x400280037ffc7ffe", + "0x400380047ffc7ffd", + "0x480280067ffc8000", + "0x20680017fff7fff", + "0xd", + "0x480280057ffc8000", + "0x482680017ffc8000", + "0x7", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x10780017fff7fff", + "0x9", + "0x480280057ffc8000", + "0x482680017ffc8000", + "0x9", + "0x480680017fff8000", + "0x1", + "0x480280077ffc8000", + "0x480280087ffc8000", + "0x1104800180018000", + "0x111", + "0x20680017fff7ffd", + "0xb", + "0x48127ff67fff8000", + "0x48127ff67fff8000", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x208b7fff7fff7ffe", + "0x48127ff67fff8000", + "0x48127ff67fff8000", + "0x480680017fff8000", + "0x1", + "0x48127ffb7fff8000", + "0x48127ffb7fff8000", + "0x208b7fff7fff7ffe", + "0xa0680017fff8004", + "0xe", + "0x4825800180047ffd", + "0x800000000000000000000000000000000000000000000000000000000000000", + "0x484480017ffe8000", + "0x110000000000000000", + "0x48307ffe7fff8002", + "0x480280007ffc7ffc", + "0x480280017ffc7ffc", + "0x402480017ffb7ffd", + "0xffffffffffffffeeffffffffffffffff", + "0x400280027ffc7ffd", + "0x10780017fff7fff", + "0x13", + "0x484480017fff8001", + "0x8000000000000000000000000000000", + "0x48317fff80007ffd", + "0x480280007ffc7ffd", + "0x480280017ffc7ffd", + "0x402480017ffc7ffe", + "0xf8000000000000000000000000000000", + "0x400280027ffc7ffe", + "0x40780017fff7fff", + "0x1", + "0x482680017ffc8000", + "0x3", + "0x480680017fff8000", + "0x0", + "0x480a7ffd7fff8000", + "0x10780017fff7fff", + "0x8", + "0x482680017ffc8000", + "0x3", + "0x480680017fff8000", + "0x1", + "0x480680017fff8000", + "0x0", + "0x208b7fff7fff7ffe", + "0x20780017fff7ffb", + "0x8", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x480a7ffd7fff8000", + "0x208b7fff7fff7ffe", + "0x480680017fff8000", + "0x1", + "0x480a7ffc7fff8000", + "0x480a7ffd7fff8000", + "0x208b7fff7fff7ffe", + "0x480680017fff8000", + "0x476574457865637574696f6e496e666f", + "0x400280007ffd7fff", + "0x400380017ffd7ffc", + "0x480280037ffd8000", + "0x20680017fff7fff", + "0xc", + "0x480280027ffd8000", + "0x482680017ffd8000", + "0x5", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x480280047ffd8000", + "0x10780017fff7fff", + "0x9", + "0x480280027ffd8000", + "0x482680017ffd8000", + "0x6", + "0x480680017fff8000", + "0x1", + "0x480280047ffd8000", + "0x480280057ffd8000", + "0x1104800180018000", + "0xc0", + "0x20680017fff7ffd", + "0xa", + "0x48127ff67fff8000", + "0x48127ff67fff8000", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x48127ffb7fff8000", + "0x208b7fff7fff7ffe", + "0x48127ff67fff8000", + "0x48127ff67fff8000", + "0x480680017fff8000", + "0x1", + "0x48127ffb7fff8000", + "0x48127ffb7fff8000", + "0x208b7fff7fff7ffe", + "0x480680017fff8000", + "0x354737ee9f2a370d7777df0105f1778255685dd25f5f46af6d87979e24f033f", + "0x400280007ffc7fff", + "0x400380017ffc7ffd", + "0x480280027ffc8000", + "0xa0680017fff8005", + "0xe", + "0x4824800180057ffe", + "0x7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00", + "0x484480017ffe8000", + "0x110000000000000000", + "0x48307ffe7fff8003", + "0x480280007ffb7ffc", + "0x480280017ffb7ffc", + "0x482480017ffb7ffd", + "0xffffffffffffffeefffffffffffffeff", + "0x400280027ffb7ffc", + "0x10780017fff7fff", + "0x11", + "0x48127ffe7fff8005", + "0x484480017ffe8000", + "0x8000000000000000000000000000000", + "0x48307ffe7fff8003", + "0x480280007ffb7ffd", + "0x482480017ffc7ffe", + "0xf0000000000000000000000000000100", + "0x480280017ffb7ffd", + "0x400280027ffb7ff9", + "0x402480017ffd7ff9", + "0xffffffffffffffffffffffffffffffff", + "0x20680017fff7ffd", + "0x4", + "0x402780017fff7fff", + "0x1", + "0x482680017ffb8000", + "0x3", + "0x482680017ffc8000", + "0x3", + "0x48127ffd7fff8000", + "0x208b7fff7fff7ffe", + "0x20780017fff7ffb", + "0x8", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x480a7ffd7fff8000", + "0x208b7fff7fff7ffe", + "0x480680017fff8000", + "0x1", + "0x480a7ffc7fff8000", + "0x480a7ffd7fff8000", + "0x208b7fff7fff7ffe", + "0x20780017fff7ffb", + "0x8", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x480a7ffd7fff8000", + "0x208b7fff7fff7ffe", + "0x480680017fff8000", + "0x1", + "0x480a7ffc7fff8000", + "0x480a7ffd7fff8000", + "0x208b7fff7fff7ffe", + "0x1104800180018000", + "0x78", + "0x482480017fff8000", + "0x77", + "0x480080007fff8000", + "0xa0680017fff8000", + "0x9", + "0x4825800180007ff9", + "0x1112", + "0x482480017fff8000", + "0x100000000000000000000000000000000", + "0x400280007ff87fff", + "0x10780017fff7fff", + "0x43", + "0x4825800180007ff9", + "0x1112", + "0x400280007ff87fff", + "0x482680017ff88000", + "0x1", + "0x48297ffa80007ffb", + "0x20680017fff7fff", + "0x4", + "0x10780017fff7fff", + "0xa", + "0x482680017ffa8000", + "0x1", + "0x480a7ffb7fff8000", + "0x480680017fff8000", + "0x0", + "0x480a7ffa7fff8000", + "0x10780017fff7fff", + "0x8", + "0x480a7ffa7fff8000", + "0x480a7ffb7fff8000", + "0x480680017fff8000", + "0x1", + "0x480680017fff8000", + "0x0", + "0x20680017fff7ffe", + "0x1e", + "0x480080007fff8000", + "0x480a7ffc7fff8000", + "0x480a7ffd7fff8000", + "0x1104800180018000", + "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffc9c", + "0x48127ff37fff8000", + "0x48127ff17fff8000", + "0x48127ff37fff8000", + "0x48127ff37fff8000", + "0x48127ffa7fff8000", + "0x48127ffa7fff8000", + "0x1104800180018000", + "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffce", + "0x20680017fff7ffd", + "0x8", + "0x48127ffb7fff8000", + "0x48127ffb7fff8000", + "0x48127ffc7fff8000", + "0x48127ffc7fff8000", + "0x10780017fff7fff", + "0xd", + "0x48127ffb7fff8000", + "0x48127ffb7fff8000", + "0x480680017fff8000", + "0x1", + "0x48127ffb7fff8000", + "0x48127ffb7fff8000", + "0x208b7fff7fff7ffe", + "0x48127ffa7fff8000", + "0x48127ff87fff8000", + "0x480a7ffc7fff8000", + "0x480a7ffd7fff8000", + "0x48127ffc7fff8000", + "0x48127ffc7fff8000", + "0x480680017fff8000", + "0x0", + "0x48127ffb7fff8000", + "0x48127ffb7fff8000", + "0x208b7fff7fff7ffe", + "0x40780017fff7fff", + "0x1", + "0x480680017fff8000", + "0x4f7574206f6620676173", + "0x400080007ffe7fff", + "0x482680017ff88000", + "0x1", + "0x480a7ff97fff8000", + "0x480680017fff8000", + "0x1", + "0x48127ffb7fff8000", + "0x482480017ffa8000", + "0x1", + "0x208b7fff7fff7ffe", + "0x20780017fff7ffb", + "0x9", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x208b7fff7fff7ffe", + "0x480680017fff8000", + "0x1", + "0x480a7ffc7fff8000", + "0x480a7ffd7fff8000", + "0x208b7fff7fff7ffe", + "0x20780017fff7ffb", + "0x8", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x480a7ffd7fff8000", + "0x208b7fff7fff7ffe", + "0x480680017fff8000", + "0x1", + "0x480a7ffc7fff8000", + "0x480a7ffd7fff8000", + "0x208b7fff7fff7ffe" + ], + "hints": [ + [ + 0, + [ + { + "TestLessThanOrEqual": { + "lhs": { + "Immediate": "0x0" + }, + "rhs": { + "Deref": { + "register": "FP", + "offset": -6 + } + }, + "dst": { + "register": "AP", + "offset": 0 + } + } + } + ] + ], + [ + 19, + [ + { + "AllocSegment": { + "dst": { + "register": "AP", + "offset": 0 + } + } + } + ] + ], + [ + 38, + [ + { + "TestLessThanOrEqual": { + "lhs": { + "Immediate": "0x28dc" + }, + "rhs": { + "Deref": { + "register": "AP", + "offset": -8 + } + }, + "dst": { + "register": "AP", + "offset": 0 + } + } + } + ] + ], + [ + 58, + [ + { + "AllocSegment": { + "dst": { + "register": "AP", + "offset": 0 + } + } + } + ] + ], + [ + 81, + [ + { + "AllocSegment": { + "dst": { + "register": "AP", + "offset": 0 + } + } + } + ] + ], + [ + 96, + [ + { + "AllocSegment": { + "dst": { + "register": "AP", + "offset": 0 + } + } + } + ] + ], + [ + 111, + [ + { + "TestLessThanOrEqual": { + "lhs": { + "Immediate": "0x0" + }, + "rhs": { + "Deref": { + "register": "FP", + "offset": -6 + } + }, + "dst": { + "register": "AP", + "offset": 0 + } + } + } + ] + ], + [ + 130, + [ + { + "AllocSegment": { + "dst": { + "register": "AP", + "offset": 0 + } + } + } + ] + ], + [ + 149, + [ + { + "TestLessThanOrEqual": { + "lhs": { + "Immediate": "0x1cac" + }, + "rhs": { + "Deref": { + "register": "AP", + "offset": -8 + } + }, + "dst": { + "register": "AP", + "offset": 0 + } + } + } + ] + ], + [ + 169, + [ + { + "AllocSegment": { + "dst": { + "register": "AP", + "offset": 0 + } + } + } + ] + ], + [ + 189, + [ + { + "AllocSegment": { + "dst": { + "register": "AP", + "offset": 0 + } + } + } + ] + ], + [ + 204, + [ + { + "AllocSegment": { + "dst": { + "register": "AP", + "offset": 0 + } + } + } + ] + ], + [ + 219, + [ + { + "TestLessThanOrEqual": { + "lhs": { + "Immediate": "0x0" + }, + "rhs": { + "Deref": { + "register": "FP", + "offset": -6 + } + }, + "dst": { + "register": "AP", + "offset": 0 + } + } + } + ] + ], + [ + 244, + [ + { + "AllocSegment": { + "dst": { + "register": "AP", + "offset": 0 + } + } + } + ] + ], + [ + 267, + [ + { + "TestLessThanOrEqual": { + "lhs": { + "Deref": { + "register": "AP", + "offset": -1 + } + }, + "rhs": { + "Deref": { + "register": "AP", + "offset": -40 + } + }, + "dst": { + "register": "AP", + "offset": 0 + } + } + } + ] + ], + [ + 287, + [ + { + "AllocSegment": { + "dst": { + "register": "AP", + "offset": 0 + } + } + } + ] + ], + [ + 312, + [ + { + "AllocSegment": { + "dst": { + "register": "AP", + "offset": 0 + } + } + } + ] + ], + [ + 328, + [ + { + "AllocSegment": { + "dst": { + "register": "AP", + "offset": 0 + } + } + } + ] + ], + [ + 343, + [ + { + "AllocSegment": { + "dst": { + "register": "AP", + "offset": 0 + } + } + } + ] + ], + [ + 361, + [ + { + "TestLessThanOrEqual": { + "lhs": { + "Immediate": "0x2a58" + }, + "rhs": { + "Deref": { + "register": "FP", + "offset": -6 + } + }, + "dst": { + "register": "AP", + "offset": 0 + } + } + } + ] + ], + [ + 406, + [ + { + "AllocSegment": { + "dst": { + "register": "AP", + "offset": 0 + } + } + } + ] + ], + [ + 431, + [ + { + "TestLessThanOrEqual": { + "lhs": { + "Deref": { + "register": "AP", + "offset": -1 + } + }, + "rhs": { + "Deref": { + "register": "AP", + "offset": -16 + } + }, + "dst": { + "register": "AP", + "offset": 0 + } + } + } + ] + ], + [ + 455, + [ + { + "AllocSegment": { + "dst": { + "register": "AP", + "offset": 0 + } + } + } + ] + ], + [ + 475, + [ + { + "AllocSegment": { + "dst": { + "register": "AP", + "offset": 0 + } + } + } + ] + ], + [ + 491, + [ + { + "AllocSegment": { + "dst": { + "register": "AP", + "offset": 0 + } + } + } + ] + ], + [ + 515, + [ + { + "AllocSegment": { + "dst": { + "register": "AP", + "offset": 0 + } + } + } + ] + ], + [ + 530, + [ + { + "AllocSegment": { + "dst": { + "register": "AP", + "offset": 0 + } + } + } + ] + ], + [ + 545, + [ + { + "AllocSegment": { + "dst": { + "register": "AP", + "offset": 0 + } + } + } + ] + ], + [ + 561, + [ + { + "TestLessThanOrEqual": { + "lhs": { + "Immediate": "0xf1e" + }, + "rhs": { + "Deref": { + "register": "FP", + "offset": -6 + } + }, + "dst": { + "register": "AP", + "offset": 0 + } + } + } + ] + ], + [ + 622, + [ + { + "AllocSegment": { + "dst": { + "register": "AP", + "offset": 0 + } + } + } + ] + ], + [ + 641, + [ + { + "TestLessThanOrEqual": { + "lhs": { + "Immediate": "0xa0f0" + }, + "rhs": { + "Deref": { + "register": "AP", + "offset": -90 + } + }, + "dst": { + "register": "AP", + "offset": 0 + } + } + } + ] + ], + [ + 664, + [ + { + "AllocSegment": { + "dst": { + "register": "AP", + "offset": 0 + } + } + } + ] + ], + [ + 682, + [ + { + "AllocSegment": { + "dst": { + "register": "AP", + "offset": 0 + } + } + } + ] + ], + [ + 703, + [ + { + "AllocSegment": { + "dst": { + "register": "AP", + "offset": 0 + } + } + } + ] + ], + [ + 717, + [ + { + "AllocSegment": { + "dst": { + "register": "AP", + "offset": 0 + } + } + } + ] + ], + [ + 731, + [ + { + "AllocSegment": { + "dst": { + "register": "AP", + "offset": 0 + } + } + } + ] + ], + [ + 745, + [ + { + "AllocSegment": { + "dst": { + "register": "AP", + "offset": 0 + } + } + } + ] + ], + [ + 817, + [ + { + "TestLessThan": { + "lhs": { + "Deref": { + "register": "AP", + "offset": -1 + } + }, + "rhs": { + "Immediate": "0x800000000000000000000000000000000000000000000000000000000000000" + }, + "dst": { + "register": "AP", + "offset": 4 + } + } + } + ] + ], + [ + 821, + [ + { + "LinearSplit": { + "value": { + "Deref": { + "register": "AP", + "offset": 3 + } + }, + "scalar": { + "Immediate": "0x110000000000000000" + }, + "max_x": { + "Immediate": "0xffffffffffffffffffffffffffffffff" + }, + "x": { + "register": "AP", + "offset": -2 + }, + "y": { + "register": "AP", + "offset": -1 + } + } + } + ] + ], + [ + 831, + [ + { + "LinearSplit": { + "value": { + "Deref": { + "register": "AP", + "offset": -2 + } + }, + "scalar": { + "Immediate": "0x8000000000000000000000000000000" + }, + "max_x": { + "Immediate": "0xffffffffffffffffffffffffffffffff" + }, + "x": { + "register": "AP", + "offset": -1 + }, + "y": { + "register": "AP", + "offset": 0 + } + } + } + ] + ], + [ + 1030, + [ + { + "AllocSegment": { + "dst": { + "register": "AP", + "offset": 0 + } + } + } + ] + ], + [ + 1096, + [ + { + "AllocSegment": { + "dst": { + "register": "AP", + "offset": 0 + } + } + } + ] + ], + [ + 1126, + [ + { + "TestLessThan": { + "lhs": { + "Deref": { + "register": "AP", + "offset": 0 + } + }, + "rhs": { + "Immediate": "0x10000000000000000" + }, + "dst": { + "register": "AP", + "offset": -1 + } + } + } + ] + ], + [ + 1134, + [ + { + "AllocSegment": { + "dst": { + "register": "AP", + "offset": 0 + } + } + } + ] + ], + [ + 1170, + [ + { + "SystemCall": { + "system": { + "Deref": { + "register": "AP", + "offset": -8 + } + } + } + } + ] + ], + [ + 1201, + [ + { + "AllocSegment": { + "dst": { + "register": "AP", + "offset": 0 + } + } + } + ] + ], + [ + 1247, + [ + { + "AllocSegment": { + "dst": { + "register": "AP", + "offset": 0 + } + } + } + ] + ], + [ + 1289, + [ + { + "AllocSegment": { + "dst": { + "register": "AP", + "offset": 0 + } + } + } + ] + ], + [ + 1332, + [ + { + "TestLessThan": { + "lhs": { + "Deref": { + "register": "FP", + "offset": -3 + } + }, + "rhs": { + "Immediate": "0x10000000000000000" + }, + "dst": { + "register": "AP", + "offset": 0 + } + } + } + ] + ], + [ + 1336, + [ + { + "LinearSplit": { + "value": { + "Deref": { + "register": "AP", + "offset": -1 + } + }, + "scalar": { + "Immediate": "0x8000000000000110000000000000000" + }, + "max_x": { + "Immediate": "0xfffffffffffffffffffffffffffffffe" + }, + "x": { + "register": "AP", + "offset": 0 + }, + "y": { + "register": "AP", + "offset": 1 + } + } + } + ] + ], + [ + 1435, + [ + { + "SystemCall": { + "system": { + "Deref": { + "register": "FP", + "offset": -3 + } + } + } + } + ] + ], + [ + 1459, + [ + { + "AllocSegment": { + "dst": { + "register": "AP", + "offset": 0 + } + } + } + ] + ], + [ + 1579, + [ + { + "SystemCall": { + "system": { + "Deref": { + "register": "FP", + "offset": -4 + } + } + } + } + ] + ], + [ + 1639, + [ + { + "TestLessThan": { + "lhs": { + "Deref": { + "register": "FP", + "offset": -3 + } + }, + "rhs": { + "Immediate": "0x100000000000000000000000000000000" + }, + "dst": { + "register": "AP", + "offset": 0 + } + } + } + ] + ], + [ + 1641, + [ + { + "DivMod": { + "lhs": { + "Deref": { + "register": "FP", + "offset": -3 + } + }, + "rhs": { + "Immediate": "0x100000000000000000000000000000000" + }, + "quotient": { + "register": "AP", + "offset": 3 + }, + "remainder": { + "register": "AP", + "offset": 4 + } + } + } + ] + ], + [ + 1683, + [ + { + "TestLessThanOrEqual": { + "lhs": { + "Immediate": "0x12a2" + }, + "rhs": { + "Deref": { + "register": "FP", + "offset": -8 + } + }, + "dst": { + "register": "AP", + "offset": 0 + } + } + } + ] + ], + [ + 1766, + [ + { + "AllocSegment": { + "dst": { + "register": "AP", + "offset": 0 + } + } + } + ] + ], + [ + 1796, + [ + { + "SystemCall": { + "system": { + "Deref": { + "register": "FP", + "offset": -3 + } + } + } + } + ] + ], + [ + 1820, + [ + { + "AllocSegment": { + "dst": { + "register": "AP", + "offset": 0 + } + } + } + ] + ], + [ + 1969, + [ + { + "SystemCall": { + "system": { + "Deref": { + "register": "FP", + "offset": -5 + } + } + } + } + ] + ], + [ + 2025, + [ + { + "SystemCall": { + "system": { + "Deref": { + "register": "FP", + "offset": -4 + } + } + } + } + ] + ], + [ + 2077, + [ + { + "SystemCall": { + "system": { + "Deref": { + "register": "FP", + "offset": -4 + } + } + } + } + ] + ], + [ + 2129, + [ + { + "SystemCall": { + "system": { + "Deref": { + "register": "FP", + "offset": -4 + } + } + } + } + ] + ], + [ + 2170, + [ + { + "TestLessThan": { + "lhs": { + "Deref": { + "register": "FP", + "offset": -3 + } + }, + "rhs": { + "Immediate": "0x800000000000000000000000000000000000000000000000000000000000000" + }, + "dst": { + "register": "AP", + "offset": 4 + } + } + } + ] + ], + [ + 2174, + [ + { + "LinearSplit": { + "value": { + "Deref": { + "register": "AP", + "offset": 3 + } + }, + "scalar": { + "Immediate": "0x110000000000000000" + }, + "max_x": { + "Immediate": "0xffffffffffffffffffffffffffffffff" + }, + "x": { + "register": "AP", + "offset": -2 + }, + "y": { + "register": "AP", + "offset": -1 + } + } + } + ] + ], + [ + 2184, + [ + { + "LinearSplit": { + "value": { + "Deref": { + "register": "FP", + "offset": -3 + } + }, + "scalar": { + "Immediate": "0x8000000000000000000000000000000" + }, + "max_x": { + "Immediate": "0xffffffffffffffffffffffffffffffff" + }, + "x": { + "register": "AP", + "offset": -1 + }, + "y": { + "register": "AP", + "offset": 0 + } + } + } + ] + ], + [ + 2225, + [ + { + "SystemCall": { + "system": { + "Deref": { + "register": "FP", + "offset": -3 + } + } + } + } + ] + ], + [ + 2269, + [ + { + "TestLessThan": { + "lhs": { + "Deref": { + "register": "AP", + "offset": -1 + } + }, + "rhs": { + "Immediate": "0x7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00" + }, + "dst": { + "register": "AP", + "offset": 5 + } + } + } + ] + ], + [ + 2273, + [ + { + "LinearSplit": { + "value": { + "Deref": { + "register": "AP", + "offset": 4 + } + }, + "scalar": { + "Immediate": "0x110000000000000000" + }, + "max_x": { + "Immediate": "0xffffffffffffffffffffffffffffffff" + }, + "x": { + "register": "AP", + "offset": -2 + }, + "y": { + "register": "AP", + "offset": -1 + } + } + } + ] + ], + [ + 2284, + [ + { + "LinearSplit": { + "value": { + "Deref": { + "register": "AP", + "offset": 4 + } + }, + "scalar": { + "Immediate": "0x8000000000000000000000000000000" + }, + "max_x": { + "Immediate": "0xfffffffffffffffffffffffffffffffe" + }, + "x": { + "register": "AP", + "offset": -2 + }, + "y": { + "register": "AP", + "offset": -1 + } + } + } + ] + ], + [ + 2335, + [ + { + "TestLessThanOrEqual": { + "lhs": { + "Immediate": "0x1112" + }, + "rhs": { + "Deref": { + "register": "FP", + "offset": -7 + } + }, + "dst": { + "register": "AP", + "offset": 0 + } + } + } + ] + ], + [ + 2409, + [ + { + "AllocSegment": { + "dst": { + "register": "AP", + "offset": 0 + } + } + } + ] + ] + ], + "entry_points_by_type": { + "EXTERNAL": [ + { + "selector": "0x6bb652563f60fe749b3405622dafcec0416409827726a908f4811df4cb67f5", + "offset": 219, + "builtins": [ + "pedersen", + "range_check" + ] + }, + { + "selector": "0x2e0414d80a2231d5dce68f6dfc3d0d4c7d25fd9e6d9a7cd492fc3e99bdf70b2", + "offset": 111, + "builtins": [ + "range_check" + ] + }, + { + "selector": "0x331e2c619722fac6cb21a343fa0352f55748127ffb0b05d5e03313658c6ef05", + "offset": 0, + "builtins": [ + "range_check" + ] + }, + { + "selector": "0x3d05b7bc194a1006aecda433c763ca000b3382f88e41ceeb3e7f636bc582473", + "offset": 359, + "builtins": [ + "pedersen", + "range_check" + ] + } + ], + "L1_HANDLER": [], + "CONSTRUCTOR": [ + { + "selector": "0x28ffe4ff0f226a9107253e17a904099aa4f63a02a5621de0576e5aa71bc5194", + "offset": 561, + "builtins": [ + "range_check" + ] + } + ] + } +} \ No newline at end of file diff --git a/cairo/airdrop_poseidon.sierra.json b/cairo/airdrop_poseidon.sierra.json new file mode 100644 index 0000000..a85dd30 --- /dev/null +++ b/cairo/airdrop_poseidon.sierra.json @@ -0,0 +1,1553 @@ +{ + "sierra_program": [ + "0x1", + "0x4", + "0x0", + "0x2", + "0x4", + "0x0", + "0x26b", + "0x195", + "0x55", + "0x52616e6765436865636b", + "0x800000000000000100000000000000000000000000000000", + "0x66656c74323532", + "0x800000000000000700000000000000000000000000000000", + "0x537472756374", + "0x800000000000000700000000000000000000000000000002", + "0x0", + "0x1166fe35572d4e7764dac0caf1fd7fc591901fd01156db2561a07b68ab8dca2", + "0x1", + "0x426f78", + "0x800000000000000700000000000000000000000000000001", + "0x14", + "0x4172726179", + "0x800000000000000300000000000000000000000000000001", + "0x456e756d", + "0x800000000000000300000000000000000000000000000003", + "0xfeece2ea7edbbbebeeb5f270b77f64c680a68a089b794478dd9eca75e0196a", + "0x3", + "0x4", + "0x800000000000000f00000000000000000000000000000001", + "0x2ee1e2b1b89f8c495f200e4956278a4d47395fe262f27b52e5865c9524c08c3", + "0x800000000000000f00000000000000000000000000000002", + "0x6", + "0x16a4c8d7c05909052238a862d8cc3e7975bf05a07b3a69c6b28951083a6d672", + "0x8", + "0xcc5e86243f861d2d64b08c35db21013e773ac5cf10097946fe0011304886d5", + "0x7", + "0x9", + "0x101dc0399934cc08fa0d6f6f2daead4e4a38cabeea1c743e1fc28d2d6e58e99", + "0x753634", + "0x3e4e624a497e446ce523f5b345c07be6fab07dbff47534532460e9a8288be43", + "0xc", + "0x800000000000000700000000000000000000000000000003", + "0x3288d594b9a45d15bb2fcb7903f06cdb06b27f0ba88186ec4cfaa98307cb972", + "0x248e8fae2f16a35027771ffd74d6a6f3c379424b55843563a18f566bba3d905", + "0xe", + "0x4e6f6e5a65726f", + "0x1c", + "0x39", + "0x436f6e747261637441646472657373", + "0x800000000000000700000000000000000000000000000006", + "0x7d4d99e9ed8d285b5c61b493cedb63976bc3d9da867933d829f49ce838b5e7", + "0x12", + "0x11", + "0x13", + "0x75313238", + "0x536e617073686f74", + "0x1baeba72e79e9db2587cf44fedb2f3700b2075a5e8e39a562584862c4b71f62", + "0x16", + "0x1d", + "0x18", + "0x1597b831feeb60c71f259624b79cf66995ea4f7e383403583674ab9c33b9cec", + "0x19", + "0x753332", + "0x80000000000000070000000000000000000000000000000e", + "0x348a62b7a38c0673e61e888d83a3ac1bf334ee7361a8514593d3d9532ed8b39", + "0x15", + "0x17", + "0x1a", + "0x1b", + "0x800000000000000700000000000000000000000000000004", + "0x3342418ef16b3e2799b906b1e4e89dbb9b111332dd44f72458ce44f9895b508", + "0x2ca39cde64b91db1514d78c135ee79d71b3b57fffee52f1a3ef96618a34d8c8", + "0x1e", + "0x25bafed1db971ec9d9883af3e1e08a185480f03f54ed88b3c1ffa951cde4037", + "0x53746f7261676541646472657373", + "0x53746f726167654261736541646472657373", + "0x3f6c89e0315001710d1439368025a3e7f694671d2a9c07f43b7c7cb3fd6b650", + "0x800000000000000f00000000000000000000000000000003", + "0x23", + "0x2f81d89c8e57a5d8fa01084e85478820b1d583298fa484b4346b5ff2c5674d2", + "0x24", + "0x2234479fbaff727c0cc9f616728748dda8ebaa8dc9247aad4ab6ee9f645e390", + "0x26", + "0x320eed9055b2ca8acd142c2f75f7879a8a310bacb0bf56a2fd2c438f1f25a1a", + "0x27", + "0x10c34a50ff993be4ba21999308847f75984644e5efca1d4e14846b8044a38ff", + "0x29", + "0x2fee6c1237e606636a00fb9f29895b41450a75f31b99520f4379231895a2e31", + "0x2a", + "0xe0822b75454a8b0b8d6077a1ee5cfebcd094ce8f22b0f08651f5610d8f9f3c", + "0x2c", + "0xa6d7b061b0b074cfa808caf93ac8acb2f80feb7cf3691e4e1cea431cb318f7", + "0x2d", + "0x2d7b9ba5597ffc180f5bbd030da76b84ecf1e4f1311043a0a15295f29ccc1b0", + "0x161ee0e6962e56453b5d68e09d1cabe5633858c1ba3a7e73fee8c70867eced0", + "0x74584e9f10ffb1a40aa5a3582e203f6758defc4a497d1a2d5a89f274a320e9", + "0x31", + "0x53797374656d", + "0x556e696e697469616c697a6564", + "0x800000000000000200000000000000000000000000000001", + "0x33", + "0x506564657273656e", + "0x35", + "0x1909a2057b9c1373b889e003e050a09f431d8108e0659d03444ced99a6eea68", + "0x11c6d8087e00642489f92d2821ad6ebd6532ad1a3b6d12833da6d6810391511", + "0x3808c701a5d13e100ab11b6c02f91f752ecae7e420d21b56c90ec0a475cc7e5", + "0xe688ac0888a7171e23d265a0ea68699a0ab1f7192e9651213e940c13b80319", + "0x3a", + "0x156b6b29ca961a0da2cfe5b86b7d70df78ddc905131c6ded2cd9024ceb26b4e", + "0x29d7d57c04a880978e7b3689f6218e507f3be17588744b58dc17762447ad0e7", + "0x3d", + "0x20ffdd43a813086db9c8b47ad3b92319042a94b58b55120b58c35818723df96", + "0x800000000000000f00000000000000000000000000000006", + "0x399895e1ba8fb805681f48b58185b1c42378b2b2a87945aa96297f093ccfdd6", + "0x3f", + "0x40", + "0x33835170751032039dfc3575ff0640be5fd1a6b9177a04c741ec75d7153659f", + "0x41", + "0x17b6ecc31946835b0d9d92c2dd7a9c14f29af0371571ae74a1b228828b2242", + "0x43", + "0x34f9bd7c6cb2dd4263175964ad75f1ff1461ddc332fbfb274e0fb2a5d7ab968", + "0x44", + "0x25e2ca4b84968c2d8b83ef476ca8549410346b00836ce79beaf538155990bb2", + "0x12867ecd09c884a5cf1f6d9eb0193b4695ce3bb3b2d796a8367d0c371f59cb2", + "0x46", + "0xa853c166304d20fb0711becf2cbdf482dee3cac4e9717d040b7a7ab1df7eec", + "0x4a", + "0x3d37ad6eafb32512d2dd95a2917f6bf14858de22c27a1114392429f2e5c15d7", + "0x1ee471fea880cdb75aff7b143b1653e4803b9dca47f4fcdd349d11fec9d7a16", + "0x4d", + "0x3e1934b18d91949ab9afdbdd1866a30ccca06c2b1e6581582c6b27f8b4f6555", + "0x50", + "0x4275696c74696e436f737473", + "0x9931c641b913035ae674b400b61a51476d506bbe8bba2ff8a6272790aba9e6", + "0x4f", + "0x4761734275696c74696e", + "0x140", + "0x7265766f6b655f61705f747261636b696e67", + "0x77697468647261775f676173", + "0x6272616e63685f616c69676e", + "0x7374727563745f6465636f6e737472756374", + "0x61727261795f6c656e", + "0x736e617073686f745f74616b65", + "0x64726f70", + "0x7533325f636f6e7374", + "0x2", + "0x72656e616d65", + "0x73746f72655f74656d70", + "0x7533325f6571", + "0x61727261795f6e6577", + "0x66656c743235325f636f6e7374", + "0x496e70757420746f6f206c6f6e6720666f7220617267756d656e7473", + "0x61727261795f617070656e64", + "0x7374727563745f636f6e737472756374", + "0x656e756d5f696e6974", + "0x53", + "0x54", + "0x6765745f6275696c74696e5f636f737473", + "0x52", + "0x77697468647261775f6761735f616c6c", + "0x66756e6374696f6e5f63616c6c", + "0x5", + "0x656e756d5f6d61746368", + "0x51", + "0x4f7574206f6620676173", + "0x4e", + "0x7536345f746f5f66656c74323532", + "0x4c", + "0x4b", + "0xa", + "0x4661696c656420746f20646573657269616c697a6520706172616d202331", + "0x616c6c6f635f6c6f63616c", + "0x66696e616c697a655f6c6f63616c73", + "0xb", + "0x73746f72655f6c6f63616c", + "0x47", + "0x45", + "0xd", + "0x42", + "0x4661696c656420746f20646573657269616c697a6520706172616d202333", + "0x49", + "0x4661696c656420746f20646573657269616c697a6520706172616d202332", + "0x48", + "0x656e61626c655f61705f747261636b696e67", + "0x61727261795f736e617073686f745f706f705f66726f6e74", + "0x3e", + "0x6a756d70", + "0x756e626f78", + "0x3c", + "0x64697361626c655f61705f747261636b696e67", + "0xf", + "0x10", + "0x636f6e74726163745f616464726573735f746f5f66656c74323532", + "0x3b", + "0x38", + "0x21adb5788e32c84f69a1863d85ef9394b7bf761a0ce1190f826984e5075c371", + "0x37", + "0x647570", + "0x626f6f6c5f6e6f745f696d706c", + "0x34", + "0x4164647265737320616c72656164792061697264726f70706564", + "0x7536345f6f766572666c6f77696e675f737562", + "0x753132385f746f5f66656c74323532", + "0x32", + "0x35fae8f261ef41929c4c66cd55f6f7ce0595529b32d8de7d7bc8f02cdd97b8a", + "0x63616c6c5f636f6e74726163745f73797363616c6c", + "0x30", + "0x2f", + "0x50726f6f66206e6f742076616c69642e", + "0x2e", + "0x4f7074696f6e3a3a756e77726170206661696c65642e", + "0x41697264726f7020686173206e6f742073746172746564207965742e", + "0x7536345f7472795f66726f6d5f66656c74323532", + "0x2b", + "0x28", + "0x25", + "0x73746f726167655f626173655f616464726573735f636f6e7374", + "0x165dafc16f74eea9fc30525b0eaa11843ddcf48d38c73a5e474619514690164", + "0x73746f726167655f616464726573735f66726f6d5f62617365", + "0x21", + "0x73746f726167655f726561645f73797363616c6c", + "0x1f", + "0x20", + "0x4e6f6e20436f6e747261637441646472657373", + "0x22", + "0x66656c743235325f737562", + "0x66656c743235325f69735f7a65726f", + "0x75313238735f66726f6d5f66656c74323532", + "0x1bcbbea36956a18f1c3523d4aa8c6f988ce1f864404a8f2506a925348f672c6", + "0x53746f7265553634202d206e6f6e20753634", + "0x7533325f746f5f66656c74323532", + "0x626f6f6c5f746f5f66656c74323532", + "0x73746f726167655f77726974655f73797363616c6c", + "0x5557131bdd4d763644fea797874ddeab7cc5b8b0c01b4dc64002cbbd1758a3", + "0x6765745f657865637574696f6e5f696e666f5f76325f73797363616c6c", + "0x354737ee9f2a370d7777df0105f1778255685dd25f5f46af6d87979e24f033f", + "0x706564657273656e", + "0xad292db4ff05a993c318438c1b6c8a8303266af2da151aa28ccece6726f1f1", + "0x860", + "0xffffffffffffffff", + "0x36", + "0xaf", + "0x7f", + "0xa2", + "0x9b", + "0x12e", + "0x11e", + "0xdf", + "0x10f", + "0x107", + "0x1ef", + "0x1dd", + "0x1cb", + "0x1c1", + "0x1af", + "0x174", + "0x19e", + "0x196", + "0x56", + "0x57", + "0x58", + "0x59", + "0x5a", + "0x5b", + "0x5c", + "0x5d", + "0x5e", + "0x5f", + "0x60", + "0x61", + "0x62", + "0x63", + "0x64", + "0x2b3", + "0x2a4", + "0x294", + "0x215", + "0x21a", + "0x281", + "0x27a", + "0x241", + "0x65", + "0x269", + "0x66", + "0x67", + "0x262", + "0x68", + "0x287", + "0x69", + "0x6a", + "0x6b", + "0x6c", + "0x6d", + "0x6e", + "0x2d4", + "0x6f", + "0x70", + "0x71", + "0x72", + "0x73", + "0x74", + "0x75", + "0x76", + "0x77", + "0x78", + "0x79", + "0x2f5", + "0x7a", + "0x7b", + "0x7c", + "0x7d", + "0x7e", + "0x80", + "0x81", + "0x82", + "0x30d", + "0x83", + "0x306", + "0x84", + "0x85", + "0x86", + "0x87", + "0x88", + "0x329", + "0x89", + "0x8a", + "0x8b", + "0x8c", + "0x8d", + "0x8e", + "0x338", + "0x8f", + "0x33c", + "0x90", + "0x34a", + "0x34f", + "0x38a", + "0x91", + "0x92", + "0x386", + "0x361", + "0x366", + "0x37c", + "0x377", + "0x93", + "0x94", + "0x95", + "0x96", + "0x97", + "0x382", + "0x98", + "0x38f", + "0x39b", + "0x3a0", + "0x3bc", + "0x99", + "0x3b6", + "0x9a", + "0x9c", + "0x9d", + "0x9e", + "0x9f", + "0xa0", + "0xa1", + "0xa3", + "0x4f6", + "0xa4", + "0x3f2", + "0xa5", + "0xa6", + "0xa7", + "0xa8", + "0x4e5", + "0xa9", + "0xaa", + "0xab", + "0x4d4", + "0xac", + "0x4bd", + "0xad", + "0xae", + "0xb0", + "0x4af", + "0xb1", + "0x4a0", + "0xb2", + "0xb3", + "0xb4", + "0x430", + "0xb5", + "0xb6", + "0x435", + "0xb7", + "0xb8", + "0xb9", + "0x491", + "0xba", + "0xbb", + "0xbc", + "0x47b", + "0x455", + "0xbd", + "0xbe", + "0xbf", + "0xc0", + "0x46f", + "0xc1", + "0xc2", + "0xc3", + "0xc4", + "0xc5", + "0xc6", + "0xc7", + "0xc8", + "0x50d", + "0xc9", + "0xca", + "0x512", + "0xcb", + "0xcc", + "0xcd", + "0x549", + "0xce", + "0xcf", + "0x53e", + "0xd0", + "0xd1", + "0x534", + "0xd2", + "0xd3", + "0xd4", + "0xd5", + "0xd6", + "0xd7", + "0xd8", + "0xd9", + "0xda", + "0x578", + "0xdb", + "0x56a", + "0xdc", + "0xdd", + "0x57e", + "0xde", + "0xe0", + "0x589", + "0xe1", + "0xe2", + "0x5a7", + "0xe3", + "0xe4", + "0xe5", + "0xe6", + "0xe7", + "0xe8", + "0xe9", + "0xea", + "0x5b4", + "0x5b9", + "0x5c3", + "0xeb", + "0xec", + "0xed", + "0xee", + "0x5f6", + "0xef", + "0xf0", + "0x5eb", + "0x5f0", + "0xf1", + "0xf2", + "0xf3", + "0xf4", + "0x5fb", + "0xf5", + "0xf6", + "0x607", + "0xf7", + "0x615", + "0xf8", + "0xf9", + "0x61c", + "0xfa", + "0x656", + "0xfb", + "0x62e", + "0xfc", + "0x64c", + "0x646", + "0xfd", + "0x688", + "0x67a", + "0xfe", + "0xff", + "0x68e", + "0x100", + "0x101", + "0x102", + "0x699", + "0x103", + "0x104", + "0x105", + "0x6ba", + "0x106", + "0x108", + "0x109", + "0x10a", + "0x6c6", + "0x6d3", + "0x6d8", + "0x6fe", + "0x6f4", + "0x6f9", + "0x10b", + "0x10c", + "0x10d", + "0x10e", + "0x716", + "0x110", + "0x111", + "0x71b", + "0x112", + "0x113", + "0x114", + "0x727", + "0x115", + "0x116", + "0x117", + "0x118", + "0x119", + "0x11a", + "0x11b", + "0x740", + "0x745", + "0x74f", + "0x11c", + "0x11d", + "0x11f", + "0x766", + "0x76b", + "0x775", + "0x120", + "0x121", + "0x122", + "0x123", + "0x78c", + "0x791", + "0x79b", + "0x124", + "0x125", + "0x126", + "0x127", + "0x7a8", + "0x7ad", + "0x128", + "0x7b4", + "0x129", + "0x7c1", + "0x12a", + "0x12b", + "0x7c6", + "0x12c", + "0x12d", + "0x7d0", + "0x12f", + "0x130", + "0x131", + "0x132", + "0x133", + "0x134", + "0x135", + "0x136", + "0x137", + "0x138", + "0x7eb", + "0x139", + "0x7f7", + "0x83a", + "0x80b", + "0x810", + "0x82c", + "0x826", + "0x833", + "0x13a", + "0x84e", + "0x13b", + "0x13c", + "0x13d", + "0x13e", + "0x13f", + "0x85a", + "0x200", + "0x2c1", + "0x2db", + "0x2e5", + "0x2fb", + "0x313", + "0x331", + "0x343", + "0x393", + "0x3c6", + "0x507", + "0x513", + "0x555", + "0x590", + "0x595", + "0x5ad", + "0x5ca", + "0x60f", + "0x61d", + "0x665", + "0x6a0", + "0x6c0", + "0x6cc", + "0x705", + "0x730", + "0x756", + "0x77c", + "0x7a2", + "0x7ae", + "0x7ba", + "0x7d6", + "0x7e5", + "0x7f1", + "0x7fd", + "0x848", + "0x854", + "0x4a9e", + "0x120241101c1003c090240e0340c0240b028090240801c060140400c0200400", + "0xf04c09064090540704005060070500505c090540705805054070500504c09", + "0x13024200241f01c1003c0407813024170241d01c1003c1c0241b0241a01c10", + "0xa0980902c0a0240902c2504c090900908c070400f05c0905c09088070840f", + "0x130240b0bc040b8090242d0242d0242c0242b0242a01c29014040a0270240b", + "0x70dc05010360d4090d007018050cc0902c2f0c8090380d0c4090c00701805", + "0x3c0243c0243a024390243b0240902409024090243a024390242d0240902438", + "0x9100090fc070400f0480905407018050e40908009024090f8070f4050e809", + "0x17024460241501c450144401c140140410c04108130242d0244101c1003c1c", + "0x912c070400f05c091280905407114051240705005070091200911c070400f", + "0x140141c024500244f01c1003c170244e0241501c450144d01c140141c0244c", + "0x909009154070840f070091500914c070400f05c0914809054071140514407", + "0x1c024580245701c1003c17024130241501c10014130243a0245601c1003c17", + "0x9180070840f05c090e40917c070840f1780916c5a0085d1700916c5a00859", + "0x630246201c1003c2b0241501c060142d02420024200246101c3d0141702409", + "0x70500505c0919809194070840f0240902c0a05c0908009190070840f07009", + "0x1003c170246b0241501c45014520246a0244a024460244e0246901c6801467", + "0x70400f1bc090e809054070400505c0904c091b8070400f070091b4091b007", + "0x2d0245b16817024740247301c2103c39024390247201c210141c0247102470", + "0x90b4091dc070840f070091d8091d4070400f0900905407018051d00916c5a", + "0x1501c060143a0241501c060141c024790247801c1003c200241501c0601417", + "0x7204800087f070091f8091f4070400f0107c070091ec091e8070400f0b409", + "0x8a01c89024880f009024870f0090248602409024850e8090248401c8301c82", + "0x90240922c8f22409238090240923407230070240922c3c0240922c3c02409", + "0x90248b250090248b0248924c0922492070090249106409024910240902490", + "0x4a0240924446024092444e024092440725c960240922c07254930240922c5c", + "0x9a26412024981ac09024871ac09024861ac090249114809024911a80902491", + "0x9260130240922c2d0240922c2d0240921c2d024092187b024092109b02409", + "0x9224921f809024910e8090249104c090248704c090248605c090248705c12", + "0x921879024092109d024092681b048092603a0240921c9c224092380722493", + "0x8b27c090249a06412024980e8090248b01c9e080090248a080090248708009", + "0x922c240240921c24024092187602409210a0024092681c048092605e02409", + "0xa6294120249801ca40b409024a31d009024a3288890248e284120249809009", + "0x92687102409210a80240926820048092607402409298a7024092682d02409", + "0x890248e1b409024872a8090249a2a412024981d0090248b1d009024871bc09", + "0x7224b10248924809024092c0072bcae0240921cad22409238ac0240921cab", + "0xb32c4090249a024892c4092249205c090249101cb22c4090248b0c4090248b", + "0xb604809260200240922c072d4b402409268240480926009024092280902409", + "0x9814809024871a80902487118090248713809024871ac09024840c40902487", + "0x9228092249b024892489b0240922c072249b024892487b02409244b704809", + "0x842e4090249a0ac12024980b012024980240902487024090248601cb80b409", + "0x9d0240922c072249d024892487902409244270240921027024092cc6302409", + "0x90248b01c8927c092249201cbb2e8090249a0b41202498024892740922492", + "0x7224a00248924876024092440c048092604a0240921c092249f024892489f", + "0x890248e01c890248e090090249a090090248a024892800922492280090248b", + "0x921ca70240922c07224a7024892487402409244bc02409268390480926009", + "0x892a009224921c409024910c412024980248929c092249205c090248a0e409", + "0x5c0240928c5e0240928c092246f0248924809224a802489248a80240922c07", + "0x922492300890248e2fc090248701cbe17809024a60b409024bd1480902486", + "0x7402409210073045c024092983a048092604602409218aa0240922c09224aa", + "0x9201cc5310890248e1600902484128090248630c090249a0cc120249801cc2", + "0x92109302409268350480926009224c602489248c60240922c07224c602489", + "0x9a0f01202498024890900922492320890248e31c090249a0ec12024981f809", + "0x580240921cca2240923807224aa024892486d024092445402409210c902409", + "0x892d009224922d0090248b01c892d0092249201ccc1e4090248732c890248e", + "0xcf024092684004809260ce024092683204809260cd02409268260480926009", + "0xd234489024d014009024871300902487120090248413009024841400902484", + "0xd722409238d60240922c07224d602489248d50480926007350d30240922c07", + "0x9024b31000902484354090249a34c12024983581202498024893580922492", + "0x89248b90240922c07224b90248924863024092442c0240921c0c024092100c", + "0xd93601202498024892e809224922e8090248b01c892e80922492024892e409", + "0x89248b60240922c07224b602489248072242402489248b70240921c0736807", + "0x892f009224922f0090248b01c892f0092249201cdb1181202498024892d809", + "0xa90240922c07224a902489248dc22409340072246f0248924809024092f409", + "0x9133c120249801cde0c409024bd1201202498024892a40922492374890248e", + "0x89248c60240926809224c302489248c30240922c07224c3024892485802409", + "0x8b01c89294092249201ce001cdf0248931c092249231c090248b01c8931c09", + "0x54024092441b02409210a1024092684a0480926009224a502489248a502409", + "0x91138090248638489024d0024893240922492324090248b01c893240922492", + "0x892484c0240924409224cd02489248cd0240922c07224cd024892485002409", + "0x8b01c8933c09224921200902491024893380922492338090248b01c8933809", + "0x990240922c07224990248924807388d60240926809224cf02489248cf02409", + "0x92354090248b01c89354092249210009024911301202498024892640922492", + "0xd80240922c073940739089024092108902409244e32240923809224d502489", + "0x90248b01c89284092249206c0902491294090249a2a4090249a2d8090249a", + "0xe72240901c890240701ce70240701c07398990240926809224a102489248a1", + "0x190241301c19024e7024120241201c0739c0901c8901c1b05c890009904c89", + "0xe70240706c0701ce7024a10241701ca52848939c0907009264070700939c09", + "0x939c09294090640701ce7024a90241701c242a48939c09080092640708009", + "0x13024e702413024a101cb6024e7024b60241c01cb7024e7024240241901cb6", + "0xa901c2c024e7024070800701ce7024072240701c2601ce7224b72d88929407", + "0x72dc070b40939c090ac2c224b601c2b024e70242b0242401c2b024e702407", + "0x13024a101c31024e7024390242b01c39024e70242d030890b0070300939c09", + "0x90c4090e4072240939c0922409030072640939c09264090b40704c0939c09", + "0x90e8070e80939c0901c3101c0739c0901c8901c312249904c1302431024e7", + "0xe702407224070f03b224ae0d433224e72243a264130483301c3a024e70243a", + "0x7098071000939c0901c3c01c32024e7024070ec070980939c0901c3501c07", + "0xd501cd3024e7024d6354400c8262644001cd6024e7024070c8073540939c09", + "0x90b4070cc0939c090cc092840701ce7024d8024d601c463608939c0934c09", + "0xcf1201339c09118890d43304cd301c89024e7024890240c01c35024e702435", + "0x939c0901c2001c0739c0901c8901c4e0246d3380939c8913009360071304a", + "0x739c091480933c0715052224e7024cd0244801ccd024e7024ce0244601c50", + "0xc9224e70245015089338071400939c0914009130071500939c091500912807", + "0x701ce7024c6024cd01c583188939c09324091400701ce7024c70244e01cc7", + "0xa101cbf024e70245c024c901c5c024e7024c30245401cc3024e70245802452", + "0x90e4071280939c09128090300733c0939c0933c090b4071200939c0912009", + "0x5e024e70244e0242b01c0739c0901c8901cbf128cf12013024bf024e7024bf", + "0x71280939c09128090300733c0939c0933c090b4071200939c091200928407", + "0x939c0901c2001c0739c0901c8901c5e128cf120130245e024e70245e02439", + "0xba024e7024bc3a0892d8072f00939c092f009090072f00939c0901cc701ce8", + "0x72e40939c0918c090ac0718c0939c092e8272242c01c27024e7024072dc07", + "0x3901c89024e7024890240c01c3c024e70243c0242d01c3b024e70243b024a1", + "0x739c09048093180701ce702407224072e4890f03b04c092e40939c092e409", + "0x892d8071980939c0919809090071980939c0901cc701cb4024e70240708007", + "0x90ac071ac0939c092c46a2242c01c6a024e7024072dc072c40939c09198b4", + "0x890240c01c1b024e70241b0242d01c17024e702417024a101c6d024e70246b", + "0x701ce70240701c071b48906c1704c091b40939c091b4090e4072240939c09", + "0xe7024120241201c0739c0901c8901c1b05c893a49904c8939c890240722409", + "0xe7024a10241701ca52848939c0907009264070700939c090640904c0706409", + "0x701ce7024a90241701c242a48939c0908009264070800939c0901c1b01c07", + "0xa101cb6024e7024b60241c01cb7024e7024240241901cb6024e7024a502419", + "0x70800701ce7024072240701cea01ce7224b72d8892940704c0939c0904c09", + "0x90ac2c224b601c2b024e70242b0242401c2b024e7024072a4070b00939c09", + "0xe7024390242b01c39024e70242d030890b0070300939c0901cb701c2d024e7", + "0x939c0922409030072640939c09264090b40704c0939c0904c09284070c409", + "0x901c3101c0739c0901c8901c312249904c1302431024e7024310243901c89", + "0x3b224eb0d433224e72243a264130483301c3a024e70243a0243a01c3a024e7", + "0x5801c89024e7024890240c01c35024e7024350242d01c0739c0901c8901c3c", + "0xd5024e722440024c301c33024e702433024a101c400c826048e7024890d489", + "0x73600939c09354091700734c0939c0901c2001c0739c0901c8901cd6024ec", + "0xbc01ccf024e702448024e801c0739c09118091780712046224e7024d8024bf", + "0x7138ce224e70244c0245001c4c024e70244a34c892d8071280939c0933c09", + "0x9324073340939c0914009150071400939c09138091480701ce7024ce024cd", + "0x320240c01c26024e7024260242d01c33024e702433024a101c52024e7024cd", + "0x701ce70240722407148320983304c091480939c09148090e4070c80939c09", + "0xc01c26024e7024260242d01c33024e702433024a101c54024e7024d60242b", + "0xe70240722407150320983304c091500939c09150090e4070c80939c090c809", + "0xb601cc7024e7024c70242401cc7024e70240731c073240939c0901c2001c07", + "0x2b01cc3024e7024c6160890b0071600939c0901cb701cc6024e7024c732489", + "0x9030070f00939c090f0090b4070ec0939c090ec09284071700939c0930c09", + "0x739c0901c8901c5c2243c0ec130245c024e70245c0243901c89024e702489", + "0x5e0242401c5e024e70240731c072fc0939c0901c2001c0739c090480931807", + "0xe82f0890b0072f00939c0901cb701ce8024e70245e2fc892d8071780939c09", + "0x906c090b40705c0939c0905c092840709c0939c092e8090ac072e80939c09", + "0x272241b05c1302427024e7024270243901c89024e7024890240c01c1b024e7", + "0xe702407224070641b224ed05c99224e722489024890240701ce70240701c07", + "0x1239c0904c992242701c13024e702413024ba01c99024e702499024a101c07", + "0x9284090480701ce702407224072a4093b820024e7224a50246301ca52841c", + "0x92dc0905c070b0b7224e7024b60249901cb6024e7024240241301c24024e7", + "0x739c090b40905c070302d224e70242b0249901c2b024e70240706c0701ce7", + "0x70e40939c090e409070070c40939c0903009064070e40939c090b00906407", + "0x70800701ce702420024cf01c0739c0901c8901c073bc0739c890c439224a5", + "0x90cc3a224b601c33024e7024330242401c33024e7024072a4070e80939c09", + "0xe70243c0242b01c3c024e7024350ec890b0070ec0939c0901cb701c35024e7", + "0x939c0905c090b4070700939c09070092840701c0939c0901c092e40709809", + "0x70981205c1c01c9902426024e7024260243901c12024e7024120240c01c17", + "0x17070120cc070c80939c090c8090e8070c80939c0901c3101c0739c0901c89", + "0x3b01cd8024e7024070d40701ce7024072240734cd6224f035440224e722432", + "0x939c0901c3201ccf024e702407098071200939c0901c3c01c46024e702407", + "0x935807138ce224e70244c024d501c4c024e70244a33c48118d82644001c4a", + "0x901c092e4073540939c09354090b4071000939c09100092840701ce7024ce", + "0x73544005cb401c20024e7024200244a01c12024e7024120240c01c07024e7", + "0x722407318093c4c7024e7224c90246601cc91505233450264e70242013812", + "0x8939c0930c091a80730c0939c0931c092c4071600939c0901c2001c0739c09", + "0x58024e7024580244c01cbf024e7024bf0246d01c0739c09170091ac072fc5c", + "0xbc224e70245e0245001c0739c093a009138073a05e224e7024582fc892a807", + "0x718c0939c0909c091500709c0939c092e8091480701ce7024bc024cd01cba", + "0x2d01c50024e702450024a101c52024e702452024b901cb9024e702463024c9", + "0x52264092e40939c092e4090e4071500939c0915009030073340939c0933409", + "0x939c09148092e4072d00939c09318090ac0701ce702407224072e45433450", + "0x54024e7024540240c01ccd024e7024cd0242d01c50024e702450024a101c52", + "0x20024cf01c0739c0901c8901cb4150cd14052264092d00939c092d0090e407", + "0xb1024e7024b10242401cb1024e70240731c071980939c0901c2001c0739c09", + "0x6d024e70246a1ac890b0071ac0939c0901cb701c6a024e7024b1198892d807", + "0x73580939c09358092840701c0939c0901c092e4072a80939c091b4090ac07", + "0x99024aa024e7024aa0243901c12024e7024120240c01cd3024e7024d30242d", + "0x739c09284093180701ce7024a90244e01c0739c0901c8901caa048d335807", + "0x892d8071c40939c091c409090071c40939c0901c6f01c6f024e70240708007", + "0x90ac0729c0939c092a0742242c01c74024e7024072dc072a00939c091c46f", + "0x170242d01c1c024e70241c024a101c07024e702407024b901cae024e7024a7", + "0x1707007264092b80939c092b8090e4070480939c09048090300705c0939c09", + "0x731c072b00939c0901c2001c0739c0904c093180701ce702407224072b812", + "0x901cb701ca0024e7024762b0892d8071d80939c091d809090071d80939c09", + "0x901c092e4072740939c091e4090ac071e40939c092809f2242c01c9f024e7", + "0xe7024120240c01c19024e7024190242d01c1b024e70241b024a101c07024e7", + "0x705c0939c0901c7101c9d0481906c07264092740939c09274090e40704809", + "0xe722489024890240701ce70240701c0701ce7024071d0070640939c0901ca8", + "0x13024ba01c1c024e70241c024a101c0739c0901c8901c20294893c8a107089", + "0x93cc1b024e7224b60246301cb6090a9048e7024130708909c0704c0939c09", + "0xa701c24024e702424024ba01ca9024e7024a9024a101c0739c0901c8901cb7", + "0x939c890b4092b00706c0939c0906c19224ae01c2d0ac2c048e7024242a489", + "0x939c09284090b4070b00939c090b0092840701ce70240722407030093d099", + "0x90aca10b012280072640939c09264172247601c2b024e70242b024ba01ca1", + "0x91e40701ce702407224070d4093d433024e72243a0249f01c3a0c439048e7", + "0x1201c0739c0901c8901c32024f60980939c890f009274070f03b224e702433", + "0x1701cd33588939c0935409264073540939c091000904c071000939c090ec09", + "0x460241701c481188939c0936009264073600939c0901c1b01c0739c0935809", + "0xe7024cf0241c01c4a024e7024480241901ccf024e7024d30241901c0739c09", + "0x739c09098093340701ce7024072240701cf701ce72244a33c892940733c09", + "0x901ca901c4c024e7024070800701ce70241b024cf01c0739c09264091f807", + "0xe7024072dc071380939c093384c224b601cce024e7024ce0242401cce024e7", + "0xe702407024b901c52024e7024cd0242b01ccd024e70244e140890b00714009", + "0x939c0904809030070c40939c090c4090b4070e40939c090e4092840701c09", + "0x70c40701ce70240722407148120c43901c9902452024e7024520243901c12", + "0x893e0c73248939c89150310e4120cc071500939c09150090e8071500939c09", + "0x70f0071700939c0901c3b01cc3024e7024070d40701ce70240722407160c6", + "0x5e2fc5c30c99100073a00939c0901c3201c5e024e702407098072fc0939c09", + "0x7024b901cc7024e7024c70242d01cc9024e7024c9024a101cbc024e7024e8", + "0x9264091ec0706c0939c0906c09128070480939c09048090300701c0939c09", + "0x9939c090989906cbc0480731cc90649b01c26024e7024260244c01c99024e7", + "0x924c0701ce702407224072c4093e466024e7224b40249601cb42e46309cba", + "0x91ac09334071b46b224e70246a0245001c6a024e7024070800701ce702466", + "0x939c091bc09324071bc0939c092a809150072a80939c091b4091480701ce7", + "0x27024e7024270242d01cba024e7024ba024a101c63024e702463024b901c71", + "0x8901c712e4272e863264091c40939c091c4090e4072e40939c092e40903007", + "0x92e8092840718c0939c0918c092e4072a00939c092c4090ac0701ce702407", + "0xe7024a80243901cb9024e7024b90240c01c27024e7024270242d01cba024e7", + "0x91f80701ce702426024cd01c0739c0901c8901ca82e4272e863264092a009", + "0xa7024e70240731c071d00939c0901c2001c0739c0906c0933c0701ce702499", + "0x72b00939c0901cb701cae024e7024a71d0892d80729c0939c0929c0909007", + "0x701c0939c0901c092e4072800939c091d8090ac071d80939c092b8ac2242c", + "0x3901c12024e7024120240c01c58024e7024580242d01cc6024e7024c6024a1", + "0xe7024320244e01c0739c0901c8901ca00485831807264092800939c0928009", + "0x70800701ce70241b024cf01c0739c09264091f80701ce70243b024c601c07", + "0x91e49f224b601c79024e7024790242401c79024e7024072500727c0939c09", + "0xe70247b0242b01c7b024e70249d1f8890b0071f80939c0901cb701c9d024e7", + "0x939c090c4090b4070e40939c090e4092840701c0939c0901c092e40726c09", + "0x726c120c43901c990249b024e70249b0243901c12024e7024120240c01c31", + "0xe7024350242b01c0739c09264091f80701ce70241b024cf01c0739c0901c89", + "0x939c090c4090b4070e40939c090e4092840701c0939c0901c092e40725809", + "0x7258120c43901c9902496024e7024960243901c12024e7024120240c01c31", + "0xe70242b024c601c0739c0906c0933c0701ce70240c0244e01c0739c0901c89", + "0x9090072500939c0901cfa01c93024e7024070800701ce7024170240001c07", + "0xfa2242c01cfa024e7024072dc070000939c0925093224b601c94024e702494", + "0x2c024a101c07024e702407024b901cfc024e7024fb0242b01cfb024e702400", + "0x93f0090e4070480939c0904809030072840939c09284090b4070b00939c09", + "0x1c0739c092dc091380701ce702407224073f0122842c01c99024fc024e7", + "0x939c0901c2001c0739c09064093ec0701ce702424024c601c0739c0905c09", + "0xff024e7024fe3f4892d8073f80939c093f809090073f80939c0901c6f01cfd", + "0x74080939c09404090ac074040939c093fd002242c01d00024e7024072dc07", + "0xc01ca1024e7024a10242d01ca9024e7024a9024a101c07024e702407024b9", + "0x901c8901d02048a12a407264094080939c09408090e4070480939c0904809", + "0x2001c0739c0905c090000701ce702419024fb01c0739c0904c093180701ce7", + "0x10440c892d8074100939c0941009090074100939c0901cc701d03024e702407", + "0x941c090ac0741c0939c09415062242c01d06024e7024072dc074140939c09", + "0xe7024200242d01ca5024e7024a5024a101c07024e702407024b901d08024e7", + "0x1080482029407264094200939c09420090e4070480939c09048090300708009", + "0xe7024072240706c172250926413224e72240901c890240701ce70240701c07", + "0x1239c09048132242701c12024e702412024ba01c13024e702413024a101c07", + "0x9064092840701ce7024072240708009428a5024e7224a10246301ca107019", + "0x918c072d8242a41239c09070192242701c1c024e70241c024ba01c19024e7", + "0x73f0070ac0939c09090090480701ce702407224070b00942cb7024e7224b6", + "0xc024fe01c0739c0901c8901c390250c0302d224e72242b024fd01c0739c09", + "0x10d02407404070cc0939c090c409400070e80939c090b4093fc070c40939c09", + "0x93fc070ec0939c090d40940c070d40939c0901d0201c0739c0901c8901c07", + "0x7098094383c024e7224330250401c33024e70243b0250001c3a024e702439", + "0xa9024a101c40024e7024320250601c32024e70243c0250501c0739c0901c89", + "0x942007358d5224e7024402a48941c071000939c0910009090072a40939c09", + "0x9048071180939c090e8091480701ce702407224073600943cd3024e7224d6", + "0xcf0249901ccf024e7024480241301c48024e702448024ff01c48024e702446", + "0xe7024ce0249901cce024e70240706c0701ce70244a0241701c4c1288939c09", + "0x939c0914009064073340939c09130090640701ce70244e0241701c5013889", + "0x739c0901c8901c074400739c89148cd224a501ccd024e7024cd0241c01c52", + "0x92940933c0701ce7024b7024cf01c0739c0934c091780701ce70240744407", + "0x73240939c0932409090073240939c0901ca901c54024e7024070800701ce7", + "0x71600939c0931cc62242c01cc6024e7024072dc0731c0939c0932454224b6", + "0xc01c99024e7024990242d01cd5024e7024d5024a101cc3024e7024580242b", + "0xe7024072240730c89264d504c0930c0939c0930c090e4072240939c0922409", + "0x8939c8917099354120cc071700939c09170090e8071700939c0901c3101c07", + "0xba024e7024070d40701ce7024074440701ce702407224072f0e822512178bf", + "0x901c3201cb9024e7024070980718c0939c0901c3c01c27024e7024070ec07", + "0xc01c5e024e70245e0242d01c66024e7024b42e46309cba2644001cb4024e7", + "0x944c072dc0939c092dc09128072940939c0929409128072240939c0922409", + "0x92fc09284071ac6a2c41239c0934cb7294662245e05d1401cd3024e7024d3", + "0x91b40924c0701ce702407224072a8094546d024e72246b0249601cbf024e7", + "0x739c091c409334072a071224e70246f0245001c6f024e7024070800701ce7", + "0x72b80939c0929c093240729c0939c091d009150071d00939c092a00914807", + "0x3901c6a024e70246a0240c01cb1024e7024b10242d01cbf024e7024bf024a1", + "0x939c092a8090ac0701ce702407224072b86a2c4bf04c092b80939c092b809", + "0x6a024e70246a0240c01cb1024e7024b10242d01cbf024e7024bf024a101cac", + "0xe7024074440701ce702407224072b06a2c4bf04c092b00939c092b0090e407", + "0x70800701ce7024a5024cf01c0739c092dc0933c0701ce7024d30245e01c07", + "0x928076224b601ca0024e7024a00242401ca0024e70240731c071d80939c09", + "0xe70249d0242b01c9d024e70249f1e4890b0071e40939c0901cb701c9f024e7", + "0x939c0922409030072f00939c092f0090b4073a00939c093a009284071f809", + "0xd80244e01c0739c0901c8901c7e224bc3a0130247e024e70247e0243901c89", + "0x701ce7024a5024cf01c0739c092dc0933c0701ce70243a0251601c0739c09", + "0xe7024260244e01c0739c0901c8901c0745c0901d0101c7b024e7024d5024a1", + "0x92840701ce7024b7024cf01c0739c090e8094580701ce7024a5024cf01c07", + "0x96024e7024072500726c0939c0901c2001c0739c0901d1101c7b024e7024a9", + "0x72500939c0901cb701c93024e70249626c892d8072580939c092580909007", + "0x71ec0939c091ec09284073e80939c09000090ac070000939c0924c942242c", + "0x13024fa024e7024fa0243901c89024e7024890240c01c99024e7024990242d", + "0x701ce7024a5024cf01c0739c090b0091380701ce702407224073e8892647b", + "0x93f009090073f00939c0901cfa01cfb024e7024070800701ce702424024c6", + "0x93f4fe2242c01cfe024e7024072dc073f40939c093f0fb224b601cfc024e7", + "0xe7024990242d01ca9024e7024a9024a101d00024e7024ff0242b01cff024e7", + "0x740089264a904c094000939c09400090e4072240939c09224090300726409", + "0x939c0901c2001c0739c09070093180701ce7024200244e01c0739c0901c89", + "0x103024e702502404892d8074080939c0940809090074080939c0901c6f01d01", + "0x74180939c09414090ac074140939c0940d042242c01d04024e7024072dc07", + "0x3901c89024e7024890240c01c99024e7024990242d01c19024e702419024a1", + "0x739c09048093180701ce70240722407418892641904c094180939c0941809", + "0x892d8074200939c0942009090074200939c0901cc701d07024e70240708007", + "0x90ac074500939c09445132242c01d13024e7024072dc074440939c0942107", + "0x890240c01c1b024e70241b0242d01c17024e702417024a101d16024e702514", + "0x9939c0904809460074588906c1704c094580939c09458090e4072240939c09", + "0xe70241b0251b01c0739c09264094680701ce7024130251901c1906c1726413", + "0x70240939c09024090b40701c0939c0901c092840701ce7024190251c01c07", + "0x20024d801c20294a10701339c0905c890240704d1d01c89024e7024890240c", + "0xb60251f01cb6024e7024a90244601c0739c0901c8901c240251e2a40939c89", + "0x9284090b4070700939c0907009284070b00939c092dc09480072dc0939c09", + "0x2c294a1070130242c024e70242c0252101ca5024e7024a50240c01ca1024e7", + "0x90b4070700939c0907009284070ac0939c09090094880701ce70240722407", + "0xa1070130242b024e70242b0252101ca5024e7024a50240c01ca1024e7024a1", + "0x8939c0904809494070480939c0922409490072240939c0901c0948c070aca5", + "0x9024e7024090244c01c99024e7024990242401c0739c0904c094980726413", + "0x90640939c0901d0201c0739c0906c091380706c17224e7024092648949c07", + "0x9024072252801c09024e7024090240c01c07024e7024070242d01c1905c89", + "0x94ac0701ce7024072240705c094a899024e7224130252901c1304889048e7", + "0x5e01ca52841c048e7024190252d01c19024e70241b0252c01c1b024e702499", + "0x9080094bc070800939c09284094b80701ce7024a5024cf01c0739c0907009", + "0xe7024a9024ea01c12024e7024120240c01c89024e7024890242d01ca9024e7", + "0x890242d01c24024e7024170253001c0739c0901c8901ca904889048092a409", + "0x2404889048090900939c09090093a8070480939c0904809030072240939c09", + "0x13024e7224120253201c122248939c09024094c4070240939c09024092e807", + "0x722407064094d41b05c8939c8904c072253401c0739c0901c8901c9902533", + "0xe702489024ba01c17024e702417024a101c1c024e70241b0253601c0739c09", + "0x901d0201c0739c0901c8901c1c22417048090700939c09070094dc0722409", + "0xe702489024ba01c19024e702419024a101ca5024e7024a10253801ca1024e7", + "0x990253801c0739c0901c8901ca522419048092940939c09294094dc0722409", + "0x9080094dc072240939c09224092e80701c0939c0901c09284070800939c09", + "0x905c09464072841c0641b05c9939c0904c09460070808901c1202420024e7", + "0xa101c0739c090700946c0701ce7024190253901c0739c0906c094680701ce7", + "0x9030072240939c09224092e4070240939c09024090b40701c0939c0901c09", + "0x9939c09264a1048890240705d3a01c99024e7024990244a01c12024e702412", + "0x92c40701ce702407224070b0094ecb7024e7224b60246601cb6090a9080a5", + "0xa5024a101c0c024e70242d0253d01c2d024e70242b0253c01c2b024e7024b7", + "0x909009030072a40939c092a4092e4070800939c09080090b4072940939c09", + "0x701ce70240722407030242a420294990240c024e70240c0253e01c24024e7", + "0xb901c20024e7024200242d01ca5024e7024a5024a101c39024e70242c0253f", + "0xa5264090e40939c090e4094f8070900939c0909009030072a40939c092a409", + "0x8901c13025420480939c8922409504072240939c0901c09500070e4242a420", + "0x939c0926409090072640939c0901d4301c0739c09048091380701ce702407", + "0xe7024075140701ce7024130244e01c0739c0901c8901c075100901d0101c17", + "0xe7024190252601c1c0648939c0905c094940705c0939c0906c090900706c09", + "0xe7024a50244e01ca52848939c090241c2252701c09024e7024090244c01c07", + "0x89224093f4072240939c090240904807080a1224090800939c0901d0201c07", + "0x12024ff01c17024e702413024fe01c0739c0901c8901c990254604c12224e7", + "0x701ce7024072240701d4702407404070640939c0905c094000706c0939c09", + "0x94000706c0939c09264093fc072840939c090700940c070700939c0901d02", + "0x190250401ca5024e7024a5024ba01ca5024e70241b0245201c19024e7024a1", + "0x240250601c24024e7024200250501c0739c0901c8901ca9025480800939c89", + "0xb601c89524072d80939c092d8090900701c0939c0901c09284072d80939c09", + "0x90480701ce702407224070b40952c2b024e72242c0254a01c2c2dc8939c09", + "0xfe01c0739c0901c8901c3a0254c0c439224e72240c024fd01c0c024e7024a5", + "0x7404070ec0939c090cc09400070d40939c090e4093fc070cc0939c090c409", + "0x70980939c090f00940c070f00939c0901d0201c0739c0901c8901c0753409", + "0xba01c32024e7024350245201c3b024e7024260250001c35024e70243a024ff", + "0x10501c0739c0901c8901cd50254e1000939c890ec09410070c80939c090c809", + "0x9090072dc0939c092dc092840734c0939c0935809418073580939c0910009", + "0x953c48024e7224460254a01c463608939c0934cb72254901cd3024e7024d3", + "0x71300939c0912809544071280939c091202b2255001c0739c0901c8901ccf", + "0x120244c024e70244c0255201c32024e702432024ba01cd8024e7024d8024a1", + "0x73380939c09360092840701ce70242b0255301c0739c0901c8901c4c0c8d8", + "0xe7024d50244e01c0739c0901c8901c075540901d0101c4e024e7024cf02554", + "0x15401cce024e7024b7024a101c50024e7024074080701ce70242b0255301c07", + "0x9548070c80939c090c8092e8073340939c0913809558071380939c0914009", + "0x71480939c092dc092840701ce702407224073343233812024cd024e7024cd", + "0xe7024a90244e01c0739c0901c8901c0755c0901d0101c54024e70242d02554", + "0x71500939c0932409550071480939c0901c09284073240939c0901d0201c07", + "0x12024c7024e7024c70255201ca5024e7024a5024ba01cc7024e70245402556", + "0x13224e722412024fd01c12024e7024890241201c0739c0901d1101cc729452", + "0x939c0904c093fc0706c0939c09264093f80701ce7024072240705c0956099", + "0x901d0201c0739c0901c8901c075640901d0101c1c024e70241b0250001c19", + "0xe7024a50250001c19024e702417024ff01ca5024e7024a10250301ca1024e7", + "0x939c8907009410070800939c09080092e8070800939c09064091480707009", + "0xb7024e702407080072d80939c092a4094140701ce7024072240709009568a9", + "0x70240939c09024090b40701c0939c0901c09284070b00939c092d80941807", + "0x15b01c2c024e70242c0242401cb7024e7024b70244c01c20024e702420024ba", + "0x8901c310255c0e40939c890300927c070302d0ac1239c090b0b70800901c99", + "0x93b0070d40939c090cc3a2255d01c330e88939c090e4091e40701ce702407", + "0x3b0255e01c2d024e70242d0242d01c2b024e70242b024a101c3b024e702435", + "0xa101c3c024e7024310255f01c0739c0901c8901c3b0b42b048090ec0939c09", + "0x2b048090f00939c090f009578070b40939c090b4090b4070ac0939c090ac09", + "0x9580070980939c0901d0201c0739c09090091380701ce702407224070f02d", + "0x9284073540939c09100093b0071000939c090c8202255d01c32024e702426", + "0x901c12024d5024e7024d50255e01c09024e7024090242d01c07024e702407", + "0x901d1101c0739c0901c7401ca5024e702407588070700939c0901d6101cd5", + "0xa101c2b0b08939c092dc0958c072dcb6090a90809939c0904c094600701ce7", + "0x9030072240939c09224092e4070240939c09024090b40701c0939c0901c09", + "0x174e8070b40939c090b409128070b499224e702499024eb01c12024e702412", + "0x6601c19024e70241907089590070e831064390309939c090b42b0488902407", + "0x16601c3b024e702433024b101c0739c0901c8901c35025650cc0939c890e809", + "0x32025670980939c890f009504070f00939c090f0091b4070f00939c090ec09", + "0x92640933c0701ce7024240253901c0739c09098091380701ce70240722407", + "0x11a01c0739c092d80946c0701ce7024200251901c0739c090b0094700701ce7", + "0xe7024a50256801c0739c0905c091f80701ce70241b024cd01c0739c092a409", + "0xb601cd5024e7024d50242401cd5024e7024075a4071000939c0901c2001c07", + "0x16a01cd8024e7024d634c890b00734c0939c0901cb701cd6024e7024d510089", + "0x92e4070e40939c090e4090b4070300939c0903009284071180939c0936009", + "0x390309902446024e7024460256b01c31024e7024310240c01c19024e702419", + "0x70e40939c090e4090b40701ce7024320244e01c0739c0901c8901c460c419", + "0x939c891280930c07128cf1201239c090c4392245801c31024e7024310240c", + "0xe70240c024a101c501388939c092a4095b40701ce70240722407338095b04c", + "0x5033c48030135b80733c0939c0933c09030071200939c09120090b40703009", + "0x1703240939c891500930c072840939c09284a52256f01c54284523341339c09", + "0x71600939c0932409170073180939c09130091700701ce7024072240731c09", + "0x9170091780701ce70240722407178bf22572170c3224e722458318cd04971", + "0x939c092f009490072f099224e702499024eb01ce8024e7024070800701ce7", + "0xe7024630257401cb918c8939c0905c095cc0709c0939c092e8e8224b601cba", + "0x92c466224b601cb1024e7024b90257401c66024e7024b409c892d8072d009", + "0xe7024c3024a101c0739c091ac09334071b46b224e70241b0245001c6a024e7", + "0x939c091a809130071b40939c091b4093fc071480939c09148090b40730c09", + "0x74025762a00939c891c4095d4071c46f2a81239c091a86d148c304ce901c6a", + "0x2d01caa024e7024aa024a101cae29c8939c09090095dc0701ce70240722407", + "0xac04ce7024ae2846f2a813474072840939c0928409030071bc0939c091bc09", + "0x92a0095e40701ce70240722407274095e079024e72249f024d801c9f28076", + "0x939c0901d7a01c9b024e7024790244601c0739c091ec09138071ec7e224e7", + "0x24e7024940245201c0739c0924c093340725093224e70247e0245001c96", + "0x995ec070000939c09000092e8072580939c09258090900701ce7024073f007", + "0x95f40701ce702407224073fcfe3f4125f0fc3ecfa048e7224002589b28076", + "0x1000257e01d02024e7024fb0240c01d01024e7024fa0242d01d00024e7024fc", + "0x74100939c093fc096000701ce7024072240701d7f024074040740c0939c09", + "0x18101d03024e7025040257e01d02024e7024fe0240c01d01024e7024fd0242d", + "0x18401c0739c0901c8901d07025834180939c8941409608074140939c0940c09", + "0xc601d134448939c0942009614074200939c09420092e8074200939c0941809", + "0x95040701ce702407224074580961d14024e7225130258601c0739c0944409", + "0x9460091380701ce7024074440701ce702407224074640962118024e722514", + "0x13901c0739c092d80946c0701ce70244e0251a01c0739c09080094640701ce7", + "0x939c0901c2001c0739c090b0094700701ce702499024cf01c0739c0929c09", + "0x11c024e70251b468892d80746c0939c0946c090900746c0939c0901d8901d1a", + "0x74800939c0947c095a80747c0939c094711d2242c01d1d024e7024072dc07", + "0xc01c19024e702419024b901d01024e7025010242d01cac024e7024ac024a1", + "0x901c8901d2040819404ac264094800939c09480095ac074080939c0940809", + "0x9628074840939c0901d0201c0739c09464091380701ce7024074440701ce7", + "0x19024b901d01024e7025010242d01cac024e7024ac024a101d22024e702521", + "0x9488091b4072640939c0926409128074080939c0940809030070640939c09", + "0x1270258c01d274992549123264e7025222642c40819404ac06d8b01d22024e7", + "0x9138074b12b224e7025280258e01c0739c0901c8901d290258d4a00939c89", + "0x18f01d2e024e70252b2d8a7138202644001d2d024e7024074080701ce70252c", + "0x2d01d23024e702523024a101cea024e70252f0259001d2f024e70252d4b889", + "0x95ac074980939c0949809030074940939c09494092e4074900939c0949009", + "0x739c09080094640701ce702407224073a9264952448c99024ea024e7024ea", + "0x1290256a01c0739c0929c094e40701ce7024b60251b01c0739c091380946807", + "0x9494092e4074900939c09490090b40748c0939c0948c09284074c00939c09", + "0x1264952448c9902530024e7025300256b01d26024e7025260240c01d25024e7", + "0x9080094640701ce7025160244e01c0739c0901d1101c0739c0901c8901d30", + "0xcf01c0739c0929c094e40701ce7024b60251b01c0739c09138094680701ce7", + "0x939c0901d9101d31024e7024070800701ce70242c0251c01c0739c0926409", + "0x136024e7024072dc074d00939c094c931224b601d32024e7025320242401d32", + "0xac024e7024ac024a101d38024e7025370256a01d37024e7025344d8890b007", + "0x74080939c0940809030070640939c09064092e4074040939c09404090b407", + "0xe7024074440701ce702407224074e102065012b09902538024e7025380256b", + "0x94e40701ce7024b60251b01c0739c09138094680701ce7024200251901c07", + "0x939c0941c095a80701ce70242c0251c01c0739c092640933c0701ce7024a7", + "0x19024e702419024b901d01024e7025010242d01cac024e7024ac024a101d39", + "0x8901d3940819404ac264094e40939c094e4095ac074080939c094080903007", + "0x739c09080094640701ce70242c0251c01c0739c092640933c0701ce702407", + "0xa80259201c0739c0929c094e40701ce7024b60251b01c0739c091380946807", + "0xe7024760242d01cac024e7024ac024a101d3a024e70249d0256a01c0739c09", + "0x939c094e8095ac072800939c0928009030070640939c09064092e4071d809", + "0x99024cf01c0739c09090094e40701ce702407224074e8a0064762b0990253a", + "0x701ce70244e0251a01c0739c09080094640701ce70242c0251c01c0739c09", + "0x90b4072a80939c092a809284074f00939c091d0095a80701ce7024b60251b", + "0x13c0256b01ca1024e7024a10240c01c19024e702419024b901c6f024e70246f", + "0x701ce70245e0245e01c0739c0901c8901d3c284191bcaa264094f00939c09", + "0x9080094640701ce70242c0251c01c0739c092640933c0701ce70242402539", + "0x7e01c0739c0906c093340701ce7024b60251b01c0739c09138094680701ce7", + "0xe70253e0242401d3e024e70240764c074f40939c0901c2001c0739c0905c09", + "0xe70253f500890b0075000939c0901cb701d3f024e70253e4f4892d8074f809", + "0x939c09148090b4072fc0939c092fc092840750c0939c09504095a80750409", + "0x143024e7025430256b01ca1024e7024a10240c01c19024e702419024b901c52", + "0x92640933c0701ce7024240253901c0739c0901c8901d4328419148bf26409", + "0x11b01c0739c09138094680701ce7024200251901c0739c090b0094700701ce7", + "0xe70244c0259401c0739c0905c091f80701ce70241b024cd01c0739c092d809", + "0x52024e7024520242d01ccd024e7024cd024a101d45024e7024c70256a01c07", + "0x95140939c09514095ac072840939c0928409030070640939c09064092e407", + "0xe702499024cf01c0739c09090094e40701ce70240722407514a10645233499", + "0x94680701ce7024b60251b01c0739c09080094640701ce70242c0251c01c07", + "0x739c09294095a00701ce7024170247e01c0739c0906c093340701ce7024a9", + "0x71200939c09120090b4070300939c0903009284075240939c09338095a807", + "0x9902549024e7025490256b01ccf024e7024cf0240c01c19024e702419024b9", + "0x739c092640933c0701ce7024240253901c0739c0901c8901d4933c191200c", + "0xa90251a01c0739c092d80946c0701ce7024200251901c0739c090b00947007", + "0x701ce7024a50256801c0739c0905c091f80701ce70241b024cd01c0739c09", + "0xb901c39024e7024390242d01c0c024e70240c024a101d4a024e7024350256a", + "0xc264095280939c09528095ac070c40939c090c409030070640939c0906409", + "0x19701c0739c0901c8901c130259604889224e72240901c89654075283106439", + "0x74040706c0939c09264096600705c0939c0922409284072640939c0904809", + "0x70700939c0906409668070640939c0901d0201c0739c0901c8901c0766409", + "0xe7024890251801c1b05c890241b024e70241c0259801c17024e702413024a1", + "0x9128070240939c09024090300701c0939c0901c090b4072841c0641b05c99", + "0x939c892a409670072a4202941239c09048170240704d9b01c12024e702412", + "0x939c0908009030072940939c09294090b40701ce702407224072d80967424", + "0x967c070ac2c2dc1239c0904c19080a504d9e01c13024e7024130244a01c20", + "0x9030072dc0939c092dc090b40701ce70240722407030096802d024e72242b", + "0x310e41239c092641b0b0b704da101c99024e7024990251301c2c024e70242c", + "0x8939c09090096900701ce702407224070d40968c33024e72243a025a201c3a", + "0x739c090c809138070c826224e70242d025a501c0739c090f009138070f03b", + "0x4001cd6024e7024074080701ce7024d50244e01cd51008939c090cc0969807", + "0xe7024d80259001cd8024e7024d634c8963c0734c0939c092841c098400ec99", + "0x939c09118095ac070c40939c090c409030070e40939c090e4090b40711809", + "0xe7024a10251c01c0739c090b40969c0701ce70240722407118310e41202446", + "0x2d01c48024e7024350256a01c0739c09090096a00701ce70241c0251b01c07", + "0x39048091200939c09120095ac070c40939c090c409030070e40939c090e409", + "0x94700701ce702424025a801c0739c090700946c0701ce7024072240712031", + "0x939c09030095a80701ce70241b0251a01c0739c09264091780701ce7024a1", + "0xcf024e7024cf0256b01c2c024e70242c0240c01cb7024e7024b70242d01ccf", + "0x739c0906c094680701ce70241c0251b01c0739c0901c8901ccf0b0b704809", + "0x190253901c0739c0904c0933c0701ce7024990245e01c0739c092840947007", + "0xe7024200240c01ca5024e7024a50242d01c4a024e7024b60256a01c0739c09", + "0x76a40701ce7024120253901c4a080a5048091280939c09128095ac0708009", + "0xe7024170241c01c17024e70240706c072640939c0904c096a80704c0939c09", + "0x126b41c0641b048e72249905c89024136b0072640939c09264096ac0705c09", + "0x1c024e70241c0242401c07024e702407024a101c0739c0901c8901c20294a1", + "0x939c09064090300706c0939c0906c090b407090a9224e70241c01c896b807", + "0x939c092d8096c00701ce702407224072dc096bcb6024e7224240246301c19", + "0xc024e7024190240c01c2d024e70241b0242d01c2b024e7024a9024a101c2c", + "0x92dc091380701ce7024072240701db202407404070e40939c090b0096c407", + "0x70e80939c090e809090070e80939c0901db301c31024e7024070800701ce7", + "0x70ec0939c090cc352242c01c35024e7024072dc070cc0939c090e831224b6", + "0xc01c1b024e70241b0242d01ca9024e7024a9024a101c3c024e70243b02522", + "0xe702407224070f01906ca904c090f00939c090f009484070640939c0906409", + "0x2d024e7024a10242d01c2b024e702407024a101c26024e702420024ef01c07", + "0x70c80939c090e4096d0070e40939c09098096c4070300939c092940903007", + "0x73580939c09100091180701ce70240722407354096d440024e722432024d8", + "0x2d01c2b024e70242b024a101cd8024e7024d30252001cd3024e7024d60251f", + "0x2b04c093600939c0936009484070300939c0903009030070b40939c090b409", + "0x2b024e70242b024a101c46024e7024d50252201c0739c0901c8901cd80302d", + "0x91180939c0911809484070300939c0903009030070b40939c090b4090b407", + "0x7408070480939c0922409224b601c89024e7024070250601c460302d0ac13", + "0x701c0939c0901c090b40704c12224090480939c09048091300704c0939c09", + "0x939c8904c096dc0704c122241239c0902407225b601c09024e7024090240c", + "0x939c0906c096e80706c0939c09264096e40701ce7024072240705c096e099", + "0x92940933c0701ce7024a1025bc01ca9080a52841c264e702419025bb01c19", + "0x70900939c09070096f40701ce7024a90252601c0739c090800933c0701ce7", + "0x1bf01c12024e7024120240c01c89024e7024890242d01cb6024e702424025be", + "0xb7024e702417025c001c0739c0901c8901cb604889048092d80939c092d809", + "0x92dc0939c092dc096fc070480939c0904809030072240939c09224090b407", + "0x704c09704122248939c89024093f4070240939c0901c09048072dc1222412", + "0x990250001c17024e702489024ff01c99024e702412024fe01c0739c0901c89", + "0x10301c19024e7024074080701ce7024072240701dc2024074040706c0939c09", + "0x91480706c0939c09070094000705c0939c0904c093fc070700939c0906409", + "0x70800970ca5024e72241b0250401ca1024e7024a1024ba01ca1024e702417", + "0x24025c401c24024e7024a90250601ca9024e7024a50250501c0739c0901c89", + "0x72d8a1224092d80939c092d809714072840939c09284092e8072d80939c09", + "0xe7024b7025c601cb7024e7024074080701ce7024200244e01c0739c0901c89", + "0x9284070b0a1224090b00939c090b009714072840939c09284092e8070b009", + "0x704dc701c99024e7024990244a01c89024e702489024b901c07024e702407", + "0x72840939c0901c1b01c1c024e702419025aa01c1906c17048e70249904c89", + "0xb72d824049c82a4202941239c89070a10480904dac01ca1024e7024a10241c", + "0x750c0701ce70242c0252601c2b0b08939c092a4094940701ce70240722407", + "0x90ac094180701ce70240c0252601c390308939c090b409494070b40939c09", + "0xe7024390250601c0739c090e809498070cc3a224e7024310252501c31024e7", + "0x939c090cc094180701ce70243b0252601c3c0ec8939c090d409494070d409", + "0x939c090c826225c901c26024e7024260242401c32024e70243c0250601c26", + "0x20024e7024200240c01ca5024e7024a50242d01c40024e7024400242401c40", + "0x18a01cd6024e7024074080701ce702407224073540972c0739c891000972807", + "0xe7024072240701dcc02407404073600939c0934c091b40734c0939c0935809", + "0x6d01c48024e702446025ce01c46024e7024074080701ce7024d5025cd01c07", + "0x90b4071280939c0933c0973c0733c0939c0936009598073600939c0912009", + "0x901d0101c4e024e70244a025d001cce024e7024200240c01c4c024e7024a5", + "0x71300939c09090090b4071400939c092dc097480701ce7024072240701dd1", + "0x6601ccd024e70244e025d301c4e024e702450025d001cce024e7024b60240c", + "0x13c01cc9024e702452024b101c0739c0901c8901c54025d41480939c8933409", + "0x90b40705c0939c0905c09284073180939c0931c094f40731c0939c0932409", + "0xc60253e01cce024e7024ce0240c01c1b024e70241b024b901c4c024e70244c", + "0x58024e7024540253f01c0739c0901c8901cc63381b13017264093180939c09", + "0x706c0939c0906c092e4071300939c09130090b40705c0939c0905c0928407", + "0x8975407160ce06c4c05c9902458024e7024580253e01cce024e7024ce0240c", + "0x939c090480975c0701ce7024072240705c9904c12758122248939c8902407", + "0x8901c077640901d0101c1c024e70241b025d801c19024e702489024a101c1b", + "0xa1024e7024074080701ce7024170255301c0739c092640954c0701ce702407", + "0x90700939c0929409760070640939c0904c09284072940939c092840976807", + "0x72640939c09264090e8072640939c0901c3101c0739c0901d1101c1c06489", + "0x904c097700701ce7024072240707019225db06c17224e7224990240704833", + "0x722407294097740739c89284097280705c0939c0905c092840728413224e7", + "0xe70242022489574070800939c09048097780701ce7024130252601c0739c09", + "0x939c0906c090b40705c0939c0905c09284070900939c092a4093b0072a409", + "0x9294097340701ce702407224070901b05c1202424024e7024240255e01c1b", + "0xe7224b70253201cb72d88939c09224094c4072240939c09224092e80701ce7", + "0xe702407514070b40939c090b012224b601c0739c0901c8901c2b025df0b009", + "0xe70241b0242d01c17024e702417024a101c39024e70240c04c897240703009", + "0x939c090e409090070b40939c090b409130072d80939c092d8092e80706c09", + "0x978035024e7224330249f01c330e831048e7024390b4b606c172655b01c39", + "0x32024e7024260f089574070983c224e7024350247901c0739c0901c8901c3b", + "0x70e80939c090e8090b4070c40939c090c409284071000939c090c8093b007", + "0x939c090ec0957c0701ce702407224071003a0c41202440024e7024400255e", + "0xd5024e7024d50255e01c3a024e70243a0242d01c31024e702431024a101cd5", + "0x739c09048093340701ce7024130252601c0739c0901c8901cd50e83104809", + "0xd8024e7024d3024ec01cd3024e7024d62d889574073580939c090ac0958007", + "0x93600939c09360095780706c0939c0906c090b40705c0939c0905c0928407", + "0x701ce702412024cd01c0739c0904c094980701ce702407224073601b05c12", + "0x912009090071200939c0901cc701c46024e7024070800701ce702489024c6", + "0x933c4a2242c01c4a024e7024072dc0733c0939c0912046224b601c48024e7", + "0xe70241c0242d01c19024e702419024a101cce024e70244c0255f01c4c024e7", + "0x77840701ce7024120251a01cce07019048093380939c09338095780707009", + "0xe7024170241c01c17024e70240706c072640939c0904c096a80704c0939c09", + "0x127881c0641b048e72249905c89024136b0072640939c09264096ac0705c09", + "0x1c024e70241c0242401c07024e702407024a101c0739c0901c8901c20294a1", + "0x939c09064090300706c0939c0906c090b407090a9224e70241c01c8941c07", + "0x939c092d8097900701ce702407224072dc0978cb6024e7224240250801c19", + "0xc024e7024190240c01c2d024e70241b0242d01c2b024e7024a9024a101c2c", + "0x92dc091380701ce7024072240701de602407404070e40939c090b00979407", + "0x70e80939c090e809090070e80939c0901de701c31024e7024070800701ce7", + "0x70ec0939c090cc352242c01c35024e7024072dc070cc0939c090e831224b6", + "0xc01c1b024e70241b0242d01ca9024e7024a9024a101c3c024e70243b02530", + "0xe702407224070f01906ca904c090f00939c090f0093a8070640939c0906409", + "0x2d024e7024a10242d01c2b024e702407024a101c26024e702420025e801c07", + "0x70c80939c090e4097a4070e40939c0909809794070300939c092940903007", + "0x73580939c09100091700701ce70240722407354097a840024e722432024c3", + "0x2d01c2b024e70242b024a101cd8024e7024d30252f01cd3024e7024d60252e", + "0x2b04c093600939c09360093a8070300939c0903009030070b40939c090b409", + "0x2b024e70242b024a101c46024e7024d50253001c0739c0901c8901cd80302d", + "0x91180939c09118093a8070300939c0903009030070b40939c090b4090b407", + "0x904c0904c0704c89224e702489025eb01c0739c0901d1101c460302d0ac13", + "0xe70241b0241901c0739c0905c0905c0706c17224e7024990249901c99024e7", + "0xe70241c048892d8070700939c0907009090070700939c09064097b00706409", + "0x939c09024090b40701c0939c0901c09284072940939c09224091480728409", + "0x9284a50240704ded01ca1024e7024a10244c01ca5024e7024a5024ba01c09", + "0x95e40701ce702407224072dc097b8b6024e7224240257501c242a420048e7", + "0x2d0b0897bc070b40939c0901d0201c0739c090ac09138070ac2c224e7024b6", + "0x92a4090b4070800939c0908009284070e40939c09030093c4070300939c09", + "0x97c40701ce702407224070e4a90801202439024e702439025f001ca9024e7", + "0x31025f001ca9024e7024a90242d01c20024e702420024a101c31024e7024b7", + "0xe70240722407224097cc09024e722407025f201c312a420048090c40939c09", + "0x13024e7024130243901c13024e702412024c901c12024e7024090245401c07", + "0x17024e702489264890b0072640939c0901cb701c0739c0901c8901c1302409", + "0xe7024070241201c1b0240906c0939c0906c090e40706c0939c0905c090ac07", + "0x9048093f80701ce7024072240704c097d0122248939c89024093f40702409", + "0x77d40901d0101c1b024e7024990250001c17024e702489024ff01c99024e7", + "0x13024ff01c1c024e7024190250301c19024e7024074080701ce70240722407", + "0x9284092e8072840939c0905c091480706c0939c09070094000705c0939c09", + "0x9294094140701ce70240722407080097d8a5024e72241b0250401ca1024e7", + "0x92d809498072dcb6224e7024240252501c24024e7024a90250601ca9024e7", + "0x739c090ac09498070b42b224e70242c0252501c2c024e70240750c0701ce7", + "0x701ce7024390252601c310e48939c0903009494070300939c092dc0941807", + "0x10601c0739c090cc09498070d433224e70243a0252501c3a024e70242d02506", + "0x89724070ec0939c090ec09090070f00939c090d409418070ec0939c090c409", + "0x70c8097dc0739c8909809728070980939c0909809090070980939c090f03b", + "0x9354091b4073540939c0910009628071000939c0901d0201c0739c0901c89", + "0x74080701ce702432025cd01c0739c0901c8901c077e00901d0101cd6024e7", + "0x935809598073580939c09360091b4073600939c0934c097380734c0939c09", + "0xe702448025fa01ca1024e7024a1024ba01c48024e702446025f901c46024e7", + "0x939c0901d0201c0739c09080091380701ce70240722407120a12240912009", + "0x4a024e70244a025fa01ca1024e7024a1024ba01c4a024e7024cf025fb01ccf", + "0x89024b901c07024e702407024a101c1906c8939c0904c0958c07128a122409", + "0xa52841c048e7024990648901c1371c072640939c0926409128072240939c09", + "0x1c01c24024e70240706c072a40939c09294096a8070800939c0905c097f007", + "0x70b42b0b0127f4b72d88939c89080a909012024993c0070900939c0909009", + "0x92d8090b4070e40939c09030097f8070300939c0901d0201c0739c0901c89", + "0x78000901d0101c33024e702439025ff01c3a024e7024b70240c01c31024e7", + "0x9030070c40939c090b0090b4070d40939c090b4098040701ce70240722407", + "0x3b0260301c3b024e7024330260201c33024e702435025ff01c3a024e70242b", + "0x1b2260601c32024e70243c0260501c0739c0901c8901c26026040f00939c89", + "0x310242d01c1c024e70241c024a101cd5024e7024400260701c40024e702432", + "0x935409820070e80939c090e809030072840939c09284092e4070c40939c09", + "0x20901c0739c0906c094700701ce702407224073543a2843107099024d5024e7", + "0x92e4070c40939c090c4090b4070700939c0907009284073580939c0909809", + "0x3107099024d6024e7024d60260801c3a024e70243a0240c01ca1024e7024a1", + "0x939c0904c096a8072640939c09048094900704c0939c0901e0a01cd60e8a1", + "0x701ce70241c0251901c1c0648939c092240982c0706c0939c0901c1b01c17", + "0xe72249905c1b02407264f001c17024e702417025ab01c1b024e70241b0241c", + "0xb6025fe01cb6024e7024074080701ce70240722407090a908012830a528489", + "0x92dc097fc070ac0939c0929409030070b00939c09284090b4072dc0939c09", + "0x2d01c0c024e7024240260101c0739c0901c8901c078340901d0101c2d024e7", + "0x9808070b40939c09030097fc070ac0939c092a409030070b00939c0908009", + "0x98140701ce702407224070e80983831024e7224390260301c39024e70242d", + "0x90b4070ec0939c090d409840070d40939c090cc192260f01c33024e702431", + "0x2b0b0120243b024e70243b024ee01c2b024e70242b0240c01c2c024e70242c", + "0x90b4070f00939c090e8098440701ce7024190251901c0739c0901c8901c3b", + "0x2b0b0120243c024e70243c024ee01c2b024e70242b0240c01c2c024e70242c", + "0x705c0939c0904c096a8072640939c09048094900704c0939c0901da901c3c", + "0x90700701ce70241c0253901c1c0648939c09224095dc0706c0939c0901c1b", + "0xa1224e72249905c1b02407264f001c17024e702417025ab01c1b024e70241b", + "0xe7024b6025fe01cb6024e7024074080701ce70240722407090a908012848a5", + "0x939c092dc097fc070ac0939c0929409030070b00939c09284090b4072dc09", + "0x200242d01c0c024e7024240260101c0739c0901c8901c0784c0901d0101c2d", + "0x90b409808070b40939c09030097fc070ac0939c092a409030070b00939c09", + "0x90c4098140701ce702407224070e80985031024e7224390260301c39024e7", + "0x90b0090b4070ec0939c090d409858070d40939c090cc192261501c33024e7", + "0x70ec2b0b0120243b024e70243b0261701c2b024e70242b0240c01c2c024e7", + "0x90b0090b4070f00939c090e8098600701ce7024190253901c0739c0901c89", + "0x70f02b0b0120243c024e70243c0261701c2b024e70242b0240c01c2c024e7", + "0x706c0705c0939c0904c096a8072640939c09048092f00704c0939c0901de1", + "0x906c090700701ce70241c0251a01c1c0648939c09224095b40706c0939c09", + "0x219294a1224e72249905c1b02407264f001c17024e702417025ab01c1b024e7", + "0xb7024e7024b6025fe01cb6024e7024074080701ce70240722407090a908012", + "0x70b40939c092dc097fc070ac0939c0929409030070b00939c09284090b407", + "0xe7024200242d01c0c024e7024240260101c0739c0901c8901c078680901d01", + "0x939c090b409808070b40939c09030097fc070ac0939c092a409030070b009", + "0x939c090c4098140701ce702407224070e80986c31024e7224390260301c39", + "0x939c090b0090b4070ec0939c090d409874070d40939c090cc192261c01c33", + "0x7224070ec2b0b0120243b024e70243b0261e01c2b024e70242b0240c01c2c", + "0x939c090b0090b4070f00939c090e80987c0701ce7024190251a01c0739c09", + "0x894d0070f02b0b0120243c024e70243c0261e01c2b024e70242b0240c01c2c", + "0x72640939c09048094d80701ce7024072240704c09880122248939c8902407", + "0x901c8901c078840901d0101c1b024e7024990253701c17024e702489024a1", + "0x17024e702413024a101c1c024e7024190253801c19024e7024074080701ce7", + "0x8901c89026230240939c8901c098880706c172240906c0939c09070094dc07", + "0x904c094840704c0939c0904809480070480939c090240947c0701ce702407", + "0x9224992242c01c99024e7024072dc0701ce7024072240704c0902413024e7", + "0x898900706c090241b024e70241b0252101c1b024e7024170252201c17024e7", + "0xe7024130262601c0739c0901c8901c1b05c9904a2504c122241239c8902407", + "0x939c090640989c072840939c0904809030070700939c09224090b40706409", + "0x990242d01c20024e70241b0262901c0739c0901c8901c078a00901d0101ca5", + "0x9294098a8072940939c090800989c072840939c0905c09030070700939c09", + "0x9090096e40701ce702407224072d8098ac24024e7224a9025b701ca9024e7", + "0xe70241c0242d01c2b024e70242c0262c01c2c024e7024b7024ed01cb7024e7", + "0x8901c2b2841c048090ac0939c090ac098b4072840939c09284090300707009", + "0x928409030070700939c09070090b4070b40939c092d8098b80701ce702407", + "0x12401c0739c0922409470070b4a1070120242d024e70242d0262d01ca1024e7", + "0x170263101c17024e7024990263001c99024e7024078bc0704c0939c0904809", + "0x23001c1c0648939c0904c1b024128c80706c0939c0906c090900706c0939c09", + "0x898cc072940939c0929409090072940939c09284098c4072840939c0907009", + "0x23401c19024e702419024b901c20024e702420024a101ca90808939c0929407", + "0x722407224098d809024e7224070263501ca906420048092a40939c092a409", + "0xe7024130253e01c13024e7024120253d01c12024e7024090253c01c0739c09", + "0xe702489264890b0072640939c0901cb701c0739c0901c8901c130240904c09", + "0x70263701c1b0240906c0939c0906c094f80706c0939c0905c094fc0705c09", + "0x120252f01c12024e7024090252e01c0739c0901c8901c89026380240939c89", + "0x901cb701c0739c0901c8901c130240904c0939c0904c093a80704c0939c09", + "0x906c093a80706c0939c0905c094c00705c0939c09224992242c01c99024e7", + "0xe7024130243a01c13024e7024070c40701ce7024074440706c090241b024e7", + "0x1201c0739c0901c8901c1906c898e4172648939c8904c0901c120cc0704c09", + "0x89070093f4072640939c09264092840701ce7024073f0070700939c0922409", + "0xa1024ff01ca9024e7024a5024fe01c0739c0901c8901c200263a294a1224e7", + "0x701ce7024072240701e3b02407404072d80939c092a409400070900939c09", + "0x9400070900939c09080093fc070b00939c092dc0940c072dc0939c0901d02", + "0x74440701ce702407224070b4098f02b024e7224b60250401cb6024e70242c", + "0xe7024120244c01c0c024e70240c0242401c0c024e70242b0250501c0739c09", + "0xe7024240245201c0739c090c409138070c439224e7024120308949c0704809", + "0x939c090e8092e80705c0939c0905c090b4072640939c0926409284070e809", + "0x95d4070ec350cc1239c090e43a05c9904ded01c39024e7024390244c01c3a", + "0x4e01c400c88939c090f0095e40701ce70240722407098098f43c024e72243b", + "0x320244c01cd6024e7024350242d01cd5024e702433024a101c0739c0910009", + "0x73600939c09098097c40701ce7024072240701e3e024074040734c0939c09", + "0x12024d8024e7024d8025f001c35024e7024350242d01c33024e702433024a1", + "0x94580701ce70242d0244e01c0739c0901d1101c0739c0901c8901cd80d433", + "0x904809130073580939c0905c090b4073540939c09264092840701ce702424", + "0xe702448024f101c48024e70244634c897bc071180939c0901d0201cd3024e7", + "0x939c0933c097c0073580939c09358090b4073540939c09354092840733c09", + "0xe702489024c601c0739c09048093340701ce7024072240733cd635412024cf", + "0xb601c4c024e70244c0242401c4c024e70240731c071280939c0901c2001c07", + "0x1f101c50024e7024ce138890b0071380939c0901cb701cce024e70244c12889", + "0x97c0070640939c09064090b40706c0939c0906c09284073340939c0914009", + "0x901c8901c89026400240939c8901c098fc073341906c12024cd024e7024cd", + "0x939c0904c0990c0704c0939c0904809908070480939c09024099040701ce7", + "0x939c09224992242c01c99024e7024072dc0701ce7024072240704c0902413", + "0x8901c099140706c090241b024e70241b0264301c1b024e7024170264401c17", + "0x9048098b0070480939c09024093b40701ce702407224072240991809024e7", + "0xe7024072dc0701ce7024072240704c0902413024e7024130262d01c13024e7", + "0xe70241b0262d01c1b024e7024170262e01c17024e702489264890b00726409", + "0x5c2500704c07048890240724c5c2500704c3a1709401c133381b0240906c09", + "0x901c931709401c5e2643a1709401c5e26507048890240724c5c2500704c3a", + "0x9401c1390c13048890240724c5c25007178990e85c25007178996241304889", + "0x890240726c5c2500704c6b1709401c1391c122240901c931709401c130e85c", + "0x120e8072264a024072745c2501217094226490240705c13224130b48992012", + "0x9904c122240901ca01705e250072642d1ac5c1789401c1792c0901c9f0e807", + "0x120e89401c129380901ca70e8070483a01c899340901c1704c8904c242264c", + "0x89024072a85c1789401c9904c740b46b1705e250070664f2240901ca825007", + "0x5c250120802d0b46b1709405e51024072d0072240901c899401b05c9904c12", + "0x922653048890240726c5c2500704c4a1709401c139489904c122240901caa", + "0x17958072e83a2243a02655024072e45c2501217094226540240705c1322413", + "0xbc01c8902407226572641304889024072805c1789401c990b4521705e25007", + "0x131185c2500704e5904c122240901ca8250070480904c3a250072665802407", + "0xc60265b048890240730c9401c1204c312500704e5a04889024072745c25007", + "0xc91705e25007264240b4521705e2500706e5d01cc70e8890e8099700724c09", + "0x5c2501397c122240901ccd170940482d1385c2501397817264130488902407", + "0x261048890240733c5c25012080461709404e6004889024073385c250120b44a", + "0x264024073545c25012170942266301c9b024d6026620240727c072240901c89", + "0x7274092a40999807280092d809994122240901cd8178070482d1485e01c13", + "0xd5024990266901ca1024a502668048890240730c9401c1204c3a2500704e67", + "0x9a807" + ], + "sierra_program_debug_info": { + "type_names": [], + "libfunc_names": [], + "user_func_names": [] + }, + "contract_class_version": "0.1.0", + "entry_points_by_type": { + "EXTERNAL": [ + { + "selector": "0x6bb652563f60fe749b3405622dafcec0416409827726a908f4811df4cb67f5", + "function_idx": 2 + }, + { + "selector": "0x2e0414d80a2231d5dce68f6dfc3d0d4c7d25fd9e6d9a7cd492fc3e99bdf70b2", + "function_idx": 1 + }, + { + "selector": "0x331e2c619722fac6cb21a343fa0352f55748127ffb0b05d5e03313658c6ef05", + "function_idx": 0 + }, + { + "selector": "0x3d05b7bc194a1006aecda433c763ca000b3382f88e41ceeb3e7f636bc582473", + "function_idx": 3 + } + ], + "L1_HANDLER": [], + "CONSTRUCTOR": [ + { + "selector": "0x28ffe4ff0f226a9107253e17a904099aa4f63a02a5621de0576e5aa71bc5194", + "function_idx": 4 + } + ] + }, + "abi": [ + { + "type": "impl", + "name": "MerkleVerifyContract", + "interface_name": "airdrop_poseidon::airdrop_poseidon::IMerkleVerify" + }, + { + "type": "enum", + "name": "core::bool", + "variants": [ + { + "name": "False", + "type": "()" + }, + { + "name": "True", + "type": "()" + } + ] + }, + { + "type": "struct", + "name": "core::integer::u256", + "members": [ + { + "name": "low", + "type": "core::integer::u128" + }, + { + "name": "high", + "type": "core::integer::u128" + } + ] + }, + { + "type": "interface", + "name": "airdrop_poseidon::airdrop_poseidon::IMerkleVerify", + "items": [ + { + "type": "function", + "name": "get_merkle_address", + "inputs": [], + "outputs": [ + { + "type": "core::starknet::contract_address::ContractAddress" + } + ], + "state_mutability": "view" + }, + { + "type": "function", + "name": "get_time", + "inputs": [], + "outputs": [ + { + "type": "core::integer::u64" + } + ], + "state_mutability": "view" + }, + { + "type": "function", + "name": "is_address_airdropped", + "inputs": [ + { + "name": "address", + "type": "core::starknet::contract_address::ContractAddress" + } + ], + "outputs": [ + { + "type": "core::bool" + } + ], + "state_mutability": "view" + }, + { + "type": "function", + "name": "request_airdrop", + "inputs": [ + { + "name": "address", + "type": "core::starknet::contract_address::ContractAddress" + }, + { + "name": "amount", + "type": "core::integer::u256" + }, + { + "name": "proof", + "type": "core::array::Array::" + } + ], + "outputs": [], + "state_mutability": "external" + } + ] + }, + { + "type": "constructor", + "name": "constructor", + "inputs": [ + { + "name": "erc20_address", + "type": "core::starknet::contract_address::ContractAddress" + }, + { + "name": "merkle_address", + "type": "core::starknet::contract_address::ContractAddress" + }, + { + "name": "start_time", + "type": "core::integer::u64" + } + ] + }, + { + "type": "event", + "name": "airdrop_poseidon::airdrop_poseidon::merkle_verify::Event", + "kind": "enum", + "variants": [] + } + ] +} \ No newline at end of file diff --git a/cairo/merkleTreeVerify.md b/cairo/merkleTreeVerify.md new file mode 100644 index 0000000..bb2c51b --- /dev/null +++ b/cairo/merkleTreeVerify.md @@ -0,0 +1,193 @@ +# Cairo contracts for Merkle tree verification + +These 2 contracts are used in Starknet as libraries, to verify a proof of a Merkle tree created with the JS/TS starknet-merkle-tree library. + +## Location : + +Classes available in Starknet Mainnet, Goerli Testnet and Sepolia Testnet : +| Tree hash | Class hash | +| :---: | ---: | +| **Pedersen class hash** | Soon | +| **Poseidon class hash** | `0x03e2efc98f902c0b33eee6c3daa97b941912bcab61b6162884380c682e594eaf`| + +## Deployment : + +For each Merkle tree, you have to deploy a new instance of one of these 2 classes (choose Pedersen or Poseidon, in accordance with the tree that you have created). The constructor includes only one information : the root of this tree. By this way, this deployment is cost effective : no declaration of class (already made) and a very small storage space (only one felt). +Example with Starknet.js : +```typescript +const MERKLE_CLASS_HASH_PEDERSEN = "Soon"; +const MERKLE_CLASS_HASH_POSEIDON = "0x03e2efc98f902c0b33eee6c3daa97b941912bcab61b6162884380c682e594eaf"; +const tree = Merkle.StarknetMerkleTree.load( + JSON.parse(fs.readFileSync('./treeTestPoseidon.json', 'ascii')) + ); +const myConstructorMerkleVerify: Calldata = CallData.compile([tree.root]); +const deployResponse = await account0.deployContract({ + // 👇👇👇 change here to PEDERSEN or POSEIDON + classHash: MERKLE_CLASS_HASH_POSEIDON, + constructorCalldata: myConstructorMerkleVerify +}); +const MerkleVerifyAddress = deployResponse.contract_address; +``` + +> Today, the Cairo source code of these two contracts is not public. + +## Usage : +You have to create/declare/deploy your dedicated smart-contract (called here contract 2) to handle the Airdrop (list of already performed airdrops, distribution of tokens, timing, administration, etc..). +This contract 2 has to call the contract deployed above (called here contract 1) to verify if the data are correct and are part of the Merkle tree. +Contract 1 is able to say if an address and the corresponding data are included in the tree or not. Just by storing a felt252 in Starknet, you can check that an address is included in a list of thousand of addresses, and trigger in contract 2 a distribution of token to this address. +Hereunder an extract of an example of a Contract 2 that call Contract 1 to verify a proof : +```rust +... +fn constructor( + ref self: ContractState, + erc20_address: ContractAddress, + merkle_address: ContractAddress, + start_time: u64, +) +... +fn request_airdrop( + ref self: ContractState, address: ContractAddress, amount: u256, proof: Array +) { + let already_airdropped: bool = self.airdrop_performed.read(address); + assert(!already_airdropped, "Address already airdropped"); + let current_time: u64 = get_block_timestamp(); + let airdrop_start_time: u64 = self.start_time.read(); + assert(current_time >= airdrop_start_time, "Airdrop has not started yet."); + let mut call_data: Array = ArrayTrait::new(); + call_data.append(address.into()); + call_data.append(amount.low.into()); + call_data.append(amount.high.into()); + Serde::serialize(@proof, ref call_data); + let mut is_leave_valid = starknet::call_contract_syscall( + self.merkle_address.read(), selector!("verify_from_leaf_airdrop"), call_data.span() + ) + .unwrap_syscall(); + let mut is_request_valid: bool = Serde::::deserialize(ref is_leave_valid) + .unwrap(); + assert(is_request_valid, "Proof not valid."); // revert if not valid + // Airdrop + // Register the address as already airdropped + // to be sure to perform the airdrop only once per address. + self.airdrop_performed.write(address, true); + // Perform here your transfer of token. + // if needed, create some events. + return (); +} +``` +> The Cairo source code is [here](./airdrop_poseidon.cairo) + +This example has been deployed in Sepolia at this address : `0x54c81caa64bce9a169a7d8975c1610536b3adf4599f9bdd2a5e99054e4d4c64` + +In your DAPP, you can call the contract 2 this way (here with Starknet.js) : +```typescript +const compiledTest = json.parse(fs.readFileSync("./airdrop_poseidon.sierra.json").toString("ascii")); +const myContract = new Contract(compiledTest.abi, AIRDROP_ADDRESS, account0); + +const tree = Merkle.StarknetMerkleTree.load( + JSON.parse(fs.readFileSync('./treeTestPoseidon.json', 'ascii')) + ); +const leaf=tree.getInputData(3); +const proof=tree.getProof(3); + +const result0 = await myContract.is_address_airdropped(leaf[0]); +console.log("Is address already airdropped =", result0); + +const amount: Uint256 = { low: leaf[1], high: leaf[2] }; +const myCall = myContract.populate("request_airdrop", { + address: leaf[0], + amount, + proof +}) +const txResp = await account0.execute(myCall); +console.log("executed..."); +await provider.waitForTransaction(txResp.transaction_hash); +const result1 = await myContract.is_address_airdropped(leaf[0]); +console.log("result from airdrop request =", result1); +``` + +## API : + +Contract 2 has to be deployed with a constructor including the address of your deployed Contract 1. +```rust +fn constructor( + ref self: ContractState, + erc20_address: ContractAddress, + merkle_address: ContractAddress, // address of Contract 1 + start_time: u64, + ) +``` +This value has to be stored in the contract. + +### hash_leaf_array() : + +Calculate the Pedersen/Poseidon hash of a Merkle tree leaf. +Input is an array of felt252 that contains all the data of a leaf. + +```rust +fn hash_leaf_array(self: @ContractState, mut leaf: Array) -> felt252 +``` +Example of Contract 2 : +```rust +let mut hash = starknet::call_contract_syscall( + self.merkle_address.read(), selector!("hash_leaf_array"), leaf.span() +) + .unwrap_syscall(); +let mut leave_hash: felt252 = Serde::::deserialize(ref hash) + .unwrap(); +``` + +### verify_from_leaf_hash() : + +From the hash and the proof of a leaf, verify that this leaf is included in the Merkle tree. +```rust +fn verify_from_leaf_hash(self: @ContractState, leaf_hash: felt252, proof: Array) -> bool +``` +Example of Contract 2 : +```rust +let mut call_data: Array = ArrayTrait::new(); +call_data.append(leaf_hash); +Serde::serialize(@proof, ref call_data); +let mut hash_valid = starknet::call_contract_syscall( + self.merkle_address.read(), selector!("verify_from_leaf_hash"), call_data.span() +) + .unwrap_syscall(); +let mut is_request_valid: bool = Serde::::deserialize(ref is_leave_valid) + .unwrap(); +``` + + +### verify_from_leaf_array() : +From the content and the proof of a leaf, verify that this leaf is included in the Merkle tree. +```rust +fn verify_from_leaf_array(self: @ContractState, leaf_array: Array, proof: Array) -> bool +``` +Example of Contract 2 : +```rust +let mut call_data: Array = ArrayTrait::new(); +Serde::serialize(@leaf_array, ref call_data); +Serde::serialize(@proof, ref call_data); +let mut hash_valid = starknet::call_contract_syscall( + self.merkle_address.read(), selector!("verify_from_leaf_array"), call_data.span() +) + .unwrap_syscall(); +let mut is_request_valid: bool = Serde::::deserialize(ref is_leave_valid) + .unwrap(); +``` + +### verify_from_leaf_airdrop() : +To use for a Merkle tree with leaves including (only) : address, u256 amount (low and high). +From address, amount and the proof of a leaf, verify that these data are included in the Merkle tree. +Example of Contract 2 : +```rust +let mut call_data: Array = ArrayTrait::new(); +call_data.append(address.into()); +call_data.append(amount.low.into()); +call_data.append(amount.high.into()); +Serde::serialize(@proof, ref call_data); +let mut is_leave_valid = starknet::call_contract_syscall( + self.merkle_address.read(), selector!("verify_from_leaf_airdrop"), call_data.span() +) + .unwrap_syscall(); +let mut is_request_valid: bool = Serde::::deserialize(ref is_leave_valid) + .unwrap(); +``` diff --git a/cairo/merkle_verify_poseidon.abi.json b/cairo/merkle_verify_poseidon.abi.json new file mode 100644 index 0000000..e49bbdb --- /dev/null +++ b/cairo/merkle_verify_poseidon.abi.json @@ -0,0 +1,150 @@ +{ + "abi": [ + { + "type": "impl", + "name": "MerkleVerifyContract", + "interface_name": "merkle_verify_poseidon::merkle_verify_poseidon::IMerkleVerify" + }, + { + "type": "enum", + "name": "core::bool", + "variants": [ + { + "name": "False", + "type": "()" + }, + { + "name": "True", + "type": "()" + } + ] + }, + { + "type": "struct", + "name": "core::integer::u256", + "members": [ + { + "name": "low", + "type": "core::integer::u128" + }, + { + "name": "high", + "type": "core::integer::u128" + } + ] + }, + { + "type": "interface", + "name": "merkle_verify_poseidon::merkle_verify_poseidon::IMerkleVerify", + "items": [ + { + "type": "function", + "name": "get_root", + "inputs": [], + "outputs": [ + { + "type": "core::felt252" + } + ], + "state_mutability": "view" + }, + { + "type": "function", + "name": "verify_from_leaf_hash", + "inputs": [ + { + "name": "leaf_hash", + "type": "core::felt252" + }, + { + "name": "proof", + "type": "core::array::Array::" + } + ], + "outputs": [ + { + "type": "core::bool" + } + ], + "state_mutability": "view" + }, + { + "type": "function", + "name": "verify_from_leaf_array", + "inputs": [ + { + "name": "leaf_array", + "type": "core::array::Array::" + }, + { + "name": "proof", + "type": "core::array::Array::" + } + ], + "outputs": [ + { + "type": "core::bool" + } + ], + "state_mutability": "view" + }, + { + "type": "function", + "name": "verify_from_leaf_airdrop", + "inputs": [ + { + "name": "address", + "type": "core::starknet::contract_address::ContractAddress" + }, + { + "name": "amount", + "type": "core::integer::u256" + }, + { + "name": "proof", + "type": "core::array::Array::" + } + ], + "outputs": [ + { + "type": "core::bool" + } + ], + "state_mutability": "view" + }, + { + "type": "function", + "name": "hash_leaf_array", + "inputs": [ + { + "name": "leaf", + "type": "core::array::Array::" + } + ], + "outputs": [ + { + "type": "core::felt252" + } + ], + "state_mutability": "view" + } + ] + }, + { + "type": "constructor", + "name": "constructor", + "inputs": [ + { + "name": "merkle_root", + "type": "core::felt252" + } + ] + }, + { + "type": "event", + "name": "merkle_verify_poseidon::merkle_verify_poseidon::merkle::Event", + "kind": "enum", + "variants": [] + } + ] +} \ No newline at end of file diff --git a/package.json b/package.json index 80f7255..f56fdfd 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "starknet-merkle-tree", - "version": "1.0.0", + "version": "1.0.1", "description": "To use Merkle trees with Starknet", "main": "dist/index.js", "module": "dist/index.mjs", diff --git a/src/index.ts b/src/index.ts index 7942642..3485960 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,4 +1,3 @@ -/* eslint-disable prettier/prettier */ import { ec, num, encode } from 'starknet'; // *************************************************************** diff --git a/typescript/4.deployMerkleVerify.ts b/typescript/4.deployMerkleVerify.ts new file mode 100644 index 0000000..9f937de --- /dev/null +++ b/typescript/4.deployMerkleVerify.ts @@ -0,0 +1,82 @@ +// script valid for Pedersen and Poseidon, for all networks. +// Deploy a contract to verify a Pedersen/Poseidon Merkle tree +// Coded with Starknet.js v6.0.0-beta.11 and Starknet-devnet-rs (compatible rpc 0.6.0) +// launch with npx ts-node 4.deployMerkleVerify.ts + +import { Account, Call, Calldata, CallData, constants, Contract, json, RPC, RpcProvider, shortString } from 'starknet'; +import { account5TestnetAddress, account5TestnetPrivateKey } from "../../A1priv/A1priv"; +import { infuraKey, account1MainnetAddress, account1MainnetPrivateKey, blastKey } from "../../A-MainPriv/mainPriv"; +import { account0OZSepoliaAddress, account0OZSepoliaPrivateKey } from "../../A1priv/A1priv"; +import { resetDevnetNow } from '../utils/resetDevnetFunc'; + +import fs from "fs"; +import * as dotenv from "dotenv"; +dotenv.config(); + +// 👇👇👇 +// 🚨🚨🚨 launch starknet-devnet-rs 'cargo run --release -- --seed 0' before using this script +// 👆👆👆 + +async function main() { + // initialize Provider. Adapt to your needs + // Starknet-devnet-rs + const provider = new RpcProvider({ nodeUrl: "http://127.0.0.1:5050/rpc" }); + // Goerli Testnet + // const provider = new RpcProvider({ nodeUrl: 'https://starknet-testnet.blastapi.io/' + blastKey + "/rpc/v0_6" }); + // local Pathfinder Sepolia Testnet node : + // const provider = new RpcProvider({ nodeUrl: "http://192.168.1.7:9545/rpc/v0_6" }); + // local Pathfinder Sepolia Integration node : + //const provider = new RpcProvider({ nodeUrl: "http://192.168.1.44:9550/rpc/v0_6" }); + // local Juno mainnet : + //const provider = new RpcProvider({ nodeUrl: "http://192.168.1.7:6060/v0_6" }); //v0.6.0 + + // Check that communication with provider is OK + const ch = await provider.getChainId(); + console.log("chain Id =", shortString.decodeShortString(ch), ", rpc", await provider.getSpecVersion()); + + // initialize account. Adapt to your case + // *** Devnet-rs + const privateKey0 = "0x71d7bb07b9a64f6f78ac4c816aff4da9"; + const accountAddress0: string = "0x64b48806902a367c8598f4f95c305e8c1a1acba5f082d294a43793113115691"; + // *** initialize existing Argent X Goerli Testnet account + // const privateKey0 = account5TestnetPrivateKey; + // const accountAddress0 = account5TestnetAddress + + // *** initialize existing Argent X mainnet account + // const privateKey0 = account1MainnetPrivateKey; + // const accountAddress0 = account1MainnetAddress + + // *** initialize existing Sepolia Testnet account + //const privateKey0 = account0OZSepoliaPrivateKey; + //const accountAddress0 = account0OZSepoliaAddress; + + // *** initialize existing Sepolia Integration account + // const privateKey0 = account1IntegrationOZprivateKey; + // const accountAddress0 = account1IntegrationOZaddress; + + const account0 = new Account(provider, accountAddress0, privateKey0, undefined, constants.TRANSACTION_VERSION.V2); + console.log('existing_ACCOUNT_ADDRESS=', accountAddress0); + console.log('existing account connected.\n'); + + // deploy MerkleVerify + const MERKLE_CLASS_HASH_PEDERSEN = "TBD"; + const MERKLE_CLASS_HASH_POSEIDON = "0x03e2efc98f902c0b33eee6c3daa97b941912bcab61b6162884380c682e594eaf"; + const root = "0x4bad3f80e8041eb3d32432fa4aed9f904db8c8ab34109879a99da696a0c5a81" + const myConstructorMerkleVerify: Calldata = CallData.compile([root]); + const deployResponse = await account0.deployContract({ + // 👇👇👇 change here to PEDERSEN or POSEIDON + classHash: MERKLE_CLASS_HASH_POSEIDON, + constructorCalldata: myConstructorMerkleVerify + }); + const MerkleVerifyAddress = deployResponse.contract_address; + console.log("MerkleVerify contract :"); + console.log("address =", MerkleVerifyAddress); + + console.log("✅ test completed."); +} +main() + .then(() => process.exit(0)) + .catch((error) => { + console.error(error); + process.exit(1); + }); \ No newline at end of file diff --git a/typescript/5.deployAirdropPoseidonDevnet.ts b/typescript/5.deployAirdropPoseidonDevnet.ts new file mode 100644 index 0000000..b01b9a9 --- /dev/null +++ b/typescript/5.deployAirdropPoseidonDevnet.ts @@ -0,0 +1,57 @@ +// Declare/Deploy a demo of Airdrop contract +// Coded with Starknet.js v6.0.0-beta.11 and Starknet-devnet-rs (compatible rpc 0.6.0) +// launch with npx ts-node 5.deployAirdropPoseidonDevnet.ts + +import { Account, json, Contract, RpcProvider, RPC, Call, Calldata, CallData } from "starknet"; +import * as dotenv from "dotenv"; +import fs from "fs"; +dotenv.config(); + +// 👇👇👇 +// 🚨🚨🚨 launch 'starknet-devnet --seed 0' before using this script +// 👆👆👆 +async function main() { + const provider = new RpcProvider({ nodeUrl: "http://127.0.0.1:5050/rpc" }); // only for starknet-devnet-rs + console.log("Provider connected to Starknet-devnet-rs"); + + // initialize existing pre-deployed account 0 of Devnet + console.log('OZ_ACCOUNT_ADDRESS=', process.env.OZ_ACCOUNT0_DEVNET_ADDRESS); + const privateKey0 = process.env.OZ_ACCOUNT0_DEVNET_PRIVATE_KEY ?? ""; + const accountAddress0: string = process.env.OZ_ACCOUNT0_DEVNET_ADDRESS ?? ""; + const account0 = new Account(provider, accountAddress0, privateKey0, undefined, RPC.ETransactionVersion.V2); + console.log("Account 0 connected.\n In progress..."); + + // declare/deploy Airdrop test + const compiledSierraAirdrop = json.parse(fs.readFileSync("./compiledContracts/cairo240/airdrop_poseidon.sierra.json").toString("ascii")); + const compiledCasmAirdrop = json.parse(fs.readFileSync("./compiledContracts/cairo240/airdrop_poseidon.casm.json").toString("ascii")); + // 👇👇👇 + // 🚨🚨🚨 Change addresses following execution of scripts src/scripts/merkleTree/2a.deployMerkleVerifPoseidonDevnet.ts + const ERC20_ADDRESS = "0x7fb43edfc864a456381fb22312f376a69ac77ff8537f008e4601f9a2ae7b4a9"; + const MERKLE_VERIF_ADDRESS = "0x245005f166163ea9d7ecdad262c69bd313caa5618e6093e62b28130240ba2a0"; + // 👆👆👆 + const myCallAirdrop = new CallData(compiledSierraAirdrop.abi); + const myConstructorAirdrop: Calldata = myCallAirdrop.compile("constructor", { + erc20_address: ERC20_ADDRESS, + merkle_address: MERKLE_VERIF_ADDRESS, + start_time: 0, // no date of airdrop start + }); + const deployResponse = await account0.declareAndDeploy({ + contract: compiledSierraAirdrop, + casm: compiledCasmAirdrop, + constructorCalldata: myConstructorAirdrop + }); + + const airdropAddress = deployResponse.deploy.contract_address; + const airdropClassHash = deployResponse.declare.class_hash; + console.log("Airdrop contract :"); + console.log("class_hash =", airdropClassHash); + console.log("address =", airdropAddress); + + console.log("✅ test completed."); +} +main() + .then(() => process.exit(0)) + .catch((error) => { + console.error(error); + process.exit(1); + }); \ No newline at end of file diff --git a/typescript/6.testAirdropPoseidonDevnet.ts b/typescript/6.testAirdropPoseidonDevnet.ts new file mode 100644 index 0000000..c4efbf1 --- /dev/null +++ b/typescript/6.testAirdropPoseidonDevnet.ts @@ -0,0 +1,68 @@ +// Test a Merkle tree hashed with Poseidon. +// Coded with Starknet.js v6.0.0-beta.11 and Starknet-devnet-rs (compatible rpc 0.6.0) +// launch with npx ts-node 6.testAirdropPoseidonDevnet.ts + +import { Account, json, Contract, RpcProvider, RPC, num, uint256, Uint256 } from "starknet"; +import * as dotenv from "dotenv"; +import fs from "fs"; +dotenv.config(); + +// 👇👇👇 +// 🚨🚨🚨 Launch first the scripts src/scripts/merkleTree/2a.deployMerklePoseidon.ts & src/scripts/merkleTree/5.deployAirdropPoseidonDevnet.ts +// 🚨🚨🚨 launch starknet-devnet-rs 'cargo run --release -- --seed 0' before using this script +// 👆👆👆 +async function main() { + const provider = new RpcProvider({ nodeUrl: "http://127.0.0.1:5050/rpc" }); // only for starknet-devnet-rs + console.log("Provider connected to Starknet-devnet-rs"); + + // initialize existing pre-deployed account 0 of Devnet + console.log('OZ_ACCOUNT_ADDRESS=', process.env.OZ_ACCOUNT0_DEVNET_ADDRESS); + console.log('OZ_ACCOUNT_PRIVATE_KEY=', process.env.OZ_ACCOUNT0_DEVNET_PRIVATE_KEY); + const privateKey0 = process.env.OZ_ACCOUNT0_DEVNET_PRIVATE_KEY ?? ""; + const accountAddress0: string = process.env.OZ_ACCOUNT0_DEVNET_ADDRESS ?? ""; + const account0 = new Account(provider, accountAddress0, privateKey0, undefined, RPC.ETransactionVersion.V2); + console.log("Account 0 connected.\n"); + + // Connect the Airdrop deployed contract in devnet + // 👇👇👇 + // modify with the Airdrop address resulting of 5.deployAirdropPoseidonDevnet.ts : + const AIRDROP_ADDRESS = "0x1593c3a733fce488f149d03ddd1886882713f794feb314ba7dc98f2b020d8ec"; + // 👆👆👆 + const compiledTest = json.parse(fs.readFileSync("./compiledContracts/cairo240/airdrop_poseidon.sierra.json").toString("ascii")); + const myContract = new Contract(compiledTest.abi, AIRDROP_ADDRESS, account0); + console.log(myContract.functions); + console.log('Contract connected at =', myContract.address, "\n"); + + // Interactions with the contract with call + // // proof recovered from the server : + const leaf = ['0x7e00d496e324876bbc8531f2d9a82bf154d1a04a50218ee74cdd372f75a551a', '26', '0']; + const proof = [ + '0x40a6dba21b22596e979a1555a278ca58c11b5cd5e46f5801c1af8c4ab518845', + '0x7957d036cf1e60858a601df12e0fb2921114d4b5facccf638163e0bb2be3c34', + '0x12677ed42d2f73c92413c30d04d0b88e771bf2595c7060df46f095f2132eca2' + ]; + const result0 = await myContract.is_address_airdropped(leaf[0]); + console.log("Is address already airdropped =", result0); + + const amount: Uint256 = { low: leaf[1], high: leaf[2] }; + const myCall = myContract.populate("request_airdrop", { + address: leaf[0], + amount, + proof + }) + const txResp = await account0.execute(myCall); + console.log("executed..."); + await provider.waitForTransaction(txResp.transaction_hash); + const result1 = await myContract.is_address_airdropped(leaf[0]); + console.log("result from airdrop request =", result1); + + + + console.log("✅ test completed."); +} +main() + .then(() => process.exit(0)) + .catch((error) => { + console.error(error); + process.exit(1); + }); \ No newline at end of file