Sepolia Testnet

Contract

0xde90eb7291f80f400BC75f8550cf7e6C2BA9e5CF

Overview

ETH Balance

0.000000178593647538 ETH

Multichain Info

N/A
Transaction Hash
Method
Block
From
To
Write Chunks65509132024-08-22 17:44:36105 days ago1724348676IN
0xde90eb72...C2BA9e5CF
0.00145752 ETH0.002041591.70029258
Write Chunks65508722024-08-22 17:36:00105 days ago1724348160IN
0xde90eb72...C2BA9e5CF
0.00145752 ETH0.002558891.84211914
Write Chunks65508702024-08-22 17:35:24105 days ago1724348124IN
0xde90eb72...C2BA9e5CF
0.00145752 ETH0.002552421.75712353
Write Chunks65508692024-08-22 17:35:12105 days ago1724348112IN
0xde90eb72...C2BA9e5CF
0.00145752 ETH0.002756661.84870892
Write Chunks65473392024-08-22 4:21:00106 days ago1724300460IN
0xde90eb72...C2BA9e5CF
0.00145763 ETH0.022386318.16467948
Write Chunks65473382024-08-22 4:20:48106 days ago1724300448IN
0xde90eb72...C2BA9e5CF
0.00145763 ETH0.020684717.414061
Write Chunks65473382024-08-22 4:20:48106 days ago1724300448IN
0xde90eb72...C2BA9e5CF
0.00145763 ETH0.020686317.414061
Write Chunks65473382024-08-22 4:20:48106 days ago1724300448IN
0xde90eb72...C2BA9e5CF
0.00145763 ETH0.020686047.414061
Write Chunks65376832024-08-20 15:58:36107 days ago1724169516IN
0xde90eb72...C2BA9e5CF
0.0014591 ETH0.000418550.46716307
Write Chunks65375982024-08-20 15:39:36107 days ago1724168376IN
0xde90eb72...C2BA9e5CF
0.0014591 ETH0.003433151.64839748
Write Chunks65375962024-08-20 15:39:12107 days ago1724168352IN
0xde90eb72...C2BA9e5CF
0.0014591 ETH0.003712051.75918088
Write Chunks65375942024-08-20 15:38:48107 days ago1724168328IN
0xde90eb72...C2BA9e5CF
0.0014591 ETH0.004154141.70905367
Write Chunks64280782024-08-03 9:01:24124 days ago1722675684IN
0xde90eb72...C2BA9e5CF
0.0014615 ETH0.26817641.54224853
Write Chunks64280572024-08-03 8:55:36124 days ago1722675336IN
0xde90eb72...C2BA9e5CF
0.0014615 ETH0.3530461.21166907
Write Chunks64280552024-08-03 8:55:12124 days ago1722675312IN
0xde90eb72...C2BA9e5CF
0.002923 ETH0.627591131.2468454
Write Chunks64280482024-08-03 8:53:36124 days ago1722675216IN
0xde90eb72...C2BA9e5CF
0.002923 ETH0.536418121.2077994
Write Chunks64280462024-08-03 8:53:00124 days ago1722675180IN
0xde90eb72...C2BA9e5CF
0.002923 ETH0.495923051.17152282
Write Chunks64280432024-08-03 8:52:12124 days ago1722675132IN
0xde90eb72...C2BA9e5CF
0.002923 ETH0.458487021.14144871
Write Chunks64280422024-08-03 8:52:00124 days ago1722675120IN
0xde90eb72...C2BA9e5CF
0.002923 ETH0.440847821.14617561
Write Chunks64280402024-08-03 8:51:36124 days ago1722675096IN
0xde90eb72...C2BA9e5CF
0.002923 ETH0.440838131.10899119
Write Chunks64280382024-08-03 8:50:48124 days ago1722675048IN
0xde90eb72...C2BA9e5CF
0.002923 ETH0.407532220.96944644
Write Chunks64280342024-08-03 8:49:48124 days ago1722674988IN
0xde90eb72...C2BA9e5CF
0.002923 ETH0.362291651.01817077
Write Chunks64280332024-08-03 8:49:24124 days ago1722674964IN
0xde90eb72...C2BA9e5CF
0.002923 ETH0.348352361.01367152
Write Chunks64280012024-08-03 8:42:00124 days ago1722674520IN
0xde90eb72...C2BA9e5CF
0.0014615 ETH0.148916850.96904491
Write Chunks64279922024-08-03 8:40:12124 days ago1722674412IN
0xde90eb72...C2BA9e5CF
0.0014615 ETH0.143112941.11569302
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Block From To
65509132024-08-22 17:44:36105 days ago1724348676
0xde90eb72...C2BA9e5CF
0.00145752 ETH
65508722024-08-22 17:36:00105 days ago1724348160
0xde90eb72...C2BA9e5CF
0.00145752 ETH
65508702024-08-22 17:35:24105 days ago1724348124
0xde90eb72...C2BA9e5CF
0.00145752 ETH
65508692024-08-22 17:35:12105 days ago1724348112
0xde90eb72...C2BA9e5CF
0.00145752 ETH
65473392024-08-22 4:21:00106 days ago1724300460
0xde90eb72...C2BA9e5CF
0.00145763 ETH
65473382024-08-22 4:20:48106 days ago1724300448
0xde90eb72...C2BA9e5CF
0.00145763 ETH
65473382024-08-22 4:20:48106 days ago1724300448
0xde90eb72...C2BA9e5CF
0.00145763 ETH
65473382024-08-22 4:20:48106 days ago1724300448
0xde90eb72...C2BA9e5CF
0.00145763 ETH
65376832024-08-20 15:58:36107 days ago1724169516
0xde90eb72...C2BA9e5CF
0.0014591 ETH
65375982024-08-20 15:39:36107 days ago1724168376
0xde90eb72...C2BA9e5CF
0.0014591 ETH
65375962024-08-20 15:39:12107 days ago1724168352
0xde90eb72...C2BA9e5CF
0.0014591 ETH
65375942024-08-20 15:38:48107 days ago1724168328
0xde90eb72...C2BA9e5CF
0.0014591 ETH
64280782024-08-03 9:01:24124 days ago1722675684
0xde90eb72...C2BA9e5CF
0.0014615 ETH
64280572024-08-03 8:55:36124 days ago1722675336
0xde90eb72...C2BA9e5CF
0.0014615 ETH
64280552024-08-03 8:55:12124 days ago1722675312
0xde90eb72...C2BA9e5CF
0.0014615 ETH
64280552024-08-03 8:55:12124 days ago1722675312
0xde90eb72...C2BA9e5CF
0.0014615 ETH
64280482024-08-03 8:53:36124 days ago1722675216
0xde90eb72...C2BA9e5CF
0.0014615 ETH
64280482024-08-03 8:53:36124 days ago1722675216
0xde90eb72...C2BA9e5CF
0.0014615 ETH
64280462024-08-03 8:53:00124 days ago1722675180
0xde90eb72...C2BA9e5CF
0.0014615 ETH
64280462024-08-03 8:53:00124 days ago1722675180
0xde90eb72...C2BA9e5CF
0.0014615 ETH
64280432024-08-03 8:52:12124 days ago1722675132
0xde90eb72...C2BA9e5CF
0.0014615 ETH
64280432024-08-03 8:52:12124 days ago1722675132
0xde90eb72...C2BA9e5CF
0.0014615 ETH
64280422024-08-03 8:52:00124 days ago1722675120
0xde90eb72...C2BA9e5CF
0.0014615 ETH
64280422024-08-03 8:52:00124 days ago1722675120
0xde90eb72...C2BA9e5CF
0.0014615 ETH
64280402024-08-03 8:51:36124 days ago1722675096
0xde90eb72...C2BA9e5CF
0.0014615 ETH
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
FlatDirectory

Compiler Version
v0.8.18+commit.87f61d96

Optimization Enabled:
Yes with 200 runs

Other Settings:
london EvmVersion, None license

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;
    }
}

Contract ABI

[{"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"}]

60c0604052600060a09081526006906200001a9082620001ac565b503480156200002857600080fd5b50604051620038d0380380620038d08339810160408190526200004b9162000278565b60ff831660805282828281816200006233620000b5565b6002805463ffffffff909316600160a01b0263ffffffff60a01b1990931692909217909155600380546001600160a01b039092166001600160a01b031990921691909117905550620002e4945050505050565b600280546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200013257607f821691505b6020821081036200015357634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115620001a757600081815260208120601f850160051c81016020861015620001825750805b601f850160051c820191505b81811015620001a3578281556001016200018e565b5050505b505050565b81516001600160401b03811115620001c857620001c862000107565b620001e081620001d984546200011d565b8462000159565b602080601f831160018114620002185760008415620001ff5750858301515b600019600386901b1c1916600185901b178555620001a3565b600085815260208120601f198616915b82811015620002495788860151825594840194600190910190840162000228565b5085821015620002685787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6000806000606084860312156200028e57600080fd5b835160ff81168114620002a057600080fd5b602085015190935063ffffffff81168114620002bb57600080fd5b60408501519092506001600160a01b0381168114620002d957600080fd5b809150509250925092565b6080516135c962000307600039600081816105500152611e9301526135c96000f3fe608060405260043610620001ee5760003560e01c8063590e1ae3116200010f578063caf1283611620000a3578063dd473fae116200006d578063dd473fae1462000776578063f14c7ad71462000794578063f2fde38b14620007ac578063f916c5b014620007d157620001ee565b8063caf1283614620006b5578063cf86bf9314620006f0578063d84eb56c146200072c578063dc38b0a2146200075157620001ee565b80638bf4515c11620000e55780638bf4515c14620006005780638da5cb5b146200062557806393b7628f1462000645578063956a3433146200069057620001ee565b8063590e1ae314620005ab5780635ba1d9e514620005c3578063715018a614620005e857620001ee565b80631ccbc6da116200018757806342216bed116200015d57806342216bed1462000504578063492c7b2a14620005295780634eed7cf1146200054057806358edef4c146200058657620001ee565b80631ccbc6da14620004ae5780631fbfa12714620004d55780632b68b9c614620004ec57620001ee565b806311ce026711620001c957806311ce026714620003de5780631a7237e014620004195780631c5ee10c146200044e5780631c993ad5146200048957620001ee565b8063038cd79f14620003705780630936286114620003895780631089f40f14620003b9575b348015620001fb57600080fd5b506000366060808284036200022157505060408051602081019091526000815262000365565b8383600081811062000237576200023762002a5f565b9050013560f81c60f81b6001600160f81b031916602f60f81b146200028357505060408051808201909152600e81526d0d2dcc6dee4e4cac6e840e0c2e8d60931b602082015262000365565b83836200029260018262002a8b565b818110620002a457620002a462002a5f565b909101356001600160f81b031916602f60f81b0390506200030657620002fd620002d2846001818862002aa1565b6006604051602001620002e89392919062002b03565b604051602081830303815290604052620007f6565b50905062000358565b6200035462000319846001818862002aa1565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250620007f692505050565b5090505b6200036381620008a1565b505b915050805190602001f35b620003876200038136600462002ca3565b620008e2565b005b3480156200039657600080fd5b50620003a16200092c565b604051620003b0919062002d66565b60405180910390f35b348015620003c657600080fd5b5062000387620003d836600462002d7b565b620009c2565b348015620003eb57600080fd5b5060035462000400906001600160a01b031681565b6040516001600160a01b039091168152602001620003b0565b3480156200042657600080fd5b506200043e6200043836600462002da3565b62000a15565b604051620003b092919062002deb565b3480156200045b57600080fd5b50620004736200046d36600462002e11565b62000ac5565b60408051928352602083019190915201620003b0565b3480156200049657600080fd5b5062000387620004a836600462002e11565b62000b58565b348015620004bb57600080fd5b50620004c662000b97565b604051908152602001620003b0565b62000387620004e636600462002ed9565b62000c0d565b348015620004f957600080fd5b506200038762000d92565b3480156200051157600080fd5b50620004c66200052336600462002da3565b62000dcd565b620003876200053a36600462002f6a565b62000e78565b3480156200054d57600080fd5b507f000000000000000000000000000000000000000000000000000000000000000060ff1615155b6040519015158152602001620003b0565b3480156200059357600080fd5b50620004c6620005a536600462002e11565b62000f8f565b348015620005b857600080fd5b506200038762001057565b348015620005d057600080fd5b5062000575620005e236600462002da3565b620010c1565b348015620005f557600080fd5b506200038762001181565b3480156200060d57600080fd5b506200043e6200061f36600462002e11565b620007f6565b3480156200063257600080fd5b506002546001600160a01b031662000400565b3480156200065257600080fd5b50620006816200066436600462002e11565b805160209182012060009081526005909152604090205460ff1690565b604051620003b0919062002ff6565b3480156200069d57600080fd5b50620004c6620006af36600462003013565b620011bc565b348015620006c257600080fd5b50620006da620006d436600462002da3565b62001276565b60408051928352901515602083015201620003b0565b348015620006fd57600080fd5b506002546200071690600160a01b900463ffffffff1681565b60405163ffffffff9091168152602001620003b0565b3480156200073957600080fd5b50620004c66200074b36600462002da3565b6200130c565b3480156200075e57600080fd5b50620003876200077036600462003036565b620013c2565b3480156200078357600080fd5b50651b585b9d585b60d21b620004c6565b348015620007a157600080fd5b506200057562001411565b348015620007b957600080fd5b5062000387620007cb36600462003036565b6200143d565b348015620007de57600080fd5b50620004c6620007f036600462002e11565b620014dc565b60606000806200081d84805160209182012060009081526005909152604090205460ff1690565b9050600281600281111562000836576200083662002fe0565b0362000858576200084e848051906020012062001561565b9250925050915091565b60018160028111156200086f576200086f62002fe0565b0362000887576200084e848051906020012062001761565b505060408051600080825260208201909252939092509050565b600081516040620008b3919062003061565b9050601f19620008c582602062003061565b620008d290601f62003061565b1690506020808303528060208303f35b6002546001600160a01b03163314620009185760405162461bcd60e51b81526004016200090f9062003077565b60405180910390fd5b62000927836000848462000e78565b505050565b600680546200093b9062002acd565b80601f0160208091040260200160405190810160405280929190818152602001828054620009699062002acd565b8015620009ba5780601f106200098e57610100808354040283529160200191620009ba565b820191906000526020600020905b8154815290600101906020018083116200099c57829003601f168201915b505050505081565b6002546001600160a01b03163314620009ef5760405162461bcd60e51b81526004016200090f9062003077565b6002805463ffffffff909216600160a01b0263ffffffff60a01b19909216919091179055565b606060008062000a3c85805160209182012060009081526005909152604090205460ff1690565b9050600281600281111562000a555762000a5562002fe0565b0362000a795762000a6e8580519060200120856200188e565b925092505062000abe565b600181600281111562000a905762000a9062002fe0565b0362000aa95762000a6e8580519060200120856200196b565b50506040805160008082526020820190925291505b9250929050565b600080600062000aec84805160209182012060009081526005909152604090205460ff1690565b9050600281600281111562000b055762000b0562002fe0565b0362000b1d576200084e8480519060200120620019e4565b600181600281111562000b345762000b3462002fe0565b0362000b4c576200084e848051906020012062001abb565b50600093849350915050565b6002546001600160a01b0316331462000b855760405162461bcd60e51b81526004016200090f9062003077565b600662000b938282620030f6565b5050565b60035460408051630e65e36d60e11b815290516000926001600160a01b031691631ccbc6da9160048083019260209291908290030181865afa15801562000be2573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000c089190620031c2565b905090565b6002546001600160a01b0316331462000c3a5760405162461bcd60e51b81526004016200090f9062003077565b62000c4462001411565b62000cab5760405162461bcd60e51b815260206004820152603060248201527f5468652063757272656e74206e6574776f726b20646f6573206e6f742073757060448201526f1c1bdc9d08189b1bd8881d5c1b1bd85960821b60648201526084016200090f565b600062000ccf84805160209182012060009081526005909152604090205460ff1690565b9050600081600281111562000ce85762000ce862002fe0565b148062000d095750600281600281111562000d075762000d0762002fe0565b145b62000d4e5760405162461bcd60e51b8152602060048201526014602482015273496e76616c69642073746f72616765206d6f646560601b60448201526064016200090f565b600081600281111562000d655762000d6562002fe0565b0362000d785762000d7884600262001b12565b62000d8c8480519060200120848462001b54565b50505050565b6002546001600160a01b0316331462000dbf5760405162461bcd60e51b81526004016200090f9062003077565b6002546001600160a01b0316ff5b60008062000df284805160209182012060009081526005909152604090205460ff1690565b9050600281600281111562000e0b5762000e0b62002fe0565b0362000e2d5762000e24848051906020012084620011bc565b91505062000e72565b600181600281111562000e445762000e4462002fe0565b0362000e6c57600062000e58858562000a15565b508051602090910120925062000e72915050565b50600090505b92915050565b6002546001600160a01b0316331462000ea55760405162461bcd60e51b81526004016200090f9062003077565b600062000ec985805160209182012060009081526005909152604090205460ff1690565b9050600081600281111562000ee25762000ee262002fe0565b148062000f035750600181600281111562000f015762000f0162002fe0565b145b62000f485760405162461bcd60e51b8152602060048201526014602482015273496e76616c69642073746f72616765206d6f646560601b60448201526064016200090f565b600081600281111562000f5f5762000f5f62002fe0565b0362000f725762000f7285600162001b12565b62000f8885805190602001208585853462001e83565b5050505050565b6002546000906001600160a01b0316331462000fbf5760405162461bcd60e51b81526004016200090f9062003077565b600062000fe383805160209182012060009081526005909152604090205460ff1690565b9050600281600281111562000ffc5762000ffc62002fe0565b036200101d57620010168380519060200120600062001f6c565b9392505050565b600181600281111562001034576200103462002fe0565b036200104e57620010168380519060200120600062001fcc565b50600092915050565b6002546001600160a01b03163314620010845760405162461bcd60e51b81526004016200090f9062003077565b6002546040516001600160a01b03909116904780156108fc02916000818181858888f19350505050158015620010be573d6000803e3d6000fd5b50565b6002546000906001600160a01b03163314620010f15760405162461bcd60e51b81526004016200090f9062003077565b60006200111584805160209182012060009081526005909152604090205460ff1690565b905060028160028111156200112e576200112e62002fe0565b03620011475762000e248480519060200120846200208e565b60018160028111156200115e576200115e62002fe0565b03620011775762000e2484805190602001208462002116565b5060009392505050565b6002546001600160a01b03163314620011ae5760405162461bcd60e51b81526004016200090f9062003077565b620011ba600062002206565b565b6000620011c98362002258565b8210620011d95750600062000e72565b60035460008481526004602081815260408084208785529091529182902054915163d8389dc560e01b8152908101919091526001600160a01b039091169063d8389dc590602401602060405180830381865afa1580156200123e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620012649190620031dc565b67ffffffffffffffff19169392505050565b60008060006200129d85805160209182012060009081526005909152604090205460ff1690565b90506002816002811115620012b657620012b662002fe0565b03620012cf5762000a6e85805190602001208562002299565b6001816002811115620012e657620012e662002fe0565b03620012ff5762000a6e8580519060200120856200234d565b5060009485945092505050565b6002546000906001600160a01b031633146200133c5760405162461bcd60e51b81526004016200090f9062003077565b60006200136084805160209182012060009081526005909152604090205460ff1690565b9050600281600281111562001379576200137962002fe0565b03620013925762000e2484805190602001208462001f6c565b6001816002811115620013a957620013a962002fe0565b03620011775762000e2484805190602001208462001fcc565b6002546001600160a01b03163314620013ef5760405162461bcd60e51b81526004016200090f9062003077565b600380546001600160a01b0319166001600160a01b0392909216919091179055565b6003546000906001600160a01b03161580159062000c08575060006200143662000b97565b1015905090565b6002546001600160a01b031633146200146a5760405162461bcd60e51b81526004016200090f9062003077565b6001600160a01b038116620014d15760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016200090f565b620010be8162002206565b6000806200150183805160209182012060009081526005909152604090205460ff1690565b905060028160028111156200151a576200151a62002fe0565b03620015325762001016838051906020012062002258565b600181600281111562001549576200154962002fe0565b036200104e57620010168380519060200120620023a5565b606060008060006200157385620019e4565b9150915080600003620015bb5760005b6040519080825280601f01601f191660200182016040528015620015ae576020820181803683370190505b5095600095509350505050565b6000826001600160401b03811115620015d857620015d862002b90565b6040519080825280601f01601f19166020018201604052801562001603576020820181803683370190505b5090506000805b838110156200175257600088815260046020818152604080842085855290915280832054600354915163afd5644d60e01b815292830181905292916001600160a01b039091169063afd5644d90602401602060405180830381865afa15801562001678573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200169e9190620031c2565b60035460405163bea94b8b60e01b81529192506001600160a01b03169063bea94b8b90620016d9908590600190600090879060040162003209565b600060405180830381865afa158015620016f7573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526200172191908101906200323e565b508060406020868801013e62001738818562003061565b9350505080806200174990620032bd565b9150506200160a565b50909660019650945050505050565b60606000806000620017738562001abb565b91509150806000036200178857600062001583565b6000826001600160401b03811115620017a557620017a562002b90565b6040519080825280601f01601f191660200182016040528015620017d0576020820181803683370190505b5090506020810160005b838110156200175257600088815260208181526040808320848452909152812054906200180782620023e4565b156200184957620018188260e01c90565b60008b8152600160209081526040808320878452909152902090915062001841908386620023f9565b505062001868565b816200185581620024ad565b50915062001864818662002513565b5050505b62001874818562003061565b9350505080806200188590620032bd565b915050620017da565b60606000806200189f858562002299565b5090506001811015620018c657505060408051600080825260208201909252915062000abe565b600354600086815260046020818152604080842089855290915280832054905163bea94b8b60e01b815292936001600160a01b03169263bea94b8b92620019169291600191879189910162003209565b600060405180830381865afa15801562001934573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526200195e91908101906200323e565b9660019650945050505050565b600082815260208181526040808320848452909152812054606091906200199281620023e4565b15620019cc5760008581526001602090815260408083208784529091528120620019bd908362002572565b93506001925062000abe915050565b80620019d88162002619565b93509350505062000abe565b6000806000620019f48462002258565b90506000805b8281101562001ab15760035460008781526004602081815260408084208685529091529182902054915163afd5644d60e01b8152908101919091526001600160a01b039091169063afd5644d90602401602060405180830381865afa15801562001a68573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001a8e9190620031c2565b62001a9a908362003061565b91508062001aa881620032bd565b915050620019fa565b5094909350915050565b6000806000805b60008062001ad187846200234d565b915091508062001ae357505062001b08565b62001aef828562003061565b93508262001afd81620032bd565b935050505062001ac2565b9094909350915050565b81516020808401919091206000908152600590915260409020805482919060ff1916600183600281111562001b4b5762001b4b62002fe0565b02179055505050565b815160035460408051630e65e36d60e11b815290516000926001600160a01b031691631ccbc6da9160048083019260209291908290030181865afa15801562001ba1573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001bc79190620031c2565b905062001bd58282620032d9565b34101562001c1d5760405162461bcd60e51b8152602060048201526014602482015273696e73756666696369656e742062616c616e636560601b60448201526064016200090f565b60005b828160ff16101562001e7b57838160ff168151811062001c445762001c4462002a5f565b6020026020010151600010801562001c935750600260149054906101000a900463ffffffff1663ffffffff16848260ff168151811062001c885762001c8862002a5f565b602002602001015111155b62001cd85760405162461bcd60e51b81526020600482015260146024820152730d2dcecc2d8d2c840c6d0eadcd640d8cadccee8d60631b60448201526064016200090f565b62001d0386868360ff168151811062001cf55762001cf562002a5f565b6020026020010151620026bf565b60003387878460ff168151811062001d1f5762001d1f62002a5f565b602002602001015160405160200162001d56939291906001600160a01b039390931683526020830191909152604082015260600190565b604051602081830303815290604052805190602001209050600360009054906101000a90046001600160a01b03166001600160a01b0316634581a920848385898760ff168151811062001dad5762001dad62002a5f565b60200260200101516040518563ffffffff1660e01b815260040162001de89392919092835260ff919091166020830152604082015260600190565b6000604051808303818588803b15801562001e0257600080fd5b505af115801562001e17573d6000803e3d6000fd5b505050505080600460008981526020019081526020016000206000888560ff168151811062001e4a5762001e4a62002a5f565b602002602001015181526020019081526020016000208190555050808062001e7290620032f3565b91505062001c20565b505050505050565b62001e8f85856200275d565b60ff7f00000000000000000000000000000000000000000000000000000000000000001682111562001ef65762001ed862001ecc84848462002875565b6001600160a01b031690565b60008681526020818152604080832088845290915290205562000f88565b60008581526001602090815260408083208784528252918290208251601f860183900483028101830190935284835262001f4d92909186908690819084018382808284376000920191909152506200293192505050565b6000868152602081815260408083208884529091529020555050505050565b60005b60008381526004602090815260408083208584529091529020548062001f96575062001fc6565b60008481526004602090815260408083208684529091528120558262001fbc81620032bd565b9350505062001f6f565b50919050565b60005b6000838152602081815260408083208584529091529020548062001ff4575062001fc6565b62001fff81620023e4565b62002060576000819050806001600160a01b0316632b68b9c66040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156200204557600080fd5b505af11580156200205a573d6000803e3d6000fd5b50505050505b600084815260208181526040808320868452909152812055826200208481620032bd565b9350505062001fcf565b600082815260046020908152604080832084845290915281205480620020b957600091505062000e72565b600084815260046020526040812081620020d586600162003061565b81526020019081526020016000205414620020f557600091505062000e72565b50506000918252600460209081526040808420928452919052812055600190565b600082815260208181526040808320848452909152812054806200213f57600091505062000e72565b6000848152602081905260408120816200215b86600162003061565b815260200190815260200160002054146200217b57600091505062000e72565b6200218681620023e4565b620021e7576000819050806001600160a01b0316632b68b9c66040518163ffffffff1660e01b8152600401600060405180830381600087803b158015620021cc57600080fd5b505af1158015620021e1573d6000803e3d6000fd5b50505050505b5050600091825260208281526040808420928452919052812055600190565b600280546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6000805b60008381526004602090815260408083208484529091529020548062002283575062000e72565b816200228f81620032bd565b925050506200225c565b600080620022a78462002258565b8310620022ba5750600090508062000abe565b600354600085815260046020818152604080842088855290915280832054905163afd5644d60e01b81529182015290916001600160a01b03169063afd5644d90602401602060405180830381865afa1580156200231b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620023419190620031c2565b95600195509350505050565b6000828152602081815260408083208484529091528120548190806200237b57600080925092505062000abe565b6200238681620023e4565b1562002399576000620019bd8260e01c90565b80620019d881620024ad565b6000805b60008381526020818152604080832084845290915290205480620023ce575062000e72565b81620023da81620032bd565b92505050620023a9565b600080620023f28360e01c90565b1192915050565b60008060006200240985620029cb565b808652909350905083601c8411156200249f57601c81016000805b6020600162002435601c8a62002a8b565b6200244290602062003061565b6200244e919062002a8b565b6200245a919062003315565b8110156200249b57600081815260208b815260409091205480855292506200248490849062003061565b9250806200249281620032bd565b91505062002424565b5050505b600192505050935093915050565b6000806001600160a01b038316620024ca57506000928392509050565b60008060405180610160016040528061012681526020016200346e6101269139519050843b91508082101562002507575060009485945092505050565b62002341818362002a8b565b6000806000806200252486620024ad565b91509150806200253d5760008093509350505062000abe565b600060405180610160016040528061012681526020016200346e6101269139519050828187893c509095600195509350505050565b606060006200258183620029e6565b92509050601c8111156200261257603c82016000805b60206001620025a8601c8762002a8b565b620025b590602062003061565b620025c1919062002a8b565b620025cd919062003315565b8110156200260e57600081815260208881526040909120548085529250620025f790849062003061565b9250806200260581620032bd565b91505062002597565b5050505b5092915050565b606060008060006200262b85620024ad565b91509150806200263d57600062001583565b6000826001600160401b038111156200265a576200265a62002b90565b6040519080825280601f01601f19166020018201604052801562002685576020820181803683370190505b509050600060405180610160016040528061012681526020016200346e6101269139519050838160208401893c5095600195509350505050565b60008281526004602090815260408083208484529091529020548062000927578115806200271657506000838152600460205260408120816200270460018662002a8b565b81526020019081526020016000205414155b620009275760405162461bcd60e51b81526020600482015260166024820152751b5d5cdd081c995c1b1858d9481bdc88185c1c195b9960521b60448201526064016200090f565b60008281526020818152604080832084845290915290205480620027f957811580620027b25750600083815260208190526040812081620027a060018662002a8b565b81526020019081526020016000205414155b620027f95760405162461bcd60e51b81526020600482015260166024820152751b5d5cdd081c995c1b1858d9481bdc88185c1c195b9960521b60448201526064016200090f565b6200280481620023e4565b6200092757806001600160a01b0381161562000d8c57806001600160a01b0316632b68b9c66040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156200285657600080fd5b505af11580156200286b573d6000803e3d6000fd5b5050505050505050565b60008060405180610160016040528061012681526020016200346e61012691398585604051602001620028ab9392919062003338565b60408051601f1981840301815291905290506000620028cd6043602062003061565b30838201529050620028e2608c602062003061565b905030818301525060008382604051620028fc9062002a51565b62002908919062002d66565b6040518091039082f090508015801562002926573d6000803e3d6000fd5b509695505050505050565b805160208083015160e083901b911c1790601c81111562002612576000603c8401815b6020600162002965601c8762002a8b565b6200297290602062003061565b6200297e919062002a8b565b6200298a919062003315565b8110156200260e5781519250620029a382602062003061565b6000828152602089905260409020849055915080620029c281620032bd565b91505062002954565b600080620029d98360e01c90565b9360209390931b92915050565b60006060620029f58360e01c90565b9150602083901b9250816001600160401b0381111562002a195762002a1962002b90565b6040519080825280601f01601f19166020018201604052801562002a44576020820181803683370190505b5060208101939093525091565b61010b806200336383390190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b8181038181111562000e725762000e7262002a75565b6000808585111562002ab257600080fd5b8386111562002ac057600080fd5b5050820193919092039150565b600181811c9082168062002ae257607f821691505b60208210810362001fc657634e487b7160e01b600052602260045260246000fd5b828482376000838201600081526000845462002b1f8162002acd565b6001828116801562002b3a576001811462002b505762002b81565b60ff198416865282151583028601945062002b81565b8860005260208060002060005b8581101562002b785781548982015290840190820162002b5d565b50505082860194505b50929998505050505050505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b038111828210171562002bd15762002bd162002b90565b604052919050565b60006001600160401b0382111562002bf55762002bf562002b90565b50601f01601f191660200190565b600082601f83011262002c1557600080fd5b813562002c2c62002c268262002bd9565b62002ba6565b81815284602083860101111562002c4257600080fd5b816020850160208301376000918101602001919091529392505050565b60008083601f84011262002c7257600080fd5b5081356001600160401b0381111562002c8a57600080fd5b60208301915083602082850101111562000abe57600080fd5b60008060006040848603121562002cb957600080fd5b83356001600160401b038082111562002cd157600080fd5b62002cdf8783880162002c03565b9450602086013591508082111562002cf657600080fd5b5062002d058682870162002c5f565b9497909650939450505050565b60005b8381101562002d2f57818101518382015260200162002d15565b50506000910152565b6000815180845262002d5281602086016020860162002d12565b601f01601f19169290920160200192915050565b60208152600062001016602083018462002d38565b60006020828403121562002d8e57600080fd5b813563ffffffff811681146200101657600080fd5b6000806040838503121562002db757600080fd5b82356001600160401b0381111562002dce57600080fd5b62002ddc8582860162002c03565b95602094909401359450505050565b60408152600062002e00604083018562002d38565b905082151560208301529392505050565b60006020828403121562002e2457600080fd5b81356001600160401b0381111562002e3b57600080fd5b62002e498482850162002c03565b949350505050565b600082601f83011262002e6357600080fd5b813560206001600160401b0382111562002e815762002e8162002b90565b8160051b62002e9282820162002ba6565b928352848101820192828101908785111562002ead57600080fd5b83870192505b8483101562002ece5782358252918301919083019062002eb3565b979650505050505050565b60008060006060848603121562002eef57600080fd5b83356001600160401b038082111562002f0757600080fd5b62002f158783880162002c03565b9450602086013591508082111562002f2c57600080fd5b62002f3a8783880162002e51565b9350604086013591508082111562002f5157600080fd5b5062002f608682870162002e51565b9150509250925092565b6000806000806060858703121562002f8157600080fd5b84356001600160401b038082111562002f9957600080fd5b62002fa78883890162002c03565b955060208701359450604087013591508082111562002fc557600080fd5b5062002fd48782880162002c5f565b95989497509550505050565b634e487b7160e01b600052602160045260246000fd5b60208101600383106200300d576200300d62002fe0565b91905290565b600080604083850312156200302757600080fd5b50508035926020909101359150565b6000602082840312156200304957600080fd5b81356001600160a01b03811681146200101657600080fd5b8082018082111562000e725762000e7262002a75565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b601f8211156200092757600081815260208120601f850160051c81016020861015620030d55750805b601f850160051c820191505b8181101562001e7b57828155600101620030e1565b81516001600160401b0381111562003112576200311262002b90565b6200312a8162003123845462002acd565b84620030ac565b602080601f831160018114620031625760008415620031495750858301515b600019600386901b1c1916600185901b17855562001e7b565b600085815260208120601f198616915b82811015620031935788860151825594840194600190910190840162003172565b5085821015620031b25787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b600060208284031215620031d557600080fd5b5051919050565b600060208284031215620031ef57600080fd5b815167ffffffffffffffff19811681146200101657600080fd5b848152608081016002851062003223576200322362002fe0565b84602083015283604083015282606083015295945050505050565b6000602082840312156200325157600080fd5b81516001600160401b038111156200326857600080fd5b8201601f810184136200327a57600080fd5b80516200328b62002c268262002bd9565b818152856020838501011115620032a157600080fd5b620032b482602083016020860162002d12565b95945050505050565b600060018201620032d257620032d262002a75565b5060010190565b808202811582820484141762000e725762000e7262002a75565b600060ff821660ff81036200330c576200330c62002a75565b60010192915050565b6000826200333357634e487b7160e01b600052601260045260246000fd5b500490565b600084516200334c81846020890162002d12565b820183858237600093019283525090939250505056fe608060405260405161010b38038061010b83398101604081905261002291610041565b80518060208301f35b634e487b7160e01b600052604160045260246000fd5b6000602080838503121561005457600080fd5b82516001600160401b038082111561006b57600080fd5b818501915085601f83011261007f57600080fd5b8151818111156100915761009161002b565b604051601f8201601f19908116603f011681019083821181831017156100b9576100b961002b565b8160405282815288868487010111156100d157600080fd5b600093505b828410156100f357848401860151818501870152928501926100d6565b60008684830101528096505050505050509291505056fe6080604052348015600f57600080fd5b506004361060325760003560e01c80632b68b9c61460375780638da5cb5b14603f575b600080fd5b603d6081565b005b60657f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200160405180910390f35b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161460ed5760405162461bcd60e51b815260206004820152600e60248201526d3737ba10333937b69037bbb732b960911b604482015260640160405180910390fd5b33fffea2646970667358221220fc66c9afb7cb2f6209ae28167cf26c6c06f86a82cbe3c56de99027979389a1be64736f6c63430008070033a264697066735822122074ecdb7c1356cd26b7ae20a002751e685b2c97645c0ec1b1214c316ec9516dce64736f6c634300081200330000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001f000000000000000000000000000804c520d3c084c805e37a35e90057ac32831f96f

Deployed Bytecode

0x608060405260043610620001ee5760003560e01c8063590e1ae3116200010f578063caf1283611620000a3578063dd473fae116200006d578063dd473fae1462000776578063f14c7ad71462000794578063f2fde38b14620007ac578063f916c5b014620007d157620001ee565b8063caf1283614620006b5578063cf86bf9314620006f0578063d84eb56c146200072c578063dc38b0a2146200075157620001ee565b80638bf4515c11620000e55780638bf4515c14620006005780638da5cb5b146200062557806393b7628f1462000645578063956a3433146200069057620001ee565b8063590e1ae314620005ab5780635ba1d9e514620005c3578063715018a614620005e857620001ee565b80631ccbc6da116200018757806342216bed116200015d57806342216bed1462000504578063492c7b2a14620005295780634eed7cf1146200054057806358edef4c146200058657620001ee565b80631ccbc6da14620004ae5780631fbfa12714620004d55780632b68b9c614620004ec57620001ee565b806311ce026711620001c957806311ce026714620003de5780631a7237e014620004195780631c5ee10c146200044e5780631c993ad5146200048957620001ee565b8063038cd79f14620003705780630936286114620003895780631089f40f14620003b9575b348015620001fb57600080fd5b506000366060808284036200022157505060408051602081019091526000815262000365565b8383600081811062000237576200023762002a5f565b9050013560f81c60f81b6001600160f81b031916602f60f81b146200028357505060408051808201909152600e81526d0d2dcc6dee4e4cac6e840e0c2e8d60931b602082015262000365565b83836200029260018262002a8b565b818110620002a457620002a462002a5f565b909101356001600160f81b031916602f60f81b0390506200030657620002fd620002d2846001818862002aa1565b6006604051602001620002e89392919062002b03565b604051602081830303815290604052620007f6565b50905062000358565b6200035462000319846001818862002aa1565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250620007f692505050565b5090505b6200036381620008a1565b505b915050805190602001f35b620003876200038136600462002ca3565b620008e2565b005b3480156200039657600080fd5b50620003a16200092c565b604051620003b0919062002d66565b60405180910390f35b348015620003c657600080fd5b5062000387620003d836600462002d7b565b620009c2565b348015620003eb57600080fd5b5060035462000400906001600160a01b031681565b6040516001600160a01b039091168152602001620003b0565b3480156200042657600080fd5b506200043e6200043836600462002da3565b62000a15565b604051620003b092919062002deb565b3480156200045b57600080fd5b50620004736200046d36600462002e11565b62000ac5565b60408051928352602083019190915201620003b0565b3480156200049657600080fd5b5062000387620004a836600462002e11565b62000b58565b348015620004bb57600080fd5b50620004c662000b97565b604051908152602001620003b0565b62000387620004e636600462002ed9565b62000c0d565b348015620004f957600080fd5b506200038762000d92565b3480156200051157600080fd5b50620004c66200052336600462002da3565b62000dcd565b620003876200053a36600462002f6a565b62000e78565b3480156200054d57600080fd5b507f000000000000000000000000000000000000000000000000000000000000000060ff1615155b6040519015158152602001620003b0565b3480156200059357600080fd5b50620004c6620005a536600462002e11565b62000f8f565b348015620005b857600080fd5b506200038762001057565b348015620005d057600080fd5b5062000575620005e236600462002da3565b620010c1565b348015620005f557600080fd5b506200038762001181565b3480156200060d57600080fd5b506200043e6200061f36600462002e11565b620007f6565b3480156200063257600080fd5b506002546001600160a01b031662000400565b3480156200065257600080fd5b50620006816200066436600462002e11565b805160209182012060009081526005909152604090205460ff1690565b604051620003b0919062002ff6565b3480156200069d57600080fd5b50620004c6620006af36600462003013565b620011bc565b348015620006c257600080fd5b50620006da620006d436600462002da3565b62001276565b60408051928352901515602083015201620003b0565b348015620006fd57600080fd5b506002546200071690600160a01b900463ffffffff1681565b60405163ffffffff9091168152602001620003b0565b3480156200073957600080fd5b50620004c66200074b36600462002da3565b6200130c565b3480156200075e57600080fd5b50620003876200077036600462003036565b620013c2565b3480156200078357600080fd5b50651b585b9d585b60d21b620004c6565b348015620007a157600080fd5b506200057562001411565b348015620007b957600080fd5b5062000387620007cb36600462003036565b6200143d565b348015620007de57600080fd5b50620004c6620007f036600462002e11565b620014dc565b60606000806200081d84805160209182012060009081526005909152604090205460ff1690565b9050600281600281111562000836576200083662002fe0565b0362000858576200084e848051906020012062001561565b9250925050915091565b60018160028111156200086f576200086f62002fe0565b0362000887576200084e848051906020012062001761565b505060408051600080825260208201909252939092509050565b600081516040620008b3919062003061565b9050601f19620008c582602062003061565b620008d290601f62003061565b1690506020808303528060208303f35b6002546001600160a01b03163314620009185760405162461bcd60e51b81526004016200090f9062003077565b60405180910390fd5b62000927836000848462000e78565b505050565b600680546200093b9062002acd565b80601f0160208091040260200160405190810160405280929190818152602001828054620009699062002acd565b8015620009ba5780601f106200098e57610100808354040283529160200191620009ba565b820191906000526020600020905b8154815290600101906020018083116200099c57829003601f168201915b505050505081565b6002546001600160a01b03163314620009ef5760405162461bcd60e51b81526004016200090f9062003077565b6002805463ffffffff909216600160a01b0263ffffffff60a01b19909216919091179055565b606060008062000a3c85805160209182012060009081526005909152604090205460ff1690565b9050600281600281111562000a555762000a5562002fe0565b0362000a795762000a6e8580519060200120856200188e565b925092505062000abe565b600181600281111562000a905762000a9062002fe0565b0362000aa95762000a6e8580519060200120856200196b565b50506040805160008082526020820190925291505b9250929050565b600080600062000aec84805160209182012060009081526005909152604090205460ff1690565b9050600281600281111562000b055762000b0562002fe0565b0362000b1d576200084e8480519060200120620019e4565b600181600281111562000b345762000b3462002fe0565b0362000b4c576200084e848051906020012062001abb565b50600093849350915050565b6002546001600160a01b0316331462000b855760405162461bcd60e51b81526004016200090f9062003077565b600662000b938282620030f6565b5050565b60035460408051630e65e36d60e11b815290516000926001600160a01b031691631ccbc6da9160048083019260209291908290030181865afa15801562000be2573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000c089190620031c2565b905090565b6002546001600160a01b0316331462000c3a5760405162461bcd60e51b81526004016200090f9062003077565b62000c4462001411565b62000cab5760405162461bcd60e51b815260206004820152603060248201527f5468652063757272656e74206e6574776f726b20646f6573206e6f742073757060448201526f1c1bdc9d08189b1bd8881d5c1b1bd85960821b60648201526084016200090f565b600062000ccf84805160209182012060009081526005909152604090205460ff1690565b9050600081600281111562000ce85762000ce862002fe0565b148062000d095750600281600281111562000d075762000d0762002fe0565b145b62000d4e5760405162461bcd60e51b8152602060048201526014602482015273496e76616c69642073746f72616765206d6f646560601b60448201526064016200090f565b600081600281111562000d655762000d6562002fe0565b0362000d785762000d7884600262001b12565b62000d8c8480519060200120848462001b54565b50505050565b6002546001600160a01b0316331462000dbf5760405162461bcd60e51b81526004016200090f9062003077565b6002546001600160a01b0316ff5b60008062000df284805160209182012060009081526005909152604090205460ff1690565b9050600281600281111562000e0b5762000e0b62002fe0565b0362000e2d5762000e24848051906020012084620011bc565b91505062000e72565b600181600281111562000e445762000e4462002fe0565b0362000e6c57600062000e58858562000a15565b508051602090910120925062000e72915050565b50600090505b92915050565b6002546001600160a01b0316331462000ea55760405162461bcd60e51b81526004016200090f9062003077565b600062000ec985805160209182012060009081526005909152604090205460ff1690565b9050600081600281111562000ee25762000ee262002fe0565b148062000f035750600181600281111562000f015762000f0162002fe0565b145b62000f485760405162461bcd60e51b8152602060048201526014602482015273496e76616c69642073746f72616765206d6f646560601b60448201526064016200090f565b600081600281111562000f5f5762000f5f62002fe0565b0362000f725762000f7285600162001b12565b62000f8885805190602001208585853462001e83565b5050505050565b6002546000906001600160a01b0316331462000fbf5760405162461bcd60e51b81526004016200090f9062003077565b600062000fe383805160209182012060009081526005909152604090205460ff1690565b9050600281600281111562000ffc5762000ffc62002fe0565b036200101d57620010168380519060200120600062001f6c565b9392505050565b600181600281111562001034576200103462002fe0565b036200104e57620010168380519060200120600062001fcc565b50600092915050565b6002546001600160a01b03163314620010845760405162461bcd60e51b81526004016200090f9062003077565b6002546040516001600160a01b03909116904780156108fc02916000818181858888f19350505050158015620010be573d6000803e3d6000fd5b50565b6002546000906001600160a01b03163314620010f15760405162461bcd60e51b81526004016200090f9062003077565b60006200111584805160209182012060009081526005909152604090205460ff1690565b905060028160028111156200112e576200112e62002fe0565b03620011475762000e248480519060200120846200208e565b60018160028111156200115e576200115e62002fe0565b03620011775762000e2484805190602001208462002116565b5060009392505050565b6002546001600160a01b03163314620011ae5760405162461bcd60e51b81526004016200090f9062003077565b620011ba600062002206565b565b6000620011c98362002258565b8210620011d95750600062000e72565b60035460008481526004602081815260408084208785529091529182902054915163d8389dc560e01b8152908101919091526001600160a01b039091169063d8389dc590602401602060405180830381865afa1580156200123e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620012649190620031dc565b67ffffffffffffffff19169392505050565b60008060006200129d85805160209182012060009081526005909152604090205460ff1690565b90506002816002811115620012b657620012b662002fe0565b03620012cf5762000a6e85805190602001208562002299565b6001816002811115620012e657620012e662002fe0565b03620012ff5762000a6e8580519060200120856200234d565b5060009485945092505050565b6002546000906001600160a01b031633146200133c5760405162461bcd60e51b81526004016200090f9062003077565b60006200136084805160209182012060009081526005909152604090205460ff1690565b9050600281600281111562001379576200137962002fe0565b03620013925762000e2484805190602001208462001f6c565b6001816002811115620013a957620013a962002fe0565b03620011775762000e2484805190602001208462001fcc565b6002546001600160a01b03163314620013ef5760405162461bcd60e51b81526004016200090f9062003077565b600380546001600160a01b0319166001600160a01b0392909216919091179055565b6003546000906001600160a01b03161580159062000c08575060006200143662000b97565b1015905090565b6002546001600160a01b031633146200146a5760405162461bcd60e51b81526004016200090f9062003077565b6001600160a01b038116620014d15760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016200090f565b620010be8162002206565b6000806200150183805160209182012060009081526005909152604090205460ff1690565b905060028160028111156200151a576200151a62002fe0565b03620015325762001016838051906020012062002258565b600181600281111562001549576200154962002fe0565b036200104e57620010168380519060200120620023a5565b606060008060006200157385620019e4565b9150915080600003620015bb5760005b6040519080825280601f01601f191660200182016040528015620015ae576020820181803683370190505b5095600095509350505050565b6000826001600160401b03811115620015d857620015d862002b90565b6040519080825280601f01601f19166020018201604052801562001603576020820181803683370190505b5090506000805b838110156200175257600088815260046020818152604080842085855290915280832054600354915163afd5644d60e01b815292830181905292916001600160a01b039091169063afd5644d90602401602060405180830381865afa15801562001678573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200169e9190620031c2565b60035460405163bea94b8b60e01b81529192506001600160a01b03169063bea94b8b90620016d9908590600190600090879060040162003209565b600060405180830381865afa158015620016f7573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526200172191908101906200323e565b508060406020868801013e62001738818562003061565b9350505080806200174990620032bd565b9150506200160a565b50909660019650945050505050565b60606000806000620017738562001abb565b91509150806000036200178857600062001583565b6000826001600160401b03811115620017a557620017a562002b90565b6040519080825280601f01601f191660200182016040528015620017d0576020820181803683370190505b5090506020810160005b838110156200175257600088815260208181526040808320848452909152812054906200180782620023e4565b156200184957620018188260e01c90565b60008b8152600160209081526040808320878452909152902090915062001841908386620023f9565b505062001868565b816200185581620024ad565b50915062001864818662002513565b5050505b62001874818562003061565b9350505080806200188590620032bd565b915050620017da565b60606000806200189f858562002299565b5090506001811015620018c657505060408051600080825260208201909252915062000abe565b600354600086815260046020818152604080842089855290915280832054905163bea94b8b60e01b815292936001600160a01b03169263bea94b8b92620019169291600191879189910162003209565b600060405180830381865afa15801562001934573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526200195e91908101906200323e565b9660019650945050505050565b600082815260208181526040808320848452909152812054606091906200199281620023e4565b15620019cc5760008581526001602090815260408083208784529091528120620019bd908362002572565b93506001925062000abe915050565b80620019d88162002619565b93509350505062000abe565b6000806000620019f48462002258565b90506000805b8281101562001ab15760035460008781526004602081815260408084208685529091529182902054915163afd5644d60e01b8152908101919091526001600160a01b039091169063afd5644d90602401602060405180830381865afa15801562001a68573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001a8e9190620031c2565b62001a9a908362003061565b91508062001aa881620032bd565b915050620019fa565b5094909350915050565b6000806000805b60008062001ad187846200234d565b915091508062001ae357505062001b08565b62001aef828562003061565b93508262001afd81620032bd565b935050505062001ac2565b9094909350915050565b81516020808401919091206000908152600590915260409020805482919060ff1916600183600281111562001b4b5762001b4b62002fe0565b02179055505050565b815160035460408051630e65e36d60e11b815290516000926001600160a01b031691631ccbc6da9160048083019260209291908290030181865afa15801562001ba1573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001bc79190620031c2565b905062001bd58282620032d9565b34101562001c1d5760405162461bcd60e51b8152602060048201526014602482015273696e73756666696369656e742062616c616e636560601b60448201526064016200090f565b60005b828160ff16101562001e7b57838160ff168151811062001c445762001c4462002a5f565b6020026020010151600010801562001c935750600260149054906101000a900463ffffffff1663ffffffff16848260ff168151811062001c885762001c8862002a5f565b602002602001015111155b62001cd85760405162461bcd60e51b81526020600482015260146024820152730d2dcecc2d8d2c840c6d0eadcd640d8cadccee8d60631b60448201526064016200090f565b62001d0386868360ff168151811062001cf55762001cf562002a5f565b6020026020010151620026bf565b60003387878460ff168151811062001d1f5762001d1f62002a5f565b602002602001015160405160200162001d56939291906001600160a01b039390931683526020830191909152604082015260600190565b604051602081830303815290604052805190602001209050600360009054906101000a90046001600160a01b03166001600160a01b0316634581a920848385898760ff168151811062001dad5762001dad62002a5f565b60200260200101516040518563ffffffff1660e01b815260040162001de89392919092835260ff919091166020830152604082015260600190565b6000604051808303818588803b15801562001e0257600080fd5b505af115801562001e17573d6000803e3d6000fd5b505050505080600460008981526020019081526020016000206000888560ff168151811062001e4a5762001e4a62002a5f565b602002602001015181526020019081526020016000208190555050808062001e7290620032f3565b91505062001c20565b505050505050565b62001e8f85856200275d565b60ff7f00000000000000000000000000000000000000000000000000000000000000001682111562001ef65762001ed862001ecc84848462002875565b6001600160a01b031690565b60008681526020818152604080832088845290915290205562000f88565b60008581526001602090815260408083208784528252918290208251601f860183900483028101830190935284835262001f4d92909186908690819084018382808284376000920191909152506200293192505050565b6000868152602081815260408083208884529091529020555050505050565b60005b60008381526004602090815260408083208584529091529020548062001f96575062001fc6565b60008481526004602090815260408083208684529091528120558262001fbc81620032bd565b9350505062001f6f565b50919050565b60005b6000838152602081815260408083208584529091529020548062001ff4575062001fc6565b62001fff81620023e4565b62002060576000819050806001600160a01b0316632b68b9c66040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156200204557600080fd5b505af11580156200205a573d6000803e3d6000fd5b50505050505b600084815260208181526040808320868452909152812055826200208481620032bd565b9350505062001fcf565b600082815260046020908152604080832084845290915281205480620020b957600091505062000e72565b600084815260046020526040812081620020d586600162003061565b81526020019081526020016000205414620020f557600091505062000e72565b50506000918252600460209081526040808420928452919052812055600190565b600082815260208181526040808320848452909152812054806200213f57600091505062000e72565b6000848152602081905260408120816200215b86600162003061565b815260200190815260200160002054146200217b57600091505062000e72565b6200218681620023e4565b620021e7576000819050806001600160a01b0316632b68b9c66040518163ffffffff1660e01b8152600401600060405180830381600087803b158015620021cc57600080fd5b505af1158015620021e1573d6000803e3d6000fd5b50505050505b5050600091825260208281526040808420928452919052812055600190565b600280546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6000805b60008381526004602090815260408083208484529091529020548062002283575062000e72565b816200228f81620032bd565b925050506200225c565b600080620022a78462002258565b8310620022ba5750600090508062000abe565b600354600085815260046020818152604080842088855290915280832054905163afd5644d60e01b81529182015290916001600160a01b03169063afd5644d90602401602060405180830381865afa1580156200231b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620023419190620031c2565b95600195509350505050565b6000828152602081815260408083208484529091528120548190806200237b57600080925092505062000abe565b6200238681620023e4565b1562002399576000620019bd8260e01c90565b80620019d881620024ad565b6000805b60008381526020818152604080832084845290915290205480620023ce575062000e72565b81620023da81620032bd565b92505050620023a9565b600080620023f28360e01c90565b1192915050565b60008060006200240985620029cb565b808652909350905083601c8411156200249f57601c81016000805b6020600162002435601c8a62002a8b565b6200244290602062003061565b6200244e919062002a8b565b6200245a919062003315565b8110156200249b57600081815260208b815260409091205480855292506200248490849062003061565b9250806200249281620032bd565b91505062002424565b5050505b600192505050935093915050565b6000806001600160a01b038316620024ca57506000928392509050565b60008060405180610160016040528061012681526020016200346e6101269139519050843b91508082101562002507575060009485945092505050565b62002341818362002a8b565b6000806000806200252486620024ad565b91509150806200253d5760008093509350505062000abe565b600060405180610160016040528061012681526020016200346e6101269139519050828187893c509095600195509350505050565b606060006200258183620029e6565b92509050601c8111156200261257603c82016000805b60206001620025a8601c8762002a8b565b620025b590602062003061565b620025c1919062002a8b565b620025cd919062003315565b8110156200260e57600081815260208881526040909120548085529250620025f790849062003061565b9250806200260581620032bd565b91505062002597565b5050505b5092915050565b606060008060006200262b85620024ad565b91509150806200263d57600062001583565b6000826001600160401b038111156200265a576200265a62002b90565b6040519080825280601f01601f19166020018201604052801562002685576020820181803683370190505b509050600060405180610160016040528061012681526020016200346e6101269139519050838160208401893c5095600195509350505050565b60008281526004602090815260408083208484529091529020548062000927578115806200271657506000838152600460205260408120816200270460018662002a8b565b81526020019081526020016000205414155b620009275760405162461bcd60e51b81526020600482015260166024820152751b5d5cdd081c995c1b1858d9481bdc88185c1c195b9960521b60448201526064016200090f565b60008281526020818152604080832084845290915290205480620027f957811580620027b25750600083815260208190526040812081620027a060018662002a8b565b81526020019081526020016000205414155b620027f95760405162461bcd60e51b81526020600482015260166024820152751b5d5cdd081c995c1b1858d9481bdc88185c1c195b9960521b60448201526064016200090f565b6200280481620023e4565b6200092757806001600160a01b0381161562000d8c57806001600160a01b0316632b68b9c66040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156200285657600080fd5b505af11580156200286b573d6000803e3d6000fd5b5050505050505050565b60008060405180610160016040528061012681526020016200346e61012691398585604051602001620028ab9392919062003338565b60408051601f1981840301815291905290506000620028cd6043602062003061565b30838201529050620028e2608c602062003061565b905030818301525060008382604051620028fc9062002a51565b62002908919062002d66565b6040518091039082f090508015801562002926573d6000803e3d6000fd5b509695505050505050565b805160208083015160e083901b911c1790601c81111562002612576000603c8401815b6020600162002965601c8762002a8b565b6200297290602062003061565b6200297e919062002a8b565b6200298a919062003315565b8110156200260e5781519250620029a382602062003061565b6000828152602089905260409020849055915080620029c281620032bd565b91505062002954565b600080620029d98360e01c90565b9360209390931b92915050565b60006060620029f58360e01c90565b9150602083901b9250816001600160401b0381111562002a195762002a1962002b90565b6040519080825280601f01601f19166020018201604052801562002a44576020820181803683370190505b5060208101939093525091565b61010b806200336383390190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b8181038181111562000e725762000e7262002a75565b6000808585111562002ab257600080fd5b8386111562002ac057600080fd5b5050820193919092039150565b600181811c9082168062002ae257607f821691505b60208210810362001fc657634e487b7160e01b600052602260045260246000fd5b828482376000838201600081526000845462002b1f8162002acd565b6001828116801562002b3a576001811462002b505762002b81565b60ff198416865282151583028601945062002b81565b8860005260208060002060005b8581101562002b785781548982015290840190820162002b5d565b50505082860194505b50929998505050505050505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b038111828210171562002bd15762002bd162002b90565b604052919050565b60006001600160401b0382111562002bf55762002bf562002b90565b50601f01601f191660200190565b600082601f83011262002c1557600080fd5b813562002c2c62002c268262002bd9565b62002ba6565b81815284602083860101111562002c4257600080fd5b816020850160208301376000918101602001919091529392505050565b60008083601f84011262002c7257600080fd5b5081356001600160401b0381111562002c8a57600080fd5b60208301915083602082850101111562000abe57600080fd5b60008060006040848603121562002cb957600080fd5b83356001600160401b038082111562002cd157600080fd5b62002cdf8783880162002c03565b9450602086013591508082111562002cf657600080fd5b5062002d058682870162002c5f565b9497909650939450505050565b60005b8381101562002d2f57818101518382015260200162002d15565b50506000910152565b6000815180845262002d5281602086016020860162002d12565b601f01601f19169290920160200192915050565b60208152600062001016602083018462002d38565b60006020828403121562002d8e57600080fd5b813563ffffffff811681146200101657600080fd5b6000806040838503121562002db757600080fd5b82356001600160401b0381111562002dce57600080fd5b62002ddc8582860162002c03565b95602094909401359450505050565b60408152600062002e00604083018562002d38565b905082151560208301529392505050565b60006020828403121562002e2457600080fd5b81356001600160401b0381111562002e3b57600080fd5b62002e498482850162002c03565b949350505050565b600082601f83011262002e6357600080fd5b813560206001600160401b0382111562002e815762002e8162002b90565b8160051b62002e9282820162002ba6565b928352848101820192828101908785111562002ead57600080fd5b83870192505b8483101562002ece5782358252918301919083019062002eb3565b979650505050505050565b60008060006060848603121562002eef57600080fd5b83356001600160401b038082111562002f0757600080fd5b62002f158783880162002c03565b9450602086013591508082111562002f2c57600080fd5b62002f3a8783880162002e51565b9350604086013591508082111562002f5157600080fd5b5062002f608682870162002e51565b9150509250925092565b6000806000806060858703121562002f8157600080fd5b84356001600160401b038082111562002f9957600080fd5b62002fa78883890162002c03565b955060208701359450604087013591508082111562002fc557600080fd5b5062002fd48782880162002c5f565b95989497509550505050565b634e487b7160e01b600052602160045260246000fd5b60208101600383106200300d576200300d62002fe0565b91905290565b600080604083850312156200302757600080fd5b50508035926020909101359150565b6000602082840312156200304957600080fd5b81356001600160a01b03811681146200101657600080fd5b8082018082111562000e725762000e7262002a75565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b601f8211156200092757600081815260208120601f850160051c81016020861015620030d55750805b601f850160051c820191505b8181101562001e7b57828155600101620030e1565b81516001600160401b0381111562003112576200311262002b90565b6200312a8162003123845462002acd565b84620030ac565b602080601f831160018114620031625760008415620031495750858301515b600019600386901b1c1916600185901b17855562001e7b565b600085815260208120601f198616915b82811015620031935788860151825594840194600190910190840162003172565b5085821015620031b25787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b600060208284031215620031d557600080fd5b5051919050565b600060208284031215620031ef57600080fd5b815167ffffffffffffffff19811681146200101657600080fd5b848152608081016002851062003223576200322362002fe0565b84602083015283604083015282606083015295945050505050565b6000602082840312156200325157600080fd5b81516001600160401b038111156200326857600080fd5b8201601f810184136200327a57600080fd5b80516200328b62002c268262002bd9565b818152856020838501011115620032a157600080fd5b620032b482602083016020860162002d12565b95945050505050565b600060018201620032d257620032d262002a75565b5060010190565b808202811582820484141762000e725762000e7262002a75565b600060ff821660ff81036200330c576200330c62002a75565b60010192915050565b6000826200333357634e487b7160e01b600052601260045260246000fd5b500490565b600084516200334c81846020890162002d12565b820183858237600093019283525090939250505056fe608060405260405161010b38038061010b83398101604081905261002291610041565b80518060208301f35b634e487b7160e01b600052604160045260246000fd5b6000602080838503121561005457600080fd5b82516001600160401b038082111561006b57600080fd5b818501915085601f83011261007f57600080fd5b8151818111156100915761009161002b565b604051601f8201601f19908116603f011681019083821181831017156100b9576100b961002b565b8160405282815288868487010111156100d157600080fd5b600093505b828410156100f357848401860151818501870152928501926100d6565b60008684830101528096505050505050509291505056fe6080604052348015600f57600080fd5b506004361060325760003560e01c80632b68b9c61460375780638da5cb5b14603f575b600080fd5b603d6081565b005b60657f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200160405180910390f35b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161460ed5760405162461bcd60e51b815260206004820152600e60248201526d3737ba10333937b69037bbb732b960911b604482015260640160405180910390fd5b33fffea2646970667358221220fc66c9afb7cb2f6209ae28167cf26c6c06f86a82cbe3c56de99027979389a1be64736f6c63430008070033a264697066735822122074ecdb7c1356cd26b7ae20a002751e685b2c97645c0ec1b1214c316ec9516dce64736f6c63430008120033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001f000000000000000000000000000804c520d3c084c805e37a35e90057ac32831f96f

-----Decoded View---------------
Arg [0] : slotLimit (uint8): 0
Arg [1] : maxChunkSize (uint32): 126976
Arg [2] : storageAddress (address): 0x804C520d3c084C805E37A35E90057Ac32831F96f

-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [1] : 000000000000000000000000000000000000000000000000000000000001f000
Arg [2] : 000000000000000000000000804c520d3c084c805e37a35e90057ac32831f96f


Deployed Bytecode Sourcemap

44505:1104:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;44505:1104:0;;44874:12;;44935:20;;;44931:283;;-1:-1:-1;;45018:9:0;;;;;;;;;-1:-1:-1;45018:9:0;;45011:16;;44931:283;45049:8;;45058:1;45049:11;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;;;;;45049:19:0;;45064:4;45049:19;;;45045:169;;-1:-1:-1;;45179:23:0;;;;;;;;;;;;-1:-1:-1;;;45179:23:0;;;;45172:30;;45045:169;45230:8;;45239:19;45257:1;45230:8;45239:19;:::i;:::-;45230:29;;;;;;;:::i;:::-;;;;;-1:-1:-1;;;;;;45230:29:0;-1:-1:-1;;;45230:37:0;;-1:-1:-1;45226:194:0;;45298:45;45316:12;:8;45325:1;45316:8;;:12;:::i;:::-;45330:11;45303:39;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;45298:4;:45::i;:::-;-1:-1:-1;45284:59:0;-1:-1:-1;45226:194:0;;;45390:18;45395:12;:8;45404:1;45395:8;;:12;:::i;:::-;45390:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;45390:4:0;;-1:-1:-1;;;45390:18:0:i;:::-;-1:-1:-1;45376:32:0;-1:-1:-1;45226:194:0;45432:41;45465:7;45432:32;:41::i;:::-;44889:592;44822:659;;;;44505:1104;;;;;;39095:190;;;;;;:::i;:::-;;:::i;:::-;;44546:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4517:93;;;;;;;;;;-1:-1:-1;4517:93:0;;;;;:::i;:::-;;:::i;4083:42::-;;;;;;;;;;-1:-1:-1;4083:42:0;;;;-1:-1:-1;;;;;4083:42:0;;;;;;-1:-1:-1;;;;;5538:32:1;;;5520:51;;5508:2;5493:18;4083:42:0;5347:230:1;41981:435:0;;;;;;;;;;-1:-1:-1;41981:435:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;39686:370::-;;;;;;;;;;-1:-1:-1;39686:370:0;;;;;:::i;:::-;;:::i;:::-;;;;6777:25:1;;;6833:2;6818:18;;6811:34;;;;6750:18;39686:370:0;6603:248:1;45489:117:0;;;;;;;;;;-1:-1:-1;45489:117:0;;;;;:::i;:::-;;:::i;4767:114::-;;;;;;;;;;;;;:::i;:::-;;;7002:25:1;;;6990:2;6975:18;4767:114:0;6856:177:1;41392:581:0;;;;;;:::i;:::-;;:::i;43810:95::-;;;;;;;;;;;;;:::i;43913:455::-;;;;;;;;;;-1:-1:-1;43913:455:0;;;;;:::i;:::-;;:::i;40872:512::-;;;;;;:::i;:::-;;:::i;32484:89::-;;;;;;;;;;-1:-1:-1;32551:10:0;:14;;;;32484:89;;;9601:14:1;;9594:22;9576:41;;9564:2;9549:18;32484:89:0;9436:187:1;40064:373:0;;;;;;;;;;-1:-1:-1;40064:373:0;;;;;:::i;:::-;;:::i;43691:111::-;;;;;;;;;;;;;:::i;42853:418::-;;;;;;;;;;-1:-1:-1;42853:418:0;;;;;:::i;:::-;;:::i;2698:94::-;;;;;;;;;;;;;:::i;39293:385::-;;;;;;;;;;-1:-1:-1;39293:385:0;;;;;:::i;:::-;;:::i;2047:87::-;;;;;;;;;;-1:-1:-1;2120:6:0;;-1:-1:-1;;;;;2120:6:0;2047:87;;38791:132;;;;;;;;;;-1:-1:-1;38791:132:0;;;;;:::i;:::-;38899:15;;;;;;;38855:11;38886:29;;;:12;:29;;;;;;;;;;38791:132;;;;;;;;:::i;9423:260::-;;;;;;;;;;-1:-1:-1;9423:260:0;;;;;:::i;:::-;;:::i;42424:421::-;;;;;;;;;;-1:-1:-1;42424:421:0;;;;;:::i;:::-;;:::i;:::-;;;;10641:25:1;;;10709:14;;10702:22;10697:2;10682:18;;10675:50;10614:18;42424:421:0;10473:258:1;4050:26:0;;;;;;;;;;-1:-1:-1;4050:26:0;;;;-1:-1:-1;;;4050:26:0;;;;;;;;;10910:10:1;10898:23;;;10880:42;;10868:2;10853:18;4050:26:0;10736:192:1;43279:404:0;;;;;;;;;;-1:-1:-1;43279:404:0;;;;;:::i;:::-;;:::i;4368:141::-;;;;;;;;;;-1:-1:-1;4368:141:0;;;;;:::i;:::-;;:::i;44717:97::-;;;;;;;;;;-1:-1:-1;;;;44717:97:0;;4618:141;;;;;;;;;;;;;:::i;2947:192::-;;;;;;;;;;-1:-1:-1;2947:192:0;;;;;:::i;:::-;;:::i;40445:377::-;;;;;;;;;;-1:-1:-1;40445:377:0;;;;;:::i;:::-;;:::i;39293:385::-;39364:12;39378:4;39395:16;39414:20;39429:4;38899:15;;;;;;;38855:11;38886:29;;;:12;:29;;;;;;;;;;38791:132;39414:20;39395:39;-1:-1:-1;39457:16:0;39449:4;:24;;;;;;;;:::i;:::-;;39445:187;;39497:29;39520:4;39510:15;;;;;;39497:12;:29::i;:::-;39490:36;;;;;39293:385;;;:::o;39445:187::-;39556:19;39548:4;:27;;;;;;;;:::i;:::-;;39544:88;;39599:21;39614:4;39604:15;;;;;;39599:4;:21::i;39544:88::-;-1:-1:-1;;39650:12:0;;;39660:1;39650:12;;;;;;;;;;39660:1;;-1:-1:-1;39642:28:0;-1:-1:-1;39293:385:0:o;30582:470::-;30705:12;30720:7;:14;30737:4;30720:21;;;;:::i;:::-;30705:36;-1:-1:-1;;;30778:11:0;30705:36;30785:4;30778:11;:::i;:::-;:18;;30792:4;30778:18;:::i;:::-;30777:37;30770:44;;30983:4;30976;30967:7;30963:18;30956:32;31029:4;31022;31013:7;31009:18;31002:32;39095:190;2120:6;;-1:-1:-1;;;;;2120:6:0;860:10;2267:23;2259:68;;;;-1:-1:-1;;;2259:68:0;;;;;;;:::i;:::-;;;;;;;;;39252:25:::1;39263:4;39269:1;39272:4;;39252:10;:25::i;:::-;39095:190:::0;;;:::o;44546:29::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;4517:93::-;2120:6;;-1:-1:-1;;;;;2120:6:0;860:10;2267:23;2259:68;;;;-1:-1:-1;;;2259:68:0;;;;;;;:::i;:::-;4583:12:::1;:19:::0;;::::1;::::0;;::::1;-1:-1:-1::0;;;4583:19:0::1;-1:-1:-1::0;;;;4583:19:0;;::::1;::::0;;;::::1;::::0;;4517:93::o;41981:435::-;42074:12;42088:4;42105:16;42124:20;42139:4;38899:15;;;;;;;38855:11;38886:29;;;:12;:29;;;;;;;;;;38791:132;42124:20;42105:39;-1:-1:-1;42167:16:0;42159:4;:24;;;;;;;;:::i;:::-;;42155:215;;42207:43;42235:4;42225:15;;;;;;42242:7;42207:17;:43::i;:::-;42200:50;;;;;;;42155:215;42280:19;42272:4;:27;;;;;;;;:::i;:::-;;42268:102;;42323:35;42343:4;42333:15;;;;;;42350:7;42323:9;:35::i;42268:102::-;-1:-1:-1;;42388:12:0;;;42398:1;42388:12;;;;;;;;;;-1:-1:-1;41981:435:0;;;;;;:::o;39686:370::-;39757:7;39766;39786:16;39805:20;39820:4;38899:15;;;;;;;38855:11;38886:29;;;:12;:29;;;;;;;;;;38791:132;39805:20;39786:39;-1:-1:-1;39848:16:0;39840:4;:24;;;;;;;;:::i;:::-;;39836:189;;39888:30;39912:4;39902:15;;;;;;39888:13;:30::i;39836:189::-;39948:19;39940:4;:27;;;;;;;;:::i;:::-;;39936:89;;39991:22;40007:4;39997:15;;;;;;39991:5;:22::i;39936:89::-;-1:-1:-1;40043:1:0;;;;-1:-1:-1;39686:370:0;-1:-1:-1;;39686:370:0:o;45489:117::-;2120:6;;-1:-1:-1;;;;;2120:6:0;860:10;2267:23;2259:68;;;;-1:-1:-1;;;2259:68:0;;;;;;;:::i;:::-;45572:11:::1;:26;45586:12:::0;45572:11;:26:::1;:::i;:::-;;45489:117:::0;:::o;4767:114::-;4841:15;;:32;;;-1:-1:-1;;;4841:32:0;;;;4814:7;;-1:-1:-1;;;;;4841:15:0;;:30;;:32;;;;;;;;;;;;;;:15;:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4834:39;;4767:114;:::o;41392:581::-;2120:6;;-1:-1:-1;;;;;2120:6:0;860:10;2267:23;2259:68;;;;-1:-1:-1;;;2259:68:0;;;;;;;:::i;:::-;41570:15:::1;:13;:15::i;:::-;41562:76;;;::::0;-1:-1:-1;;;41562:76:0;;14179:2:1;41562:76:0::1;::::0;::::1;14161:21:1::0;14218:2;14198:18;;;14191:30;14257:34;14237:18;;;14230:62;-1:-1:-1;;;14308:18:1;;;14301:46;14364:19;;41562:76:0::1;13977:412:1::0;41562:76:0::1;41651:16;41670:20;41685:4;38899:15:::0;;;;;;;38855:11;38886:29;;;:12;:29;;;;;;;;;;38791:132;41670:20:::1;41651:39:::0;-1:-1:-1;41717:25:0::1;41709:4;:33;;;;;;;;:::i;:::-;;:61;;;-1:-1:-1::0;41754:16:0::1;41746:4;:24;;;;;;;;:::i;:::-;;41709:61;41701:94;;;::::0;-1:-1:-1;;;41701:94:0;;14596:2:1;41701:94:0::1;::::0;::::1;14578:21:1::0;14635:2;14615:18;;;14608:30;-1:-1:-1;;;14654:18:1;;;14647:50;14714:18;;41701:94:0::1;14394:344:1::0;41701:94:0::1;41818:25;41810:4;:33;;;;;;;;:::i;:::-;::::0;41806:105:::1;;41860:39;41876:4;41882:16;41860:15;:39::i;:::-;41921:44;41942:4;41932:15;;;;;;41949:8;41959:5;41921:10;:44::i;:::-;41551:422;41392:581:::0;;;:::o;43810:95::-;2120:6;;-1:-1:-1;;;;;2120:6:0;860:10;2267:23;2259:68;;;;-1:-1:-1;;;2259:68:0;;;;;;;:::i;:::-;2120:6;;-1:-1:-1;;;;;2120:6:0;43867:30:::1;43913:455:::0;44001:7;44021:16;44040:20;44055:4;38899:15;;;;;;;38855:11;38886:29;;;:12;:29;;;;;;;;;;38791:132;44040:20;44021:39;-1:-1:-1;44083:16:0;44075:4;:24;;;;;;;;:::i;:::-;;44071:271;;44123:47;44155:4;44145:15;;;;;;44162:7;44123:21;:47::i;:::-;44116:54;;;;;44071:271;44200:19;44192:4;:27;;;;;;;;:::i;:::-;;44188:154;;44237:22;44264:24;44274:4;44280:7;44264:9;:24::i;:::-;-1:-1:-1;44310:20:0;;;;;;;;-1:-1:-1;44303:27:0;;-1:-1:-1;;44303:27:0;44188:154;-1:-1:-1;44359:1:0;;-1:-1:-1;43913:455:0;;;;;:::o;40872:512::-;2120:6;;-1:-1:-1;;;;;2120:6:0;860:10;2267:23;2259:68;;;;-1:-1:-1;;;2259:68:0;;;;;;;:::i;:::-;41036:16:::1;41055:20;41070:4;38899:15:::0;;;;;;;38855:11;38886:29;;;:12;:29;;;;;;;;;;38791:132;41055:20:::1;41036:39:::0;-1:-1:-1;41102:25:0::1;41094:4;:33;;;;;;;;:::i;:::-;;:64;;;-1:-1:-1::0;41139:19:0::1;41131:4;:27;;;;;;;;:::i;:::-;;41094:64;41086:97;;;::::0;-1:-1:-1;;;41086:97:0;;14596:2:1;41086:97:0::1;::::0;::::1;14578:21:1::0;14635:2;14615:18;;;14608:30;-1:-1:-1;;;14654:18:1;;;14647:50;14714:18;;41086:97:0::1;14394:344:1::0;41086:97:0::1;41206:25;41198:4;:33;;;;;;;;:::i;:::-;::::0;41194:108:::1;;41248:42;41264:4;41270:19;41248:15;:42::i;:::-;41312:64;41344:4;41334:15;;;;;;41351:7;41360:4;;41366:9;41312:21;:64::i;:::-;41025:359;40872:512:::0;;;;:::o;40064:373::-;2120:6;;40142:7;;-1:-1:-1;;;;;2120:6:0;860:10;2267:23;2259:68;;;;-1:-1:-1;;;2259:68:0;;;;;;;:::i;:::-;40162:16:::1;40181:20;40196:4;38899:15:::0;;;;;;;38855:11;38886:29;;;:12;:29;;;;;;;;;;38791:132;40181:20:::1;40162:39:::0;-1:-1:-1;40224:16:0::1;40216:4;:24;;;;;;;;:::i;:::-;::::0;40212:199:::1;;40264:35;40290:4;40280:15;;;;;;40297:1;40264:15;:35::i;:::-;40257:42:::0;40064:373;-1:-1:-1;;;40064:373:0:o;40212:199::-:1;40329:19;40321:4;:27;;;;;;;;:::i;:::-;::::0;40317:94:::1;;40372:27;40390:4;40380:15;;;;;;40397:1;40372:7;:27::i;40317:94::-;-1:-1:-1::0;40428:1:0::1;::::0;40064:373;-1:-1:-1;;40064:373:0:o;43691:111::-;2120:6;;-1:-1:-1;;;;;2120:6:0;860:10;2267:23;2259:68;;;;-1:-1:-1;;;2259:68:0;;;;;;;:::i;:::-;2120:6;;43746:48:::1;::::0;-1:-1:-1;;;;;2120:6:0;;;;43772:21:::1;43746:48:::0;::::1;;;::::0;::::1;::::0;;;43772:21;2120:6;43746:48;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;43691:111::o:0;42853:418::-;2120:6;;42953:4;;-1:-1:-1;;;;;2120:6:0;860:10;2267:23;2259:68;;;;-1:-1:-1;;;2259:68:0;;;;;;;:::i;:::-;42970:16:::1;42989:20;43004:4;38899:15:::0;;;;;;;38855:11;38886:29;;;:12;:29;;;;;;;;;;38791:132;42989:20:::1;42970:39:::0;-1:-1:-1;43032:16:0::1;43024:4;:24;;;;;;;;:::i;:::-;::::0;43020:221:::1;;43072:46;43103:4;43093:15;;;;;;43110:7;43072:20;:46::i;43020:221::-;43148:19;43140:4;:27;;;;;;;;:::i;:::-;::::0;43136:105:::1;;43191:38;43214:4;43204:15;;;;;;43221:7;43191:12;:38::i;43136:105::-;-1:-1:-1::0;43258:5:0::1;::::0;42853:418;-1:-1:-1;;;42853:418:0:o;2698:94::-;2120:6;;-1:-1:-1;;;;;2120:6:0;860:10;2267:23;2259:68;;;;-1:-1:-1;;;2259:68:0;;;;;;;:::i;:::-;2763:21:::1;2781:1;2763:9;:21::i;:::-;2698:94::o:0;9423:260::-;9505:7;9540:25;9561:3;9540:20;:25::i;:::-;9529:7;:36;9525:86;;-1:-1:-1;9597:1:0;9582:17;;9525:86;9628:15;;;9649:16;;;:11;:16;;;;;;;;:25;;;;;;;;;;;9628:47;;-1:-1:-1;;;9628:47:0;;;;;7002:25:1;;;;-1:-1:-1;;;;;9628:15:0;;;;:20;;6975:18:1;;9628:47:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;9621:54:0;;9423:260;-1:-1:-1;;;9423:260:0:o;42424:421::-;42517:7;42526:4;42543:16;42562:20;42577:4;38899:15;;;;;;;38855:11;38886:29;;;:12;:29;;;;;;;;;;38791:132;42562:20;42543:39;-1:-1:-1;42605:16:0;42597:4;:24;;;;;;;;:::i;:::-;;42593:217;;42645:44;42674:4;42664:15;;;;;;42681:7;42645:18;:44::i;42593:217::-;42719:19;42711:4;:27;;;;;;;;:::i;:::-;;42707:103;;42762:36;42783:4;42773:15;;;;;;42790:7;42762:10;:36::i;42707:103::-;-1:-1:-1;42828:1:0;;;;-1:-1:-1;42424:421:0;-1:-1:-1;;;42424:421:0:o;43279:404::-;2120:6;;43376:7;;-1:-1:-1;;;;;2120:6:0;860:10;2267:23;2259:68;;;;-1:-1:-1;;;2259:68:0;;;;;;;:::i;:::-;43396:16:::1;43415:20;43430:4;38899:15:::0;;;;;;;38855:11;38886:29;;;:12;:29;;;;;;;;;;38791:132;43415:20:::1;43396:39:::0;-1:-1:-1;43458:16:0::1;43450:4;:24;;;;;;;;:::i;:::-;::::0;43446:211:::1;;43498:41;43524:4;43514:15;;;;;;43531:7;43498:15;:41::i;43446:211::-;43569:19;43561:4;:27;;;;;;;;:::i;:::-;::::0;43557:100:::1;;43612:33;43630:4;43620:15;;;;;;43637:7;43612;:33::i;4368:141::-:0;2120:6;;-1:-1:-1;;;;;2120:6:0;860:10;2267:23;2259:68;;;;-1:-1:-1;;;2259:68:0;;;;;;;:::i;:::-;4448:15:::1;:53:::0;;-1:-1:-1;;;;;;4448:53:0::1;-1:-1:-1::0;;;;;4448:53:0;;;::::1;::::0;;;::::1;::::0;;4368:141::o;4618:::-;4696:15;;4664:4;;-1:-1:-1;;;;;4696:15:0;4688:38;;;;:63;;;4750:1;4730:16;:14;:16::i;:::-;:21;;4681:70;;4618:141;:::o;2947:192::-;2120:6;;-1:-1:-1;;;;;2120:6:0;860:10;2267:23;2259:68;;;;-1:-1:-1;;;2259:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;3036:22:0;::::1;3028:73;;;::::0;-1:-1:-1;;;3028:73:0;;15244:2:1;3028:73:0::1;::::0;::::1;15226:21:1::0;15283:2;15263:18;;;15256:30;15322:34;15302:18;;;15295:62;-1:-1:-1;;;15373:18:1;;;15366:36;15419:19;;3028:73:0::1;15042:402:1::0;3028:73:0::1;3112:19;3122:8;3112:9;:19::i;40445:377::-:0;40523:7;40543:16;40562:20;40577:4;38899:15;;;;;;;38855:11;38886:29;;;:12;:29;;;;;;;;;;38791:132;40562:20;40543:39;-1:-1:-1;40605:16:0;40597:4;:24;;;;;;;;:::i;:::-;;40593:203;;40645:37;40676:4;40666:15;;;;;;40645:20;:37::i;40593:203::-;40712:19;40704:4;:27;;;;;;;;:::i;:::-;;40700:96;;40755:29;40778:4;40768:15;;;;;;40755:12;:29::i;6318:820::-;6376:12;6390:4;6408:16;6426;6446:18;6460:3;6446:13;:18::i;:::-;6407:57;;;;6479:8;6491:1;6479:13;6475:74;;6527:1;6517:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;6517:12:0;-1:-1:-1;6509:28:0;6531:5;;-1:-1:-1;6318:820:0;-1:-1:-1;;;;6318:820:0:o;6475:74::-;6561:29;6603:8;-1:-1:-1;;;;;6593:19:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;6593:19:0;;6561:51;;6623:14;6657:15;6652:435;6688:8;6678:7;:18;6652:435;;;6724:16;6743;;;:11;:16;;;;;;;;:25;;;;;;;;;;6800:15;;:30;;-1:-1:-1;;;6800:30:0;;;;;7002:25:1;;;6743::0;6724:16;-1:-1:-1;;;;;6800:15:0;;;;:20;;6975:18:1;;6800:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;6845:15;;:70;;-1:-1:-1;;;6845:70:0;;6783:47;;-1:-1:-1;;;;;;6845:15:0;;:19;;:70;;6865:8;;6845:15;;;;6783:47;;6845:70;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;6845:70:0;;;;;;;;;;;;:::i;:::-;;7023:6;7017:4;7010;7001:6;6983:16;6979:29;6975:40;6960:70;7059:16;7069:6;7059:16;;:::i;:::-;;;6709:378;;6698:9;;;;;:::i;:::-;;;;6652:435;;;-1:-1:-1;7107:16:0;;7125:4;;-1:-1:-1;6318:820:0;-1:-1:-1;;;;;6318:820:0:o;35903:1049::-;35953:12;35967:4;35985:12;35999:16;36019:10;36025:3;36019:5;:10::i;:::-;35984:45;;;;36044:8;36056:1;36044:13;36040:74;;36092:1;36082:12;;36040:74;36126:17;36156:4;-1:-1:-1;;;;;36146:15:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36146:15:0;-1:-1:-1;36126:35:0;-1:-1:-1;36295:4:0;36285:15;;36224;36321:592;36357:8;36347:7;:18;36321:592;;;36393:16;36412:18;;;;;;;;;;;:27;;;;;;;;;;36496:19;36412:27;36496:17;:19::i;:::-;36492:373;;;36548:20;:8;11383:3;15033:28;;14946:123;36548:20;36607:15;;;;:10;:15;;;;;;;;:24;;;;;;;;36536:32;;-1:-1:-1;36587:64:0;;36633:8;36643:7;36587:19;:64::i;:::-;;;36492:373;;;36707:8;36766:27;36707:8;36766:21;:27::i;:::-;-1:-1:-1;36750:43:0;-1:-1:-1;36812:37:0;36835:4;36841:7;36812:22;:37::i;:::-;;;36673:192;36492:373;36881:20;36892:9;36881:20;;:::i;:::-;;;36378:535;;36367:9;;;;;:::i;:::-;;;;36321:592;;5908:402;5988:12;6002:4;6020:14;6039:32;6058:3;6063:7;6039:18;:32::i;:::-;6019:52;;;6095:1;6086:6;:10;6082:71;;;-1:-1:-1;;6121:12:0;;;6131:1;6121:12;;;;;;;;;;-1:-1:-1;6113:28:0;;6082:71;6185:15;;6165:17;6205:16;;;:11;:16;;;;;;;;:25;;;;;;;;;;6185:87;;-1:-1:-1;;;6185:87:0;;6165:17;;-1:-1:-1;;;;;6185:15:0;;:19;;:87;;6205:25;6185:15;;6165:17;;6265:6;;6185:87;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;6185:87:0;;;;;;;;;;;;:::i;:::-;6165:107;6297:4;;-1:-1:-1;5908:402:0;-1:-1:-1;;;;;5908:402:0:o;34162:446::-;34248:4;34284:18;;;;;;;;;;;:27;;;;;;;;;34234:12;;34248:4;34328:19;34284:27;34328:17;:19::i;:::-;34324:277;;;34364:16;34401:15;;;:10;:15;;;;;;;;:24;;;;;;;;34383:53;;34427:8;34383:17;:53::i;:::-;34364:72;-1:-1:-1;34464:4:0;;-1:-1:-1;34451:18:0;;-1:-1:-1;;34451:18:0;34324:277;34517:8;34563:26;34517:8;34563:20;:26::i;:::-;34556:33;;;;;;;;5550:350;5609:7;5618;5638:16;5657:25;5678:3;5657:20;:25::i;:::-;5638:44;;5693:12;5725:15;5720:139;5756:8;5746:7;:18;5720:139;;;5800:15;;;5821:16;;;:11;:16;;;;;;;;:25;;;;;;;;;;;5800:47;;-1:-1:-1;;;5800:47:0;;;;;7002:25:1;;;;-1:-1:-1;;;;;5800:15:0;;;;:20;;6975:18:1;;5800:47:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5792:55;;;;:::i;:::-;;-1:-1:-1;5766:9:0;;;;:::i;:::-;;;;5720:139;;;-1:-1:-1;5877:4:0;5883:8;;-1:-1:-1;5550:350:0;-1:-1:-1;;5550:350:0:o;35492:403::-;35543:7;35552;35572:12;35599:15;35631:222;35660:17;35679:10;35693:24;35704:3;35709:7;35693:10;:24::i;:::-;35659:58;;;;35737:5;35732:52;;35763:5;;;;35732:52;35800:17;35808:9;35800:17;;:::i;:::-;;-1:-1:-1;35832:9:0;;;;:::i;:::-;;;;35644:209;;35631:222;;;35873:4;;35879:7;;-1:-1:-1;35492:403:0;-1:-1:-1;;35492:403:0:o;38931:126::-;39026:15;;;;;;;;;;39013:29;;;;:12;:29;;;;;;:36;;39045:4;;39013:29;-1:-1:-1;;39013:36:0;;39045:4;39013:36;;;;;;;;:::i;:::-;;;;;;38931:126;;:::o;8693:722::-;8848:15;;8889;;:32;;;-1:-1:-1;;;8889:32:0;;;;8831:14;;-1:-1:-1;;;;;8889:15:0;;:30;;:32;;;;;;;;;;;;;;:15;:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;8874:47;-1:-1:-1;8953:13:0;8960:6;8874:47;8953:13;:::i;:::-;8940:9;:26;;8932:59;;;;-1:-1:-1;;;8932:59:0;;17088:2:1;8932:59:0;;;17070:21:1;17127:2;17107:18;;;17100:30;-1:-1:-1;;;17146:18:1;;;17139:50;17206:18;;8932:59:0;16886:344:1;8932:59:0;9009:7;9004:404;9026:6;9022:1;:10;;;9004:404;;;9066:5;9072:1;9066:8;;;;;;;;;;:::i;:::-;;;;;;;9062:1;:12;:40;;;;;9090:12;;;;;;;;;;;9078:24;;:5;9084:1;9078:8;;;;;;;;;;:::i;:::-;;;;;;;:24;;9062:40;9054:73;;;;-1:-1:-1;;;9054:73:0;;17437:2:1;9054:73:0;;;17419:21:1;17476:2;17456:18;;;17449:30;-1:-1:-1;;;17495:18:1;;;17488:50;17555:18;;9054:73:0;17235:344:1;9054:73:0;9142:37;9162:3;9167:8;9176:1;9167:11;;;;;;;;;;:::i;:::-;;;;;;;9142:19;:37::i;:::-;9196:16;9236:10;9248:3;9253:8;9262:1;9253:11;;;;;;;;;;:::i;:::-;;;;;;;9225:40;;;;;;;;;-1:-1:-1;;;;;17804:32:1;;;;17786:51;;17868:2;17853:18;;17846:34;;;;17911:2;17896:18;;17889:34;17774:2;17759:18;;17584:345;9225:40:0;;;;;;;;;;;;;9215:51;;;;;;9196:70;;9281:15;;;;;;;;;-1:-1:-1;;;;;9281:15:0;-1:-1:-1;;;;;9281:23:0;;9313:4;9319:8;9329:1;9332:5;9338:1;9332:8;;;;;;;;;;:::i;:::-;;;;;;;9281:60;;;;;;;;;;;;;;;;18134:25:1;;;18207:4;18195:17;;;;18190:2;18175:18;;18168:45;18244:2;18229:18;;18222:34;18122:2;18107:18;;17934:328;9281:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9388:8;9356:11;:16;9368:3;9356:16;;;;;;;;;;;:29;9373:8;9382:1;9373:11;;;;;;;;;;:::i;:::-;;;;;;;9356:29;;;;;;;;;;;:40;;;;9039:369;9034:3;;;;;:::i;:::-;;;;9004:404;;;;8820:595;;8693:722;;;:::o;33154:509::-;33314:25;33326:3;33331:7;33314:11;:25::i;:::-;33400:24;33414:10;33400:24;;;33396:260;;;33471:61;:45;33504:4;;33510:5;33471:32;:45::i;:::-;-1:-1:-1;;;;;33471:59:0;;15077:126;33471:61;33441:13;:18;;;;;;;;;;;:27;;;;;;;;:91;33396:260;;;33613:15;;;;:10;:15;;;;;;;;:24;;;;;;;;;33595:49;;;;;;;;;;;;;;;;;;;;;;33613:24;;33639:4;;;;;;33595:49;;33639:4;;;;33595:49;;;;;;;;;-1:-1:-1;33595:17:0;;-1:-1:-1;;;33595:49:0:i;:::-;33565:13;:18;;;;;;;;;;;:27;;;;;;;;:79;33154:509;;;;;:::o;7728:506::-;7801:7;7821:381;7849:16;7868;;;:11;:16;;;;;;;;:25;;;;;;;;;;7908:68;;7955:5;;;7908:68;8164:1;8128:16;;;:11;:16;;;;;;;;:25;;;;;;;;:38;8145:7;8181:9;8145:7;8181:9;:::i;:::-;;;;7834:368;7821:381;;;-1:-1:-1;8219:7:0;7728:506;-1:-1:-1;7728:506:0:o;36996:593::-;37061:7;37081:474;37109:16;37128:18;;;;;;;;;;;:27;;;;;;;;;;37170:70;;37219:5;;;37170:70;37261:19;:8;:17;:19::i;:::-;37256:203;;37301:12;37316:8;37301:39;;37427:4;-1:-1:-1;;;;;37399:42:0;;:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37282:177;37256:203;37513:3;37475:18;;;;;;;;;;;:27;;;;;;;;:42;37494:7;37534:9;37494:7;37534:9;:::i;:::-;;;;37094:461;37081:474;;7146:574;7224:4;7260:16;;;:11;:16;;;;;;;;:25;;;;;;;;;;7296:67;;7346:5;7339:12;;;;;7296:67;7418:1;7377:16;;;:11;:16;;;;;7418:1;7394:11;:7;7404:1;7394:11;:::i;:::-;7377:29;;;;;;;;;;;;:43;7373:139;;7495:5;7488:12;;;;;7373:139;-1:-1:-1;;7688:1:0;7652:16;;;:11;:16;;;;;;;;:25;;;;;;;;:38;7708:4;;7146:574::o;37597:653::-;37667:4;37703:18;;;;;;;;;;;:27;;;;;;;;;;37741:69;;37793:5;37786:12;;;;;37741:69;37869:3;37826:18;;;;;;;;;;37869:3;37845:11;:7;37855:1;37845:11;:::i;:::-;37826:31;;;;;;;;;;;;:47;37822:143;;37948:5;37941:12;;;;;37822:143;37982:19;:8;:17;:19::i;:::-;37977:187;;38018:12;38033:8;38018:39;;38136:4;-1:-1:-1;;;;;38108:42:0;;:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38003:161;37977:187;-1:-1:-1;;38214:3:0;38176:18;;;;;;;;;;;:27;;;;;;;;:42;38238:4;;37597:653::o;3147:173::-;3222:6;;;-1:-1:-1;;;;;3239:17:0;;;-1:-1:-1;;;;;;3239:17:0;;;;;;;3272:40;;3222:6;;;3239:17;3222:6;;3272:40;;3203:16;;3272:40;3192:128;3147:173;:::o;4889:338::-;4955:7;;5005:190;5033:16;5052;;;:11;:16;;;;;;;;:25;;;;;;;;;;5092:68;;5139:5;;;5092:68;5174:9;;;;:::i;:::-;;;;5018:177;5005:190;;5235:307;5316:7;5325:4;5357:25;5378:3;5357:20;:25::i;:::-;5346:7;:36;5342:86;;-1:-1:-1;5407:1:0;;-1:-1:-1;5407:1:0;5399:17;;5342:86;5455:15;;5438:14;5476:16;;;:11;:16;;;;;;;;:25;;;;;;;;;;5455:47;;-1:-1:-1;;;5455:47:0;;;;;7002:25:1;5438:14:0;;-1:-1:-1;;;;;5455:15:0;;:20;;6975:18:1;;5455:47:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5438:64;5529:4;;-1:-1:-1;5235:307:0;-1:-1:-1;;;;5235:307:0:o;34616:483::-;34689:7;34734:18;;;;;;;;;;;:27;;;;;;;;;34689:7;;34734:27;34774:318;;34825:1;34828:5;34817:17;;;;;;;34774:318;34856:19;:8;:17;:19::i;:::-;34852:240;;;34892:11;34906:20;:8;11383:3;15033:28;;14946:123;34852:240;35007:8;35053:27;35007:8;35053:21;:27::i;35107:340::-;35165:7;;35217:196;35245:16;35264:18;;;;;;;;;;;:27;;;;;;;;;;35306:70;;35355:5;;;35306:70;35392:9;;;;:::i;:::-;;;;35230:183;35217:196;;14687:116;14743:12;14794:1;14775:16;14785:5;11383:3;15033:28;;14946:123;14775:16;:20;;14687:116;-1:-1:-1;;14687:116:0:o;13729:950::-;13881:15;13898:10;13921:16;13970:21;13985:5;13970:14;:21::i;:::-;14127:25;;;13948:43;;-1:-1:-1;13948:43:0;-1:-1:-1;14083:9:0;11442:2;14179:30;;14175:472;;;14338:20;14325:34;;14226:11;;14388:248;14456:2;14451:1;14413:30;11442:2;14413:7;:30;:::i;:::-;:35;;14446:2;14413:35;:::i;:::-;:39;;;;:::i;:::-;14412:46;;;;:::i;:::-;14408:1;:50;14388:248;;;14492:8;;;;;;;;;;;;;14551:18;;;14492:8;-1:-1:-1;14612:8:0;;14558:3;;14612:8;:::i;:::-;14606:14;-1:-1:-1;14460:3:0;;;;:::i;:::-;;;;14388:248;;;;14211:436;;14175:472;14667:4;14659:12;;13910:769;;13729:950;;;;;;:::o;29183:423::-;29237:7;;-1:-1:-1;;;;;29267:20:0;;29263:70;;-1:-1:-1;29312:1:0;;;;-1:-1:-1;29183:423:0;-1:-1:-1;29183:423:0:o;29263:70::-;29343:16;29370:11;29384:17;;;;;;;;;;;;;;;;;:24;29370:38;;29467:4;29455:17;29443:29;;29508:3;29497:8;:14;29493:64;;;-1:-1:-1;29536:1:0;;;;-1:-1:-1;29183:423:0;-1:-1:-1;;;29183:423:0:o;29493:64::-;29577:14;29588:3;29577:8;:14;:::i;30144:430::-;30218:7;30227:4;30245:16;30263:10;30277:13;30285:4;30277:7;:13::i;:::-;30244:46;;;;30308:5;30303:56;;30338:1;30341:5;30330:17;;;;;;;;30303:56;30371:11;30385:17;;;;;;;;;;;;;;;;;:24;30371:38;;30513:8;30508:3;30497:9;30491:4;30479:43;-1:-1:-1;30551:8:0;;30561:4;;-1:-1:-1;30144:430:0;-1:-1:-1;;;;30144:430:0:o;12993:728::-;13117:17;13152:15;13196:27;13217:5;13196:20;:27::i;:::-;13178:45;-1:-1:-1;13178:45:0;-1:-1:-1;11442:2:0;13240:30;;13236:478;;;13394:31;13384:42;;13287:11;;13455:248;13523:2;13518:1;13480:30;11442:2;13480:7;:30;:::i;:::-;:35;;13513:2;13480:35;:::i;:::-;:39;;;;:::i;:::-;13479:46;;;;:::i;:::-;13475:1;:50;13455:248;;;13559:8;;;;;;;;;;;;;13618:18;;;13559:8;-1:-1:-1;13679:8:0;;13625:3;;13679:8;:::i;:::-;13673:14;-1:-1:-1;13527:3:0;;;;:::i;:::-;;;;13455:248;;;;13272:442;;13236:478;13141:580;12993:728;;;;:::o;29614:522::-;29667:12;29681:4;29699:16;29717:10;29731:13;29739:4;29731:7;:13::i;:::-;29698:46;;;;29762:5;29757:67;;29802:1;29792:12;;29757:67;29881:17;29911:8;-1:-1:-1;;;;;29901:19:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;29901:19:0;;29881:39;;29931:11;29945:17;;;;;;;;;;;;;;;;;:24;29931:38;;30079:8;30074:3;30067:4;30061;30057:15;30051:4;30039:49;-1:-1:-1;30117:4:0;30123;;-1:-1:-1;29614:522:0;-1:-1:-1;;;;29614:522:0:o;8242:443::-;8320:16;8339;;;:11;:16;;;;;;;;:25;;;;;;;;;;8375:303;;8426:12;;;:59;;-1:-1:-1;8483:1:0;8442:16;;;:11;:16;;;;;8483:1;8459:11;8469:1;8459:7;:11;:::i;:::-;8442:29;;;;;;;;;;;;:43;;8426:59;8418:94;;;;-1:-1:-1;;;8418:94:0;;18871:2:1;8418:94:0;;;18853:21:1;18910:2;18890:18;;;18883:30;-1:-1:-1;;;18929:18:1;;;18922:52;18991:18;;8418:94:0;18669:346:1;32581:565:0;32651:16;32670:18;;;;;;;;;;;:27;;;;;;;;;;32710:153;;32761:12;;;:63;;-1:-1:-1;32820:3:0;32777:18;;;;;;;;;;32820:3;32796:11;32806:1;32796:7;:11;:::i;:::-;32777:31;;;;;;;;;;;;:47;;32761:63;32753:98;;;;-1:-1:-1;;;32753:98:0;;18871:2:1;32753:98:0;;;18853:21:1;18910:2;18890:18;;;18883:30;-1:-1:-1;;;18929:18:1;;;18922:52;18991:18;;32753:98:0;18669:346:1;32753:98:0;32880:19;:8;:17;:19::i;:::-;32875:264;;32931:8;-1:-1:-1;;;;;32974:20:0;;;32970:158;;33096:4;-1:-1:-1;;;;;33068:42:0;;:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32901:238;32640:506;32581:565;;:::o;25232:669::-;25314:7;25334:21;25371:17;;;;;;;;;;;;;;;;;25390:4;;25358:37;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;25358:37:0;;;;;;;;;;-1:-1:-1;25499:11:0;25513:16;23554:2;25358:37;25513:16;:::i;:::-;25599:9;25579:18;;;25572:37;25499:30;-1:-1:-1;25644:16:0;23601:3;25656:4;25644:16;:::i;:::-;25638:22;;25730:9;25724:3;25714:8;25710:18;25703:37;25684:71;25778:29;25849:5;25856:8;25810:55;;;;;:::i;:::-;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;25778:87:0;25232:669;-1:-1:-1;;;;;;25232:669:0:o;11453:671::-;11590:12;;12337:4;12327:15;;;12321:22;11383:3;12375:20;;;12414:29;;12473:14;;11442:2;11657:26;;11653:464;;;11700:13;11800:31;11789:43;;11700:13;11861:245;11925:2;11920:1;11886:26;11442:2;11886:3;:26;:::i;:::-;:31;;11915:2;11886:31;:::i;:::-;:35;;;;:::i;:::-;11885:42;;;;:::i;:::-;11881:1;:46;11861:245;;;11994:10;;;-1:-1:-1;12047:8:0;12000:3;12053:2;12047:8;:::i;:::-;12074;;;;;;;;;;;:16;;;12041:14;-1:-1:-1;12080:1:0;11929:3;12080:1;11929:3;:::i;:::-;;;;11861:245;;12504:177;12566:11;12579:12;12610:16;12620:5;11383:3;15033:28;;14946:123;12610:16;12604:22;11335:2;12644:29;;;;;12504:177;-1:-1:-1;;12504:177:0:o;12689:296::-;12757:11;12770:17;12806:16;12816:5;11383:3;15033:28;;14946:123;12806:16;12800:22;;11335:2;12841:5;:29;;12833:37;;12898:3;-1:-1:-1;;;;;12888:14:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;12888:14:0;-1:-1:-1;12954:4:0;12944:15;;12937:30;;;;-1:-1:-1;12689:296:0;:::o;-1:-1:-1:-;;;;;;;;:::o;14:127:1:-;75:10;70:3;66:20;63:1;56:31;106:4;103:1;96:15;130:4;127:1;120:15;146:127;207:10;202:3;198:20;195:1;188:31;238:4;235:1;228:15;262:4;259:1;252:15;278:128;345:9;;;366:11;;;363:37;;;380:18;;:::i;411:331::-;516:9;527;569:8;557:10;554:24;551:44;;;591:1;588;581:12;551:44;620:6;610:8;607:20;604:40;;;640:1;637;630:12;604:40;-1:-1:-1;;666:23:1;;;711:25;;;;;-1:-1:-1;411:331:1:o;747:380::-;826:1;822:12;;;;869;;;890:61;;944:4;936:6;932:17;922:27;;890:61;997:2;989:6;986:14;966:18;963:38;960:161;;1043:10;1038:3;1034:20;1031:1;1024:31;1078:4;1075:1;1068:15;1106:4;1103:1;1096:15;1257:997;1489:6;1481;1476:3;1463:33;1445:3;1524:6;1519:3;1515:16;1551:1;1547:2;1540:13;1573:1;1606:6;1600:13;1636:36;1662:9;1636:36;:::i;:::-;1691:1;1708:18;;;1735:131;;;;1880:1;1875:354;;;;1701:528;;1735:131;-1:-1:-1;;1767:24:1;;1756:36;;1839:14;;1832:22;1820:35;;1812:44;;;-1:-1:-1;1735:131:1;;1875:354;1906:6;1903:1;1896:17;1936:4;1981:2;1978:1;1968:16;2006:1;2020:164;2034:6;2031:1;2028:13;2020:164;;;2111:14;;2099:10;;;2092:34;2154:16;;;;2049:10;;2020:164;;;2024:3;;;2212:6;2208:2;2204:15;2197:22;;1701:528;-1:-1:-1;2245:3:1;;1257:997;-1:-1:-1;;;;;;;;;1257:997:1:o;2259:127::-;2320:10;2315:3;2311:20;2308:1;2301:31;2351:4;2348:1;2341:15;2375:4;2372:1;2365:15;2391:275;2462:2;2456:9;2527:2;2508:13;;-1:-1:-1;;2504:27:1;2492:40;;-1:-1:-1;;;;;2547:34:1;;2583:22;;;2544:62;2541:88;;;2609:18;;:::i;:::-;2645:2;2638:22;2391:275;;-1:-1:-1;2391:275:1:o;2671:186::-;2719:4;-1:-1:-1;;;;;2744:6:1;2741:30;2738:56;;;2774:18;;:::i;:::-;-1:-1:-1;2840:2:1;2819:15;-1:-1:-1;;2815:29:1;2846:4;2811:40;;2671:186::o;2862:462::-;2904:5;2957:3;2950:4;2942:6;2938:17;2934:27;2924:55;;2975:1;2972;2965:12;2924:55;3011:6;2998:20;3042:48;3058:31;3086:2;3058:31;:::i;:::-;3042:48;:::i;:::-;3115:2;3106:7;3099:19;3161:3;3154:4;3149:2;3141:6;3137:15;3133:26;3130:35;3127:55;;;3178:1;3175;3168:12;3127:55;3243:2;3236:4;3228:6;3224:17;3217:4;3208:7;3204:18;3191:55;3291:1;3266:16;;;3284:4;3262:27;3255:38;;;;3270:7;2862:462;-1:-1:-1;;;2862:462:1:o;3329:347::-;3380:8;3390:6;3444:3;3437:4;3429:6;3425:17;3421:27;3411:55;;3462:1;3459;3452:12;3411:55;-1:-1:-1;3485:20:1;;-1:-1:-1;;;;;3517:30:1;;3514:50;;;3560:1;3557;3550:12;3514:50;3597:4;3589:6;3585:17;3573:29;;3649:3;3642:4;3633:6;3625;3621:19;3617:30;3614:39;3611:59;;;3666:1;3663;3656:12;3681:628;3769:6;3777;3785;3838:2;3826:9;3817:7;3813:23;3809:32;3806:52;;;3854:1;3851;3844:12;3806:52;3894:9;3881:23;-1:-1:-1;;;;;3964:2:1;3956:6;3953:14;3950:34;;;3980:1;3977;3970:12;3950:34;4003:49;4044:7;4035:6;4024:9;4020:22;4003:49;:::i;:::-;3993:59;;4105:2;4094:9;4090:18;4077:32;4061:48;;4134:2;4124:8;4121:16;4118:36;;;4150:1;4147;4140:12;4118:36;;4189:60;4241:7;4230:8;4219:9;4215:24;4189:60;:::i;:::-;3681:628;;4268:8;;-1:-1:-1;4163:86:1;;-1:-1:-1;;;;3681:628:1:o;4314:250::-;4399:1;4409:113;4423:6;4420:1;4417:13;4409:113;;;4499:11;;;4493:18;4480:11;;;4473:39;4445:2;4438:10;4409:113;;;-1:-1:-1;;4556:1:1;4538:16;;4531:27;4314:250::o;4569:270::-;4610:3;4648:5;4642:12;4675:6;4670:3;4663:19;4691:76;4760:6;4753:4;4748:3;4744:14;4737:4;4730:5;4726:16;4691:76;:::i;:::-;4821:2;4800:15;-1:-1:-1;;4796:29:1;4787:39;;;;4828:4;4783:50;;4569:270;-1:-1:-1;;4569:270:1:o;4844:217::-;4991:2;4980:9;4973:21;4954:4;5011:44;5051:2;5040:9;5036:18;5028:6;5011:44;:::i;5066:276::-;5124:6;5177:2;5165:9;5156:7;5152:23;5148:32;5145:52;;;5193:1;5190;5183:12;5145:52;5232:9;5219:23;5282:10;5275:5;5271:22;5264:5;5261:33;5251:61;;5308:1;5305;5298:12;5582:388;5659:6;5667;5720:2;5708:9;5699:7;5695:23;5691:32;5688:52;;;5736:1;5733;5726:12;5688:52;5776:9;5763:23;-1:-1:-1;;;;;5801:6:1;5798:30;5795:50;;;5841:1;5838;5831:12;5795:50;5864:49;5905:7;5896:6;5885:9;5881:22;5864:49;:::i;:::-;5854:59;5960:2;5945:18;;;;5932:32;;-1:-1:-1;;;;5582:388:1:o;5975:298::-;6144:2;6133:9;6126:21;6107:4;6164:44;6204:2;6193:9;6189:18;6181:6;6164:44;:::i;:::-;6156:52;;6258:6;6251:14;6244:22;6239:2;6228:9;6224:18;6217:50;5975:298;;;;;:::o;6278:320::-;6346:6;6399:2;6387:9;6378:7;6374:23;6370:32;6367:52;;;6415:1;6412;6405:12;6367:52;6455:9;6442:23;-1:-1:-1;;;;;6480:6:1;6477:30;6474:50;;;6520:1;6517;6510:12;6474:50;6543:49;6584:7;6575:6;6564:9;6560:22;6543:49;:::i;:::-;6533:59;6278:320;-1:-1:-1;;;;6278:320:1:o;7038:712::-;7092:5;7145:3;7138:4;7130:6;7126:17;7122:27;7112:55;;7163:1;7160;7153:12;7112:55;7199:6;7186:20;7225:4;-1:-1:-1;;;;;7244:2:1;7241:26;7238:52;;;7270:18;;:::i;:::-;7316:2;7313:1;7309:10;7339:28;7363:2;7359;7355:11;7339:28;:::i;:::-;7401:15;;;7471;;;7467:24;;;7432:12;;;;7503:15;;;7500:35;;;7531:1;7528;7521:12;7500:35;7567:2;7559:6;7555:15;7544:26;;7579:142;7595:6;7590:3;7587:15;7579:142;;;7661:17;;7649:30;;7612:12;;;;7699;;;;7579:142;;;7739:5;7038:712;-1:-1:-1;;;;;;;7038:712:1:o;7755:793::-;7891:6;7899;7907;7960:2;7948:9;7939:7;7935:23;7931:32;7928:52;;;7976:1;7973;7966:12;7928:52;8016:9;8003:23;-1:-1:-1;;;;;8086:2:1;8078:6;8075:14;8072:34;;;8102:1;8099;8092:12;8072:34;8125:49;8166:7;8157:6;8146:9;8142:22;8125:49;:::i;:::-;8115:59;;8227:2;8216:9;8212:18;8199:32;8183:48;;8256:2;8246:8;8243:16;8240:36;;;8272:1;8269;8262:12;8240:36;8295:63;8350:7;8339:8;8328:9;8324:24;8295:63;:::i;:::-;8285:73;;8411:2;8400:9;8396:18;8383:32;8367:48;;8440:2;8430:8;8427:16;8424:36;;;8456:1;8453;8446:12;8424:36;;8479:63;8534:7;8523:8;8512:9;8508:24;8479:63;:::i;:::-;8469:73;;;7755:793;;;;;:::o;8735:696::-;8832:6;8840;8848;8856;8909:2;8897:9;8888:7;8884:23;8880:32;8877:52;;;8925:1;8922;8915:12;8877:52;8965:9;8952:23;-1:-1:-1;;;;;9035:2:1;9027:6;9024:14;9021:34;;;9051:1;9048;9041:12;9021:34;9074:49;9115:7;9106:6;9095:9;9091:22;9074:49;:::i;:::-;9064:59;;9170:2;9159:9;9155:18;9142:32;9132:42;;9227:2;9216:9;9212:18;9199:32;9183:48;;9256:2;9246:8;9243:16;9240:36;;;9272:1;9269;9262:12;9240:36;;9311:60;9363:7;9352:8;9341:9;9337:24;9311:60;:::i;:::-;8735:696;;;;-1:-1:-1;9390:8:1;-1:-1:-1;;;;8735:696:1:o;9836:127::-;9897:10;9892:3;9888:20;9885:1;9878:31;9928:4;9925:1;9918:15;9952:4;9949:1;9942:15;9968:247;10116:2;10101:18;;10149:1;10138:13;;10128:47;;10155:18;;:::i;:::-;10184:25;;;9968:247;:::o;10220:248::-;10288:6;10296;10349:2;10337:9;10328:7;10324:23;10320:32;10317:52;;;10365:1;10362;10355:12;10317:52;-1:-1:-1;;10388:23:1;;;10458:2;10443:18;;;10430:32;;-1:-1:-1;10220:248:1:o;10933:286::-;10992:6;11045:2;11033:9;11024:7;11020:23;11016:32;11013:52;;;11061:1;11058;11051:12;11013:52;11087:23;;-1:-1:-1;;;;;11139:31:1;;11129:42;;11119:70;;11185:1;11182;11175:12;11224:125;11289:9;;;11310:10;;;11307:36;;;11323:18;;:::i;11354:356::-;11556:2;11538:21;;;11575:18;;;11568:30;11634:34;11629:2;11614:18;;11607:62;11701:2;11686:18;;11354:356::o;11715:544::-;11816:2;11811:3;11808:11;11805:448;;;11852:1;11877:5;11873:2;11866:17;11922:4;11918:2;11908:19;11992:2;11980:10;11976:19;11973:1;11969:27;11963:4;11959:38;12028:4;12016:10;12013:20;12010:47;;;-1:-1:-1;12051:4:1;12010:47;12106:2;12101:3;12097:12;12094:1;12090:20;12084:4;12080:31;12070:41;;12161:82;12179:2;12172:5;12169:13;12161:82;;;12224:17;;;12205:1;12194:13;12161:82;;12435:1348;12559:3;12553:10;-1:-1:-1;;;;;12578:6:1;12575:30;12572:56;;;12608:18;;:::i;:::-;12637:96;12726:6;12686:38;12718:4;12712:11;12686:38;:::i;:::-;12680:4;12637:96;:::i;:::-;12788:4;;12852:2;12841:14;;12869:1;12864:662;;;;13570:1;13587:6;13584:89;;;-1:-1:-1;13639:19:1;;;13633:26;13584:89;-1:-1:-1;;12392:1:1;12388:11;;;12384:24;12380:29;12370:40;12416:1;12412:11;;;12367:57;13686:81;;12834:943;;12864:662;1204:1;1197:14;;;1241:4;1228:18;;-1:-1:-1;;12900:20:1;;;13017:236;13031:7;13028:1;13025:14;13017:236;;;13120:19;;;13114:26;13099:42;;13212:27;;;;13180:1;13168:14;;;;13047:19;;13017:236;;;13021:3;13281:6;13272:7;13269:19;13266:201;;;13342:19;;;13336:26;-1:-1:-1;;13425:1:1;13421:14;;;13437:3;13417:24;13413:37;13409:42;13394:58;13379:74;;13266:201;-1:-1:-1;;;;;13513:1:1;13497:14;;;13493:22;13480:36;;-1:-1:-1;12435:1348:1:o;13788:184::-;13858:6;13911:2;13899:9;13890:7;13886:23;13882:32;13879:52;;;13927:1;13924;13917:12;13879:52;-1:-1:-1;13950:16:1;;13788:184;-1:-1:-1;13788:184:1:o;14743:294::-;14813:6;14866:2;14854:9;14845:7;14841:23;14837:32;14834:52;;;14882:1;14879;14872:12;14834:52;14908:16;;-1:-1:-1;;14953:35:1;;14943:46;;14933:74;;15003:1;15000;14993:12;15449:467;15700:25;;;15687:3;15672:19;;15755:1;15744:13;;15734:47;;15761:18;;:::i;:::-;15817:6;15812:2;15801:9;15797:18;15790:34;15860:6;15855:2;15844:9;15840:18;15833:34;15903:6;15898:2;15887:9;15883:18;15876:34;15449:467;;;;;;;:::o;15921:647::-;16000:6;16053:2;16041:9;16032:7;16028:23;16024:32;16021:52;;;16069:1;16066;16059:12;16021:52;16102:9;16096:16;-1:-1:-1;;;;;16127:6:1;16124:30;16121:50;;;16167:1;16164;16157:12;16121:50;16190:22;;16243:4;16235:13;;16231:27;-1:-1:-1;16221:55:1;;16272:1;16269;16262:12;16221:55;16301:2;16295:9;16326:48;16342:31;16370:2;16342:31;:::i;16326:48::-;16397:2;16390:5;16383:17;16437:7;16432:2;16427;16423;16419:11;16415:20;16412:33;16409:53;;;16458:1;16455;16448:12;16409:53;16471:67;16535:2;16530;16523:5;16519:14;16514:2;16510;16506:11;16471:67;:::i;:::-;16557:5;15921:647;-1:-1:-1;;;;;15921:647:1:o;16573:135::-;16612:3;16633:17;;;16630:43;;16653:18;;:::i;:::-;-1:-1:-1;16700:1:1;16689:13;;16573:135::o;16713:168::-;16786:9;;;16817;;16834:15;;;16828:22;;16814:37;16804:71;;16855:18;;:::i;18267:175::-;18304:3;18348:4;18341:5;18337:16;18377:4;18368:7;18365:17;18362:43;;18385:18;;:::i;:::-;18434:1;18421:15;;18267:175;-1:-1:-1;;18267:175:1:o;18447:217::-;18487:1;18513;18503:132;;18557:10;18552:3;18548:20;18545:1;18538:31;18592:4;18589:1;18582:15;18620:4;18617:1;18610:15;18503:132;-1:-1:-1;18649:9:1;;18447:217::o;19020:470::-;19205:3;19243:6;19237:13;19259:66;19318:6;19313:3;19306:4;19298:6;19294:17;19259:66;:::i;:::-;19347:16;;19400:6;19392;19347:16;19372:35;19464:1;19426:18;;19453:13;;;-1:-1:-1;19426:18:1;;19020:470;-1:-1:-1;;;19020:470:1:o

Swarm Source

ipfs://74ecdb7c1356cd26b7ae20a002751e685b2c97645c0ec1b1214c316ec9516dce

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
[ 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.