ETH Price: $3,421.74 (-0.35%)
Gas: 7 Gwei

Token

MetaBoom ($MMU)
 

Overview

Max Total Supply

916 $MMU

Holders

520

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
dominosmusic.eth
Balance
1 $MMU
0xbf46d2161045251cb97d0b41929bc1d36044e1a0
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

Carry this web3.0 music player on your PFP’s shoulder, share your favorite music NFTs, and enjoy the future of music.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
MetaBoom

Compiler Version
v0.8.0+commit.c7dfd78e

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity Multiple files format)

File 15 of 17: MetaBoom.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

import "./ComposableTopDown.sol";
import "./Address.sol";
import "./Strings.sol";
import "./Ownable.sol";

contract MetaBoom is ComposableTopDown, Ownable {
    using Address for address;
    using Strings for uint256;

    uint256 public constant maxSupply = 5000;
    uint256 public constant price = 0.05 ether;
    uint256 public constant airDropMaxSupply = 300;
    uint256 public totalSupply = 0;
    uint256 public totalAirDrop = 0;
    string public baseTokenURI;
    string public subTokenURI;
    bool public paused = false;

    uint256 public preSaleTime = 1636682400;
    uint256 public publicSaleTime = 1637028000;

    mapping(address => bool) public airDropList;
    mapping(address => bool) public whiteList;
    mapping(address => uint8) public prePaidNumAry;
    mapping(address => uint8) public holdedNumAry;
    mapping(address => uint8) public claimed;
    mapping(uint256 => string) private _tokenURIs;

    event MetaBoomPop(uint256 indexed tokenId, address indexed tokenOwner);

    constructor(
        string memory _name,
        string memory _symbol,
        string memory _uri,
        string memory _subUri
    ) ComposableTopDown(_name, _symbol) {
        baseTokenURI = _uri;
        subTokenURI = _subUri;
    }

    function preSale(uint8 _purchaseNum) external payable onlyWhiteList {
        require(!paused, "MetaBoom: currently paused");
        require(
            block.timestamp >= preSaleTime,
            "MetaBoom: preSale is not open"
        );
        require(
            (totalSupply + _purchaseNum) <= (maxSupply - airDropMaxSupply),
            "MetaBoom: reached max supply"
        );
        require(
            (holdedNumAry[_msgSender()] + _purchaseNum) <= 5,
            "MetaBoom: can not hold more than 5"
        );
        require(
            msg.value >= (price * _purchaseNum),
            "MetaBoom: price is incorrect"
        );

        holdedNumAry[_msgSender()] = holdedNumAry[_msgSender()] + _purchaseNum;
        prePaidNumAry[_msgSender()] =
            prePaidNumAry[_msgSender()] +
            _purchaseNum;
        totalSupply = totalSupply + _purchaseNum;
    }

    function publicSale(uint8 _purchaseNum) external payable {
        require(!paused, "MetaBoom: currently paused");
        require(
            block.timestamp >= publicSaleTime,
            "MetaBoom: publicSale is not open"
        );
        require(
            (totalSupply + _purchaseNum) <= (maxSupply - airDropMaxSupply),
            "MetaBoom: reached max supply"
        );
        require(
            (holdedNumAry[_msgSender()] + _purchaseNum) <= 5,
            "MetaBoom: can not hold more than 5"
        );
        require(
            msg.value >= (price * _purchaseNum),
            "MetaBoom: price is incorrect"
        );

        holdedNumAry[_msgSender()] = holdedNumAry[_msgSender()] + _purchaseNum;
        prePaidNumAry[_msgSender()] =
            prePaidNumAry[_msgSender()] +
            _purchaseNum;
        totalSupply = totalSupply + _purchaseNum;
    }

    function ownerMInt(address _addr)
        external
        onlyOwner
        returns (uint256 tokenId_)
    {
        require(
            totalSupply < (maxSupply - airDropMaxSupply),
            "MetaBoom: reached max supply"
        );
        require(holdedNumAry[_addr] < 5, "MetaBoom: can not hold more than 5");

        tokenId_ = _safeMint(_addr);
        holdedNumAry[_addr]++;
        claimed[_addr]++;
        totalSupply++;
        emit MetaBoomPop(tokenId_, _addr);
        return tokenId_;
    }

    function claimAirdrop() external onlyAirDrop {
        require(
            block.timestamp >= preSaleTime,
            "MetaBoom: Not able to claim yet."
        );
        uint256 tokenId_ = _safeMint(_msgSender());
        airDropList[_msgSender()] = false;
        emit MetaBoomPop(tokenId_, _msgSender());
        holdedNumAry[_msgSender()]++;
        claimed[_msgSender()]++;
    }

    function claimAll() external {
        require(
            block.timestamp >= preSaleTime,
            "MetaBoom: Not able to claim yet"
        );

        require(
            prePaidNumAry[_msgSender()] > 0,
            "MetaBoom: already claimed all"
        );

        for (uint8 i = 0; i < prePaidNumAry[_msgSender()]; i++) {
            uint256 tokenId_ = _safeMint(_msgSender());
            emit MetaBoomPop(tokenId_, _msgSender());
        }

        claimed[_msgSender()] += prePaidNumAry[_msgSender()];
        prePaidNumAry[_msgSender()] = 0;
    }

    modifier onlyWhiteList() {
        require(whiteList[_msgSender()], "MetaBoom: caller not in WhiteList");
        _;
    }

    modifier onlyAirDrop() {
        require(
            airDropList[_msgSender()],
            "MetaBoom: caller not in AirdropList"
        );
        _;
    }

    function setBaseURI(string memory _baseURI) external onlyOwner {
        baseTokenURI = _baseURI;
    }

    function setSubURI(string memory _subURI) external onlyOwner {
        subTokenURI = _subURI;
    }

    function setTokenURI(uint256 _tokenId, string memory _tokenURI)
        external
        onlyOwner
    {
        _tokenURIs[_tokenId] = _tokenURI;
    }

    function setPreSaleTime(uint256 _time) external onlyOwner {
        preSaleTime = _time;
    }

    function setPublicSaleTime(uint256 _time) external onlyOwner {
        publicSaleTime = _time;
    }

    function pauseSale() external onlyOwner {
        paused = !paused;
    }

    function addBatchWhiteList(address[] memory _accounts) external onlyOwner {
        for (uint256 i = 0; i < _accounts.length; i++) {
            whiteList[_accounts[i]] = true;
        }
    }

    function addBatchAirDropList(address[] memory _accounts)
        external
        onlyOwner
    {
        require(
            totalAirDrop + _accounts.length <= airDropMaxSupply,
            "reached max airDropSupply"
        );

        for (uint256 i = 0; i < _accounts.length; i++) {
            require(holdedNumAry[_accounts[i]] < 5, "can not hold more than 5");
            airDropList[_accounts[i]] = true;
        }

        totalAirDrop = totalAirDrop + _accounts.length;
    }

    function withdraw() external onlyOwner {
        payable(owner()).transfer(address(this).balance);
    }

    function tokensOfOwner(address _owner)
        external
        view
        returns (uint256[] memory)
    {
        uint256 tokenCount = balanceOf(_owner);
        if (tokenCount == 0) {
            return new uint256[](0);
        } else {
            uint256[] memory result = new uint256[](tokenCount);
            uint256 index;
            for (index = 0; index < tokenCount; index++) {
                result[index] = tokenOfOwnerByIndex(_owner, index);
            }
            return result;
        }
    }

    function childContractOfToken(uint256 _tokenId)
        external
        view
        returns (address[] memory)
    {
        uint256 childCount = totalChildContracts(_tokenId);
        if (childCount == 0) {
            return new address[](0);
        } else {
            address[] memory result = new address[](childCount);
            uint256 index;
            for (index = 0; index < childCount; index++) {
                result[index] = childContractByIndex(_tokenId, index);
            }
            return result;
        }
    }

    function childTokensOfChildContract(uint256 _tokenId, address _childAddr)
        external
        view
        returns (uint256[] memory)
    {
        uint256 tokenCount = totalChildTokens(_tokenId, _childAddr);
        if (tokenCount == 0) {
            return new uint256[](0);
        } else {
            uint256[] memory result = new uint256[](tokenCount);
            uint256 index;
            for (index = 0; index < tokenCount; index++) {
                result[index] = childTokenByIndex(_tokenId, _childAddr, index);
            }
            return result;
        }
    }

    function tokenURI(uint256 _tokenId)
        public
        view
        override
        returns (string memory)
    {
        return
            bytes(_tokenURIs[_tokenId]).length > 0
                ? string(abi.encodePacked(subTokenURI, _tokenURIs[_tokenId]))
                : string(
                    abi.encodePacked(baseTokenURI, Strings.toString(_tokenId))
                );
    }
}

File 1 of 17: Address.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.3.2 (utils/Address.sol)

pragma solidity ^0.8.0;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(
            address(this).balance >= amount,
            "Address: insufficient balance"
        );

        (bool success, ) = recipient.call{value: amount}("");
        require(
            success,
            "Address: unable to send value, recipient may have reverted"
        );
    }

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain `call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data)
        internal
        returns (bytes memory)
    {
        return functionCall(target, data, "Address: low-level call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value
    ) internal returns (bytes memory) {
        return
            functionCallWithValue(
                target,
                data,
                value,
                "Address: low-level call with value failed"
            );
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(
            address(this).balance >= value,
            "Address: insufficient balance for call"
        );
        require(isContract(target), "Address: call to non-contract");

        (bool success, bytes memory returndata) = target.call{value: value}(
            data
        );
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data)
        internal
        view
        returns (bytes memory)
    {
        return
            functionStaticCall(
                target,
                data,
                "Address: low-level static call failed"
            );
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data)
        internal
        returns (bytes memory)
    {
        return
            functionDelegateCall(
                target,
                data,
                "Address: low-level delegate call failed"
            );
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

File 2 of 17: ComposableTopDown.sol
// SPDX-License-Identifier: UNLICENSED

pragma solidity ^0.8.0;

import "./IERC998ERC721BottomUp.sol";
import "./IERC998ERC721TopDown.sol";
import "./IERC998ERC721TopDownEnumerable.sol";
import "./ERC165.sol";
import "./IERC721.sol";
import "./IERC721Receiver.sol";
import "./Address.sol";
import "./Strings.sol";
import "./EnumerableSet.sol";
import "./IERC721Metadata.sol";

contract ComposableTopDown is
    ERC165,
    IERC721,
    IERC998ERC721TopDown,
    IERC998ERC721TopDownEnumerable,
    IERC721Metadata
{
    using Address for address;
    using Strings for uint256;
    using EnumerableSet for EnumerableSet.UintSet;
    using EnumerableSet for EnumerableSet.AddressSet;
    // return this.rootOwnerOf.selector ^ this.rootOwnerOfChild.selector ^
    //   this.tokenOwnerOf.selector ^ this.ownerOfChild.selector;
    bytes4 constant ERC998_MAGIC_VALUE = 0xcd740db5;
    bytes32 constant ERC998_MAGIC_VALUE_32 =
        0xcd740db500000000000000000000000000000000000000000000000000000000;

    uint256 tokenCount = 0;

    // tokenId => token owner
    mapping(uint256 => address) private tokenIdToTokenOwner;

    // Mapping from holder address to their (enumerable) set of owned tokens
    mapping(address => EnumerableSet.UintSet) private _holderTokens;

    // tokenId => last state hash indicator
    mapping(uint256 => uint256) private tokenIdToStateHash;

    // root token owner address => (tokenId => approved address)
    mapping(address => mapping(uint256 => address))
        private rootOwnerAndTokenIdToApprovedAddress;

    // token owner address => token count
    mapping(address => uint256) private tokenOwnerToTokenCount;

    // token owner => (operator address => bool)
    mapping(address => mapping(address => bool)) private tokenOwnerToOperators;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

    function _safeMint(address _to) internal virtual returns (uint256) {
        require(_to != address(0), "CTD: _to zero addr");
        tokenCount++;
        uint256 tokenCount_ = tokenCount;
        tokenIdToTokenOwner[tokenCount_] = _to;
        _holderTokens[_to].add(tokenCount_);
        tokenOwnerToTokenCount[_to]++;
        tokenIdToStateHash[tokenCount] = uint256(
            keccak256(
                abi.encodePacked(uint256(uint160(address(this))), tokenCount)
            )
        );

        require(
            _checkOnERC721Received(address(0), _to, tokenCount_, ""),
            "CTD: transfer to non ERC721Receiver"
        );
        emit Transfer(address(0), _to, tokenCount_);
        return tokenCount_;
    }

    //from zepellin ERC721Receiver.sol
    //old version
    bytes4 constant ERC721_RECEIVED_OLD = 0xf0b9e5ba;
    //new version
    bytes4 constant ERC721_RECEIVED_NEW = 0x150b7a02;

    bytes4 constant ALLOWANCE = bytes4(keccak256("allowance(address,address)"));
    bytes4 constant APPROVE = bytes4(keccak256("approve(address,uint256)"));
    bytes4 constant ROOT_OWNER_OF_CHILD =
        bytes4(keccak256("rootOwnerOfChild(address,uint256)"));

    ////////////////////////////////////////////////////////
    // ERC721 implementation
    ////////////////////////////////////////////////////////
    function rootOwnerOf(uint256 _tokenId)
        public
        view
        override
        returns (bytes32 rootOwner)
    {
        return rootOwnerOfChild(address(0), _tokenId);
    }

    // returns the owner at the top of the tree of composables
    // Use Cases handled:
    // Case 1: Token owner is this contract and token.
    // Case 2: Token owner is other top-down composable
    // Case 3: Token owner is other contract
    // Case 4: Token owner is user
    function rootOwnerOfChild(address _childContract, uint256 _childTokenId)
        public
        view
        override
        returns (bytes32 rootOwner)
    {
        address rootOwnerAddress;
        if (_childContract != address(0)) {
            (rootOwnerAddress, _childTokenId) = _ownerOfChild(
                _childContract,
                _childTokenId
            );
        } else {
            rootOwnerAddress = tokenIdToTokenOwner[_childTokenId];
            require(
                rootOwnerAddress != address(0),
                "CTD: ownerOf _tokenId zero addr"
            );
        }
        // Case 1: Token owner is this contract and token.
        while (rootOwnerAddress == address(this)) {
            (rootOwnerAddress, _childTokenId) = _ownerOfChild(
                rootOwnerAddress,
                _childTokenId
            );
        }
        bytes memory callData = abi.encodeWithSelector(
            ROOT_OWNER_OF_CHILD,
            address(this),
            _childTokenId
        );
        (bool callSuccess, bytes memory data) = rootOwnerAddress.staticcall(
            callData
        );
        if (callSuccess) {
            assembly {
                rootOwner := mload(add(data, 0x20))
            }
        }

        if (
            callSuccess == true &&
            rootOwner &
                0xffffffff00000000000000000000000000000000000000000000000000000000 ==
            ERC998_MAGIC_VALUE_32
        ) {
            // Case 2: Token owner is other top-down composable
            return rootOwner;
        } else {
            // Case 3: Token owner is other contract
            // Or
            // Case 4: Token owner is user
            assembly {
                rootOwner := or(ERC998_MAGIC_VALUE_32, rootOwnerAddress)
            }
        }
    }

    // returns the owner at the top of the tree of composables

    function ownerOf(uint256 _tokenId)
        public
        view
        override
        returns (address tokenOwner)
    {
        tokenOwner = tokenIdToTokenOwner[_tokenId];
        require(tokenOwner != address(0), "CTD: ownerOf _tokenId zero addr");
        return tokenOwner;
    }

    function balanceOf(address _tokenOwner)
        public
        view
        override
        returns (uint256)
    {
        require(
            _tokenOwner != address(0),
            "CTD: balanceOf _tokenOwner zero addr"
        );
        return tokenOwnerToTokenCount[_tokenOwner];
    }

    function approve(address _approved, uint256 _tokenId) external override {
        address rootOwner = address(uint160(uint256(rootOwnerOf(_tokenId))));
        require(
            rootOwner == msg.sender ||
                tokenOwnerToOperators[rootOwner][msg.sender],
            "CTD: approve msg.sender not owner"
        );
        rootOwnerAndTokenIdToApprovedAddress[rootOwner][_tokenId] = _approved;
        emit Approval(rootOwner, _approved, _tokenId);
    }

    function getApproved(uint256 _tokenId)
        public
        view
        override
        returns (address)
    {
        address rootOwner = address(uint160(uint256(rootOwnerOf(_tokenId))));
        return rootOwnerAndTokenIdToApprovedAddress[rootOwner][_tokenId];
    }

    function setApprovalForAll(address _operator, bool _approved)
        external
        override
    {
        require(_operator != address(0), "CTD: _operator zero addr");
        tokenOwnerToOperators[msg.sender][_operator] = _approved;
        emit ApprovalForAll(msg.sender, _operator, _approved);
    }

    function isApprovedForAll(address _owner, address _operator)
        external
        view
        override
        returns (bool)
    {
        require(_owner != address(0), "CTD: _owner zero addr");
        require(_operator != address(0), "CTD: _operator zero addr");
        return tokenOwnerToOperators[_owner][_operator];
    }

    function transferFrom(
        address _from,
        address _to,
        uint256 _tokenId
    ) public override {
        _transferFrom(_from, _to, _tokenId);
    }

    function safeTransferFrom(
        address _from,
        address _to,
        uint256 _tokenId
    ) public override {
        _transferFrom(_from, _to, _tokenId);
        if (_to.isContract()) {
            bytes4 retval = IERC721Receiver(_to).onERC721Received(
                msg.sender,
                _from,
                _tokenId,
                ""
            );
            require(
                retval == ERC721_RECEIVED_OLD || retval == ERC721_RECEIVED_NEW,
                "CTD: safeTransferFrom(3) onERC721Received invalid return value"
            );
        }
    }

    function safeTransferFrom(
        address _from,
        address _to,
        uint256 _tokenId,
        bytes memory _data
    ) public override {
        _transferFrom(_from, _to, _tokenId);
        if (_to.isContract()) {
            bytes4 retval = IERC721Receiver(_to).onERC721Received(
                msg.sender,
                _from,
                _tokenId,
                _data
            );
            require(
                retval == ERC721_RECEIVED_OLD || retval == ERC721_RECEIVED_NEW,
                "CTD: safeTransferFrom(4) onERC721Received invalid return value"
            );
            rootOwnerOf(_tokenId);
        }
    }

    function _transferFrom(
        address _from,
        address _to,
        uint256 _tokenId
    ) private {
        require(_from != address(0), "CTD: _from zero addr");
        require(tokenIdToTokenOwner[_tokenId] == _from, "CTD: _from not owner");
        require(_to != address(0), "CTD: _to zero address");

        if (msg.sender != _from) {
            bytes memory callData = abi.encodeWithSelector(
                ROOT_OWNER_OF_CHILD,
                address(this),
                _tokenId
            );
            (bool callSuccess, bytes memory data) = _from.staticcall(callData);
            if (callSuccess == true) {
                bytes32 rootOwner;
                assembly {
                    rootOwner := mload(add(data, 0x20))
                }
                require(
                    rootOwner &
                        0xffffffff00000000000000000000000000000000000000000000000000000000 !=
                        ERC998_MAGIC_VALUE_32,
                    "CTD: token is child of other top down composable"
                );
            }

            require(
                tokenOwnerToOperators[_from][msg.sender] ||
                    rootOwnerAndTokenIdToApprovedAddress[_from][_tokenId] ==
                    msg.sender,
                "CTD: msg.sender not approved"
            );
        }

        // clear approval
        if (
            rootOwnerAndTokenIdToApprovedAddress[_from][_tokenId] != address(0)
        ) {
            delete rootOwnerAndTokenIdToApprovedAddress[_from][_tokenId];
            emit Approval(_from, address(0), _tokenId);
        }

        // remove and transfer token
        if (_from != _to) {
            assert(tokenOwnerToTokenCount[_from] > 0);
            tokenOwnerToTokenCount[_from]--;
            tokenIdToTokenOwner[_tokenId] = _to;
            _holderTokens[_from].remove(_tokenId);
            _holderTokens[_to].add(_tokenId);
            tokenOwnerToTokenCount[_to]++;
        }
        emit Transfer(_from, _to, _tokenId);
    }

    ////////////////////////////////////////////////////////
    // NFT Extendsion Metadata implementation
    ////////////////////////////////////////////////////////

    /**
     * @dev See {IERC721Metadata-name}.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev See {IERC721Metadata-symbol}.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev Returns whether `tokenId` exists.
     *
     * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
     *
     * Tokens start existing when they are minted (`_mint`),
     * and stop existing when they are burned (`_burn`).
     */
    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return tokenIdToTokenOwner[tokenId] != address(0);
    }

    function tokenURI(uint256 tokenId)
        public
        view
        virtual
        override
        returns (string memory)
    {
        require(
            _exists(tokenId),
            "ERC721Metadata: URI query for nonexistent token"
        );

        string memory baseURI = _baseURI();
        return
            bytes(baseURI).length > 0
                ? string(abi.encodePacked(baseURI, tokenId.toString()))
                : "";
    }

    /**
     * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each
     * token will be the concatenation of the `baseURI` and the `tokenId`. Empty
     * by default, can be overriden in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return "";
    }

    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index)
        public
        view
        virtual
        returns (uint256)
    {
        return _holderTokens[owner].at(index);
    }

    function getTokenCount() public view returns (uint256) {
        return tokenCount;
    }

    ////////////////////////////////////////////////////////
    // ERC998ERC721 and ERC998ERC721Enumerable implementation
    ////////////////////////////////////////////////////////

    // tokenId => child contract
    mapping(uint256 => EnumerableSet.AddressSet) private childContracts;

    // tokenId => (child address => array of child tokens)
    mapping(uint256 => mapping(address => EnumerableSet.UintSet))
        private childTokens;

    // child address => childId => tokenId
    mapping(address => mapping(uint256 => uint256)) private childTokenOwner;

    function safeTransferChild(
        uint256 _fromTokenId,
        address _to,
        address _childContract,
        uint256 _childTokenId
    ) external override {
        _transferChild(_fromTokenId, _to, _childContract, _childTokenId);
        IERC721(_childContract).safeTransferFrom(
            address(this),
            _to,
            _childTokenId
        );
        emit TransferChild(_fromTokenId, _to, _childContract, _childTokenId);
    }

    function safeTransferChild(
        uint256 _fromTokenId,
        address _to,
        address _childContract,
        uint256 _childTokenId,
        bytes memory _data
    ) external override {
        _transferChild(_fromTokenId, _to, _childContract, _childTokenId);
        IERC721(_childContract).safeTransferFrom(
            address(this),
            _to,
            _childTokenId,
            _data
        );
        emit TransferChild(_fromTokenId, _to, _childContract, _childTokenId);
    }

    function transferChild(
        uint256 _fromTokenId,
        address _to,
        address _childContract,
        uint256 _childTokenId
    ) external override {
        _transferChild(_fromTokenId, _to, _childContract, _childTokenId);
        //this is here to be compatible with cryptokitties and other old contracts that require being owner and approved
        // before transferring.
        //does not work with current standard which does not allow approving self, so we must let it fail in that case.
        bytes memory callData = abi.encodeWithSelector(
            APPROVE,
            this,
            _childTokenId
        );
        _childContract.call(callData);

        IERC721(_childContract).transferFrom(address(this), _to, _childTokenId);
        emit TransferChild(_fromTokenId, _to, _childContract, _childTokenId);
    }

    function transferChildToParent(
        uint256 _fromTokenId,
        address _toContract,
        uint256 _toTokenId,
        address _childContract,
        uint256 _childTokenId,
        bytes memory _data
    ) external override {
        _transferChild(
            _fromTokenId,
            _toContract,
            _childContract,
            _childTokenId
        );
        IERC998ERC721BottomUp(_childContract).transferToParent(
            address(this),
            _toContract,
            _toTokenId,
            _childTokenId,
            _data
        );
        emit TransferChild(
            _fromTokenId,
            _toContract,
            _childContract,
            _childTokenId
        );
    }

    // this contract has to be approved first in _childContract
    function getChild(
        address _from,
        uint256 _tokenId,
        address _childContract,
        uint256 _childTokenId
    ) external override {
        receiveChild(_from, _tokenId, _childContract, _childTokenId);
        require(
            _from == msg.sender ||
                IERC721(_childContract).isApprovedForAll(_from, msg.sender) ||
                IERC721(_childContract).getApproved(_childTokenId) ==
                msg.sender,
            "CTD: msg.sender not approved"
        );
        IERC721(_childContract).transferFrom(
            _from,
            address(this),
            _childTokenId
        );
        // a check for looped ownership chain
        rootOwnerOf(_tokenId);
    }

    function onERC721Received(
        address _from,
        uint256 _childTokenId,
        bytes calldata _data
    ) external returns (bytes4) {
        require(
            _data.length > 0,
            "CTD: onERC721Received(3) _data must contain the uint256 tokenId to transfer the child token to"
        );
        // convert up to 32 bytes of _data to uint256, owner nft tokenId passed as uint in bytes
        uint256 tokenId = _parseTokenId(_data);
        receiveChild(_from, tokenId, msg.sender, _childTokenId);
        require(
            IERC721(msg.sender).ownerOf(_childTokenId) != address(0),
            "CTD: onERC721Received(3) child token not owned"
        );
        // a check for looped ownership chain
        rootOwnerOf(tokenId);
        return ERC721_RECEIVED_OLD;
    }

    function onERC721Received(
        address,
        address _from,
        uint256 _childTokenId,
        bytes calldata _data
    ) external override returns (bytes4) {
        require(
            _data.length > 0,
            "CTD: onERC721Received(4) _data must contain the uint256 tokenId to transfer the child token to"
        );
        // convert up to 32 bytes of _data to uint256, owner nft tokenId passed as uint in bytes
        uint256 tokenId = _parseTokenId(_data);
        receiveChild(_from, tokenId, msg.sender, _childTokenId);
        require(
            IERC721(msg.sender).ownerOf(_childTokenId) != address(0),
            "CTD: onERC721Received(4) child token not owned"
        );
        // a check for looped ownership chain
        rootOwnerOf(tokenId);
        return ERC721_RECEIVED_NEW;
    }

    function childExists(address _childContract, uint256 _childTokenId)
        external
        view
        returns (bool)
    {
        uint256 tokenId = childTokenOwner[_childContract][_childTokenId];
        return tokenId != 0;
    }

    function totalChildContracts(uint256 _tokenId)
        public
        view
        override
        returns (uint256)
    {
        return childContracts[_tokenId].length();
    }

    function childContractByIndex(uint256 _tokenId, uint256 _index)
        public
        view
        override
        returns (address childContract)
    {
        return childContracts[_tokenId].at(_index);
    }

    function totalChildTokens(uint256 _tokenId, address _childContract)
        public
        view
        override
        returns (uint256)
    {
        return childTokens[_tokenId][_childContract].length();
    }

    function childTokenByIndex(
        uint256 _tokenId,
        address _childContract,
        uint256 _index
    ) public view override returns (uint256 childTokenId) {
        return childTokens[_tokenId][_childContract].at(_index);
    }

    function ownerOfChild(address _childContract, uint256 _childTokenId)
        external
        view
        override
        returns (bytes32 parentTokenOwner, uint256 parentTokenId)
    {
        parentTokenId = childTokenOwner[_childContract][_childTokenId];
        require(parentTokenId != 0, "CTD: not found");
        address parentTokenOwnerAddress = tokenIdToTokenOwner[parentTokenId];
        assembly {
            parentTokenOwner := or(
                ERC998_MAGIC_VALUE_32,
                parentTokenOwnerAddress
            )
        }
    }

    function _transferChild(
        uint256 _fromTokenId,
        address _to,
        address _childContract,
        uint256 _childTokenId
    ) private {
        uint256 tokenId = childTokenOwner[_childContract][_childTokenId];
        require(tokenId != 0, "CTD: _childContract _childTokenId not found");
        require(tokenId == _fromTokenId, "CTD: wrong tokenId found");
        require(_to != address(0), "CTD: _to zero addr");
        address rootOwner = address(uint160(uint256(rootOwnerOf(tokenId))));
        require(
            rootOwner == msg.sender ||
                tokenOwnerToOperators[rootOwner][msg.sender] ||
                rootOwnerAndTokenIdToApprovedAddress[rootOwner][tokenId] ==
                msg.sender,
            "CTD: msg.sender not eligible"
        );
        removeChild(tokenId, _childContract, _childTokenId);
    }

    function _ownerOfChild(address _childContract, uint256 _childTokenId)
        private
        view
        returns (address parentTokenOwner, uint256 parentTokenId)
    {
        parentTokenId = childTokenOwner[_childContract][_childTokenId];
        require(parentTokenId != 0, "CTD: not found");
        return (tokenIdToTokenOwner[parentTokenId], parentTokenId);
    }

    function _parseTokenId(bytes memory _data)
        private
        pure
        returns (uint256 tokenId)
    {
        // convert up to 32 bytes of_data to uint256, owner nft tokenId passed as uint in bytes
        assembly {
            tokenId := mload(add(_data, 0x20))
        }
        if (_data.length < 32) {
            tokenId = tokenId >> (256 - _data.length * 8);
        }
    }

    function _checkOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        if (to.isContract()) {
            try
                IERC721Receiver(to).onERC721Received(
                    msg.sender,
                    from,
                    tokenId,
                    _data
                )
            returns (bytes4 retval) {
                return retval == IERC721Receiver(to).onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert(
                        "ERC721: transfer to non ERC721Receiver implementer"
                    );
                } else {
                    // solhint-disable-next-line no-inline-assembly
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

    function removeChild(
        uint256 _tokenId,
        address _childContract,
        uint256 _childTokenId
    ) private {
        // remove child token
        uint256 lastTokenIndex = childTokens[_tokenId][_childContract]
            .length() - 1;
        childTokens[_tokenId][_childContract].remove(_childTokenId);
        delete childTokenOwner[_childContract][_childTokenId];

        // remove contract
        if (lastTokenIndex == 0) {
            childContracts[_tokenId].remove(_childContract);
        }
        if (_childContract == address(this)) {
            _updateStateHash(
                _tokenId,
                uint256(uint160(_childContract)),
                tokenIdToStateHash[_childTokenId]
            );
        } else {
            _updateStateHash(
                _tokenId,
                uint256(uint160(_childContract)),
                _childTokenId
            );
        }
    }

    function receiveChild(
        address _from,
        uint256 _tokenId,
        address _childContract,
        uint256 _childTokenId
    ) private {
        require(
            tokenIdToTokenOwner[_tokenId] != address(0),
            "CTD: _tokenId does not exist."
        );
        require(
            childTokenOwner[_childContract][_childTokenId] != _tokenId,
            "CTD: _childTokenId already received"
        );
        uint256 childTokensLength = childTokens[_tokenId][_childContract]
            .length();
        if (childTokensLength == 0) {
            childContracts[_tokenId].add(_childContract);
        }
        childTokens[_tokenId][_childContract].add(_childTokenId);
        childTokenOwner[_childContract][_childTokenId] = _tokenId;
        if (_childContract == address(this)) {
            _updateStateHash(
                _tokenId,
                uint256(uint160(_childContract)),
                tokenIdToStateHash[_childTokenId]
            );
        } else {
            _updateStateHash(
                _tokenId,
                uint256(uint160(_childContract)),
                _childTokenId
            );
        }
        emit ReceivedChild(_from, _tokenId, _childContract, _childTokenId);
    }

    ////////////////////////////////////////////////////////
    // ERC165 implementation
    ////////////////////////////////////////////////////////

    /**
     * @dev See {IERC165-supportsInterface}.
     * The interface id 0x1bc995e4 is added. The spec claims it to be the interface id of IERC998ERC721TopDown.
     * But it is not.
     * It is added anyway in case some contract checks it being compliant with the spec.
     */
    function supportsInterface(bytes4 interfaceId)
        public
        view
        override(IERC165, ERC165)
        returns (bool)
    {
        return
            interfaceId == type(IERC721).interfaceId ||
            interfaceId == type(IERC998ERC721TopDown).interfaceId ||
            interfaceId == type(IERC998ERC721TopDownEnumerable).interfaceId ||
            interfaceId == 0x1bc995e4 ||
            super.supportsInterface(interfaceId);
    }

    ////////////////////////////////////////////////////////
    // Last State Hash
    ////////////////////////////////////////////////////////

    /**
     * Update the state hash of tokenId and all its ancestors.
     * @param tokenId token id
     * @param childReference generalization of a child contract adddress
     * @param value new balance of ERC20, childTokenId of ERC721 or a child's state hash (if childContract==address(this))
     */
    function _updateStateHash(
        uint256 tokenId,
        uint256 childReference,
        uint256 value
    ) private {
        uint256 _newStateHash = uint256(
            keccak256(
                abi.encodePacked(
                    tokenIdToStateHash[tokenId],
                    childReference,
                    value
                )
            )
        );
        tokenIdToStateHash[tokenId] = _newStateHash;
        while (tokenIdToTokenOwner[tokenId] == address(this)) {
            tokenId = childTokenOwner[address(this)][tokenId];
            _newStateHash = uint256(
                keccak256(
                    abi.encodePacked(
                        tokenIdToStateHash[tokenId],
                        uint256(uint160(address(this))),
                        _newStateHash
                    )
                )
            );
            tokenIdToStateHash[tokenId] = _newStateHash;
        }
    }

    function stateHash(uint256 tokenId) public view returns (uint256) {
        uint256 _stateHash = tokenIdToStateHash[tokenId];
        require(_stateHash > 0, "CTD: stateHash of _tokenId is zero");
        return _stateHash;
    }

    /**
     * @dev See {safeTransferFrom}.
     * Check the state hash and call safeTransferFrom.
     */
    function safeCheckedTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        uint256 expectedStateHash
    ) external {
        require(
            expectedStateHash == tokenIdToStateHash[tokenId],
            "CTD: stateHash mismatch (1)"
        );
        safeTransferFrom(from, to, tokenId);
    }

    /**
     * @dev See {transferFrom}.
     * Check the state hash and call transferFrom.
     */
    function checkedTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        uint256 expectedStateHash
    ) external {
        require(
            expectedStateHash == tokenIdToStateHash[tokenId],
            "CTD: stateHash mismatch (2)"
        );
        transferFrom(from, to, tokenId);
    }

    /**
     * @dev See {safeTransferFrom}.
     * Check the state hash and call safeTransferFrom.
     */
    function safeCheckedTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        uint256 expectedStateHash,
        bytes calldata data
    ) external {
        require(
            expectedStateHash == tokenIdToStateHash[tokenId],
            "CTD: stateHash mismatch (3)"
        );
        safeTransferFrom(from, to, tokenId, data);
    }
}

File 3 of 17: Context.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.3.2 (utils/Context.sol)

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 4 of 17: EnumerableSet.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.3.2 (utils/structs/EnumerableSet.sol)

pragma solidity ^0.8.0;

/**
 * @dev Library for managing
 * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive
 * types.
 *
 * Sets have the following properties:
 *
 * - Elements are added, removed, and checked for existence in constant time
 * (O(1)).
 * - Elements are enumerated in O(n). No guarantees are made on the ordering.
 *
 * ```
 * contract Example {
 *     // Add the library methods
 *     using EnumerableSet for EnumerableSet.AddressSet;
 *
 *     // Declare a set state variable
 *     EnumerableSet.AddressSet private mySet;
 * }
 * ```
 *
 * As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`)
 * and `uint256` (`UintSet`) are supported.
 */
library EnumerableSet {
    // To implement this library for multiple types with as little code
    // repetition as possible, we write it in terms of a generic Set type with
    // bytes32 values.
    // The Set implementation uses private functions, and user-facing
    // implementations (such as AddressSet) are just wrappers around the
    // underlying Set.
    // This means that we can only create new EnumerableSets for types that fit
    // in bytes32.

    struct Set {
        // Storage of set values
        bytes32[] _values;
        // Position of the value in the `values` array, plus 1 because index 0
        // means a value is not in the set.
        mapping(bytes32 => uint256) _indexes;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function _add(Set storage set, bytes32 value) private returns (bool) {
        if (!_contains(set, value)) {
            set._values.push(value);
            // The value is stored at length-1, but we add 1 to all indexes
            // and use 0 as a sentinel value
            set._indexes[value] = set._values.length;
            return true;
        } else {
            return false;
        }
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function _remove(Set storage set, bytes32 value) private returns (bool) {
        // We read and store the value's index to prevent multiple reads from the same storage slot
        uint256 valueIndex = set._indexes[value];

        if (valueIndex != 0) {
            // Equivalent to contains(set, value)
            // To delete an element from the _values array in O(1), we swap the element to delete with the last one in
            // the array, and then remove the last element (sometimes called as 'swap and pop').
            // This modifies the order of the array, as noted in {at}.

            uint256 toDeleteIndex = valueIndex - 1;
            uint256 lastIndex = set._values.length - 1;

            if (lastIndex != toDeleteIndex) {
                bytes32 lastvalue = set._values[lastIndex];

                // Move the last value to the index where the value to delete is
                set._values[toDeleteIndex] = lastvalue;
                // Update the index for the moved value
                set._indexes[lastvalue] = valueIndex; // Replace lastvalue's index to valueIndex
            }

            // Delete the slot where the moved value was stored
            set._values.pop();

            // Delete the index for the deleted slot
            delete set._indexes[value];

            return true;
        } else {
            return false;
        }
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function _contains(Set storage set, bytes32 value)
        private
        view
        returns (bool)
    {
        return set._indexes[value] != 0;
    }

    /**
     * @dev Returns the number of values on the set. O(1).
     */
    function _length(Set storage set) private view returns (uint256) {
        return set._values.length;
    }

    /**
     * @dev Returns the value stored at position `index` in the set. O(1).
     *
     * Note that there are no guarantees on the ordering of values inside the
     * array, and it may change when more values are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function _at(Set storage set, uint256 index)
        private
        view
        returns (bytes32)
    {
        return set._values[index];
    }

    /**
     * @dev Return the entire set in an array
     *
     * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
     * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
     * this function has an unbounded cost, and using it as part of a state-changing function may render the function
     * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
     */
    function _values(Set storage set) private view returns (bytes32[] memory) {
        return set._values;
    }

    // Bytes32Set

    struct Bytes32Set {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(Bytes32Set storage set, bytes32 value)
        internal
        returns (bool)
    {
        return _add(set._inner, value);
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(Bytes32Set storage set, bytes32 value)
        internal
        returns (bool)
    {
        return _remove(set._inner, value);
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(Bytes32Set storage set, bytes32 value)
        internal
        view
        returns (bool)
    {
        return _contains(set._inner, value);
    }

    /**
     * @dev Returns the number of values in the set. O(1).
     */
    function length(Bytes32Set storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

    /**
     * @dev Returns the value stored at position `index` in the set. O(1).
     *
     * Note that there are no guarantees on the ordering of values inside the
     * array, and it may change when more values are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function at(Bytes32Set storage set, uint256 index)
        internal
        view
        returns (bytes32)
    {
        return _at(set._inner, index);
    }

    /**
     * @dev Return the entire set in an array
     *
     * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
     * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
     * this function has an unbounded cost, and using it as part of a state-changing function may render the function
     * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
     */
    function values(Bytes32Set storage set)
        internal
        view
        returns (bytes32[] memory)
    {
        return _values(set._inner);
    }

    // AddressSet

    struct AddressSet {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(AddressSet storage set, address value)
        internal
        returns (bool)
    {
        return _add(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(AddressSet storage set, address value)
        internal
        returns (bool)
    {
        return _remove(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(AddressSet storage set, address value)
        internal
        view
        returns (bool)
    {
        return _contains(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Returns the number of values in the set. O(1).
     */
    function length(AddressSet storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

    /**
     * @dev Returns the value stored at position `index` in the set. O(1).
     *
     * Note that there are no guarantees on the ordering of values inside the
     * array, and it may change when more values are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function at(AddressSet storage set, uint256 index)
        internal
        view
        returns (address)
    {
        return address(uint160(uint256(_at(set._inner, index))));
    }

    /**
     * @dev Return the entire set in an array
     *
     * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
     * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
     * this function has an unbounded cost, and using it as part of a state-changing function may render the function
     * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
     */
    function values(AddressSet storage set)
        internal
        view
        returns (address[] memory)
    {
        bytes32[] memory store = _values(set._inner);
        address[] memory result;

        assembly {
            result := store
        }

        return result;
    }

    // UintSet

    struct UintSet {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(UintSet storage set, uint256 value) internal returns (bool) {
        return _add(set._inner, bytes32(value));
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(UintSet storage set, uint256 value)
        internal
        returns (bool)
    {
        return _remove(set._inner, bytes32(value));
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(UintSet storage set, uint256 value)
        internal
        view
        returns (bool)
    {
        return _contains(set._inner, bytes32(value));
    }

    /**
     * @dev Returns the number of values on the set. O(1).
     */
    function length(UintSet storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

    /**
     * @dev Returns the value stored at position `index` in the set. O(1).
     *
     * Note that there are no guarantees on the ordering of values inside the
     * array, and it may change when more values are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function at(UintSet storage set, uint256 index)
        internal
        view
        returns (uint256)
    {
        return uint256(_at(set._inner, index));
    }

    /**
     * @dev Return the entire set in an array
     *
     * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
     * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
     * this function has an unbounded cost, and using it as part of a state-changing function may render the function
     * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
     */
    function values(UintSet storage set)
        internal
        view
        returns (uint256[] memory)
    {
        bytes32[] memory store = _values(set._inner);
        uint256[] memory result;

        assembly {
            result := store
        }

        return result;
    }
}

File 5 of 17: ERC165.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.3.2 (utils/introspection/ERC165.sol)

pragma solidity ^0.8.0;

import "./IERC165.sol";

/**
 * @dev Implementation of the {IERC165} interface.
 *
 * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
 * for the additional interface id that will be supported. For example:
 *
 * ```solidity
 * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
 *     return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
 * }
 * ```
 *
 * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.
 */
abstract contract ERC165 is IERC165 {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId)
        public
        view
        virtual
        override
        returns (bool)
    {
        return interfaceId == type(IERC165).interfaceId;
    }
}

File 6 of 17: IERC165.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.3.2 (utils/introspection/IERC165.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC165 standard, as defined in the
 * https://eips.ethereum.org/EIPS/eip-165[EIP].
 *
 * Implementers can declare support of contract interfaces, which can then be
 * queried by others ({ERC165Checker}).
 *
 * For an implementation, see {ERC165}.
 */
interface IERC165 {
    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}

File 7 of 17: IERC721.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.3.2 (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;

import "./IERC165.sol";

/**
 * @dev Required interface of an ERC721 compliant contract.
 */
interface IERC721 is IERC165 {
    /**
     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.
     */
    event Transfer(
        address indexed from,
        address indexed to,
        uint256 indexed tokenId
    );

    /**
     * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
     */
    event Approval(
        address indexed owner,
        address indexed approved,
        uint256 indexed tokenId
    );

    /**
     * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.
     */
    event ApprovalForAll(
        address indexed owner,
        address indexed operator,
        bool approved
    );

    /**
     * @dev Returns the number of tokens in ``owner``'s account.
     */
    function balanceOf(address owner) external view returns (uint256 balance);

    /**
     * @dev Returns the owner of the `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function ownerOf(uint256 tokenId) external view returns (address owner);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Transfers `tokenId` token from `from` to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Gives permission to `to` to transfer `tokenId` token to another account.
     * The approval is cleared when the token is transferred.
     *
     * Only a single account can be approved at a time, so approving the zero address clears previous approvals.
     *
     * Requirements:
     *
     * - The caller must own the token or be an approved operator.
     * - `tokenId` must exist.
     *
     * Emits an {Approval} event.
     */
    function approve(address to, uint256 tokenId) external;

    /**
     * @dev Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId)
        external
        view
        returns (address operator);

    /**
     * @dev Approve or remove `operator` as an operator for the caller.
     * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
     *
     * Requirements:
     *
     * - The `operator` cannot be the caller.
     *
     * Emits an {ApprovalForAll} event.
     */
    function setApprovalForAll(address operator, bool _approved) external;

    /**
     * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
     *
     * See {setApprovalForAll}
     */
    function isApprovedForAll(address owner, address operator)
        external
        view
        returns (bool);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes calldata data
    ) external;
}

File 8 of 17: IERC721Metadata.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.3.2 (token/ERC721/extensions/IERC721Metadata.sol)

pragma solidity ^0.8.0;

import "./IERC721.sol";

/**
 * @title ERC-721 Non-Fungible Token Standard, optional metadata extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Metadata is IERC721 {
    /**
     * @dev Returns the token collection name.
     */
    function name() external view returns (string memory);

    /**
     * @dev Returns the token collection symbol.
     */
    function symbol() external view returns (string memory);

    /**
     * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
     */
    function tokenURI(uint256 tokenId) external view returns (string memory);
}

File 9 of 17: IERC721Receiver.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.3.2 (token/ERC721/IERC721Receiver.sol)

pragma solidity ^0.8.0;

/**
 * @title ERC721 token receiver interface
 * @dev Interface for any contract that wants to support safeTransfers
 * from ERC721 asset contracts.
 */
interface IERC721Receiver {
    /**
     * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}
     * by `operator` from `from`, this function is called.
     *
     * It must return its Solidity selector to confirm the token transfer.
     * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.
     *
     * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`.
     */
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

File 10 of 17: IERC721ReceiverOld.sol
// SPDX-License-Identifier: UNLICENSED

pragma solidity ^0.8.0;

/**
 * @title ERC721 token receiver interface
 * @dev Interface for any contract that wants to support safeTransfers
 * from ERC721 asset contracts.
 */
interface IERC721ReceiverOld {
    /**
     * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}
     * by `operator` from `from`, this function is called.
     *
     * It must return its Solidity selector to confirm the token transfer.
     * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.
     *
     * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`.
     */
    function onERC721Received(address from, uint256 tokenId, bytes calldata data) external returns (bytes4);
}

File 11 of 17: IERC998ERC721BottomUp.sol
// SPDX-License-Identifier: UNLICENSED

pragma solidity ^0.8.0;

interface IERC998ERC721BottomUp {
    event TransferToParent(
        address indexed _toContract,
        uint256 indexed _toTokenId,
        uint256 _tokenId
    );
    event TransferFromParent(
        address indexed _fromContract,
        uint256 indexed _fromTokenId,
        uint256 _tokenId
    );

    function rootOwnerOf(uint256 _tokenId)
        external
        view
        returns (bytes32 rootOwner);

    /**
     * The tokenOwnerOf function gets the owner of the _tokenId which can be a user address or another ERC721 token.
     * The tokenOwner address return value can be either a user address or an ERC721 contract address.
     * If the tokenOwner address is a user address then parentTokenId will be 0 and should not be used or considered.
     * If tokenOwner address is a user address then isParent is false, otherwise isChild is true, which means that
     * tokenOwner is an ERC721 contract address and _tokenId is a child of tokenOwner and parentTokenId.
     */
    function tokenOwnerOf(uint256 _tokenId)
        external
        view
        returns (
            bytes32 tokenOwner,
            uint256 parentTokenId,
            bool isParent
        );

    // Transfers _tokenId as a child to _toContract and _toTokenId
    function transferToParent(
        address _from,
        address _toContract,
        uint256 _toTokenId,
        uint256 _tokenId,
        bytes memory _data
    ) external;

    // Transfers _tokenId from a parent ERC721 token to a user address.
    function transferFromParent(
        address _fromContract,
        uint256 _fromTokenId,
        address _to,
        uint256 _tokenId,
        bytes memory _data
    ) external;

    // Transfers _tokenId from a parent ERC721 token to a parent ERC721 token.
    function transferAsChild(
        address _fromContract,
        uint256 _fromTokenId,
        address _toContract,
        uint256 _toTokenId,
        uint256 _tokenId,
        bytes memory _data
    ) external;
}

File 12 of 17: IERC998ERC721BottomUpEnumerable.sol
// SPDX-License-Identifier: UNLICENSED

pragma solidity ^0.8.0;

interface IERC998ERC721BottomUpEnumerable {
    function totalChildTokens(address _parentContract, uint256 _parentTokenId)
        external
        view
        returns (uint256);

    function childTokenByIndex(
        address _parentContract,
        uint256 _parentTokenId,
        uint256 _index
    ) external view returns (uint256);
}

File 13 of 17: IERC998ERC721TopDown.sol
// SPDX-License-Identifier: UNLICENSED

pragma solidity ^0.8.0;

interface IERC998ERC721TopDown {
    event ReceivedChild(
        address indexed _from,
        uint256 indexed _tokenId,
        address indexed _childContract,
        uint256 _childTokenId
    );
    event TransferChild(
        uint256 indexed tokenId,
        address indexed _to,
        address indexed _childContract,
        uint256 _childTokenId
    );

    function rootOwnerOf(uint256 _tokenId)
        external
        view
        returns (bytes32 rootOwner);

    function rootOwnerOfChild(address _childContract, uint256 _childTokenId)
        external
        view
        returns (bytes32 rootOwner);

    function ownerOfChild(address _childContract, uint256 _childTokenId)
        external
        view
        returns (bytes32 parentTokenOwner, uint256 parentTokenId);

    function onERC721Received(
        address _operator,
        address _from,
        uint256 _childTokenId,
        bytes calldata _data
    ) external returns (bytes4);

    function transferChild(
        uint256 _fromTokenId,
        address _to,
        address _childContract,
        uint256 _childTokenId
    ) external;

    function safeTransferChild(
        uint256 _fromTokenId,
        address _to,
        address _childContract,
        uint256 _childTokenId
    ) external;

    function safeTransferChild(
        uint256 _fromTokenId,
        address _to,
        address _childContract,
        uint256 _childTokenId,
        bytes memory _data
    ) external;

    function transferChildToParent(
        uint256 _fromTokenId,
        address _toContract,
        uint256 _toTokenId,
        address _childContract,
        uint256 _childTokenId,
        bytes memory _data
    ) external;

    // getChild function enables older contracts like cryptokitties to be transferred into a composable
    // The _childContract must approve this contract. Then getChild can be called.
    function getChild(
        address _from,
        uint256 _tokenId,
        address _childContract,
        uint256 _childTokenId
    ) external;
}

File 14 of 17: IERC998ERC721TopDownEnumerable.sol
// SPDX-License-Identifier: UNLICENSED

pragma solidity ^0.8.0;

interface IERC998ERC721TopDownEnumerable {
    function totalChildContracts(uint256 _tokenId)
        external
        view
        returns (uint256);

    function childContractByIndex(uint256 _tokenId, uint256 _index)
        external
        view
        returns (address childContract);

    function totalChildTokens(uint256 _tokenId, address _childContract)
        external
        view
        returns (uint256);

    function childTokenByIndex(
        uint256 _tokenId,
        address _childContract,
        uint256 _index
    ) external view returns (uint256 childTokenId);
}

File 16 of 17: Ownable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.3.2 (access/Ownable.sol)

pragma solidity ^0.8.0;

import "./Context.sol";

/**
 * @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() {
        _transferOwnership(_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 {
        _transferOwnership(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"
        );
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

File 17 of 17: Strings.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.3.2 (utils/Strings.sol)

pragma solidity ^0.8.0;

/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        // Inspired by OraclizeAPI's implementation - MIT licence
        // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol

        if (value == 0) {
            return "0";
        }
        uint256 temp = value;
        uint256 digits;
        while (temp != 0) {
            digits++;
            temp /= 10;
        }
        bytes memory buffer = new bytes(digits);
        while (value != 0) {
            digits -= 1;
            buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
            value /= 10;
        }
        return string(buffer);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        if (value == 0) {
            return "0x00";
        }
        uint256 temp = value;
        uint256 length = 0;
        while (temp != 0) {
            length++;
            temp >>= 8;
        }
        return toHexString(value, length);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
     */
    function toHexString(uint256 value, uint256 length)
        internal
        pure
        returns (string memory)
    {
        bytes memory buffer = new bytes(2 * length + 2);
        buffer[0] = "0";
        buffer[1] = "x";
        for (uint256 i = 2 * length + 1; i > 1; --i) {
            buffer[i] = _HEX_SYMBOLS[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"string","name":"_uri","type":"string"},{"internalType":"string","name":"_subUri","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"tokenOwner","type":"address"}],"name":"MetaBoomPop","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":true,"internalType":"uint256","name":"_tokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"_childContract","type":"address"},{"indexed":false,"internalType":"uint256","name":"_childTokenId","type":"uint256"}],"name":"ReceivedChild","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":true,"internalType":"address","name":"_childContract","type":"address"},{"indexed":false,"internalType":"uint256","name":"_childTokenId","type":"uint256"}],"name":"TransferChild","type":"event"},{"inputs":[{"internalType":"address[]","name":"_accounts","type":"address[]"}],"name":"addBatchAirDropList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_accounts","type":"address[]"}],"name":"addBatchWhiteList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"airDropList","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"airDropMaxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_approved","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenOwner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseTokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"expectedStateHash","type":"uint256"}],"name":"checkedTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_index","type":"uint256"}],"name":"childContractByIndex","outputs":[{"internalType":"address","name":"childContract","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"childContractOfToken","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_childContract","type":"address"},{"internalType":"uint256","name":"_childTokenId","type":"uint256"}],"name":"childExists","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"address","name":"_childContract","type":"address"},{"internalType":"uint256","name":"_index","type":"uint256"}],"name":"childTokenByIndex","outputs":[{"internalType":"uint256","name":"childTokenId","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"address","name":"_childAddr","type":"address"}],"name":"childTokensOfChildContract","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claimAirdrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"claimed","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"address","name":"_childContract","type":"address"},{"internalType":"uint256","name":"_childTokenId","type":"uint256"}],"name":"getChild","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getTokenCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"holdedNumAry","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"_operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"_from","type":"address"},{"internalType":"uint256","name":"_childTokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"onERC721Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"uint256","name":"_childTokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"onERC721Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"}],"name":"ownerMInt","outputs":[{"internalType":"uint256","name":"tokenId_","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"tokenOwner","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_childContract","type":"address"},{"internalType":"uint256","name":"_childTokenId","type":"uint256"}],"name":"ownerOfChild","outputs":[{"internalType":"bytes32","name":"parentTokenOwner","type":"bytes32"},{"internalType":"uint256","name":"parentTokenId","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pauseSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"prePaidNumAry","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"_purchaseNum","type":"uint8"}],"name":"preSale","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"preSaleTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"_purchaseNum","type":"uint8"}],"name":"publicSale","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"publicSaleTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"rootOwnerOf","outputs":[{"internalType":"bytes32","name":"rootOwner","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_childContract","type":"address"},{"internalType":"uint256","name":"_childTokenId","type":"uint256"}],"name":"rootOwnerOfChild","outputs":[{"internalType":"bytes32","name":"rootOwner","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"expectedStateHash","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeCheckedTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"expectedStateHash","type":"uint256"}],"name":"safeCheckedTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_fromTokenId","type":"uint256"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"address","name":"_childContract","type":"address"},{"internalType":"uint256","name":"_childTokenId","type":"uint256"}],"name":"safeTransferChild","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_fromTokenId","type":"uint256"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"address","name":"_childContract","type":"address"},{"internalType":"uint256","name":"_childTokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferChild","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_operator","type":"address"},{"internalType":"bool","name":"_approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_time","type":"uint256"}],"name":"setPreSaleTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_time","type":"uint256"}],"name":"setPublicSaleTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_subURI","type":"string"}],"name":"setSubURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"string","name":"_tokenURI","type":"string"}],"name":"setTokenURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"stateHash","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"subTokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalAirDrop","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"totalChildContracts","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"address","name":"_childContract","type":"address"}],"name":"totalChildTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_fromTokenId","type":"uint256"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"address","name":"_childContract","type":"address"},{"internalType":"uint256","name":"_childTokenId","type":"uint256"}],"name":"transferChild","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_fromTokenId","type":"uint256"},{"internalType":"address","name":"_toContract","type":"address"},{"internalType":"uint256","name":"_toTokenId","type":"uint256"},{"internalType":"address","name":"_childContract","type":"address"},{"internalType":"uint256","name":"_childTokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"transferChildToParent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whiteList","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526000808055600d819055600e556011805460ff1916905563618dcaa060125563619310a06013553480156200003857600080fd5b506040516200594b3803806200594b8339810160408190526200005b9162000284565b8351849084906200007490600790602085019062000133565b5080516200008a90600890602084019062000133565b505050620000a7620000a1620000dd60201b60201c565b620000e1565b8151620000bc90600f90602085019062000133565b508051620000d290601090602084019062000133565b50505050506200038b565b3390565b600c80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b828054620001419062000338565b90600052602060002090601f016020900481019282620001655760008555620001b0565b82601f106200018057805160ff1916838001178555620001b0565b82800160010185558215620001b0579182015b82811115620001b057825182559160200191906001019062000193565b50620001be929150620001c2565b5090565b5b80821115620001be5760008155600101620001c3565b600082601f830112620001ea578081fd5b81516001600160401b038082111562000207576200020762000375565b6040516020601f8401601f19168201810183811183821017156200022f576200022f62000375565b604052838252858401810187101562000246578485fd5b8492505b838310156200026957858301810151828401820152918201916200024a565b838311156200027a57848185840101525b5095945050505050565b600080600080608085870312156200029a578384fd5b84516001600160401b0380821115620002b1578586fd5b620002bf88838901620001d9565b95506020870151915080821115620002d5578485fd5b620002e388838901620001d9565b94506040870151915080821115620002f9578384fd5b6200030788838901620001d9565b935060608701519150808211156200031d578283fd5b506200032c87828801620001d9565b91505092959194509250565b6002810460018216806200034d57607f821691505b602082108114156200036f57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052604160045260246000fd5b6155b0806200039b6000396000f3fe6080604052600436106103fa5760003560e01c80636352211e11610213578063a035b1fe11610123578063d547cfb7116100ab578063eadb80b81161007a578063eadb80b814610b92578063ed81cdda14610bc0578063f0b9e5ba14610be0578063f2fde38b14610c00578063fb6b18c014610c20576103fa565b8063d547cfb714610b28578063d59ef39914610b3d578063d5abeb0114610b5d578063e985e9c514610b72576103fa565b8063bef44f18116100f2578063bef44f1814610a93578063c44af6c514610ab3578063c87b56dd14610ad3578063c884ef8314610af3578063d1058e5914610b13576103fa565b8063a035b1fe14610a1e578063a22cb46514610a33578063b88d4fde14610a53578063ba6b5f9614610a73576103fa565b80638462151c116101a65780638dc3d0c0116101755780638dc3d0c01461099457806395d89b41146109b4578063974bcad2146109c95780639bca5f95146109de5780639c2b1b7a146109fe576103fa565b80638462151c146109125780638d81f51e1461093f5780638da5cb5b1461095f5780638da7d0b514610974576103fa565b806378a89567116101e257806378a895671461088357806379eda541146108985780637b7b6c05146108b85780637be2e789146108e5576103fa565b80636352211e1461080e57806370a082311461082e578063715018a61461084e57806372c985cb14610863576103fa565b806323b872dd1161030e57806343a61a8e116102a157806355f804b31161027057806355f804b31461078f5780635680a3ad146107af5780635b88349d146107cf5780635c975abb146107e45780635f3cb6ab146107f9576103fa565b806343a61a8e1461072757806348caf7ef146107475780634ff338161461075a57806355367ba91461077a576103fa565b8063372c12b1116102dd578063372c12b1146106b25780633cc8cf1e146106d25780633ccfd60b146106f257806342842e0e14610707576103fa565b806323b872dd1461063d57806325a301451461065d5780632f745c591461067257806335b21ceb14610692576103fa565b806311b7e5e71161039157806318160ddd1161036057806318160ddd146105c05780631bcc80ac146105d55780631c5481e2146105e85780631d98f3c5146106085780632344be0a14610628576103fa565b806311b7e5e714610526578063150b7a0214610546578063160b01a114610573578063162094c4146105a0576103fa565b8063095ea7b3116103cd578063095ea7b3146104a65780630d5a621b146104c65780630d5bedc6146104e65780630f0e4f7314610506576103fa565b806301ffc9a7146103ff57806306fdde0314610435578063081812fc1461045757806308937f6214610484575b600080fd5b34801561040b57600080fd5b5061041f61041a3660046142e2565b610c35565b60405161042c919061483c565b60405180910390f35b34801561044157600080fd5b5061044a610cb3565b60405161042c9190614865565b34801561046357600080fd5b5061047761047236600461434c565b610d45565b60405161042c9190614697565b34801561049057600080fd5b506104a461049f366004614458565b610d7f565b005b3480156104b257600080fd5b506104a46104c1366004614149565b610e45565b3480156104d257600080fd5b506104776104e1366004614517565b610f17565b3480156104f257600080fd5b5061041f610501366004613ece565b610f38565b34801561051257600080fd5b506104a461052136600461434c565b610f4d565b34801561053257600080fd5b506104a461054136600461434c565b610f91565b34801561055257600080fd5b50610566610561366004613f85565b610fd5565b60405161042c9190614850565b34801561057f57600080fd5b5061059361058e366004614432565b6110fd565b60405161042c9190614847565b3480156105ac57600080fd5b506104a46105bb3660046144d3565b611131565b3480156105cc57600080fd5b50610593611194565b6104a46105e3366004614538565b61119a565b3480156105f457600080fd5b506104a461060336600461405e565b61139a565b34801561061457600080fd5b506104a4610623366004614388565b6113d8565b34801561063457600080fd5b50610593611498565b34801561064957600080fd5b506104a4610658366004613f45565b61149e565b34801561066957600080fd5b506105936114a9565b34801561067e57600080fd5b5061059361068d366004614149565b6114af565b34801561069e57600080fd5b506105936106ad366004614364565b6114d1565b3480156106be57600080fd5b5061041f6106cd366004613ece565b6114fc565b3480156106de57600080fd5b506104a46106ed3660046140a3565b611511565b3480156106fe57600080fd5b506104a4611588565b34801561071357600080fd5b506104a4610722366004613f45565b61160a565b34801561073357600080fd5b5061059361074236600461434c565b6116fe565b6104a4610755366004614538565b61170b565b34801561076657600080fd5b5061059361077536600461434c565b611795565b34801561078657600080fd5b506104a46117c1565b34801561079b57600080fd5b506104a46107aa36600461431a565b611814565b3480156107bb57600080fd5b5061041f6107ca366004614149565b61186a565b3480156107db57600080fd5b506104a4611894565b3480156107f057600080fd5b5061041f611a24565b34801561080557600080fd5b5061044a611a2d565b34801561081a57600080fd5b5061047761082936600461434c565b611abb565b34801561083a57600080fd5b50610593610849366004613ece565b611af0565b34801561085a57600080fd5b506104a4611b34565b34801561086f57600080fd5b506104a461087e366004614214565b611b7f565b34801561088f57600080fd5b50610593611c34565b3480156108a457600080fd5b506104a46108b336600461405e565b611c3a565b3480156108c457600080fd5b506108d86108d336600461434c565b611c72565b60405161042c91906147b7565b3480156108f157600080fd5b50610905610900366004613ece565b611d7e565b60405161042c919061536e565b34801561091e57600080fd5b5061093261092d366004613ece565b611d93565b60405161042c9190614804565b34801561094b57600080fd5b506104a461095a3660046143bf565b611e54565b34801561096b57600080fd5b50610477611f17565b34801561098057600080fd5b5061059361098f36600461434c565b611f26565b3480156109a057600080fd5b506104a46109af36600461431a565b611f3d565b3480156109c057600080fd5b5061044a611f8f565b3480156109d557600080fd5b50610593611f9e565b3480156109ea57600080fd5b506109326109f9366004614364565b611fa4565b348015610a0a57600080fd5b50610905610a19366004613ece565b612080565b348015610a2a57600080fd5b50610593612095565b348015610a3f57600080fd5b506104a4610a4e36600461411c565b6120a0565b348015610a5f57600080fd5b506104a4610a6e366004613ff5565b612135565b348015610a7f57600080fd5b506104a4610a8e366004614174565b612234565b348015610a9f57600080fd5b506104a4610aae366004614388565b6123ed565b348015610abf57600080fd5b506104a4610ace366004614214565b6124f1565b348015610adf57600080fd5b5061044a610aee36600461434c565b612656565b348015610aff57600080fd5b50610905610b0e366004613ece565b6126e7565b348015610b1f57600080fd5b506104a46126fc565b348015610b3457600080fd5b5061044a6128b6565b348015610b4957600080fd5b50610593610b58366004613ece565b6128c3565b348015610b6957600080fd5b50610593612a53565b348015610b7e57600080fd5b5061041f610b8d366004613f0d565b612a59565b348015610b9e57600080fd5b50610bb2610bad366004614149565b612ad6565b60405161042c929190614673565b348015610bcc57600080fd5b50610593610bdb366004614149565b612b41565b348015610bec57600080fd5b50610566610bfb3660046141bb565b612cd3565b348015610c0c57600080fd5b506104a4610c1b366004613ece565b612dfa565b348015610c2c57600080fd5b50610593612e68565b60006001600160e01b031982166380ac58cd60e01b1480610c6657506001600160e01b0319821663cde244d960e01b145b80610c8157506001600160e01b031982166328d12bf960e21b145b80610c9c57506306f2657960e21b6001600160e01b03198316145b80610cab5750610cab82612e6e565b90505b919050565b606060078054610cc29061547b565b80601f0160208091040260200160405190810160405280929190818152602001828054610cee9061547b565b8015610d3b5780601f10610d1057610100808354040283529160200191610d3b565b820191906000526020600020905b815481529060010190602001808311610d1e57829003601f168201915b5050505050905090565b600080610d51836116fe565b6001600160a01b03908116600090815260046020908152604080832087845290915290205416915050919050565b610d8b86868585612e87565b6040516307a8567d60e51b81526001600160a01b0384169063f50acfa090610dbf9030908990899088908890600401614759565b600060405180830381600087803b158015610dd957600080fd5b505af1158015610ded573d6000803e3d6000fd5b50505050826001600160a01b0316856001600160a01b0316877f0ef52e516fb5aec15a5d3587e5480481b702b26db93c8430eca78b61990fd3f685604051610e359190614847565b60405180910390a4505050505050565b6000610e50826116fe565b90506001600160a01b038116331480610e8c57506001600160a01b038116600090815260066020908152604080832033845290915290205460ff165b610eb15760405162461bcd60e51b8152600401610ea890614dcc565b60405180910390fd5b6001600160a01b03818116600081815260046020908152604080832087845290915280822080546001600160a01b031916948816948517905551859392917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6000828152600960205260408120610f2f9083612faa565b90505b92915050565b60146020526000908152604090205460ff1681565b610f55612fb6565b6001600160a01b0316610f66611f17565b6001600160a01b031614610f8c5760405162461bcd60e51b8152600401610ea890614fcc565b601255565b610f99612fb6565b6001600160a01b0316610faa611f17565b6001600160a01b031614610fd05760405162461bcd60e51b8152600401610ea890614fcc565b601355565b600081610ff45760405162461bcd60e51b8152600401610ea890615216565b600061103584848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250612fba92505050565b905061104386823388612fec565b6040516331a9108f60e11b81526000903390636352211e90611069908990600401614847565b60206040518083038186803b15801561108157600080fd5b505afa158015611095573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110b99190613ef1565b6001600160a01b031614156110e05760405162461bcd60e51b8152600401610ea890615162565b6110e9816116fe565b50630a85bd0160e11b979650505050505050565b6000838152600a602090815260408083206001600160a01b038616845290915281206111299083612faa565b949350505050565b611139612fb6565b6001600160a01b031661114a611f17565b6001600160a01b0316146111705760405162461bcd60e51b8152600401610ea890614fcc565b6000828152601960209081526040909120825161118f92840190613d8c565b505050565b600d5481565b60115460ff16156111bd5760405162461bcd60e51b8152600401610ea8906150a6565b6013544210156111df5760405162461bcd60e51b8152600401610ea890614ca6565b6111ed61012c611388615421565b8160ff16600d546111fe91906153b1565b111561121c5760405162461bcd60e51b8152600401610ea890614cdb565b6005816017600061122b612fb6565b6001600160a01b03168152602081019190915260400160002054611252919060ff166153c9565b60ff1611156112735760405162461bcd60e51b8152600401610ea8906150dd565b61128760ff821666b1a2bc2ec50000615402565b3410156112a65760405162461bcd60e51b8152600401610ea890614a49565b80601760006112b3612fb6565b6001600160a01b031681526020810191909152604001600020546112da919060ff166153c9565b601760006112e6612fb6565b6001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548160ff021916908360ff160217905550806016600061132b612fb6565b6001600160a01b03168152602081019190915260400160002054611352919060ff166153c9565b6016600061135e612fb6565b6001600160a01b031681526020810191909152604001600020805460ff191660ff928316179055600d54611394918316906153b1565b600d5550565b60008281526003602052604090205481146113c75760405162461bcd60e51b8152600401610ea890614c01565b6113d284848461149e565b50505050565b6113e484848484612e87565b604051632142170760e11b81526001600160a01b038316906342842e0e90611414903090879086906004016146c5565b600060405180830381600087803b15801561142e57600080fd5b505af1158015611442573d6000803e3d6000fd5b50505050816001600160a01b0316836001600160a01b0316857f0ef52e516fb5aec15a5d3587e5480481b702b26db93c8430eca78b61990fd3f68460405161148a9190614847565b60405180910390a450505050565b60135481565b61118f83838361318b565b60125481565b6001600160a01b0382166000908152600260205260408120610f2f9083612faa565b6000828152600a602090815260408083206001600160a01b03851684529091528120610f2f90613579565b60156020526000908152604090205460ff1681565b600084815260036020526040902054831461153e5760405162461bcd60e51b8152600401610ea8906148e8565b61158086868685858080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061213592505050565b505050505050565b611590612fb6565b6001600160a01b03166115a1611f17565b6001600160a01b0316146115c75760405162461bcd60e51b8152600401610ea890614fcc565b6115cf611f17565b6001600160a01b03166108fc479081150290604051600060405180830381858888f19350505050158015611607573d6000803e3d6000fd5b50565b61161583838361318b565b611627826001600160a01b0316613584565b1561118f57604051630a85bd0160e11b81526000906001600160a01b0384169063150b7a029061165f90339088908790600401614726565b602060405180830381600087803b15801561167957600080fd5b505af115801561168d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116b191906142fe565b90506001600160e01b0319811663785cf2dd60e11b14806116e257506001600160e01b03198116630a85bd0160e11b145b6113d25760405162461bcd60e51b8152600401610ea890615299565b6000610cab600083612b41565b60156000611717612fb6565b6001600160a01b0316815260208101919091526040016000205460ff166117505760405162461bcd60e51b8152600401610ea89061532d565b60115460ff16156117735760405162461bcd60e51b8152600401610ea8906150a6565b6012544210156111df5760405162461bcd60e51b8152600401610ea890614c6f565b60008181526003602052604081205480610cab5760405162461bcd60e51b8152600401610ea8906148a6565b6117c9612fb6565b6001600160a01b03166117da611f17565b6001600160a01b0316146118005760405162461bcd60e51b8152600401610ea890614fcc565b6011805460ff19811660ff90911615179055565b61181c612fb6565b6001600160a01b031661182d611f17565b6001600160a01b0316146118535760405162461bcd60e51b8152600401610ea890614fcc565b805161186690600f906020840190613d8c565b5050565b6001600160a01b03919091166000908152600b602090815260408083209383529290522054151590565b601460006118a0612fb6565b6001600160a01b0316815260208101919091526040016000205460ff166118d95760405162461bcd60e51b8152600401610ea890614e0d565b6012544210156118fb5760405162461bcd60e51b8152600401610ea8906149c2565b600061190d611908612fb6565b61358a565b905060006014600061191d612fb6565b6001600160a01b031681526020810191909152604001600020805460ff191691151591909117905561194d612fb6565b6001600160a01b0316817ff5c58aa1a71554b75cd1bdc5003a01577d315f9ff19419b33f1aced2815b78ac60405160405180910390a36017600061198f612fb6565b6001600160a01b0316815260208101919091526040016000908120805460ff16916119b9836154cb565b91906101000a81548160ff021916908360ff16021790555050601860006119de612fb6565b6001600160a01b0316815260208101919091526040016000908120805460ff1691611a08836154cb565b91906101000a81548160ff021916908360ff1602179055505050565b60115460ff1681565b60108054611a3a9061547b565b80601f0160208091040260200160405190810160405280929190818152602001828054611a669061547b565b8015611ab35780601f10611a8857610100808354040283529160200191611ab3565b820191906000526020600020905b815481529060010190602001808311611a9657829003601f168201915b505050505081565b6000818152600160205260409020546001600160a01b031680610cae5760405162461bcd60e51b8152600401610ea890614d12565b60006001600160a01b038216611b185760405162461bcd60e51b8152600401610ea89061497e565b506001600160a01b031660009081526005602052604090205490565b611b3c612fb6565b6001600160a01b0316611b4d611f17565b6001600160a01b031614611b735760405162461bcd60e51b8152600401610ea890614fcc565b611b7d60006136e0565b565b611b87612fb6565b6001600160a01b0316611b98611f17565b6001600160a01b031614611bbe5760405162461bcd60e51b8152600401610ea890614fcc565b60005b815181101561186657600160156000848481518110611bf057634e487b7160e01b600052603260045260246000fd5b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff191691151591909117905580611c2c816154b0565b915050611bc1565b60005490565b6000828152600360205260409020548114611c675760405162461bcd60e51b8152600401610ea89061506f565b6113d284848461160a565b60606000611c7f83611f26565b905080611cbb5760005b604051908082528060200260200182016040528015611cb2578160200160208202803683370190505b50915050610cae565b6000816001600160401b03811115611ce357634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015611d0c578160200160208202803683370190505b50905060005b82811015611d6e57611d248582610f17565b828281518110611d4457634e487b7160e01b600052603260045260246000fd5b6001600160a01b039092166020928302919091019091015280611d66816154b0565b915050611d12565b509150610cae9050565b50919050565b60176020526000908152604090205460ff1681565b60606000611da083611af0565b905080611dae576000611c89565b6000816001600160401b03811115611dd657634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015611dff578160200160208202803683370190505b50905060005b82811015611d6e57611e1785826114af565b828281518110611e3757634e487b7160e01b600052603260045260246000fd5b602090810291909101015280611e4c816154b0565b915050611e05565b611e6085858585612e87565b604051635c46a7ef60e11b81526001600160a01b0384169063b88d4fde90611e929030908890879087906004016146e9565b600060405180830381600087803b158015611eac57600080fd5b505af1158015611ec0573d6000803e3d6000fd5b50505050826001600160a01b0316846001600160a01b0316867f0ef52e516fb5aec15a5d3587e5480481b702b26db93c8430eca78b61990fd3f685604051611f089190614847565b60405180910390a45050505050565b600c546001600160a01b031690565b6000818152600960205260408120610cab90613579565b611f45612fb6565b6001600160a01b0316611f56611f17565b6001600160a01b031614611f7c5760405162461bcd60e51b8152600401610ea890614fcc565b8051611866906010906020840190613d8c565b606060088054610cc29061547b565b61012c81565b60606000611fb284846114d1565b905080611fcf575050604080516000815260208101909152610f32565b6000816001600160401b03811115611ff757634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015612020578160200160208202803683370190505b50905060005b82811015612076576120398686836110fd565b82828151811061205957634e487b7160e01b600052603260045260246000fd5b60209081029190910101528061206e816154b0565b915050612026565b509150610f329050565b60166020526000908152604090205460ff1681565b66b1a2bc2ec5000081565b6001600160a01b0382166120c65760405162461bcd60e51b8152600401610ea890614f95565b3360008181526006602090815260408083206001600160a01b038716808552925291829020805460ff191685151517905590519091907f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c319061212990859061483c565b60405180910390a35050565b61214084848461318b565b612152836001600160a01b0316613584565b156113d257604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a029061218c9033908990889088906004016146e9565b602060405180830381600087803b1580156121a657600080fd5b505af11580156121ba573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121de91906142fe565b90506001600160e01b0319811663785cf2dd60e11b148061220f57506001600160e01b03198116630a85bd0160e11b145b61222b5760405162461bcd60e51b8152600401610ea890614eea565b611580836116fe565b61224084848484612fec565b6001600160a01b0384163314806122d0575060405163e985e9c560e01b81526001600160a01b0383169063e985e9c59061228090879033906004016146ab565b60206040518083038186803b15801561229857600080fd5b505afa1580156122ac573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122d091906142c6565b8061235f575060405163020604bf60e21b815233906001600160a01b0384169063081812fc90612304908590600401614847565b60206040518083038186803b15801561231c57600080fd5b505afa158015612330573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123549190613ef1565b6001600160a01b0316145b61237b5760405162461bcd60e51b8152600401610ea890615038565b6040516323b872dd60e01b81526001600160a01b038316906323b872dd906123ab908790309086906004016146c5565b600060405180830381600087803b1580156123c557600080fd5b505af11580156123d9573d6000803e3d6000fd5b505050506123e6836116fe565b5050505050565b6123f984848484612e87565b60007f095ea7b334ae44009aa867bfb386f5c3b4b443ac6f0ee573fa91c4608fbadfba308360405160240161242f92919061479e565b604051602081830303815290604052906001600160e01b0319166020820180516001600160e01b0383818316178352505050509050826001600160a01b03168160405161247c919061461d565b6000604051808303816000865af19150503d80600081146124b9576040519150601f19603f3d011682016040523d82523d6000602084013e6124be565b606091505b50506040516323b872dd60e01b81526001600160a01b03851691506323b872dd90611e92903090889087906004016146c5565b6124f9612fb6565b6001600160a01b031661250a611f17565b6001600160a01b0316146125305760405162461bcd60e51b8152600401610ea890614fcc565b61012c8151600e5461254291906153b1565b11156125605760405162461bcd60e51b8152600401610ea890614e50565b60005b81518110156126405760056017600084848151811061259257634e487b7160e01b600052603260045260246000fd5b6020908102919091018101516001600160a01b031682528101919091526040016000205460ff16106125d65760405162461bcd60e51b8152600401610ea8906151df565b6001601460008484815181106125fc57634e487b7160e01b600052603260045260246000fd5b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff191691151591909117905580612638816154b0565b915050612563565b508051600e5461265091906153b1565b600e5550565b6000818152601960205260408120805460609291906126749061547b565b9050116126ab57600f61268683613732565b604051602001612697929190614639565b604051602081830303815290604052610cab565b6010601960008481526020019081526020016000206040516020016126d192919061465e565b6040516020818303038152906040529050919050565b60186020526000908152604090205460ff1681565b60125442101561271e5760405162461bcd60e51b8152600401610ea8906152f6565b60006016600061272c612fb6565b6001600160a01b0316815260208101919091526040016000205460ff16116127665760405162461bcd60e51b8152600401610ea890614eb3565b60005b60166000612775612fb6565b6001600160a01b0316815260208101919091526040016000205460ff90811690821610156127fd5760006127aa611908612fb6565b90506127b4612fb6565b6001600160a01b0316817ff5c58aa1a71554b75cd1bdc5003a01577d315f9ff19419b33f1aced2815b78ac60405160405180910390a350806127f5816154cb565b915050612769565b506016600061280a612fb6565b6001600160a01b03168152602081019190915260400160009081205460ff1690601890612835612fb6565b6001600160a01b0316815260208101919091526040016000908120805490919061286390849060ff166153c9565b92506101000a81548160ff021916908360ff160217905550600060166000612889612fb6565b6001600160a01b031681526020810191909152604001600020805460ff191660ff92909216919091179055565b600f8054611a3a9061547b565b60006128cd612fb6565b6001600160a01b03166128de611f17565b6001600160a01b0316146129045760405162461bcd60e51b8152600401610ea890614fcc565b61291261012c611388615421565b600d54106129325760405162461bcd60e51b8152600401610ea890614cdb565b6001600160a01b038216600090815260176020526040902054600560ff9091161061296f5760405162461bcd60e51b8152600401610ea8906150dd565b6129788261358a565b6001600160a01b0383166000908152601760205260408120805492935060ff90921691906129a5836154cb565b82546101009290920a60ff8181021990931691831602179091556001600160a01b0384166000908152601860205260408120805490921692506129e7836154cb565b91906101000a81548160ff021916908360ff16021790555050600d6000815480929190612a13906154b0565b90915550506040516001600160a01b0383169082907ff5c58aa1a71554b75cd1bdc5003a01577d315f9ff19419b33f1aced2815b78ac90600090a3919050565b61138881565b60006001600160a01b038316612a815760405162461bcd60e51b8152600401610ea8906151b0565b6001600160a01b038216612aa75760405162461bcd60e51b8152600401610ea890614f95565b506001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b6001600160a01b0382166000908152600b6020908152604080832084845290915281205480612b175760405162461bcd60e51b8152600401610ea890614956565b6000818152600160205260409020546001600160a01b031663cd740db560e01b1794909350915050565b6000806001600160a01b03841615612b6657612b5d848461384c565b93509050612b9c565b506000828152600160205260409020546001600160a01b031680612b9c5760405162461bcd60e51b8152600401610ea890614d12565b6001600160a01b038116301415612bb757612b5d818461384c565b60007fed81cdda615fca130279b404b909f51438f5997d5ab9a459aecb921fbd297b6d3085604051602401612bed92919061479e565b604051602081830303815290604052906001600160e01b0319166020820180516001600160e01b0383818316178352505050509050600080836001600160a01b031683604051612c3d919061461d565b600060405180830381855afa9150503d8060008114612c78576040519150601f19603f3d011682016040523d82523d6000602084013e612c7d565b606091505b50915091508115612c9057602081015194505b6001821515148015612cb257506001600160e01b0319851663cd740db560e01b145b15612cc05750505050610f32565b50505063cd740db560e01b179392505050565b600081612cf25760405162461bcd60e51b8152600401610ea890614d49565b6000612d3384848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250612fba92505050565b9050612d4186823388612fec565b6040516331a9108f60e11b81526000903390636352211e90612d67908990600401614847565b60206040518083038186803b158015612d7f57600080fd5b505afa158015612d93573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612db79190613ef1565b6001600160a01b03161415612dde5760405162461bcd60e51b8152600401610ea890614f47565b612de7816116fe565b5063785cf2dd60e11b9695505050505050565b612e02612fb6565b6001600160a01b0316612e13611f17565b6001600160a01b031614612e395760405162461bcd60e51b8152600401610ea890614fcc565b6001600160a01b038116612e5f5760405162461bcd60e51b8152600401610ea890614aaf565b611607816136e0565b600e5481565b6001600160e01b031981166301ffc9a760e01b14919050565b6001600160a01b0382166000908152600b6020908152604080832084845290915290205480612ec85760405162461bcd60e51b8152600401610ea890614af5565b848114612ee75760405162461bcd60e51b8152600401610ea890614c38565b6001600160a01b038416612f0d5760405162461bcd60e51b8152600401610ea890614e87565b6000612f18826116fe565b90506001600160a01b038116331480612f5457506001600160a01b038116600090815260066020908152604080832033845290915290205460ff165b80612f8357506001600160a01b0381811660009081526004602090815260408083208684529091529020541633145b612f9f5760405162461bcd60e51b8152600401610ea89061491f565b6115808285856138af565b6000610f2f83836139a9565b3390565b600060208201519050602082511015610cae578151612fda906008615402565b612fe690610100615421565b1c919050565b6000838152600160205260409020546001600160a01b03166130205760405162461bcd60e51b8152600401610ea890615001565b6001600160a01b0382166000908152600b602090815260408083208484529091529020548314156130635760405162461bcd60e51b8152600401610ea890614b90565b6000838152600a602090815260408083206001600160a01b0386168452909152812061308e90613579565b9050806130af5760008481526009602052604090206130ad90846139e1565b505b6000848152600a602090815260408083206001600160a01b038716845290915290206130db90836139f6565b506001600160a01b0383166000818152600b6020908152604080832086845290915290208590553014156131335760008281526003602052604090205461312e9085906001600160a01b03861690613a02565b613147565b61314784846001600160a01b031684613a02565b826001600160a01b031684866001600160a01b03167f0371ddf2288ad1ba92626a7e31c86a9d006e592cfe57d7d946ef08b13457c08b85604051611f089190614847565b6001600160a01b0383166131b15760405162461bcd60e51b8152600401610ea890614bd3565b6000818152600160205260409020546001600160a01b038481169116146131ea5760405162461bcd60e51b8152600401610ea890614878565b6001600160a01b0382166132105760405162461bcd60e51b8152600401610ea890614a80565b336001600160a01b038416146133a55760007fed81cdda615fca130279b404b909f51438f5997d5ab9a459aecb921fbd297b6d308360405160240161325692919061479e565b604051602081830303815290604052906001600160e01b0319166020820180516001600160e01b0383818316178352505050509050600080856001600160a01b0316836040516132a6919061461d565b600060405180830381855afa9150503d80600081146132e1576040519150601f19603f3d011682016040523d82523d6000602084013e6132e6565b606091505b5090925090506001821515141561332f5760208101516001600160e01b0319811663cd740db560e01b141561332d5760405162461bcd60e51b8152600401610ea890614b40565b505b6001600160a01b038616600090815260066020908152604080832033845290915290205460ff168061338557506001600160a01b0386811660009081526004602090815260408083208884529091529020541633145b6133a15760405162461bcd60e51b8152600401610ea890615038565b5050505b6001600160a01b038381166000908152600460209081526040808320858452909152902054161561342c576001600160a01b038316600081815260046020908152604080832085845290915280822080546001600160a01b0319169055518392907f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925908390a45b816001600160a01b0316836001600160a01b031614613533576001600160a01b03831660009081526005602052604090205461347857634e487b7160e01b600052600160045260246000fd5b6001600160a01b038316600090815260056020526040812080549161349c83615464565b9091555050600081815260016020908152604080832080546001600160a01b0319166001600160a01b038781169190911790915586168352600290915290206134e59082613ad7565b506001600160a01b038216600090815260026020526040902061350890826139f6565b506001600160a01b038216600090815260056020526040812080549161352d836154b0565b91905055505b80826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000610cab82613ae3565b3b151590565b60006001600160a01b0382166135b25760405162461bcd60e51b8152600401610ea890614e87565b6000805490806135c1836154b0565b90915550506000805480825260016020908152604080842080546001600160a01b0319166001600160a01b0388169081179091558452600290915290912061360990826139f6565b506001600160a01b038316600090815260056020526040812080549161362e836154b0565b9091555050600054604051613647913091602001614673565b60408051601f19818403018152828252805160209182012060008054815260038352838120919091559083019091528082526136869185908490613ae7565b6136a25760405162461bcd60e51b8152600401610ea89061511f565b60405181906001600160a01b038516906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a492915050565b600c80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60608161375757506040805180820190915260018152600360fc1b6020820152610cae565b8160005b8115613781578061376b816154b0565b915061377a9050600a836153ee565b915061375b565b6000816001600160401b038111156137a957634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156137d3576020820181803683370190505b5090505b8415611129576137e8600183615421565b91506137f5600a866154eb565b6138009060306153b1565b60f81b81838151811061382357634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a905350613845600a866153ee565b94506137d7565b6001600160a01b0382166000908152600b602090815260408083208484529091528120548061388d5760405162461bcd60e51b8152600401610ea890614956565b6000818152600160205260409020546001600160a01b031691505b9250929050565b6000838152600a602090815260408083206001600160a01b038616845290915281206001906138dd90613579565b6138e79190615421565b6000858152600a602090815260408083206001600160a01b038816845290915290209091506139169083613ad7565b506001600160a01b0383166000908152600b602090815260408083208584529091528120558061395a5760008481526009602052604090206139589084613bf8565b505b6001600160a01b038316301415613995576000828152600360205260409020546139909085906001600160a01b03861690613a02565b6113d2565b6113d284846001600160a01b031684613a02565b60008260000182815481106139ce57634e487b7160e01b600052603260045260246000fd5b9060005260206000200154905092915050565b6000610f2f836001600160a01b038416613c0d565b6000610f2f8383613c0d565b6000838152600360209081526040808320549051613a24928691869101614681565b60408051601f19818403018152918152815160209283012060008781526003909352912081905590505b6000848152600160205260409020546001600160a01b03163014156113d257306000818152600b602090815260408083209783529681528682205480835260038252918790205496519196613aa99390929091859101614681565b60408051601f1981840301815291815281516020928301206000878152600390935291208190559050613a4e565b6000610f2f8383613c57565b5490565b6000613afb846001600160a01b0316613584565b15613bf057604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290613b329033908990889088906004016146e9565b602060405180830381600087803b158015613b4c57600080fd5b505af1925050508015613b7c575060408051601f3d908101601f19168201909252613b79918101906142fe565b60015b613bd6573d808015613baa576040519150601f19603f3d011682016040523d82523d6000602084013e613baf565b606091505b508051613bce5760405162461bcd60e51b8152600401610ea8906149f7565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611129565b506001611129565b6000610f2f836001600160a01b038416613c57565b6000613c198383613d74565b613c4f57508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610f32565b506000610f32565b60008181526001830160205260408120548015613d6a576000613c7b600183615421565b8554909150600090613c8f90600190615421565b9050818114613d10576000866000018281548110613cbd57634e487b7160e01b600052603260045260246000fd5b9060005260206000200154905080876000018481548110613cee57634e487b7160e01b600052603260045260246000fd5b6000918252602080832090910192909255918252600188019052604090208390555b8554869080613d2f57634e487b7160e01b600052603160045260246000fd5b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610f32565b6000915050610f32565b60009081526001919091016020526040902054151590565b828054613d989061547b565b90600052602060002090601f016020900481019282613dba5760008555613e00565b82601f10613dd357805160ff1916838001178555613e00565b82800160010185558215613e00579182015b82811115613e00578251825591602001919060010190613de5565b50613e0c929150613e10565b5090565b5b80821115613e0c5760008155600101613e11565b60008083601f840112613e36578182fd5b5081356001600160401b03811115613e4c578182fd5b6020830191508360208285010111156138a857600080fd5b600082601f830112613e74578081fd5b81356001600160401b03811115613e8d57613e8d61552b565b613ea0601f8201601f191660200161537c565b818152846020838601011115613eb4578283fd5b816020850160208301379081016020019190915292915050565b600060208284031215613edf578081fd5b8135613eea81615541565b9392505050565b600060208284031215613f02578081fd5b8151613eea81615541565b60008060408385031215613f1f578081fd5b8235613f2a81615541565b91506020830135613f3a81615541565b809150509250929050565b600080600060608486031215613f59578081fd5b8335613f6481615541565b92506020840135613f7481615541565b929592945050506040919091013590565b600080600080600060808688031215613f9c578081fd5b8535613fa781615541565b94506020860135613fb781615541565b93506040860135925060608601356001600160401b03811115613fd8578182fd5b613fe488828901613e25565b969995985093965092949392505050565b6000806000806080858703121561400a578384fd5b843561401581615541565b9350602085013561402581615541565b92506040850135915060608501356001600160401b03811115614046578182fd5b61405287828801613e64565b91505092959194509250565b60008060008060808587031215614073578384fd5b843561407e81615541565b9350602085013561408e81615541565b93969395505050506040820135916060013590565b60008060008060008060a087890312156140bb578081fd5b86356140c681615541565b955060208701356140d681615541565b9450604087013593506060870135925060808701356001600160401b038111156140fe578182fd5b61410a89828a01613e25565b979a9699509497509295939492505050565b6000806040838503121561412e578182fd5b823561413981615541565b91506020830135613f3a81615556565b6000806040838503121561415b578182fd5b823561416681615541565b946020939093013593505050565b60008060008060808587031215614189578182fd5b843561419481615541565b93506020850135925060408501356141ab81615541565b9396929550929360600135925050565b600080600080606085870312156141d0578182fd5b84356141db81615541565b93506020850135925060408501356001600160401b038111156141fc578283fd5b61420887828801613e25565b95989497509550505050565b60006020808385031215614226578182fd5b82356001600160401b038082111561423c578384fd5b818501915085601f83011261424f578384fd5b8135818111156142615761426161552b565b838102915061427184830161537c565b8181528481019084860184860187018a101561428b578788fd5b8795505b838610156142b957803594506142a485615541565b8483526001959095019491860191860161428f565b5098975050505050505050565b6000602082840312156142d7578081fd5b8151613eea81615556565b6000602082840312156142f3578081fd5b8135613eea81615564565b60006020828403121561430f578081fd5b8151613eea81615564565b60006020828403121561432b578081fd5b81356001600160401b03811115614340578182fd5b61112984828501613e64565b60006020828403121561435d578081fd5b5035919050565b60008060408385031215614376578182fd5b823591506020830135613f3a81615541565b6000806000806080858703121561439d578182fd5b8435935060208501356143af81615541565b925060408501356141ab81615541565b600080600080600060a086880312156143d6578283fd5b8535945060208601356143e881615541565b935060408601356143f881615541565b92506060860135915060808601356001600160401b03811115614419578182fd5b61442588828901613e64565b9150509295509295909350565b600080600060608486031215614446578081fd5b833592506020840135613f7481615541565b60008060008060008060c08789031215614470578384fd5b86359550602087013561448281615541565b945060408701359350606087013561449981615541565b92506080870135915060a08701356001600160401b038111156144ba578182fd5b6144c689828a01613e64565b9150509295509295509295565b600080604083850312156144e5578182fd5b8235915060208301356001600160401b03811115614501578182fd5b61450d85828601613e64565b9150509250929050565b60008060408385031215614529578182fd5b50508035926020909101359150565b600060208284031215614549578081fd5b813560ff81168114613eea578182fd5b60008151808452614571816020860160208601615438565b601f01601f19169290920160200192915050565b80546000906002810460018083168061459f57607f831692505b60208084108214156145bf57634e487b7160e01b86526022600452602486fd5b8180156145d357600181146145e457614611565b60ff19861689528489019650614611565b6145ed886153a5565b60005b868110156146095781548b8201529085019083016145f0565b505084890196505b50505050505092915050565b6000825161462f818460208701615438565b9190910192915050565b60006146458285614585565b8351614655818360208801615438565b01949350505050565b600061112961466d8386614585565b84614585565b918252602082015260400190565b9283526020830191909152604082015260600190565b6001600160a01b0391909116815260200190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061471c90830184614559565b9695505050505050565b6001600160a01b039384168152919092166020820152604081019190915260806060820181905260009082015260a00190565b6001600160a01b03868116825285166020820152604081018490526060810183905260a06080820181905260009061479390830184614559565b979650505050505050565b6001600160a01b03929092168252602082015260400190565b6020808252825182820181905260009190848201906040850190845b818110156147f85783516001600160a01b0316835292840192918401916001016147d3565b50909695505050505050565b6020808252825182820181905260009190848201906040850190845b818110156147f857835183529284019291840191600101614820565b901515815260200190565b90815260200190565b6001600160e01b031991909116815260200190565b600060208252610f2f6020830184614559565b60208082526014908201527321aa221d102fb33937b6903737ba1037bbb732b960611b604082015260600190565b60208082526022908201527f4354443a20737461746548617368206f66205f746f6b656e4964206973207a65604082015261726f60f01b606082015260800190565b6020808252601b908201527f4354443a20737461746548617368206d69736d61746368202833290000000000604082015260600190565b6020808252601c908201527f4354443a206d73672e73656e646572206e6f7420656c696769626c6500000000604082015260600190565b6020808252600e908201526d10d5110e881b9bdd08199bdd5b9960921b604082015260600190565b60208082526024908201527f4354443a2062616c616e63654f66205f746f6b656e4f776e6572207a65726f2060408201526330b2323960e11b606082015260800190565b6020808252818101527f4d657461426f6f6d3a204e6f742061626c6520746f20636c61696d207965742e604082015260600190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252601c908201527f4d657461426f6f6d3a20707269636520697320696e636f727265637400000000604082015260600190565b6020808252601590820152744354443a205f746f207a65726f206164647265737360581b604082015260600190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b6020808252602b908201527f4354443a205f6368696c64436f6e7472616374205f6368696c64546f6b656e4960408201526a19081b9bdd08199bdd5b9960aa1b606082015260800190565b60208082526030908201527f4354443a20746f6b656e206973206368696c64206f66206f7468657220746f7060408201526f20646f776e20636f6d706f7361626c6560801b606082015260800190565b60208082526023908201527f4354443a205f6368696c64546f6b656e496420616c72656164792072656365696040820152621d995960ea1b606082015260800190565b60208082526014908201527321aa221d102fb33937b6903d32b9379030b2323960611b604082015260600190565b6020808252601b908201527f4354443a20737461746548617368206d69736d61746368202832290000000000604082015260600190565b60208082526018908201527f4354443a2077726f6e6720746f6b656e496420666f756e640000000000000000604082015260600190565b6020808252601d908201527f4d657461426f6f6d3a2070726553616c65206973206e6f74206f70656e000000604082015260600190565b6020808252818101527f4d657461426f6f6d3a207075626c696353616c65206973206e6f74206f70656e604082015260600190565b6020808252601c908201527f4d657461426f6f6d3a2072656163686564206d617820737570706c7900000000604082015260600190565b6020808252601f908201527f4354443a206f776e65724f66205f746f6b656e4964207a65726f206164647200604082015260600190565b6020808252605e908201527f4354443a206f6e4552433732315265636569766564283329205f64617461206d60408201527f75737420636f6e7461696e207468652075696e7432353620746f6b656e49642060608201527f746f207472616e7366657220746865206368696c6420746f6b656e20746f0000608082015260a00190565b60208082526021908201527f4354443a20617070726f7665206d73672e73656e646572206e6f74206f776e656040820152603960f91b606082015260800190565b60208082526023908201527f4d657461426f6f6d3a2063616c6c6572206e6f7420696e2041697264726f704c6040820152621a5cdd60ea1b606082015260800190565b60208082526019908201527f72656163686564206d61782061697244726f70537570706c7900000000000000604082015260600190565b60208082526012908201527121aa221d102fba37903d32b9379030b2323960711b604082015260600190565b6020808252601d908201527f4d657461426f6f6d3a20616c726561647920636c61696d656420616c6c000000604082015260600190565b6020808252603e908201527f4354443a20736166655472616e7366657246726f6d283429206f6e455243373260408201527f31526563656976656420696e76616c69642072657475726e2076616c75650000606082015260800190565b6020808252602e908201527f4354443a206f6e4552433732315265636569766564283329206368696c64207460408201526d1bdad95b881b9bdd081bdddb995960921b606082015260800190565b60208082526018908201527f4354443a205f6f70657261746f72207a65726f20616464720000000000000000604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252601d908201527f4354443a205f746f6b656e496420646f6573206e6f742065786973742e000000604082015260600190565b6020808252601c908201527f4354443a206d73672e73656e646572206e6f7420617070726f76656400000000604082015260600190565b6020808252601b908201527f4354443a20737461746548617368206d69736d61746368202831290000000000604082015260600190565b6020808252601a908201527f4d657461426f6f6d3a2063757272656e746c7920706175736564000000000000604082015260600190565b60208082526022908201527f4d657461426f6f6d3a2063616e206e6f7420686f6c64206d6f7265207468616e604082015261203560f01b606082015260800190565b60208082526023908201527f4354443a207472616e7366657220746f206e6f6e2045524337323152656365696040820152623b32b960e91b606082015260800190565b6020808252602e908201527f4354443a206f6e4552433732315265636569766564283429206368696c64207460408201526d1bdad95b881b9bdd081bdddb995960921b606082015260800190565b60208082526015908201527421aa221d102fb7bbb732b9103d32b9379030b2323960591b604082015260600190565b60208082526018908201527f63616e206e6f7420686f6c64206d6f7265207468616e20350000000000000000604082015260600190565b6020808252605e908201527f4354443a206f6e4552433732315265636569766564283429205f64617461206d60408201527f75737420636f6e7461696e207468652075696e7432353620746f6b656e49642060608201527f746f207472616e7366657220746865206368696c6420746f6b656e20746f0000608082015260a00190565b6020808252603e908201527f4354443a20736166655472616e7366657246726f6d283329206f6e455243373260408201527f31526563656976656420696e76616c69642072657475726e2076616c75650000606082015260800190565b6020808252601f908201527f4d657461426f6f6d3a204e6f742061626c6520746f20636c61696d2079657400604082015260600190565b60208082526021908201527f4d657461426f6f6d3a2063616c6c6572206e6f7420696e2057686974654c69736040820152601d60fa1b606082015260800190565b60ff91909116815260200190565b6040518181016001600160401b038111828210171561539d5761539d61552b565b604052919050565b60009081526020902090565b600082198211156153c4576153c46154ff565b500190565b600060ff821660ff84168060ff038211156153e6576153e66154ff565b019392505050565b6000826153fd576153fd615515565b500490565b600081600019048311821515161561541c5761541c6154ff565b500290565b600082821015615433576154336154ff565b500390565b60005b8381101561545357818101518382015260200161543b565b838111156113d25750506000910152565b600081615473576154736154ff565b506000190190565b60028104600182168061548f57607f821691505b60208210811415611d7857634e487b7160e01b600052602260045260246000fd5b60006000198214156154c4576154c46154ff565b5060010190565b600060ff821660ff8114156154e2576154e26154ff565b60010192915050565b6000826154fa576154fa615515565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461160757600080fd5b801515811461160757600080fd5b6001600160e01b03198116811461160757600080fdfea264697066735822122041cc16488e7a2004b19598c1ef78ce0dc3dacde1e03a03ae6390cd8fdd2fddb364736f6c63430008000033000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000000084d657461426f6f6d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004244d4d5500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002168747470733a2f2f6170692e66616e73692e6d652f4e46542f62696f70756e6b2f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002268747470733a2f2f676174657761792e70696e6174612e636c6f75642f697066732f000000000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x6080604052600436106103fa5760003560e01c80636352211e11610213578063a035b1fe11610123578063d547cfb7116100ab578063eadb80b81161007a578063eadb80b814610b92578063ed81cdda14610bc0578063f0b9e5ba14610be0578063f2fde38b14610c00578063fb6b18c014610c20576103fa565b8063d547cfb714610b28578063d59ef39914610b3d578063d5abeb0114610b5d578063e985e9c514610b72576103fa565b8063bef44f18116100f2578063bef44f1814610a93578063c44af6c514610ab3578063c87b56dd14610ad3578063c884ef8314610af3578063d1058e5914610b13576103fa565b8063a035b1fe14610a1e578063a22cb46514610a33578063b88d4fde14610a53578063ba6b5f9614610a73576103fa565b80638462151c116101a65780638dc3d0c0116101755780638dc3d0c01461099457806395d89b41146109b4578063974bcad2146109c95780639bca5f95146109de5780639c2b1b7a146109fe576103fa565b80638462151c146109125780638d81f51e1461093f5780638da5cb5b1461095f5780638da7d0b514610974576103fa565b806378a89567116101e257806378a895671461088357806379eda541146108985780637b7b6c05146108b85780637be2e789146108e5576103fa565b80636352211e1461080e57806370a082311461082e578063715018a61461084e57806372c985cb14610863576103fa565b806323b872dd1161030e57806343a61a8e116102a157806355f804b31161027057806355f804b31461078f5780635680a3ad146107af5780635b88349d146107cf5780635c975abb146107e45780635f3cb6ab146107f9576103fa565b806343a61a8e1461072757806348caf7ef146107475780634ff338161461075a57806355367ba91461077a576103fa565b8063372c12b1116102dd578063372c12b1146106b25780633cc8cf1e146106d25780633ccfd60b146106f257806342842e0e14610707576103fa565b806323b872dd1461063d57806325a301451461065d5780632f745c591461067257806335b21ceb14610692576103fa565b806311b7e5e71161039157806318160ddd1161036057806318160ddd146105c05780631bcc80ac146105d55780631c5481e2146105e85780631d98f3c5146106085780632344be0a14610628576103fa565b806311b7e5e714610526578063150b7a0214610546578063160b01a114610573578063162094c4146105a0576103fa565b8063095ea7b3116103cd578063095ea7b3146104a65780630d5a621b146104c65780630d5bedc6146104e65780630f0e4f7314610506576103fa565b806301ffc9a7146103ff57806306fdde0314610435578063081812fc1461045757806308937f6214610484575b600080fd5b34801561040b57600080fd5b5061041f61041a3660046142e2565b610c35565b60405161042c919061483c565b60405180910390f35b34801561044157600080fd5b5061044a610cb3565b60405161042c9190614865565b34801561046357600080fd5b5061047761047236600461434c565b610d45565b60405161042c9190614697565b34801561049057600080fd5b506104a461049f366004614458565b610d7f565b005b3480156104b257600080fd5b506104a46104c1366004614149565b610e45565b3480156104d257600080fd5b506104776104e1366004614517565b610f17565b3480156104f257600080fd5b5061041f610501366004613ece565b610f38565b34801561051257600080fd5b506104a461052136600461434c565b610f4d565b34801561053257600080fd5b506104a461054136600461434c565b610f91565b34801561055257600080fd5b50610566610561366004613f85565b610fd5565b60405161042c9190614850565b34801561057f57600080fd5b5061059361058e366004614432565b6110fd565b60405161042c9190614847565b3480156105ac57600080fd5b506104a46105bb3660046144d3565b611131565b3480156105cc57600080fd5b50610593611194565b6104a46105e3366004614538565b61119a565b3480156105f457600080fd5b506104a461060336600461405e565b61139a565b34801561061457600080fd5b506104a4610623366004614388565b6113d8565b34801561063457600080fd5b50610593611498565b34801561064957600080fd5b506104a4610658366004613f45565b61149e565b34801561066957600080fd5b506105936114a9565b34801561067e57600080fd5b5061059361068d366004614149565b6114af565b34801561069e57600080fd5b506105936106ad366004614364565b6114d1565b3480156106be57600080fd5b5061041f6106cd366004613ece565b6114fc565b3480156106de57600080fd5b506104a46106ed3660046140a3565b611511565b3480156106fe57600080fd5b506104a4611588565b34801561071357600080fd5b506104a4610722366004613f45565b61160a565b34801561073357600080fd5b5061059361074236600461434c565b6116fe565b6104a4610755366004614538565b61170b565b34801561076657600080fd5b5061059361077536600461434c565b611795565b34801561078657600080fd5b506104a46117c1565b34801561079b57600080fd5b506104a46107aa36600461431a565b611814565b3480156107bb57600080fd5b5061041f6107ca366004614149565b61186a565b3480156107db57600080fd5b506104a4611894565b3480156107f057600080fd5b5061041f611a24565b34801561080557600080fd5b5061044a611a2d565b34801561081a57600080fd5b5061047761082936600461434c565b611abb565b34801561083a57600080fd5b50610593610849366004613ece565b611af0565b34801561085a57600080fd5b506104a4611b34565b34801561086f57600080fd5b506104a461087e366004614214565b611b7f565b34801561088f57600080fd5b50610593611c34565b3480156108a457600080fd5b506104a46108b336600461405e565b611c3a565b3480156108c457600080fd5b506108d86108d336600461434c565b611c72565b60405161042c91906147b7565b3480156108f157600080fd5b50610905610900366004613ece565b611d7e565b60405161042c919061536e565b34801561091e57600080fd5b5061093261092d366004613ece565b611d93565b60405161042c9190614804565b34801561094b57600080fd5b506104a461095a3660046143bf565b611e54565b34801561096b57600080fd5b50610477611f17565b34801561098057600080fd5b5061059361098f36600461434c565b611f26565b3480156109a057600080fd5b506104a46109af36600461431a565b611f3d565b3480156109c057600080fd5b5061044a611f8f565b3480156109d557600080fd5b50610593611f9e565b3480156109ea57600080fd5b506109326109f9366004614364565b611fa4565b348015610a0a57600080fd5b50610905610a19366004613ece565b612080565b348015610a2a57600080fd5b50610593612095565b348015610a3f57600080fd5b506104a4610a4e36600461411c565b6120a0565b348015610a5f57600080fd5b506104a4610a6e366004613ff5565b612135565b348015610a7f57600080fd5b506104a4610a8e366004614174565b612234565b348015610a9f57600080fd5b506104a4610aae366004614388565b6123ed565b348015610abf57600080fd5b506104a4610ace366004614214565b6124f1565b348015610adf57600080fd5b5061044a610aee36600461434c565b612656565b348015610aff57600080fd5b50610905610b0e366004613ece565b6126e7565b348015610b1f57600080fd5b506104a46126fc565b348015610b3457600080fd5b5061044a6128b6565b348015610b4957600080fd5b50610593610b58366004613ece565b6128c3565b348015610b6957600080fd5b50610593612a53565b348015610b7e57600080fd5b5061041f610b8d366004613f0d565b612a59565b348015610b9e57600080fd5b50610bb2610bad366004614149565b612ad6565b60405161042c929190614673565b348015610bcc57600080fd5b50610593610bdb366004614149565b612b41565b348015610bec57600080fd5b50610566610bfb3660046141bb565b612cd3565b348015610c0c57600080fd5b506104a4610c1b366004613ece565b612dfa565b348015610c2c57600080fd5b50610593612e68565b60006001600160e01b031982166380ac58cd60e01b1480610c6657506001600160e01b0319821663cde244d960e01b145b80610c8157506001600160e01b031982166328d12bf960e21b145b80610c9c57506306f2657960e21b6001600160e01b03198316145b80610cab5750610cab82612e6e565b90505b919050565b606060078054610cc29061547b565b80601f0160208091040260200160405190810160405280929190818152602001828054610cee9061547b565b8015610d3b5780601f10610d1057610100808354040283529160200191610d3b565b820191906000526020600020905b815481529060010190602001808311610d1e57829003601f168201915b5050505050905090565b600080610d51836116fe565b6001600160a01b03908116600090815260046020908152604080832087845290915290205416915050919050565b610d8b86868585612e87565b6040516307a8567d60e51b81526001600160a01b0384169063f50acfa090610dbf9030908990899088908890600401614759565b600060405180830381600087803b158015610dd957600080fd5b505af1158015610ded573d6000803e3d6000fd5b50505050826001600160a01b0316856001600160a01b0316877f0ef52e516fb5aec15a5d3587e5480481b702b26db93c8430eca78b61990fd3f685604051610e359190614847565b60405180910390a4505050505050565b6000610e50826116fe565b90506001600160a01b038116331480610e8c57506001600160a01b038116600090815260066020908152604080832033845290915290205460ff165b610eb15760405162461bcd60e51b8152600401610ea890614dcc565b60405180910390fd5b6001600160a01b03818116600081815260046020908152604080832087845290915280822080546001600160a01b031916948816948517905551859392917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6000828152600960205260408120610f2f9083612faa565b90505b92915050565b60146020526000908152604090205460ff1681565b610f55612fb6565b6001600160a01b0316610f66611f17565b6001600160a01b031614610f8c5760405162461bcd60e51b8152600401610ea890614fcc565b601255565b610f99612fb6565b6001600160a01b0316610faa611f17565b6001600160a01b031614610fd05760405162461bcd60e51b8152600401610ea890614fcc565b601355565b600081610ff45760405162461bcd60e51b8152600401610ea890615216565b600061103584848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250612fba92505050565b905061104386823388612fec565b6040516331a9108f60e11b81526000903390636352211e90611069908990600401614847565b60206040518083038186803b15801561108157600080fd5b505afa158015611095573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110b99190613ef1565b6001600160a01b031614156110e05760405162461bcd60e51b8152600401610ea890615162565b6110e9816116fe565b50630a85bd0160e11b979650505050505050565b6000838152600a602090815260408083206001600160a01b038616845290915281206111299083612faa565b949350505050565b611139612fb6565b6001600160a01b031661114a611f17565b6001600160a01b0316146111705760405162461bcd60e51b8152600401610ea890614fcc565b6000828152601960209081526040909120825161118f92840190613d8c565b505050565b600d5481565b60115460ff16156111bd5760405162461bcd60e51b8152600401610ea8906150a6565b6013544210156111df5760405162461bcd60e51b8152600401610ea890614ca6565b6111ed61012c611388615421565b8160ff16600d546111fe91906153b1565b111561121c5760405162461bcd60e51b8152600401610ea890614cdb565b6005816017600061122b612fb6565b6001600160a01b03168152602081019190915260400160002054611252919060ff166153c9565b60ff1611156112735760405162461bcd60e51b8152600401610ea8906150dd565b61128760ff821666b1a2bc2ec50000615402565b3410156112a65760405162461bcd60e51b8152600401610ea890614a49565b80601760006112b3612fb6565b6001600160a01b031681526020810191909152604001600020546112da919060ff166153c9565b601760006112e6612fb6565b6001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548160ff021916908360ff160217905550806016600061132b612fb6565b6001600160a01b03168152602081019190915260400160002054611352919060ff166153c9565b6016600061135e612fb6565b6001600160a01b031681526020810191909152604001600020805460ff191660ff928316179055600d54611394918316906153b1565b600d5550565b60008281526003602052604090205481146113c75760405162461bcd60e51b8152600401610ea890614c01565b6113d284848461149e565b50505050565b6113e484848484612e87565b604051632142170760e11b81526001600160a01b038316906342842e0e90611414903090879086906004016146c5565b600060405180830381600087803b15801561142e57600080fd5b505af1158015611442573d6000803e3d6000fd5b50505050816001600160a01b0316836001600160a01b0316857f0ef52e516fb5aec15a5d3587e5480481b702b26db93c8430eca78b61990fd3f68460405161148a9190614847565b60405180910390a450505050565b60135481565b61118f83838361318b565b60125481565b6001600160a01b0382166000908152600260205260408120610f2f9083612faa565b6000828152600a602090815260408083206001600160a01b03851684529091528120610f2f90613579565b60156020526000908152604090205460ff1681565b600084815260036020526040902054831461153e5760405162461bcd60e51b8152600401610ea8906148e8565b61158086868685858080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061213592505050565b505050505050565b611590612fb6565b6001600160a01b03166115a1611f17565b6001600160a01b0316146115c75760405162461bcd60e51b8152600401610ea890614fcc565b6115cf611f17565b6001600160a01b03166108fc479081150290604051600060405180830381858888f19350505050158015611607573d6000803e3d6000fd5b50565b61161583838361318b565b611627826001600160a01b0316613584565b1561118f57604051630a85bd0160e11b81526000906001600160a01b0384169063150b7a029061165f90339088908790600401614726565b602060405180830381600087803b15801561167957600080fd5b505af115801561168d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116b191906142fe565b90506001600160e01b0319811663785cf2dd60e11b14806116e257506001600160e01b03198116630a85bd0160e11b145b6113d25760405162461bcd60e51b8152600401610ea890615299565b6000610cab600083612b41565b60156000611717612fb6565b6001600160a01b0316815260208101919091526040016000205460ff166117505760405162461bcd60e51b8152600401610ea89061532d565b60115460ff16156117735760405162461bcd60e51b8152600401610ea8906150a6565b6012544210156111df5760405162461bcd60e51b8152600401610ea890614c6f565b60008181526003602052604081205480610cab5760405162461bcd60e51b8152600401610ea8906148a6565b6117c9612fb6565b6001600160a01b03166117da611f17565b6001600160a01b0316146118005760405162461bcd60e51b8152600401610ea890614fcc565b6011805460ff19811660ff90911615179055565b61181c612fb6565b6001600160a01b031661182d611f17565b6001600160a01b0316146118535760405162461bcd60e51b8152600401610ea890614fcc565b805161186690600f906020840190613d8c565b5050565b6001600160a01b03919091166000908152600b602090815260408083209383529290522054151590565b601460006118a0612fb6565b6001600160a01b0316815260208101919091526040016000205460ff166118d95760405162461bcd60e51b8152600401610ea890614e0d565b6012544210156118fb5760405162461bcd60e51b8152600401610ea8906149c2565b600061190d611908612fb6565b61358a565b905060006014600061191d612fb6565b6001600160a01b031681526020810191909152604001600020805460ff191691151591909117905561194d612fb6565b6001600160a01b0316817ff5c58aa1a71554b75cd1bdc5003a01577d315f9ff19419b33f1aced2815b78ac60405160405180910390a36017600061198f612fb6565b6001600160a01b0316815260208101919091526040016000908120805460ff16916119b9836154cb565b91906101000a81548160ff021916908360ff16021790555050601860006119de612fb6565b6001600160a01b0316815260208101919091526040016000908120805460ff1691611a08836154cb565b91906101000a81548160ff021916908360ff1602179055505050565b60115460ff1681565b60108054611a3a9061547b565b80601f0160208091040260200160405190810160405280929190818152602001828054611a669061547b565b8015611ab35780601f10611a8857610100808354040283529160200191611ab3565b820191906000526020600020905b815481529060010190602001808311611a9657829003601f168201915b505050505081565b6000818152600160205260409020546001600160a01b031680610cae5760405162461bcd60e51b8152600401610ea890614d12565b60006001600160a01b038216611b185760405162461bcd60e51b8152600401610ea89061497e565b506001600160a01b031660009081526005602052604090205490565b611b3c612fb6565b6001600160a01b0316611b4d611f17565b6001600160a01b031614611b735760405162461bcd60e51b8152600401610ea890614fcc565b611b7d60006136e0565b565b611b87612fb6565b6001600160a01b0316611b98611f17565b6001600160a01b031614611bbe5760405162461bcd60e51b8152600401610ea890614fcc565b60005b815181101561186657600160156000848481518110611bf057634e487b7160e01b600052603260045260246000fd5b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff191691151591909117905580611c2c816154b0565b915050611bc1565b60005490565b6000828152600360205260409020548114611c675760405162461bcd60e51b8152600401610ea89061506f565b6113d284848461160a565b60606000611c7f83611f26565b905080611cbb5760005b604051908082528060200260200182016040528015611cb2578160200160208202803683370190505b50915050610cae565b6000816001600160401b03811115611ce357634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015611d0c578160200160208202803683370190505b50905060005b82811015611d6e57611d248582610f17565b828281518110611d4457634e487b7160e01b600052603260045260246000fd5b6001600160a01b039092166020928302919091019091015280611d66816154b0565b915050611d12565b509150610cae9050565b50919050565b60176020526000908152604090205460ff1681565b60606000611da083611af0565b905080611dae576000611c89565b6000816001600160401b03811115611dd657634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015611dff578160200160208202803683370190505b50905060005b82811015611d6e57611e1785826114af565b828281518110611e3757634e487b7160e01b600052603260045260246000fd5b602090810291909101015280611e4c816154b0565b915050611e05565b611e6085858585612e87565b604051635c46a7ef60e11b81526001600160a01b0384169063b88d4fde90611e929030908890879087906004016146e9565b600060405180830381600087803b158015611eac57600080fd5b505af1158015611ec0573d6000803e3d6000fd5b50505050826001600160a01b0316846001600160a01b0316867f0ef52e516fb5aec15a5d3587e5480481b702b26db93c8430eca78b61990fd3f685604051611f089190614847565b60405180910390a45050505050565b600c546001600160a01b031690565b6000818152600960205260408120610cab90613579565b611f45612fb6565b6001600160a01b0316611f56611f17565b6001600160a01b031614611f7c5760405162461bcd60e51b8152600401610ea890614fcc565b8051611866906010906020840190613d8c565b606060088054610cc29061547b565b61012c81565b60606000611fb284846114d1565b905080611fcf575050604080516000815260208101909152610f32565b6000816001600160401b03811115611ff757634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015612020578160200160208202803683370190505b50905060005b82811015612076576120398686836110fd565b82828151811061205957634e487b7160e01b600052603260045260246000fd5b60209081029190910101528061206e816154b0565b915050612026565b509150610f329050565b60166020526000908152604090205460ff1681565b66b1a2bc2ec5000081565b6001600160a01b0382166120c65760405162461bcd60e51b8152600401610ea890614f95565b3360008181526006602090815260408083206001600160a01b038716808552925291829020805460ff191685151517905590519091907f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c319061212990859061483c565b60405180910390a35050565b61214084848461318b565b612152836001600160a01b0316613584565b156113d257604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a029061218c9033908990889088906004016146e9565b602060405180830381600087803b1580156121a657600080fd5b505af11580156121ba573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121de91906142fe565b90506001600160e01b0319811663785cf2dd60e11b148061220f57506001600160e01b03198116630a85bd0160e11b145b61222b5760405162461bcd60e51b8152600401610ea890614eea565b611580836116fe565b61224084848484612fec565b6001600160a01b0384163314806122d0575060405163e985e9c560e01b81526001600160a01b0383169063e985e9c59061228090879033906004016146ab565b60206040518083038186803b15801561229857600080fd5b505afa1580156122ac573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122d091906142c6565b8061235f575060405163020604bf60e21b815233906001600160a01b0384169063081812fc90612304908590600401614847565b60206040518083038186803b15801561231c57600080fd5b505afa158015612330573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123549190613ef1565b6001600160a01b0316145b61237b5760405162461bcd60e51b8152600401610ea890615038565b6040516323b872dd60e01b81526001600160a01b038316906323b872dd906123ab908790309086906004016146c5565b600060405180830381600087803b1580156123c557600080fd5b505af11580156123d9573d6000803e3d6000fd5b505050506123e6836116fe565b5050505050565b6123f984848484612e87565b60007f095ea7b334ae44009aa867bfb386f5c3b4b443ac6f0ee573fa91c4608fbadfba308360405160240161242f92919061479e565b604051602081830303815290604052906001600160e01b0319166020820180516001600160e01b0383818316178352505050509050826001600160a01b03168160405161247c919061461d565b6000604051808303816000865af19150503d80600081146124b9576040519150601f19603f3d011682016040523d82523d6000602084013e6124be565b606091505b50506040516323b872dd60e01b81526001600160a01b03851691506323b872dd90611e92903090889087906004016146c5565b6124f9612fb6565b6001600160a01b031661250a611f17565b6001600160a01b0316146125305760405162461bcd60e51b8152600401610ea890614fcc565b61012c8151600e5461254291906153b1565b11156125605760405162461bcd60e51b8152600401610ea890614e50565b60005b81518110156126405760056017600084848151811061259257634e487b7160e01b600052603260045260246000fd5b6020908102919091018101516001600160a01b031682528101919091526040016000205460ff16106125d65760405162461bcd60e51b8152600401610ea8906151df565b6001601460008484815181106125fc57634e487b7160e01b600052603260045260246000fd5b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff191691151591909117905580612638816154b0565b915050612563565b508051600e5461265091906153b1565b600e5550565b6000818152601960205260408120805460609291906126749061547b565b9050116126ab57600f61268683613732565b604051602001612697929190614639565b604051602081830303815290604052610cab565b6010601960008481526020019081526020016000206040516020016126d192919061465e565b6040516020818303038152906040529050919050565b60186020526000908152604090205460ff1681565b60125442101561271e5760405162461bcd60e51b8152600401610ea8906152f6565b60006016600061272c612fb6565b6001600160a01b0316815260208101919091526040016000205460ff16116127665760405162461bcd60e51b8152600401610ea890614eb3565b60005b60166000612775612fb6565b6001600160a01b0316815260208101919091526040016000205460ff90811690821610156127fd5760006127aa611908612fb6565b90506127b4612fb6565b6001600160a01b0316817ff5c58aa1a71554b75cd1bdc5003a01577d315f9ff19419b33f1aced2815b78ac60405160405180910390a350806127f5816154cb565b915050612769565b506016600061280a612fb6565b6001600160a01b03168152602081019190915260400160009081205460ff1690601890612835612fb6565b6001600160a01b0316815260208101919091526040016000908120805490919061286390849060ff166153c9565b92506101000a81548160ff021916908360ff160217905550600060166000612889612fb6565b6001600160a01b031681526020810191909152604001600020805460ff191660ff92909216919091179055565b600f8054611a3a9061547b565b60006128cd612fb6565b6001600160a01b03166128de611f17565b6001600160a01b0316146129045760405162461bcd60e51b8152600401610ea890614fcc565b61291261012c611388615421565b600d54106129325760405162461bcd60e51b8152600401610ea890614cdb565b6001600160a01b038216600090815260176020526040902054600560ff9091161061296f5760405162461bcd60e51b8152600401610ea8906150dd565b6129788261358a565b6001600160a01b0383166000908152601760205260408120805492935060ff90921691906129a5836154cb565b82546101009290920a60ff8181021990931691831602179091556001600160a01b0384166000908152601860205260408120805490921692506129e7836154cb565b91906101000a81548160ff021916908360ff16021790555050600d6000815480929190612a13906154b0565b90915550506040516001600160a01b0383169082907ff5c58aa1a71554b75cd1bdc5003a01577d315f9ff19419b33f1aced2815b78ac90600090a3919050565b61138881565b60006001600160a01b038316612a815760405162461bcd60e51b8152600401610ea8906151b0565b6001600160a01b038216612aa75760405162461bcd60e51b8152600401610ea890614f95565b506001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b6001600160a01b0382166000908152600b6020908152604080832084845290915281205480612b175760405162461bcd60e51b8152600401610ea890614956565b6000818152600160205260409020546001600160a01b031663cd740db560e01b1794909350915050565b6000806001600160a01b03841615612b6657612b5d848461384c565b93509050612b9c565b506000828152600160205260409020546001600160a01b031680612b9c5760405162461bcd60e51b8152600401610ea890614d12565b6001600160a01b038116301415612bb757612b5d818461384c565b60007fed81cdda615fca130279b404b909f51438f5997d5ab9a459aecb921fbd297b6d3085604051602401612bed92919061479e565b604051602081830303815290604052906001600160e01b0319166020820180516001600160e01b0383818316178352505050509050600080836001600160a01b031683604051612c3d919061461d565b600060405180830381855afa9150503d8060008114612c78576040519150601f19603f3d011682016040523d82523d6000602084013e612c7d565b606091505b50915091508115612c9057602081015194505b6001821515148015612cb257506001600160e01b0319851663cd740db560e01b145b15612cc05750505050610f32565b50505063cd740db560e01b179392505050565b600081612cf25760405162461bcd60e51b8152600401610ea890614d49565b6000612d3384848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250612fba92505050565b9050612d4186823388612fec565b6040516331a9108f60e11b81526000903390636352211e90612d67908990600401614847565b60206040518083038186803b158015612d7f57600080fd5b505afa158015612d93573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612db79190613ef1565b6001600160a01b03161415612dde5760405162461bcd60e51b8152600401610ea890614f47565b612de7816116fe565b5063785cf2dd60e11b9695505050505050565b612e02612fb6565b6001600160a01b0316612e13611f17565b6001600160a01b031614612e395760405162461bcd60e51b8152600401610ea890614fcc565b6001600160a01b038116612e5f5760405162461bcd60e51b8152600401610ea890614aaf565b611607816136e0565b600e5481565b6001600160e01b031981166301ffc9a760e01b14919050565b6001600160a01b0382166000908152600b6020908152604080832084845290915290205480612ec85760405162461bcd60e51b8152600401610ea890614af5565b848114612ee75760405162461bcd60e51b8152600401610ea890614c38565b6001600160a01b038416612f0d5760405162461bcd60e51b8152600401610ea890614e87565b6000612f18826116fe565b90506001600160a01b038116331480612f5457506001600160a01b038116600090815260066020908152604080832033845290915290205460ff165b80612f8357506001600160a01b0381811660009081526004602090815260408083208684529091529020541633145b612f9f5760405162461bcd60e51b8152600401610ea89061491f565b6115808285856138af565b6000610f2f83836139a9565b3390565b600060208201519050602082511015610cae578151612fda906008615402565b612fe690610100615421565b1c919050565b6000838152600160205260409020546001600160a01b03166130205760405162461bcd60e51b8152600401610ea890615001565b6001600160a01b0382166000908152600b602090815260408083208484529091529020548314156130635760405162461bcd60e51b8152600401610ea890614b90565b6000838152600a602090815260408083206001600160a01b0386168452909152812061308e90613579565b9050806130af5760008481526009602052604090206130ad90846139e1565b505b6000848152600a602090815260408083206001600160a01b038716845290915290206130db90836139f6565b506001600160a01b0383166000818152600b6020908152604080832086845290915290208590553014156131335760008281526003602052604090205461312e9085906001600160a01b03861690613a02565b613147565b61314784846001600160a01b031684613a02565b826001600160a01b031684866001600160a01b03167f0371ddf2288ad1ba92626a7e31c86a9d006e592cfe57d7d946ef08b13457c08b85604051611f089190614847565b6001600160a01b0383166131b15760405162461bcd60e51b8152600401610ea890614bd3565b6000818152600160205260409020546001600160a01b038481169116146131ea5760405162461bcd60e51b8152600401610ea890614878565b6001600160a01b0382166132105760405162461bcd60e51b8152600401610ea890614a80565b336001600160a01b038416146133a55760007fed81cdda615fca130279b404b909f51438f5997d5ab9a459aecb921fbd297b6d308360405160240161325692919061479e565b604051602081830303815290604052906001600160e01b0319166020820180516001600160e01b0383818316178352505050509050600080856001600160a01b0316836040516132a6919061461d565b600060405180830381855afa9150503d80600081146132e1576040519150601f19603f3d011682016040523d82523d6000602084013e6132e6565b606091505b5090925090506001821515141561332f5760208101516001600160e01b0319811663cd740db560e01b141561332d5760405162461bcd60e51b8152600401610ea890614b40565b505b6001600160a01b038616600090815260066020908152604080832033845290915290205460ff168061338557506001600160a01b0386811660009081526004602090815260408083208884529091529020541633145b6133a15760405162461bcd60e51b8152600401610ea890615038565b5050505b6001600160a01b038381166000908152600460209081526040808320858452909152902054161561342c576001600160a01b038316600081815260046020908152604080832085845290915280822080546001600160a01b0319169055518392907f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925908390a45b816001600160a01b0316836001600160a01b031614613533576001600160a01b03831660009081526005602052604090205461347857634e487b7160e01b600052600160045260246000fd5b6001600160a01b038316600090815260056020526040812080549161349c83615464565b9091555050600081815260016020908152604080832080546001600160a01b0319166001600160a01b038781169190911790915586168352600290915290206134e59082613ad7565b506001600160a01b038216600090815260026020526040902061350890826139f6565b506001600160a01b038216600090815260056020526040812080549161352d836154b0565b91905055505b80826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000610cab82613ae3565b3b151590565b60006001600160a01b0382166135b25760405162461bcd60e51b8152600401610ea890614e87565b6000805490806135c1836154b0565b90915550506000805480825260016020908152604080842080546001600160a01b0319166001600160a01b0388169081179091558452600290915290912061360990826139f6565b506001600160a01b038316600090815260056020526040812080549161362e836154b0565b9091555050600054604051613647913091602001614673565b60408051601f19818403018152828252805160209182012060008054815260038352838120919091559083019091528082526136869185908490613ae7565b6136a25760405162461bcd60e51b8152600401610ea89061511f565b60405181906001600160a01b038516906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a492915050565b600c80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60608161375757506040805180820190915260018152600360fc1b6020820152610cae565b8160005b8115613781578061376b816154b0565b915061377a9050600a836153ee565b915061375b565b6000816001600160401b038111156137a957634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156137d3576020820181803683370190505b5090505b8415611129576137e8600183615421565b91506137f5600a866154eb565b6138009060306153b1565b60f81b81838151811061382357634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a905350613845600a866153ee565b94506137d7565b6001600160a01b0382166000908152600b602090815260408083208484529091528120548061388d5760405162461bcd60e51b8152600401610ea890614956565b6000818152600160205260409020546001600160a01b031691505b9250929050565b6000838152600a602090815260408083206001600160a01b038616845290915281206001906138dd90613579565b6138e79190615421565b6000858152600a602090815260408083206001600160a01b038816845290915290209091506139169083613ad7565b506001600160a01b0383166000908152600b602090815260408083208584529091528120558061395a5760008481526009602052604090206139589084613bf8565b505b6001600160a01b038316301415613995576000828152600360205260409020546139909085906001600160a01b03861690613a02565b6113d2565b6113d284846001600160a01b031684613a02565b60008260000182815481106139ce57634e487b7160e01b600052603260045260246000fd5b9060005260206000200154905092915050565b6000610f2f836001600160a01b038416613c0d565b6000610f2f8383613c0d565b6000838152600360209081526040808320549051613a24928691869101614681565b60408051601f19818403018152918152815160209283012060008781526003909352912081905590505b6000848152600160205260409020546001600160a01b03163014156113d257306000818152600b602090815260408083209783529681528682205480835260038252918790205496519196613aa99390929091859101614681565b60408051601f1981840301815291815281516020928301206000878152600390935291208190559050613a4e565b6000610f2f8383613c57565b5490565b6000613afb846001600160a01b0316613584565b15613bf057604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290613b329033908990889088906004016146e9565b602060405180830381600087803b158015613b4c57600080fd5b505af1925050508015613b7c575060408051601f3d908101601f19168201909252613b79918101906142fe565b60015b613bd6573d808015613baa576040519150601f19603f3d011682016040523d82523d6000602084013e613baf565b606091505b508051613bce5760405162461bcd60e51b8152600401610ea8906149f7565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611129565b506001611129565b6000610f2f836001600160a01b038416613c57565b6000613c198383613d74565b613c4f57508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610f32565b506000610f32565b60008181526001830160205260408120548015613d6a576000613c7b600183615421565b8554909150600090613c8f90600190615421565b9050818114613d10576000866000018281548110613cbd57634e487b7160e01b600052603260045260246000fd5b9060005260206000200154905080876000018481548110613cee57634e487b7160e01b600052603260045260246000fd5b6000918252602080832090910192909255918252600188019052604090208390555b8554869080613d2f57634e487b7160e01b600052603160045260246000fd5b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610f32565b6000915050610f32565b60009081526001919091016020526040902054151590565b828054613d989061547b565b90600052602060002090601f016020900481019282613dba5760008555613e00565b82601f10613dd357805160ff1916838001178555613e00565b82800160010185558215613e00579182015b82811115613e00578251825591602001919060010190613de5565b50613e0c929150613e10565b5090565b5b80821115613e0c5760008155600101613e11565b60008083601f840112613e36578182fd5b5081356001600160401b03811115613e4c578182fd5b6020830191508360208285010111156138a857600080fd5b600082601f830112613e74578081fd5b81356001600160401b03811115613e8d57613e8d61552b565b613ea0601f8201601f191660200161537c565b818152846020838601011115613eb4578283fd5b816020850160208301379081016020019190915292915050565b600060208284031215613edf578081fd5b8135613eea81615541565b9392505050565b600060208284031215613f02578081fd5b8151613eea81615541565b60008060408385031215613f1f578081fd5b8235613f2a81615541565b91506020830135613f3a81615541565b809150509250929050565b600080600060608486031215613f59578081fd5b8335613f6481615541565b92506020840135613f7481615541565b929592945050506040919091013590565b600080600080600060808688031215613f9c578081fd5b8535613fa781615541565b94506020860135613fb781615541565b93506040860135925060608601356001600160401b03811115613fd8578182fd5b613fe488828901613e25565b969995985093965092949392505050565b6000806000806080858703121561400a578384fd5b843561401581615541565b9350602085013561402581615541565b92506040850135915060608501356001600160401b03811115614046578182fd5b61405287828801613e64565b91505092959194509250565b60008060008060808587031215614073578384fd5b843561407e81615541565b9350602085013561408e81615541565b93969395505050506040820135916060013590565b60008060008060008060a087890312156140bb578081fd5b86356140c681615541565b955060208701356140d681615541565b9450604087013593506060870135925060808701356001600160401b038111156140fe578182fd5b61410a89828a01613e25565b979a9699509497509295939492505050565b6000806040838503121561412e578182fd5b823561413981615541565b91506020830135613f3a81615556565b6000806040838503121561415b578182fd5b823561416681615541565b946020939093013593505050565b60008060008060808587031215614189578182fd5b843561419481615541565b93506020850135925060408501356141ab81615541565b9396929550929360600135925050565b600080600080606085870312156141d0578182fd5b84356141db81615541565b93506020850135925060408501356001600160401b038111156141fc578283fd5b61420887828801613e25565b95989497509550505050565b60006020808385031215614226578182fd5b82356001600160401b038082111561423c578384fd5b818501915085601f83011261424f578384fd5b8135818111156142615761426161552b565b838102915061427184830161537c565b8181528481019084860184860187018a101561428b578788fd5b8795505b838610156142b957803594506142a485615541565b8483526001959095019491860191860161428f565b5098975050505050505050565b6000602082840312156142d7578081fd5b8151613eea81615556565b6000602082840312156142f3578081fd5b8135613eea81615564565b60006020828403121561430f578081fd5b8151613eea81615564565b60006020828403121561432b578081fd5b81356001600160401b03811115614340578182fd5b61112984828501613e64565b60006020828403121561435d578081fd5b5035919050565b60008060408385031215614376578182fd5b823591506020830135613f3a81615541565b6000806000806080858703121561439d578182fd5b8435935060208501356143af81615541565b925060408501356141ab81615541565b600080600080600060a086880312156143d6578283fd5b8535945060208601356143e881615541565b935060408601356143f881615541565b92506060860135915060808601356001600160401b03811115614419578182fd5b61442588828901613e64565b9150509295509295909350565b600080600060608486031215614446578081fd5b833592506020840135613f7481615541565b60008060008060008060c08789031215614470578384fd5b86359550602087013561448281615541565b945060408701359350606087013561449981615541565b92506080870135915060a08701356001600160401b038111156144ba578182fd5b6144c689828a01613e64565b9150509295509295509295565b600080604083850312156144e5578182fd5b8235915060208301356001600160401b03811115614501578182fd5b61450d85828601613e64565b9150509250929050565b60008060408385031215614529578182fd5b50508035926020909101359150565b600060208284031215614549578081fd5b813560ff81168114613eea578182fd5b60008151808452614571816020860160208601615438565b601f01601f19169290920160200192915050565b80546000906002810460018083168061459f57607f831692505b60208084108214156145bf57634e487b7160e01b86526022600452602486fd5b8180156145d357600181146145e457614611565b60ff19861689528489019650614611565b6145ed886153a5565b60005b868110156146095781548b8201529085019083016145f0565b505084890196505b50505050505092915050565b6000825161462f818460208701615438565b9190910192915050565b60006146458285614585565b8351614655818360208801615438565b01949350505050565b600061112961466d8386614585565b84614585565b918252602082015260400190565b9283526020830191909152604082015260600190565b6001600160a01b0391909116815260200190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061471c90830184614559565b9695505050505050565b6001600160a01b039384168152919092166020820152604081019190915260806060820181905260009082015260a00190565b6001600160a01b03868116825285166020820152604081018490526060810183905260a06080820181905260009061479390830184614559565b979650505050505050565b6001600160a01b03929092168252602082015260400190565b6020808252825182820181905260009190848201906040850190845b818110156147f85783516001600160a01b0316835292840192918401916001016147d3565b50909695505050505050565b6020808252825182820181905260009190848201906040850190845b818110156147f857835183529284019291840191600101614820565b901515815260200190565b90815260200190565b6001600160e01b031991909116815260200190565b600060208252610f2f6020830184614559565b60208082526014908201527321aa221d102fb33937b6903737ba1037bbb732b960611b604082015260600190565b60208082526022908201527f4354443a20737461746548617368206f66205f746f6b656e4964206973207a65604082015261726f60f01b606082015260800190565b6020808252601b908201527f4354443a20737461746548617368206d69736d61746368202833290000000000604082015260600190565b6020808252601c908201527f4354443a206d73672e73656e646572206e6f7420656c696769626c6500000000604082015260600190565b6020808252600e908201526d10d5110e881b9bdd08199bdd5b9960921b604082015260600190565b60208082526024908201527f4354443a2062616c616e63654f66205f746f6b656e4f776e6572207a65726f2060408201526330b2323960e11b606082015260800190565b6020808252818101527f4d657461426f6f6d3a204e6f742061626c6520746f20636c61696d207965742e604082015260600190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252601c908201527f4d657461426f6f6d3a20707269636520697320696e636f727265637400000000604082015260600190565b6020808252601590820152744354443a205f746f207a65726f206164647265737360581b604082015260600190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b6020808252602b908201527f4354443a205f6368696c64436f6e7472616374205f6368696c64546f6b656e4960408201526a19081b9bdd08199bdd5b9960aa1b606082015260800190565b60208082526030908201527f4354443a20746f6b656e206973206368696c64206f66206f7468657220746f7060408201526f20646f776e20636f6d706f7361626c6560801b606082015260800190565b60208082526023908201527f4354443a205f6368696c64546f6b656e496420616c72656164792072656365696040820152621d995960ea1b606082015260800190565b60208082526014908201527321aa221d102fb33937b6903d32b9379030b2323960611b604082015260600190565b6020808252601b908201527f4354443a20737461746548617368206d69736d61746368202832290000000000604082015260600190565b60208082526018908201527f4354443a2077726f6e6720746f6b656e496420666f756e640000000000000000604082015260600190565b6020808252601d908201527f4d657461426f6f6d3a2070726553616c65206973206e6f74206f70656e000000604082015260600190565b6020808252818101527f4d657461426f6f6d3a207075626c696353616c65206973206e6f74206f70656e604082015260600190565b6020808252601c908201527f4d657461426f6f6d3a2072656163686564206d617820737570706c7900000000604082015260600190565b6020808252601f908201527f4354443a206f776e65724f66205f746f6b656e4964207a65726f206164647200604082015260600190565b6020808252605e908201527f4354443a206f6e4552433732315265636569766564283329205f64617461206d60408201527f75737420636f6e7461696e207468652075696e7432353620746f6b656e49642060608201527f746f207472616e7366657220746865206368696c6420746f6b656e20746f0000608082015260a00190565b60208082526021908201527f4354443a20617070726f7665206d73672e73656e646572206e6f74206f776e656040820152603960f91b606082015260800190565b60208082526023908201527f4d657461426f6f6d3a2063616c6c6572206e6f7420696e2041697264726f704c6040820152621a5cdd60ea1b606082015260800190565b60208082526019908201527f72656163686564206d61782061697244726f70537570706c7900000000000000604082015260600190565b60208082526012908201527121aa221d102fba37903d32b9379030b2323960711b604082015260600190565b6020808252601d908201527f4d657461426f6f6d3a20616c726561647920636c61696d656420616c6c000000604082015260600190565b6020808252603e908201527f4354443a20736166655472616e7366657246726f6d283429206f6e455243373260408201527f31526563656976656420696e76616c69642072657475726e2076616c75650000606082015260800190565b6020808252602e908201527f4354443a206f6e4552433732315265636569766564283329206368696c64207460408201526d1bdad95b881b9bdd081bdddb995960921b606082015260800190565b60208082526018908201527f4354443a205f6f70657261746f72207a65726f20616464720000000000000000604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252601d908201527f4354443a205f746f6b656e496420646f6573206e6f742065786973742e000000604082015260600190565b6020808252601c908201527f4354443a206d73672e73656e646572206e6f7420617070726f76656400000000604082015260600190565b6020808252601b908201527f4354443a20737461746548617368206d69736d61746368202831290000000000604082015260600190565b6020808252601a908201527f4d657461426f6f6d3a2063757272656e746c7920706175736564000000000000604082015260600190565b60208082526022908201527f4d657461426f6f6d3a2063616e206e6f7420686f6c64206d6f7265207468616e604082015261203560f01b606082015260800190565b60208082526023908201527f4354443a207472616e7366657220746f206e6f6e2045524337323152656365696040820152623b32b960e91b606082015260800190565b6020808252602e908201527f4354443a206f6e4552433732315265636569766564283429206368696c64207460408201526d1bdad95b881b9bdd081bdddb995960921b606082015260800190565b60208082526015908201527421aa221d102fb7bbb732b9103d32b9379030b2323960591b604082015260600190565b60208082526018908201527f63616e206e6f7420686f6c64206d6f7265207468616e20350000000000000000604082015260600190565b6020808252605e908201527f4354443a206f6e4552433732315265636569766564283429205f64617461206d60408201527f75737420636f6e7461696e207468652075696e7432353620746f6b656e49642060608201527f746f207472616e7366657220746865206368696c6420746f6b656e20746f0000608082015260a00190565b6020808252603e908201527f4354443a20736166655472616e7366657246726f6d283329206f6e455243373260408201527f31526563656976656420696e76616c69642072657475726e2076616c75650000606082015260800190565b6020808252601f908201527f4d657461426f6f6d3a204e6f742061626c6520746f20636c61696d2079657400604082015260600190565b60208082526021908201527f4d657461426f6f6d3a2063616c6c6572206e6f7420696e2057686974654c69736040820152601d60fa1b606082015260800190565b60ff91909116815260200190565b6040518181016001600160401b038111828210171561539d5761539d61552b565b604052919050565b60009081526020902090565b600082198211156153c4576153c46154ff565b500190565b600060ff821660ff84168060ff038211156153e6576153e66154ff565b019392505050565b6000826153fd576153fd615515565b500490565b600081600019048311821515161561541c5761541c6154ff565b500290565b600082821015615433576154336154ff565b500390565b60005b8381101561545357818101518382015260200161543b565b838111156113d25750506000910152565b600081615473576154736154ff565b506000190190565b60028104600182168061548f57607f821691505b60208210811415611d7857634e487b7160e01b600052602260045260246000fd5b60006000198214156154c4576154c46154ff565b5060010190565b600060ff821660ff8114156154e2576154e26154ff565b60010192915050565b6000826154fa576154fa615515565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461160757600080fd5b801515811461160757600080fd5b6001600160e01b03198116811461160757600080fdfea264697066735822122041cc16488e7a2004b19598c1ef78ce0dc3dacde1e03a03ae6390cd8fdd2fddb364736f6c63430008000033

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

000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000000084d657461426f6f6d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004244d4d5500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002168747470733a2f2f6170692e66616e73692e6d652f4e46542f62696f70756e6b2f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002268747470733a2f2f676174657761792e70696e6174612e636c6f75642f697066732f000000000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _name (string): MetaBoom
Arg [1] : _symbol (string): $MMU
Arg [2] : _uri (string): https://api.fansi.me/NFT/biopunk/
Arg [3] : _subUri (string): https://gateway.pinata.cloud/ipfs/

-----Encoded View---------------
14 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000c0
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000100
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000160
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000008
Arg [5] : 4d657461426f6f6d000000000000000000000000000000000000000000000000
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [7] : 244d4d5500000000000000000000000000000000000000000000000000000000
Arg [8] : 0000000000000000000000000000000000000000000000000000000000000021
Arg [9] : 68747470733a2f2f6170692e66616e73692e6d652f4e46542f62696f70756e6b
Arg [10] : 2f00000000000000000000000000000000000000000000000000000000000000
Arg [11] : 0000000000000000000000000000000000000000000000000000000000000022
Arg [12] : 68747470733a2f2f676174657761792e70696e6174612e636c6f75642f697066
Arg [13] : 732f000000000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

164:8218:14:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25704:453:1;;;;;;;;;;-1:-1:-1;25704:453:1;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11364:98;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;6755:273::-;;;;;;;;;;-1:-1:-1;6755:273:1;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;15614:720::-;;;;;;;;;;-1:-1:-1;15614:720:1;;;;;:::i;:::-;;:::i;:::-;;6281:468;;;;;;;;;;-1:-1:-1;6281:468:1;;;;;:::i;:::-;;:::i;19188:212::-;;;;;;;;;;-1:-1:-1;19188:212:1;;;;;:::i;:::-;;:::i;690:43:14:-;;;;;;;;;;-1:-1:-1;690:43:14;;;;;:::i;:::-;;:::i;5237:94::-;;;;;;;;;;-1:-1:-1;5237:94:14;;;;;:::i;:::-;;:::i;5337:100::-;;;;;;;;;;-1:-1:-1;5337:100:14;;;;;:::i;:::-;;:::i;17933:823:1:-;;;;;;;;;;-1:-1:-1;17933:823:1;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;19625:239::-;;;;;;;;;;-1:-1:-1;19625:239:1;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;5079:152:14:-;;;;;;;;;;-1:-1:-1;5079:152:14;;;;;:::i;:::-;;:::i;427:30::-;;;;;;;;;;;;;:::i;2204:885::-;;;;;;:::i;:::-;;:::i;28333:326:1:-;;;;;;;;;;-1:-1:-1;28333:326:1;;;;;:::i;:::-;;:::i;13793:455::-;;;;;;;;;;-1:-1:-1;13793:455:1;;;;;:::i;:::-;;:::i;641:42:14:-;;;;;;;;;;;;;:::i;7685:166:1:-;;;;;;;;;;-1:-1:-1;7685:166:1;;;;;:::i;:::-;;:::i;596:39:14:-;;;;;;;;;;;;;:::i;12937:187:1:-;;;;;;;;;;-1:-1:-1;12937:187:1;;;;;:::i;:::-;;:::i;19406:213::-;;;;;;;;;;-1:-1:-1;19406:213:1;;;;;:::i;:::-;;:::i;739:41:14:-;;;;;;;;;;-1:-1:-1;739:41:14;;;;;:::i;:::-;;:::i;28772:369:1:-;;;;;;;;;;-1:-1:-1;28772:369:1;;;;;:::i;:::-;;:::i;6214:104:14:-;;;;;;;;;;;;;:::i;7857:587:1:-;;;;;;;;;;-1:-1:-1;7857:587:1;;;;;:::i;:::-;;:::i;3338:186::-;;;;;;;;;;-1:-1:-1;3338:186:1;;;;;:::i;:::-;;:::i;1308:890:14:-;;;;;;:::i;:::-;;:::i;27552:229:1:-;;;;;;;;;;-1:-1:-1;27552:229:1;;;;;:::i;:::-;;:::i;5443:73:14:-;;;;;;;;;;;;;:::i;4865:103::-;;;;;;;;;;-1:-1:-1;4865:103:14;;;;;:::i;:::-;;:::i;18762:235:1:-;;;;;;;;;;-1:-1:-1;18762:235:1;;;;;:::i;:::-;;:::i;3611:387:14:-;;;;;;;;;;;;;:::i;563:26::-;;;;;;;;;;;;;:::i;532:25::-;;;;;;;;;;;;;:::i;5692:285:1:-;;;;;;;;;;-1:-1:-1;5692:285:1;;;;;:::i;:::-;;:::i;5983:292::-;;;;;;;;;;-1:-1:-1;5983:292:1;;;;;:::i;:::-;;:::i;1683:101:15:-;;;;;;;;;;;;;:::i;5522:192:14:-;;;;;;;;;;-1:-1:-1;5522:192:14;;;;;:::i;:::-;;:::i;13130:89:1:-;;;;;;;;;;;;;:::i;27894:334::-;;;;;;;;;;-1:-1:-1;27894:334:1;;;;;:::i;:::-;;:::i;6848:542:14:-;;;;;;;;;;-1:-1:-1;6848:542:14;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;838:45::-;;;;;;;;;;-1:-1:-1;838:45:14;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;6324:518::-;;;;;;;;;;-1:-1:-1;6324:518:14;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;14254:502:1:-;;;;;;;;;;-1:-1:-1;14254:502:1;;;;;:::i;:::-;;:::i;1051:85:15:-;;;;;;;;;;;;;:::i;19003:179:1:-;;;;;;;;;;-1:-1:-1;19003:179:1;;;;;:::i;:::-;;:::i;4974:99:14:-;;;;;;;;;;-1:-1:-1;4974:99:14;;;;;:::i;:::-;;:::i;11526:102:1:-;;;;;;;;;;;;;:::i;375:46:14:-;;;;;;;;;;;;;:::i;7396:586::-;;;;;;;;;;-1:-1:-1;7396:586:14;;;;;:::i;:::-;;:::i;786:46::-;;;;;;;;;;-1:-1:-1;786:46:14;;;;;:::i;:::-;;:::i;327:42::-;;;;;;;;;;;;;:::i;7034:306:1:-;;;;;;;;;;-1:-1:-1;7034:306:1;;;;;:::i;:::-;;:::i;8450:653::-;;;;;;;;;;-1:-1:-1;8450:653:1;;;;;:::i;:::-;;:::i;16404:720::-;;;;;;;;;;-1:-1:-1;16404:720:1;;;;;:::i;:::-;;:::i;14762:846::-;;;;;;;;;;-1:-1:-1;14762:846:1;;;;;:::i;:::-;;:::i;5720:488:14:-;;;;;;;;;;-1:-1:-1;5720:488:14;;;;;:::i;:::-;;:::i;7988:392::-;;;;;;;;;;-1:-1:-1;7988:392:14;;;;;:::i;:::-;;:::i;889:40::-;;;;;;;;;;-1:-1:-1;889:40:14;;;;;:::i;:::-;;:::i;4004:563::-;;;;;;;;;;;;;:::i;500:26::-;;;;;;;;;;;;;:::i;3095:510::-;;;;;;;;;;-1:-1:-1;3095:510:14;;;;;:::i;:::-;;:::i;281:40::-;;;;;;;;;;;;;:::i;7346:333:1:-;;;;;;;;;;-1:-1:-1;7346:333:1;;;;;:::i;:::-;;:::i;19870:556::-;;;;;;;;;;-1:-1:-1;19870:556:1;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;3810:1812::-;;;;;;;;;;-1:-1:-1;3810:1812:1;;;;;:::i;:::-;;:::i;17130:797::-;;;;;;;;;;-1:-1:-1;17130:797:1;;;;;:::i;:::-;;:::i;1933:232:15:-;;;;;;;;;;-1:-1:-1;1933:232:15;;;;;:::i;:::-;;:::i;463:31:14:-;;;;;;;;;;;;;:::i;25704:453:1:-;25830:4;-1:-1:-1;;;;;;25869:40:1;;-1:-1:-1;;;25869:40:1;;:109;;-1:-1:-1;;;;;;;25925:53:1;;-1:-1:-1;;;25925:53:1;25869:109;:188;;;-1:-1:-1;;;;;;;25994:63:1;;-1:-1:-1;;;25994:63:1;25869:188;:229;;;-1:-1:-1;;;;;;;;;;26073:25:1;;;25869:229;:281;;;;26114:36;26138:11;26114:23;:36::i;:::-;25850:300;;25704:453;;;;:::o;11364:98::-;11418:13;11450:5;11443:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11364:98;:::o;6755:273::-;6856:7;6879:17;6923:21;6935:8;6923:11;:21::i;:::-;-1:-1:-1;;;;;6964:47:1;;;6915:30;6964:47;;;:36;:47;;;;;;;;:57;;;;;;;;;;;-1:-1:-1;;6755:273:1;;;:::o;15614:720::-;15857:130;15885:12;15911:11;15936:14;15964:13;15857:14;:130::i;:::-;15997:186;;-1:-1:-1;;;15997:186:1;;-1:-1:-1;;;;;15997:54:1;;;;;:186;;16073:4;;16092:11;;16117:10;;16141:13;;16168:5;;15997:186;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16276:14;-1:-1:-1;;;;;16198:129:1;16251:11;-1:-1:-1;;;;;16198:129:1;16225:12;16198:129;16304:13;16198:129;;;;;;:::i;:::-;;;;;;;;15614:720;;;;;;:::o;6281:468::-;6363:17;6407:21;6419:8;6407:11;:21::i;:::-;6399:30;-1:-1:-1;;;;;;6462:23:1;;6475:10;6462:23;;:87;;-1:-1:-1;;;;;;6505:32:1;;;;;;:21;:32;;;;;;;;6538:10;6505:44;;;;;;;;;;6462:87;6441:167;;;;-1:-1:-1;;;6441:167:1;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;;;;;6618:47:1;;;;;;;:36;:47;;;;;;;;:57;;;;;;;;;:69;;-1:-1:-1;;;;;;6618:69:1;;;;;;;;;6702:40;6618:57;;:69;:47;6702:40;;;6281:468;;;:::o;19188:212::-;19314:21;19358:24;;;:14;:24;;;;;:35;;19386:6;19358:27;:35::i;:::-;19351:42;;19188:212;;;;;:::o;690:43:14:-;;;;;;;;;;;;;;;:::o;5237:94::-;1274:12:15;:10;:12::i;:::-;-1:-1:-1;;;;;1263:23:15;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1263:23:15;;1255:68;;;;-1:-1:-1;;;1255:68:15;;;;;;;:::i;:::-;5305:11:14::1;:19:::0;5237:94::o;5337:100::-;1274:12:15;:10;:12::i;:::-;-1:-1:-1;;;;;1263:23:15;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1263:23:15;;1255:68;;;;-1:-1:-1;;;1255:68:15;;;;;;;:::i;:::-;5408:14:14::1;:22:::0;5337:100::o;17933:823:1:-;18093:6;18132:16;18111:157;;;;-1:-1:-1;;;18111:157:1;;;;;;;:::i;:::-;18375:15;18393:20;18407:5;;18393:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;18393:13:1;;-1:-1:-1;;;18393:20:1:i;:::-;18375:38;;18423:55;18436:5;18443:7;18452:10;18464:13;18423:12;:55::i;:::-;18509:42;;-1:-1:-1;;;18509:42:1;;18563:1;;18517:10;;18509:27;;:42;;18537:13;;18509:42;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;18509:56:1;;;18488:149;;;;-1:-1:-1;;;18488:149:1;;;;;;;:::i;:::-;18693:20;18705:7;18693:11;:20::i;:::-;-1:-1:-1;;;;18730:19:1;17933:823;-1:-1:-1;;;;;;;17933:823:1:o;19625:239::-;19770:20;19809:21;;;:11;:21;;;;;;;;-1:-1:-1;;;;;19809:37:1;;;;;;;;;:48;;19850:6;19809:40;:48::i;:::-;19802:55;19625:239;-1:-1:-1;;;;19625:239:1:o;5079:152:14:-;1274:12:15;:10;:12::i;:::-;-1:-1:-1;;;;;1263:23:15;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1263:23:15;;1255:68;;;;-1:-1:-1;;;1255:68:15;;;;;;;:::i;:::-;5192:20:14::1;::::0;;;:10:::1;:20;::::0;;;;;;;:32;;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;;5079:152:::0;;:::o;427:30::-;;;;:::o;2204:885::-;2280:6;;;;2279:7;2271:46;;;;-1:-1:-1;;;2271:46:14;;;;;;;:::i;:::-;2367:14;;2348:15;:33;;2327:112;;;;-1:-1:-1;;;2327:112:14;;;;;;;:::i;:::-;2503:28;418:3;317:4;2503:28;:::i;:::-;2485:12;2471:26;;:11;;:26;;;;:::i;:::-;2470:62;;2449:137;;;;-1:-1:-1;;;2449:137:14;;;;;;;:::i;:::-;2664:1;2647:12;2618;:26;2631:12;:10;:12::i;:::-;-1:-1:-1;;;;;2618:26:14;;;;;;;;;;;;-1:-1:-1;2618:26:14;;:41;;;:26;;:41;:::i;:::-;2617:48;;;;2596:129;;;;-1:-1:-1;;;2596:129:14;;;;;;;:::i;:::-;2770:20;;;;359:10;2770:20;:::i;:::-;2756:9;:35;;2735:110;;;;-1:-1:-1;;;2735:110:14;;;;;;;:::i;:::-;2914:12;2885;:26;2898:12;:10;:12::i;:::-;-1:-1:-1;;;;;2885:26:14;;;;;;;;;;;;-1:-1:-1;2885:26:14;;:41;;;:26;;:41;:::i;:::-;2856:12;:26;2869:12;:10;:12::i;:::-;-1:-1:-1;;;;;2856:26:14;-1:-1:-1;;;;;2856:26:14;;;;;;;;;;;;;:70;;;;;;;;;;;;;;;;;;3020:12;2978:13;:27;2992:12;:10;:12::i;:::-;-1:-1:-1;;;;;2978:27:14;;;;;;;;;;;;-1:-1:-1;2978:27:14;;:54;;;:27;;:54;:::i;:::-;2936:13;:27;2950:12;:10;:12::i;:::-;-1:-1:-1;;;;;2936:27:14;;;;;;;;;;;;-1:-1:-1;2936:27:14;:96;;-1:-1:-1;;2936:96:14;;;;;;;;3056:11;;:26;;;;;;:::i;:::-;3042:11;:40;-1:-1:-1;2204:885:14:o;28333:326:1:-;28531:27;;;;:18;:27;;;;;;28510:48;;28489:122;;;;-1:-1:-1;;;28489:122:1;;;;;;;:::i;:::-;28621:31;28634:4;28640:2;28644:7;28621:12;:31::i;:::-;28333:326;;;;:::o;13793:455::-;13968:64;13983:12;13997:3;14002:14;14018:13;13968:14;:64::i;:::-;14042:121;;-1:-1:-1;;;14042:121:1;;-1:-1:-1;;;;;14042:40:1;;;;;:121;;14104:4;;14123:3;;14140:13;;14042:121;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14211:14;-1:-1:-1;;;;;14178:63:1;14206:3;-1:-1:-1;;;;;14178:63:1;14192:12;14178:63;14227:13;14178:63;;;;;;:::i;:::-;;;;;;;;13793:455;;;;:::o;641:42:14:-;;;;:::o;7685:166:1:-;7809:35;7823:5;7830:3;7835:8;7809:13;:35::i;596:39:14:-;;;;:::o;12937:187:1:-;-1:-1:-1;;;;;13087:20:1;;13057:7;13087:20;;;:13;:20;;;;;:30;;13111:5;13087:23;:30::i;19406:213::-;19536:7;19566:21;;;:11;:21;;;;;;;;-1:-1:-1;;;;;19566:37:1;;;;;;;;;:46;;:44;:46::i;739:41:14:-;;;;;;;;;;;;;;;:::o;28772:369:1:-;29003:27;;;;:18;:27;;;;;;28982:48;;28961:122;;;;-1:-1:-1;;;28961:122:1;;;;;;;:::i;:::-;29093:41;29110:4;29116:2;29120:7;29129:4;;29093:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;29093:16:1;;-1:-1:-1;;;29093:41:1:i;:::-;28772:369;;;;;;:::o;6214:104:14:-;1274:12:15;:10;:12::i;:::-;-1:-1:-1;;;;;1263:23:15;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1263:23:15;;1255:68;;;;-1:-1:-1;;;1255:68:15;;;;;;;:::i;:::-;6271:7:14::1;:5;:7::i;:::-;-1:-1:-1::0;;;;;6263:25:14::1;:48;6289:21;6263:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;6214:104::o:0;7857:587:1:-;7985:35;7999:5;8006:3;8011:8;7985:13;:35::i;:::-;8034:16;:3;-1:-1:-1;;;;;8034:14:1;;:16::i;:::-;8030:408;;;8082:148;;-1:-1:-1;;;8082:148:1;;8066:13;;-1:-1:-1;;;;;8082:37:1;;;;;:148;;8137:10;;8165:5;;8188:8;;8082:148;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;8066:164;-1:-1:-1;;;;;;;8269:29:1;;-1:-1:-1;;;8269:29:1;;:62;;-1:-1:-1;;;;;;;8302:29:1;;-1:-1:-1;;;8302:29:1;8269:62;8244:183;;;;-1:-1:-1;;;8244:183:1;;;;;;;:::i;3338:186::-;3439:17;3479:38;3504:1;3508:8;3479:16;:38::i;1308:890:14:-;4616:9;:23;4626:12;:10;:12::i;:::-;-1:-1:-1;;;;;4616:23:14;;;;;;;;;;;;-1:-1:-1;4616:23:14;;;;4608:69;;;;-1:-1:-1;;;4608:69:14;;;;;;;:::i;:::-;1395:6:::1;::::0;::::1;;1394:7;1386:46;;;;-1:-1:-1::0;;;1386:46:14::1;;;;;;;:::i;:::-;1482:11;;1463:15;:30;;1442:106;;;;-1:-1:-1::0;;;1442:106:14::1;;;;;;;:::i;27552:229:1:-:0;27609:7;27649:27;;;:18;:27;;;;;;27694:14;27686:61;;;;-1:-1:-1;;;27686:61:1;;;;;;;:::i;5443:73:14:-;1274:12:15;:10;:12::i;:::-;-1:-1:-1;;;;;1263:23:15;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1263:23:15;;1255:68;;;;-1:-1:-1;;;1255:68:15;;;;;;;:::i;:::-;5503:6:14::1;::::0;;-1:-1:-1;;5493:16:14;::::1;5503:6;::::0;;::::1;5502:7;5493:16;::::0;;5443:73::o;4865:103::-;1274:12:15;:10;:12::i;:::-;-1:-1:-1;;;;;1263:23:15;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1263:23:15;;1255:68;;;;-1:-1:-1;;;1255:68:15;;;;;;;:::i;:::-;4938:23:14;;::::1;::::0;:12:::1;::::0;:23:::1;::::0;::::1;::::0;::::1;:::i;:::-;;4865:103:::0;:::o;18762:235:1:-;-1:-1:-1;;;;;18915:31:1;;;;18877:4;18915:31;;;:15;:31;;;;;;;;:46;;;;;;;;18978:12;;;18762:235::o;3611:387:14:-;4755:11;:25;4767:12;:10;:12::i;:::-;-1:-1:-1;;;;;4755:25:14;;;;;;;;;;;;-1:-1:-1;4755:25:14;;;;4734:107;;;;-1:-1:-1;;;4734:107:14;;;;;;;:::i;:::-;3706:11:::1;;3687:15;:30;;3666:109;;;;-1:-1:-1::0;;;3666:109:14::1;;;;;;;:::i;:::-;3785:16;3804:23;3814:12;:10;:12::i;:::-;3804:9;:23::i;:::-;3785:42;;3865:5;3837:11;:25;3849:12;:10;:12::i;:::-;-1:-1:-1::0;;;;;3837:25:14::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;3837:25:14;:33;;-1:-1:-1;;3837:33:14::1;::::0;::::1;;::::0;;;::::1;::::0;;3907:12:::1;:10;:12::i;:::-;-1:-1:-1::0;;;;;3885:35:14::1;3897:8;3885:35;;;;;;;;;;3930:12;:26;3943:12;:10;:12::i;:::-;-1:-1:-1::0;;;;;3930:26:14::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;3930:26:14;;;:28;;::::1;;::::0;::::1;::::0;::::1;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;3968:7;:21;3976:12;:10;:12::i;:::-;-1:-1:-1::0;;;;;3968:21:14::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;3968:21:14;;;:23;;::::1;;::::0;::::1;::::0;::::1;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;4851:1;3611:387::o:0;563:26::-;;;;;;:::o;532:25::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;5692:285:1:-;5789:18;5836:29;;;:19;:29;;;;;;-1:-1:-1;;;;;5836:29:1;5883:24;5875:68;;;;-1:-1:-1;;;5875:68:1;;;;;;;:::i;5983:292::-;6085:7;-1:-1:-1;;;;;6129:25:1;;6108:108;;;;-1:-1:-1;;;6108:108:1;;;;;;;:::i;:::-;-1:-1:-1;;;;;;6233:35:1;;;;;:22;:35;;;;;;;5983:292::o;1683:101:15:-;1274:12;:10;:12::i;:::-;-1:-1:-1;;;;;1263:23:15;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1263:23:15;;1255:68;;;;-1:-1:-1;;;1255:68:15;;;;;;;:::i;:::-;1747:30:::1;1774:1;1747:18;:30::i;:::-;1683:101::o:0;5522:192:14:-;1274:12:15;:10;:12::i;:::-;-1:-1:-1;;;;;1263:23:15;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1263:23:15;;1255:68;;;;-1:-1:-1;;;1255:68:15;;;;;;;:::i;:::-;5611:9:14::1;5606:102;5630:9;:16;5626:1;:20;5606:102;;;5693:4;5667:9;:23;5677:9;5687:1;5677:12;;;;;;-1:-1:-1::0;;;5677:12:14::1;;;;;;;;;;::::0;;::::1;::::0;;;;;;;-1:-1:-1;;;;;5667:23:14::1;::::0;;;::::1;::::0;;;;;;-1:-1:-1;5667:23:14;:30;;-1:-1:-1;;5667:30:14::1;::::0;::::1;;::::0;;;::::1;::::0;;5648:3;::::1;::::0;::::1;:::i;:::-;;;;5606:102;;13130:89:1::0;13176:7;13202:10;13130:89;:::o;27894:334::-;28096:27;;;;:18;:27;;;;;;28075:48;;28054:122;;;;-1:-1:-1;;;28054:122:1;;;;;;;:::i;:::-;28186:35;28203:4;28209:2;28213:7;28186:16;:35::i;6848:542:14:-;6943:16;6975:18;6996:29;7016:8;6996:19;:29::i;:::-;6975:50;-1:-1:-1;7039:15:14;7035:349;;7091:1;7077:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;7077:16:14;;7070:23;;;;;7035:349;7124:23;7164:10;-1:-1:-1;;;;;7150:25:14;;;;;-1:-1:-1;;;7150:25:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;7150:25:14;;7124:51;;7189:13;7216:131;7240:10;7232:5;:18;7216:131;;;7295:37;7316:8;7326:5;7295:20;:37::i;:::-;7279:6;7286:5;7279:13;;;;;;-1:-1:-1;;;7279:13:14;;;;;;;;;-1:-1:-1;;;;;7279:53:14;;;:13;;;;;;;;;;;:53;7252:7;;;;:::i;:::-;;;;7216:131;;;-1:-1:-1;7367:6:14;-1:-1:-1;7360:13:14;;-1:-1:-1;7360:13:14;7035:349;6848:542;;;;:::o;838:45::-;;;;;;;;;;;;;;;:::o;6324:518::-;6410:16;6442:18;6463:17;6473:6;6463:9;:17::i;:::-;6442:38;-1:-1:-1;6494:15:14;6490:346;;6546:1;6532:16;;6490:346;6579:23;6619:10;-1:-1:-1;;;;;6605:25:14;;;;;-1:-1:-1;;;6605:25:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;6605:25:14;;6579:51;;6644:13;6671:128;6695:10;6687:5;:18;6671:128;;;6750:34;6770:6;6778:5;6750:19;:34::i;:::-;6734:6;6741:5;6734:13;;;;;;-1:-1:-1;;;6734:13:14;;;;;;;;;;;;;;;;;;:50;6707:7;;;;:::i;:::-;;;;6671:128;;14254:502:1;14457:64;14472:12;14486:3;14491:14;14507:13;14457:14;:64::i;:::-;14531:140;;-1:-1:-1;;;14531:140:1;;-1:-1:-1;;;;;14531:40:1;;;;;:140;;14593:4;;14612:3;;14629:13;;14656:5;;14531:140;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14719:14;-1:-1:-1;;;;;14686:63:1;14714:3;-1:-1:-1;;;;;14686:63:1;14700:12;14686:63;14735:13;14686:63;;;;;;:::i;:::-;;;;;;;;14254:502;;;;;:::o;1051:85:15:-;1123:6;;-1:-1:-1;;;;;1123:6:15;1051:85;:::o;19003:179:1:-;19112:7;19142:24;;;:14;:24;;;;;:33;;:31;:33::i;4974:99:14:-;1274:12:15;:10;:12::i;:::-;-1:-1:-1;;;;;1263:23:15;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1263:23:15;;1255:68;;;;-1:-1:-1;;;1255:68:15;;;;;;;:::i;:::-;5045:21:14;;::::1;::::0;:11:::1;::::0;:21:::1;::::0;::::1;::::0;::::1;:::i;11526:102:1:-:0;11582:13;11614:7;11607:14;;;;;:::i;375:46:14:-;418:3;375:46;:::o;7396:586::-;7517:16;7549:18;7570:38;7587:8;7597:10;7570:16;:38::i;:::-;7549:59;-1:-1:-1;7622:15:14;7618:358;;-1:-1:-1;;7660:16:14;;;7674:1;7660:16;;;;;;;;7653:23;;7618:358;7707:23;7747:10;-1:-1:-1;;;;;7733:25:14;;;;;-1:-1:-1;;;7733:25:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;7733:25:14;;7707:51;;7772:13;7799:140;7823:10;7815:5;:18;7799:140;;;7878:46;7896:8;7906:10;7918:5;7878:17;:46::i;:::-;7862:6;7869:5;7862:13;;;;;;-1:-1:-1;;;7862:13:14;;;;;;;;;;;;;;;;;;:62;7835:7;;;;:::i;:::-;;;;7799:140;;;-1:-1:-1;7959:6:14;-1:-1:-1;7952:13:14;;-1:-1:-1;7952:13:14;786:46;;;;;;;;;;;;;;;:::o;327:42::-;359:10;327:42;:::o;7034:306:1:-;-1:-1:-1;;;;;7152:23:1;;7144:60;;;;-1:-1:-1;;;7144:60:1;;;;;;;:::i;:::-;7236:10;7214:33;;;;:21;:33;;;;;;;;-1:-1:-1;;;;;7214:44:1;;;;;;;;;;;:56;;-1:-1:-1;;7214:56:1;;;;;;;7285:48;;7214:44;;7236:10;7285:48;;;;7214:56;;7285:48;:::i;:::-;;;;;;;;7034:306;;:::o;8450:653::-;8606:35;8620:5;8627:3;8632:8;8606:13;:35::i;:::-;8655:16;:3;-1:-1:-1;;;;;8655:14:1;;:16::i;:::-;8651:446;;;8703:151;;-1:-1:-1;;;8703:151:1;;8687:13;;-1:-1:-1;;;;;8703:37:1;;;;;:151;;8758:10;;8786:5;;8809:8;;8835:5;;8703:151;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;8687:167;-1:-1:-1;;;;;;;8893:29:1;;-1:-1:-1;;;8893:29:1;;:62;;-1:-1:-1;;;;;;;8926:29:1;;-1:-1:-1;;;8926:29:1;8893:62;8868:183;;;;-1:-1:-1;;;8868:183:1;;;;;;;:::i;:::-;9065:21;9077:8;9065:11;:21::i;16404:720::-;16568:60;16581:5;16588:8;16598:14;16614:13;16568:12;:60::i;:::-;-1:-1:-1;;;;;16659:19:1;;16668:10;16659:19;;:98;;-1:-1:-1;16698:59:1;;-1:-1:-1;;;16698:59:1;;-1:-1:-1;;;;;16698:40:1;;;;;:59;;16739:5;;16746:10;;16698:59;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;16659:198;;;-1:-1:-1;16777:50:1;;-1:-1:-1;;;16777:50:1;;16847:10;;-1:-1:-1;;;;;16777:35:1;;;;;:50;;16813:13;;16777:50;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;16777:80:1;;16659:198;16638:273;;;;-1:-1:-1;;;16638:273:1;;;;;;;:::i;:::-;16921:119;;-1:-1:-1;;;16921:119:1;;-1:-1:-1;;;;;16921:36:1;;;;;:119;;16971:5;;16998:4;;17017:13;;16921:119;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17096:21;17108:8;17096:11;:21::i;:::-;;16404:720;;;;:::o;14762:846::-;14933:64;14948:12;14962:3;14967:14;14983:13;14933:14;:64::i;:::-;15280:21;3036:37;15361:4;15379:13;15304:98;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;-1:-1:-1;;;;;15304:98:1;;;;;;;-1:-1:-1;;;;;15304:98:1;;;;;;;;;;;15280:122;;15412:14;-1:-1:-1;;;;;15412:19:1;15432:8;15412:29;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;15452:71:1;;-1:-1:-1;;;15452:71:1;;-1:-1:-1;;;;;15452:36:1;;;-1:-1:-1;15452:36:1;;:71;;15497:4;;15504:3;;15509:13;;15452:71;;;:::i;5720:488:14:-;1274:12:15;:10;:12::i;:::-;-1:-1:-1;;;;;1263:23:15;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1263:23:15;;1255:68;;;;-1:-1:-1;;;1255:68:15;;;;;;;:::i;:::-;418:3:14::1;5862:9;:16;5847:12;;:31;;;;:::i;:::-;:51;;5826:123;;;;-1:-1:-1::0;;;5826:123:14::1;;;;;;;:::i;:::-;5965:9;5960:185;5984:9;:16;5980:1;:20;5960:185;;;6058:1;6029:12;:26;6042:9;6052:1;6042:12;;;;;;-1:-1:-1::0;;;6042:12:14::1;;;;;;;;;;::::0;;::::1;::::0;;;;;;;-1:-1:-1;;;;;6029:26:14::1;::::0;;;::::1;::::0;;;;;;-1:-1:-1;6029:26:14;;::::1;;:30;6021:67;;;;-1:-1:-1::0;;;6021:67:14::1;;;;;;;:::i;:::-;6130:4;6102:11;:25;6114:9;6124:1;6114:12;;;;;;-1:-1:-1::0;;;6114:12:14::1;;;;;;;;;;::::0;;::::1;::::0;;;;;;;-1:-1:-1;;;;;6102:25:14::1;::::0;;;::::1;::::0;;;;;;-1:-1:-1;6102:25:14;:32;;-1:-1:-1;;6102:32:14::1;::::0;::::1;;::::0;;;::::1;::::0;;6002:3;::::1;::::0;::::1;:::i;:::-;;;;5960:185;;;;6185:9;:16;6170:12;;:31;;;;:::i;:::-;6155:12;:46:::0;-1:-1:-1;5720:488:14:o;7988:392::-;8171:1;8140:20;;;:10;:20;;;;;8134:34;;8086:13;;8171:1;8140:20;8134:34;;;:::i;:::-;;;:38;:239;;8314:12;8328:26;8345:8;8328:16;:26::i;:::-;8297:58;;;;;;;;;:::i;:::-;;;;;;;;;;;;;8134:239;;;8215:11;8228:10;:20;8239:8;8228:20;;;;;;;;;;;8198:51;;;;;;;;;:::i;:::-;;;;;;;;;;;;;8115:258;;7988:392;;;:::o;889:40::-;;;;;;;;;;;;;;;:::o;4004:563::-;4083:11;;4064:15;:30;;4043:108;;;;-1:-1:-1;;;4043:108:14;;;;;;;:::i;:::-;4213:1;4183:13;:27;4197:12;:10;:12::i;:::-;-1:-1:-1;;;;;4183:27:14;;;;;;;;;;;;-1:-1:-1;4183:27:14;;;;:31;4162:107;;;;-1:-1:-1;;;4162:107:14;;;;;;;:::i;:::-;4285:7;4280:177;4302:13;:27;4316:12;:10;:12::i;:::-;-1:-1:-1;;;;;4302:27:14;;;;;;;;;;;;-1:-1:-1;4302:27:14;;;;;;4298:31;;;;4280:177;;;4350:16;4369:23;4379:12;:10;:12::i;4369:23::-;4350:42;;4433:12;:10;:12::i;:::-;-1:-1:-1;;;;;4411:35:14;4423:8;4411:35;;;;;;;;;;-1:-1:-1;4331:3:14;;;;:::i;:::-;;;;4280:177;;;;4492:13;:27;4506:12;:10;:12::i;:::-;-1:-1:-1;;;;;4492:27:14;;;;;;;;;;;;-1:-1:-1;4492:27:14;;;;;;;4467:7;;4475:12;:10;:12::i;:::-;-1:-1:-1;;;;;4467:21:14;;;;;;;;;;;;-1:-1:-1;4467:21:14;;;:52;;:21;;-1:-1:-1;4467:52:14;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;4559:1;4529:13;:27;4543:12;:10;:12::i;:::-;-1:-1:-1;;;;;4529:27:14;;;;;;;;;;;;-1:-1:-1;4529:27:14;:31;;-1:-1:-1;;4529:31:14;;;;;;;;;;;;4004:563::o;500:26::-;;;;;;;:::i;3095:510::-;3181:16;1274:12:15;:10;:12::i;:::-;-1:-1:-1;;;;;1263:23:15;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1263:23:15;;1255:68;;;;-1:-1:-1;;;1255:68:15;;;;;;;:::i;:::-;3249:28:14::1;418:3;317:4;3249:28;:::i;:::-;3234:11;;:44;3213:119;;;;-1:-1:-1::0;;;3213:119:14::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;3350:19:14;::::1;;::::0;;;:12:::1;:19;::::0;;;;;3372:1:::1;3350:19;::::0;;::::1;:23;3342:70;;;;-1:-1:-1::0;;;3342:70:14::1;;;;;;;:::i;:::-;3434:16;3444:5;3434:9;:16::i;:::-;-1:-1:-1::0;;;;;3460:19:14;::::1;;::::0;;;:12:::1;:19;::::0;;;;:21;;3423:27;;-1:-1:-1;3460:21:14::1;::::0;;::::1;::::0;:19;:21:::1;::::0;::::1;:::i;:::-;::::0;;::::1;::::0;;;::::1;;::::0;;::::1;;::::0;;::::1;::::0;;::::1;;;::::0;;;-1:-1:-1;;;;;3491:14:14;::::1;-1:-1:-1::0;3491:14:14;;;:7:::1;:14;::::0;;;;:16;;;;::::1;::::0;-1:-1:-1;3491:16:14::1;::::0;::::1;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;3517:11;;:13;;;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;3545:28:14::1;::::0;-1:-1:-1;;;;;3545:28:14;::::1;::::0;3557:8;;3545:28:::1;::::0;;;::::1;3095:510:::0;;;:::o;281:40::-;317:4;281:40;:::o;7346:333:1:-;7471:4;-1:-1:-1;;;;;7499:20:1;;7491:54;;;;-1:-1:-1;;;7491:54:1;;;;;;;:::i;:::-;-1:-1:-1;;;;;7563:23:1;;7555:60;;;;-1:-1:-1;;;7555:60:1;;;;;;;:::i;:::-;-1:-1:-1;;;;;;7632:29:1;;;;;;;:21;:29;;;;;;;;:40;;;;;;;;;;;;;;;7346:333::o;19870:556::-;-1:-1:-1;;;;;20082:31:1;;20003:24;20082:31;;;:15;:31;;;;;;;;:46;;;;;;;;;20146:18;20138:45;;;;-1:-1:-1;;;20138:45:1;;;;;;;:::i;:::-;20193:31;20227:34;;;:19;:34;;;;;;-1:-1:-1;;;;;20227:34:1;-1:-1:-1;;;20314:96:1;;20227:34;;-1:-1:-1;20314:96:1;-1:-1:-1;;20280:140:1:o;3810:1812::-;3945:17;;-1:-1:-1;;;;;4016:28:1;;;4012:403;;4096:90;4127:14;4159:13;4096;:90::i;:::-;4060:126;-1:-1:-1;4060:126:1;-1:-1:-1;4012:403:1;;;-1:-1:-1;4236:34:1;;;;:19;:34;;;;;;-1:-1:-1;;;;;4236:34:1;4309:30;4284:120;;;;-1:-1:-1;;;4284:120:1;;;;;;;:::i;:::-;-1:-1:-1;;;;;4490:33:1;;4518:4;4490:33;4483:195;;;4575:92;4606:16;4640:13;4575;:92::i;4483:195::-;4687:21;3133:46;4788:4;4807:13;4711:119;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;-1:-1:-1;;;;;4711:119:1;;;;;;;-1:-1:-1;;;;;4711:119:1;;;;;;;;;;;4687:143;;4841:16;4859:17;4880:16;-1:-1:-1;;;;;4880:27:1;4921:8;4880:59;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4840:99;;;;4953:11;4949:117;;;5036:4;5030;5026:15;5020:22;5007:35;;4989:67;5108:4;5093:19;;;;:166;;;;-1:-1:-1;;;;;;;5128:94:1;;-1:-1:-1;;;5128:131:1;5093:166;5076:540;;;5348:16;;;;;;5076:540;-1:-1:-1;;;;;;5549:43:1;;;-1:-1:-1;;;3810:1812:1:o;17130:797::-;17264:6;17303:16;17282:157;;;;-1:-1:-1;;;17282:157:1;;;;;;;:::i;:::-;17546:15;17564:20;17578:5;;17564:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;17564:13:1;;-1:-1:-1;;;17564:20:1:i;:::-;17546:38;;17594:55;17607:5;17614:7;17623:10;17635:13;17594:12;:55::i;:::-;17680:42;;-1:-1:-1;;;17680:42:1;;17734:1;;17688:10;;17680:27;;:42;;17708:13;;17680:42;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;17680:56:1;;;17659:149;;;;-1:-1:-1;;;17659:149:1;;;;;;;:::i;:::-;17864:20;17876:7;17864:11;:20::i;:::-;-1:-1:-1;;;;17901:19:1;17130:797;-1:-1:-1;;;;;;17130:797:1:o;1933:232:15:-;1274:12;:10;:12::i;:::-;-1:-1:-1;;;;;1263:23:15;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1263:23:15;;1255:68;;;;-1:-1:-1;;;1255:68:15;;;;;;;:::i;:::-;-1:-1:-1;;;;;2034:22:15;::::1;2013:107;;;;-1:-1:-1::0;;;2013:107:15::1;;;;;;;:::i;:::-;2130:28;2149:8;2130:18;:28::i;463:31:14:-:0;;;;:::o;829:199:3:-;-1:-1:-1;;;;;;981:40:3;;-1:-1:-1;;;981:40:3;829:199;;;:::o;20432:855:1:-;-1:-1:-1;;;;;20612:31:1;;20594:15;20612:31;;;:15;:31;;;;;;;;:46;;;;;;;;;20676:12;20668:68;;;;-1:-1:-1;;;20668:68:1;;;;;;;:::i;:::-;20765:12;20754:7;:23;20746:60;;;;-1:-1:-1;;;20746:60:1;;;;;;;:::i;:::-;-1:-1:-1;;;;;20824:17:1;;20816:48;;;;-1:-1:-1;;;20816:48:1;;;;;;;:::i;:::-;20874:17;20918:20;20930:7;20918:11;:20::i;:::-;20910:29;-1:-1:-1;;;;;;20972:23:1;;20985:10;20972:23;;:87;;-1:-1:-1;;;;;;21015:32:1;;;;;;:21;:32;;;;;;;;21048:10;21015:44;;;;;;;;;;20972:87;:193;;;-1:-1:-1;;;;;;21079:47:1;;;;;;;:36;:47;;;;;;;;:56;;;;;;;;;;21155:10;21079:86;20972:193;20951:268;;;;-1:-1:-1;;;20951:268:1;;;;;;;:::i;:::-;21229:51;21241:7;21250:14;21266:13;21229:11;:51::i;9118:184:4:-;9216:7;9270:22;9274:3;9286:5;9270:3;:22::i;640:96:2:-;719:10;640:96;:::o;21670:391:1:-;21759:15;21937:4;21930:5;21926:16;21920:23;21909:34;;21981:2;21966:5;:12;:17;21962:93;;;22027:12;;:16;;22042:1;22027:16;:::i;:::-;22021:22;;:3;:22;:::i;:::-;22009:35;21670:391;;;:::o;24020:1242::-;24240:1;24199:29;;;:19;:29;;;;;;-1:-1:-1;;;;;24199:29:1;24178:119;;;;-1:-1:-1;;;24178:119:1;;;;;;;:::i;:::-;-1:-1:-1;;;;;24328:31:1;;;;;;:15;:31;;;;;;;;:46;;;;;;;;;:58;;;24307:140;;;;-1:-1:-1;;;24307:140:1;;;;;;;:::i;:::-;24457:25;24485:21;;;:11;:21;;;;;;;;-1:-1:-1;;;;;24485:37:1;;;;;;;;;:59;;:57;:59::i;:::-;24457:87;-1:-1:-1;24558:22:1;24554:97;;24596:24;;;;:14;:24;;;;;:44;;24625:14;24596:28;:44::i;:::-;;24554:97;24660:21;;;;:11;:21;;;;;;;;-1:-1:-1;;;;;24660:37:1;;;;;;;;;:56;;24702:13;24660:41;:56::i;:::-;-1:-1:-1;;;;;;24726:31:1;;;;;;:15;:31;;;;;;;;:46;;;;;;;;:57;;;24823:4;24797:31;24793:387;;;24954:33;;;;:18;:33;;;;;;24844:157;;24878:8;;-1:-1:-1;;;;;24904:32:1;;;24844:16;:157::i;:::-;24793:387;;;25032:137;25066:8;25108:14;-1:-1:-1;;;;;25092:32:1;25142:13;25032:16;:137::i;:::-;25225:14;-1:-1:-1;;;;;25194:61:1;25215:8;25208:5;-1:-1:-1;;;;;25194:61:1;;25241:13;25194:61;;;;;;:::i;9109:2024::-;-1:-1:-1;;;;;9234:19:1;;9226:52;;;;-1:-1:-1;;;9226:52:1;;;;;;;:::i;:::-;9296:29;;;;:19;:29;;;;;;-1:-1:-1;;;;;9296:38:1;;;:29;;:38;9288:71;;;;-1:-1:-1;;;9288:71:1;;;;;;;:::i;:::-;-1:-1:-1;;;;;9377:17:1;;9369:51;;;;-1:-1:-1;;;9369:51:1;;;;;;;:::i;:::-;9435:10;-1:-1:-1;;;;;9435:19:1;;;9431:1014;;9470:21;3133:46;9579:4;9602:8;9494:130;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;-1:-1:-1;;;;;9494:130:1;;;;;;;-1:-1:-1;;;;;9494:130:1;;;;;;;;;;;9470:154;;9639:16;9657:17;9678:5;-1:-1:-1;;;;;9678:16:1;9695:8;9678:26;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;9638:66:1;;-1:-1:-1;9638:66:1;-1:-1:-1;9737:4:1;9722:19;;;;9718:464;;;9856:4;9846:15;;9840:22;-1:-1:-1;;;;;;9926:102:1;;-1:-1:-1;;;9926:151:1;;9897:270;;;;-1:-1:-1;;;9897:270:1;;;;;;;:::i;:::-;9718:464;;-1:-1:-1;;;;;10221:28:1;;;;;;:21;:28;;;;;;;;10250:10;10221:40;;;;;;;;;;;:151;;-1:-1:-1;;;;;;10285:43:1;;;;;;;:36;:43;;;;;;;;:53;;;;;;;;;;10362:10;10285:87;10221:151;10196:238;;;;-1:-1:-1;;;10196:238:1;;;;;;;:::i;:::-;9431:1014;;;;-1:-1:-1;;;;;10498:43:1;;;10563:1;10498:43;;;:36;:43;;;;;;;;:53;;;;;;;;;;:67;10481:236;;-1:-1:-1;;;;;10597:43:1;;;;;;:36;:43;;;;;;;;:53;;;;;;;;;10590:60;;-1:-1:-1;;;;;;10590:60:1;;;10669:37;10641:8;;10597:43;10669:37;;10597:43;;10669:37;10481:236;10777:3;-1:-1:-1;;;;;10768:12:1;:5;-1:-1:-1;;;;;10768:12:1;;10764:318;;-1:-1:-1;;;;;10803:29:1;;10835:1;10803:29;;;:22;:29;;;;;;10796:41;;-1:-1:-1;;;10796:41:1;;;;;;;;;-1:-1:-1;;;;;10851:29:1;;;;;;:22;:29;;;;;:31;;;;;;:::i;:::-;;;;-1:-1:-1;;10896:29:1;;;;:19;:29;;;;;;;;:35;;-1:-1:-1;;;;;;10896:35:1;-1:-1:-1;;;;;10896:35:1;;;;;;;;;;10945:20;;;;:13;:20;;;;;:37;;10896:29;10945:27;:37::i;:::-;-1:-1:-1;;;;;;10996:18:1;;;;;;:13;:18;;;;;:32;;11019:8;10996:22;:32::i;:::-;-1:-1:-1;;;;;;11042:27:1;;;;;;:22;:27;;;;;:29;;;;;;:::i;:::-;;;;;;10764:318;11117:8;11112:3;-1:-1:-1;;;;;11096:30:1;11105:5;-1:-1:-1;;;;;11096:30:1;;;;;;;;;;;9109:2024;;;:::o;11147:112:4:-;11207:7;11233:19;11241:3;11233:7;:19::i;771:377:0:-;1087:20;1133:8;;;771:377::o;1998:734:1:-;2056:7;-1:-1:-1;;;;;2083:17:1;;2075:48;;;;-1:-1:-1;;;2075:48:1;;;;;;;:::i;:::-;2133:10;:12;;;:10;:12;;;:::i;:::-;;;;-1:-1:-1;;2155:19:1;2177:10;;2197:32;;;:19;:32;;;;;;;;:38;;-1:-1:-1;;;;;;2197:38:1;-1:-1:-1;;;;;2197:38:1;;;;;;;;2245:18;;:13;:18;;;;;;:35;;2177:10;2245:22;:35::i;:::-;-1:-1:-1;;;;;;2290:27:1;;;;;;:22;:27;;;;;:29;;;;;;:::i;:::-;;;;-1:-1:-1;;2460:10:1;;2410:61;;;;2451:4;;2410:61;;;:::i;:::-;;;;-1:-1:-1;;2410:61:1;;;;;;;;;2383:102;;2410:61;2383:102;;;;2362:133;2348:10;;2329:30;;:18;:30;;;;;:166;;;;2527:56;;;;;;;;;;;2562:3;;2567:11;;2527:22;:56::i;:::-;2506:138;;;;-1:-1:-1;;;2506:138:1;;;;;;;:::i;:::-;2659:38;;2685:11;;-1:-1:-1;;;;;2659:38:1;;;2676:1;;2659:38;;2676:1;;2659:38;2714:11;1998:734;-1:-1:-1;;1998:734:1:o;2319:187:15:-;2411:6;;;-1:-1:-1;;;;;2427:17:15;;;-1:-1:-1;;;;;;2427:17:15;;;;;;;2459:40;;2411:6;;;2427:17;2411:6;;2459:40;;2392:16;;2459:40;2319:187;;:::o;328:703:16:-;384:13;601:10;597:51;;-1:-1:-1;627:10:16;;;;;;;;;;;;-1:-1:-1;;;627:10:16;;;;;;597:51;672:5;657:12;711:75;718:9;;711:75;;743:8;;;;:::i;:::-;;-1:-1:-1;765:10:16;;-1:-1:-1;773:2:16;765:10;;:::i;:::-;;;711:75;;;795:19;827:6;-1:-1:-1;;;;;817:17:16;;;;;-1:-1:-1;;;817:17:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;817:17:16;;795:39;;844:150;851:10;;844:150;;877:11;887:1;877:11;;:::i;:::-;;-1:-1:-1;945:10:16;953:2;945:5;:10;:::i;:::-;932:24;;:2;:24;:::i;:::-;919:39;;902:6;909;902:14;;;;;;-1:-1:-1;;;902:14:16;;;;;;;;;;;;:56;-1:-1:-1;;;;;902:56:16;;;;;;;;-1:-1:-1;972:11:16;981:2;972:11;;:::i;:::-;;;844:150;;21293:371:1;-1:-1:-1;;;;;21488:31:1;;21409:24;21488:31;;;:15;:31;;;;;;;;:46;;;;;;;;;21552:18;21544:45;;;;-1:-1:-1;;;21544:45:1;;;;;;;:::i;:::-;21607:34;;;;:19;:34;;;;;;-1:-1:-1;;;;;21607:34:1;;-1:-1:-1;21293:371:1;;;;;;:::o;23093:921::-;23257:22;23282:21;;;:11;:21;;;;;;;;-1:-1:-1;;;;;23282:37:1;;;;;;;;;23344:1;;23282:59;;:57;:59::i;:::-;:63;;;;:::i;:::-;23355:21;;;;:11;:21;;;;;;;;-1:-1:-1;;;;;23355:37:1;;;;;;;;;23257:88;;-1:-1:-1;23355:59:1;;23400:13;23355:44;:59::i;:::-;-1:-1:-1;;;;;;23431:31:1;;;;;;:15;:31;;;;;;;;:46;;;;;;;;23424:53;23519:19;23515:97;;23554:24;;;;:14;:24;;;;;:47;;23586:14;23554:31;:47::i;:::-;;23515:97;-1:-1:-1;;;;;23625:31:1;;23651:4;23625:31;23621:387;;;23782:33;;;;:18;:33;;;;;;23672:157;;23706:8;;-1:-1:-1;;;;;23732:32:1;;;23672:16;:157::i;:::-;23621:387;;;23860:137;23894:8;23936:14;-1:-1:-1;;;;;23920:32:1;23970:13;23860:16;:137::i;4423:146:4:-;4514:7;4544:3;:11;;4556:5;4544:18;;;;;;-1:-1:-1;;;4544:18:4;;;;;;;;;;;;;;;;;4537:25;;4423:146;;;;:::o;7792:170::-;7878:4;7905:50;7910:3;-1:-1:-1;;;;;7930:23:4;;7905:4;:50::i;10361:129::-;10428:4;10451:32;10456:3;10476:5;10451:4;:32::i;26615:931:1:-;26745:21;26855:27;;;:18;:27;;;;;;;;;26817:146;;;;26904:14;;26940:5;;26817:146;;:::i;:::-;;;;-1:-1:-1;;26817:146:1;;;;;;;;;26790:187;;26817:146;26790:187;;;;26769:218;26997:27;;;:18;:27;;;;;:43;;;26790:187;-1:-1:-1;27050:490:1;27057:28;;;;:19;:28;;;;;;-1:-1:-1;;;;;27057:28:1;27097:4;27057:45;27050:490;;;27152:4;27128:30;;;;:15;:30;;;;;;;;:39;;;;;;;;;;27295:27;;;:18;:27;;;;;;;27253:187;;27128:39;;27253:187;;27295:27;;27152:4;;27405:13;;27253:187;;:::i;:::-;;;;-1:-1:-1;;27253:187:1;;;;;;;;;27222:236;;27253:187;27222:236;;;;27197:275;27486:27;;;:18;:27;;;;;:43;;;27222:236;-1:-1:-1;27050:490:1;;10658:155:4;10744:4;10771:35;10779:3;10799:5;10771:7;:35::i;3974:107::-;4056:18;;3974:107::o;22067:1020:1:-;22217:4;22237:15;:2;-1:-1:-1;;;;;22237:13:1;;:15::i;:::-;22233:848;;;22288:168;;-1:-1:-1;;;22288:168:1;;-1:-1:-1;;;;;22288:36:1;;;;;:168;;22346:10;;22378:4;;22404:7;;22433:5;;22288:168;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;22288:168:1;;;;;;;;-1:-1:-1;;22288:168:1;;;;;;;;;;;;:::i;:::-;;;22268:761;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;22639:13:1;;22635:380;;22681:106;;-1:-1:-1;;;22681:106:1;;;;;;;:::i;22635:380::-;22967:6;22961:13;22952:6;22948:2;22944:15;22937:38;22268:761;-1:-1:-1;;;;;;22518:55:1;-1:-1:-1;;;22518:55:1;;-1:-1:-1;22511:62:1;;22233:848;-1:-1:-1;23066:4:1;23059:11;;8130:176:4;8219:4;8246:53;8254:3;-1:-1:-1;;;;;8274:23:4;;8246:7;:53::i;1697:404::-;1760:4;1781:21;1791:3;1796:5;1781:9;:21::i;:::-;1776:319;;-1:-1:-1;1818:23:4;;;;;;;;:11;:23;;;;;;;;;;;;;1998:18;;1976:19;;;:12;;;:19;;;;;;:40;;;;2030:11;;1776:319;-1:-1:-1;2079:5:4;2072:12;;2269:1388;2335:4;2472:19;;;:12;;;:19;;;;;;2506:15;;2502:1149;;2875:21;2899:14;2912:1;2899:10;:14;:::i;:::-;2947:18;;2875:38;;-1:-1:-1;2927:17:4;;2947:22;;2968:1;;2947:22;:::i;:::-;2927:42;;3001:13;2988:9;:26;2984:398;;3034:17;3054:3;:11;;3066:9;3054:22;;;;;;-1:-1:-1;;;3054:22:4;;;;;;;;;;;;;;;;;3034:42;;3205:9;3176:3;:11;;3188:13;3176:26;;;;;;-1:-1:-1;;;3176:26:4;;;;;;;;;;;;;;;;;;;;:38;;;;3288:23;;;:12;;;:23;;;;;:36;;;2984:398;3460:17;;:3;;:17;;;-1:-1:-1;;;3460:17:4;;;;;;;;;;;;;;;;;;;;;;;;;;3552:3;:12;;:19;3565:5;3552:19;;;;;;;;;;;3545:26;;;3593:4;3586:11;;;;;;;2502:1149;3635:5;3628:12;;;;;3738:155;3835:4;3862:19;;;:12;;;;;:19;;;;;;:24;;;3738:155::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:377:17;;;131:3;124:4;116:6;112:17;108:27;98:2;;156:8;146;139:26;98:2;-1:-1:-1;186:20:17;;-1:-1:-1;;;;;218:30:17;;215:2;;;268:8;258;251:26;215:2;312:4;304:6;300:17;288:29;;364:3;357:4;348:6;340;336:19;332:30;329:39;326:2;;;381:1;378;371:12;396:551;;493:3;486:4;478:6;474:17;470:27;460:2;;515:5;508;501:20;460:2;555:6;542:20;-1:-1:-1;;;;;577:2:17;574:26;571:2;;;603:18;;:::i;:::-;647:54;689:2;670:13;;-1:-1:-1;;666:27:17;695:4;662:38;647:54;:::i;:::-;726:2;717:7;710:19;772:3;765:4;760:2;752:6;748:15;744:26;741:35;738:2;;;793:5;786;779:20;738:2;862;855:4;847:6;843:17;836:4;827:7;823:18;810:55;885:16;;;903:4;881:27;874:42;;;;889:7;450:497;-1:-1:-1;;450:497:17:o;952:259::-;;1064:2;1052:9;1043:7;1039:23;1035:32;1032:2;;;1085:6;1077;1070:22;1032:2;1129:9;1116:23;1148:33;1175:5;1148:33;:::i;:::-;1200:5;1022:189;-1:-1:-1;;;1022:189:17:o;1216:263::-;;1339:2;1327:9;1318:7;1314:23;1310:32;1307:2;;;1360:6;1352;1345:22;1307:2;1397:9;1391:16;1416:33;1443:5;1416:33;:::i;1484:402::-;;;1613:2;1601:9;1592:7;1588:23;1584:32;1581:2;;;1634:6;1626;1619:22;1581:2;1678:9;1665:23;1697:33;1724:5;1697:33;:::i;:::-;1749:5;-1:-1:-1;1806:2:17;1791:18;;1778:32;1819:35;1778:32;1819:35;:::i;:::-;1873:7;1863:17;;;1571:315;;;;;:::o;1891:470::-;;;;2037:2;2025:9;2016:7;2012:23;2008:32;2005:2;;;2058:6;2050;2043:22;2005:2;2102:9;2089:23;2121:33;2148:5;2121:33;:::i;:::-;2173:5;-1:-1:-1;2230:2:17;2215:18;;2202:32;2243:35;2202:32;2243:35;:::i;:::-;1995:366;;2297:7;;-1:-1:-1;;;2351:2:17;2336:18;;;;2323:32;;1995:366::o;2366:780::-;;;;;;2548:3;2536:9;2527:7;2523:23;2519:33;2516:2;;;2570:6;2562;2555:22;2516:2;2614:9;2601:23;2633:33;2660:5;2633:33;:::i;:::-;2685:5;-1:-1:-1;2742:2:17;2727:18;;2714:32;2755:35;2714:32;2755:35;:::i;:::-;2809:7;-1:-1:-1;2863:2:17;2848:18;;2835:32;;-1:-1:-1;2918:2:17;2903:18;;2890:32;-1:-1:-1;;;;;2934:30:17;;2931:2;;;2982:6;2974;2967:22;2931:2;3026:60;3078:7;3069:6;3058:9;3054:22;3026:60;:::i;:::-;2506:640;;;;-1:-1:-1;2506:640:17;;-1:-1:-1;3105:8:17;;3000:86;2506:640;-1:-1:-1;;;2506:640:17:o;3151:691::-;;;;;3323:3;3311:9;3302:7;3298:23;3294:33;3291:2;;;3345:6;3337;3330:22;3291:2;3389:9;3376:23;3408:33;3435:5;3408:33;:::i;:::-;3460:5;-1:-1:-1;3517:2:17;3502:18;;3489:32;3530:35;3489:32;3530:35;:::i;:::-;3584:7;-1:-1:-1;3638:2:17;3623:18;;3610:32;;-1:-1:-1;3693:2:17;3678:18;;3665:32;-1:-1:-1;;;;;3709:30:17;;3706:2;;;3757:6;3749;3742:22;3706:2;3785:51;3828:7;3819:6;3808:9;3804:22;3785:51;:::i;:::-;3775:61;;;3281:561;;;;;;;:::o;3847:539::-;;;;;4010:3;3998:9;3989:7;3985:23;3981:33;3978:2;;;4032:6;4024;4017:22;3978:2;4076:9;4063:23;4095:33;4122:5;4095:33;:::i;:::-;4147:5;-1:-1:-1;4204:2:17;4189:18;;4176:32;4217:35;4176:32;4217:35;:::i;:::-;3968:418;;4271:7;;-1:-1:-1;;;;4325:2:17;4310:18;;4297:32;;4376:2;4361:18;4348:32;;3968:418::o;4391:849::-;;;;;;;4590:3;4578:9;4569:7;4565:23;4561:33;4558:2;;;4612:6;4604;4597:22;4558:2;4656:9;4643:23;4675:33;4702:5;4675:33;:::i;:::-;4727:5;-1:-1:-1;4784:2:17;4769:18;;4756:32;4797:35;4756:32;4797:35;:::i;:::-;4851:7;-1:-1:-1;4905:2:17;4890:18;;4877:32;;-1:-1:-1;4956:2:17;4941:18;;4928:32;;-1:-1:-1;5011:3:17;4996:19;;4983:33;-1:-1:-1;;;;;5028:30:17;;5025:2;;;5076:6;5068;5061:22;5025:2;5120:60;5172:7;5163:6;5152:9;5148:22;5120:60;:::i;:::-;4548:692;;;;-1:-1:-1;4548:692:17;;-1:-1:-1;4548:692:17;;5199:8;;4548:692;-1:-1:-1;;;4548:692:17:o;5245:396::-;;;5371:2;5359:9;5350:7;5346:23;5342:32;5339:2;;;5392:6;5384;5377:22;5339:2;5436:9;5423:23;5455:33;5482:5;5455:33;:::i;:::-;5507:5;-1:-1:-1;5564:2:17;5549:18;;5536:32;5577;5536;5577;:::i;5646:327::-;;;5775:2;5763:9;5754:7;5750:23;5746:32;5743:2;;;5796:6;5788;5781:22;5743:2;5840:9;5827:23;5859:33;5886:5;5859:33;:::i;:::-;5911:5;5963:2;5948:18;;;;5935:32;;-1:-1:-1;;;5733:240:17:o;5978:539::-;;;;;6141:3;6129:9;6120:7;6116:23;6112:33;6109:2;;;6163:6;6155;6148:22;6109:2;6207:9;6194:23;6226:33;6253:5;6226:33;:::i;:::-;6278:5;-1:-1:-1;6330:2:17;6315:18;;6302:32;;-1:-1:-1;6386:2:17;6371:18;;6358:32;6399:35;6358:32;6399:35;:::i;:::-;6099:418;;;;-1:-1:-1;6453:7:17;;6507:2;6492:18;6479:32;;-1:-1:-1;;6099:418:17:o;6522:636::-;;;;;6687:2;6675:9;6666:7;6662:23;6658:32;6655:2;;;6708:6;6700;6693:22;6655:2;6752:9;6739:23;6771:33;6798:5;6771:33;:::i;:::-;6823:5;-1:-1:-1;6875:2:17;6860:18;;6847:32;;-1:-1:-1;6930:2:17;6915:18;;6902:32;-1:-1:-1;;;;;6946:30:17;;6943:2;;;6994:6;6986;6979:22;6943:2;7038:60;7090:7;7081:6;7070:9;7066:22;7038:60;:::i;:::-;6645:513;;;;-1:-1:-1;7117:8:17;-1:-1:-1;;;;6645:513:17:o;7163:1079::-;;7278:2;7321;7309:9;7300:7;7296:23;7292:32;7289:2;;;7342:6;7334;7327:22;7289:2;7387:9;7374:23;-1:-1:-1;;;;;7457:2:17;7449:6;7446:14;7443:2;;;7478:6;7470;7463:22;7443:2;7521:6;7510:9;7506:22;7496:32;;7566:7;7559:4;7555:2;7551:13;7547:27;7537:2;;7593:6;7585;7578:22;7537:2;7634;7621:16;7656:2;7652;7649:10;7646:2;;;7662:18;;:::i;:::-;7709:2;7705;7701:11;7691:21;;7732:27;7755:2;7751;7747:11;7732:27;:::i;:::-;7793:15;;;7824:12;;;;7856:11;;;7886;;;7882:20;;7879:33;-1:-1:-1;7876:2:17;;;7930:6;7922;7915:22;7876:2;7957:6;7948:15;;7972:240;7986:2;7983:1;7980:9;7972:240;;;8057:3;8044:17;8031:30;;8074:33;8101:5;8074:33;:::i;:::-;8120:18;;;8004:1;7997:9;;;;;8158:12;;;;8190;;7972:240;;;-1:-1:-1;8231:5:17;7258:984;-1:-1:-1;;;;;;;;7258:984:17:o;8247:257::-;;8367:2;8355:9;8346:7;8342:23;8338:32;8335:2;;;8388:6;8380;8373:22;8335:2;8425:9;8419:16;8444:30;8468:5;8444:30;:::i;8509:257::-;;8620:2;8608:9;8599:7;8595:23;8591:32;8588:2;;;8641:6;8633;8626:22;8588:2;8685:9;8672:23;8704:32;8730:5;8704:32;:::i;8771:261::-;;8893:2;8881:9;8872:7;8868:23;8864:32;8861:2;;;8914:6;8906;8899:22;8861:2;8951:9;8945:16;8970:32;8996:5;8970:32;:::i;9037:343::-;;9159:2;9147:9;9138:7;9134:23;9130:32;9127:2;;;9180:6;9172;9165:22;9127:2;9225:9;9212:23;-1:-1:-1;;;;;9250:6:17;9247:30;9244:2;;;9295:6;9287;9280:22;9244:2;9323:51;9366:7;9357:6;9346:9;9342:22;9323:51;:::i;9385:190::-;;9497:2;9485:9;9476:7;9472:23;9468:32;9465:2;;;9518:6;9510;9503:22;9465:2;-1:-1:-1;9546:23:17;;9455:120;-1:-1:-1;9455:120:17:o;9580:327::-;;;9709:2;9697:9;9688:7;9684:23;9680:32;9677:2;;;9730:6;9722;9715:22;9677:2;9771:9;9758:23;9748:33;;9831:2;9820:9;9816:18;9803:32;9844:33;9871:5;9844:33;:::i;9912:539::-;;;;;10075:3;10063:9;10054:7;10050:23;10046:33;10043:2;;;10097:6;10089;10082:22;10043:2;10138:9;10125:23;10115:33;;10198:2;10187:9;10183:18;10170:32;10211:33;10238:5;10211:33;:::i;:::-;10263:5;-1:-1:-1;10320:2:17;10305:18;;10292:32;10333:35;10292:32;10333:35;:::i;10456:760::-;;;;;;10645:3;10633:9;10624:7;10620:23;10616:33;10613:2;;;10667:6;10659;10652:22;10613:2;10708:9;10695:23;10685:33;;10768:2;10757:9;10753:18;10740:32;10781:33;10808:5;10781:33;:::i;:::-;10833:5;-1:-1:-1;10890:2:17;10875:18;;10862:32;10903:35;10862:32;10903:35;:::i;:::-;10957:7;-1:-1:-1;11011:2:17;10996:18;;10983:32;;-1:-1:-1;11066:3:17;11051:19;;11038:33;-1:-1:-1;;;;;11083:30:17;;11080:2;;;11131:6;11123;11116:22;11080:2;11159:51;11202:7;11193:6;11182:9;11178:22;11159:51;:::i;:::-;11149:61;;;10603:613;;;;;;;;:::o;11221:395::-;;;;11367:2;11355:9;11346:7;11342:23;11338:32;11335:2;;;11388:6;11380;11373:22;11335:2;11429:9;11416:23;11406:33;;11489:2;11478:9;11474:18;11461:32;11502:33;11529:5;11502:33;:::i;11621:829::-;;;;;;;11827:3;11815:9;11806:7;11802:23;11798:33;11795:2;;;11849:6;11841;11834:22;11795:2;11890:9;11877:23;11867:33;;11950:2;11939:9;11935:18;11922:32;11963:33;11990:5;11963:33;:::i;:::-;12015:5;-1:-1:-1;12067:2:17;12052:18;;12039:32;;-1:-1:-1;12123:2:17;12108:18;;12095:32;12136:35;12095:32;12136:35;:::i;:::-;12190:7;-1:-1:-1;12244:3:17;12229:19;;12216:33;;-1:-1:-1;12300:3:17;12285:19;;12272:33;-1:-1:-1;;;;;12317:30:17;;12314:2;;;12365:6;12357;12350:22;12314:2;12393:51;12436:7;12427:6;12416:9;12412:22;12393:51;:::i;:::-;12383:61;;;11785:665;;;;;;;;:::o;12455:411::-;;;12594:2;12582:9;12573:7;12569:23;12565:32;12562:2;;;12615:6;12607;12600:22;12562:2;12656:9;12643:23;12633:33;;12717:2;12706:9;12702:18;12689:32;-1:-1:-1;;;;;12736:6:17;12733:30;12730:2;;;12781:6;12773;12766:22;12730:2;12809:51;12852:7;12843:6;12832:9;12828:22;12809:51;:::i;:::-;12799:61;;;12552:314;;;;;:::o;12871:258::-;;;13000:2;12988:9;12979:7;12975:23;12971:32;12968:2;;;13021:6;13013;13006:22;12968:2;-1:-1:-1;;13049:23:17;;;13119:2;13104:18;;;13091:32;;-1:-1:-1;12958:171:17:o;13134:289::-;;13244:2;13232:9;13223:7;13219:23;13215:32;13212:2;;;13265:6;13257;13250:22;13212:2;13309:9;13296:23;13359:4;13352:5;13348:16;13341:5;13338:27;13328:2;;13384:6;13376;13369:22;13428:259;;13509:5;13503:12;13536:6;13531:3;13524:19;13552:63;13608:6;13601:4;13596:3;13592:14;13585:4;13578:5;13574:16;13552:63;:::i;:::-;13669:2;13648:15;-1:-1:-1;;13644:29:17;13635:39;;;;13676:4;13631:50;;13479:208;-1:-1:-1;;13479:208:17:o;13692:982::-;13779:12;;13692:982;;13851:1;13836:17;;13872:1;13908:18;;;;13935:2;;13989:4;13981:6;13977:17;13967:27;;13935:2;14015;14063;14055:6;14052:14;14032:18;14029:38;14026:2;;;-1:-1:-1;;;14090:33:17;;14146:4;14143:1;14136:15;14176:4;14097:3;14164:17;14026:2;14207:18;14234:104;;;;14352:1;14347:321;;;;14200:468;;14234:104;-1:-1:-1;;14267:24:17;;14255:37;;14312:16;;;;-1:-1:-1;14234:104:17;;14347:321;14383:38;14415:5;14383:38;:::i;:::-;14443:1;14457:165;14471:6;14468:1;14465:13;14457:165;;;14549:14;;14536:11;;;14529:35;14592:16;;;;14486:10;;14457:165;;;14461:3;;14651:6;14646:3;14642:16;14635:23;;14200:468;;;;;;;13752:922;;;;:::o;14679:274::-;;14846:6;14840:13;14862:53;14908:6;14903:3;14896:4;14888:6;14884:17;14862:53;:::i;:::-;14931:16;;;;;14816:137;-1:-1:-1;;14816:137:17:o;14958:378::-;;15162:40;15198:3;15190:6;15162:40;:::i;:::-;15231:6;15225:13;15247:52;15292:6;15288:2;15281:4;15273:6;15269:17;15247:52;:::i;:::-;15315:15;;15142:194;-1:-1:-1;;;;15142:194:17:o;15341:281::-;;15539:77;15575:40;15611:3;15603:6;15575:40;:::i;:::-;15567:6;15539:77;:::i;15627:247::-;15784:19;;;15828:2;15819:12;;15812:28;15865:2;15856:12;;15774:100::o;15879:312::-;16064:19;;;16108:2;16099:12;;16092:28;;;;16145:2;16136:12;;16129:28;16182:2;16173:12;;16054:137::o;16196:203::-;-1:-1:-1;;;;;16360:32:17;;;;16342:51;;16330:2;16315:18;;16297:102::o;16404:304::-;-1:-1:-1;;;;;16634:15:17;;;16616:34;;16686:15;;16681:2;16666:18;;16659:43;16566:2;16551:18;;16533:175::o;16713:375::-;-1:-1:-1;;;;;16971:15:17;;;16953:34;;17023:15;;;;17018:2;17003:18;;16996:43;17070:2;17055:18;;17048:34;;;;16903:2;16888:18;;16870:218::o;17093:490::-;-1:-1:-1;;;;;17362:15:17;;;17344:34;;17414:15;;17409:2;17394:18;;17387:43;17461:2;17446:18;;17439:34;;;17509:3;17504:2;17489:18;;17482:31;;;17093:490;;17530:47;;17557:19;;17549:6;17530:47;:::i;:::-;17522:55;17296:287;-1:-1:-1;;;;;;17296:287:17:o;17588:558::-;-1:-1:-1;;;;;17911:15:17;;;17893:34;;17963:15;;;;17958:2;17943:18;;17936:43;18010:2;17995:18;;17988:34;;;;18058:3;18053:2;18038:18;;18031:31;;;17588:558;18078:19;;;18071:33;17873:3;18121:19;;17845:301::o;18151:562::-;-1:-1:-1;;;;;18448:15:17;;;18430:34;;18500:15;;18495:2;18480:18;;18473:43;18547:2;18532:18;;18525:34;;;18590:2;18575:18;;18568:34;;;18410:3;18633;18618:19;;18611:32;;;18151:562;;18660:47;;18687:19;;18679:6;18660:47;:::i;:::-;18652:55;18382:331;-1:-1:-1;;;;;;;18382:331:17:o;18718:274::-;-1:-1:-1;;;;;18910:32:17;;;;18892:51;;18974:2;18959:18;;18952:34;18880:2;18865:18;;18847:145::o;18997:661::-;19168:2;19220:21;;;19290:13;;19193:18;;;19312:22;;;18997:661;;19168:2;19391:15;;;;19365:2;19350:18;;;18997:661;19437:195;19451:6;19448:1;19445:13;19437:195;;;19516:13;;-1:-1:-1;;;;;19512:39:17;19500:52;;19607:15;;;;19572:12;;;;19548:1;19466:9;19437:195;;;-1:-1:-1;19649:3:17;;19148:510;-1:-1:-1;;;;;;19148:510:17:o;19663:635::-;19834:2;19886:21;;;19956:13;;19859:18;;;19978:22;;;19663:635;;19834:2;20057:15;;;;20031:2;20016:18;;;19663:635;20103:169;20117:6;20114:1;20111:13;20103:169;;;20178:13;;20166:26;;20247:15;;;;20212:12;;;;20139:1;20132:9;20103:169;;20303:187;20468:14;;20461:22;20443:41;;20431:2;20416:18;;20398:92::o;20495:177::-;20641:25;;;20629:2;20614:18;;20596:76::o;20930:202::-;-1:-1:-1;;;;;;21092:33:17;;;;21074:52;;21062:2;21047:18;;21029:103::o;21442:221::-;;21591:2;21580:9;21573:21;21611:46;21653:2;21642:9;21638:18;21630:6;21611:46;:::i;21668:344::-;21870:2;21852:21;;;21909:2;21889:18;;;21882:30;-1:-1:-1;;;21943:2:17;21928:18;;21921:50;22003:2;21988:18;;21842:170::o;22017:398::-;22219:2;22201:21;;;22258:2;22238:18;;;22231:30;22297:34;22292:2;22277:18;;22270:62;-1:-1:-1;;;22363:2:17;22348:18;;22341:32;22405:3;22390:19;;22191:224::o;22420:351::-;22622:2;22604:21;;;22661:2;22641:18;;;22634:30;22700:29;22695:2;22680:18;;22673:57;22762:2;22747:18;;22594:177::o;22776:352::-;22978:2;22960:21;;;23017:2;22997:18;;;22990:30;23056;23051:2;23036:18;;23029:58;23119:2;23104:18;;22950:178::o;23133:338::-;23335:2;23317:21;;;23374:2;23354:18;;;23347:30;-1:-1:-1;;;23408:2:17;23393:18;;23386:44;23462:2;23447:18;;23307:164::o;23476:400::-;23678:2;23660:21;;;23717:2;23697:18;;;23690:30;23756:34;23751:2;23736:18;;23729:62;-1:-1:-1;;;23822:2:17;23807:18;;23800:34;23866:3;23851:19;;23650:226::o;23881:356::-;24083:2;24065:21;;;24102:18;;;24095:30;24161:34;24156:2;24141:18;;24134:62;24228:2;24213:18;;24055:182::o;24242:414::-;24444:2;24426:21;;;24483:2;24463:18;;;24456:30;24522:34;24517:2;24502:18;;24495:62;-1:-1:-1;;;24588:2:17;24573:18;;24566:48;24646:3;24631:19;;24416:240::o;24661:352::-;24863:2;24845:21;;;24902:2;24882:18;;;24875:30;24941;24936:2;24921:18;;24914:58;25004:2;24989:18;;24835:178::o;25018:345::-;25220:2;25202:21;;;25259:2;25239:18;;;25232:30;-1:-1:-1;;;25293:2:17;25278:18;;25271:51;25354:2;25339:18;;25192:171::o;25368:402::-;25570:2;25552:21;;;25609:2;25589:18;;;25582:30;25648:34;25643:2;25628:18;;25621:62;-1:-1:-1;;;25714:2:17;25699:18;;25692:36;25760:3;25745:19;;25542:228::o;25775:407::-;25977:2;25959:21;;;26016:2;25996:18;;;25989:30;26055:34;26050:2;26035:18;;26028:62;-1:-1:-1;;;26121:2:17;26106:18;;26099:41;26172:3;26157:19;;25949:233::o;26187:412::-;26389:2;26371:21;;;26428:2;26408:18;;;26401:30;26467:34;26462:2;26447:18;;26440:62;-1:-1:-1;;;26533:2:17;26518:18;;26511:46;26589:3;26574:19;;26361:238::o;26604:399::-;26806:2;26788:21;;;26845:2;26825:18;;;26818:30;26884:34;26879:2;26864:18;;26857:62;-1:-1:-1;;;26950:2:17;26935:18;;26928:33;26993:3;26978:19;;26778:225::o;27008:344::-;27210:2;27192:21;;;27249:2;27229:18;;;27222:30;-1:-1:-1;;;27283:2:17;27268:18;;27261:50;27343:2;27328:18;;27182:170::o;27357:351::-;27559:2;27541:21;;;27598:2;27578:18;;;27571:30;27637:29;27632:2;27617:18;;27610:57;27699:2;27684:18;;27531:177::o;27713:348::-;27915:2;27897:21;;;27954:2;27934:18;;;27927:30;27993:26;27988:2;27973:18;;27966:54;28052:2;28037:18;;27887:174::o;28066:353::-;28268:2;28250:21;;;28307:2;28287:18;;;28280:30;28346:31;28341:2;28326:18;;28319:59;28410:2;28395:18;;28240:179::o;28424:356::-;28626:2;28608:21;;;28645:18;;;28638:30;28704:34;28699:2;28684:18;;28677:62;28771:2;28756:18;;28598:182::o;28785:352::-;28987:2;28969:21;;;29026:2;29006:18;;;28999:30;29065;29060:2;29045:18;;29038:58;29128:2;29113:18;;28959:178::o;29142:355::-;29344:2;29326:21;;;29383:2;29363:18;;;29356:30;29422:33;29417:2;29402:18;;29395:61;29488:2;29473:18;;29316:181::o;29502:498::-;29704:2;29686:21;;;29743:2;29723:18;;;29716:30;29782:34;29777:2;29762:18;;29755:62;29853:34;29848:2;29833:18;;29826:62;29925:32;29919:3;29904:19;;29897:61;29990:3;29975:19;;29676:324::o;30005:397::-;30207:2;30189:21;;;30246:2;30226:18;;;30219:30;30285:34;30280:2;30265:18;;30258:62;-1:-1:-1;;;30351:2:17;30336:18;;30329:31;30392:3;30377:19;;30179:223::o;30407:399::-;30609:2;30591:21;;;30648:2;30628:18;;;30621:30;30687:34;30682:2;30667:18;;30660:62;-1:-1:-1;;;30753:2:17;30738:18;;30731:33;30796:3;30781:19;;30581:225::o;30811:349::-;31013:2;30995:21;;;31052:2;31032:18;;;31025:30;31091:27;31086:2;31071:18;;31064:55;31151:2;31136:18;;30985:175::o;31165:342::-;31367:2;31349:21;;;31406:2;31386:18;;;31379:30;-1:-1:-1;;;31440:2:17;31425:18;;31418:48;31498:2;31483:18;;31339:168::o;31512:353::-;31714:2;31696:21;;;31753:2;31733:18;;;31726:30;31792:31;31787:2;31772:18;;31765:59;31856:2;31841:18;;31686:179::o;31870:426::-;32072:2;32054:21;;;32111:2;32091:18;;;32084:30;32150:34;32145:2;32130:18;;32123:62;32221:32;32216:2;32201:18;;32194:60;32286:3;32271:19;;32044:252::o;32301:410::-;32503:2;32485:21;;;32542:2;32522:18;;;32515:30;32581:34;32576:2;32561:18;;32554:62;-1:-1:-1;;;32647:2:17;32632:18;;32625:44;32701:3;32686:19;;32475:236::o;32716:348::-;32918:2;32900:21;;;32957:2;32937:18;;;32930:30;32996:26;32991:2;32976:18;;32969:54;33055:2;33040:18;;32890:174::o;33069:356::-;33271:2;33253:21;;;33290:18;;;33283:30;33349:34;33344:2;33329:18;;33322:62;33416:2;33401:18;;33243:182::o;33430:353::-;33632:2;33614:21;;;33671:2;33651:18;;;33644:30;33710:31;33705:2;33690:18;;33683:59;33774:2;33759:18;;33604:179::o;33788:352::-;33990:2;33972:21;;;34029:2;34009:18;;;34002:30;34068;34063:2;34048:18;;34041:58;34131:2;34116:18;;33962:178::o;34145:351::-;34347:2;34329:21;;;34386:2;34366:18;;;34359:30;34425:29;34420:2;34405:18;;34398:57;34487:2;34472:18;;34319:177::o;34501:350::-;34703:2;34685:21;;;34742:2;34722:18;;;34715:30;34781:28;34776:2;34761:18;;34754:56;34842:2;34827:18;;34675:176::o;34856:398::-;35058:2;35040:21;;;35097:2;35077:18;;;35070:30;35136:34;35131:2;35116:18;;35109:62;-1:-1:-1;;;35202:2:17;35187:18;;35180:32;35244:3;35229:19;;35030:224::o;35259:399::-;35461:2;35443:21;;;35500:2;35480:18;;;35473:30;35539:34;35534:2;35519:18;;35512:62;-1:-1:-1;;;35605:2:17;35590:18;;35583:33;35648:3;35633:19;;35433:225::o;35663:410::-;35865:2;35847:21;;;35904:2;35884:18;;;35877:30;35943:34;35938:2;35923:18;;35916:62;-1:-1:-1;;;36009:2:17;35994:18;;35987:44;36063:3;36048:19;;35837:236::o;36078:345::-;36280:2;36262:21;;;36319:2;36299:18;;;36292:30;-1:-1:-1;;;36353:2:17;36338:18;;36331:51;36414:2;36399:18;;36252:171::o;36428:348::-;36630:2;36612:21;;;36669:2;36649:18;;;36642:30;36708:26;36703:2;36688:18;;36681:54;36767:2;36752:18;;36602:174::o;36781:498::-;36983:2;36965:21;;;37022:2;37002:18;;;36995:30;37061:34;37056:2;37041:18;;37034:62;37132:34;37127:2;37112:18;;37105:62;37204:32;37198:3;37183:19;;37176:61;37269:3;37254:19;;36955:324::o;37284:426::-;37486:2;37468:21;;;37525:2;37505:18;;;37498:30;37564:34;37559:2;37544:18;;37537:62;37635:32;37630:2;37615:18;;37608:60;37700:3;37685:19;;37458:252::o;37715:355::-;37917:2;37899:21;;;37956:2;37936:18;;;37929:30;37995:33;37990:2;37975:18;;37968:61;38061:2;38046:18;;37889:181::o;38075:397::-;38277:2;38259:21;;;38316:2;38296:18;;;38289:30;38355:34;38350:2;38335:18;;38328:62;-1:-1:-1;;;38421:2:17;38406:18;;38399:31;38462:3;38447:19;;38249:223::o;38659:184::-;38831:4;38819:17;;;;38801:36;;38789:2;38774:18;;38756:87::o;38848:251::-;38918:2;38912:9;38948:17;;;-1:-1:-1;;;;;38980:34:17;;39016:22;;;38977:62;38974:2;;;39042:18;;:::i;:::-;39078:2;39071:22;38892:207;;-1:-1:-1;38892:207:17:o;39104:129::-;;39172:17;;;39222:4;39206:21;;;39162:71::o;39238:128::-;;39309:1;39305:6;39302:1;39299:13;39296:2;;;39315:18;;:::i;:::-;-1:-1:-1;39351:9:17;;39286:80::o;39371:204::-;;39445:4;39442:1;39438:12;39477:4;39474:1;39470:12;39512:3;39506:4;39502:14;39497:3;39494:23;39491:2;;;39520:18;;:::i;:::-;39556:13;;39417:158;-1:-1:-1;;;39417:158:17:o;39580:120::-;;39646:1;39636:2;;39651:18;;:::i;:::-;-1:-1:-1;39685:9:17;;39626:74::o;39705:168::-;;39811:1;39807;39803:6;39799:14;39796:1;39793:21;39788:1;39781:9;39774:17;39770:45;39767:2;;;39818:18;;:::i;:::-;-1:-1:-1;39858:9:17;;39757:116::o;39878:125::-;;39946:1;39943;39940:8;39937:2;;;39951:18;;:::i;:::-;-1:-1:-1;39988:9:17;;39927:76::o;40008:258::-;40080:1;40090:113;40104:6;40101:1;40098:13;40090:113;;;40180:11;;;40174:18;40161:11;;;40154:39;40126:2;40119:10;40090:113;;;40221:6;40218:1;40215:13;40212:2;;;-1:-1:-1;;40256:1:17;40238:16;;40231:27;40061:205::o;40271:136::-;;40338:5;40328:2;;40347:18;;:::i;:::-;-1:-1:-1;;;40383:18:17;;40318:89::o;40412:380::-;40497:1;40487:12;;40544:1;40534:12;;;40555:2;;40609:4;40601:6;40597:17;40587:27;;40555:2;40662;40654:6;40651:14;40631:18;40628:38;40625:2;;;40708:10;40703:3;40699:20;40696:1;40689:31;40743:4;40740:1;40733:15;40771:4;40768:1;40761:15;40797:135;;-1:-1:-1;;40857:17:17;;40854:2;;;40877:18;;:::i;:::-;-1:-1:-1;40924:1:17;40913:13;;40844:88::o;40937:175::-;;41018:4;41011:5;41007:16;41047:4;41038:7;41035:17;41032:2;;;41055:18;;:::i;:::-;41104:1;41091:15;;40982:130;-1:-1:-1;;40982:130:17:o;41117:112::-;;41175:1;41165:2;;41180:18;;:::i;:::-;-1:-1:-1;41214:9:17;;41155:74::o;41234:127::-;41295:10;41290:3;41286:20;41283:1;41276:31;41326:4;41323:1;41316:15;41350:4;41347:1;41340:15;41366:127;41427:10;41422:3;41418:20;41415:1;41408:31;41458:4;41455:1;41448:15;41482:4;41479:1;41472:15;41498:127;41559:10;41554:3;41550:20;41547:1;41540:31;41590:4;41587:1;41580:15;41614:4;41611:1;41604:15;41630:133;-1:-1:-1;;;;;41707:31:17;;41697:42;;41687:2;;41753:1;41750;41743:12;41768:120;41856:5;41849:13;41842:21;41835:5;41832:32;41822:2;;41878:1;41875;41868:12;41893:133;-1:-1:-1;;;;;;41969:32:17;;41959:43;;41949:2;;42016:1;42013;42006:12

Swarm Source

ipfs://41cc16488e7a2004b19598c1ef78ce0dc3dacde1e03a03ae6390cd8fdd2fddb3
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.