Source Code
Overview
ETH Balance
0.000000178593647538 ETH
More Info
ContractCreator
Multichain Info
N/A
Latest 25 from a total of 1,178 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Write Chunks | 6550913 | 105 days ago | IN | 0.00145752 ETH | 0.00204159 | ||||
Write Chunks | 6550872 | 105 days ago | IN | 0.00145752 ETH | 0.00255889 | ||||
Write Chunks | 6550870 | 105 days ago | IN | 0.00145752 ETH | 0.00255242 | ||||
Write Chunks | 6550869 | 105 days ago | IN | 0.00145752 ETH | 0.00275666 | ||||
Write Chunks | 6547339 | 106 days ago | IN | 0.00145763 ETH | 0.02238631 | ||||
Write Chunks | 6547338 | 106 days ago | IN | 0.00145763 ETH | 0.02068471 | ||||
Write Chunks | 6547338 | 106 days ago | IN | 0.00145763 ETH | 0.02068631 | ||||
Write Chunks | 6547338 | 106 days ago | IN | 0.00145763 ETH | 0.02068604 | ||||
Write Chunks | 6537683 | 107 days ago | IN | 0.0014591 ETH | 0.00041855 | ||||
Write Chunks | 6537598 | 107 days ago | IN | 0.0014591 ETH | 0.00343315 | ||||
Write Chunks | 6537596 | 107 days ago | IN | 0.0014591 ETH | 0.00371205 | ||||
Write Chunks | 6537594 | 107 days ago | IN | 0.0014591 ETH | 0.00415414 | ||||
Write Chunks | 6428078 | 124 days ago | IN | 0.0014615 ETH | 0.2681764 | ||||
Write Chunks | 6428057 | 124 days ago | IN | 0.0014615 ETH | 0.353046 | ||||
Write Chunks | 6428055 | 124 days ago | IN | 0.002923 ETH | 0.62759113 | ||||
Write Chunks | 6428048 | 124 days ago | IN | 0.002923 ETH | 0.53641812 | ||||
Write Chunks | 6428046 | 124 days ago | IN | 0.002923 ETH | 0.49592305 | ||||
Write Chunks | 6428043 | 124 days ago | IN | 0.002923 ETH | 0.45848702 | ||||
Write Chunks | 6428042 | 124 days ago | IN | 0.002923 ETH | 0.44084782 | ||||
Write Chunks | 6428040 | 124 days ago | IN | 0.002923 ETH | 0.44083813 | ||||
Write Chunks | 6428038 | 124 days ago | IN | 0.002923 ETH | 0.40753222 | ||||
Write Chunks | 6428034 | 124 days ago | IN | 0.002923 ETH | 0.36229165 | ||||
Write Chunks | 6428033 | 124 days ago | IN | 0.002923 ETH | 0.34835236 | ||||
Write Chunks | 6428001 | 124 days ago | IN | 0.0014615 ETH | 0.14891685 | ||||
Write Chunks | 6427992 | 124 days ago | IN | 0.0014615 ETH | 0.14311294 |
Latest 25 internal transactions (View All)
Advanced mode:
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
6550913 | 105 days ago | 0.00145752 ETH | ||||
6550872 | 105 days ago | 0.00145752 ETH | ||||
6550870 | 105 days ago | 0.00145752 ETH | ||||
6550869 | 105 days ago | 0.00145752 ETH | ||||
6547339 | 106 days ago | 0.00145763 ETH | ||||
6547338 | 106 days ago | 0.00145763 ETH | ||||
6547338 | 106 days ago | 0.00145763 ETH | ||||
6547338 | 106 days ago | 0.00145763 ETH | ||||
6537683 | 107 days ago | 0.0014591 ETH | ||||
6537598 | 107 days ago | 0.0014591 ETH | ||||
6537596 | 107 days ago | 0.0014591 ETH | ||||
6537594 | 107 days ago | 0.0014591 ETH | ||||
6428078 | 124 days ago | 0.0014615 ETH | ||||
6428057 | 124 days ago | 0.0014615 ETH | ||||
6428055 | 124 days ago | 0.0014615 ETH | ||||
6428055 | 124 days ago | 0.0014615 ETH | ||||
6428048 | 124 days ago | 0.0014615 ETH | ||||
6428048 | 124 days ago | 0.0014615 ETH | ||||
6428046 | 124 days ago | 0.0014615 ETH | ||||
6428046 | 124 days ago | 0.0014615 ETH | ||||
6428043 | 124 days ago | 0.0014615 ETH | ||||
6428043 | 124 days ago | 0.0014615 ETH | ||||
6428042 | 124 days ago | 0.0014615 ETH | ||||
6428042 | 124 days ago | 0.0014615 ETH | ||||
6428040 | 124 days ago | 0.0014615 ETH |
Loading...
Loading
Contract Name:
FlatDirectory
Compiler Version
v0.8.18+commit.87f61d96
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2024-08-05 */ // Sources flattened with hardhat v2.19.3 https://hardhat.org // SPDX-License-Identifier: MIT // File @openzeppelin/contracts/utils/[email protected] // Original license: SPDX_License_Identifier: MIT pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File @openzeppelin/contracts/access/[email protected] // Original license: SPDX_License_Identifier: MIT pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _setOwner(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _setOwner(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _setOwner(newOwner); } function _setOwner(address newOwner) private { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File contracts/BlobStorageManager.sol // Original license: SPDX_License_Identifier: MIT pragma solidity ^0.8.0; enum DecodeType { RawData, PaddingPer31Bytes } interface IEthStorageContract { function putBlob(bytes32 key, uint256 blobIdx, uint256 length) external payable; function get(bytes32 key, DecodeType decodeType, uint256 off, uint256 len) external view returns (bytes memory); function remove(bytes32 key) external; function hash(bytes32 key) external view returns (bytes24); function size(bytes32 key) external view returns (uint256); function upfrontPayment() external view returns (uint256); } contract BlobStorageManager is Ownable { uint32 public maxChunkSize; IEthStorageContract public storageContract; mapping(bytes32 => mapping(uint256 => bytes32)) internal keyToChunks; constructor(uint32 size, address storageAddress) { maxChunkSize = size; storageContract = IEthStorageContract(storageAddress); } function setStorageContract(address storageAddress) public onlyOwner { storageContract = IEthStorageContract(storageAddress); } function setMaxChunkSize(uint32 size) public onlyOwner { maxChunkSize = size; } function isSupportBlob() view public returns (bool) { return address(storageContract) != address(0) && upfrontPayment() >= 0; } function upfrontPayment() public view returns (uint256) { return storageContract.upfrontPayment(); } function _countChunksFromBlob(bytes32 key) internal view returns (uint256) { uint256 chunkId = 0; while (true) { bytes32 chunkKey = keyToChunks[key][chunkId]; if (chunkKey == bytes32(0)) { break; } chunkId++; } return chunkId; } function _chunkSizeFromBlob(bytes32 key, uint256 chunkId) internal view returns (uint256, bool) { if (chunkId >= _countChunksFromBlob(key)) { return (0, false); } uint256 length = storageContract.size(keyToChunks[key][chunkId]); return (length, true); } function _sizeFromBlob(bytes32 key) internal view returns (uint256, uint256) { uint256 chunkNum = _countChunksFromBlob(key); uint256 size = 0; for (uint256 chunkId = 0; chunkId < chunkNum; chunkId++) { size += storageContract.size(keyToChunks[key][chunkId]); } return (size, chunkNum); } function _getChunkFromBlob(bytes32 key, uint256 chunkId) internal view returns (bytes memory, bool) { (uint256 length,) = _chunkSizeFromBlob(key, chunkId); if (length < 1) { return (new bytes(0), false); } bytes memory data = storageContract.get(keyToChunks[key][chunkId], DecodeType.PaddingPer31Bytes, 0, length); return (data, true); } function _getFromBlob(bytes32 key) internal view returns (bytes memory, bool) { (uint256 fileSize, uint256 chunkNum) = _sizeFromBlob(key); if (chunkNum == 0) { return (new bytes(0), false); } bytes memory concatenatedData = new bytes(fileSize); uint256 offset = 0; for (uint256 chunkId = 0; chunkId < chunkNum; chunkId++) { bytes32 chunkKey = keyToChunks[key][chunkId]; uint256 length = storageContract.size(chunkKey); storageContract.get(chunkKey, DecodeType.PaddingPer31Bytes, 0, length); assembly { returndatacopy(add(add(concatenatedData, offset), 0x20), 0x40, length) } offset += length; } return (concatenatedData, true); } function _removeChunkFromBlob(bytes32 key, uint256 chunkId) internal returns (bool) { bytes32 chunkKey = keyToChunks[key][chunkId]; if (chunkKey == bytes32(0)) { return false; } if (keyToChunks[key][chunkId + 1] != bytes32(0)) { // only the last chunk can be removed return false; } // TODO The current version does not support the delete // storageContract.remove(keyToChunks[key][chunkId]); keyToChunks[key][chunkId] = bytes32(0); return true; } function _removeFromBlob(bytes32 key, uint256 chunkId) internal returns (uint256) { while (true) { bytes32 chunkKey = keyToChunks[key][chunkId]; if (chunkKey == bytes32(0)) { break; } // TODO The current version does not support the delete // storageContract.remove(keyToChunks[key][chunkId]); keyToChunks[key][chunkId] = bytes32(0); chunkId++; } return chunkId; } function _preparePutFromBlob(bytes32 key, uint256 chunkId) private { bytes32 chunkKey = keyToChunks[key][chunkId]; if (chunkKey == bytes32(0)) { require(chunkId == 0 || keyToChunks[key][chunkId - 1] != bytes32(0), "must replace or append"); } else { // TODO The current version does not support the delete // storageContract.remove(keyToChunks[key][chunkId]); } } function _putChunks( bytes32 key, uint256[] memory chunkIds, uint256[] memory sizes ) internal { uint256 length = chunkIds.length; uint256 cost = storageContract.upfrontPayment(); require(msg.value >= cost * length, "insufficient balance"); for (uint8 i = 0; i < length; i++) { require(0 < sizes[i] && sizes[i] <= maxChunkSize, "invalid chunk length"); _preparePutFromBlob(key, chunkIds[i]); bytes32 chunkKey = keccak256(abi.encode(msg.sender, key, chunkIds[i])); storageContract.putBlob{value : cost}(chunkKey, i, sizes[i]); keyToChunks[key][chunkIds[i]] = chunkKey; } } function _getChunkHashFromBlob(bytes32 key, uint256 chunkId) public view returns (bytes32) { if (chunkId >= _countChunksFromBlob(key)) { return bytes32(0); } return storageContract.hash(keyToChunks[key][chunkId]); } } // File contracts/IERC5018.sol // Original license: SPDX_License_Identifier: MIT pragma solidity ^0.8.0; interface IERC5018 { // Large storage methods function write(bytes memory name, bytes memory data) external payable; function read(bytes memory name) external view returns (bytes memory, bool); // return (size, # of chunks) function size(bytes memory name) external view returns (uint256, uint256); function remove(bytes memory name) external returns (uint256); function countChunks(bytes memory name) external view returns (uint256); // Chunk-based large storage methods function writeChunk( bytes memory name, uint256 chunkId, bytes memory data ) external payable; function writeChunks(bytes memory name, uint256[] memory chunkIds, uint256[] memory sizes) external payable; function readChunk(bytes memory name, uint256 chunkId) external view returns (bytes memory, bool); function chunkSize(bytes memory name, uint256 chunkId) external view returns (uint256, bool); function removeChunk(bytes memory name, uint256 chunkId) external returns (bool); function truncate(bytes memory name, uint256 chunkId) external returns (uint256); function refund() external; function destruct() external; function getChunkHash(bytes memory name, uint256 chunkId) external view returns (bytes32); } // File contracts/optimize/SlotHelper.sol // Original license: SPDX_License_Identifier: MIT pragma solidity ^0.8.0; library SlotHelper { uint256 internal constant SLOTDATA_RIGHT_SHIFT = 32; uint256 internal constant LEN_OFFSET = 224; uint256 internal constant FIRST_SLOT_DATA_SIZE = 28; function putRaw(mapping(uint256 => bytes32) storage slots, bytes memory datas) internal returns (bytes32 mdata) { uint256 len = datas.length; mdata = encodeMetadata(datas); if (len > FIRST_SLOT_DATA_SIZE) { bytes32 value; uint256 ptr; assembly { ptr := add(datas, add(0x20, FIRST_SLOT_DATA_SIZE)) } for (uint256 i = 0; i < (len - FIRST_SLOT_DATA_SIZE + 32 - 1) / 32; i++) { assembly { value := mload(ptr) } ptr = ptr + 32; slots[i] = value; } } } function encodeMetadata(bytes memory data) internal pure returns (bytes32 medata) { uint256 datLen = data.length; uint256 value; assembly { value := mload(add(data, 0x20)) } datLen = datLen << LEN_OFFSET; value = value >> SLOTDATA_RIGHT_SHIFT; medata = bytes32(value | datLen); } function decodeMetadata(bytes32 mdata) internal pure returns (uint256 len, bytes32 data) { len = decodeLen(mdata); data = mdata << SLOTDATA_RIGHT_SHIFT; } function decodeMetadataToData(bytes32 mdata) internal pure returns (uint256 len, bytes memory data) { len = decodeLen(mdata); mdata = mdata << SLOTDATA_RIGHT_SHIFT; data = new bytes(len); assembly { mstore(add(data, 0x20), mdata) } } function getRaw(mapping(uint256 => bytes32) storage slots, bytes32 mdata) internal view returns (bytes memory data) { uint256 datalen; (datalen, data) = decodeMetadataToData(mdata); if (datalen > FIRST_SLOT_DATA_SIZE) { uint256 ptr = 0; bytes32 value = 0; assembly { ptr := add(data, add(0x20, FIRST_SLOT_DATA_SIZE)) } for (uint256 i = 0; i < (datalen - FIRST_SLOT_DATA_SIZE + 32 - 1) / 32; i++) { value = slots[i]; assembly { mstore(ptr, value) } ptr = ptr + 32; } } } function getRawAt( mapping(uint256 => bytes32) storage slots, bytes32 mdata, uint256 memoryPtr ) internal view returns (uint256 datalen, bool found) { bytes32 datapart; (datalen, datapart) = decodeMetadata(mdata); // memoryPtr:memoryPtr+32 is allocated for the data uint256 dataPtr = memoryPtr; assembly { mstore(dataPtr, datapart) } if (datalen > FIRST_SLOT_DATA_SIZE) { uint256 ptr = 0; bytes32 value = 0; assembly { ptr := add(dataPtr, FIRST_SLOT_DATA_SIZE) } for (uint256 i = 0; i < (datalen - FIRST_SLOT_DATA_SIZE + 32 - 1) / 32; i++) { value = slots[i]; assembly { mstore(ptr, value) } ptr = ptr + 32; } } found = true; } function isInSlot(bytes32 mdata) internal pure returns (bool succeed) { return decodeLen(mdata) > 0; } function encodeLen(uint256 datalen) internal pure returns (bytes32 res) { res = bytes32(datalen << LEN_OFFSET); } function decodeLen(bytes32 mdata) internal pure returns (uint256 res) { res = uint256(mdata) >> LEN_OFFSET; } function addrToBytes32(address addr) internal pure returns (bytes32) { return bytes32(uint256(uint160(addr))); } function bytes32ToAddr(bytes32 bt) internal pure returns (address) { return address(uint160(uint256(bt))); } } // File contracts/Memory.sol // Original license: SPDX_License_Identifier: MIT pragma solidity ^0.8.0; library Memory { // Size of a word, in bytes. uint256 internal constant WORD_SIZE = 32; // Size of the header of a 'bytes' array. uint256 internal constant BYTES_HEADER_SIZE = 32; // Address of the free memory pointer. uint256 internal constant FREE_MEM_PTR = 0x40; // Compares the 'len' bytes starting at address 'addr' in memory with the 'len' // bytes starting at 'addr2'. // Returns 'true' if the bytes are the same, otherwise 'false'. function equals( uint256 addr, uint256 addr2, uint256 len ) internal pure returns (bool equal) { assembly { equal := eq(keccak256(addr, len), keccak256(addr2, len)) } } // Compares the 'len' bytes starting at address 'addr' in memory with the bytes stored in // 'bts'. It is allowed to set 'len' to a lower value then 'bts.length', in which case only // the first 'len' bytes will be compared. // Requires that 'bts.length >= len' function equals( uint256 addr, uint256 len, bytes memory bts ) internal pure returns (bool equal) { require(bts.length >= len); uint256 addr2; assembly { addr2 := add( bts, /*BYTES_HEADER_SIZE*/ 32 ) } return equals(addr, addr2, len); } // Allocates 'numBytes' bytes in memory. This will prevent the Solidity compiler // from using this area of memory. It will also initialize the area by setting // each byte to '0'. function allocate(uint256 numBytes) internal pure returns (uint256 addr) { // Take the current value of the free memory pointer, and update. assembly { addr := mload( /*FREE_MEM_PTR*/ 0x40 ) mstore( /*FREE_MEM_PTR*/ 0x40, add(addr, numBytes) ) } uint256 words = (numBytes + WORD_SIZE - 1) / WORD_SIZE; for (uint256 i = 0; i < words; i++) { assembly { mstore( add( addr, mul( i, /*WORD_SIZE*/ 32 ) ), 0 ) } } } // Copy 'len' bytes from memory address 'src', to address 'dest'. // This function does not check the or destination, it only copies // the bytes. function copy( uint256 src, uint256 dest, uint256 len ) internal pure { // Copy word-length chunks while possible // Reverse copy to prevent out of memory bound error src = src + len; dest = dest + len; for (; len >= WORD_SIZE; len -= WORD_SIZE) { dest -= WORD_SIZE; src -= WORD_SIZE; assembly { mstore(dest, mload(src)) } } if (len == 0) { return; } // Copy remaining bytes src = src - len; dest = dest - len; assembly { mstore(dest, mload(src)) } } // Returns a memory pointer to the provided bytes array. function ptr(bytes memory bts) internal pure returns (uint256 addr) { assembly { addr := bts } } // Returns a memory pointer to the data portion of the provided bytes array. function dataPtr(bytes memory bts) internal pure returns (uint256 addr) { assembly { addr := add( bts, /*BYTES_HEADER_SIZE*/ 32 ) } } // This function does the same as 'dataPtr(bytes memory)', but will also return the // length of the provided bytes array. function fromBytes(bytes memory bts) internal pure returns (uint256 addr, uint256 len) { len = bts.length; assembly { addr := add( bts, /*BYTES_HEADER_SIZE*/ 32 ) } } // Creates a 'bytes memory' variable from the memory address 'addr', with the // length 'len'. The function will allocate new memory for the bytes array, and // the 'len bytes starting at 'addr' will be copied into that new memory. function toBytes(uint256 addr, uint256 len) internal pure returns (bytes memory bts) { bts = new bytes(len); uint256 btsptr; assembly { btsptr := add( bts, /*BYTES_HEADER_SIZE*/ 32 ) } copy(addr, btsptr, len); } // Get the word stored at memory address 'addr' as a 'uint'. function toUint(uint256 addr) internal pure returns (uint256 n) { assembly { n := mload(addr) } } // Get the word stored at memory address 'addr' as a 'bytes32'. function toBytes32(uint256 addr) internal pure returns (bytes32 bts) { assembly { bts := mload(addr) } } /* // Get the byte stored at memory address 'addr' as a 'byte'. function toByte(uint addr, uint8 index) internal pure returns (byte b) { require(index < WORD_SIZE); uint8 n; assembly { n := byte(index, mload(addr)) } b = byte(n); } */ } // File contracts/StorageSlotFactory.sol // Original license: SPDX_License_Identifier: MIT pragma solidity ^0.8.0; // Create a storage slot by appending data to the end contract StorageSlotFromContract { constructor(address contractAddr, bytes memory data) payable { uint256 codeSize; assembly { // retrieve the size of the code, this needs assembly codeSize := extcodesize(contractAddr) } uint256 totalSize = codeSize + data.length + 32; bytes memory deployCode = new bytes(totalSize); // Copy contract code assembly { // actually retrieve the code, this needs assembly extcodecopy(contractAddr, add(deployCode, 0x20), 0, codeSize) } // Copy data uint256 off = Memory.dataPtr(deployCode) + codeSize; Memory.copy(Memory.dataPtr(data), off, data.length); off += data.length; uint256 len = data.length; // Set data size assembly { mstore(off, len) } // Return the contract manually assembly { return(add(deployCode, 0x20), totalSize) } } } // Create a storage slot contract StorageSlotFactoryFromInput { constructor(bytes memory codeAndData) payable { uint256 size = codeAndData.length; // Return the contract manually assembly { return(add(codeAndData, 0x20), size) } } } // File contracts/StorageHelper.sol // Original license: SPDX_License_Identifier: MIT pragma solidity ^0.8.0; library StorageHelper { // StorageSlotSelfDestructable compiled via solc 0.8.7 optimized 200 bytes internal constant STORAGE_SLOT_CODE = hex"6080604052348015600f57600080fd5b506004361060325760003560e01c80632b68b9c61460375780638da5cb5b14603f575b600080fd5b603d6081565b005b60657f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200160405180910390f35b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161460ed5760405162461bcd60e51b815260206004820152600e60248201526d3737ba10333937b69037bbb732b960911b604482015260640160405180910390fd5b33fffea2646970667358221220fc66c9afb7cb2f6209ae28167cf26c6c06f86a82cbe3c56de99027979389a1be64736f6c63430008070033"; uint256 internal constant ADDR_OFF0 = 67; uint256 internal constant ADDR_OFF1 = 140; // StorageSlotFactoryFromInput compiled via solc 0.8.7 optimized 200 + STORAGE_SLOT_CODE bytes internal constant FACTORY_CODE = hex"60806040526040516101113803806101118339810160408190526100229161002b565b80518060208301f35b6000602080838503121561003e57600080fd5b82516001600160401b038082111561005557600080fd5b818501915085601f83011261006957600080fd5b81518181111561007b5761007b6100fa565b604051601f8201601f19908116603f011681019083821181831017156100a3576100a36100fa565b8160405282815288868487010111156100bb57600080fd5b600093505b828410156100dd57848401860151818501870152928501926100c0565b828411156100ee5760008684830101525b98975050505050505050565b634e487b7160e01b600052604160045260246000fdfe000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000006080604052348015600f57600080fd5b506004361060325760003560e01c80632b68b9c61460375780638da5cb5b14603f575b600080fd5b603d6081565b005b60657f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200160405180910390f35b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161460ed5760405162461bcd60e51b815260206004820152600e60248201526d3737ba10333937b69037bbb732b960911b604482015260640160405180910390fd5b33fffea2646970667358221220fc66c9afb7cb2f6209ae28167cf26c6c06f86a82cbe3c56de99027979389a1be64736f6c63430008070033"; uint256 internal constant FACTORY_SIZE_OFF = 305; uint256 internal constant FACTORY_ADDR_OFF0 = 305 + 32 + ADDR_OFF0; uint256 internal constant FACTORY_ADDR_OFF1 = 305 + 32 + ADDR_OFF1; function putRawFromCalldata(bytes calldata data, uint256 value) internal returns (address) { bytes memory bytecode = bytes.concat(STORAGE_SLOT_CODE, data); { // revise the owner to the contract (so that it is destructable) uint256 off = ADDR_OFF0 + 0x20; assembly { mstore(add(bytecode, off), address()) } off = ADDR_OFF1 + 0x20; assembly { mstore(add(bytecode, off), address()) } } StorageSlotFactoryFromInput c = new StorageSlotFactoryFromInput{value: value}(bytecode); return address(c); } function putRaw(bytes memory data, uint256 value) internal returns (address) { // create the new contract code with the data bytes memory bytecode = STORAGE_SLOT_CODE; uint256 bytecodeLen = bytecode.length; uint256 newSize = bytecode.length + data.length; assembly { // in-place resize of bytecode bytes // note that this must be done when bytecode is the last allocated object by solidity. mstore(bytecode, newSize) // notify solidity about the memory size increase, must be 32-bytes aligned mstore(0x40, add(bytecode, and(add(add(newSize, 0x20), 0x1f), not(0x1f)))) } // append data to self-destruct byte code Memory.copy(Memory.dataPtr(data), Memory.dataPtr(bytecode) + bytecodeLen, data.length); { // revise the owner to the contract (so that it is destructable) uint256 off = ADDR_OFF0 + 0x20; assembly { mstore(add(bytecode, off), address()) } off = ADDR_OFF1 + 0x20; assembly { mstore(add(bytecode, off), address()) } } StorageSlotFactoryFromInput c = new StorageSlotFactoryFromInput{value: value}(bytecode); return address(c); } function putRaw2( bytes32 key, bytes memory data, uint256 value ) internal returns (address) { // create the new contract code with the data bytes memory bytecode = FACTORY_CODE; uint256 bytecodeLen = bytecode.length; uint256 newSize = bytecode.length + data.length; assembly { // in-place resize of bytecode bytes // note that this must be done when bytecode is the last allocated object by solidity. mstore(bytecode, newSize) // notify solidity about the memory size increase, must be 32-bytes aligned mstore(0x40, add(bytecode, and(add(add(newSize, 0x20), 0x1f), not(0x1f)))) } // append data to self-destruct byte code Memory.copy(Memory.dataPtr(data), Memory.dataPtr(bytecode) + bytecodeLen, data.length); { // revise the size of calldata uint256 calldataSize = STORAGE_SLOT_CODE.length + data.length; uint256 off = FACTORY_SIZE_OFF + 0x20; assembly { mstore(add(bytecode, off), calldataSize) } } { // revise the owner to the contract (so that it is destructable) uint256 off = FACTORY_ADDR_OFF0 + 0x20; assembly { mstore(add(bytecode, off), address()) } off = FACTORY_ADDR_OFF1 + 0x20; assembly { mstore(add(bytecode, off), address()) } } address addr; assembly { addr := create2( value, add(bytecode, 0x20), // data offset mload(bytecode), // size key ) if iszero(extcodesize(addr)) { revert(0, 0) } } return addr; } function sizeRaw(address addr) internal view returns (uint256, bool) { if (addr == address(0x0)) { return (0, false); } uint256 codeSize; uint256 off = STORAGE_SLOT_CODE.length; assembly { codeSize := extcodesize(addr) } if (codeSize < off) { return (0, false); } return (codeSize - off, true); } function getRaw(address addr) internal view returns (bytes memory, bool) { (uint256 dataSize, bool found) = sizeRaw(addr); if (!found) { return (new bytes(0), false); } // copy the data without the "code" bytes memory data = new bytes(dataSize); uint256 off = STORAGE_SLOT_CODE.length; assembly { // retrieve data size extcodecopy(addr, add(data, 0x20), off, dataSize) } return (data, true); } function getRawAt(address addr, uint256 memoryPtr) internal view returns (uint256, bool) { (uint256 dataSize, bool found) = sizeRaw(addr); if (!found) { return (0, false); } uint256 off = STORAGE_SLOT_CODE.length; assembly { // retrieve data size extcodecopy(addr, memoryPtr, off, dataSize) } return (dataSize, true); } function returnBytesInplace(bytes memory content) internal pure { // equal to return abi.encode(content) uint256 size = content.length + 0x40; // pointer + size size = (size + 0x20 + 0x1f) & ~uint256(0x1f); assembly { // (DATA CORRUPTION): the caller method must be "external returns (bytes)", cannot be public! mstore(sub(content, 0x20), 0x20) return(sub(content, 0x20), size) } } function calculateValueForData( uint256 datalen, uint256 chunkSize, uint256 codeStakingPerChunk ) internal pure returns (uint256) { return ((datalen + STORAGE_SLOT_CODE.length - 1) / chunkSize) * codeStakingPerChunk; } function storageSlotCodeLength() internal pure returns (uint256) { return STORAGE_SLOT_CODE.length; } } // File contracts/StorageSlotSelfDestructable.sol // Original license: SPDX_License_Identifier: MIT pragma solidity ^0.8.0; contract StorageSlotSelfDestructable { address public immutable owner; constructor() { owner = msg.sender; } function destruct() public { require(msg.sender == owner, "not from owner"); selfdestruct(payable(msg.sender)); } } // File contracts/LargeStorageManager.sol // Original license: SPDX_License_Identifier: MIT pragma solidity ^0.8.0; // Large storage manager to support arbitrarily-sized data with multiple chunk contract LargeStorageManager { using SlotHelper for bytes32; using SlotHelper for address; uint8 internal immutable SLOT_LIMIT; mapping(bytes32 => mapping(uint256 => bytes32)) internal keyToMetadata; mapping(bytes32 => mapping(uint256 => mapping(uint256 => bytes32))) internal keyToSlots; constructor(uint8 slotLimit) { SLOT_LIMIT = slotLimit; } function isOptimize() public view returns (bool) { return SLOT_LIMIT > 0; } function _preparePut(bytes32 key, uint256 chunkId) private { bytes32 metadata = keyToMetadata[key][chunkId]; if (metadata == bytes32(0)) { require(chunkId == 0 || keyToMetadata[key][chunkId - 1] != bytes32(0x0), "must replace or append"); } if (!metadata.isInSlot()) { address addr = metadata.bytes32ToAddr(); if (addr != address(0x0)) { // remove the KV first if it exists StorageSlotSelfDestructable(addr).destruct(); } } } function _putChunkFromCalldata( bytes32 key, uint256 chunkId, bytes calldata data, uint256 value ) internal { _preparePut(key, chunkId); // store data and rewrite metadata if (data.length > SLOT_LIMIT) { keyToMetadata[key][chunkId] = StorageHelper.putRawFromCalldata(data, value).addrToBytes32(); } else { keyToMetadata[key][chunkId] = SlotHelper.putRaw(keyToSlots[key][chunkId], data); } } function _putChunk( bytes32 key, uint256 chunkId, bytes memory data, uint256 value ) internal { _preparePut(key, chunkId); // store data and rewrite metadata if (data.length > SLOT_LIMIT) { keyToMetadata[key][chunkId] = StorageHelper.putRaw(data, value).addrToBytes32(); } else { keyToMetadata[key][chunkId] = SlotHelper.putRaw(keyToSlots[key][chunkId], data); } } function _getChunk(bytes32 key, uint256 chunkId) internal view returns (bytes memory, bool) { bytes32 metadata = keyToMetadata[key][chunkId]; if (metadata.isInSlot()) { bytes memory res = SlotHelper.getRaw(keyToSlots[key][chunkId], metadata); return (res, true); } else { address addr = metadata.bytes32ToAddr(); return StorageHelper.getRaw(addr); } } function _chunkSize(bytes32 key, uint256 chunkId) internal view returns (uint256, bool) { bytes32 metadata = keyToMetadata[key][chunkId]; if (metadata == bytes32(0)) { return (0, false); } else if (metadata.isInSlot()) { uint256 len = metadata.decodeLen(); return (len, true); } else { address addr = metadata.bytes32ToAddr(); return StorageHelper.sizeRaw(addr); } } function _countChunks(bytes32 key) internal view returns (uint256) { uint256 chunkId = 0; while (true) { bytes32 metadata = keyToMetadata[key][chunkId]; if (metadata == bytes32(0x0)) { break; } chunkId++; } return chunkId; } // Returns (size, # of chunks). function _size(bytes32 key) internal view returns (uint256, uint256) { uint256 size = 0; uint256 chunkId = 0; while (true) { (uint256 chunkSize, bool found) = _chunkSize(key, chunkId); if (!found) { break; } size += chunkSize; chunkId++; } return (size, chunkId); } function _get(bytes32 key) internal view returns (bytes memory, bool) { (uint256 size, uint256 chunkNum) = _size(key); if (chunkNum == 0) { return (new bytes(0), false); } bytes memory data = new bytes(size); // solidity should auto-align the memory-size to 32 uint256 dataPtr; assembly { dataPtr := add(data, 0x20) } for (uint256 chunkId = 0; chunkId < chunkNum; chunkId++) { bytes32 metadata = keyToMetadata[key][chunkId]; uint256 chunkSize = 0; if (metadata.isInSlot()) { chunkSize = metadata.decodeLen(); SlotHelper.getRawAt(keyToSlots[key][chunkId], metadata, dataPtr); } else { address addr = metadata.bytes32ToAddr(); (chunkSize, ) = StorageHelper.sizeRaw(addr); StorageHelper.getRawAt(addr, dataPtr); } dataPtr += chunkSize; } return (data, true); } // Returns # of chunks deleted function _remove(bytes32 key, uint256 chunkId) internal returns (uint256) { while (true) { bytes32 metadata = keyToMetadata[key][chunkId]; if (metadata == bytes32(0x0)) { break; } if (!metadata.isInSlot()) { address addr = metadata.bytes32ToAddr(); // remove new contract StorageSlotSelfDestructable(addr).destruct(); } keyToMetadata[key][chunkId] = bytes32(0x0); chunkId++; } return chunkId; } function _removeChunk(bytes32 key, uint256 chunkId) internal returns (bool) { bytes32 metadata = keyToMetadata[key][chunkId]; if (metadata == bytes32(0x0)) { return false; } if (keyToMetadata[key][chunkId + 1] != bytes32(0x0)) { // only the last chunk can be removed return false; } if (!metadata.isInSlot()) { address addr = metadata.bytes32ToAddr(); // remove new contract StorageSlotSelfDestructable(addr).destruct(); } keyToMetadata[key][chunkId] = bytes32(0x0); return true; } } // File contracts/ERC5018.sol // Original license: SPDX_License_Identifier: MIT pragma solidity ^0.8.0; contract ERC5018 is IERC5018, LargeStorageManager, BlobStorageManager { enum StorageMode { Uninitialized, OnChain, Blob } mapping(bytes32 => StorageMode) storageModes; constructor( uint8 slotLimit, uint32 maxChunkSize, address storageAddress ) LargeStorageManager(slotLimit) BlobStorageManager(maxChunkSize, storageAddress) {} function getStorageMode(bytes memory name) public view returns (StorageMode) { return storageModes[keccak256(name)]; } function _setStorageMode(bytes memory name, StorageMode mode) internal { storageModes[keccak256(name)] = mode; } // Large storage methods function write(bytes memory name, bytes calldata data) public onlyOwner payable virtual override { // TODO: support multiple chunks return writeChunk(name, 0, data); } function read(bytes memory name) public view virtual override returns (bytes memory, bool) { StorageMode mode = getStorageMode(name); if (mode == StorageMode.Blob) { return _getFromBlob(keccak256(name)); } else if (mode == StorageMode.OnChain) { return _get(keccak256(name)); } return (new bytes(0), false); } function size(bytes memory name) public view virtual override returns (uint256, uint256) { StorageMode mode = getStorageMode(name); if (mode == StorageMode.Blob) { return _sizeFromBlob(keccak256(name)); } else if (mode == StorageMode.OnChain) { return _size(keccak256(name)); } return (0, 0); } function remove(bytes memory name) public virtual override onlyOwner returns (uint256) { StorageMode mode = getStorageMode(name); if (mode == StorageMode.Blob) { return _removeFromBlob(keccak256(name), 0); } else if (mode == StorageMode.OnChain) { return _remove(keccak256(name), 0); } return 0; } function countChunks(bytes memory name) public view virtual override returns (uint256) { StorageMode mode = getStorageMode(name); if (mode == StorageMode.Blob) { return _countChunksFromBlob(keccak256(name)); } else if (mode == StorageMode.OnChain) { return _countChunks(keccak256(name)); } return 0; } // Chunk-based large storage methods function writeChunk( bytes memory name, uint256 chunkId, bytes calldata data ) public payable onlyOwner virtual override { StorageMode mode = getStorageMode(name); require(mode == StorageMode.Uninitialized || mode == StorageMode.OnChain, "Invalid storage mode"); if (mode == StorageMode.Uninitialized) { _setStorageMode(name, StorageMode.OnChain); } _putChunkFromCalldata(keccak256(name), chunkId, data, msg.value); } function writeChunks( bytes memory name, uint256[] memory chunkIds, uint256[] memory sizes ) public onlyOwner override payable { require(isSupportBlob(), "The current network does not support blob upload"); StorageMode mode = getStorageMode(name); require(mode == StorageMode.Uninitialized || mode == StorageMode.Blob, "Invalid storage mode"); if (mode == StorageMode.Uninitialized) { _setStorageMode(name, StorageMode.Blob); } _putChunks(keccak256(name), chunkIds, sizes); } function readChunk(bytes memory name, uint256 chunkId) public view virtual override returns (bytes memory, bool) { StorageMode mode = getStorageMode(name); if (mode == StorageMode.Blob) { return _getChunkFromBlob(keccak256(name), chunkId); } else if (mode == StorageMode.OnChain) { return _getChunk(keccak256(name), chunkId); } return (new bytes(0), false); } function chunkSize(bytes memory name, uint256 chunkId) public view virtual override returns (uint256, bool) { StorageMode mode = getStorageMode(name); if (mode == StorageMode.Blob) { return _chunkSizeFromBlob(keccak256(name), chunkId); } else if (mode == StorageMode.OnChain) { return _chunkSize(keccak256(name), chunkId); } return (0, false); } function removeChunk(bytes memory name, uint256 chunkId) public virtual onlyOwner override returns (bool) { StorageMode mode = getStorageMode(name); if (mode == StorageMode.Blob) { return _removeChunkFromBlob(keccak256(name), chunkId); } else if (mode == StorageMode.OnChain) { return _removeChunk(keccak256(name), chunkId); } return false; } function truncate(bytes memory name, uint256 chunkId) public virtual onlyOwner override returns (uint256) { StorageMode mode = getStorageMode(name); if (mode == StorageMode.Blob) { return _removeFromBlob(keccak256(name), chunkId); } else if (mode == StorageMode.OnChain) { return _remove(keccak256(name), chunkId); } return 0; } function refund() public onlyOwner override { payable(owner()).transfer(address(this).balance); } function destruct() public onlyOwner override { selfdestruct(payable(owner())); } function getChunkHash(bytes memory name, uint256 chunkId) public override view returns (bytes32) { StorageMode mode = getStorageMode(name); if (mode == StorageMode.Blob) { return _getChunkHashFromBlob(keccak256(name), chunkId); } else if (mode == StorageMode.OnChain) { (bytes memory localData,) = readChunk(name, chunkId); return keccak256(localData); } return 0; } } // File contracts/examples/FlatDirectory.sol // Original license: SPDX_License_Identifier: MIT pragma solidity ^0.8.0; contract FlatDirectory is ERC5018 { bytes public defaultFile = ""; constructor(uint8 slotLimit, uint32 maxChunkSize, address storageAddress) ERC5018(slotLimit, maxChunkSize, storageAddress) {} function resolveMode() external pure virtual returns (bytes32) { return "manual"; } fallback(bytes calldata pathinfo) external returns (bytes memory) { bytes memory content; if (pathinfo.length == 0) { // TODO: redirect to "/"? return bytes(""); } else if (pathinfo[0] != 0x2f) { // Should not happen since manual mode will have prefix "/" like "/....." return bytes("incorrect path"); } if (pathinfo[pathinfo.length - 1] == 0x2f) { (content, ) = read(bytes.concat(pathinfo[1:], defaultFile)); } else { (content, ) = read(pathinfo[1:]); } StorageHelper.returnBytesInplace(content); } function setDefault(bytes memory _defaultFile) public onlyOwner virtual { defaultFile = _defaultFile; } }
[{"inputs":[{"internalType":"uint8","name":"slotLimit","type":"uint8"},{"internalType":"uint32","name":"maxChunkSize","type":"uint32"},{"internalType":"address","name":"storageAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"stateMutability":"nonpayable","type":"fallback"},{"inputs":[{"internalType":"bytes32","name":"key","type":"bytes32"},{"internalType":"uint256","name":"chunkId","type":"uint256"}],"name":"_getChunkHashFromBlob","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"name","type":"bytes"},{"internalType":"uint256","name":"chunkId","type":"uint256"}],"name":"chunkSize","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"name","type":"bytes"}],"name":"countChunks","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"defaultFile","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"destruct","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"name","type":"bytes"},{"internalType":"uint256","name":"chunkId","type":"uint256"}],"name":"getChunkHash","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"name","type":"bytes"}],"name":"getStorageMode","outputs":[{"internalType":"enum ERC5018.StorageMode","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isOptimize","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isSupportBlob","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxChunkSize","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"name","type":"bytes"}],"name":"read","outputs":[{"internalType":"bytes","name":"","type":"bytes"},{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"name","type":"bytes"},{"internalType":"uint256","name":"chunkId","type":"uint256"}],"name":"readChunk","outputs":[{"internalType":"bytes","name":"","type":"bytes"},{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"refund","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"name","type":"bytes"}],"name":"remove","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"name","type":"bytes"},{"internalType":"uint256","name":"chunkId","type":"uint256"}],"name":"removeChunk","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"resolveMode","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bytes","name":"_defaultFile","type":"bytes"}],"name":"setDefault","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"size","type":"uint32"}],"name":"setMaxChunkSize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"storageAddress","type":"address"}],"name":"setStorageContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"name","type":"bytes"}],"name":"size","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"storageContract","outputs":[{"internalType":"contract IEthStorageContract","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"name","type":"bytes"},{"internalType":"uint256","name":"chunkId","type":"uint256"}],"name":"truncate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"upfrontPayment","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"name","type":"bytes"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"write","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes","name":"name","type":"bytes"},{"internalType":"uint256","name":"chunkId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"writeChunk","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes","name":"name","type":"bytes"},{"internalType":"uint256[]","name":"chunkIds","type":"uint256[]"},{"internalType":"uint256[]","name":"sizes","type":"uint256[]"}],"name":"writeChunks","outputs":[],"stateMutability":"payable","type":"function"}]
Contract Creation Code
60c0604052600060a09081526006906200001a9082620001ac565b503480156200002857600080fd5b50604051620038d0380380620038d08339810160408190526200004b9162000278565b60ff831660805282828281816200006233620000b5565b6002805463ffffffff909316600160a01b0263ffffffff60a01b1990931692909217909155600380546001600160a01b039092166001600160a01b031990921691909117905550620002e4945050505050565b600280546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200013257607f821691505b6020821081036200015357634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115620001a757600081815260208120601f850160051c81016020861015620001825750805b601f850160051c820191505b81811015620001a3578281556001016200018e565b5050505b505050565b81516001600160401b03811115620001c857620001c862000107565b620001e081620001d984546200011d565b8462000159565b602080601f831160018114620002185760008415620001ff5750858301515b600019600386901b1c1916600185901b178555620001a3565b600085815260208120601f198616915b82811015620002495788860151825594840194600190910190840162000228565b5085821015620002685787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6000806000606084860312156200028e57600080fd5b835160ff81168114620002a057600080fd5b602085015190935063ffffffff81168114620002bb57600080fd5b60408501519092506001600160a01b0381168114620002d957600080fd5b809150509250925092565b6080516135c962000307600039600081816105500152611e9301526135c96000f3fe608060405260043610620001ee5760003560e01c8063590e1ae3116200010f578063caf1283611620000a3578063dd473fae116200006d578063dd473fae1462000776578063f14c7ad71462000794578063f2fde38b14620007ac578063f916c5b014620007d157620001ee565b8063caf1283614620006b5578063cf86bf9314620006f0578063d84eb56c146200072c578063dc38b0a2146200075157620001ee565b80638bf4515c11620000e55780638bf4515c14620006005780638da5cb5b146200062557806393b7628f1462000645578063956a3433146200069057620001ee565b8063590e1ae314620005ab5780635ba1d9e514620005c3578063715018a614620005e857620001ee565b80631ccbc6da116200018757806342216bed116200015d57806342216bed1462000504578063492c7b2a14620005295780634eed7cf1146200054057806358edef4c146200058657620001ee565b80631ccbc6da14620004ae5780631fbfa12714620004d55780632b68b9c614620004ec57620001ee565b806311ce026711620001c957806311ce026714620003de5780631a7237e014620004195780631c5ee10c146200044e5780631c993ad5146200048957620001ee565b8063038cd79f14620003705780630936286114620003895780631089f40f14620003b9575b348015620001fb57600080fd5b506000366060808284036200022157505060408051602081019091526000815262000365565b8383600081811062000237576200023762002a5f565b9050013560f81c60f81b6001600160f81b031916602f60f81b146200028357505060408051808201909152600e81526d0d2dcc6dee4e4cac6e840e0c2e8d60931b602082015262000365565b83836200029260018262002a8b565b818110620002a457620002a462002a5f565b909101356001600160f81b031916602f60f81b0390506200030657620002fd620002d2846001818862002aa1565b6006604051602001620002e89392919062002b03565b604051602081830303815290604052620007f6565b50905062000358565b6200035462000319846001818862002aa1565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250620007f692505050565b5090505b6200036381620008a1565b505b915050805190602001f35b620003876200038136600462002ca3565b620008e2565b005b3480156200039657600080fd5b50620003a16200092c565b604051620003b0919062002d66565b60405180910390f35b348015620003c657600080fd5b5062000387620003d836600462002d7b565b620009c2565b348015620003eb57600080fd5b5060035462000400906001600160a01b031681565b6040516001600160a01b039091168152602001620003b0565b3480156200042657600080fd5b506200043e6200043836600462002da3565b62000a15565b604051620003b092919062002deb565b3480156200045b57600080fd5b50620004736200046d36600462002e11565b62000ac5565b60408051928352602083019190915201620003b0565b3480156200049657600080fd5b5062000387620004a836600462002e11565b62000b58565b348015620004bb57600080fd5b50620004c662000b97565b604051908152602001620003b0565b62000387620004e636600462002ed9565b62000c0d565b348015620004f957600080fd5b506200038762000d92565b3480156200051157600080fd5b50620004c66200052336600462002da3565b62000dcd565b620003876200053a36600462002f6a565b62000e78565b3480156200054d57600080fd5b507f000000000000000000000000000000000000000000000000000000000000000060ff1615155b6040519015158152602001620003b0565b3480156200059357600080fd5b50620004c6620005a536600462002e11565b62000f8f565b348015620005b857600080fd5b506200038762001057565b348015620005d057600080fd5b5062000575620005e236600462002da3565b620010c1565b348015620005f557600080fd5b506200038762001181565b3480156200060d57600080fd5b506200043e6200061f36600462002e11565b620007f6565b3480156200063257600080fd5b506002546001600160a01b031662000400565b3480156200065257600080fd5b50620006816200066436600462002e11565b805160209182012060009081526005909152604090205460ff1690565b604051620003b0919062002ff6565b3480156200069d57600080fd5b50620004c6620006af36600462003013565b620011bc565b348015620006c257600080fd5b50620006da620006d436600462002da3565b62001276565b60408051928352901515602083015201620003b0565b348015620006fd57600080fd5b506002546200071690600160a01b900463ffffffff1681565b60405163ffffffff9091168152602001620003b0565b3480156200073957600080fd5b50620004c66200074b36600462002da3565b6200130c565b3480156200075e57600080fd5b50620003876200077036600462003036565b620013c2565b3480156200078357600080fd5b50651b585b9d585b60d21b620004c6565b348015620007a157600080fd5b506200057562001411565b348015620007b957600080fd5b5062000387620007cb36600462003036565b6200143d565b348015620007de57600080fd5b50620004c6620007f036600462002e11565b620014dc565b60606000806200081d84805160209182012060009081526005909152604090205460ff1690565b9050600281600281111562000836576200083662002fe0565b0362000858576200084e848051906020012062001561565b9250925050915091565b60018160028111156200086f576200086f62002fe0565b0362000887576200084e848051906020012062001761565b505060408051600080825260208201909252939092509050565b600081516040620008b3919062003061565b9050601f19620008c582602062003061565b620008d290601f62003061565b1690506020808303528060208303f35b6002546001600160a01b03163314620009185760405162461bcd60e51b81526004016200090f9062003077565b60405180910390fd5b62000927836000848462000e78565b505050565b600680546200093b9062002acd565b80601f0160208091040260200160405190810160405280929190818152602001828054620009699062002acd565b8015620009ba5780601f106200098e57610100808354040283529160200191620009ba565b820191906000526020600020905b8154815290600101906020018083116200099c57829003601f168201915b505050505081565b6002546001600160a01b03163314620009ef5760405162461bcd60e51b81526004016200090f9062003077565b6002805463ffffffff909216600160a01b0263ffffffff60a01b19909216919091179055565b606060008062000a3c85805160209182012060009081526005909152604090205460ff1690565b9050600281600281111562000a555762000a5562002fe0565b0362000a795762000a6e8580519060200120856200188e565b925092505062000abe565b600181600281111562000a905762000a9062002fe0565b0362000aa95762000a6e8580519060200120856200196b565b50506040805160008082526020820190925291505b9250929050565b600080600062000aec84805160209182012060009081526005909152604090205460ff1690565b9050600281600281111562000b055762000b0562002fe0565b0362000b1d576200084e8480519060200120620019e4565b600181600281111562000b345762000b3462002fe0565b0362000b4c576200084e848051906020012062001abb565b50600093849350915050565b6002546001600160a01b0316331462000b855760405162461bcd60e51b81526004016200090f9062003077565b600662000b938282620030f6565b5050565b60035460408051630e65e36d60e11b815290516000926001600160a01b031691631ccbc6da9160048083019260209291908290030181865afa15801562000be2573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000c089190620031c2565b905090565b6002546001600160a01b0316331462000c3a5760405162461bcd60e51b81526004016200090f9062003077565b62000c4462001411565b62000cab5760405162461bcd60e51b815260206004820152603060248201527f5468652063757272656e74206e6574776f726b20646f6573206e6f742073757060448201526f1c1bdc9d08189b1bd8881d5c1b1bd85960821b60648201526084016200090f565b600062000ccf84805160209182012060009081526005909152604090205460ff1690565b9050600081600281111562000ce85762000ce862002fe0565b148062000d095750600281600281111562000d075762000d0762002fe0565b145b62000d4e5760405162461bcd60e51b8152602060048201526014602482015273496e76616c69642073746f72616765206d6f646560601b60448201526064016200090f565b600081600281111562000d655762000d6562002fe0565b0362000d785762000d7884600262001b12565b62000d8c8480519060200120848462001b54565b50505050565b6002546001600160a01b0316331462000dbf5760405162461bcd60e51b81526004016200090f9062003077565b6002546001600160a01b0316ff5b60008062000df284805160209182012060009081526005909152604090205460ff1690565b9050600281600281111562000e0b5762000e0b62002fe0565b0362000e2d5762000e24848051906020012084620011bc565b91505062000e72565b600181600281111562000e445762000e4462002fe0565b0362000e6c57600062000e58858562000a15565b508051602090910120925062000e72915050565b50600090505b92915050565b6002546001600160a01b0316331462000ea55760405162461bcd60e51b81526004016200090f9062003077565b600062000ec985805160209182012060009081526005909152604090205460ff1690565b9050600081600281111562000ee25762000ee262002fe0565b148062000f035750600181600281111562000f015762000f0162002fe0565b145b62000f485760405162461bcd60e51b8152602060048201526014602482015273496e76616c69642073746f72616765206d6f646560601b60448201526064016200090f565b600081600281111562000f5f5762000f5f62002fe0565b0362000f725762000f7285600162001b12565b62000f8885805190602001208585853462001e83565b5050505050565b6002546000906001600160a01b0316331462000fbf5760405162461bcd60e51b81526004016200090f9062003077565b600062000fe383805160209182012060009081526005909152604090205460ff1690565b9050600281600281111562000ffc5762000ffc62002fe0565b036200101d57620010168380519060200120600062001f6c565b9392505050565b600181600281111562001034576200103462002fe0565b036200104e57620010168380519060200120600062001fcc565b50600092915050565b6002546001600160a01b03163314620010845760405162461bcd60e51b81526004016200090f9062003077565b6002546040516001600160a01b03909116904780156108fc02916000818181858888f19350505050158015620010be573d6000803e3d6000fd5b50565b6002546000906001600160a01b03163314620010f15760405162461bcd60e51b81526004016200090f9062003077565b60006200111584805160209182012060009081526005909152604090205460ff1690565b905060028160028111156200112e576200112e62002fe0565b03620011475762000e248480519060200120846200208e565b60018160028111156200115e576200115e62002fe0565b03620011775762000e2484805190602001208462002116565b5060009392505050565b6002546001600160a01b03163314620011ae5760405162461bcd60e51b81526004016200090f9062003077565b620011ba600062002206565b565b6000620011c98362002258565b8210620011d95750600062000e72565b60035460008481526004602081815260408084208785529091529182902054915163d8389dc560e01b8152908101919091526001600160a01b039091169063d8389dc590602401602060405180830381865afa1580156200123e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620012649190620031dc565b67ffffffffffffffff19169392505050565b60008060006200129d85805160209182012060009081526005909152604090205460ff1690565b90506002816002811115620012b657620012b662002fe0565b03620012cf5762000a6e85805190602001208562002299565b6001816002811115620012e657620012e662002fe0565b03620012ff5762000a6e8580519060200120856200234d565b5060009485945092505050565b6002546000906001600160a01b031633146200133c5760405162461bcd60e51b81526004016200090f9062003077565b60006200136084805160209182012060009081526005909152604090205460ff1690565b9050600281600281111562001379576200137962002fe0565b03620013925762000e2484805190602001208462001f6c565b6001816002811115620013a957620013a962002fe0565b03620011775762000e2484805190602001208462001fcc565b6002546001600160a01b03163314620013ef5760405162461bcd60e51b81526004016200090f9062003077565b600380546001600160a01b0319166001600160a01b0392909216919091179055565b6003546000906001600160a01b03161580159062000c08575060006200143662000b97565b1015905090565b6002546001600160a01b031633146200146a5760405162461bcd60e51b81526004016200090f9062003077565b6001600160a01b038116620014d15760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016200090f565b620010be8162002206565b6000806200150183805160209182012060009081526005909152604090205460ff1690565b905060028160028111156200151a576200151a62002fe0565b03620015325762001016838051906020012062002258565b600181600281111562001549576200154962002fe0565b036200104e57620010168380519060200120620023a5565b606060008060006200157385620019e4565b9150915080600003620015bb5760005b6040519080825280601f01601f191660200182016040528015620015ae576020820181803683370190505b5095600095509350505050565b6000826001600160401b03811115620015d857620015d862002b90565b6040519080825280601f01601f19166020018201604052801562001603576020820181803683370190505b5090506000805b838110156200175257600088815260046020818152604080842085855290915280832054600354915163afd5644d60e01b815292830181905292916001600160a01b039091169063afd5644d90602401602060405180830381865afa15801562001678573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200169e9190620031c2565b60035460405163bea94b8b60e01b81529192506001600160a01b03169063bea94b8b90620016d9908590600190600090879060040162003209565b600060405180830381865afa158015620016f7573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526200172191908101906200323e565b508060406020868801013e62001738818562003061565b9350505080806200174990620032bd565b9150506200160a565b50909660019650945050505050565b60606000806000620017738562001abb565b91509150806000036200178857600062001583565b6000826001600160401b03811115620017a557620017a562002b90565b6040519080825280601f01601f191660200182016040528015620017d0576020820181803683370190505b5090506020810160005b838110156200175257600088815260208181526040808320848452909152812054906200180782620023e4565b156200184957620018188260e01c90565b60008b8152600160209081526040808320878452909152902090915062001841908386620023f9565b505062001868565b816200185581620024ad565b50915062001864818662002513565b5050505b62001874818562003061565b9350505080806200188590620032bd565b915050620017da565b60606000806200189f858562002299565b5090506001811015620018c657505060408051600080825260208201909252915062000abe565b600354600086815260046020818152604080842089855290915280832054905163bea94b8b60e01b815292936001600160a01b03169263bea94b8b92620019169291600191879189910162003209565b600060405180830381865afa15801562001934573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526200195e91908101906200323e565b9660019650945050505050565b600082815260208181526040808320848452909152812054606091906200199281620023e4565b15620019cc5760008581526001602090815260408083208784529091528120620019bd908362002572565b93506001925062000abe915050565b80620019d88162002619565b93509350505062000abe565b6000806000620019f48462002258565b90506000805b8281101562001ab15760035460008781526004602081815260408084208685529091529182902054915163afd5644d60e01b8152908101919091526001600160a01b039091169063afd5644d90602401602060405180830381865afa15801562001a68573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001a8e9190620031c2565b62001a9a908362003061565b91508062001aa881620032bd565b915050620019fa565b5094909350915050565b6000806000805b60008062001ad187846200234d565b915091508062001ae357505062001b08565b62001aef828562003061565b93508262001afd81620032bd565b935050505062001ac2565b9094909350915050565b81516020808401919091206000908152600590915260409020805482919060ff1916600183600281111562001b4b5762001b4b62002fe0565b02179055505050565b815160035460408051630e65e36d60e11b815290516000926001600160a01b031691631ccbc6da9160048083019260209291908290030181865afa15801562001ba1573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001bc79190620031c2565b905062001bd58282620032d9565b34101562001c1d5760405162461bcd60e51b8152602060048201526014602482015273696e73756666696369656e742062616c616e636560601b60448201526064016200090f565b60005b828160ff16101562001e7b57838160ff168151811062001c445762001c4462002a5f565b6020026020010151600010801562001c935750600260149054906101000a900463ffffffff1663ffffffff16848260ff168151811062001c885762001c8862002a5f565b602002602001015111155b62001cd85760405162461bcd60e51b81526020600482015260146024820152730d2dcecc2d8d2c840c6d0eadcd640d8cadccee8d60631b60448201526064016200090f565b62001d0386868360ff168151811062001cf55762001cf562002a5f565b6020026020010151620026bf565b60003387878460ff168151811062001d1f5762001d1f62002a5f565b602002602001015160405160200162001d56939291906001600160a01b039390931683526020830191909152604082015260600190565b604051602081830303815290604052805190602001209050600360009054906101000a90046001600160a01b03166001600160a01b0316634581a920848385898760ff168151811062001dad5762001dad62002a5f565b60200260200101516040518563ffffffff1660e01b815260040162001de89392919092835260ff919091166020830152604082015260600190565b6000604051808303818588803b15801562001e0257600080fd5b505af115801562001e17573d6000803e3d6000fd5b505050505080600460008981526020019081526020016000206000888560ff168151811062001e4a5762001e4a62002a5f565b602002602001015181526020019081526020016000208190555050808062001e7290620032f3565b91505062001c20565b505050505050565b62001e8f85856200275d565b60ff7f00000000000000000000000000000000000000000000000000000000000000001682111562001ef65762001ed862001ecc84848462002875565b6001600160a01b031690565b60008681526020818152604080832088845290915290205562000f88565b60008581526001602090815260408083208784528252918290208251601f860183900483028101830190935284835262001f4d92909186908690819084018382808284376000920191909152506200293192505050565b6000868152602081815260408083208884529091529020555050505050565b60005b60008381526004602090815260408083208584529091529020548062001f96575062001fc6565b60008481526004602090815260408083208684529091528120558262001fbc81620032bd565b9350505062001f6f565b50919050565b60005b6000838152602081815260408083208584529091529020548062001ff4575062001fc6565b62001fff81620023e4565b62002060576000819050806001600160a01b0316632b68b9c66040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156200204557600080fd5b505af11580156200205a573d6000803e3d6000fd5b50505050505b600084815260208181526040808320868452909152812055826200208481620032bd565b9350505062001fcf565b600082815260046020908152604080832084845290915281205480620020b957600091505062000e72565b600084815260046020526040812081620020d586600162003061565b81526020019081526020016000205414620020f557600091505062000e72565b50506000918252600460209081526040808420928452919052812055600190565b600082815260208181526040808320848452909152812054806200213f57600091505062000e72565b6000848152602081905260408120816200215b86600162003061565b815260200190815260200160002054146200217b57600091505062000e72565b6200218681620023e4565b620021e7576000819050806001600160a01b0316632b68b9c66040518163ffffffff1660e01b8152600401600060405180830381600087803b158015620021cc57600080fd5b505af1158015620021e1573d6000803e3d6000fd5b50505050505b5050600091825260208281526040808420928452919052812055600190565b600280546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6000805b60008381526004602090815260408083208484529091529020548062002283575062000e72565b816200228f81620032bd565b925050506200225c565b600080620022a78462002258565b8310620022ba5750600090508062000abe565b600354600085815260046020818152604080842088855290915280832054905163afd5644d60e01b81529182015290916001600160a01b03169063afd5644d90602401602060405180830381865afa1580156200231b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620023419190620031c2565b95600195509350505050565b6000828152602081815260408083208484529091528120548190806200237b57600080925092505062000abe565b6200238681620023e4565b1562002399576000620019bd8260e01c90565b80620019d881620024ad565b6000805b60008381526020818152604080832084845290915290205480620023ce575062000e72565b81620023da81620032bd565b92505050620023a9565b600080620023f28360e01c90565b1192915050565b60008060006200240985620029cb565b808652909350905083601c8411156200249f57601c81016000805b6020600162002435601c8a62002a8b565b6200244290602062003061565b6200244e919062002a8b565b6200245a919062003315565b8110156200249b57600081815260208b815260409091205480855292506200248490849062003061565b9250806200249281620032bd565b91505062002424565b5050505b600192505050935093915050565b6000806001600160a01b038316620024ca57506000928392509050565b60008060405180610160016040528061012681526020016200346e6101269139519050843b91508082101562002507575060009485945092505050565b62002341818362002a8b565b6000806000806200252486620024ad565b91509150806200253d5760008093509350505062000abe565b600060405180610160016040528061012681526020016200346e6101269139519050828187893c509095600195509350505050565b606060006200258183620029e6565b92509050601c8111156200261257603c82016000805b60206001620025a8601c8762002a8b565b620025b590602062003061565b620025c1919062002a8b565b620025cd919062003315565b8110156200260e57600081815260208881526040909120548085529250620025f790849062003061565b9250806200260581620032bd565b91505062002597565b5050505b5092915050565b606060008060006200262b85620024ad565b91509150806200263d57600062001583565b6000826001600160401b038111156200265a576200265a62002b90565b6040519080825280601f01601f19166020018201604052801562002685576020820181803683370190505b509050600060405180610160016040528061012681526020016200346e6101269139519050838160208401893c5095600195509350505050565b60008281526004602090815260408083208484529091529020548062000927578115806200271657506000838152600460205260408120816200270460018662002a8b565b81526020019081526020016000205414155b620009275760405162461bcd60e51b81526020600482015260166024820152751b5d5cdd081c995c1b1858d9481bdc88185c1c195b9960521b60448201526064016200090f565b60008281526020818152604080832084845290915290205480620027f957811580620027b25750600083815260208190526040812081620027a060018662002a8b565b81526020019081526020016000205414155b620027f95760405162461bcd60e51b81526020600482015260166024820152751b5d5cdd081c995c1b1858d9481bdc88185c1c195b9960521b60448201526064016200090f565b6200280481620023e4565b6200092757806001600160a01b0381161562000d8c57806001600160a01b0316632b68b9c66040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156200285657600080fd5b505af11580156200286b573d6000803e3d6000fd5b5050505050505050565b60008060405180610160016040528061012681526020016200346e61012691398585604051602001620028ab9392919062003338565b60408051601f1981840301815291905290506000620028cd6043602062003061565b30838201529050620028e2608c602062003061565b905030818301525060008382604051620028fc9062002a51565b62002908919062002d66565b6040518091039082f090508015801562002926573d6000803e3d6000fd5b509695505050505050565b805160208083015160e083901b911c1790601c81111562002612576000603c8401815b6020600162002965601c8762002a8b565b6200297290602062003061565b6200297e919062002a8b565b6200298a919062003315565b8110156200260e5781519250620029a382602062003061565b6000828152602089905260409020849055915080620029c281620032bd565b91505062002954565b600080620029d98360e01c90565b9360209390931b92915050565b60006060620029f58360e01c90565b9150602083901b9250816001600160401b0381111562002a195762002a1962002b90565b6040519080825280601f01601f19166020018201604052801562002a44576020820181803683370190505b5060208101939093525091565b61010b806200336383390190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b8181038181111562000e725762000e7262002a75565b6000808585111562002ab257600080fd5b8386111562002ac057600080fd5b5050820193919092039150565b600181811c9082168062002ae257607f821691505b60208210810362001fc657634e487b7160e01b600052602260045260246000fd5b828482376000838201600081526000845462002b1f8162002acd565b6001828116801562002b3a576001811462002b505762002b81565b60ff198416865282151583028601945062002b81565b8860005260208060002060005b8581101562002b785781548982015290840190820162002b5d565b50505082860194505b50929998505050505050505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b038111828210171562002bd15762002bd162002b90565b604052919050565b60006001600160401b0382111562002bf55762002bf562002b90565b50601f01601f191660200190565b600082601f83011262002c1557600080fd5b813562002c2c62002c268262002bd9565b62002ba6565b81815284602083860101111562002c4257600080fd5b816020850160208301376000918101602001919091529392505050565b60008083601f84011262002c7257600080fd5b5081356001600160401b0381111562002c8a57600080fd5b60208301915083602082850101111562000abe57600080fd5b60008060006040848603121562002cb957600080fd5b83356001600160401b038082111562002cd157600080fd5b62002cdf8783880162002c03565b9450602086013591508082111562002cf657600080fd5b5062002d058682870162002c5f565b9497909650939450505050565b60005b8381101562002d2f57818101518382015260200162002d15565b50506000910152565b6000815180845262002d5281602086016020860162002d12565b601f01601f19169290920160200192915050565b60208152600062001016602083018462002d38565b60006020828403121562002d8e57600080fd5b813563ffffffff811681146200101657600080fd5b6000806040838503121562002db757600080fd5b82356001600160401b0381111562002dce57600080fd5b62002ddc8582860162002c03565b95602094909401359450505050565b60408152600062002e00604083018562002d38565b905082151560208301529392505050565b60006020828403121562002e2457600080fd5b81356001600160401b0381111562002e3b57600080fd5b62002e498482850162002c03565b949350505050565b600082601f83011262002e6357600080fd5b813560206001600160401b0382111562002e815762002e8162002b90565b8160051b62002e9282820162002ba6565b928352848101820192828101908785111562002ead57600080fd5b83870192505b8483101562002ece5782358252918301919083019062002eb3565b979650505050505050565b60008060006060848603121562002eef57600080fd5b83356001600160401b038082111562002f0757600080fd5b62002f158783880162002c03565b9450602086013591508082111562002f2c57600080fd5b62002f3a8783880162002e51565b9350604086013591508082111562002f5157600080fd5b5062002f608682870162002e51565b9150509250925092565b6000806000806060858703121562002f8157600080fd5b84356001600160401b038082111562002f9957600080fd5b62002fa78883890162002c03565b955060208701359450604087013591508082111562002fc557600080fd5b5062002fd48782880162002c5f565b95989497509550505050565b634e487b7160e01b600052602160045260246000fd5b60208101600383106200300d576200300d62002fe0565b91905290565b600080604083850312156200302757600080fd5b50508035926020909101359150565b6000602082840312156200304957600080fd5b81356001600160a01b03811681146200101657600080fd5b8082018082111562000e725762000e7262002a75565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b601f8211156200092757600081815260208120601f850160051c81016020861015620030d55750805b601f850160051c820191505b8181101562001e7b57828155600101620030e1565b81516001600160401b0381111562003112576200311262002b90565b6200312a8162003123845462002acd565b84620030ac565b602080601f831160018114620031625760008415620031495750858301515b600019600386901b1c1916600185901b17855562001e7b565b600085815260208120601f198616915b82811015620031935788860151825594840194600190910190840162003172565b5085821015620031b25787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b600060208284031215620031d557600080fd5b5051919050565b600060208284031215620031ef57600080fd5b815167ffffffffffffffff19811681146200101657600080fd5b848152608081016002851062003223576200322362002fe0565b84602083015283604083015282606083015295945050505050565b6000602082840312156200325157600080fd5b81516001600160401b038111156200326857600080fd5b8201601f810184136200327a57600080fd5b80516200328b62002c268262002bd9565b818152856020838501011115620032a157600080fd5b620032b482602083016020860162002d12565b95945050505050565b600060018201620032d257620032d262002a75565b5060010190565b808202811582820484141762000e725762000e7262002a75565b600060ff821660ff81036200330c576200330c62002a75565b60010192915050565b6000826200333357634e487b7160e01b600052601260045260246000fd5b500490565b600084516200334c81846020890162002d12565b820183858237600093019283525090939250505056fe608060405260405161010b38038061010b83398101604081905261002291610041565b80518060208301f35b634e487b7160e01b600052604160045260246000fd5b6000602080838503121561005457600080fd5b82516001600160401b038082111561006b57600080fd5b818501915085601f83011261007f57600080fd5b8151818111156100915761009161002b565b604051601f8201601f19908116603f011681019083821181831017156100b9576100b961002b565b8160405282815288868487010111156100d157600080fd5b600093505b828410156100f357848401860151818501870152928501926100d6565b60008684830101528096505050505050509291505056fe6080604052348015600f57600080fd5b506004361060325760003560e01c80632b68b9c61460375780638da5cb5b14603f575b600080fd5b603d6081565b005b60657f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200160405180910390f35b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161460ed5760405162461bcd60e51b815260206004820152600e60248201526d3737ba10333937b69037bbb732b960911b604482015260640160405180910390fd5b33fffea2646970667358221220fc66c9afb7cb2f6209ae28167cf26c6c06f86a82cbe3c56de99027979389a1be64736f6c63430008070033a264697066735822122074ecdb7c1356cd26b7ae20a002751e685b2c97645c0ec1b1214c316ec9516dce64736f6c634300081200330000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001f000000000000000000000000000804c520d3c084c805e37a35e90057ac32831f96f
Deployed Bytecode
0x608060405260043610620001ee5760003560e01c8063590e1ae3116200010f578063caf1283611620000a3578063dd473fae116200006d578063dd473fae1462000776578063f14c7ad71462000794578063f2fde38b14620007ac578063f916c5b014620007d157620001ee565b8063caf1283614620006b5578063cf86bf9314620006f0578063d84eb56c146200072c578063dc38b0a2146200075157620001ee565b80638bf4515c11620000e55780638bf4515c14620006005780638da5cb5b146200062557806393b7628f1462000645578063956a3433146200069057620001ee565b8063590e1ae314620005ab5780635ba1d9e514620005c3578063715018a614620005e857620001ee565b80631ccbc6da116200018757806342216bed116200015d57806342216bed1462000504578063492c7b2a14620005295780634eed7cf1146200054057806358edef4c146200058657620001ee565b80631ccbc6da14620004ae5780631fbfa12714620004d55780632b68b9c614620004ec57620001ee565b806311ce026711620001c957806311ce026714620003de5780631a7237e014620004195780631c5ee10c146200044e5780631c993ad5146200048957620001ee565b8063038cd79f14620003705780630936286114620003895780631089f40f14620003b9575b348015620001fb57600080fd5b506000366060808284036200022157505060408051602081019091526000815262000365565b8383600081811062000237576200023762002a5f565b9050013560f81c60f81b6001600160f81b031916602f60f81b146200028357505060408051808201909152600e81526d0d2dcc6dee4e4cac6e840e0c2e8d60931b602082015262000365565b83836200029260018262002a8b565b818110620002a457620002a462002a5f565b909101356001600160f81b031916602f60f81b0390506200030657620002fd620002d2846001818862002aa1565b6006604051602001620002e89392919062002b03565b604051602081830303815290604052620007f6565b50905062000358565b6200035462000319846001818862002aa1565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250620007f692505050565b5090505b6200036381620008a1565b505b915050805190602001f35b620003876200038136600462002ca3565b620008e2565b005b3480156200039657600080fd5b50620003a16200092c565b604051620003b0919062002d66565b60405180910390f35b348015620003c657600080fd5b5062000387620003d836600462002d7b565b620009c2565b348015620003eb57600080fd5b5060035462000400906001600160a01b031681565b6040516001600160a01b039091168152602001620003b0565b3480156200042657600080fd5b506200043e6200043836600462002da3565b62000a15565b604051620003b092919062002deb565b3480156200045b57600080fd5b50620004736200046d36600462002e11565b62000ac5565b60408051928352602083019190915201620003b0565b3480156200049657600080fd5b5062000387620004a836600462002e11565b62000b58565b348015620004bb57600080fd5b50620004c662000b97565b604051908152602001620003b0565b62000387620004e636600462002ed9565b62000c0d565b348015620004f957600080fd5b506200038762000d92565b3480156200051157600080fd5b50620004c66200052336600462002da3565b62000dcd565b620003876200053a36600462002f6a565b62000e78565b3480156200054d57600080fd5b507f000000000000000000000000000000000000000000000000000000000000000060ff1615155b6040519015158152602001620003b0565b3480156200059357600080fd5b50620004c6620005a536600462002e11565b62000f8f565b348015620005b857600080fd5b506200038762001057565b348015620005d057600080fd5b5062000575620005e236600462002da3565b620010c1565b348015620005f557600080fd5b506200038762001181565b3480156200060d57600080fd5b506200043e6200061f36600462002e11565b620007f6565b3480156200063257600080fd5b506002546001600160a01b031662000400565b3480156200065257600080fd5b50620006816200066436600462002e11565b805160209182012060009081526005909152604090205460ff1690565b604051620003b0919062002ff6565b3480156200069d57600080fd5b50620004c6620006af36600462003013565b620011bc565b348015620006c257600080fd5b50620006da620006d436600462002da3565b62001276565b60408051928352901515602083015201620003b0565b348015620006fd57600080fd5b506002546200071690600160a01b900463ffffffff1681565b60405163ffffffff9091168152602001620003b0565b3480156200073957600080fd5b50620004c66200074b36600462002da3565b6200130c565b3480156200075e57600080fd5b50620003876200077036600462003036565b620013c2565b3480156200078357600080fd5b50651b585b9d585b60d21b620004c6565b348015620007a157600080fd5b506200057562001411565b348015620007b957600080fd5b5062000387620007cb36600462003036565b6200143d565b348015620007de57600080fd5b50620004c6620007f036600462002e11565b620014dc565b60606000806200081d84805160209182012060009081526005909152604090205460ff1690565b9050600281600281111562000836576200083662002fe0565b0362000858576200084e848051906020012062001561565b9250925050915091565b60018160028111156200086f576200086f62002fe0565b0362000887576200084e848051906020012062001761565b505060408051600080825260208201909252939092509050565b600081516040620008b3919062003061565b9050601f19620008c582602062003061565b620008d290601f62003061565b1690506020808303528060208303f35b6002546001600160a01b03163314620009185760405162461bcd60e51b81526004016200090f9062003077565b60405180910390fd5b62000927836000848462000e78565b505050565b600680546200093b9062002acd565b80601f0160208091040260200160405190810160405280929190818152602001828054620009699062002acd565b8015620009ba5780601f106200098e57610100808354040283529160200191620009ba565b820191906000526020600020905b8154815290600101906020018083116200099c57829003601f168201915b505050505081565b6002546001600160a01b03163314620009ef5760405162461bcd60e51b81526004016200090f9062003077565b6002805463ffffffff909216600160a01b0263ffffffff60a01b19909216919091179055565b606060008062000a3c85805160209182012060009081526005909152604090205460ff1690565b9050600281600281111562000a555762000a5562002fe0565b0362000a795762000a6e8580519060200120856200188e565b925092505062000abe565b600181600281111562000a905762000a9062002fe0565b0362000aa95762000a6e8580519060200120856200196b565b50506040805160008082526020820190925291505b9250929050565b600080600062000aec84805160209182012060009081526005909152604090205460ff1690565b9050600281600281111562000b055762000b0562002fe0565b0362000b1d576200084e8480519060200120620019e4565b600181600281111562000b345762000b3462002fe0565b0362000b4c576200084e848051906020012062001abb565b50600093849350915050565b6002546001600160a01b0316331462000b855760405162461bcd60e51b81526004016200090f9062003077565b600662000b938282620030f6565b5050565b60035460408051630e65e36d60e11b815290516000926001600160a01b031691631ccbc6da9160048083019260209291908290030181865afa15801562000be2573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000c089190620031c2565b905090565b6002546001600160a01b0316331462000c3a5760405162461bcd60e51b81526004016200090f9062003077565b62000c4462001411565b62000cab5760405162461bcd60e51b815260206004820152603060248201527f5468652063757272656e74206e6574776f726b20646f6573206e6f742073757060448201526f1c1bdc9d08189b1bd8881d5c1b1bd85960821b60648201526084016200090f565b600062000ccf84805160209182012060009081526005909152604090205460ff1690565b9050600081600281111562000ce85762000ce862002fe0565b148062000d095750600281600281111562000d075762000d0762002fe0565b145b62000d4e5760405162461bcd60e51b8152602060048201526014602482015273496e76616c69642073746f72616765206d6f646560601b60448201526064016200090f565b600081600281111562000d655762000d6562002fe0565b0362000d785762000d7884600262001b12565b62000d8c8480519060200120848462001b54565b50505050565b6002546001600160a01b0316331462000dbf5760405162461bcd60e51b81526004016200090f9062003077565b6002546001600160a01b0316ff5b60008062000df284805160209182012060009081526005909152604090205460ff1690565b9050600281600281111562000e0b5762000e0b62002fe0565b0362000e2d5762000e24848051906020012084620011bc565b91505062000e72565b600181600281111562000e445762000e4462002fe0565b0362000e6c57600062000e58858562000a15565b508051602090910120925062000e72915050565b50600090505b92915050565b6002546001600160a01b0316331462000ea55760405162461bcd60e51b81526004016200090f9062003077565b600062000ec985805160209182012060009081526005909152604090205460ff1690565b9050600081600281111562000ee25762000ee262002fe0565b148062000f035750600181600281111562000f015762000f0162002fe0565b145b62000f485760405162461bcd60e51b8152602060048201526014602482015273496e76616c69642073746f72616765206d6f646560601b60448201526064016200090f565b600081600281111562000f5f5762000f5f62002fe0565b0362000f725762000f7285600162001b12565b62000f8885805190602001208585853462001e83565b5050505050565b6002546000906001600160a01b0316331462000fbf5760405162461bcd60e51b81526004016200090f9062003077565b600062000fe383805160209182012060009081526005909152604090205460ff1690565b9050600281600281111562000ffc5762000ffc62002fe0565b036200101d57620010168380519060200120600062001f6c565b9392505050565b600181600281111562001034576200103462002fe0565b036200104e57620010168380519060200120600062001fcc565b50600092915050565b6002546001600160a01b03163314620010845760405162461bcd60e51b81526004016200090f9062003077565b6002546040516001600160a01b03909116904780156108fc02916000818181858888f19350505050158015620010be573d6000803e3d6000fd5b50565b6002546000906001600160a01b03163314620010f15760405162461bcd60e51b81526004016200090f9062003077565b60006200111584805160209182012060009081526005909152604090205460ff1690565b905060028160028111156200112e576200112e62002fe0565b03620011475762000e248480519060200120846200208e565b60018160028111156200115e576200115e62002fe0565b03620011775762000e2484805190602001208462002116565b5060009392505050565b6002546001600160a01b03163314620011ae5760405162461bcd60e51b81526004016200090f9062003077565b620011ba600062002206565b565b6000620011c98362002258565b8210620011d95750600062000e72565b60035460008481526004602081815260408084208785529091529182902054915163d8389dc560e01b8152908101919091526001600160a01b039091169063d8389dc590602401602060405180830381865afa1580156200123e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620012649190620031dc565b67ffffffffffffffff19169392505050565b60008060006200129d85805160209182012060009081526005909152604090205460ff1690565b90506002816002811115620012b657620012b662002fe0565b03620012cf5762000a6e85805190602001208562002299565b6001816002811115620012e657620012e662002fe0565b03620012ff5762000a6e8580519060200120856200234d565b5060009485945092505050565b6002546000906001600160a01b031633146200133c5760405162461bcd60e51b81526004016200090f9062003077565b60006200136084805160209182012060009081526005909152604090205460ff1690565b9050600281600281111562001379576200137962002fe0565b03620013925762000e2484805190602001208462001f6c565b6001816002811115620013a957620013a962002fe0565b03620011775762000e2484805190602001208462001fcc565b6002546001600160a01b03163314620013ef5760405162461bcd60e51b81526004016200090f9062003077565b600380546001600160a01b0319166001600160a01b0392909216919091179055565b6003546000906001600160a01b03161580159062000c08575060006200143662000b97565b1015905090565b6002546001600160a01b031633146200146a5760405162461bcd60e51b81526004016200090f9062003077565b6001600160a01b038116620014d15760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016200090f565b620010be8162002206565b6000806200150183805160209182012060009081526005909152604090205460ff1690565b905060028160028111156200151a576200151a62002fe0565b03620015325762001016838051906020012062002258565b600181600281111562001549576200154962002fe0565b036200104e57620010168380519060200120620023a5565b606060008060006200157385620019e4565b9150915080600003620015bb5760005b6040519080825280601f01601f191660200182016040528015620015ae576020820181803683370190505b5095600095509350505050565b6000826001600160401b03811115620015d857620015d862002b90565b6040519080825280601f01601f19166020018201604052801562001603576020820181803683370190505b5090506000805b838110156200175257600088815260046020818152604080842085855290915280832054600354915163afd5644d60e01b815292830181905292916001600160a01b039091169063afd5644d90602401602060405180830381865afa15801562001678573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200169e9190620031c2565b60035460405163bea94b8b60e01b81529192506001600160a01b03169063bea94b8b90620016d9908590600190600090879060040162003209565b600060405180830381865afa158015620016f7573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526200172191908101906200323e565b508060406020868801013e62001738818562003061565b9350505080806200174990620032bd565b9150506200160a565b50909660019650945050505050565b60606000806000620017738562001abb565b91509150806000036200178857600062001583565b6000826001600160401b03811115620017a557620017a562002b90565b6040519080825280601f01601f191660200182016040528015620017d0576020820181803683370190505b5090506020810160005b838110156200175257600088815260208181526040808320848452909152812054906200180782620023e4565b156200184957620018188260e01c90565b60008b8152600160209081526040808320878452909152902090915062001841908386620023f9565b505062001868565b816200185581620024ad565b50915062001864818662002513565b5050505b62001874818562003061565b9350505080806200188590620032bd565b915050620017da565b60606000806200189f858562002299565b5090506001811015620018c657505060408051600080825260208201909252915062000abe565b600354600086815260046020818152604080842089855290915280832054905163bea94b8b60e01b815292936001600160a01b03169263bea94b8b92620019169291600191879189910162003209565b600060405180830381865afa15801562001934573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526200195e91908101906200323e565b9660019650945050505050565b600082815260208181526040808320848452909152812054606091906200199281620023e4565b15620019cc5760008581526001602090815260408083208784529091528120620019bd908362002572565b93506001925062000abe915050565b80620019d88162002619565b93509350505062000abe565b6000806000620019f48462002258565b90506000805b8281101562001ab15760035460008781526004602081815260408084208685529091529182902054915163afd5644d60e01b8152908101919091526001600160a01b039091169063afd5644d90602401602060405180830381865afa15801562001a68573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001a8e9190620031c2565b62001a9a908362003061565b91508062001aa881620032bd565b915050620019fa565b5094909350915050565b6000806000805b60008062001ad187846200234d565b915091508062001ae357505062001b08565b62001aef828562003061565b93508262001afd81620032bd565b935050505062001ac2565b9094909350915050565b81516020808401919091206000908152600590915260409020805482919060ff1916600183600281111562001b4b5762001b4b62002fe0565b02179055505050565b815160035460408051630e65e36d60e11b815290516000926001600160a01b031691631ccbc6da9160048083019260209291908290030181865afa15801562001ba1573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001bc79190620031c2565b905062001bd58282620032d9565b34101562001c1d5760405162461bcd60e51b8152602060048201526014602482015273696e73756666696369656e742062616c616e636560601b60448201526064016200090f565b60005b828160ff16101562001e7b57838160ff168151811062001c445762001c4462002a5f565b6020026020010151600010801562001c935750600260149054906101000a900463ffffffff1663ffffffff16848260ff168151811062001c885762001c8862002a5f565b602002602001015111155b62001cd85760405162461bcd60e51b81526020600482015260146024820152730d2dcecc2d8d2c840c6d0eadcd640d8cadccee8d60631b60448201526064016200090f565b62001d0386868360ff168151811062001cf55762001cf562002a5f565b6020026020010151620026bf565b60003387878460ff168151811062001d1f5762001d1f62002a5f565b602002602001015160405160200162001d56939291906001600160a01b039390931683526020830191909152604082015260600190565b604051602081830303815290604052805190602001209050600360009054906101000a90046001600160a01b03166001600160a01b0316634581a920848385898760ff168151811062001dad5762001dad62002a5f565b60200260200101516040518563ffffffff1660e01b815260040162001de89392919092835260ff919091166020830152604082015260600190565b6000604051808303818588803b15801562001e0257600080fd5b505af115801562001e17573d6000803e3d6000fd5b505050505080600460008981526020019081526020016000206000888560ff168151811062001e4a5762001e4a62002a5f565b602002602001015181526020019081526020016000208190555050808062001e7290620032f3565b91505062001c20565b505050505050565b62001e8f85856200275d565b60ff7f00000000000000000000000000000000000000000000000000000000000000001682111562001ef65762001ed862001ecc84848462002875565b6001600160a01b031690565b60008681526020818152604080832088845290915290205562000f88565b60008581526001602090815260408083208784528252918290208251601f860183900483028101830190935284835262001f4d92909186908690819084018382808284376000920191909152506200293192505050565b6000868152602081815260408083208884529091529020555050505050565b60005b60008381526004602090815260408083208584529091529020548062001f96575062001fc6565b60008481526004602090815260408083208684529091528120558262001fbc81620032bd565b9350505062001f6f565b50919050565b60005b6000838152602081815260408083208584529091529020548062001ff4575062001fc6565b62001fff81620023e4565b62002060576000819050806001600160a01b0316632b68b9c66040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156200204557600080fd5b505af11580156200205a573d6000803e3d6000fd5b50505050505b600084815260208181526040808320868452909152812055826200208481620032bd565b9350505062001fcf565b600082815260046020908152604080832084845290915281205480620020b957600091505062000e72565b600084815260046020526040812081620020d586600162003061565b81526020019081526020016000205414620020f557600091505062000e72565b50506000918252600460209081526040808420928452919052812055600190565b600082815260208181526040808320848452909152812054806200213f57600091505062000e72565b6000848152602081905260408120816200215b86600162003061565b815260200190815260200160002054146200217b57600091505062000e72565b6200218681620023e4565b620021e7576000819050806001600160a01b0316632b68b9c66040518163ffffffff1660e01b8152600401600060405180830381600087803b158015620021cc57600080fd5b505af1158015620021e1573d6000803e3d6000fd5b50505050505b5050600091825260208281526040808420928452919052812055600190565b600280546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6000805b60008381526004602090815260408083208484529091529020548062002283575062000e72565b816200228f81620032bd565b925050506200225c565b600080620022a78462002258565b8310620022ba5750600090508062000abe565b600354600085815260046020818152604080842088855290915280832054905163afd5644d60e01b81529182015290916001600160a01b03169063afd5644d90602401602060405180830381865afa1580156200231b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620023419190620031c2565b95600195509350505050565b6000828152602081815260408083208484529091528120548190806200237b57600080925092505062000abe565b6200238681620023e4565b1562002399576000620019bd8260e01c90565b80620019d881620024ad565b6000805b60008381526020818152604080832084845290915290205480620023ce575062000e72565b81620023da81620032bd565b92505050620023a9565b600080620023f28360e01c90565b1192915050565b60008060006200240985620029cb565b808652909350905083601c8411156200249f57601c81016000805b6020600162002435601c8a62002a8b565b6200244290602062003061565b6200244e919062002a8b565b6200245a919062003315565b8110156200249b57600081815260208b815260409091205480855292506200248490849062003061565b9250806200249281620032bd565b91505062002424565b5050505b600192505050935093915050565b6000806001600160a01b038316620024ca57506000928392509050565b60008060405180610160016040528061012681526020016200346e6101269139519050843b91508082101562002507575060009485945092505050565b62002341818362002a8b565b6000806000806200252486620024ad565b91509150806200253d5760008093509350505062000abe565b600060405180610160016040528061012681526020016200346e6101269139519050828187893c509095600195509350505050565b606060006200258183620029e6565b92509050601c8111156200261257603c82016000805b60206001620025a8601c8762002a8b565b620025b590602062003061565b620025c1919062002a8b565b620025cd919062003315565b8110156200260e57600081815260208881526040909120548085529250620025f790849062003061565b9250806200260581620032bd565b91505062002597565b5050505b5092915050565b606060008060006200262b85620024ad565b91509150806200263d57600062001583565b6000826001600160401b038111156200265a576200265a62002b90565b6040519080825280601f01601f19166020018201604052801562002685576020820181803683370190505b509050600060405180610160016040528061012681526020016200346e6101269139519050838160208401893c5095600195509350505050565b60008281526004602090815260408083208484529091529020548062000927578115806200271657506000838152600460205260408120816200270460018662002a8b565b81526020019081526020016000205414155b620009275760405162461bcd60e51b81526020600482015260166024820152751b5d5cdd081c995c1b1858d9481bdc88185c1c195b9960521b60448201526064016200090f565b60008281526020818152604080832084845290915290205480620027f957811580620027b25750600083815260208190526040812081620027a060018662002a8b565b81526020019081526020016000205414155b620027f95760405162461bcd60e51b81526020600482015260166024820152751b5d5cdd081c995c1b1858d9481bdc88185c1c195b9960521b60448201526064016200090f565b6200280481620023e4565b6200092757806001600160a01b0381161562000d8c57806001600160a01b0316632b68b9c66040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156200285657600080fd5b505af11580156200286b573d6000803e3d6000fd5b5050505050505050565b60008060405180610160016040528061012681526020016200346e61012691398585604051602001620028ab9392919062003338565b60408051601f1981840301815291905290506000620028cd6043602062003061565b30838201529050620028e2608c602062003061565b905030818301525060008382604051620028fc9062002a51565b62002908919062002d66565b6040518091039082f090508015801562002926573d6000803e3d6000fd5b509695505050505050565b805160208083015160e083901b911c1790601c81111562002612576000603c8401815b6020600162002965601c8762002a8b565b6200297290602062003061565b6200297e919062002a8b565b6200298a919062003315565b8110156200260e5781519250620029a382602062003061565b6000828152602089905260409020849055915080620029c281620032bd565b91505062002954565b600080620029d98360e01c90565b9360209390931b92915050565b60006060620029f58360e01c90565b9150602083901b9250816001600160401b0381111562002a195762002a1962002b90565b6040519080825280601f01601f19166020018201604052801562002a44576020820181803683370190505b5060208101939093525091565b61010b806200336383390190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b8181038181111562000e725762000e7262002a75565b6000808585111562002ab257600080fd5b8386111562002ac057600080fd5b5050820193919092039150565b600181811c9082168062002ae257607f821691505b60208210810362001fc657634e487b7160e01b600052602260045260246000fd5b828482376000838201600081526000845462002b1f8162002acd565b6001828116801562002b3a576001811462002b505762002b81565b60ff198416865282151583028601945062002b81565b8860005260208060002060005b8581101562002b785781548982015290840190820162002b5d565b50505082860194505b50929998505050505050505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b038111828210171562002bd15762002bd162002b90565b604052919050565b60006001600160401b0382111562002bf55762002bf562002b90565b50601f01601f191660200190565b600082601f83011262002c1557600080fd5b813562002c2c62002c268262002bd9565b62002ba6565b81815284602083860101111562002c4257600080fd5b816020850160208301376000918101602001919091529392505050565b60008083601f84011262002c7257600080fd5b5081356001600160401b0381111562002c8a57600080fd5b60208301915083602082850101111562000abe57600080fd5b60008060006040848603121562002cb957600080fd5b83356001600160401b038082111562002cd157600080fd5b62002cdf8783880162002c03565b9450602086013591508082111562002cf657600080fd5b5062002d058682870162002c5f565b9497909650939450505050565b60005b8381101562002d2f57818101518382015260200162002d15565b50506000910152565b6000815180845262002d5281602086016020860162002d12565b601f01601f19169290920160200192915050565b60208152600062001016602083018462002d38565b60006020828403121562002d8e57600080fd5b813563ffffffff811681146200101657600080fd5b6000806040838503121562002db757600080fd5b82356001600160401b0381111562002dce57600080fd5b62002ddc8582860162002c03565b95602094909401359450505050565b60408152600062002e00604083018562002d38565b905082151560208301529392505050565b60006020828403121562002e2457600080fd5b81356001600160401b0381111562002e3b57600080fd5b62002e498482850162002c03565b949350505050565b600082601f83011262002e6357600080fd5b813560206001600160401b0382111562002e815762002e8162002b90565b8160051b62002e9282820162002ba6565b928352848101820192828101908785111562002ead57600080fd5b83870192505b8483101562002ece5782358252918301919083019062002eb3565b979650505050505050565b60008060006060848603121562002eef57600080fd5b83356001600160401b038082111562002f0757600080fd5b62002f158783880162002c03565b9450602086013591508082111562002f2c57600080fd5b62002f3a8783880162002e51565b9350604086013591508082111562002f5157600080fd5b5062002f608682870162002e51565b9150509250925092565b6000806000806060858703121562002f8157600080fd5b84356001600160401b038082111562002f9957600080fd5b62002fa78883890162002c03565b955060208701359450604087013591508082111562002fc557600080fd5b5062002fd48782880162002c5f565b95989497509550505050565b634e487b7160e01b600052602160045260246000fd5b60208101600383106200300d576200300d62002fe0565b91905290565b600080604083850312156200302757600080fd5b50508035926020909101359150565b6000602082840312156200304957600080fd5b81356001600160a01b03811681146200101657600080fd5b8082018082111562000e725762000e7262002a75565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b601f8211156200092757600081815260208120601f850160051c81016020861015620030d55750805b601f850160051c820191505b8181101562001e7b57828155600101620030e1565b81516001600160401b0381111562003112576200311262002b90565b6200312a8162003123845462002acd565b84620030ac565b602080601f831160018114620031625760008415620031495750858301515b600019600386901b1c1916600185901b17855562001e7b565b600085815260208120601f198616915b82811015620031935788860151825594840194600190910190840162003172565b5085821015620031b25787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b600060208284031215620031d557600080fd5b5051919050565b600060208284031215620031ef57600080fd5b815167ffffffffffffffff19811681146200101657600080fd5b848152608081016002851062003223576200322362002fe0565b84602083015283604083015282606083015295945050505050565b6000602082840312156200325157600080fd5b81516001600160401b038111156200326857600080fd5b8201601f810184136200327a57600080fd5b80516200328b62002c268262002bd9565b818152856020838501011115620032a157600080fd5b620032b482602083016020860162002d12565b95945050505050565b600060018201620032d257620032d262002a75565b5060010190565b808202811582820484141762000e725762000e7262002a75565b600060ff821660ff81036200330c576200330c62002a75565b60010192915050565b6000826200333357634e487b7160e01b600052601260045260246000fd5b500490565b600084516200334c81846020890162002d12565b820183858237600093019283525090939250505056fe608060405260405161010b38038061010b83398101604081905261002291610041565b80518060208301f35b634e487b7160e01b600052604160045260246000fd5b6000602080838503121561005457600080fd5b82516001600160401b038082111561006b57600080fd5b818501915085601f83011261007f57600080fd5b8151818111156100915761009161002b565b604051601f8201601f19908116603f011681019083821181831017156100b9576100b961002b565b8160405282815288868487010111156100d157600080fd5b600093505b828410156100f357848401860151818501870152928501926100d6565b60008684830101528096505050505050509291505056fe6080604052348015600f57600080fd5b506004361060325760003560e01c80632b68b9c61460375780638da5cb5b14603f575b600080fd5b603d6081565b005b60657f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200160405180910390f35b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161460ed5760405162461bcd60e51b815260206004820152600e60248201526d3737ba10333937b69037bbb732b960911b604482015260640160405180910390fd5b33fffea2646970667358221220fc66c9afb7cb2f6209ae28167cf26c6c06f86a82cbe3c56de99027979389a1be64736f6c63430008070033a264697066735822122074ecdb7c1356cd26b7ae20a002751e685b2c97645c0ec1b1214c316ec9516dce64736f6c63430008120033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001f000000000000000000000000000804c520d3c084c805e37a35e90057ac32831f96f
-----Decoded View---------------
Arg [0] : slotLimit (uint8): 0
Arg [1] : maxChunkSize (uint32): 126976
Arg [2] : storageAddress (address): 0x804C520d3c084C805E37A35E90057Ac32831F96f
-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [1] : 000000000000000000000000000000000000000000000000000000000001f000
Arg [2] : 000000000000000000000000804c520d3c084c805e37a35e90057ac32831f96f
Deployed Bytecode Sourcemap
44505:1104:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;44505:1104:0;;44874:12;;44935:20;;;44931:283;;-1:-1:-1;;45018:9:0;;;;;;;;;-1:-1:-1;45018:9:0;;45011:16;;44931:283;45049:8;;45058:1;45049:11;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;;;;;45049:19:0;;45064:4;45049:19;;;45045:169;;-1:-1:-1;;45179:23:0;;;;;;;;;;;;-1:-1:-1;;;45179:23:0;;;;45172:30;;45045:169;45230:8;;45239:19;45257:1;45230:8;45239:19;:::i;:::-;45230:29;;;;;;;:::i;:::-;;;;;-1:-1:-1;;;;;;45230:29:0;-1:-1:-1;;;45230:37:0;;-1:-1:-1;45226:194:0;;45298:45;45316:12;:8;45325:1;45316:8;;:12;:::i;:::-;45330:11;45303:39;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;45298:4;:45::i;:::-;-1:-1:-1;45284:59:0;-1:-1:-1;45226:194:0;;;45390:18;45395:12;:8;45404:1;45395:8;;:12;:::i;:::-;45390:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;45390:4:0;;-1:-1:-1;;;45390:18:0:i;:::-;-1:-1:-1;45376:32:0;-1:-1:-1;45226:194:0;45432:41;45465:7;45432:32;:41::i;:::-;44889:592;44822:659;;;;44505:1104;;;;;;39095:190;;;;;;:::i;:::-;;:::i;:::-;;44546:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4517:93;;;;;;;;;;-1:-1:-1;4517:93:0;;;;;:::i;:::-;;:::i;4083:42::-;;;;;;;;;;-1:-1:-1;4083:42:0;;;;-1:-1:-1;;;;;4083:42:0;;;;;;-1:-1:-1;;;;;5538:32:1;;;5520:51;;5508:2;5493:18;4083:42:0;5347:230:1;41981:435:0;;;;;;;;;;-1:-1:-1;41981:435:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;39686:370::-;;;;;;;;;;-1:-1:-1;39686:370:0;;;;;:::i;:::-;;:::i;:::-;;;;6777:25:1;;;6833:2;6818:18;;6811:34;;;;6750:18;39686:370:0;6603:248:1;45489:117:0;;;;;;;;;;-1:-1:-1;45489:117:0;;;;;:::i;:::-;;:::i;4767:114::-;;;;;;;;;;;;;:::i;:::-;;;7002:25:1;;;6990:2;6975:18;4767:114:0;6856:177:1;41392:581:0;;;;;;:::i;:::-;;:::i;43810:95::-;;;;;;;;;;;;;:::i;43913:455::-;;;;;;;;;;-1:-1:-1;43913:455:0;;;;;:::i;:::-;;:::i;40872:512::-;;;;;;:::i;:::-;;:::i;32484:89::-;;;;;;;;;;-1:-1:-1;32551:10:0;:14;;;;32484:89;;;9601:14:1;;9594:22;9576:41;;9564:2;9549:18;32484:89:0;9436:187:1;40064:373:0;;;;;;;;;;-1:-1:-1;40064:373:0;;;;;:::i;:::-;;:::i;43691:111::-;;;;;;;;;;;;;:::i;42853:418::-;;;;;;;;;;-1:-1:-1;42853:418:0;;;;;:::i;:::-;;:::i;2698:94::-;;;;;;;;;;;;;:::i;39293:385::-;;;;;;;;;;-1:-1:-1;39293:385:0;;;;;:::i;:::-;;:::i;2047:87::-;;;;;;;;;;-1:-1:-1;2120:6:0;;-1:-1:-1;;;;;2120:6:0;2047:87;;38791:132;;;;;;;;;;-1:-1:-1;38791:132:0;;;;;:::i;:::-;38899:15;;;;;;;38855:11;38886:29;;;:12;:29;;;;;;;;;;38791:132;;;;;;;;:::i;9423:260::-;;;;;;;;;;-1:-1:-1;9423:260:0;;;;;:::i;:::-;;:::i;42424:421::-;;;;;;;;;;-1:-1:-1;42424:421:0;;;;;:::i;:::-;;:::i;:::-;;;;10641:25:1;;;10709:14;;10702:22;10697:2;10682:18;;10675:50;10614:18;42424:421:0;10473:258:1;4050:26:0;;;;;;;;;;-1:-1:-1;4050:26:0;;;;-1:-1:-1;;;4050:26:0;;;;;;;;;10910:10:1;10898:23;;;10880:42;;10868:2;10853:18;4050:26:0;10736:192:1;43279:404:0;;;;;;;;;;-1:-1:-1;43279:404:0;;;;;:::i;:::-;;:::i;4368:141::-;;;;;;;;;;-1:-1:-1;4368:141:0;;;;;:::i;:::-;;:::i;44717:97::-;;;;;;;;;;-1:-1:-1;;;;44717:97:0;;4618:141;;;;;;;;;;;;;:::i;2947:192::-;;;;;;;;;;-1:-1:-1;2947:192:0;;;;;:::i;:::-;;:::i;40445:377::-;;;;;;;;;;-1:-1:-1;40445:377:0;;;;;:::i;:::-;;:::i;39293:385::-;39364:12;39378:4;39395:16;39414:20;39429:4;38899:15;;;;;;;38855:11;38886:29;;;:12;:29;;;;;;;;;;38791:132;39414:20;39395:39;-1:-1:-1;39457:16:0;39449:4;:24;;;;;;;;:::i;:::-;;39445:187;;39497:29;39520:4;39510:15;;;;;;39497:12;:29::i;:::-;39490:36;;;;;39293:385;;;:::o;39445:187::-;39556:19;39548:4;:27;;;;;;;;:::i;:::-;;39544:88;;39599:21;39614:4;39604:15;;;;;;39599:4;:21::i;39544:88::-;-1:-1:-1;;39650:12:0;;;39660:1;39650:12;;;;;;;;;;39660:1;;-1:-1:-1;39642:28:0;-1:-1:-1;39293:385:0:o;30582:470::-;30705:12;30720:7;:14;30737:4;30720:21;;;;:::i;:::-;30705:36;-1:-1:-1;;;30778:11:0;30705:36;30785:4;30778:11;:::i;:::-;:18;;30792:4;30778:18;:::i;:::-;30777:37;30770:44;;30983:4;30976;30967:7;30963:18;30956:32;31029:4;31022;31013:7;31009:18;31002:32;39095:190;2120:6;;-1:-1:-1;;;;;2120:6:0;860:10;2267:23;2259:68;;;;-1:-1:-1;;;2259:68:0;;;;;;;:::i;:::-;;;;;;;;;39252:25:::1;39263:4;39269:1;39272:4;;39252:10;:25::i;:::-;39095:190:::0;;;:::o;44546:29::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;4517:93::-;2120:6;;-1:-1:-1;;;;;2120:6:0;860:10;2267:23;2259:68;;;;-1:-1:-1;;;2259:68:0;;;;;;;:::i;:::-;4583:12:::1;:19:::0;;::::1;::::0;;::::1;-1:-1:-1::0;;;4583:19:0::1;-1:-1:-1::0;;;;4583:19:0;;::::1;::::0;;;::::1;::::0;;4517:93::o;41981:435::-;42074:12;42088:4;42105:16;42124:20;42139:4;38899:15;;;;;;;38855:11;38886:29;;;:12;:29;;;;;;;;;;38791:132;42124:20;42105:39;-1:-1:-1;42167:16:0;42159:4;:24;;;;;;;;:::i;:::-;;42155:215;;42207:43;42235:4;42225:15;;;;;;42242:7;42207:17;:43::i;:::-;42200:50;;;;;;;42155:215;42280:19;42272:4;:27;;;;;;;;:::i;:::-;;42268:102;;42323:35;42343:4;42333:15;;;;;;42350:7;42323:9;:35::i;42268:102::-;-1:-1:-1;;42388:12:0;;;42398:1;42388:12;;;;;;;;;;-1:-1:-1;41981:435:0;;;;;;:::o;39686:370::-;39757:7;39766;39786:16;39805:20;39820:4;38899:15;;;;;;;38855:11;38886:29;;;:12;:29;;;;;;;;;;38791:132;39805:20;39786:39;-1:-1:-1;39848:16:0;39840:4;:24;;;;;;;;:::i;:::-;;39836:189;;39888:30;39912:4;39902:15;;;;;;39888:13;:30::i;39836:189::-;39948:19;39940:4;:27;;;;;;;;:::i;:::-;;39936:89;;39991:22;40007:4;39997:15;;;;;;39991:5;:22::i;39936:89::-;-1:-1:-1;40043:1:0;;;;-1:-1:-1;39686:370:0;-1:-1:-1;;39686:370:0:o;45489:117::-;2120:6;;-1:-1:-1;;;;;2120:6:0;860:10;2267:23;2259:68;;;;-1:-1:-1;;;2259:68:0;;;;;;;:::i;:::-;45572:11:::1;:26;45586:12:::0;45572:11;:26:::1;:::i;:::-;;45489:117:::0;:::o;4767:114::-;4841:15;;:32;;;-1:-1:-1;;;4841:32:0;;;;4814:7;;-1:-1:-1;;;;;4841:15:0;;:30;;:32;;;;;;;;;;;;;;:15;:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4834:39;;4767:114;:::o;41392:581::-;2120:6;;-1:-1:-1;;;;;2120:6:0;860:10;2267:23;2259:68;;;;-1:-1:-1;;;2259:68:0;;;;;;;:::i;:::-;41570:15:::1;:13;:15::i;:::-;41562:76;;;::::0;-1:-1:-1;;;41562:76:0;;14179:2:1;41562:76:0::1;::::0;::::1;14161:21:1::0;14218:2;14198:18;;;14191:30;14257:34;14237:18;;;14230:62;-1:-1:-1;;;14308:18:1;;;14301:46;14364:19;;41562:76:0::1;13977:412:1::0;41562:76:0::1;41651:16;41670:20;41685:4;38899:15:::0;;;;;;;38855:11;38886:29;;;:12;:29;;;;;;;;;;38791:132;41670:20:::1;41651:39:::0;-1:-1:-1;41717:25:0::1;41709:4;:33;;;;;;;;:::i;:::-;;:61;;;-1:-1:-1::0;41754:16:0::1;41746:4;:24;;;;;;;;:::i;:::-;;41709:61;41701:94;;;::::0;-1:-1:-1;;;41701:94:0;;14596:2:1;41701:94:0::1;::::0;::::1;14578:21:1::0;14635:2;14615:18;;;14608:30;-1:-1:-1;;;14654:18:1;;;14647:50;14714:18;;41701:94:0::1;14394:344:1::0;41701:94:0::1;41818:25;41810:4;:33;;;;;;;;:::i;:::-;::::0;41806:105:::1;;41860:39;41876:4;41882:16;41860:15;:39::i;:::-;41921:44;41942:4;41932:15;;;;;;41949:8;41959:5;41921:10;:44::i;:::-;41551:422;41392:581:::0;;;:::o;43810:95::-;2120:6;;-1:-1:-1;;;;;2120:6:0;860:10;2267:23;2259:68;;;;-1:-1:-1;;;2259:68:0;;;;;;;:::i;:::-;2120:6;;-1:-1:-1;;;;;2120:6:0;43867:30:::1;43913:455:::0;44001:7;44021:16;44040:20;44055:4;38899:15;;;;;;;38855:11;38886:29;;;:12;:29;;;;;;;;;;38791:132;44040:20;44021:39;-1:-1:-1;44083:16:0;44075:4;:24;;;;;;;;:::i;:::-;;44071:271;;44123:47;44155:4;44145:15;;;;;;44162:7;44123:21;:47::i;:::-;44116:54;;;;;44071:271;44200:19;44192:4;:27;;;;;;;;:::i;:::-;;44188:154;;44237:22;44264:24;44274:4;44280:7;44264:9;:24::i;:::-;-1:-1:-1;44310:20:0;;;;;;;;-1:-1:-1;44303:27:0;;-1:-1:-1;;44303:27:0;44188:154;-1:-1:-1;44359:1:0;;-1:-1:-1;43913:455:0;;;;;:::o;40872:512::-;2120:6;;-1:-1:-1;;;;;2120:6:0;860:10;2267:23;2259:68;;;;-1:-1:-1;;;2259:68:0;;;;;;;:::i;:::-;41036:16:::1;41055:20;41070:4;38899:15:::0;;;;;;;38855:11;38886:29;;;:12;:29;;;;;;;;;;38791:132;41055:20:::1;41036:39:::0;-1:-1:-1;41102:25:0::1;41094:4;:33;;;;;;;;:::i;:::-;;:64;;;-1:-1:-1::0;41139:19:0::1;41131:4;:27;;;;;;;;:::i;:::-;;41094:64;41086:97;;;::::0;-1:-1:-1;;;41086:97:0;;14596:2:1;41086:97:0::1;::::0;::::1;14578:21:1::0;14635:2;14615:18;;;14608:30;-1:-1:-1;;;14654:18:1;;;14647:50;14714:18;;41086:97:0::1;14394:344:1::0;41086:97:0::1;41206:25;41198:4;:33;;;;;;;;:::i;:::-;::::0;41194:108:::1;;41248:42;41264:4;41270:19;41248:15;:42::i;:::-;41312:64;41344:4;41334:15;;;;;;41351:7;41360:4;;41366:9;41312:21;:64::i;:::-;41025:359;40872:512:::0;;;;:::o;40064:373::-;2120:6;;40142:7;;-1:-1:-1;;;;;2120:6:0;860:10;2267:23;2259:68;;;;-1:-1:-1;;;2259:68:0;;;;;;;:::i;:::-;40162:16:::1;40181:20;40196:4;38899:15:::0;;;;;;;38855:11;38886:29;;;:12;:29;;;;;;;;;;38791:132;40181:20:::1;40162:39:::0;-1:-1:-1;40224:16:0::1;40216:4;:24;;;;;;;;:::i;:::-;::::0;40212:199:::1;;40264:35;40290:4;40280:15;;;;;;40297:1;40264:15;:35::i;:::-;40257:42:::0;40064:373;-1:-1:-1;;;40064:373:0:o;40212:199::-:1;40329:19;40321:4;:27;;;;;;;;:::i;:::-;::::0;40317:94:::1;;40372:27;40390:4;40380:15;;;;;;40397:1;40372:7;:27::i;40317:94::-;-1:-1:-1::0;40428:1:0::1;::::0;40064:373;-1:-1:-1;;40064:373:0:o;43691:111::-;2120:6;;-1:-1:-1;;;;;2120:6:0;860:10;2267:23;2259:68;;;;-1:-1:-1;;;2259:68:0;;;;;;;:::i;:::-;2120:6;;43746:48:::1;::::0;-1:-1:-1;;;;;2120:6:0;;;;43772:21:::1;43746:48:::0;::::1;;;::::0;::::1;::::0;;;43772:21;2120:6;43746:48;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;43691:111::o:0;42853:418::-;2120:6;;42953:4;;-1:-1:-1;;;;;2120:6:0;860:10;2267:23;2259:68;;;;-1:-1:-1;;;2259:68:0;;;;;;;:::i;:::-;42970:16:::1;42989:20;43004:4;38899:15:::0;;;;;;;38855:11;38886:29;;;:12;:29;;;;;;;;;;38791:132;42989:20:::1;42970:39:::0;-1:-1:-1;43032:16:0::1;43024:4;:24;;;;;;;;:::i;:::-;::::0;43020:221:::1;;43072:46;43103:4;43093:15;;;;;;43110:7;43072:20;:46::i;43020:221::-;43148:19;43140:4;:27;;;;;;;;:::i;:::-;::::0;43136:105:::1;;43191:38;43214:4;43204:15;;;;;;43221:7;43191:12;:38::i;43136:105::-;-1:-1:-1::0;43258:5:0::1;::::0;42853:418;-1:-1:-1;;;42853:418:0:o;2698:94::-;2120:6;;-1:-1:-1;;;;;2120:6:0;860:10;2267:23;2259:68;;;;-1:-1:-1;;;2259:68:0;;;;;;;:::i;:::-;2763:21:::1;2781:1;2763:9;:21::i;:::-;2698:94::o:0;9423:260::-;9505:7;9540:25;9561:3;9540:20;:25::i;:::-;9529:7;:36;9525:86;;-1:-1:-1;9597:1:0;9582:17;;9525:86;9628:15;;;9649:16;;;:11;:16;;;;;;;;:25;;;;;;;;;;;9628:47;;-1:-1:-1;;;9628:47:0;;;;;7002:25:1;;;;-1:-1:-1;;;;;9628:15:0;;;;:20;;6975:18:1;;9628:47:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;9621:54:0;;9423:260;-1:-1:-1;;;9423:260:0:o;42424:421::-;42517:7;42526:4;42543:16;42562:20;42577:4;38899:15;;;;;;;38855:11;38886:29;;;:12;:29;;;;;;;;;;38791:132;42562:20;42543:39;-1:-1:-1;42605:16:0;42597:4;:24;;;;;;;;:::i;:::-;;42593:217;;42645:44;42674:4;42664:15;;;;;;42681:7;42645:18;:44::i;42593:217::-;42719:19;42711:4;:27;;;;;;;;:::i;:::-;;42707:103;;42762:36;42783:4;42773:15;;;;;;42790:7;42762:10;:36::i;42707:103::-;-1:-1:-1;42828:1:0;;;;-1:-1:-1;42424:421:0;-1:-1:-1;;;42424:421:0:o;43279:404::-;2120:6;;43376:7;;-1:-1:-1;;;;;2120:6:0;860:10;2267:23;2259:68;;;;-1:-1:-1;;;2259:68:0;;;;;;;:::i;:::-;43396:16:::1;43415:20;43430:4;38899:15:::0;;;;;;;38855:11;38886:29;;;:12;:29;;;;;;;;;;38791:132;43415:20:::1;43396:39:::0;-1:-1:-1;43458:16:0::1;43450:4;:24;;;;;;;;:::i;:::-;::::0;43446:211:::1;;43498:41;43524:4;43514:15;;;;;;43531:7;43498:15;:41::i;43446:211::-;43569:19;43561:4;:27;;;;;;;;:::i;:::-;::::0;43557:100:::1;;43612:33;43630:4;43620:15;;;;;;43637:7;43612;:33::i;4368:141::-:0;2120:6;;-1:-1:-1;;;;;2120:6:0;860:10;2267:23;2259:68;;;;-1:-1:-1;;;2259:68:0;;;;;;;:::i;:::-;4448:15:::1;:53:::0;;-1:-1:-1;;;;;;4448:53:0::1;-1:-1:-1::0;;;;;4448:53:0;;;::::1;::::0;;;::::1;::::0;;4368:141::o;4618:::-;4696:15;;4664:4;;-1:-1:-1;;;;;4696:15:0;4688:38;;;;:63;;;4750:1;4730:16;:14;:16::i;:::-;:21;;4681:70;;4618:141;:::o;2947:192::-;2120:6;;-1:-1:-1;;;;;2120:6:0;860:10;2267:23;2259:68;;;;-1:-1:-1;;;2259:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;3036:22:0;::::1;3028:73;;;::::0;-1:-1:-1;;;3028:73:0;;15244:2:1;3028:73:0::1;::::0;::::1;15226:21:1::0;15283:2;15263:18;;;15256:30;15322:34;15302:18;;;15295:62;-1:-1:-1;;;15373:18:1;;;15366:36;15419:19;;3028:73:0::1;15042:402:1::0;3028:73:0::1;3112:19;3122:8;3112:9;:19::i;40445:377::-:0;40523:7;40543:16;40562:20;40577:4;38899:15;;;;;;;38855:11;38886:29;;;:12;:29;;;;;;;;;;38791:132;40562:20;40543:39;-1:-1:-1;40605:16:0;40597:4;:24;;;;;;;;:::i;:::-;;40593:203;;40645:37;40676:4;40666:15;;;;;;40645:20;:37::i;40593:203::-;40712:19;40704:4;:27;;;;;;;;:::i;:::-;;40700:96;;40755:29;40778:4;40768:15;;;;;;40755:12;:29::i;6318:820::-;6376:12;6390:4;6408:16;6426;6446:18;6460:3;6446:13;:18::i;:::-;6407:57;;;;6479:8;6491:1;6479:13;6475:74;;6527:1;6517:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;6517:12:0;-1:-1:-1;6509:28:0;6531:5;;-1:-1:-1;6318:820:0;-1:-1:-1;;;;6318:820:0:o;6475:74::-;6561:29;6603:8;-1:-1:-1;;;;;6593:19:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;6593:19:0;;6561:51;;6623:14;6657:15;6652:435;6688:8;6678:7;:18;6652:435;;;6724:16;6743;;;:11;:16;;;;;;;;:25;;;;;;;;;;6800:15;;:30;;-1:-1:-1;;;6800:30:0;;;;;7002:25:1;;;6743::0;6724:16;-1:-1:-1;;;;;6800:15:0;;;;:20;;6975:18:1;;6800:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;6845:15;;:70;;-1:-1:-1;;;6845:70:0;;6783:47;;-1:-1:-1;;;;;;6845:15:0;;:19;;:70;;6865:8;;6845:15;;;;6783:47;;6845:70;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;6845:70:0;;;;;;;;;;;;:::i;:::-;;7023:6;7017:4;7010;7001:6;6983:16;6979:29;6975:40;6960:70;7059:16;7069:6;7059:16;;:::i;:::-;;;6709:378;;6698:9;;;;;:::i;:::-;;;;6652:435;;;-1:-1:-1;7107:16:0;;7125:4;;-1:-1:-1;6318:820:0;-1:-1:-1;;;;;6318:820:0:o;35903:1049::-;35953:12;35967:4;35985:12;35999:16;36019:10;36025:3;36019:5;:10::i;:::-;35984:45;;;;36044:8;36056:1;36044:13;36040:74;;36092:1;36082:12;;36040:74;36126:17;36156:4;-1:-1:-1;;;;;36146:15:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36146:15:0;-1:-1:-1;36126:35:0;-1:-1:-1;36295:4:0;36285:15;;36224;36321:592;36357:8;36347:7;:18;36321:592;;;36393:16;36412:18;;;;;;;;;;;:27;;;;;;;;;;36496:19;36412:27;36496:17;:19::i;:::-;36492:373;;;36548:20;:8;11383:3;15033:28;;14946:123;36548:20;36607:15;;;;:10;:15;;;;;;;;:24;;;;;;;;36536:32;;-1:-1:-1;36587:64:0;;36633:8;36643:7;36587:19;:64::i;:::-;;;36492:373;;;36707:8;36766:27;36707:8;36766:21;:27::i;:::-;-1:-1:-1;36750:43:0;-1:-1:-1;36812:37:0;36835:4;36841:7;36812:22;:37::i;:::-;;;36673:192;36492:373;36881:20;36892:9;36881:20;;:::i;:::-;;;36378:535;;36367:9;;;;;:::i;:::-;;;;36321:592;;5908:402;5988:12;6002:4;6020:14;6039:32;6058:3;6063:7;6039:18;:32::i;:::-;6019:52;;;6095:1;6086:6;:10;6082:71;;;-1:-1:-1;;6121:12:0;;;6131:1;6121:12;;;;;;;;;;-1:-1:-1;6113:28:0;;6082:71;6185:15;;6165:17;6205:16;;;:11;:16;;;;;;;;:25;;;;;;;;;;6185:87;;-1:-1:-1;;;6185:87:0;;6165:17;;-1:-1:-1;;;;;6185:15:0;;:19;;:87;;6205:25;6185:15;;6165:17;;6265:6;;6185:87;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;6185:87:0;;;;;;;;;;;;:::i;:::-;6165:107;6297:4;;-1:-1:-1;5908:402:0;-1:-1:-1;;;;;5908:402:0:o;34162:446::-;34248:4;34284:18;;;;;;;;;;;:27;;;;;;;;;34234:12;;34248:4;34328:19;34284:27;34328:17;:19::i;:::-;34324:277;;;34364:16;34401:15;;;:10;:15;;;;;;;;:24;;;;;;;;34383:53;;34427:8;34383:17;:53::i;:::-;34364:72;-1:-1:-1;34464:4:0;;-1:-1:-1;34451:18:0;;-1:-1:-1;;34451:18:0;34324:277;34517:8;34563:26;34517:8;34563:20;:26::i;:::-;34556:33;;;;;;;;5550:350;5609:7;5618;5638:16;5657:25;5678:3;5657:20;:25::i;:::-;5638:44;;5693:12;5725:15;5720:139;5756:8;5746:7;:18;5720:139;;;5800:15;;;5821:16;;;:11;:16;;;;;;;;:25;;;;;;;;;;;5800:47;;-1:-1:-1;;;5800:47:0;;;;;7002:25:1;;;;-1:-1:-1;;;;;5800:15:0;;;;:20;;6975:18:1;;5800:47:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5792:55;;;;:::i;:::-;;-1:-1:-1;5766:9:0;;;;:::i;:::-;;;;5720:139;;;-1:-1:-1;5877:4:0;5883:8;;-1:-1:-1;5550:350:0;-1:-1:-1;;5550:350:0:o;35492:403::-;35543:7;35552;35572:12;35599:15;35631:222;35660:17;35679:10;35693:24;35704:3;35709:7;35693:10;:24::i;:::-;35659:58;;;;35737:5;35732:52;;35763:5;;;;35732:52;35800:17;35808:9;35800:17;;:::i;:::-;;-1:-1:-1;35832:9:0;;;;:::i;:::-;;;;35644:209;;35631:222;;;35873:4;;35879:7;;-1:-1:-1;35492:403:0;-1:-1:-1;;35492:403:0:o;38931:126::-;39026:15;;;;;;;;;;39013:29;;;;:12;:29;;;;;;:36;;39045:4;;39013:29;-1:-1:-1;;39013:36:0;;39045:4;39013:36;;;;;;;;:::i;:::-;;;;;;38931:126;;:::o;8693:722::-;8848:15;;8889;;:32;;;-1:-1:-1;;;8889:32:0;;;;8831:14;;-1:-1:-1;;;;;8889:15:0;;:30;;:32;;;;;;;;;;;;;;:15;:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;8874:47;-1:-1:-1;8953:13:0;8960:6;8874:47;8953:13;:::i;:::-;8940:9;:26;;8932:59;;;;-1:-1:-1;;;8932:59:0;;17088:2:1;8932:59:0;;;17070:21:1;17127:2;17107:18;;;17100:30;-1:-1:-1;;;17146:18:1;;;17139:50;17206:18;;8932:59:0;16886:344:1;8932:59:0;9009:7;9004:404;9026:6;9022:1;:10;;;9004:404;;;9066:5;9072:1;9066:8;;;;;;;;;;:::i;:::-;;;;;;;9062:1;:12;:40;;;;;9090:12;;;;;;;;;;;9078:24;;:5;9084:1;9078:8;;;;;;;;;;:::i;:::-;;;;;;;:24;;9062:40;9054:73;;;;-1:-1:-1;;;9054:73:0;;17437:2:1;9054:73:0;;;17419:21:1;17476:2;17456:18;;;17449:30;-1:-1:-1;;;17495:18:1;;;17488:50;17555:18;;9054:73:0;17235:344:1;9054:73:0;9142:37;9162:3;9167:8;9176:1;9167:11;;;;;;;;;;:::i;:::-;;;;;;;9142:19;:37::i;:::-;9196:16;9236:10;9248:3;9253:8;9262:1;9253:11;;;;;;;;;;:::i;:::-;;;;;;;9225:40;;;;;;;;;-1:-1:-1;;;;;17804:32:1;;;;17786:51;;17868:2;17853:18;;17846:34;;;;17911:2;17896:18;;17889:34;17774:2;17759:18;;17584:345;9225:40:0;;;;;;;;;;;;;9215:51;;;;;;9196:70;;9281:15;;;;;;;;;-1:-1:-1;;;;;9281:15:0;-1:-1:-1;;;;;9281:23:0;;9313:4;9319:8;9329:1;9332:5;9338:1;9332:8;;;;;;;;;;:::i;:::-;;;;;;;9281:60;;;;;;;;;;;;;;;;18134:25:1;;;18207:4;18195:17;;;;18190:2;18175:18;;18168:45;18244:2;18229:18;;18222:34;18122:2;18107:18;;17934:328;9281:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9388:8;9356:11;:16;9368:3;9356:16;;;;;;;;;;;:29;9373:8;9382:1;9373:11;;;;;;;;;;:::i;:::-;;;;;;;9356:29;;;;;;;;;;;:40;;;;9039:369;9034:3;;;;;:::i;:::-;;;;9004:404;;;;8820:595;;8693:722;;;:::o;33154:509::-;33314:25;33326:3;33331:7;33314:11;:25::i;:::-;33400:24;33414:10;33400:24;;;33396:260;;;33471:61;:45;33504:4;;33510:5;33471:32;:45::i;:::-;-1:-1:-1;;;;;33471:59:0;;15077:126;33471:61;33441:13;:18;;;;;;;;;;;:27;;;;;;;;:91;33396:260;;;33613:15;;;;:10;:15;;;;;;;;:24;;;;;;;;;33595:49;;;;;;;;;;;;;;;;;;;;;;33613:24;;33639:4;;;;;;33595:49;;33639:4;;;;33595:49;;;;;;;;;-1:-1:-1;33595:17:0;;-1:-1:-1;;;33595:49:0:i;:::-;33565:13;:18;;;;;;;;;;;:27;;;;;;;;:79;33154:509;;;;;:::o;7728:506::-;7801:7;7821:381;7849:16;7868;;;:11;:16;;;;;;;;:25;;;;;;;;;;7908:68;;7955:5;;;7908:68;8164:1;8128:16;;;:11;:16;;;;;;;;:25;;;;;;;;:38;8145:7;8181:9;8145:7;8181:9;:::i;:::-;;;;7834:368;7821:381;;;-1:-1:-1;8219:7:0;7728:506;-1:-1:-1;7728:506:0:o;36996:593::-;37061:7;37081:474;37109:16;37128:18;;;;;;;;;;;:27;;;;;;;;;;37170:70;;37219:5;;;37170:70;37261:19;:8;:17;:19::i;:::-;37256:203;;37301:12;37316:8;37301:39;;37427:4;-1:-1:-1;;;;;37399:42:0;;:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37282:177;37256:203;37513:3;37475:18;;;;;;;;;;;:27;;;;;;;;:42;37494:7;37534:9;37494:7;37534:9;:::i;:::-;;;;37094:461;37081:474;;7146:574;7224:4;7260:16;;;:11;:16;;;;;;;;:25;;;;;;;;;;7296:67;;7346:5;7339:12;;;;;7296:67;7418:1;7377:16;;;:11;:16;;;;;7418:1;7394:11;:7;7404:1;7394:11;:::i;:::-;7377:29;;;;;;;;;;;;:43;7373:139;;7495:5;7488:12;;;;;7373:139;-1:-1:-1;;7688:1:0;7652:16;;;:11;:16;;;;;;;;:25;;;;;;;;:38;7708:4;;7146:574::o;37597:653::-;37667:4;37703:18;;;;;;;;;;;:27;;;;;;;;;;37741:69;;37793:5;37786:12;;;;;37741:69;37869:3;37826:18;;;;;;;;;;37869:3;37845:11;:7;37855:1;37845:11;:::i;:::-;37826:31;;;;;;;;;;;;:47;37822:143;;37948:5;37941:12;;;;;37822:143;37982:19;:8;:17;:19::i;:::-;37977:187;;38018:12;38033:8;38018:39;;38136:4;-1:-1:-1;;;;;38108:42:0;;:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38003:161;37977:187;-1:-1:-1;;38214:3:0;38176:18;;;;;;;;;;;:27;;;;;;;;:42;38238:4;;37597:653::o;3147:173::-;3222:6;;;-1:-1:-1;;;;;3239:17:0;;;-1:-1:-1;;;;;;3239:17:0;;;;;;;3272:40;;3222:6;;;3239:17;3222:6;;3272:40;;3203:16;;3272:40;3192:128;3147:173;:::o;4889:338::-;4955:7;;5005:190;5033:16;5052;;;:11;:16;;;;;;;;:25;;;;;;;;;;5092:68;;5139:5;;;5092:68;5174:9;;;;:::i;:::-;;;;5018:177;5005:190;;5235:307;5316:7;5325:4;5357:25;5378:3;5357:20;:25::i;:::-;5346:7;:36;5342:86;;-1:-1:-1;5407:1:0;;-1:-1:-1;5407:1:0;5399:17;;5342:86;5455:15;;5438:14;5476:16;;;:11;:16;;;;;;;;:25;;;;;;;;;;5455:47;;-1:-1:-1;;;5455:47:0;;;;;7002:25:1;5438:14:0;;-1:-1:-1;;;;;5455:15:0;;:20;;6975:18:1;;5455:47:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5438:64;5529:4;;-1:-1:-1;5235:307:0;-1:-1:-1;;;;5235:307:0:o;34616:483::-;34689:7;34734:18;;;;;;;;;;;:27;;;;;;;;;34689:7;;34734:27;34774:318;;34825:1;34828:5;34817:17;;;;;;;34774:318;34856:19;:8;:17;:19::i;:::-;34852:240;;;34892:11;34906:20;:8;11383:3;15033:28;;14946:123;34852:240;35007:8;35053:27;35007:8;35053:21;:27::i;35107:340::-;35165:7;;35217:196;35245:16;35264:18;;;;;;;;;;;:27;;;;;;;;;;35306:70;;35355:5;;;35306:70;35392:9;;;;:::i;:::-;;;;35230:183;35217:196;;14687:116;14743:12;14794:1;14775:16;14785:5;11383:3;15033:28;;14946:123;14775:16;:20;;14687:116;-1:-1:-1;;14687:116:0:o;13729:950::-;13881:15;13898:10;13921:16;13970:21;13985:5;13970:14;:21::i;:::-;14127:25;;;13948:43;;-1:-1:-1;13948:43:0;-1:-1:-1;14083:9:0;11442:2;14179:30;;14175:472;;;14338:20;14325:34;;14226:11;;14388:248;14456:2;14451:1;14413:30;11442:2;14413:7;:30;:::i;:::-;:35;;14446:2;14413:35;:::i;:::-;:39;;;;:::i;:::-;14412:46;;;;:::i;:::-;14408:1;:50;14388:248;;;14492:8;;;;;;;;;;;;;14551:18;;;14492:8;-1:-1:-1;14612:8:0;;14558:3;;14612:8;:::i;:::-;14606:14;-1:-1:-1;14460:3:0;;;;:::i;:::-;;;;14388:248;;;;14211:436;;14175:472;14667:4;14659:12;;13910:769;;13729:950;;;;;;:::o;29183:423::-;29237:7;;-1:-1:-1;;;;;29267:20:0;;29263:70;;-1:-1:-1;29312:1:0;;;;-1:-1:-1;29183:423:0;-1:-1:-1;29183:423:0:o;29263:70::-;29343:16;29370:11;29384:17;;;;;;;;;;;;;;;;;:24;29370:38;;29467:4;29455:17;29443:29;;29508:3;29497:8;:14;29493:64;;;-1:-1:-1;29536:1:0;;;;-1:-1:-1;29183:423:0;-1:-1:-1;;;29183:423:0:o;29493:64::-;29577:14;29588:3;29577:8;:14;:::i;30144:430::-;30218:7;30227:4;30245:16;30263:10;30277:13;30285:4;30277:7;:13::i;:::-;30244:46;;;;30308:5;30303:56;;30338:1;30341:5;30330:17;;;;;;;;30303:56;30371:11;30385:17;;;;;;;;;;;;;;;;;:24;30371:38;;30513:8;30508:3;30497:9;30491:4;30479:43;-1:-1:-1;30551:8:0;;30561:4;;-1:-1:-1;30144:430:0;-1:-1:-1;;;;30144:430:0:o;12993:728::-;13117:17;13152:15;13196:27;13217:5;13196:20;:27::i;:::-;13178:45;-1:-1:-1;13178:45:0;-1:-1:-1;11442:2:0;13240:30;;13236:478;;;13394:31;13384:42;;13287:11;;13455:248;13523:2;13518:1;13480:30;11442:2;13480:7;:30;:::i;:::-;:35;;13513:2;13480:35;:::i;:::-;:39;;;;:::i;:::-;13479:46;;;;:::i;:::-;13475:1;:50;13455:248;;;13559:8;;;;;;;;;;;;;13618:18;;;13559:8;-1:-1:-1;13679:8:0;;13625:3;;13679:8;:::i;:::-;13673:14;-1:-1:-1;13527:3:0;;;;:::i;:::-;;;;13455:248;;;;13272:442;;13236:478;13141:580;12993:728;;;;:::o;29614:522::-;29667:12;29681:4;29699:16;29717:10;29731:13;29739:4;29731:7;:13::i;:::-;29698:46;;;;29762:5;29757:67;;29802:1;29792:12;;29757:67;29881:17;29911:8;-1:-1:-1;;;;;29901:19:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;29901:19:0;;29881:39;;29931:11;29945:17;;;;;;;;;;;;;;;;;:24;29931:38;;30079:8;30074:3;30067:4;30061;30057:15;30051:4;30039:49;-1:-1:-1;30117:4:0;30123;;-1:-1:-1;29614:522:0;-1:-1:-1;;;;29614:522:0:o;8242:443::-;8320:16;8339;;;:11;:16;;;;;;;;:25;;;;;;;;;;8375:303;;8426:12;;;:59;;-1:-1:-1;8483:1:0;8442:16;;;:11;:16;;;;;8483:1;8459:11;8469:1;8459:7;:11;:::i;:::-;8442:29;;;;;;;;;;;;:43;;8426:59;8418:94;;;;-1:-1:-1;;;8418:94:0;;18871:2:1;8418:94:0;;;18853:21:1;18910:2;18890:18;;;18883:30;-1:-1:-1;;;18929:18:1;;;18922:52;18991:18;;8418:94:0;18669:346:1;32581:565:0;32651:16;32670:18;;;;;;;;;;;:27;;;;;;;;;;32710:153;;32761:12;;;:63;;-1:-1:-1;32820:3:0;32777:18;;;;;;;;;;32820:3;32796:11;32806:1;32796:7;:11;:::i;:::-;32777:31;;;;;;;;;;;;:47;;32761:63;32753:98;;;;-1:-1:-1;;;32753:98:0;;18871:2:1;32753:98:0;;;18853:21:1;18910:2;18890:18;;;18883:30;-1:-1:-1;;;18929:18:1;;;18922:52;18991:18;;32753:98:0;18669:346:1;32753:98:0;32880:19;:8;:17;:19::i;:::-;32875:264;;32931:8;-1:-1:-1;;;;;32974:20:0;;;32970:158;;33096:4;-1:-1:-1;;;;;33068:42:0;;:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32901:238;32640:506;32581:565;;:::o;25232:669::-;25314:7;25334:21;25371:17;;;;;;;;;;;;;;;;;25390:4;;25358:37;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;25358:37:0;;;;;;;;;;-1:-1:-1;25499:11:0;25513:16;23554:2;25358:37;25513:16;:::i;:::-;25599:9;25579:18;;;25572:37;25499:30;-1:-1:-1;25644:16:0;23601:3;25656:4;25644:16;:::i;:::-;25638:22;;25730:9;25724:3;25714:8;25710:18;25703:37;25684:71;25778:29;25849:5;25856:8;25810:55;;;;;:::i;:::-;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;25778:87:0;25232:669;-1:-1:-1;;;;;;25232:669:0:o;11453:671::-;11590:12;;12337:4;12327:15;;;12321:22;11383:3;12375:20;;;12414:29;;12473:14;;11442:2;11657:26;;11653:464;;;11700:13;11800:31;11789:43;;11700:13;11861:245;11925:2;11920:1;11886:26;11442:2;11886:3;:26;:::i;:::-;:31;;11915:2;11886:31;:::i;:::-;:35;;;;:::i;:::-;11885:42;;;;:::i;:::-;11881:1;:46;11861:245;;;11994:10;;;-1:-1:-1;12047:8:0;12000:3;12053:2;12047:8;:::i;:::-;12074;;;;;;;;;;;:16;;;12041:14;-1:-1:-1;12080:1:0;11929:3;12080:1;11929:3;:::i;:::-;;;;11861:245;;12504:177;12566:11;12579:12;12610:16;12620:5;11383:3;15033:28;;14946:123;12610:16;12604:22;11335:2;12644:29;;;;;12504:177;-1:-1:-1;;12504:177:0:o;12689:296::-;12757:11;12770:17;12806:16;12816:5;11383:3;15033:28;;14946:123;12806:16;12800:22;;11335:2;12841:5;:29;;12833:37;;12898:3;-1:-1:-1;;;;;12888:14:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;12888:14:0;-1:-1:-1;12954:4:0;12944:15;;12937:30;;;;-1:-1:-1;12689:296:0;:::o;-1:-1:-1:-;;;;;;;;:::o;14:127:1:-;75:10;70:3;66:20;63:1;56:31;106:4;103:1;96:15;130:4;127:1;120:15;146:127;207:10;202:3;198:20;195:1;188:31;238:4;235:1;228:15;262:4;259:1;252:15;278:128;345:9;;;366:11;;;363:37;;;380:18;;:::i;411:331::-;516:9;527;569:8;557:10;554:24;551:44;;;591:1;588;581:12;551:44;620:6;610:8;607:20;604:40;;;640:1;637;630:12;604:40;-1:-1:-1;;666:23:1;;;711:25;;;;;-1:-1:-1;411:331:1:o;747:380::-;826:1;822:12;;;;869;;;890:61;;944:4;936:6;932:17;922:27;;890:61;997:2;989:6;986:14;966:18;963:38;960:161;;1043:10;1038:3;1034:20;1031:1;1024:31;1078:4;1075:1;1068:15;1106:4;1103:1;1096:15;1257:997;1489:6;1481;1476:3;1463:33;1445:3;1524:6;1519:3;1515:16;1551:1;1547:2;1540:13;1573:1;1606:6;1600:13;1636:36;1662:9;1636:36;:::i;:::-;1691:1;1708:18;;;1735:131;;;;1880:1;1875:354;;;;1701:528;;1735:131;-1:-1:-1;;1767:24:1;;1756:36;;1839:14;;1832:22;1820:35;;1812:44;;;-1:-1:-1;1735:131:1;;1875:354;1906:6;1903:1;1896:17;1936:4;1981:2;1978:1;1968:16;2006:1;2020:164;2034:6;2031:1;2028:13;2020:164;;;2111:14;;2099:10;;;2092:34;2154:16;;;;2049:10;;2020:164;;;2024:3;;;2212:6;2208:2;2204:15;2197:22;;1701:528;-1:-1:-1;2245:3:1;;1257:997;-1:-1:-1;;;;;;;;;1257:997:1:o;2259:127::-;2320:10;2315:3;2311:20;2308:1;2301:31;2351:4;2348:1;2341:15;2375:4;2372:1;2365:15;2391:275;2462:2;2456:9;2527:2;2508:13;;-1:-1:-1;;2504:27:1;2492:40;;-1:-1:-1;;;;;2547:34:1;;2583:22;;;2544:62;2541:88;;;2609:18;;:::i;:::-;2645:2;2638:22;2391:275;;-1:-1:-1;2391:275:1:o;2671:186::-;2719:4;-1:-1:-1;;;;;2744:6:1;2741:30;2738:56;;;2774:18;;:::i;:::-;-1:-1:-1;2840:2:1;2819:15;-1:-1:-1;;2815:29:1;2846:4;2811:40;;2671:186::o;2862:462::-;2904:5;2957:3;2950:4;2942:6;2938:17;2934:27;2924:55;;2975:1;2972;2965:12;2924:55;3011:6;2998:20;3042:48;3058:31;3086:2;3058:31;:::i;:::-;3042:48;:::i;:::-;3115:2;3106:7;3099:19;3161:3;3154:4;3149:2;3141:6;3137:15;3133:26;3130:35;3127:55;;;3178:1;3175;3168:12;3127:55;3243:2;3236:4;3228:6;3224:17;3217:4;3208:7;3204:18;3191:55;3291:1;3266:16;;;3284:4;3262:27;3255:38;;;;3270:7;2862:462;-1:-1:-1;;;2862:462:1:o;3329:347::-;3380:8;3390:6;3444:3;3437:4;3429:6;3425:17;3421:27;3411:55;;3462:1;3459;3452:12;3411:55;-1:-1:-1;3485:20:1;;-1:-1:-1;;;;;3517:30:1;;3514:50;;;3560:1;3557;3550:12;3514:50;3597:4;3589:6;3585:17;3573:29;;3649:3;3642:4;3633:6;3625;3621:19;3617:30;3614:39;3611:59;;;3666:1;3663;3656:12;3681:628;3769:6;3777;3785;3838:2;3826:9;3817:7;3813:23;3809:32;3806:52;;;3854:1;3851;3844:12;3806:52;3894:9;3881:23;-1:-1:-1;;;;;3964:2:1;3956:6;3953:14;3950:34;;;3980:1;3977;3970:12;3950:34;4003:49;4044:7;4035:6;4024:9;4020:22;4003:49;:::i;:::-;3993:59;;4105:2;4094:9;4090:18;4077:32;4061:48;;4134:2;4124:8;4121:16;4118:36;;;4150:1;4147;4140:12;4118:36;;4189:60;4241:7;4230:8;4219:9;4215:24;4189:60;:::i;:::-;3681:628;;4268:8;;-1:-1:-1;4163:86:1;;-1:-1:-1;;;;3681:628:1:o;4314:250::-;4399:1;4409:113;4423:6;4420:1;4417:13;4409:113;;;4499:11;;;4493:18;4480:11;;;4473:39;4445:2;4438:10;4409:113;;;-1:-1:-1;;4556:1:1;4538:16;;4531:27;4314:250::o;4569:270::-;4610:3;4648:5;4642:12;4675:6;4670:3;4663:19;4691:76;4760:6;4753:4;4748:3;4744:14;4737:4;4730:5;4726:16;4691:76;:::i;:::-;4821:2;4800:15;-1:-1:-1;;4796:29:1;4787:39;;;;4828:4;4783:50;;4569:270;-1:-1:-1;;4569:270:1:o;4844:217::-;4991:2;4980:9;4973:21;4954:4;5011:44;5051:2;5040:9;5036:18;5028:6;5011:44;:::i;5066:276::-;5124:6;5177:2;5165:9;5156:7;5152:23;5148:32;5145:52;;;5193:1;5190;5183:12;5145:52;5232:9;5219:23;5282:10;5275:5;5271:22;5264:5;5261:33;5251:61;;5308:1;5305;5298:12;5582:388;5659:6;5667;5720:2;5708:9;5699:7;5695:23;5691:32;5688:52;;;5736:1;5733;5726:12;5688:52;5776:9;5763:23;-1:-1:-1;;;;;5801:6:1;5798:30;5795:50;;;5841:1;5838;5831:12;5795:50;5864:49;5905:7;5896:6;5885:9;5881:22;5864:49;:::i;:::-;5854:59;5960:2;5945:18;;;;5932:32;;-1:-1:-1;;;;5582:388:1:o;5975:298::-;6144:2;6133:9;6126:21;6107:4;6164:44;6204:2;6193:9;6189:18;6181:6;6164:44;:::i;:::-;6156:52;;6258:6;6251:14;6244:22;6239:2;6228:9;6224:18;6217:50;5975:298;;;;;:::o;6278:320::-;6346:6;6399:2;6387:9;6378:7;6374:23;6370:32;6367:52;;;6415:1;6412;6405:12;6367:52;6455:9;6442:23;-1:-1:-1;;;;;6480:6:1;6477:30;6474:50;;;6520:1;6517;6510:12;6474:50;6543:49;6584:7;6575:6;6564:9;6560:22;6543:49;:::i;:::-;6533:59;6278:320;-1:-1:-1;;;;6278:320:1:o;7038:712::-;7092:5;7145:3;7138:4;7130:6;7126:17;7122:27;7112:55;;7163:1;7160;7153:12;7112:55;7199:6;7186:20;7225:4;-1:-1:-1;;;;;7244:2:1;7241:26;7238:52;;;7270:18;;:::i;:::-;7316:2;7313:1;7309:10;7339:28;7363:2;7359;7355:11;7339:28;:::i;:::-;7401:15;;;7471;;;7467:24;;;7432:12;;;;7503:15;;;7500:35;;;7531:1;7528;7521:12;7500:35;7567:2;7559:6;7555:15;7544:26;;7579:142;7595:6;7590:3;7587:15;7579:142;;;7661:17;;7649:30;;7612:12;;;;7699;;;;7579:142;;;7739:5;7038:712;-1:-1:-1;;;;;;;7038:712:1:o;7755:793::-;7891:6;7899;7907;7960:2;7948:9;7939:7;7935:23;7931:32;7928:52;;;7976:1;7973;7966:12;7928:52;8016:9;8003:23;-1:-1:-1;;;;;8086:2:1;8078:6;8075:14;8072:34;;;8102:1;8099;8092:12;8072:34;8125:49;8166:7;8157:6;8146:9;8142:22;8125:49;:::i;:::-;8115:59;;8227:2;8216:9;8212:18;8199:32;8183:48;;8256:2;8246:8;8243:16;8240:36;;;8272:1;8269;8262:12;8240:36;8295:63;8350:7;8339:8;8328:9;8324:24;8295:63;:::i;:::-;8285:73;;8411:2;8400:9;8396:18;8383:32;8367:48;;8440:2;8430:8;8427:16;8424:36;;;8456:1;8453;8446:12;8424:36;;8479:63;8534:7;8523:8;8512:9;8508:24;8479:63;:::i;:::-;8469:73;;;7755:793;;;;;:::o;8735:696::-;8832:6;8840;8848;8856;8909:2;8897:9;8888:7;8884:23;8880:32;8877:52;;;8925:1;8922;8915:12;8877:52;8965:9;8952:23;-1:-1:-1;;;;;9035:2:1;9027:6;9024:14;9021:34;;;9051:1;9048;9041:12;9021:34;9074:49;9115:7;9106:6;9095:9;9091:22;9074:49;:::i;:::-;9064:59;;9170:2;9159:9;9155:18;9142:32;9132:42;;9227:2;9216:9;9212:18;9199:32;9183:48;;9256:2;9246:8;9243:16;9240:36;;;9272:1;9269;9262:12;9240:36;;9311:60;9363:7;9352:8;9341:9;9337:24;9311:60;:::i;:::-;8735:696;;;;-1:-1:-1;9390:8:1;-1:-1:-1;;;;8735:696:1:o;9836:127::-;9897:10;9892:3;9888:20;9885:1;9878:31;9928:4;9925:1;9918:15;9952:4;9949:1;9942:15;9968:247;10116:2;10101:18;;10149:1;10138:13;;10128:47;;10155:18;;:::i;:::-;10184:25;;;9968:247;:::o;10220:248::-;10288:6;10296;10349:2;10337:9;10328:7;10324:23;10320:32;10317:52;;;10365:1;10362;10355:12;10317:52;-1:-1:-1;;10388:23:1;;;10458:2;10443:18;;;10430:32;;-1:-1:-1;10220:248:1:o;10933:286::-;10992:6;11045:2;11033:9;11024:7;11020:23;11016:32;11013:52;;;11061:1;11058;11051:12;11013:52;11087:23;;-1:-1:-1;;;;;11139:31:1;;11129:42;;11119:70;;11185:1;11182;11175:12;11224:125;11289:9;;;11310:10;;;11307:36;;;11323:18;;:::i;11354:356::-;11556:2;11538:21;;;11575:18;;;11568:30;11634:34;11629:2;11614:18;;11607:62;11701:2;11686:18;;11354:356::o;11715:544::-;11816:2;11811:3;11808:11;11805:448;;;11852:1;11877:5;11873:2;11866:17;11922:4;11918:2;11908:19;11992:2;11980:10;11976:19;11973:1;11969:27;11963:4;11959:38;12028:4;12016:10;12013:20;12010:47;;;-1:-1:-1;12051:4:1;12010:47;12106:2;12101:3;12097:12;12094:1;12090:20;12084:4;12080:31;12070:41;;12161:82;12179:2;12172:5;12169:13;12161:82;;;12224:17;;;12205:1;12194:13;12161:82;;12435:1348;12559:3;12553:10;-1:-1:-1;;;;;12578:6:1;12575:30;12572:56;;;12608:18;;:::i;:::-;12637:96;12726:6;12686:38;12718:4;12712:11;12686:38;:::i;:::-;12680:4;12637:96;:::i;:::-;12788:4;;12852:2;12841:14;;12869:1;12864:662;;;;13570:1;13587:6;13584:89;;;-1:-1:-1;13639:19:1;;;13633:26;13584:89;-1:-1:-1;;12392:1:1;12388:11;;;12384:24;12380:29;12370:40;12416:1;12412:11;;;12367:57;13686:81;;12834:943;;12864:662;1204:1;1197:14;;;1241:4;1228:18;;-1:-1:-1;;12900:20:1;;;13017:236;13031:7;13028:1;13025:14;13017:236;;;13120:19;;;13114:26;13099:42;;13212:27;;;;13180:1;13168:14;;;;13047:19;;13017:236;;;13021:3;13281:6;13272:7;13269:19;13266:201;;;13342:19;;;13336:26;-1:-1:-1;;13425:1:1;13421:14;;;13437:3;13417:24;13413:37;13409:42;13394:58;13379:74;;13266:201;-1:-1:-1;;;;;13513:1:1;13497:14;;;13493:22;13480:36;;-1:-1:-1;12435:1348:1:o;13788:184::-;13858:6;13911:2;13899:9;13890:7;13886:23;13882:32;13879:52;;;13927:1;13924;13917:12;13879:52;-1:-1:-1;13950:16:1;;13788:184;-1:-1:-1;13788:184:1:o;14743:294::-;14813:6;14866:2;14854:9;14845:7;14841:23;14837:32;14834:52;;;14882:1;14879;14872:12;14834:52;14908:16;;-1:-1:-1;;14953:35:1;;14943:46;;14933:74;;15003:1;15000;14993:12;15449:467;15700:25;;;15687:3;15672:19;;15755:1;15744:13;;15734:47;;15761:18;;:::i;:::-;15817:6;15812:2;15801:9;15797:18;15790:34;15860:6;15855:2;15844:9;15840:18;15833:34;15903:6;15898:2;15887:9;15883:18;15876:34;15449:467;;;;;;;:::o;15921:647::-;16000:6;16053:2;16041:9;16032:7;16028:23;16024:32;16021:52;;;16069:1;16066;16059:12;16021:52;16102:9;16096:16;-1:-1:-1;;;;;16127:6:1;16124:30;16121:50;;;16167:1;16164;16157:12;16121:50;16190:22;;16243:4;16235:13;;16231:27;-1:-1:-1;16221:55:1;;16272:1;16269;16262:12;16221:55;16301:2;16295:9;16326:48;16342:31;16370:2;16342:31;:::i;16326:48::-;16397:2;16390:5;16383:17;16437:7;16432:2;16427;16423;16419:11;16415:20;16412:33;16409:53;;;16458:1;16455;16448:12;16409:53;16471:67;16535:2;16530;16523:5;16519:14;16514:2;16510;16506:11;16471:67;:::i;:::-;16557:5;15921:647;-1:-1:-1;;;;;15921:647:1:o;16573:135::-;16612:3;16633:17;;;16630:43;;16653:18;;:::i;:::-;-1:-1:-1;16700:1:1;16689:13;;16573:135::o;16713:168::-;16786:9;;;16817;;16834:15;;;16828:22;;16814:37;16804:71;;16855:18;;:::i;18267:175::-;18304:3;18348:4;18341:5;18337:16;18377:4;18368:7;18365:17;18362:43;;18385:18;;:::i;:::-;18434:1;18421:15;;18267:175;-1:-1:-1;;18267:175:1:o;18447:217::-;18487:1;18513;18503:132;;18557:10;18552:3;18548:20;18545:1;18538:31;18592:4;18589:1;18582:15;18620:4;18617:1;18610:15;18503:132;-1:-1:-1;18649:9:1;;18447:217::o;19020:470::-;19205:3;19243:6;19237:13;19259:66;19318:6;19313:3;19306:4;19298:6;19294:17;19259:66;:::i;:::-;19347:16;;19400:6;19392;19347:16;19372:35;19464:1;19426:18;;19453:13;;;-1:-1:-1;19426:18:1;;19020:470;-1:-1:-1;;;19020:470:1:o
Swarm Source
ipfs://74ecdb7c1356cd26b7ae20a002751e685b2c97645c0ec1b1214c316ec9516dce
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.