Source Code
Overview
ETH Balance
0 ETH
More Info
ContractCreator
Multichain Info
N/A
Latest 7 from a total of 7 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Commit Blob | 6153872 | 235 days ago | IN | 0 ETH | 0.00019977 | ||||
Commit Blob | 6153868 | 235 days ago | IN | 0 ETH | 0.00019918 | ||||
Commit Blob | 6153865 | 235 days ago | IN | 0 ETH | 0.00019042 | ||||
Write Chunk | 6153845 | 235 days ago | IN | 0 ETH | 0.04289854 | ||||
Write Chunk | 6153844 | 235 days ago | IN | 0 ETH | 0.03850766 | ||||
Write Chunk | 6153840 | 235 days ago | IN | 0 ETH | 0.02656581 | ||||
Write Chunk | 6153840 | 235 days ago | IN | 0 ETH | 0.00156455 |
Latest 4 internal transactions
Advanced mode:
Parent Transaction Hash | Block |
From
|
To
|
|||
---|---|---|---|---|---|---|
6153845 | 235 days ago | Contract Creation | 0 ETH | |||
6153844 | 235 days ago | Contract Creation | 0 ETH | |||
6153840 | 235 days ago | Contract Creation | 0 ETH | |||
6153840 | 235 days ago | Contract Creation | 0 ETH |
Loading...
Loading
Similar Match Source Code This contract matches the deployed Bytecode of the Source Code for Contract 0xde90eb72...C2BA9e5CF The constructor portion of the code might be different and could alter the actual behaviour of the contract
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"}]
Deployed Bytecode
0x608060405260043610620001ee5760003560e01c8063590e1ae3116200010f578063caf1283611620000a3578063dd473fae116200006d578063dd473fae1462000776578063f14c7ad71462000794578063f2fde38b14620007ac578063f916c5b014620007d157620001ee565b8063caf1283614620006b5578063cf86bf9314620006f0578063d84eb56c146200072c578063dc38b0a2146200075157620001ee565b80638bf4515c11620000e55780638bf4515c14620006005780638da5cb5b146200062557806393b7628f1462000645578063956a3433146200069057620001ee565b8063590e1ae314620005ab5780635ba1d9e514620005c3578063715018a614620005e857620001ee565b80631ccbc6da116200018757806342216bed116200015d57806342216bed1462000504578063492c7b2a14620005295780634eed7cf1146200054057806358edef4c146200058657620001ee565b80631ccbc6da14620004ae5780631fbfa12714620004d55780632b68b9c614620004ec57620001ee565b806311ce026711620001c957806311ce026714620003de5780631a7237e014620004195780631c5ee10c146200044e5780631c993ad5146200048957620001ee565b8063038cd79f14620003705780630936286114620003895780631089f40f14620003b9575b348015620001fb57600080fd5b506000366060808284036200022157505060408051602081019091526000815262000365565b8383600081811062000237576200023762002a5f565b9050013560f81c60f81b6001600160f81b031916602f60f81b146200028357505060408051808201909152600e81526d0d2dcc6dee4e4cac6e840e0c2e8d60931b602082015262000365565b83836200029260018262002a8b565b818110620002a457620002a462002a5f565b909101356001600160f81b031916602f60f81b0390506200030657620002fd620002d2846001818862002aa1565b6006604051602001620002e89392919062002b03565b604051602081830303815290604052620007f6565b50905062000358565b6200035462000319846001818862002aa1565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250620007f692505050565b5090505b6200036381620008a1565b505b915050805190602001f35b620003876200038136600462002ca3565b620008e2565b005b3480156200039657600080fd5b50620003a16200092c565b604051620003b0919062002d66565b60405180910390f35b348015620003c657600080fd5b5062000387620003d836600462002d7b565b620009c2565b348015620003eb57600080fd5b5060035462000400906001600160a01b031681565b6040516001600160a01b039091168152602001620003b0565b3480156200042657600080fd5b506200043e6200043836600462002da3565b62000a15565b604051620003b092919062002deb565b3480156200045b57600080fd5b50620004736200046d36600462002e11565b62000ac5565b60408051928352602083019190915201620003b0565b3480156200049657600080fd5b5062000387620004a836600462002e11565b62000b58565b348015620004bb57600080fd5b50620004c662000b97565b604051908152602001620003b0565b62000387620004e636600462002ed9565b62000c0d565b348015620004f957600080fd5b506200038762000d92565b3480156200051157600080fd5b50620004c66200052336600462002da3565b62000dcd565b620003876200053a36600462002f6a565b62000e78565b3480156200054d57600080fd5b507f000000000000000000000000000000000000000000000000000000000000000060ff1615155b6040519015158152602001620003b0565b3480156200059357600080fd5b50620004c6620005a536600462002e11565b62000f8f565b348015620005b857600080fd5b506200038762001057565b348015620005d057600080fd5b5062000575620005e236600462002da3565b620010c1565b348015620005f557600080fd5b506200038762001181565b3480156200060d57600080fd5b506200043e6200061f36600462002e11565b620007f6565b3480156200063257600080fd5b506002546001600160a01b031662000400565b3480156200065257600080fd5b50620006816200066436600462002e11565b805160209182012060009081526005909152604090205460ff1690565b604051620003b0919062002ff6565b3480156200069d57600080fd5b50620004c6620006af36600462003013565b620011bc565b348015620006c257600080fd5b50620006da620006d436600462002da3565b62001276565b60408051928352901515602083015201620003b0565b348015620006fd57600080fd5b506002546200071690600160a01b900463ffffffff1681565b60405163ffffffff9091168152602001620003b0565b3480156200073957600080fd5b50620004c66200074b36600462002da3565b6200130c565b3480156200075e57600080fd5b50620003876200077036600462003036565b620013c2565b3480156200078357600080fd5b50651b585b9d585b60d21b620004c6565b348015620007a157600080fd5b506200057562001411565b348015620007b957600080fd5b5062000387620007cb36600462003036565b6200143d565b348015620007de57600080fd5b50620004c6620007f036600462002e11565b620014dc565b60606000806200081d84805160209182012060009081526005909152604090205460ff1690565b9050600281600281111562000836576200083662002fe0565b0362000858576200084e848051906020012062001561565b9250925050915091565b60018160028111156200086f576200086f62002fe0565b0362000887576200084e848051906020012062001761565b505060408051600080825260208201909252939092509050565b600081516040620008b3919062003061565b9050601f19620008c582602062003061565b620008d290601f62003061565b1690506020808303528060208303f35b6002546001600160a01b03163314620009185760405162461bcd60e51b81526004016200090f9062003077565b60405180910390fd5b62000927836000848462000e78565b505050565b600680546200093b9062002acd565b80601f0160208091040260200160405190810160405280929190818152602001828054620009699062002acd565b8015620009ba5780601f106200098e57610100808354040283529160200191620009ba565b820191906000526020600020905b8154815290600101906020018083116200099c57829003601f168201915b505050505081565b6002546001600160a01b03163314620009ef5760405162461bcd60e51b81526004016200090f9062003077565b6002805463ffffffff909216600160a01b0263ffffffff60a01b19909216919091179055565b606060008062000a3c85805160209182012060009081526005909152604090205460ff1690565b9050600281600281111562000a555762000a5562002fe0565b0362000a795762000a6e8580519060200120856200188e565b925092505062000abe565b600181600281111562000a905762000a9062002fe0565b0362000aa95762000a6e8580519060200120856200196b565b50506040805160008082526020820190925291505b9250929050565b600080600062000aec84805160209182012060009081526005909152604090205460ff1690565b9050600281600281111562000b055762000b0562002fe0565b0362000b1d576200084e8480519060200120620019e4565b600181600281111562000b345762000b3462002fe0565b0362000b4c576200084e848051906020012062001abb565b50600093849350915050565b6002546001600160a01b0316331462000b855760405162461bcd60e51b81526004016200090f9062003077565b600662000b938282620030f6565b5050565b60035460408051630e65e36d60e11b815290516000926001600160a01b031691631ccbc6da9160048083019260209291908290030181865afa15801562000be2573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000c089190620031c2565b905090565b6002546001600160a01b0316331462000c3a5760405162461bcd60e51b81526004016200090f9062003077565b62000c4462001411565b62000cab5760405162461bcd60e51b815260206004820152603060248201527f5468652063757272656e74206e6574776f726b20646f6573206e6f742073757060448201526f1c1bdc9d08189b1bd8881d5c1b1bd85960821b60648201526084016200090f565b600062000ccf84805160209182012060009081526005909152604090205460ff1690565b9050600081600281111562000ce85762000ce862002fe0565b148062000d095750600281600281111562000d075762000d0762002fe0565b145b62000d4e5760405162461bcd60e51b8152602060048201526014602482015273496e76616c69642073746f72616765206d6f646560601b60448201526064016200090f565b600081600281111562000d655762000d6562002fe0565b0362000d785762000d7884600262001b12565b62000d8c8480519060200120848462001b54565b50505050565b6002546001600160a01b0316331462000dbf5760405162461bcd60e51b81526004016200090f9062003077565b6002546001600160a01b0316ff5b60008062000df284805160209182012060009081526005909152604090205460ff1690565b9050600281600281111562000e0b5762000e0b62002fe0565b0362000e2d5762000e24848051906020012084620011bc565b91505062000e72565b600181600281111562000e445762000e4462002fe0565b0362000e6c57600062000e58858562000a15565b508051602090910120925062000e72915050565b50600090505b92915050565b6002546001600160a01b0316331462000ea55760405162461bcd60e51b81526004016200090f9062003077565b600062000ec985805160209182012060009081526005909152604090205460ff1690565b9050600081600281111562000ee25762000ee262002fe0565b148062000f035750600181600281111562000f015762000f0162002fe0565b145b62000f485760405162461bcd60e51b8152602060048201526014602482015273496e76616c69642073746f72616765206d6f646560601b60448201526064016200090f565b600081600281111562000f5f5762000f5f62002fe0565b0362000f725762000f7285600162001b12565b62000f8885805190602001208585853462001e83565b5050505050565b6002546000906001600160a01b0316331462000fbf5760405162461bcd60e51b81526004016200090f9062003077565b600062000fe383805160209182012060009081526005909152604090205460ff1690565b9050600281600281111562000ffc5762000ffc62002fe0565b036200101d57620010168380519060200120600062001f6c565b9392505050565b600181600281111562001034576200103462002fe0565b036200104e57620010168380519060200120600062001fcc565b50600092915050565b6002546001600160a01b03163314620010845760405162461bcd60e51b81526004016200090f9062003077565b6002546040516001600160a01b03909116904780156108fc02916000818181858888f19350505050158015620010be573d6000803e3d6000fd5b50565b6002546000906001600160a01b03163314620010f15760405162461bcd60e51b81526004016200090f9062003077565b60006200111584805160209182012060009081526005909152604090205460ff1690565b905060028160028111156200112e576200112e62002fe0565b03620011475762000e248480519060200120846200208e565b60018160028111156200115e576200115e62002fe0565b03620011775762000e2484805190602001208462002116565b5060009392505050565b6002546001600160a01b03163314620011ae5760405162461bcd60e51b81526004016200090f9062003077565b620011ba600062002206565b565b6000620011c98362002258565b8210620011d95750600062000e72565b60035460008481526004602081815260408084208785529091529182902054915163d8389dc560e01b8152908101919091526001600160a01b039091169063d8389dc590602401602060405180830381865afa1580156200123e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620012649190620031dc565b67ffffffffffffffff19169392505050565b60008060006200129d85805160209182012060009081526005909152604090205460ff1690565b90506002816002811115620012b657620012b662002fe0565b03620012cf5762000a6e85805190602001208562002299565b6001816002811115620012e657620012e662002fe0565b03620012ff5762000a6e8580519060200120856200234d565b5060009485945092505050565b6002546000906001600160a01b031633146200133c5760405162461bcd60e51b81526004016200090f9062003077565b60006200136084805160209182012060009081526005909152604090205460ff1690565b9050600281600281111562001379576200137962002fe0565b03620013925762000e2484805190602001208462001f6c565b6001816002811115620013a957620013a962002fe0565b03620011775762000e2484805190602001208462001fcc565b6002546001600160a01b03163314620013ef5760405162461bcd60e51b81526004016200090f9062003077565b600380546001600160a01b0319166001600160a01b0392909216919091179055565b6003546000906001600160a01b03161580159062000c08575060006200143662000b97565b1015905090565b6002546001600160a01b031633146200146a5760405162461bcd60e51b81526004016200090f9062003077565b6001600160a01b038116620014d15760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016200090f565b620010be8162002206565b6000806200150183805160209182012060009081526005909152604090205460ff1690565b905060028160028111156200151a576200151a62002fe0565b03620015325762001016838051906020012062002258565b600181600281111562001549576200154962002fe0565b036200104e57620010168380519060200120620023a5565b606060008060006200157385620019e4565b9150915080600003620015bb5760005b6040519080825280601f01601f191660200182016040528015620015ae576020820181803683370190505b5095600095509350505050565b6000826001600160401b03811115620015d857620015d862002b90565b6040519080825280601f01601f19166020018201604052801562001603576020820181803683370190505b5090506000805b838110156200175257600088815260046020818152604080842085855290915280832054600354915163afd5644d60e01b815292830181905292916001600160a01b039091169063afd5644d90602401602060405180830381865afa15801562001678573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200169e9190620031c2565b60035460405163bea94b8b60e01b81529192506001600160a01b03169063bea94b8b90620016d9908590600190600090879060040162003209565b600060405180830381865afa158015620016f7573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526200172191908101906200323e565b508060406020868801013e62001738818562003061565b9350505080806200174990620032bd565b9150506200160a565b50909660019650945050505050565b60606000806000620017738562001abb565b91509150806000036200178857600062001583565b6000826001600160401b03811115620017a557620017a562002b90565b6040519080825280601f01601f191660200182016040528015620017d0576020820181803683370190505b5090506020810160005b838110156200175257600088815260208181526040808320848452909152812054906200180782620023e4565b156200184957620018188260e01c90565b60008b8152600160209081526040808320878452909152902090915062001841908386620023f9565b505062001868565b816200185581620024ad565b50915062001864818662002513565b5050505b62001874818562003061565b9350505080806200188590620032bd565b915050620017da565b60606000806200189f858562002299565b5090506001811015620018c657505060408051600080825260208201909252915062000abe565b600354600086815260046020818152604080842089855290915280832054905163bea94b8b60e01b815292936001600160a01b03169263bea94b8b92620019169291600191879189910162003209565b600060405180830381865afa15801562001934573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526200195e91908101906200323e565b9660019650945050505050565b600082815260208181526040808320848452909152812054606091906200199281620023e4565b15620019cc5760008581526001602090815260408083208784529091528120620019bd908362002572565b93506001925062000abe915050565b80620019d88162002619565b93509350505062000abe565b6000806000620019f48462002258565b90506000805b8281101562001ab15760035460008781526004602081815260408084208685529091529182902054915163afd5644d60e01b8152908101919091526001600160a01b039091169063afd5644d90602401602060405180830381865afa15801562001a68573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001a8e9190620031c2565b62001a9a908362003061565b91508062001aa881620032bd565b915050620019fa565b5094909350915050565b6000806000805b60008062001ad187846200234d565b915091508062001ae357505062001b08565b62001aef828562003061565b93508262001afd81620032bd565b935050505062001ac2565b9094909350915050565b81516020808401919091206000908152600590915260409020805482919060ff1916600183600281111562001b4b5762001b4b62002fe0565b02179055505050565b815160035460408051630e65e36d60e11b815290516000926001600160a01b031691631ccbc6da9160048083019260209291908290030181865afa15801562001ba1573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001bc79190620031c2565b905062001bd58282620032d9565b34101562001c1d5760405162461bcd60e51b8152602060048201526014602482015273696e73756666696369656e742062616c616e636560601b60448201526064016200090f565b60005b828160ff16101562001e7b57838160ff168151811062001c445762001c4462002a5f565b6020026020010151600010801562001c935750600260149054906101000a900463ffffffff1663ffffffff16848260ff168151811062001c885762001c8862002a5f565b602002602001015111155b62001cd85760405162461bcd60e51b81526020600482015260146024820152730d2dcecc2d8d2c840c6d0eadcd640d8cadccee8d60631b60448201526064016200090f565b62001d0386868360ff168151811062001cf55762001cf562002a5f565b6020026020010151620026bf565b60003387878460ff168151811062001d1f5762001d1f62002a5f565b602002602001015160405160200162001d56939291906001600160a01b039390931683526020830191909152604082015260600190565b604051602081830303815290604052805190602001209050600360009054906101000a90046001600160a01b03166001600160a01b0316634581a920848385898760ff168151811062001dad5762001dad62002a5f565b60200260200101516040518563ffffffff1660e01b815260040162001de89392919092835260ff919091166020830152604082015260600190565b6000604051808303818588803b15801562001e0257600080fd5b505af115801562001e17573d6000803e3d6000fd5b505050505080600460008981526020019081526020016000206000888560ff168151811062001e4a5762001e4a62002a5f565b602002602001015181526020019081526020016000208190555050808062001e7290620032f3565b91505062001c20565b505050505050565b62001e8f85856200275d565b60ff7f00000000000000000000000000000000000000000000000000000000000000001682111562001ef65762001ed862001ecc84848462002875565b6001600160a01b031690565b60008681526020818152604080832088845290915290205562000f88565b60008581526001602090815260408083208784528252918290208251601f860183900483028101830190935284835262001f4d92909186908690819084018382808284376000920191909152506200293192505050565b6000868152602081815260408083208884529091529020555050505050565b60005b60008381526004602090815260408083208584529091529020548062001f96575062001fc6565b60008481526004602090815260408083208684529091528120558262001fbc81620032bd565b9350505062001f6f565b50919050565b60005b6000838152602081815260408083208584529091529020548062001ff4575062001fc6565b62001fff81620023e4565b62002060576000819050806001600160a01b0316632b68b9c66040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156200204557600080fd5b505af11580156200205a573d6000803e3d6000fd5b50505050505b600084815260208181526040808320868452909152812055826200208481620032bd565b9350505062001fcf565b600082815260046020908152604080832084845290915281205480620020b957600091505062000e72565b600084815260046020526040812081620020d586600162003061565b81526020019081526020016000205414620020f557600091505062000e72565b50506000918252600460209081526040808420928452919052812055600190565b600082815260208181526040808320848452909152812054806200213f57600091505062000e72565b6000848152602081905260408120816200215b86600162003061565b815260200190815260200160002054146200217b57600091505062000e72565b6200218681620023e4565b620021e7576000819050806001600160a01b0316632b68b9c66040518163ffffffff1660e01b8152600401600060405180830381600087803b158015620021cc57600080fd5b505af1158015620021e1573d6000803e3d6000fd5b50505050505b5050600091825260208281526040808420928452919052812055600190565b600280546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6000805b60008381526004602090815260408083208484529091529020548062002283575062000e72565b816200228f81620032bd565b925050506200225c565b600080620022a78462002258565b8310620022ba5750600090508062000abe565b600354600085815260046020818152604080842088855290915280832054905163afd5644d60e01b81529182015290916001600160a01b03169063afd5644d90602401602060405180830381865afa1580156200231b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620023419190620031c2565b95600195509350505050565b6000828152602081815260408083208484529091528120548190806200237b57600080925092505062000abe565b6200238681620023e4565b1562002399576000620019bd8260e01c90565b80620019d881620024ad565b6000805b60008381526020818152604080832084845290915290205480620023ce575062000e72565b81620023da81620032bd565b92505050620023a9565b600080620023f28360e01c90565b1192915050565b60008060006200240985620029cb565b808652909350905083601c8411156200249f57601c81016000805b6020600162002435601c8a62002a8b565b6200244290602062003061565b6200244e919062002a8b565b6200245a919062003315565b8110156200249b57600081815260208b815260409091205480855292506200248490849062003061565b9250806200249281620032bd565b91505062002424565b5050505b600192505050935093915050565b6000806001600160a01b038316620024ca57506000928392509050565b60008060405180610160016040528061012681526020016200346e6101269139519050843b91508082101562002507575060009485945092505050565b62002341818362002a8b565b6000806000806200252486620024ad565b91509150806200253d5760008093509350505062000abe565b600060405180610160016040528061012681526020016200346e6101269139519050828187893c509095600195509350505050565b606060006200258183620029e6565b92509050601c8111156200261257603c82016000805b60206001620025a8601c8762002a8b565b620025b590602062003061565b620025c1919062002a8b565b620025cd919062003315565b8110156200260e57600081815260208881526040909120548085529250620025f790849062003061565b9250806200260581620032bd565b91505062002597565b5050505b5092915050565b606060008060006200262b85620024ad565b91509150806200263d57600062001583565b6000826001600160401b038111156200265a576200265a62002b90565b6040519080825280601f01601f19166020018201604052801562002685576020820181803683370190505b509050600060405180610160016040528061012681526020016200346e6101269139519050838160208401893c5095600195509350505050565b60008281526004602090815260408083208484529091529020548062000927578115806200271657506000838152600460205260408120816200270460018662002a8b565b81526020019081526020016000205414155b620009275760405162461bcd60e51b81526020600482015260166024820152751b5d5cdd081c995c1b1858d9481bdc88185c1c195b9960521b60448201526064016200090f565b60008281526020818152604080832084845290915290205480620027f957811580620027b25750600083815260208190526040812081620027a060018662002a8b565b81526020019081526020016000205414155b620027f95760405162461bcd60e51b81526020600482015260166024820152751b5d5cdd081c995c1b1858d9481bdc88185c1c195b9960521b60448201526064016200090f565b6200280481620023e4565b6200092757806001600160a01b0381161562000d8c57806001600160a01b0316632b68b9c66040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156200285657600080fd5b505af11580156200286b573d6000803e3d6000fd5b5050505050505050565b60008060405180610160016040528061012681526020016200346e61012691398585604051602001620028ab9392919062003338565b60408051601f1981840301815291905290506000620028cd6043602062003061565b30838201529050620028e2608c602062003061565b905030818301525060008382604051620028fc9062002a51565b62002908919062002d66565b6040518091039082f090508015801562002926573d6000803e3d6000fd5b509695505050505050565b805160208083015160e083901b911c1790601c81111562002612576000603c8401815b6020600162002965601c8762002a8b565b6200297290602062003061565b6200297e919062002a8b565b6200298a919062003315565b8110156200260e5781519250620029a382602062003061565b6000828152602089905260409020849055915080620029c281620032bd565b91505062002954565b600080620029d98360e01c90565b9360209390931b92915050565b60006060620029f58360e01c90565b9150602083901b9250816001600160401b0381111562002a195762002a1962002b90565b6040519080825280601f01601f19166020018201604052801562002a44576020820181803683370190505b5060208101939093525091565b61010b806200336383390190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b8181038181111562000e725762000e7262002a75565b6000808585111562002ab257600080fd5b8386111562002ac057600080fd5b5050820193919092039150565b600181811c9082168062002ae257607f821691505b60208210810362001fc657634e487b7160e01b600052602260045260246000fd5b828482376000838201600081526000845462002b1f8162002acd565b6001828116801562002b3a576001811462002b505762002b81565b60ff198416865282151583028601945062002b81565b8860005260208060002060005b8581101562002b785781548982015290840190820162002b5d565b50505082860194505b50929998505050505050505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b038111828210171562002bd15762002bd162002b90565b604052919050565b60006001600160401b0382111562002bf55762002bf562002b90565b50601f01601f191660200190565b600082601f83011262002c1557600080fd5b813562002c2c62002c268262002bd9565b62002ba6565b81815284602083860101111562002c4257600080fd5b816020850160208301376000918101602001919091529392505050565b60008083601f84011262002c7257600080fd5b5081356001600160401b0381111562002c8a57600080fd5b60208301915083602082850101111562000abe57600080fd5b60008060006040848603121562002cb957600080fd5b83356001600160401b038082111562002cd157600080fd5b62002cdf8783880162002c03565b9450602086013591508082111562002cf657600080fd5b5062002d058682870162002c5f565b9497909650939450505050565b60005b8381101562002d2f57818101518382015260200162002d15565b50506000910152565b6000815180845262002d5281602086016020860162002d12565b601f01601f19169290920160200192915050565b60208152600062001016602083018462002d38565b60006020828403121562002d8e57600080fd5b813563ffffffff811681146200101657600080fd5b6000806040838503121562002db757600080fd5b82356001600160401b0381111562002dce57600080fd5b62002ddc8582860162002c03565b95602094909401359450505050565b60408152600062002e00604083018562002d38565b905082151560208301529392505050565b60006020828403121562002e2457600080fd5b81356001600160401b0381111562002e3b57600080fd5b62002e498482850162002c03565b949350505050565b600082601f83011262002e6357600080fd5b813560206001600160401b0382111562002e815762002e8162002b90565b8160051b62002e9282820162002ba6565b928352848101820192828101908785111562002ead57600080fd5b83870192505b8483101562002ece5782358252918301919083019062002eb3565b979650505050505050565b60008060006060848603121562002eef57600080fd5b83356001600160401b038082111562002f0757600080fd5b62002f158783880162002c03565b9450602086013591508082111562002f2c57600080fd5b62002f3a8783880162002e51565b9350604086013591508082111562002f5157600080fd5b5062002f608682870162002e51565b9150509250925092565b6000806000806060858703121562002f8157600080fd5b84356001600160401b038082111562002f9957600080fd5b62002fa78883890162002c03565b955060208701359450604087013591508082111562002fc557600080fd5b5062002fd48782880162002c5f565b95989497509550505050565b634e487b7160e01b600052602160045260246000fd5b60208101600383106200300d576200300d62002fe0565b91905290565b600080604083850312156200302757600080fd5b50508035926020909101359150565b6000602082840312156200304957600080fd5b81356001600160a01b03811681146200101657600080fd5b8082018082111562000e725762000e7262002a75565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b601f8211156200092757600081815260208120601f850160051c81016020861015620030d55750805b601f850160051c820191505b8181101562001e7b57828155600101620030e1565b81516001600160401b0381111562003112576200311262002b90565b6200312a8162003123845462002acd565b84620030ac565b602080601f831160018114620031625760008415620031495750858301515b600019600386901b1c1916600185901b17855562001e7b565b600085815260208120601f198616915b82811015620031935788860151825594840194600190910190840162003172565b5085821015620031b25787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b600060208284031215620031d557600080fd5b5051919050565b600060208284031215620031ef57600080fd5b815167ffffffffffffffff19811681146200101657600080fd5b848152608081016002851062003223576200322362002fe0565b84602083015283604083015282606083015295945050505050565b6000602082840312156200325157600080fd5b81516001600160401b038111156200326857600080fd5b8201601f810184136200327a57600080fd5b80516200328b62002c268262002bd9565b818152856020838501011115620032a157600080fd5b620032b482602083016020860162002d12565b95945050505050565b600060018201620032d257620032d262002a75565b5060010190565b808202811582820484141762000e725762000e7262002a75565b600060ff821660ff81036200330c576200330c62002a75565b60010192915050565b6000826200333357634e487b7160e01b600052601260045260246000fd5b500490565b600084516200334c81846020890162002d12565b820183858237600093019283525090939250505056fe608060405260405161010b38038061010b83398101604081905261002291610041565b80518060208301f35b634e487b7160e01b600052604160045260246000fd5b6000602080838503121561005457600080fd5b82516001600160401b038082111561006b57600080fd5b818501915085601f83011261007f57600080fd5b8151818111156100915761009161002b565b604051601f8201601f19908116603f011681019083821181831017156100b9576100b961002b565b8160405282815288868487010111156100d157600080fd5b600093505b828410156100f357848401860151818501870152928501926100d6565b60008684830101528096505050505050509291505056fe6080604052348015600f57600080fd5b506004361060325760003560e01c80632b68b9c61460375780638da5cb5b14603f575b600080fd5b603d6081565b005b60657f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200160405180910390f35b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161460ed5760405162461bcd60e51b815260206004820152600e60248201526d3737ba10333937b69037bbb732b960911b604482015260640160405180910390fd5b33fffea2646970667358221220fc66c9afb7cb2f6209ae28167cf26c6c06f86a82cbe3c56de99027979389a1be64736f6c63430008070033a264697066735822122074ecdb7c1356cd26b7ae20a002751e685b2c97645c0ec1b1214c316ec9516dce64736f6c63430008120033
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.