ETH Price: $3,417.21 (+3.54%)

Token

LuxetoCube (LCUBE)
 

Overview

Max Total Supply

10,000 LCUBE

Holders

32

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
weber3.eth
Balance
1 LCUBE
0xbb771c5a3dcb9633a3bbfb850a66c51a7ad88442
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

LUXETO Cube is the membership NFT of LUXETO, with exclusive membership perks.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
LuxetoAirdrop

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-12-27
*/

// File: @openzeppelin/contracts/utils/Counters.sol


// OpenZeppelin Contracts v4.4.0 (utils/Counters.sol)

pragma solidity ^0.8.0;

/**
 * @title Counters
 * @author Matt Condon (@shrugs)
 * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number
 * of elements in a mapping, issuing ERC721 ids, or counting request ids.
 *
 * Include with `using Counters for Counters.Counter;`
 */
library Counters {
    struct Counter {
        // This variable should never be directly accessed by users of the library: interactions must be restricted to
        // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add
        // this feature: see https://github.com/ethereum/solidity/issues/4637
        uint256 _value; // default: 0
    }

    function current(Counter storage counter) internal view returns (uint256) {
        return counter._value;
    }

    function increment(Counter storage counter) internal {
        unchecked {
            counter._value += 1;
        }
    }

    function decrement(Counter storage counter) internal {
        uint256 value = counter._value;
        require(value > 0, "Counter: decrement overflow");
        unchecked {
            counter._value = value - 1;
        }
    }

    function reset(Counter storage counter) internal {
        counter._value = 0;
    }
}

// File: @openzeppelin/contracts/utils/Address.sol


// OpenZeppelin Contracts v4.4.0 (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: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol


// OpenZeppelin Contracts v4.4.0 (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: @openzeppelin/contracts/utils/introspection/IERC165.sol


// OpenZeppelin Contracts v4.4.0 (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: @openzeppelin/contracts/token/ERC721/IERC721.sol


// OpenZeppelin Contracts v4.4.0 (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;


/**
 * @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: @openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol


// OpenZeppelin Contracts v4.4.0 (token/ERC721/extensions/IERC721Enumerable.sol)

pragma solidity ^0.8.0;


/**
 * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Enumerable is IERC721 {
    /**
     * @dev Returns the total amount of tokens stored by the contract.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns a token ID owned by `owner` at a given `index` of its token list.
     * Use along with {balanceOf} to enumerate all of ``owner``'s tokens.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId);

    /**
     * @dev Returns a token ID at a given `index` of all the tokens stored by the contract.
     * Use along with {totalSupply} to enumerate all tokens.
     */
    function tokenByIndex(uint256 index) external view returns (uint256);
}

// File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol


// OpenZeppelin Contracts v4.4.0 (token/ERC721/extensions/IERC721Metadata.sol)

pragma solidity ^0.8.0;


/**
 * @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: @openzeppelin/contracts/utils/introspection/ERC165.sol


// OpenZeppelin Contracts v4.4.0 (utils/introspection/ERC165.sol)

pragma solidity ^0.8.0;


/**
 * @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: @openzeppelin/contracts/utils/Strings.sol


// OpenZeppelin Contracts v4.4.0 (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);
    }
}

// File: @openzeppelin/contracts/utils/cryptography/ECDSA.sol


// OpenZeppelin Contracts v4.4.0 (utils/cryptography/ECDSA.sol)

pragma solidity ^0.8.0;


/**
 * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.
 *
 * These functions can be used to verify that a message was signed by the holder
 * of the private keys of a given address.
 */
library ECDSA {
    enum RecoverError {
        NoError,
        InvalidSignature,
        InvalidSignatureLength,
        InvalidSignatureS,
        InvalidSignatureV
    }

    function _throwError(RecoverError error) private pure {
        if (error == RecoverError.NoError) {
            return; // no error: do nothing
        } else if (error == RecoverError.InvalidSignature) {
            revert("ECDSA: invalid signature");
        } else if (error == RecoverError.InvalidSignatureLength) {
            revert("ECDSA: invalid signature length");
        } else if (error == RecoverError.InvalidSignatureS) {
            revert("ECDSA: invalid signature 's' value");
        } else if (error == RecoverError.InvalidSignatureV) {
            revert("ECDSA: invalid signature 'v' value");
        }
    }

    /**
     * @dev Returns the address that signed a hashed message (`hash`) with
     * `signature` or error string. This address can then be used for verification purposes.
     *
     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
     * this function rejects them by requiring the `s` value to be in the lower
     * half order, and the `v` value to be either 27 or 28.
     *
     * IMPORTANT: `hash` _must_ be the result of a hash operation for the
     * verification to be secure: it is possible to craft signatures that
     * recover to arbitrary addresses for non-hashed data. A safe way to ensure
     * this is by receiving a hash of the original message (which may otherwise
     * be too long), and then calling {toEthSignedMessageHash} on it.
     *
     * Documentation for signature generation:
     * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]
     * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]
     *
     * _Available since v4.3._
     */
    function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) {
        // Check the signature length
        // - case 65: r,s,v signature (standard)
        // - case 64: r,vs signature (cf https://eips.ethereum.org/EIPS/eip-2098) _Available since v4.1._
        if (signature.length == 65) {
            bytes32 r;
            bytes32 s;
            uint8 v;
            // ecrecover takes the signature parameters, and the only way to get them
            // currently is to use assembly.
            assembly {
                r := mload(add(signature, 0x20))
                s := mload(add(signature, 0x40))
                v := byte(0, mload(add(signature, 0x60)))
            }
            return tryRecover(hash, v, r, s);
        } else if (signature.length == 64) {
            bytes32 r;
            bytes32 vs;
            // ecrecover takes the signature parameters, and the only way to get them
            // currently is to use assembly.
            assembly {
                r := mload(add(signature, 0x20))
                vs := mload(add(signature, 0x40))
            }
            return tryRecover(hash, r, vs);
        } else {
            return (address(0), RecoverError.InvalidSignatureLength);
        }
    }

    /**
     * @dev Returns the address that signed a hashed message (`hash`) with
     * `signature`. This address can then be used for verification purposes.
     *
     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
     * this function rejects them by requiring the `s` value to be in the lower
     * half order, and the `v` value to be either 27 or 28.
     *
     * IMPORTANT: `hash` _must_ be the result of a hash operation for the
     * verification to be secure: it is possible to craft signatures that
     * recover to arbitrary addresses for non-hashed data. A safe way to ensure
     * this is by receiving a hash of the original message (which may otherwise
     * be too long), and then calling {toEthSignedMessageHash} on it.
     */
    function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, signature);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.
     *
     * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures]
     *
     * _Available since v4.3._
     */
    function tryRecover(
        bytes32 hash,
        bytes32 r,
        bytes32 vs
    ) internal pure returns (address, RecoverError) {
        bytes32 s;
        uint8 v;
        assembly {
            s := and(vs, 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff)
            v := add(shr(255, vs), 27)
        }
        return tryRecover(hash, v, r, s);
    }

    /**
     * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.
     *
     * _Available since v4.2._
     */
    function recover(
        bytes32 hash,
        bytes32 r,
        bytes32 vs
    ) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, r, vs);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Overload of {ECDSA-tryRecover} that receives the `v`,
     * `r` and `s` signature fields separately.
     *
     * _Available since v4.3._
     */
    function tryRecover(
        bytes32 hash,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal pure returns (address, RecoverError) {
        // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature
        // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines
        // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most
        // signatures from current libraries generate a unique signature with an s-value in the lower half order.
        //
        // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value
        // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or
        // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept
        // these malleable signatures as well.
        if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {
            return (address(0), RecoverError.InvalidSignatureS);
        }
        if (v != 27 && v != 28) {
            return (address(0), RecoverError.InvalidSignatureV);
        }

        // If the signature is valid (and not malleable), return the signer address
        address signer = ecrecover(hash, v, r, s);
        if (signer == address(0)) {
            return (address(0), RecoverError.InvalidSignature);
        }

        return (signer, RecoverError.NoError);
    }

    /**
     * @dev Overload of {ECDSA-recover} that receives the `v`,
     * `r` and `s` signature fields separately.
     */
    function recover(
        bytes32 hash,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, v, r, s);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Returns an Ethereum Signed Message, created from a `hash`. This
     * produces hash corresponding to the one signed with the
     * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]
     * JSON-RPC method as part of EIP-191.
     *
     * See {recover}.
     */
    function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {
        // 32 is the length in bytes of hash,
        // enforced by the type signature above
        return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash));
    }

    /**
     * @dev Returns an Ethereum Signed Message, created from `s`. This
     * produces hash corresponding to the one signed with the
     * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]
     * JSON-RPC method as part of EIP-191.
     *
     * See {recover}.
     */
    function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n", Strings.toString(s.length), s));
    }

    /**
     * @dev Returns an Ethereum Signed Typed Data, created from a
     * `domainSeparator` and a `structHash`. This produces hash corresponding
     * to the one signed with the
     * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`]
     * JSON-RPC method as part of EIP-712.
     *
     * See {recover}.
     */
    function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash));
    }
}

// File: @openzeppelin/contracts/utils/cryptography/draft-EIP712.sol


// OpenZeppelin Contracts v4.4.0 (utils/cryptography/draft-EIP712.sol)

pragma solidity ^0.8.0;


/**
 * @dev https://eips.ethereum.org/EIPS/eip-712[EIP 712] is a standard for hashing and signing of typed structured data.
 *
 * The encoding specified in the EIP is very generic, and such a generic implementation in Solidity is not feasible,
 * thus this contract does not implement the encoding itself. Protocols need to implement the type-specific encoding
 * they need in their contracts using a combination of `abi.encode` and `keccak256`.
 *
 * This contract implements the EIP 712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding
 * scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA
 * ({_hashTypedDataV4}).
 *
 * The implementation of the domain separator was designed to be as efficient as possible while still properly updating
 * the chain id to protect against replay attacks on an eventual fork of the chain.
 *
 * NOTE: This contract implements the version of the encoding known as "v4", as implemented by the JSON RPC method
 * https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask].
 *
 * _Available since v3.4._
 */
abstract contract EIP712 {
    /* solhint-disable var-name-mixedcase */
    // Cache the domain separator as an immutable value, but also store the chain id that it corresponds to, in order to
    // invalidate the cached domain separator if the chain id changes.
    bytes32 private immutable _CACHED_DOMAIN_SEPARATOR;
    uint256 private immutable _CACHED_CHAIN_ID;
    address private immutable _CACHED_THIS;

    bytes32 private immutable _HASHED_NAME;
    bytes32 private immutable _HASHED_VERSION;
    bytes32 private immutable _TYPE_HASH;

    /* solhint-enable var-name-mixedcase */

    /**
     * @dev Initializes the domain separator and parameter caches.
     *
     * The meaning of `name` and `version` is specified in
     * https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP 712]:
     *
     * - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol.
     * - `version`: the current major version of the signing domain.
     *
     * NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart
     * contract upgrade].
     */
    constructor(string memory name, string memory version) {
        bytes32 hashedName = keccak256(bytes(name));
        bytes32 hashedVersion = keccak256(bytes(version));
        bytes32 typeHash = keccak256(
            "EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"
        );
        _HASHED_NAME = hashedName;
        _HASHED_VERSION = hashedVersion;
        _CACHED_CHAIN_ID = block.chainid;
        _CACHED_DOMAIN_SEPARATOR = _buildDomainSeparator(typeHash, hashedName, hashedVersion);
        _CACHED_THIS = address(this);
        _TYPE_HASH = typeHash;
    }

    /**
     * @dev Returns the domain separator for the current chain.
     */
    function _domainSeparatorV4() internal view returns (bytes32) {
        if (address(this) == _CACHED_THIS && block.chainid == _CACHED_CHAIN_ID) {
            return _CACHED_DOMAIN_SEPARATOR;
        } else {
            return _buildDomainSeparator(_TYPE_HASH, _HASHED_NAME, _HASHED_VERSION);
        }
    }

    function _buildDomainSeparator(
        bytes32 typeHash,
        bytes32 nameHash,
        bytes32 versionHash
    ) private view returns (bytes32) {
        return keccak256(abi.encode(typeHash, nameHash, versionHash, block.chainid, address(this)));
    }

    /**
     * @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this
     * function returns the hash of the fully encoded EIP712 message for this domain.
     *
     * This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example:
     *
     * ```solidity
     * bytes32 digest = _hashTypedDataV4(keccak256(abi.encode(
     *     keccak256("Mail(address to,string contents)"),
     *     mailTo,
     *     keccak256(bytes(mailContents))
     * )));
     * address signer = ECDSA.recover(digest, signature);
     * ```
     */
    function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) {
        return ECDSA.toTypedDataHash(_domainSeparatorV4(), structHash);
    }
}

// File: @openzeppelin/contracts/utils/Context.sol


// OpenZeppelin Contracts v4.4.0 (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: @openzeppelin/contracts/token/ERC721/ERC721.sol


// OpenZeppelin Contracts v4.4.0 (token/ERC721/ERC721.sol)

pragma solidity ^0.8.0;








/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension, but not including the Enumerable extension, which is available separately as
 * {ERC721Enumerable}.
 */
contract ERC721 is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to owner address
    mapping(uint256 => address) private _owners;

    // Mapping owner address to token count
    mapping(address => uint256) private _balances;

    // Mapping from token ID to approved address
    mapping(uint256 => address) private _tokenApprovals;

    // Mapping from owner to operator approvals
    mapping(address => mapping(address => bool)) private _operatorApprovals;

    /**
     * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {
        return
            interfaceId == type(IERC721).interfaceId ||
            interfaceId == type(IERC721Metadata).interfaceId ||
            super.supportsInterface(interfaceId);
    }

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view virtual override returns (uint256) {
        require(owner != address(0), "ERC721: balance query for the zero address");
        return _balances[owner];
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        address owner = _owners[tokenId];
        require(owner != address(0), "ERC721: owner query for nonexistent token");
        return owner;
    }

    /**
     * @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 See {IERC721Metadata-tokenURI}.
     */
    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 {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public virtual override {
        address owner = ERC721.ownerOf(tokenId);
        require(to != owner, "ERC721: approval to current owner");

        require(
            _msgSender() == owner || isApprovedForAll(owner, _msgSender()),
            "ERC721: approve caller is not owner nor approved for all"
        );

        _approve(to, tokenId);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        require(_exists(tokenId), "ERC721: approved query for nonexistent token");

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        _setApprovalForAll(_msgSender(), operator, approved);
    }

    /**
     * @dev See {IERC721-isApprovedForAll}.
     */
    function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {
        return _operatorApprovals[owner][operator];
    }

    /**
     * @dev See {IERC721-transferFrom}.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");

        _transfer(from, to, tokenId);
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        safeTransferFrom(from, to, tokenId, "");
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public virtual override {
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");
        _safeTransfer(from, to, tokenId, _data);
    }

    /**
     * @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.
     *
     * `_data` is additional data, it has no specified format and it is sent in call to `to`.
     *
     * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.
     * implement alternative mechanisms to perform token transfer, such as signature-based.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeTransfer(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _transfer(from, to, tokenId);
        require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer");
    }

    /**
     * @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 _owners[tokenId] != address(0);
    }

    /**
     * @dev Returns whether `spender` is allowed to manage `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) {
        require(_exists(tokenId), "ERC721: operator query for nonexistent token");
        address owner = ERC721.ownerOf(tokenId);
        return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender));
    }

    /**
     * @dev Safely mints `tokenId` and transfers it to `to`.
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(address to, uint256 tokenId) internal virtual {
        _safeMint(to, tokenId, "");
    }

    /**
     * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is
     * forwarded in {IERC721Receiver-onERC721Received} to contract recipients.
     */
    function _safeMint(
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _mint(to, tokenId);
        require(
            _checkOnERC721Received(address(0), to, tokenId, _data),
            "ERC721: transfer to non ERC721Receiver implementer"
        );
    }

    /**
     * @dev Mints `tokenId` and transfers it to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - `to` cannot be the zero address.
     *
     * Emits a {Transfer} event.
     */
    function _mint(address to, uint256 tokenId) internal virtual {
        require(to != address(0), "ERC721: mint to the zero address");
        require(!_exists(tokenId), "ERC721: token already minted");

        _beforeTokenTransfer(address(0), to, tokenId);

        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(address(0), to, tokenId);
    }

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId) internal virtual {
        address owner = ERC721.ownerOf(tokenId);

        _beforeTokenTransfer(owner, address(0), tokenId);

        // Clear approvals
        _approve(address(0), tokenId);

        _balances[owner] -= 1;
        delete _owners[tokenId];

        emit Transfer(owner, address(0), tokenId);
    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *  As opposed to {transferFrom}, this imposes no restrictions on msg.sender.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     *
     * Emits a {Transfer} event.
     */
    function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {
        require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own");
        require(to != address(0), "ERC721: transfer to the zero address");

        _beforeTokenTransfer(from, to, tokenId);

        // Clear approvals from the previous owner
        _approve(address(0), tokenId);

        _balances[from] -= 1;
        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(from, to, tokenId);
    }

    /**
     * @dev Approve `to` to operate on `tokenId`
     *
     * Emits a {Approval} event.
     */
    function _approve(address to, uint256 tokenId) internal virtual {
        _tokenApprovals[tokenId] = to;
        emit Approval(ERC721.ownerOf(tokenId), to, tokenId);
    }

    /**
     * @dev Approve `operator` to operate on all of `owner` tokens
     *
     * Emits a {ApprovalForAll} event.
     */
    function _setApprovalForAll(
        address owner,
        address operator,
        bool approved
    ) internal virtual {
        require(owner != operator, "ERC721: approve to caller");
        _operatorApprovals[owner][operator] = approved;
        emit ApprovalForAll(owner, operator, approved);
    }

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.
     * The call is not executed if the target address is not a contract.
     *
     * @param from address representing the previous owner of the given token ID
     * @param to target address that will receive the tokens
     * @param tokenId uint256 ID of the token to be transferred
     * @param _data bytes optional data to send along with the call
     * @return bool whether the call correctly returned the expected magic value
     */
    function _checkOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        if (to.isContract()) {
            try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {
                return retval == IERC721Receiver.onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert("ERC721: transfer to non ERC721Receiver implementer");
                } else {
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, ``from``'s `tokenId` will be burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {}
}

// File: @openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol


// OpenZeppelin Contracts v4.4.0 (token/ERC721/extensions/ERC721Enumerable.sol)

pragma solidity ^0.8.0;



/**
 * @dev This implements an optional extension of {ERC721} defined in the EIP that adds
 * enumerability of all the token ids in the contract as well as all token ids owned by each
 * account.
 */
abstract contract ERC721Enumerable is ERC721, IERC721Enumerable {
    // Mapping from owner to list of owned token IDs
    mapping(address => mapping(uint256 => uint256)) private _ownedTokens;

    // Mapping from token ID to index of the owner tokens list
    mapping(uint256 => uint256) private _ownedTokensIndex;

    // Array with all token ids, used for enumeration
    uint256[] private _allTokens;

    // Mapping from token id to position in the allTokens array
    mapping(uint256 => uint256) private _allTokensIndex;

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) {
        return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId);
    }

    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds");
        return _ownedTokens[owner][index];
    }

    /**
     * @dev See {IERC721Enumerable-totalSupply}.
     */
    function totalSupply() public view virtual override returns (uint256) {
        return _allTokens.length;
    }

    /**
     * @dev See {IERC721Enumerable-tokenByIndex}.
     */
    function tokenByIndex(uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds");
        return _allTokens[index];
    }

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, ``from``'s `tokenId` will be burned.
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual override {
        super._beforeTokenTransfer(from, to, tokenId);

        if (from == address(0)) {
            _addTokenToAllTokensEnumeration(tokenId);
        } else if (from != to) {
            _removeTokenFromOwnerEnumeration(from, tokenId);
        }
        if (to == address(0)) {
            _removeTokenFromAllTokensEnumeration(tokenId);
        } else if (to != from) {
            _addTokenToOwnerEnumeration(to, tokenId);
        }
    }

    /**
     * @dev Private function to add a token to this extension's ownership-tracking data structures.
     * @param to address representing the new owner of the given token ID
     * @param tokenId uint256 ID of the token to be added to the tokens list of the given address
     */
    function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private {
        uint256 length = ERC721.balanceOf(to);
        _ownedTokens[to][length] = tokenId;
        _ownedTokensIndex[tokenId] = length;
    }

    /**
     * @dev Private function to add a token to this extension's token tracking data structures.
     * @param tokenId uint256 ID of the token to be added to the tokens list
     */
    function _addTokenToAllTokensEnumeration(uint256 tokenId) private {
        _allTokensIndex[tokenId] = _allTokens.length;
        _allTokens.push(tokenId);
    }

    /**
     * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that
     * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for
     * gas optimizations e.g. when performing a transfer operation (avoiding double writes).
     * This has O(1) time complexity, but alters the order of the _ownedTokens array.
     * @param from address representing the previous owner of the given token ID
     * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address
     */
    function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private {
        // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = ERC721.balanceOf(from) - 1;
        uint256 tokenIndex = _ownedTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary
        if (tokenIndex != lastTokenIndex) {
            uint256 lastTokenId = _ownedTokens[from][lastTokenIndex];

            _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
            _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index
        }

        // This also deletes the contents at the last position of the array
        delete _ownedTokensIndex[tokenId];
        delete _ownedTokens[from][lastTokenIndex];
    }

    /**
     * @dev Private function to remove a token from this extension's token tracking data structures.
     * This has O(1) time complexity, but alters the order of the _allTokens array.
     * @param tokenId uint256 ID of the token to be removed from the tokens list
     */
    function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private {
        // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = _allTokens.length - 1;
        uint256 tokenIndex = _allTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so
        // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding
        // an 'if' statement (like in _removeTokenFromOwnerEnumeration)
        uint256 lastTokenId = _allTokens[lastTokenIndex];

        _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
        _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index

        // This also deletes the contents at the last position of the array
        delete _allTokensIndex[tokenId];
        _allTokens.pop();
    }
}

// File: @openzeppelin/contracts/access/Ownable.sol


// OpenZeppelin Contracts v4.4.0 (access/Ownable.sol)

pragma solidity ^0.8.0;


/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
    address private _owner;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _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: @openzeppelin/contracts/access/IAccessControl.sol


// OpenZeppelin Contracts v4.4.0 (access/IAccessControl.sol)

pragma solidity ^0.8.0;

/**
 * @dev External interface of AccessControl declared to support ERC165 detection.
 */
interface IAccessControl {
    /**
     * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole`
     *
     * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite
     * {RoleAdminChanged} not being emitted signaling this.
     *
     * _Available since v3.1._
     */
    event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole);

    /**
     * @dev Emitted when `account` is granted `role`.
     *
     * `sender` is the account that originated the contract call, an admin role
     * bearer except when using {AccessControl-_setupRole}.
     */
    event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender);

    /**
     * @dev Emitted when `account` is revoked `role`.
     *
     * `sender` is the account that originated the contract call:
     *   - if using `revokeRole`, it is the admin role bearer
     *   - if using `renounceRole`, it is the role bearer (i.e. `account`)
     */
    event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender);

    /**
     * @dev Returns `true` if `account` has been granted `role`.
     */
    function hasRole(bytes32 role, address account) external view returns (bool);

    /**
     * @dev Returns the admin role that controls `role`. See {grantRole} and
     * {revokeRole}.
     *
     * To change a role's admin, use {AccessControl-_setRoleAdmin}.
     */
    function getRoleAdmin(bytes32 role) external view returns (bytes32);

    /**
     * @dev Grants `role` to `account`.
     *
     * If `account` had not been already granted `role`, emits a {RoleGranted}
     * event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     */
    function grantRole(bytes32 role, address account) external;

    /**
     * @dev Revokes `role` from `account`.
     *
     * If `account` had been granted `role`, emits a {RoleRevoked} event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     */
    function revokeRole(bytes32 role, address account) external;

    /**
     * @dev Revokes `role` from the calling account.
     *
     * Roles are often managed via {grantRole} and {revokeRole}: this function's
     * purpose is to provide a mechanism for accounts to lose their privileges
     * if they are compromised (such as when a trusted device is misplaced).
     *
     * If the calling account had been granted `role`, emits a {RoleRevoked}
     * event.
     *
     * Requirements:
     *
     * - the caller must be `account`.
     */
    function renounceRole(bytes32 role, address account) external;
}

// File: @openzeppelin/contracts/access/AccessControl.sol


// OpenZeppelin Contracts v4.4.0 (access/AccessControl.sol)

pragma solidity ^0.8.0;





/**
 * @dev Contract module that allows children to implement role-based access
 * control mechanisms. This is a lightweight version that doesn't allow enumerating role
 * members except through off-chain means by accessing the contract event logs. Some
 * applications may benefit from on-chain enumerability, for those cases see
 * {AccessControlEnumerable}.
 *
 * Roles are referred to by their `bytes32` identifier. These should be exposed
 * in the external API and be unique. The best way to achieve this is by
 * using `public constant` hash digests:
 *
 * ```
 * bytes32 public constant MY_ROLE = keccak256("MY_ROLE");
 * ```
 *
 * Roles can be used to represent a set of permissions. To restrict access to a
 * function call, use {hasRole}:
 *
 * ```
 * function foo() public {
 *     require(hasRole(MY_ROLE, msg.sender));
 *     ...
 * }
 * ```
 *
 * Roles can be granted and revoked dynamically via the {grantRole} and
 * {revokeRole} functions. Each role has an associated admin role, and only
 * accounts that have a role's admin role can call {grantRole} and {revokeRole}.
 *
 * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means
 * that only accounts with this role will be able to grant or revoke other
 * roles. More complex role relationships can be created by using
 * {_setRoleAdmin}.
 *
 * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to
 * grant and revoke this role. Extra precautions should be taken to secure
 * accounts that have been granted it.
 */
abstract contract AccessControl is Context, IAccessControl, ERC165 {
    struct RoleData {
        mapping(address => bool) members;
        bytes32 adminRole;
    }

    mapping(bytes32 => RoleData) private _roles;

    bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;

    /**
     * @dev Modifier that checks that an account has a specific role. Reverts
     * with a standardized message including the required role.
     *
     * The format of the revert reason is given by the following regular expression:
     *
     *  /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/
     *
     * _Available since v4.1._
     */
    modifier onlyRole(bytes32 role) {
        _checkRole(role, _msgSender());
        _;
    }

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId);
    }

    /**
     * @dev Returns `true` if `account` has been granted `role`.
     */
    function hasRole(bytes32 role, address account) public view override returns (bool) {
        return _roles[role].members[account];
    }

    /**
     * @dev Revert with a standard message if `account` is missing `role`.
     *
     * The format of the revert reason is given by the following regular expression:
     *
     *  /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/
     */
    function _checkRole(bytes32 role, address account) internal view {
        if (!hasRole(role, account)) {
            revert(
                string(
                    abi.encodePacked(
                        "AccessControl: account ",
                        Strings.toHexString(uint160(account), 20),
                        " is missing role ",
                        Strings.toHexString(uint256(role), 32)
                    )
                )
            );
        }
    }

    /**
     * @dev Returns the admin role that controls `role`. See {grantRole} and
     * {revokeRole}.
     *
     * To change a role's admin, use {_setRoleAdmin}.
     */
    function getRoleAdmin(bytes32 role) public view override returns (bytes32) {
        return _roles[role].adminRole;
    }

    /**
     * @dev Grants `role` to `account`.
     *
     * If `account` had not been already granted `role`, emits a {RoleGranted}
     * event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     */
    function grantRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {
        _grantRole(role, account);
    }

    /**
     * @dev Revokes `role` from `account`.
     *
     * If `account` had been granted `role`, emits a {RoleRevoked} event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     */
    function revokeRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {
        _revokeRole(role, account);
    }

    /**
     * @dev Revokes `role` from the calling account.
     *
     * Roles are often managed via {grantRole} and {revokeRole}: this function's
     * purpose is to provide a mechanism for accounts to lose their privileges
     * if they are compromised (such as when a trusted device is misplaced).
     *
     * If the calling account had been revoked `role`, emits a {RoleRevoked}
     * event.
     *
     * Requirements:
     *
     * - the caller must be `account`.
     */
    function renounceRole(bytes32 role, address account) public virtual override {
        require(account == _msgSender(), "AccessControl: can only renounce roles for self");

        _revokeRole(role, account);
    }

    /**
     * @dev Grants `role` to `account`.
     *
     * If `account` had not been already granted `role`, emits a {RoleGranted}
     * event. Note that unlike {grantRole}, this function doesn't perform any
     * checks on the calling account.
     *
     * [WARNING]
     * ====
     * This function should only be called from the constructor when setting
     * up the initial roles for the system.
     *
     * Using this function in any other way is effectively circumventing the admin
     * system imposed by {AccessControl}.
     * ====
     *
     * NOTE: This function is deprecated in favor of {_grantRole}.
     */
    function _setupRole(bytes32 role, address account) internal virtual {
        _grantRole(role, account);
    }

    /**
     * @dev Sets `adminRole` as ``role``'s admin role.
     *
     * Emits a {RoleAdminChanged} event.
     */
    function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual {
        bytes32 previousAdminRole = getRoleAdmin(role);
        _roles[role].adminRole = adminRole;
        emit RoleAdminChanged(role, previousAdminRole, adminRole);
    }

    /**
     * @dev Grants `role` to `account`.
     *
     * Internal function without access restriction.
     */
    function _grantRole(bytes32 role, address account) internal virtual {
        if (!hasRole(role, account)) {
            _roles[role].members[account] = true;
            emit RoleGranted(role, account, _msgSender());
        }
    }

    /**
     * @dev Revokes `role` from `account`.
     *
     * Internal function without access restriction.
     */
    function _revokeRole(bytes32 role, address account) internal virtual {
        if (hasRole(role, account)) {
            _roles[role].members[account] = false;
            emit RoleRevoked(role, account, _msgSender());
        }
    }
}

// File: contracts/luxeto-cube-airdrop-mainnet-withID.sol



// This contract is a minimum contract for NFT airdrop with signature capability.
// Client is required to supply tokenId and URI.
pragma solidity ^0.8.0;








contract LuxetoAirdrop is EIP712, AccessControl, Ownable, ERC721Enumerable 
{
    using Counters for Counters.Counter;
    
    Counters.Counter private _tokenIdTracker;
    
    bytes32 public constant MINTER_ROLE = keccak256("MINTER_ROLE");
    string private base_membership_uri = "https://bafybeihncfnw3riqelroyz2c7gx7gfrj3xzl64gfkzywqvigezmxlffi5q.ipfs.dweb.link/";
    uint256 total_supply = 10000;

    address private cryptopunk_contract_address = 0xb47e3cd837dDF8e4c57F05d70Ab865de6e193BBB;

    constructor(string memory name, string memory symbol)
    ERC721(name, symbol)
    EIP712(name, "1.0.0")
    {
        _setupRole(DEFAULT_ADMIN_ROLE, _msgSender());
        _setupRole(MINTER_ROLE, _msgSender());
    }
    
    function _baseURI() internal view override virtual returns (string memory) {
        return base_membership_uri;
    }
    
    function totalSupply() public view override returns (uint256) {
        return total_supply;
    }

    function supportsInterface(bytes4 interfaceId) public view virtual override(AccessControl, ERC721Enumerable) returns (bool) {
        return super.supportsInterface(interfaceId);
    }

    function mintBySignature(address account, bytes calldata signature)
    external
    {
        require(balanceOf(account) < 2);
        require(_verify(_hash(account), signature), "Invalid signature");
        _safeMint(account, _tokenIdTracker.current());
        _tokenIdTracker.increment();
    }

    function mintByOwner(address account)
    external onlyOwner
    {
        _safeMint(account, _tokenIdTracker.current());
        _tokenIdTracker.increment();
    }
    
    
    function mintByMinter(address account)
    external
    {
        require(hasRole(MINTER_ROLE, _msgSender()));
        _safeMint(account, _tokenIdTracker.current());
        _tokenIdTracker.increment();
    }
    
    function mintByCryptopunk(address account)
    external
    {
        require(balanceOf(account) < 2);
        CryptoPunks c = CryptoPunks(cryptopunk_contract_address);
        require(c.balanceOf(account) > 0);
        _safeMint(account, _tokenIdTracker.current());
         _tokenIdTracker.increment();
    }

    function _hash(address account)
    internal view returns (bytes32)
    {
        return _hashTypedDataV4(keccak256(abi.encode(
            keccak256("NFT(address account)"),
            account
        )));
    }

    function _verify(bytes32 digest, bytes memory signature)
    internal view returns (bool)
    {
        return hasRole(MINTER_ROLE, ECDSA.recover(digest, signature));
    }
    
    function decodedAddress(address account, bytes calldata signature) external view returns (address) 
    {
        return ECDSA.recover(_hash(account), signature);
    }
}

contract CryptoPunks {
    mapping (address => uint256) public balanceOf;
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","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":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","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"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINTER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"decodedAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"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":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":[{"internalType":"address","name":"account","type":"address"}],"name":"mintByCryptopunk","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"mintByMinter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"mintByOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"mintBySignature","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","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":"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":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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"}]

610140604052604051806080016040528060538152602001620056d860539139600d908051906020019062000036929190620004ef565b50612710600e5573b47e3cd837ddf8e4c57f05d70ab865de6e193bbb600f60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055503480156200009f57600080fd5b506040516200572b3803806200572b8339818101604052810190620000c591906200061d565b8181836040518060400160405280600581526020017f312e302e3000000000000000000000000000000000000000000000000000000081525060008280519060200120905060008280519060200120905060007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f90508260e081815250508161010081815250504660a08181525050620001678184846200027460201b60201c565b608081815250503073ffffffffffffffffffffffffffffffffffffffff1660c08173ffffffffffffffffffffffffffffffffffffffff1660601b815250508061012081815250505050505050620001d3620001c7620002b060201b60201c565b620002b860201b60201c565b8160029080519060200190620001eb929190620004ef565b50806003908051906020019062000204929190620004ef565b5050506200022b6000801b6200021f620002b060201b60201c565b6200037e60201b60201c565b6200026c7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a662000260620002b060201b60201c565b6200037e60201b60201c565b5050620008fe565b6000838383463060405160200162000291959493929190620006d5565b6040516020818303038152906040528051906020012090509392505050565b600033905090565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6200039082826200039460201b60201c565b5050565b620003a682826200048560201b60201c565b6200048157600160008084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555062000426620002b060201b60201c565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b828054620004fd906200080f565b90600052602060002090601f0160209004810192826200052157600085556200056d565b82601f106200053c57805160ff19168380011785556200056d565b828001600101855582156200056d579182015b828111156200056c5782518255916020019190600101906200054f565b5b5090506200057c919062000580565b5090565b5b808211156200059b57600081600090555060010162000581565b5090565b6000620005b6620005b0846200075b565b62000732565b905082815260208101848484011115620005d557620005d4620008de565b5b620005e2848285620007d9565b509392505050565b600082601f830112620006025762000601620008d9565b5b8151620006148482602086016200059f565b91505092915050565b60008060408385031215620006375762000636620008e8565b5b600083015167ffffffffffffffff811115620006585762000657620008e3565b5b6200066685828601620005ea565b925050602083015167ffffffffffffffff8111156200068a5762000689620008e3565b5b6200069885828601620005ea565b9150509250929050565b620006ad8162000791565b82525050565b620006be81620007a5565b82525050565b620006cf81620007cf565b82525050565b600060a082019050620006ec6000830188620006b3565b620006fb6020830187620006b3565b6200070a6040830186620006b3565b620007196060830185620006c4565b620007286080830184620006a2565b9695505050505050565b60006200073e62000751565b90506200074c828262000845565b919050565b6000604051905090565b600067ffffffffffffffff821115620007795762000778620008aa565b5b6200078482620008ed565b9050602081019050919050565b60006200079e82620007af565b9050919050565b6000819050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60005b83811015620007f9578082015181840152602081019050620007dc565b8381111562000809576000848401525b50505050565b600060028204905060018216806200082857607f821691505b602082108114156200083f576200083e6200087b565b5b50919050565b6200085082620008ed565b810181811067ffffffffffffffff82111715620008725762000871620008aa565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60805160a05160c05160601c60e0516101005161012051614d87620009516000396000612d9301526000612dd501526000612db401526000612ce901526000612d3f01526000612d680152614d876000f3fe608060405234801561001057600080fd5b50600436106101e55760003560e01c80636b003e431161010f578063b533731d116100a2578063d547741f11610071578063d547741f146105a0578063e985e9c5146105bc578063f2fde38b146105ec578063f39a045c14610608576101e5565b8063b533731d1461051a578063b88d4fde14610536578063c87b56dd14610552578063d539139314610582576101e5565b806391d14854116100de57806391d148541461049257806395d89b41146104c2578063a217fddf146104e0578063a22cb465146104fe576101e5565b80636b003e431461041e57806370a082311461043a578063715018a61461046a5780638da5cb5b14610474576101e5565b8063291a7b761161018757806342842e0e1161015657806342842e0e146103865780634f6ccce7146103a25780636352211e146103d2578063681c06de14610402576101e5565b8063291a7b76146102ee5780632f2ff15d1461031e5780632f745c591461033a57806336568abe1461036a576101e5565b8063095ea7b3116101c3578063095ea7b31461026857806318160ddd1461028457806323b872dd146102a2578063248a9ca3146102be576101e5565b806301ffc9a7146101ea57806306fdde031461021a578063081812fc14610238575b600080fd5b61020460048036038101906101ff91906135fb565b610624565b6040516102119190613c84565b60405180910390f35b610222610636565b60405161022f9190613d7b565b60405180910390f35b610252600480360381019061024d9190613655565b6106c8565b60405161025f9190613c1d565b60405180910390f35b610282600480360381019061027d919061354e565b61074d565b005b61028c610865565b60405161029991906140bd565b60405180910390f35b6102bc60048036038101906102b791906133d8565b61086f565b005b6102d860048036038101906102d3919061358e565b6108cf565b6040516102e59190613c9f565b60405180910390f35b610308600480360381019061030391906134ee565b6108ee565b6040516103159190613c1d565b60405180910390f35b610338600480360381019061033391906135bb565b61094f565b005b610354600480360381019061034f919061354e565b610978565b60405161036191906140bd565b60405180910390f35b610384600480360381019061037f91906135bb565b610a1d565b005b6103a0600480360381019061039b91906133d8565b610aa0565b005b6103bc60048036038101906103b79190613655565b610ac0565b6040516103c991906140bd565b60405180910390f35b6103ec60048036038101906103e79190613655565b610b31565b6040516103f99190613c1d565b60405180910390f35b61041c6004803603810190610417919061336b565b610be3565b005b610438600480360381019061043391906134ee565b610cd5565b005b610454600480360381019061044f919061336b565b610da1565b60405161046191906140bd565b60405180910390f35b610472610e59565b005b61047c610ee1565b6040516104899190613c1d565b60405180910390f35b6104ac60048036038101906104a791906135bb565b610f0b565b6040516104b99190613c84565b60405180910390f35b6104ca610f75565b6040516104d79190613d7b565b60405180910390f35b6104e8611007565b6040516104f59190613c9f565b60405180910390f35b610518600480360381019061051391906134ae565b61100e565b005b610534600480360381019061052f919061336b565b611024565b005b610550600480360381019061054b919061342b565b6110c0565b005b61056c60048036038101906105679190613655565b611122565b6040516105799190613d7b565b60405180910390f35b61058a6111c9565b6040516105979190613c9f565b60405180910390f35b6105ba60048036038101906105b591906135bb565b6111ed565b005b6105d660048036038101906105d19190613398565b611216565b6040516105e39190613c84565b60405180910390f35b6106066004803603810190610601919061336b565b6112aa565b005b610622600480360381019061061d919061336b565b6113a2565b005b600061062f826113fc565b9050919050565b6060600280546106459061437d565b80601f01602080910402602001604051908101604052809291908181526020018280546106719061437d565b80156106be5780601f10610693576101008083540402835291602001916106be565b820191906000526020600020905b8154815290600101906020018083116106a157829003601f168201915b5050505050905090565b60006106d382611476565b610712576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161070990613fbd565b60405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061075882610b31565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156107c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107c09061403d565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166107e86114e2565b73ffffffffffffffffffffffffffffffffffffffff1614806108175750610816816108116114e2565b611216565b5b610856576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161084d90613f1d565b60405180910390fd5b61086083836114ea565b505050565b6000600e54905090565b61088061087a6114e2565b826115a3565b6108bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108b69061405d565b60405180910390fd5b6108ca838383611681565b505050565b6000806000838152602001908152602001600020600101549050919050565b60006109466108fc856118dd565b84848080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050611937565b90509392505050565b610958826108cf565b610969816109646114e2565b61195e565b61097383836119fb565b505050565b600061098383610da1565b82106109c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109bb90613dfd565b60405180910390fd5b600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610a256114e2565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610a92576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a899061409d565b60405180910390fd5b610a9c8282611adb565b5050565b610abb838383604051806020016040528060008152506110c0565b505050565b6000610aca611bbc565b8210610b0b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b029061407d565b60405180910390fd5b600a8281548110610b1f57610b1e61454f565b5b90600052602060002001549050919050565b6000806004600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610bda576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bd190613f5d565b60405180910390fd5b80915050919050565b6002610bee82610da1565b10610bf857600080fd5b6000600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060008173ffffffffffffffffffffffffffffffffffffffff166370a08231846040518263ffffffff1660e01b8152600401610c5a9190613c1d565b60206040518083038186803b158015610c7257600080fd5b505afa158015610c86573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610caa9190613682565b11610cb457600080fd5b610cc782610cc2600c611bc9565b611bd7565b610cd1600c611bf5565b5050565b6002610ce084610da1565b10610cea57600080fd5b610d40610cf6846118dd565b83838080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050611c0b565b610d7f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d7690613ebd565b60405180910390fd5b610d9283610d8d600c611bc9565b611bd7565b610d9c600c611bf5565b505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610e12576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e0990613f3d565b60405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610e616114e2565b73ffffffffffffffffffffffffffffffffffffffff16610e7f610ee1565b73ffffffffffffffffffffffffffffffffffffffff1614610ed5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ecc90613fdd565b60405180910390fd5b610edf6000611c48565b565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b606060038054610f849061437d565b80601f0160208091040260200160405190810160405280929190818152602001828054610fb09061437d565b8015610ffd5780601f10610fd257610100808354040283529160200191610ffd565b820191906000526020600020905b815481529060010190602001808311610fe057829003601f168201915b5050505050905090565b6000801b81565b6110206110196114e2565b8383611d0e565b5050565b61102c6114e2565b73ffffffffffffffffffffffffffffffffffffffff1661104a610ee1565b73ffffffffffffffffffffffffffffffffffffffff16146110a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109790613fdd565b60405180910390fd5b6110b3816110ae600c611bc9565b611bd7565b6110bd600c611bf5565b50565b6110d16110cb6114e2565b836115a3565b611110576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111079061405d565b60405180910390fd5b61111c84848484611e7b565b50505050565b606061112d82611476565b61116c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111639061401d565b60405180910390fd5b6000611176611ed7565b9050600081511161119657604051806020016040528060008152506111c1565b806111a084611f69565b6040516020016111b1929190613b88565b6040516020818303038152906040525b915050919050565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a681565b6111f6826108cf565b611207816112026114e2565b61195e565b6112118383611adb565b505050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6112b26114e2565b73ffffffffffffffffffffffffffffffffffffffff166112d0610ee1565b73ffffffffffffffffffffffffffffffffffffffff1614611326576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161131d90613fdd565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611396576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161138d90613e3d565b60405180910390fd5b61139f81611c48565b50565b6113d37f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a66113ce6114e2565b610f0b565b6113dc57600080fd5b6113ef816113ea600c611bc9565b611bd7565b6113f9600c611bf5565b50565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061146f575061146e826120ca565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166004600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816006600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661155d83610b31565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006115ae82611476565b6115ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115e490613efd565b60405180910390fd5b60006115f883610b31565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061166757508373ffffffffffffffffffffffffffffffffffffffff1661164f846106c8565b73ffffffffffffffffffffffffffffffffffffffff16145b8061167857506116778185611216565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166116a182610b31565b73ffffffffffffffffffffffffffffffffffffffff16146116f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116ee90613ffd565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611767576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161175e90613e7d565b60405180910390fd5b6117728383836121ac565b61177d6000826114ea565b6001600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546117cd9190614252565b925050819055506001600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546118249190614171565b92505081905550816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60006119307fa34fdc1cdefec5bee12b0e3e970398ed9e8adbf09d50d5b551f42c80537ffafa83604051602001611915929190613cba565b604051602081830303815290604052805190602001206122c0565b9050919050565b600080600061194685856122da565b915091506119538161235d565b819250505092915050565b6119688282610f0b565b6119f75761198d8173ffffffffffffffffffffffffffffffffffffffff166014612532565b61199b8360001c6020612532565b6040516020016119ac929190613be3565b6040516020818303038152906040526040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119ee9190613d7b565b60405180910390fd5b5050565b611a058282610f0b565b611ad757600160008084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550611a7c6114e2565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b611ae58282610f0b565b15611bb857600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550611b5d6114e2565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b6000600a80549050905090565b600081600001549050919050565b611bf182826040518060200160405280600081525061276e565b5050565b6001816000016000828254019250508190555050565b6000611c407f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6611c3b8585611937565b610f0b565b905092915050565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611d7d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d7490613e9d565b60405180910390fd5b80600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611e6e9190613c84565b60405180910390a3505050565b611e86848484611681565b611e92848484846127c9565b611ed1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ec890613e1d565b60405180910390fd5b50505050565b6060600d8054611ee69061437d565b80601f0160208091040260200160405190810160405280929190818152602001828054611f129061437d565b8015611f5f5780601f10611f3457610100808354040283529160200191611f5f565b820191906000526020600020905b815481529060010190602001808311611f4257829003601f168201915b5050505050905090565b60606000821415611fb1576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506120c5565b600082905060005b60008214611fe3578080611fcc906143e0565b915050600a82611fdc91906141c7565b9150611fb9565b60008167ffffffffffffffff811115611fff57611ffe61457e565b5b6040519080825280601f01601f1916602001820160405280156120315781602001600182028036833780820191505090505b5090505b600085146120be5760018261204a9190614252565b9150600a856120599190614433565b60306120659190614171565b60f81b81838151811061207b5761207a61454f565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856120b791906141c7565b9450612035565b8093505050505b919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061219557507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806121a557506121a482612960565b5b9050919050565b6121b78383836129da565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156121fa576121f5816129df565b612239565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612238576122378382612a28565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561227c5761227781612b95565b6122bb565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146122ba576122b98282612c66565b5b5b505050565b60006122d36122cd612ce5565b83612dff565b9050919050565b60008060418351141561231c5760008060006020860151925060408601519150606086015160001a905061231087828585612e32565b94509450505050612356565b60408351141561234d576000806020850151915060408501519050612342868383612f3f565b935093505050612356565b60006002915091505b9250929050565b60006004811115612371576123706144c2565b5b816004811115612384576123836144c2565b5b141561238f5761252f565b600160048111156123a3576123a26144c2565b5b8160048111156123b6576123b56144c2565b5b14156123f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123ee90613d9d565b60405180910390fd5b6002600481111561240b5761240a6144c2565b5b81600481111561241e5761241d6144c2565b5b141561245f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161245690613ddd565b60405180910390fd5b60036004811115612473576124726144c2565b5b816004811115612486576124856144c2565b5b14156124c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124be90613edd565b60405180910390fd5b6004808111156124da576124d96144c2565b5b8160048111156124ed576124ec6144c2565b5b141561252e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161252590613f7d565b60405180910390fd5b5b50565b60606000600283600261254591906141f8565b61254f9190614171565b67ffffffffffffffff8111156125685761256761457e565b5b6040519080825280601f01601f19166020018201604052801561259a5781602001600182028036833780820191505090505b5090507f3000000000000000000000000000000000000000000000000000000000000000816000815181106125d2576125d161454f565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f7800000000000000000000000000000000000000000000000000000000000000816001815181106126365761263561454f565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506000600184600261267691906141f8565b6126809190614171565b90505b6001811115612720577f3031323334353637383961626364656600000000000000000000000000000000600f8616601081106126c2576126c161454f565b5b1a60f81b8282815181106126d9576126d861454f565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c94508061271990614353565b9050612683565b5060008414612764576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161275b90613dbd565b60405180910390fd5b8091505092915050565b6127788383612f8d565b61278560008484846127c9565b6127c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127bb90613e1d565b60405180910390fd5b505050565b60006127ea8473ffffffffffffffffffffffffffffffffffffffff1661315b565b15612953578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026128136114e2565b8786866040518563ffffffff1660e01b81526004016128359493929190613c38565b602060405180830381600087803b15801561284f57600080fd5b505af192505050801561288057506040513d601f19601f8201168201806040525081019061287d9190613628565b60015b612903573d80600081146128b0576040519150601f19603f3d011682016040523d82523d6000602084013e6128b5565b606091505b506000815114156128fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128f290613e1d565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612958565b600190505b949350505050565b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806129d357506129d28261316e565b5b9050919050565b505050565b600a80549050600b600083815260200190815260200160002081905550600a81908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001612a3584610da1565b612a3f9190614252565b9050600060096000848152602001908152602001600020549050818114612b24576000600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816009600083815260200190815260200160002081905550505b6009600084815260200190815260200160002060009055600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600a80549050612ba99190614252565b90506000600b60008481526020019081526020016000205490506000600a8381548110612bd957612bd861454f565b5b9060005260206000200154905080600a8381548110612bfb57612bfa61454f565b5b906000526020600020018190555081600b600083815260200190815260200160002081905550600b600085815260200190815260200160002060009055600a805480612c4a57612c49614520565b5b6001900381819060005260206000200160009055905550505050565b6000612c7183610da1565b905081600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806009600084815260200190815260200160002081905550505050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff16148015612d6157507f000000000000000000000000000000000000000000000000000000000000000046145b15612d8e577f00000000000000000000000000000000000000000000000000000000000000009050612dfc565b612df97f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000006131d8565b90505b90565b60008282604051602001612e14929190613bac565b60405160208183030381529060405280519060200120905092915050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c1115612e6d576000600391509150612f36565b601b8560ff1614158015612e855750601c8560ff1614155b15612e97576000600491509150612f36565b600060018787878760405160008152602001604052604051612ebc9493929190613d36565b6020604051602081039080840390855afa158015612ede573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612f2d57600060019250925050612f36565b80600092509250505b94509492505050565b6000806000807f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff85169150601b8560ff1c019050612f7f87828885612e32565b935093505050935093915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612ffd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ff490613f9d565b60405180910390fd5b61300681611476565b15613046576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161303d90613e5d565b60405180910390fd5b613052600083836121ac565b6001600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546130a29190614171565b92505081905550816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600083838346306040516020016131f3959493929190613ce3565b6040516020818303038152906040528051906020012090509392505050565b6000613225613220846140fd565b6140d8565b905082815260208101848484011115613241576132406145bc565b5b61324c848285614311565b509392505050565b60008135905061326381614cde565b92915050565b60008135905061327881614cf5565b92915050565b60008135905061328d81614d0c565b92915050565b6000813590506132a281614d23565b92915050565b6000815190506132b781614d23565b92915050565b60008083601f8401126132d3576132d26145b2565b5b8235905067ffffffffffffffff8111156132f0576132ef6145ad565b5b60208301915083600182028301111561330c5761330b6145b7565b5b9250929050565b600082601f830112613328576133276145b2565b5b8135613338848260208601613212565b91505092915050565b60008135905061335081614d3a565b92915050565b60008151905061336581614d3a565b92915050565b600060208284031215613381576133806145c6565b5b600061338f84828501613254565b91505092915050565b600080604083850312156133af576133ae6145c6565b5b60006133bd85828601613254565b92505060206133ce85828601613254565b9150509250929050565b6000806000606084860312156133f1576133f06145c6565b5b60006133ff86828701613254565b935050602061341086828701613254565b925050604061342186828701613341565b9150509250925092565b60008060008060808587031215613445576134446145c6565b5b600061345387828801613254565b945050602061346487828801613254565b935050604061347587828801613341565b925050606085013567ffffffffffffffff811115613496576134956145c1565b5b6134a287828801613313565b91505092959194509250565b600080604083850312156134c5576134c46145c6565b5b60006134d385828601613254565b92505060206134e485828601613269565b9150509250929050565b600080600060408486031215613507576135066145c6565b5b600061351586828701613254565b935050602084013567ffffffffffffffff811115613536576135356145c1565b5b613542868287016132bd565b92509250509250925092565b60008060408385031215613565576135646145c6565b5b600061357385828601613254565b925050602061358485828601613341565b9150509250929050565b6000602082840312156135a4576135a36145c6565b5b60006135b28482850161327e565b91505092915050565b600080604083850312156135d2576135d16145c6565b5b60006135e08582860161327e565b92505060206135f185828601613254565b9150509250929050565b600060208284031215613611576136106145c6565b5b600061361f84828501613293565b91505092915050565b60006020828403121561363e5761363d6145c6565b5b600061364c848285016132a8565b91505092915050565b60006020828403121561366b5761366a6145c6565b5b600061367984828501613341565b91505092915050565b600060208284031215613698576136976145c6565b5b60006136a684828501613356565b91505092915050565b6136b881614286565b82525050565b6136c781614298565b82525050565b6136d6816142a4565b82525050565b6136ed6136e8826142a4565b614429565b82525050565b60006136fe8261412e565b6137088185614144565b9350613718818560208601614320565b613721816145cb565b840191505092915050565b600061373782614139565b6137418185614155565b9350613751818560208601614320565b61375a816145cb565b840191505092915050565b600061377082614139565b61377a8185614166565b935061378a818560208601614320565b80840191505092915050565b60006137a3601883614155565b91506137ae826145dc565b602082019050919050565b60006137c6602083614155565b91506137d182614605565b602082019050919050565b60006137e9601f83614155565b91506137f48261462e565b602082019050919050565b600061380c602b83614155565b915061381782614657565b604082019050919050565b600061382f603283614155565b915061383a826146a6565b604082019050919050565b6000613852602683614155565b915061385d826146f5565b604082019050919050565b6000613875601c83614155565b915061388082614744565b602082019050919050565b6000613898600283614166565b91506138a38261476d565b600282019050919050565b60006138bb602483614155565b91506138c682614796565b604082019050919050565b60006138de601983614155565b91506138e9826147e5565b602082019050919050565b6000613901601183614155565b915061390c8261480e565b602082019050919050565b6000613924602283614155565b915061392f82614837565b604082019050919050565b6000613947602c83614155565b915061395282614886565b604082019050919050565b600061396a603883614155565b9150613975826148d5565b604082019050919050565b600061398d602a83614155565b915061399882614924565b604082019050919050565b60006139b0602983614155565b91506139bb82614973565b604082019050919050565b60006139d3602283614155565b91506139de826149c2565b604082019050919050565b60006139f6602083614155565b9150613a0182614a11565b602082019050919050565b6000613a19602c83614155565b9150613a2482614a3a565b604082019050919050565b6000613a3c602083614155565b9150613a4782614a89565b602082019050919050565b6000613a5f602983614155565b9150613a6a82614ab2565b604082019050919050565b6000613a82602f83614155565b9150613a8d82614b01565b604082019050919050565b6000613aa5602183614155565b9150613ab082614b50565b604082019050919050565b6000613ac8603183614155565b9150613ad382614b9f565b604082019050919050565b6000613aeb602c83614155565b9150613af682614bee565b604082019050919050565b6000613b0e601783614166565b9150613b1982614c3d565b601782019050919050565b6000613b31601183614166565b9150613b3c82614c66565b601182019050919050565b6000613b54602f83614155565b9150613b5f82614c8f565b604082019050919050565b613b73816142fa565b82525050565b613b8281614304565b82525050565b6000613b948285613765565b9150613ba08284613765565b91508190509392505050565b6000613bb78261388b565b9150613bc382856136dc565b602082019150613bd382846136dc565b6020820191508190509392505050565b6000613bee82613b01565b9150613bfa8285613765565b9150613c0582613b24565b9150613c118284613765565b91508190509392505050565b6000602082019050613c3260008301846136af565b92915050565b6000608082019050613c4d60008301876136af565b613c5a60208301866136af565b613c676040830185613b6a565b8181036060830152613c7981846136f3565b905095945050505050565b6000602082019050613c9960008301846136be565b92915050565b6000602082019050613cb460008301846136cd565b92915050565b6000604082019050613ccf60008301856136cd565b613cdc60208301846136af565b9392505050565b600060a082019050613cf860008301886136cd565b613d0560208301876136cd565b613d1260408301866136cd565b613d1f6060830185613b6a565b613d2c60808301846136af565b9695505050505050565b6000608082019050613d4b60008301876136cd565b613d586020830186613b79565b613d6560408301856136cd565b613d7260608301846136cd565b95945050505050565b60006020820190508181036000830152613d95818461372c565b905092915050565b60006020820190508181036000830152613db681613796565b9050919050565b60006020820190508181036000830152613dd6816137b9565b9050919050565b60006020820190508181036000830152613df6816137dc565b9050919050565b60006020820190508181036000830152613e16816137ff565b9050919050565b60006020820190508181036000830152613e3681613822565b9050919050565b60006020820190508181036000830152613e5681613845565b9050919050565b60006020820190508181036000830152613e7681613868565b9050919050565b60006020820190508181036000830152613e96816138ae565b9050919050565b60006020820190508181036000830152613eb6816138d1565b9050919050565b60006020820190508181036000830152613ed6816138f4565b9050919050565b60006020820190508181036000830152613ef681613917565b9050919050565b60006020820190508181036000830152613f168161393a565b9050919050565b60006020820190508181036000830152613f368161395d565b9050919050565b60006020820190508181036000830152613f5681613980565b9050919050565b60006020820190508181036000830152613f76816139a3565b9050919050565b60006020820190508181036000830152613f96816139c6565b9050919050565b60006020820190508181036000830152613fb6816139e9565b9050919050565b60006020820190508181036000830152613fd681613a0c565b9050919050565b60006020820190508181036000830152613ff681613a2f565b9050919050565b6000602082019050818103600083015261401681613a52565b9050919050565b6000602082019050818103600083015261403681613a75565b9050919050565b6000602082019050818103600083015261405681613a98565b9050919050565b6000602082019050818103600083015261407681613abb565b9050919050565b6000602082019050818103600083015261409681613ade565b9050919050565b600060208201905081810360008301526140b681613b47565b9050919050565b60006020820190506140d26000830184613b6a565b92915050565b60006140e26140f3565b90506140ee82826143af565b919050565b6000604051905090565b600067ffffffffffffffff8211156141185761411761457e565b5b614121826145cb565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061417c826142fa565b9150614187836142fa565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156141bc576141bb614464565b5b828201905092915050565b60006141d2826142fa565b91506141dd836142fa565b9250826141ed576141ec614493565b5b828204905092915050565b6000614203826142fa565b915061420e836142fa565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561424757614246614464565b5b828202905092915050565b600061425d826142fa565b9150614268836142fa565b92508282101561427b5761427a614464565b5b828203905092915050565b6000614291826142da565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b8381101561433e578082015181840152602081019050614323565b8381111561434d576000848401525b50505050565b600061435e826142fa565b9150600082141561437257614371614464565b5b600182039050919050565b6000600282049050600182168061439557607f821691505b602082108114156143a9576143a86144f1565b5b50919050565b6143b8826145cb565b810181811067ffffffffffffffff821117156143d7576143d661457e565b5b80604052505050565b60006143eb826142fa565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561441e5761441d614464565b5b600182019050919050565b6000819050919050565b600061443e826142fa565b9150614449836142fa565b92508261445957614458614493565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f1901000000000000000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f496e76616c6964207369676e6174757265000000000000000000000000000000600082015250565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b614ce781614286565b8114614cf257600080fd5b50565b614cfe81614298565b8114614d0957600080fd5b50565b614d15816142a4565b8114614d2057600080fd5b50565b614d2c816142ae565b8114614d3757600080fd5b50565b614d43816142fa565b8114614d4e57600080fd5b5056fea26469706673582212200aa0a5f1ed056f87774453bfdf61156faf0bd51f1410c8a1deec712a7f1240c364736f6c6343000807003368747470733a2f2f62616679626569686e63666e7733726971656c726f797a3263376778376766726a33787a6c363467666b7a797771766967657a6d786c66666935712e697066732e647765622e6c696e6b2f00000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000a4c757865746f437562650000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000054c43554245000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101e55760003560e01c80636b003e431161010f578063b533731d116100a2578063d547741f11610071578063d547741f146105a0578063e985e9c5146105bc578063f2fde38b146105ec578063f39a045c14610608576101e5565b8063b533731d1461051a578063b88d4fde14610536578063c87b56dd14610552578063d539139314610582576101e5565b806391d14854116100de57806391d148541461049257806395d89b41146104c2578063a217fddf146104e0578063a22cb465146104fe576101e5565b80636b003e431461041e57806370a082311461043a578063715018a61461046a5780638da5cb5b14610474576101e5565b8063291a7b761161018757806342842e0e1161015657806342842e0e146103865780634f6ccce7146103a25780636352211e146103d2578063681c06de14610402576101e5565b8063291a7b76146102ee5780632f2ff15d1461031e5780632f745c591461033a57806336568abe1461036a576101e5565b8063095ea7b3116101c3578063095ea7b31461026857806318160ddd1461028457806323b872dd146102a2578063248a9ca3146102be576101e5565b806301ffc9a7146101ea57806306fdde031461021a578063081812fc14610238575b600080fd5b61020460048036038101906101ff91906135fb565b610624565b6040516102119190613c84565b60405180910390f35b610222610636565b60405161022f9190613d7b565b60405180910390f35b610252600480360381019061024d9190613655565b6106c8565b60405161025f9190613c1d565b60405180910390f35b610282600480360381019061027d919061354e565b61074d565b005b61028c610865565b60405161029991906140bd565b60405180910390f35b6102bc60048036038101906102b791906133d8565b61086f565b005b6102d860048036038101906102d3919061358e565b6108cf565b6040516102e59190613c9f565b60405180910390f35b610308600480360381019061030391906134ee565b6108ee565b6040516103159190613c1d565b60405180910390f35b610338600480360381019061033391906135bb565b61094f565b005b610354600480360381019061034f919061354e565b610978565b60405161036191906140bd565b60405180910390f35b610384600480360381019061037f91906135bb565b610a1d565b005b6103a0600480360381019061039b91906133d8565b610aa0565b005b6103bc60048036038101906103b79190613655565b610ac0565b6040516103c991906140bd565b60405180910390f35b6103ec60048036038101906103e79190613655565b610b31565b6040516103f99190613c1d565b60405180910390f35b61041c6004803603810190610417919061336b565b610be3565b005b610438600480360381019061043391906134ee565b610cd5565b005b610454600480360381019061044f919061336b565b610da1565b60405161046191906140bd565b60405180910390f35b610472610e59565b005b61047c610ee1565b6040516104899190613c1d565b60405180910390f35b6104ac60048036038101906104a791906135bb565b610f0b565b6040516104b99190613c84565b60405180910390f35b6104ca610f75565b6040516104d79190613d7b565b60405180910390f35b6104e8611007565b6040516104f59190613c9f565b60405180910390f35b610518600480360381019061051391906134ae565b61100e565b005b610534600480360381019061052f919061336b565b611024565b005b610550600480360381019061054b919061342b565b6110c0565b005b61056c60048036038101906105679190613655565b611122565b6040516105799190613d7b565b60405180910390f35b61058a6111c9565b6040516105979190613c9f565b60405180910390f35b6105ba60048036038101906105b591906135bb565b6111ed565b005b6105d660048036038101906105d19190613398565b611216565b6040516105e39190613c84565b60405180910390f35b6106066004803603810190610601919061336b565b6112aa565b005b610622600480360381019061061d919061336b565b6113a2565b005b600061062f826113fc565b9050919050565b6060600280546106459061437d565b80601f01602080910402602001604051908101604052809291908181526020018280546106719061437d565b80156106be5780601f10610693576101008083540402835291602001916106be565b820191906000526020600020905b8154815290600101906020018083116106a157829003601f168201915b5050505050905090565b60006106d382611476565b610712576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161070990613fbd565b60405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061075882610b31565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156107c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107c09061403d565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166107e86114e2565b73ffffffffffffffffffffffffffffffffffffffff1614806108175750610816816108116114e2565b611216565b5b610856576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161084d90613f1d565b60405180910390fd5b61086083836114ea565b505050565b6000600e54905090565b61088061087a6114e2565b826115a3565b6108bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108b69061405d565b60405180910390fd5b6108ca838383611681565b505050565b6000806000838152602001908152602001600020600101549050919050565b60006109466108fc856118dd565b84848080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050611937565b90509392505050565b610958826108cf565b610969816109646114e2565b61195e565b61097383836119fb565b505050565b600061098383610da1565b82106109c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109bb90613dfd565b60405180910390fd5b600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610a256114e2565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610a92576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a899061409d565b60405180910390fd5b610a9c8282611adb565b5050565b610abb838383604051806020016040528060008152506110c0565b505050565b6000610aca611bbc565b8210610b0b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b029061407d565b60405180910390fd5b600a8281548110610b1f57610b1e61454f565b5b90600052602060002001549050919050565b6000806004600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610bda576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bd190613f5d565b60405180910390fd5b80915050919050565b6002610bee82610da1565b10610bf857600080fd5b6000600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060008173ffffffffffffffffffffffffffffffffffffffff166370a08231846040518263ffffffff1660e01b8152600401610c5a9190613c1d565b60206040518083038186803b158015610c7257600080fd5b505afa158015610c86573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610caa9190613682565b11610cb457600080fd5b610cc782610cc2600c611bc9565b611bd7565b610cd1600c611bf5565b5050565b6002610ce084610da1565b10610cea57600080fd5b610d40610cf6846118dd565b83838080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050611c0b565b610d7f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d7690613ebd565b60405180910390fd5b610d9283610d8d600c611bc9565b611bd7565b610d9c600c611bf5565b505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610e12576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e0990613f3d565b60405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610e616114e2565b73ffffffffffffffffffffffffffffffffffffffff16610e7f610ee1565b73ffffffffffffffffffffffffffffffffffffffff1614610ed5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ecc90613fdd565b60405180910390fd5b610edf6000611c48565b565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b606060038054610f849061437d565b80601f0160208091040260200160405190810160405280929190818152602001828054610fb09061437d565b8015610ffd5780601f10610fd257610100808354040283529160200191610ffd565b820191906000526020600020905b815481529060010190602001808311610fe057829003601f168201915b5050505050905090565b6000801b81565b6110206110196114e2565b8383611d0e565b5050565b61102c6114e2565b73ffffffffffffffffffffffffffffffffffffffff1661104a610ee1565b73ffffffffffffffffffffffffffffffffffffffff16146110a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109790613fdd565b60405180910390fd5b6110b3816110ae600c611bc9565b611bd7565b6110bd600c611bf5565b50565b6110d16110cb6114e2565b836115a3565b611110576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111079061405d565b60405180910390fd5b61111c84848484611e7b565b50505050565b606061112d82611476565b61116c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111639061401d565b60405180910390fd5b6000611176611ed7565b9050600081511161119657604051806020016040528060008152506111c1565b806111a084611f69565b6040516020016111b1929190613b88565b6040516020818303038152906040525b915050919050565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a681565b6111f6826108cf565b611207816112026114e2565b61195e565b6112118383611adb565b505050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6112b26114e2565b73ffffffffffffffffffffffffffffffffffffffff166112d0610ee1565b73ffffffffffffffffffffffffffffffffffffffff1614611326576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161131d90613fdd565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611396576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161138d90613e3d565b60405180910390fd5b61139f81611c48565b50565b6113d37f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a66113ce6114e2565b610f0b565b6113dc57600080fd5b6113ef816113ea600c611bc9565b611bd7565b6113f9600c611bf5565b50565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061146f575061146e826120ca565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166004600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816006600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661155d83610b31565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006115ae82611476565b6115ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115e490613efd565b60405180910390fd5b60006115f883610b31565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061166757508373ffffffffffffffffffffffffffffffffffffffff1661164f846106c8565b73ffffffffffffffffffffffffffffffffffffffff16145b8061167857506116778185611216565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166116a182610b31565b73ffffffffffffffffffffffffffffffffffffffff16146116f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116ee90613ffd565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611767576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161175e90613e7d565b60405180910390fd5b6117728383836121ac565b61177d6000826114ea565b6001600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546117cd9190614252565b925050819055506001600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546118249190614171565b92505081905550816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60006119307fa34fdc1cdefec5bee12b0e3e970398ed9e8adbf09d50d5b551f42c80537ffafa83604051602001611915929190613cba565b604051602081830303815290604052805190602001206122c0565b9050919050565b600080600061194685856122da565b915091506119538161235d565b819250505092915050565b6119688282610f0b565b6119f75761198d8173ffffffffffffffffffffffffffffffffffffffff166014612532565b61199b8360001c6020612532565b6040516020016119ac929190613be3565b6040516020818303038152906040526040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119ee9190613d7b565b60405180910390fd5b5050565b611a058282610f0b565b611ad757600160008084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550611a7c6114e2565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b611ae58282610f0b565b15611bb857600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550611b5d6114e2565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b6000600a80549050905090565b600081600001549050919050565b611bf182826040518060200160405280600081525061276e565b5050565b6001816000016000828254019250508190555050565b6000611c407f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6611c3b8585611937565b610f0b565b905092915050565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611d7d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d7490613e9d565b60405180910390fd5b80600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611e6e9190613c84565b60405180910390a3505050565b611e86848484611681565b611e92848484846127c9565b611ed1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ec890613e1d565b60405180910390fd5b50505050565b6060600d8054611ee69061437d565b80601f0160208091040260200160405190810160405280929190818152602001828054611f129061437d565b8015611f5f5780601f10611f3457610100808354040283529160200191611f5f565b820191906000526020600020905b815481529060010190602001808311611f4257829003601f168201915b5050505050905090565b60606000821415611fb1576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506120c5565b600082905060005b60008214611fe3578080611fcc906143e0565b915050600a82611fdc91906141c7565b9150611fb9565b60008167ffffffffffffffff811115611fff57611ffe61457e565b5b6040519080825280601f01601f1916602001820160405280156120315781602001600182028036833780820191505090505b5090505b600085146120be5760018261204a9190614252565b9150600a856120599190614433565b60306120659190614171565b60f81b81838151811061207b5761207a61454f565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856120b791906141c7565b9450612035565b8093505050505b919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061219557507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806121a557506121a482612960565b5b9050919050565b6121b78383836129da565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156121fa576121f5816129df565b612239565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612238576122378382612a28565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561227c5761227781612b95565b6122bb565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146122ba576122b98282612c66565b5b5b505050565b60006122d36122cd612ce5565b83612dff565b9050919050565b60008060418351141561231c5760008060006020860151925060408601519150606086015160001a905061231087828585612e32565b94509450505050612356565b60408351141561234d576000806020850151915060408501519050612342868383612f3f565b935093505050612356565b60006002915091505b9250929050565b60006004811115612371576123706144c2565b5b816004811115612384576123836144c2565b5b141561238f5761252f565b600160048111156123a3576123a26144c2565b5b8160048111156123b6576123b56144c2565b5b14156123f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123ee90613d9d565b60405180910390fd5b6002600481111561240b5761240a6144c2565b5b81600481111561241e5761241d6144c2565b5b141561245f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161245690613ddd565b60405180910390fd5b60036004811115612473576124726144c2565b5b816004811115612486576124856144c2565b5b14156124c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124be90613edd565b60405180910390fd5b6004808111156124da576124d96144c2565b5b8160048111156124ed576124ec6144c2565b5b141561252e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161252590613f7d565b60405180910390fd5b5b50565b60606000600283600261254591906141f8565b61254f9190614171565b67ffffffffffffffff8111156125685761256761457e565b5b6040519080825280601f01601f19166020018201604052801561259a5781602001600182028036833780820191505090505b5090507f3000000000000000000000000000000000000000000000000000000000000000816000815181106125d2576125d161454f565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f7800000000000000000000000000000000000000000000000000000000000000816001815181106126365761263561454f565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506000600184600261267691906141f8565b6126809190614171565b90505b6001811115612720577f3031323334353637383961626364656600000000000000000000000000000000600f8616601081106126c2576126c161454f565b5b1a60f81b8282815181106126d9576126d861454f565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c94508061271990614353565b9050612683565b5060008414612764576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161275b90613dbd565b60405180910390fd5b8091505092915050565b6127788383612f8d565b61278560008484846127c9565b6127c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127bb90613e1d565b60405180910390fd5b505050565b60006127ea8473ffffffffffffffffffffffffffffffffffffffff1661315b565b15612953578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026128136114e2565b8786866040518563ffffffff1660e01b81526004016128359493929190613c38565b602060405180830381600087803b15801561284f57600080fd5b505af192505050801561288057506040513d601f19601f8201168201806040525081019061287d9190613628565b60015b612903573d80600081146128b0576040519150601f19603f3d011682016040523d82523d6000602084013e6128b5565b606091505b506000815114156128fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128f290613e1d565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612958565b600190505b949350505050565b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806129d357506129d28261316e565b5b9050919050565b505050565b600a80549050600b600083815260200190815260200160002081905550600a81908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001612a3584610da1565b612a3f9190614252565b9050600060096000848152602001908152602001600020549050818114612b24576000600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816009600083815260200190815260200160002081905550505b6009600084815260200190815260200160002060009055600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600a80549050612ba99190614252565b90506000600b60008481526020019081526020016000205490506000600a8381548110612bd957612bd861454f565b5b9060005260206000200154905080600a8381548110612bfb57612bfa61454f565b5b906000526020600020018190555081600b600083815260200190815260200160002081905550600b600085815260200190815260200160002060009055600a805480612c4a57612c49614520565b5b6001900381819060005260206000200160009055905550505050565b6000612c7183610da1565b905081600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806009600084815260200190815260200160002081905550505050565b60007f000000000000000000000000c52290d1c3d1599f7c29125d0ee50a339688bc9d73ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff16148015612d6157507f000000000000000000000000000000000000000000000000000000000000000146145b15612d8e577faf81f7fe82eb724db20caa71e61cebc1746149e5b4ee44aee31a7b9fc2d72c939050612dfc565b612df97f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f7f97f964c7f46c43ae3d1aff83aee6fb6065ecac5293aa56c79001afbda658efc37f06c015bd22b4c69690933c1058878ebdfef31f9aaae40bbe86d8a09fe1b2972c6131d8565b90505b90565b60008282604051602001612e14929190613bac565b60405160208183030381529060405280519060200120905092915050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c1115612e6d576000600391509150612f36565b601b8560ff1614158015612e855750601c8560ff1614155b15612e97576000600491509150612f36565b600060018787878760405160008152602001604052604051612ebc9493929190613d36565b6020604051602081039080840390855afa158015612ede573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612f2d57600060019250925050612f36565b80600092509250505b94509492505050565b6000806000807f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff85169150601b8560ff1c019050612f7f87828885612e32565b935093505050935093915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612ffd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ff490613f9d565b60405180910390fd5b61300681611476565b15613046576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161303d90613e5d565b60405180910390fd5b613052600083836121ac565b6001600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546130a29190614171565b92505081905550816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600083838346306040516020016131f3959493929190613ce3565b6040516020818303038152906040528051906020012090509392505050565b6000613225613220846140fd565b6140d8565b905082815260208101848484011115613241576132406145bc565b5b61324c848285614311565b509392505050565b60008135905061326381614cde565b92915050565b60008135905061327881614cf5565b92915050565b60008135905061328d81614d0c565b92915050565b6000813590506132a281614d23565b92915050565b6000815190506132b781614d23565b92915050565b60008083601f8401126132d3576132d26145b2565b5b8235905067ffffffffffffffff8111156132f0576132ef6145ad565b5b60208301915083600182028301111561330c5761330b6145b7565b5b9250929050565b600082601f830112613328576133276145b2565b5b8135613338848260208601613212565b91505092915050565b60008135905061335081614d3a565b92915050565b60008151905061336581614d3a565b92915050565b600060208284031215613381576133806145c6565b5b600061338f84828501613254565b91505092915050565b600080604083850312156133af576133ae6145c6565b5b60006133bd85828601613254565b92505060206133ce85828601613254565b9150509250929050565b6000806000606084860312156133f1576133f06145c6565b5b60006133ff86828701613254565b935050602061341086828701613254565b925050604061342186828701613341565b9150509250925092565b60008060008060808587031215613445576134446145c6565b5b600061345387828801613254565b945050602061346487828801613254565b935050604061347587828801613341565b925050606085013567ffffffffffffffff811115613496576134956145c1565b5b6134a287828801613313565b91505092959194509250565b600080604083850312156134c5576134c46145c6565b5b60006134d385828601613254565b92505060206134e485828601613269565b9150509250929050565b600080600060408486031215613507576135066145c6565b5b600061351586828701613254565b935050602084013567ffffffffffffffff811115613536576135356145c1565b5b613542868287016132bd565b92509250509250925092565b60008060408385031215613565576135646145c6565b5b600061357385828601613254565b925050602061358485828601613341565b9150509250929050565b6000602082840312156135a4576135a36145c6565b5b60006135b28482850161327e565b91505092915050565b600080604083850312156135d2576135d16145c6565b5b60006135e08582860161327e565b92505060206135f185828601613254565b9150509250929050565b600060208284031215613611576136106145c6565b5b600061361f84828501613293565b91505092915050565b60006020828403121561363e5761363d6145c6565b5b600061364c848285016132a8565b91505092915050565b60006020828403121561366b5761366a6145c6565b5b600061367984828501613341565b91505092915050565b600060208284031215613698576136976145c6565b5b60006136a684828501613356565b91505092915050565b6136b881614286565b82525050565b6136c781614298565b82525050565b6136d6816142a4565b82525050565b6136ed6136e8826142a4565b614429565b82525050565b60006136fe8261412e565b6137088185614144565b9350613718818560208601614320565b613721816145cb565b840191505092915050565b600061373782614139565b6137418185614155565b9350613751818560208601614320565b61375a816145cb565b840191505092915050565b600061377082614139565b61377a8185614166565b935061378a818560208601614320565b80840191505092915050565b60006137a3601883614155565b91506137ae826145dc565b602082019050919050565b60006137c6602083614155565b91506137d182614605565b602082019050919050565b60006137e9601f83614155565b91506137f48261462e565b602082019050919050565b600061380c602b83614155565b915061381782614657565b604082019050919050565b600061382f603283614155565b915061383a826146a6565b604082019050919050565b6000613852602683614155565b915061385d826146f5565b604082019050919050565b6000613875601c83614155565b915061388082614744565b602082019050919050565b6000613898600283614166565b91506138a38261476d565b600282019050919050565b60006138bb602483614155565b91506138c682614796565b604082019050919050565b60006138de601983614155565b91506138e9826147e5565b602082019050919050565b6000613901601183614155565b915061390c8261480e565b602082019050919050565b6000613924602283614155565b915061392f82614837565b604082019050919050565b6000613947602c83614155565b915061395282614886565b604082019050919050565b600061396a603883614155565b9150613975826148d5565b604082019050919050565b600061398d602a83614155565b915061399882614924565b604082019050919050565b60006139b0602983614155565b91506139bb82614973565b604082019050919050565b60006139d3602283614155565b91506139de826149c2565b604082019050919050565b60006139f6602083614155565b9150613a0182614a11565b602082019050919050565b6000613a19602c83614155565b9150613a2482614a3a565b604082019050919050565b6000613a3c602083614155565b9150613a4782614a89565b602082019050919050565b6000613a5f602983614155565b9150613a6a82614ab2565b604082019050919050565b6000613a82602f83614155565b9150613a8d82614b01565b604082019050919050565b6000613aa5602183614155565b9150613ab082614b50565b604082019050919050565b6000613ac8603183614155565b9150613ad382614b9f565b604082019050919050565b6000613aeb602c83614155565b9150613af682614bee565b604082019050919050565b6000613b0e601783614166565b9150613b1982614c3d565b601782019050919050565b6000613b31601183614166565b9150613b3c82614c66565b601182019050919050565b6000613b54602f83614155565b9150613b5f82614c8f565b604082019050919050565b613b73816142fa565b82525050565b613b8281614304565b82525050565b6000613b948285613765565b9150613ba08284613765565b91508190509392505050565b6000613bb78261388b565b9150613bc382856136dc565b602082019150613bd382846136dc565b6020820191508190509392505050565b6000613bee82613b01565b9150613bfa8285613765565b9150613c0582613b24565b9150613c118284613765565b91508190509392505050565b6000602082019050613c3260008301846136af565b92915050565b6000608082019050613c4d60008301876136af565b613c5a60208301866136af565b613c676040830185613b6a565b8181036060830152613c7981846136f3565b905095945050505050565b6000602082019050613c9960008301846136be565b92915050565b6000602082019050613cb460008301846136cd565b92915050565b6000604082019050613ccf60008301856136cd565b613cdc60208301846136af565b9392505050565b600060a082019050613cf860008301886136cd565b613d0560208301876136cd565b613d1260408301866136cd565b613d1f6060830185613b6a565b613d2c60808301846136af565b9695505050505050565b6000608082019050613d4b60008301876136cd565b613d586020830186613b79565b613d6560408301856136cd565b613d7260608301846136cd565b95945050505050565b60006020820190508181036000830152613d95818461372c565b905092915050565b60006020820190508181036000830152613db681613796565b9050919050565b60006020820190508181036000830152613dd6816137b9565b9050919050565b60006020820190508181036000830152613df6816137dc565b9050919050565b60006020820190508181036000830152613e16816137ff565b9050919050565b60006020820190508181036000830152613e3681613822565b9050919050565b60006020820190508181036000830152613e5681613845565b9050919050565b60006020820190508181036000830152613e7681613868565b9050919050565b60006020820190508181036000830152613e96816138ae565b9050919050565b60006020820190508181036000830152613eb6816138d1565b9050919050565b60006020820190508181036000830152613ed6816138f4565b9050919050565b60006020820190508181036000830152613ef681613917565b9050919050565b60006020820190508181036000830152613f168161393a565b9050919050565b60006020820190508181036000830152613f368161395d565b9050919050565b60006020820190508181036000830152613f5681613980565b9050919050565b60006020820190508181036000830152613f76816139a3565b9050919050565b60006020820190508181036000830152613f96816139c6565b9050919050565b60006020820190508181036000830152613fb6816139e9565b9050919050565b60006020820190508181036000830152613fd681613a0c565b9050919050565b60006020820190508181036000830152613ff681613a2f565b9050919050565b6000602082019050818103600083015261401681613a52565b9050919050565b6000602082019050818103600083015261403681613a75565b9050919050565b6000602082019050818103600083015261405681613a98565b9050919050565b6000602082019050818103600083015261407681613abb565b9050919050565b6000602082019050818103600083015261409681613ade565b9050919050565b600060208201905081810360008301526140b681613b47565b9050919050565b60006020820190506140d26000830184613b6a565b92915050565b60006140e26140f3565b90506140ee82826143af565b919050565b6000604051905090565b600067ffffffffffffffff8211156141185761411761457e565b5b614121826145cb565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061417c826142fa565b9150614187836142fa565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156141bc576141bb614464565b5b828201905092915050565b60006141d2826142fa565b91506141dd836142fa565b9250826141ed576141ec614493565b5b828204905092915050565b6000614203826142fa565b915061420e836142fa565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561424757614246614464565b5b828202905092915050565b600061425d826142fa565b9150614268836142fa565b92508282101561427b5761427a614464565b5b828203905092915050565b6000614291826142da565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b8381101561433e578082015181840152602081019050614323565b8381111561434d576000848401525b50505050565b600061435e826142fa565b9150600082141561437257614371614464565b5b600182039050919050565b6000600282049050600182168061439557607f821691505b602082108114156143a9576143a86144f1565b5b50919050565b6143b8826145cb565b810181811067ffffffffffffffff821117156143d7576143d661457e565b5b80604052505050565b60006143eb826142fa565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561441e5761441d614464565b5b600182019050919050565b6000819050919050565b600061443e826142fa565b9150614449836142fa565b92508261445957614458614493565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f1901000000000000000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f496e76616c6964207369676e6174757265000000000000000000000000000000600082015250565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b614ce781614286565b8114614cf257600080fd5b50565b614cfe81614298565b8114614d0957600080fd5b50565b614d15816142a4565b8114614d2057600080fd5b50565b614d2c816142ae565b8114614d3757600080fd5b50565b614d43816142fa565b8114614d4e57600080fd5b5056fea26469706673582212200aa0a5f1ed056f87774453bfdf61156faf0bd51f1410c8a1deec712a7f1240c364736f6c63430008070033

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

00000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000a4c757865746f437562650000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000054c43554245000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : name (string): LuxetoCube
Arg [1] : symbol (string): LCUBE

-----Encoded View---------------
6 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [2] : 000000000000000000000000000000000000000000000000000000000000000a
Arg [3] : 4c757865746f4375626500000000000000000000000000000000000000000000
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000005
Arg [5] : 4c43554245000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

70893:2829:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;71885:186;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38892:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40451:221;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39974:411;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;71777:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41201:339;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;67104:123;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73548:171;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67489:147;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51706:256;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68537:218;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41611:185;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52228:233;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38586:239;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;72806:318;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;72079:306;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38316:208;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59259:103;;;:::i;:::-;;58608:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65989:139;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39061:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65080:49;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40744:155;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;72393:169;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41867:328;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39236:334;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71078:62;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67881:149;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40970:164;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59517:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;72580:214;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;71885:186;72003:4;72027:36;72051:11;72027:23;:36::i;:::-;72020:43;;71885:186;;;:::o;38892:100::-;38946:13;38979:5;38972:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38892:100;:::o;40451:221::-;40527:7;40555:16;40563:7;40555;:16::i;:::-;40547:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;40640:15;:24;40656:7;40640:24;;;;;;;;;;;;;;;;;;;;;40633:31;;40451:221;;;:::o;39974:411::-;40055:13;40071:23;40086:7;40071:14;:23::i;:::-;40055:39;;40119:5;40113:11;;:2;:11;;;;40105:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;40213:5;40197:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;40222:37;40239:5;40246:12;:10;:12::i;:::-;40222:16;:37::i;:::-;40197:62;40175:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;40356:21;40365:2;40369:7;40356:8;:21::i;:::-;40044:341;39974:411;;:::o;71777:100::-;71830:7;71857:12;;71850:19;;71777:100;:::o;41201:339::-;41396:41;41415:12;:10;:12::i;:::-;41429:7;41396:18;:41::i;:::-;41388:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;41504:28;41514:4;41520:2;41524:7;41504:9;:28::i;:::-;41201:339;;;:::o;67104:123::-;67170:7;67197:6;:12;67204:4;67197:12;;;;;;;;;;;:22;;;67190:29;;67104:123;;;:::o;73548:171::-;73638:7;73671:40;73685:14;73691:7;73685:5;:14::i;:::-;73701:9;;73671:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:13;:40::i;:::-;73664:47;;73548:171;;;;;:::o;67489:147::-;67572:18;67585:4;67572:12;:18::i;:::-;65571:30;65582:4;65588:12;:10;:12::i;:::-;65571:10;:30::i;:::-;67603:25:::1;67614:4;67620:7;67603:10;:25::i;:::-;67489:147:::0;;;:::o;51706:256::-;51803:7;51839:23;51856:5;51839:16;:23::i;:::-;51831:5;:31;51823:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;51928:12;:19;51941:5;51928:19;;;;;;;;;;;;;;;:26;51948:5;51928:26;;;;;;;;;;;;51921:33;;51706:256;;;;:::o;68537:218::-;68644:12;:10;:12::i;:::-;68633:23;;:7;:23;;;68625:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;68721:26;68733:4;68739:7;68721:11;:26::i;:::-;68537:218;;:::o;41611:185::-;41749:39;41766:4;41772:2;41776:7;41749:39;;;;;;;;;;;;:16;:39::i;:::-;41611:185;;;:::o;52228:233::-;52303:7;52339:30;:28;:30::i;:::-;52331:5;:38;52323:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;52436:10;52447:5;52436:17;;;;;;;;:::i;:::-;;;;;;;;;;52429:24;;52228:233;;;:::o;38586:239::-;38658:7;38678:13;38694:7;:16;38702:7;38694:16;;;;;;;;;;;;;;;;;;;;;38678:32;;38746:1;38729:19;;:5;:19;;;;38721:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;38812:5;38805:12;;;38586:239;;;:::o;72806:318::-;72908:1;72887:18;72897:7;72887:9;:18::i;:::-;:22;72879:31;;;;;;72921:13;72949:27;;;;;;;;;;;72921:56;;73019:1;72996;:11;;;73008:7;72996:20;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:24;72988:33;;;;;;73032:45;73042:7;73051:25;:15;:23;:25::i;:::-;73032:9;:45::i;:::-;73089:27;:15;:25;:27::i;:::-;72868:256;72806:318;:::o;72079:306::-;72206:1;72185:18;72195:7;72185:9;:18::i;:::-;:22;72177:31;;;;;;72227:34;72235:14;72241:7;72235:5;:14::i;:::-;72251:9;;72227:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:7;:34::i;:::-;72219:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;72294:45;72304:7;72313:25;:15;:23;:25::i;:::-;72294:9;:45::i;:::-;72350:27;:15;:25;:27::i;:::-;72079:306;;;:::o;38316:208::-;38388:7;38433:1;38416:19;;:5;:19;;;;38408:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;38500:9;:16;38510:5;38500:16;;;;;;;;;;;;;;;;38493:23;;38316:208;;;:::o;59259:103::-;58839:12;:10;:12::i;:::-;58828:23;;:7;:5;:7::i;:::-;:23;;;58820:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;59324:30:::1;59351:1;59324:18;:30::i;:::-;59259:103::o:0;58608:87::-;58654:7;58681:6;;;;;;;;;;;58674:13;;58608:87;:::o;65989:139::-;66067:4;66091:6;:12;66098:4;66091:12;;;;;;;;;;;:20;;:29;66112:7;66091:29;;;;;;;;;;;;;;;;;;;;;;;;;66084:36;;65989:139;;;;:::o;39061:104::-;39117:13;39150:7;39143:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39061:104;:::o;65080:49::-;65125:4;65080:49;;;:::o;40744:155::-;40839:52;40858:12;:10;:12::i;:::-;40872:8;40882;40839:18;:52::i;:::-;40744:155;;:::o;72393:169::-;58839:12;:10;:12::i;:::-;58828:23;;:7;:5;:7::i;:::-;:23;;;58820:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;72471:45:::1;72481:7;72490:25;:15;:23;:25::i;:::-;72471:9;:45::i;:::-;72527:27;:15;:25;:27::i;:::-;72393:169:::0;:::o;41867:328::-;42042:41;42061:12;:10;:12::i;:::-;42075:7;42042:18;:41::i;:::-;42034:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;42148:39;42162:4;42168:2;42172:7;42181:5;42148:13;:39::i;:::-;41867:328;;;;:::o;39236:334::-;39309:13;39343:16;39351:7;39343;:16::i;:::-;39335:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;39424:21;39448:10;:8;:10::i;:::-;39424:34;;39500:1;39482:7;39476:21;:25;:86;;;;;;;;;;;;;;;;;39528:7;39537:18;:7;:16;:18::i;:::-;39511:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;39476:86;39469:93;;;39236:334;;;:::o;71078:62::-;71116:24;71078:62;:::o;67881:149::-;67965:18;67978:4;67965:12;:18::i;:::-;65571:30;65582:4;65588:12;:10;:12::i;:::-;65571:10;:30::i;:::-;67996:26:::1;68008:4;68014:7;67996:11;:26::i;:::-;67881:149:::0;;;:::o;40970:164::-;41067:4;41091:18;:25;41110:5;41091:25;;;;;;;;;;;;;;;:35;41117:8;41091:35;;;;;;;;;;;;;;;;;;;;;;;;;41084:42;;40970:164;;;;:::o;59517:201::-;58839:12;:10;:12::i;:::-;58828:23;;:7;:5;:7::i;:::-;:23;;;58820:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;59626:1:::1;59606:22;;:8;:22;;;;59598:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;59682:28;59701:8;59682:18;:28::i;:::-;59517:201:::0;:::o;72580:214::-;72657:34;71116:24;72678:12;:10;:12::i;:::-;72657:7;:34::i;:::-;72649:43;;;;;;72703:45;72713:7;72722:25;:15;:23;:25::i;:::-;72703:9;:45::i;:::-;72759:27;:15;:25;:27::i;:::-;72580:214;:::o;51398:224::-;51500:4;51539:35;51524:50;;;:11;:50;;;;:90;;;;51578:36;51602:11;51578:23;:36::i;:::-;51524:90;51517:97;;51398:224;;;:::o;43705:127::-;43770:4;43822:1;43794:30;;:7;:16;43802:7;43794:16;;;;;;;;;;;;;;;;;;;;;:30;;;;43787:37;;43705:127;;;:::o;36341:98::-;36394:7;36421:10;36414:17;;36341:98;:::o;47687:174::-;47789:2;47762:15;:24;47778:7;47762:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;47845:7;47841:2;47807:46;;47816:23;47831:7;47816:14;:23::i;:::-;47807:46;;;;;;;;;;;;47687:174;;:::o;43999:348::-;44092:4;44117:16;44125:7;44117;:16::i;:::-;44109:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;44193:13;44209:23;44224:7;44209:14;:23::i;:::-;44193:39;;44262:5;44251:16;;:7;:16;;;:51;;;;44295:7;44271:31;;:20;44283:7;44271:11;:20::i;:::-;:31;;;44251:51;:87;;;;44306:32;44323:5;44330:7;44306:16;:32::i;:::-;44251:87;44243:96;;;43999:348;;;;:::o;46991:578::-;47150:4;47123:31;;:23;47138:7;47123:14;:23::i;:::-;:31;;;47115:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;47233:1;47219:16;;:2;:16;;;;47211:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;47289:39;47310:4;47316:2;47320:7;47289:20;:39::i;:::-;47393:29;47410:1;47414:7;47393:8;:29::i;:::-;47454:1;47435:9;:15;47445:4;47435:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;47483:1;47466:9;:13;47476:2;47466:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;47514:2;47495:7;:16;47503:7;47495:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;47553:7;47549:2;47534:27;;47543:4;47534:27;;;;;;;;;;;;46991:578;;;:::o;73132:220::-;73192:7;73224:120;73276:33;73324:7;73251:91;;;;;;;;;:::i;:::-;;;;;;;;;;;;;73241:102;;;;;;73224:16;:120::i;:::-;73217:127;;73132:220;;;:::o;25867:231::-;25945:7;25966:17;25985:18;26007:27;26018:4;26024:9;26007:10;:27::i;:::-;25965:69;;;;26045:18;26057:5;26045:11;:18::i;:::-;26081:9;26074:16;;;;25867:231;;;;:::o;66418:497::-;66499:22;66507:4;66513:7;66499;:22::i;:::-;66494:414;;66687:41;66715:7;66687:41;;66725:2;66687:19;:41::i;:::-;66801:38;66829:4;66821:13;;66836:2;66801:19;:38::i;:::-;66592:270;;;;;;;;;:::i;:::-;;;;;;;;;;;;;66538:358;;;;;;;;;;;:::i;:::-;;;;;;;;66494:414;66418:497;;:::o;70038:238::-;70122:22;70130:4;70136:7;70122;:22::i;:::-;70117:152;;70193:4;70161:6;:12;70168:4;70161:12;;;;;;;;;;;:20;;:29;70182:7;70161:29;;;;;;;;;;;;;;;;:36;;;;;;;;;;;;;;;;;;70244:12;:10;:12::i;:::-;70217:40;;70235:7;70217:40;;70229:4;70217:40;;;;;;;;;;70117:152;70038:238;;:::o;70408:239::-;70492:22;70500:4;70506:7;70492;:22::i;:::-;70488:152;;;70563:5;70531:6;:12;70538:4;70531:12;;;;;;;;;;;:20;;:29;70552:7;70531:29;;;;;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;70615:12;:10;:12::i;:::-;70588:40;;70606:7;70588:40;;70600:4;70588:40;;;;;;;;;;70488:152;70408:239;;:::o;52038:113::-;52099:7;52126:10;:17;;;;52119:24;;52038:113;:::o;872:114::-;937:7;964;:14;;;957:21;;872:114;;;:::o;44689:110::-;44765:26;44775:2;44779:7;44765:26;;;;;;;;;;;;:9;:26::i;:::-;44689:110;;:::o;994:127::-;1101:1;1083:7;:14;;;:19;;;;;;;;;;;994:127;:::o;73360:176::-;73445:4;73474:54;71116:24;73495:32;73509:6;73517:9;73495:13;:32::i;:::-;73474:7;:54::i;:::-;73467:61;;73360:176;;;;:::o;59878:191::-;59952:16;59971:6;;;;;;;;;;;59952:25;;59997:8;59988:6;;:17;;;;;;;;;;;;;;;;;;60052:8;60021:40;;60042:8;60021:40;;;;;;;;;;;;59941:128;59878:191;:::o;48003:315::-;48158:8;48149:17;;:5;:17;;;;48141:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;48245:8;48207:18;:25;48226:5;48207:25;;;;;;;;;;;;;;;:35;48233:8;48207:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;48291:8;48269:41;;48284:5;48269:41;;;48301:8;48269:41;;;;;;:::i;:::-;;;;;;;;48003:315;;;:::o;43077:::-;43234:28;43244:4;43250:2;43254:7;43234:9;:28::i;:::-;43281:48;43304:4;43310:2;43314:7;43323:5;43281:22;:48::i;:::-;43273:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;43077:315;;;;:::o;71645:120::-;71705:13;71738:19;71731:26;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;71645:120;:::o;19706:723::-;19762:13;19992:1;19983:5;:10;19979:53;;;20010:10;;;;;;;;;;;;;;;;;;;;;19979:53;20042:12;20057:5;20042:20;;20073:14;20098:78;20113:1;20105:4;:9;20098:78;;20131:8;;;;;:::i;:::-;;;;20162:2;20154:10;;;;;:::i;:::-;;;20098:78;;;20186:19;20218:6;20208:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20186:39;;20236:154;20252:1;20243:5;:10;20236:154;;20280:1;20270:11;;;;;:::i;:::-;;;20347:2;20339:5;:10;;;;:::i;:::-;20326:2;:24;;;;:::i;:::-;20313:39;;20296:6;20303;20296:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;20376:2;20367:11;;;;;:::i;:::-;;;20236:154;;;20414:6;20400:21;;;;;19706:723;;;;:::o;37947:305::-;38049:4;38101:25;38086:40;;;:11;:40;;;;:105;;;;38158:33;38143:48;;;:11;:48;;;;38086:105;:158;;;;38208:36;38232:11;38208:23;:36::i;:::-;38086:158;38066:178;;37947:305;;;:::o;53074:589::-;53218:45;53245:4;53251:2;53255:7;53218:26;:45::i;:::-;53296:1;53280:18;;:4;:18;;;53276:187;;;53315:40;53347:7;53315:31;:40::i;:::-;53276:187;;;53385:2;53377:10;;:4;:10;;;53373:90;;53404:47;53437:4;53443:7;53404:32;:47::i;:::-;53373:90;53276:187;53491:1;53477:16;;:2;:16;;;53473:183;;;53510:45;53547:7;53510:36;:45::i;:::-;53473:183;;;53583:4;53577:10;;:2;:10;;;53573:83;;53604:40;53632:2;53636:7;53604:27;:40::i;:::-;53573:83;53473:183;53074:589;;;:::o;35488:167::-;35565:7;35592:55;35614:20;:18;:20::i;:::-;35636:10;35592:21;:55::i;:::-;35585:62;;35488:167;;;:::o;23757:1308::-;23838:7;23847:12;24092:2;24072:9;:16;:22;24068:990;;;24111:9;24135;24159:7;24368:4;24357:9;24353:20;24347:27;24342:32;;24418:4;24407:9;24403:20;24397:27;24392:32;;24476:4;24465:9;24461:20;24455:27;24452:1;24447:36;24442:41;;24519:25;24530:4;24536:1;24539;24542;24519:10;:25::i;:::-;24512:32;;;;;;;;;24068:990;24586:2;24566:9;:16;:22;24562:496;;;24605:9;24629:10;24841:4;24830:9;24826:20;24820:27;24815:32;;24892:4;24881:9;24877:20;24871:27;24865:33;;24934:23;24945:4;24951:1;24954:2;24934:10;:23::i;:::-;24927:30;;;;;;;;24562:496;25006:1;25010:35;24990:56;;;;23757:1308;;;;;;:::o;22028:643::-;22106:20;22097:29;;;;;;;;:::i;:::-;;:5;:29;;;;;;;;:::i;:::-;;;22093:571;;;22143:7;;22093:571;22204:29;22195:38;;;;;;;;:::i;:::-;;:5;:38;;;;;;;;:::i;:::-;;;22191:473;;;22250:34;;;;;;;;;;:::i;:::-;;;;;;;;22191:473;22315:35;22306:44;;;;;;;;:::i;:::-;;:5;:44;;;;;;;;:::i;:::-;;;22302:362;;;22367:41;;;;;;;;;;:::i;:::-;;;;;;;;22302:362;22439:30;22430:39;;;;;;;;:::i;:::-;;:5;:39;;;;;;;;:::i;:::-;;;22426:238;;;22486:44;;;;;;;;;;:::i;:::-;;;;;;;;22426:238;22561:30;22552:39;;;;;;;;:::i;:::-;;:5;:39;;;;;;;;:::i;:::-;;;22548:116;;;22608:44;;;;;;;;;;:::i;:::-;;;;;;;;22548:116;22028:643;;:::o;21007:451::-;21082:13;21108:19;21153:1;21144:6;21140:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;21130:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21108:47;;21166:15;:6;21173:1;21166:9;;;;;;;;:::i;:::-;;;;;:15;;;;;;;;;;;21192;:6;21199:1;21192:9;;;;;;;;:::i;:::-;;;;;:15;;;;;;;;;;;21223:9;21248:1;21239:6;21235:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;21223:26;;21218:135;21255:1;21251;:5;21218:135;;;21290:12;21311:3;21303:5;:11;21290:25;;;;;;;:::i;:::-;;;;;21278:6;21285:1;21278:9;;;;;;;;:::i;:::-;;;;;:37;;;;;;;;;;;21340:1;21330:11;;;;;21258:3;;;;:::i;:::-;;;21218:135;;;;21380:1;21371:5;:10;21363:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;21443:6;21429:21;;;21007:451;;;;:::o;45026:321::-;45156:18;45162:2;45166:7;45156:5;:18::i;:::-;45207:54;45238:1;45242:2;45246:7;45255:5;45207:22;:54::i;:::-;45185:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;45026:321;;;:::o;48883:799::-;49038:4;49059:15;:2;:13;;;:15::i;:::-;49055:620;;;49111:2;49095:36;;;49132:12;:10;:12::i;:::-;49146:4;49152:7;49161:5;49095:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;49091:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49354:1;49337:6;:13;:18;49333:272;;;49380:60;;;;;;;;;;:::i;:::-;;;;;;;;49333:272;49555:6;49549:13;49540:6;49536:2;49532:15;49525:38;49091:529;49228:41;;;49218:51;;;:6;:51;;;;49211:58;;;;;49055:620;49659:4;49652:11;;48883:799;;;;;;;:::o;65693:204::-;65778:4;65817:32;65802:47;;;:11;:47;;;;:87;;;;65853:36;65877:11;65853:23;:36::i;:::-;65802:87;65795:94;;65693:204;;;:::o;50254:126::-;;;;:::o;54386:164::-;54490:10;:17;;;;54463:15;:24;54479:7;54463:24;;;;;;;;;;;:44;;;;54518:10;54534:7;54518:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54386:164;:::o;55177:988::-;55443:22;55493:1;55468:22;55485:4;55468:16;:22::i;:::-;:26;;;;:::i;:::-;55443:51;;55505:18;55526:17;:26;55544:7;55526:26;;;;;;;;;;;;55505:47;;55673:14;55659:10;:28;55655:328;;55704:19;55726:12;:18;55739:4;55726:18;;;;;;;;;;;;;;;:34;55745:14;55726:34;;;;;;;;;;;;55704:56;;55810:11;55777:12;:18;55790:4;55777:18;;;;;;;;;;;;;;;:30;55796:10;55777:30;;;;;;;;;;;:44;;;;55927:10;55894:17;:30;55912:11;55894:30;;;;;;;;;;;:43;;;;55689:294;55655:328;56079:17;:26;56097:7;56079:26;;;;;;;;;;;56072:33;;;56123:12;:18;56136:4;56123:18;;;;;;;;;;;;;;;:34;56142:14;56123:34;;;;;;;;;;;56116:41;;;55258:907;;55177:988;;:::o;56460:1079::-;56713:22;56758:1;56738:10;:17;;;;:21;;;;:::i;:::-;56713:46;;56770:18;56791:15;:24;56807:7;56791:24;;;;;;;;;;;;56770:45;;57142:19;57164:10;57175:14;57164:26;;;;;;;;:::i;:::-;;;;;;;;;;57142:48;;57228:11;57203:10;57214;57203:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;57339:10;57308:15;:28;57324:11;57308:28;;;;;;;;;;;:41;;;;57480:15;:24;57496:7;57480:24;;;;;;;;;;;57473:31;;;57515:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;56531:1008;;;56460:1079;:::o;53964:221::-;54049:14;54066:20;54083:2;54066:16;:20::i;:::-;54049:37;;54124:7;54097:12;:16;54110:2;54097:16;;;;;;;;;;;;;;;:24;54114:6;54097:24;;;;;;;;;;;:34;;;;54171:6;54142:17;:26;54160:7;54142:26;;;;;;;;;;;:35;;;;54038:147;53964:221;;:::o;34261:314::-;34314:7;34355:12;34338:29;;34346:4;34338:29;;;:66;;;;;34388:16;34371:13;:33;34338:66;34334:234;;;34428:24;34421:31;;;;34334:234;34492:64;34514:10;34526:12;34540:15;34492:21;:64::i;:::-;34485:71;;34261:314;;:::o;30828:196::-;30921:7;30987:15;31004:10;30958:57;;;;;;;;;:::i;:::-;;;;;;;;;;;;;30948:68;;;;;;30941:75;;30828:196;;;;:::o;27366:1632::-;27497:7;27506:12;28431:66;28426:1;28418:10;;:79;28414:163;;;28530:1;28534:30;28514:51;;;;;;28414:163;28596:2;28591:1;:7;;;;:18;;;;;28607:2;28602:1;:7;;;;28591:18;28587:102;;;28642:1;28646:30;28626:51;;;;;;28587:102;28786:14;28803:24;28813:4;28819:1;28822;28825;28803:24;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28786:41;;28860:1;28842:20;;:6;:20;;;28838:103;;;28895:1;28899:29;28879:50;;;;;;;28838:103;28961:6;28969:20;28953:37;;;;;27366:1632;;;;;;;;:::o;26361:391::-;26475:7;26484:12;26509:9;26529:7;26584:66;26580:2;26576:75;26571:80;;26688:2;26683;26678:3;26674:12;26670:21;26665:26;;26719:25;26730:4;26736:1;26739;26742;26719:10;:25::i;:::-;26712:32;;;;;;26361:391;;;;;;:::o;45683:382::-;45777:1;45763:16;;:2;:16;;;;45755:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;45836:16;45844:7;45836;:16::i;:::-;45835:17;45827:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;45898:45;45927:1;45931:2;45935:7;45898:20;:45::i;:::-;45973:1;45956:9;:13;45966:2;45956:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;46004:2;45985:7;:16;45993:7;45985:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;46049:7;46045:2;46024:33;;46041:1;46024:33;;;;;;;;;;;;45683:382;;:::o;2285:387::-;2345:4;2553:12;2620:7;2608:20;2600:28;;2663:1;2656:4;:8;2649:15;;;2285:387;;;:::o;19177:157::-;19262:4;19301:25;19286:40;;;:11;:40;;;;19279:47;;19177:157;;;:::o;34583:263::-;34727:7;34775:8;34785;34795:11;34808:13;34831:4;34764:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;34754:84;;;;;;34747:91;;34583:263;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:139::-;469:5;507:6;494:20;485:29;;523:33;550:5;523:33;:::i;:::-;423:139;;;;:::o;568:133::-;611:5;649:6;636:20;627:29;;665:30;689:5;665:30;:::i;:::-;568:133;;;;:::o;707:139::-;753:5;791:6;778:20;769:29;;807:33;834:5;807:33;:::i;:::-;707:139;;;;:::o;852:137::-;897:5;935:6;922:20;913:29;;951:32;977:5;951:32;:::i;:::-;852:137;;;;:::o;995:141::-;1051:5;1082:6;1076:13;1067:22;;1098:32;1124:5;1098:32;:::i;:::-;995:141;;;;:::o;1155:552::-;1212:8;1222:6;1272:3;1265:4;1257:6;1253:17;1249:27;1239:122;;1280:79;;:::i;:::-;1239:122;1393:6;1380:20;1370:30;;1423:18;1415:6;1412:30;1409:117;;;1445:79;;:::i;:::-;1409:117;1559:4;1551:6;1547:17;1535:29;;1613:3;1605:4;1597:6;1593:17;1583:8;1579:32;1576:41;1573:128;;;1620:79;;:::i;:::-;1573:128;1155:552;;;;;:::o;1726:338::-;1781:5;1830:3;1823:4;1815:6;1811:17;1807:27;1797:122;;1838:79;;:::i;:::-;1797:122;1955:6;1942:20;1980:78;2054:3;2046:6;2039:4;2031:6;2027:17;1980:78;:::i;:::-;1971:87;;1787:277;1726:338;;;;:::o;2070:139::-;2116:5;2154:6;2141:20;2132:29;;2170:33;2197:5;2170:33;:::i;:::-;2070:139;;;;:::o;2215:143::-;2272:5;2303:6;2297:13;2288:22;;2319:33;2346:5;2319:33;:::i;:::-;2215:143;;;;:::o;2364:329::-;2423:6;2472:2;2460:9;2451:7;2447:23;2443:32;2440:119;;;2478:79;;:::i;:::-;2440:119;2598:1;2623:53;2668:7;2659:6;2648:9;2644:22;2623:53;:::i;:::-;2613:63;;2569:117;2364:329;;;;:::o;2699:474::-;2767:6;2775;2824:2;2812:9;2803:7;2799:23;2795:32;2792:119;;;2830:79;;:::i;:::-;2792:119;2950:1;2975:53;3020:7;3011:6;3000:9;2996:22;2975:53;:::i;:::-;2965:63;;2921:117;3077:2;3103:53;3148:7;3139:6;3128:9;3124:22;3103:53;:::i;:::-;3093:63;;3048:118;2699:474;;;;;:::o;3179:619::-;3256:6;3264;3272;3321:2;3309:9;3300:7;3296:23;3292:32;3289:119;;;3327:79;;:::i;:::-;3289:119;3447:1;3472:53;3517:7;3508:6;3497:9;3493:22;3472:53;:::i;:::-;3462:63;;3418:117;3574:2;3600:53;3645:7;3636:6;3625:9;3621:22;3600:53;:::i;:::-;3590:63;;3545:118;3702:2;3728:53;3773:7;3764:6;3753:9;3749:22;3728:53;:::i;:::-;3718:63;;3673:118;3179:619;;;;;:::o;3804:943::-;3899:6;3907;3915;3923;3972:3;3960:9;3951:7;3947:23;3943:33;3940:120;;;3979:79;;:::i;:::-;3940:120;4099:1;4124:53;4169:7;4160:6;4149:9;4145:22;4124:53;:::i;:::-;4114:63;;4070:117;4226:2;4252:53;4297:7;4288:6;4277:9;4273:22;4252:53;:::i;:::-;4242:63;;4197:118;4354:2;4380:53;4425:7;4416:6;4405:9;4401:22;4380:53;:::i;:::-;4370:63;;4325:118;4510:2;4499:9;4495:18;4482:32;4541:18;4533:6;4530:30;4527:117;;;4563:79;;:::i;:::-;4527:117;4668:62;4722:7;4713:6;4702:9;4698:22;4668:62;:::i;:::-;4658:72;;4453:287;3804:943;;;;;;;:::o;4753:468::-;4818:6;4826;4875:2;4863:9;4854:7;4850:23;4846:32;4843:119;;;4881:79;;:::i;:::-;4843:119;5001:1;5026:53;5071:7;5062:6;5051:9;5047:22;5026:53;:::i;:::-;5016:63;;4972:117;5128:2;5154:50;5196:7;5187:6;5176:9;5172:22;5154:50;:::i;:::-;5144:60;;5099:115;4753:468;;;;;:::o;5227:672::-;5306:6;5314;5322;5371:2;5359:9;5350:7;5346:23;5342:32;5339:119;;;5377:79;;:::i;:::-;5339:119;5497:1;5522:53;5567:7;5558:6;5547:9;5543:22;5522:53;:::i;:::-;5512:63;;5468:117;5652:2;5641:9;5637:18;5624:32;5683:18;5675:6;5672:30;5669:117;;;5705:79;;:::i;:::-;5669:117;5818:64;5874:7;5865:6;5854:9;5850:22;5818:64;:::i;:::-;5800:82;;;;5595:297;5227:672;;;;;:::o;5905:474::-;5973:6;5981;6030:2;6018:9;6009:7;6005:23;6001:32;5998:119;;;6036:79;;:::i;:::-;5998:119;6156:1;6181:53;6226:7;6217:6;6206:9;6202:22;6181:53;:::i;:::-;6171:63;;6127:117;6283:2;6309:53;6354:7;6345:6;6334:9;6330:22;6309:53;:::i;:::-;6299:63;;6254:118;5905:474;;;;;:::o;6385:329::-;6444:6;6493:2;6481:9;6472:7;6468:23;6464:32;6461:119;;;6499:79;;:::i;:::-;6461:119;6619:1;6644:53;6689:7;6680:6;6669:9;6665:22;6644:53;:::i;:::-;6634:63;;6590:117;6385:329;;;;:::o;6720:474::-;6788:6;6796;6845:2;6833:9;6824:7;6820:23;6816:32;6813:119;;;6851:79;;:::i;:::-;6813:119;6971:1;6996:53;7041:7;7032:6;7021:9;7017:22;6996:53;:::i;:::-;6986:63;;6942:117;7098:2;7124:53;7169:7;7160:6;7149:9;7145:22;7124:53;:::i;:::-;7114:63;;7069:118;6720:474;;;;;:::o;7200:327::-;7258:6;7307:2;7295:9;7286:7;7282:23;7278:32;7275:119;;;7313:79;;:::i;:::-;7275:119;7433:1;7458:52;7502:7;7493:6;7482:9;7478:22;7458:52;:::i;:::-;7448:62;;7404:116;7200:327;;;;:::o;7533:349::-;7602:6;7651:2;7639:9;7630:7;7626:23;7622:32;7619:119;;;7657:79;;:::i;:::-;7619:119;7777:1;7802:63;7857:7;7848:6;7837:9;7833:22;7802:63;:::i;:::-;7792:73;;7748:127;7533:349;;;;:::o;7888:329::-;7947:6;7996:2;7984:9;7975:7;7971:23;7967:32;7964:119;;;8002:79;;:::i;:::-;7964:119;8122:1;8147:53;8192:7;8183:6;8172:9;8168:22;8147:53;:::i;:::-;8137:63;;8093:117;7888:329;;;;:::o;8223:351::-;8293:6;8342:2;8330:9;8321:7;8317:23;8313:32;8310:119;;;8348:79;;:::i;:::-;8310:119;8468:1;8493:64;8549:7;8540:6;8529:9;8525:22;8493:64;:::i;:::-;8483:74;;8439:128;8223:351;;;;:::o;8580:118::-;8667:24;8685:5;8667:24;:::i;:::-;8662:3;8655:37;8580:118;;:::o;8704:109::-;8785:21;8800:5;8785:21;:::i;:::-;8780:3;8773:34;8704:109;;:::o;8819:118::-;8906:24;8924:5;8906:24;:::i;:::-;8901:3;8894:37;8819:118;;:::o;8943:157::-;9048:45;9068:24;9086:5;9068:24;:::i;:::-;9048:45;:::i;:::-;9043:3;9036:58;8943:157;;:::o;9106:360::-;9192:3;9220:38;9252:5;9220:38;:::i;:::-;9274:70;9337:6;9332:3;9274:70;:::i;:::-;9267:77;;9353:52;9398:6;9393:3;9386:4;9379:5;9375:16;9353:52;:::i;:::-;9430:29;9452:6;9430:29;:::i;:::-;9425:3;9421:39;9414:46;;9196:270;9106:360;;;;:::o;9472:364::-;9560:3;9588:39;9621:5;9588:39;:::i;:::-;9643:71;9707:6;9702:3;9643:71;:::i;:::-;9636:78;;9723:52;9768:6;9763:3;9756:4;9749:5;9745:16;9723:52;:::i;:::-;9800:29;9822:6;9800:29;:::i;:::-;9795:3;9791:39;9784:46;;9564:272;9472:364;;;;:::o;9842:377::-;9948:3;9976:39;10009:5;9976:39;:::i;:::-;10031:89;10113:6;10108:3;10031:89;:::i;:::-;10024:96;;10129:52;10174:6;10169:3;10162:4;10155:5;10151:16;10129:52;:::i;:::-;10206:6;10201:3;10197:16;10190:23;;9952:267;9842:377;;;;:::o;10225:366::-;10367:3;10388:67;10452:2;10447:3;10388:67;:::i;:::-;10381:74;;10464:93;10553:3;10464:93;:::i;:::-;10582:2;10577:3;10573:12;10566:19;;10225:366;;;:::o;10597:::-;10739:3;10760:67;10824:2;10819:3;10760:67;:::i;:::-;10753:74;;10836:93;10925:3;10836:93;:::i;:::-;10954:2;10949:3;10945:12;10938:19;;10597:366;;;:::o;10969:::-;11111:3;11132:67;11196:2;11191:3;11132:67;:::i;:::-;11125:74;;11208:93;11297:3;11208:93;:::i;:::-;11326:2;11321:3;11317:12;11310:19;;10969:366;;;:::o;11341:::-;11483:3;11504:67;11568:2;11563:3;11504:67;:::i;:::-;11497:74;;11580:93;11669:3;11580:93;:::i;:::-;11698:2;11693:3;11689:12;11682:19;;11341:366;;;:::o;11713:::-;11855:3;11876:67;11940:2;11935:3;11876:67;:::i;:::-;11869:74;;11952:93;12041:3;11952:93;:::i;:::-;12070:2;12065:3;12061:12;12054:19;;11713:366;;;:::o;12085:::-;12227:3;12248:67;12312:2;12307:3;12248:67;:::i;:::-;12241:74;;12324:93;12413:3;12324:93;:::i;:::-;12442:2;12437:3;12433:12;12426:19;;12085:366;;;:::o;12457:::-;12599:3;12620:67;12684:2;12679:3;12620:67;:::i;:::-;12613:74;;12696:93;12785:3;12696:93;:::i;:::-;12814:2;12809:3;12805:12;12798:19;;12457:366;;;:::o;12829:400::-;12989:3;13010:84;13092:1;13087:3;13010:84;:::i;:::-;13003:91;;13103:93;13192:3;13103:93;:::i;:::-;13221:1;13216:3;13212:11;13205:18;;12829:400;;;:::o;13235:366::-;13377:3;13398:67;13462:2;13457:3;13398:67;:::i;:::-;13391:74;;13474:93;13563:3;13474:93;:::i;:::-;13592:2;13587:3;13583:12;13576:19;;13235:366;;;:::o;13607:::-;13749:3;13770:67;13834:2;13829:3;13770:67;:::i;:::-;13763:74;;13846:93;13935:3;13846:93;:::i;:::-;13964:2;13959:3;13955:12;13948:19;;13607:366;;;:::o;13979:::-;14121:3;14142:67;14206:2;14201:3;14142:67;:::i;:::-;14135:74;;14218:93;14307:3;14218:93;:::i;:::-;14336:2;14331:3;14327:12;14320:19;;13979:366;;;:::o;14351:::-;14493:3;14514:67;14578:2;14573:3;14514:67;:::i;:::-;14507:74;;14590:93;14679:3;14590:93;:::i;:::-;14708:2;14703:3;14699:12;14692:19;;14351:366;;;:::o;14723:::-;14865:3;14886:67;14950:2;14945:3;14886:67;:::i;:::-;14879:74;;14962:93;15051:3;14962:93;:::i;:::-;15080:2;15075:3;15071:12;15064:19;;14723:366;;;:::o;15095:::-;15237:3;15258:67;15322:2;15317:3;15258:67;:::i;:::-;15251:74;;15334:93;15423:3;15334:93;:::i;:::-;15452:2;15447:3;15443:12;15436:19;;15095:366;;;:::o;15467:::-;15609:3;15630:67;15694:2;15689:3;15630:67;:::i;:::-;15623:74;;15706:93;15795:3;15706:93;:::i;:::-;15824:2;15819:3;15815:12;15808:19;;15467:366;;;:::o;15839:::-;15981:3;16002:67;16066:2;16061:3;16002:67;:::i;:::-;15995:74;;16078:93;16167:3;16078:93;:::i;:::-;16196:2;16191:3;16187:12;16180:19;;15839:366;;;:::o;16211:::-;16353:3;16374:67;16438:2;16433:3;16374:67;:::i;:::-;16367:74;;16450:93;16539:3;16450:93;:::i;:::-;16568:2;16563:3;16559:12;16552:19;;16211:366;;;:::o;16583:::-;16725:3;16746:67;16810:2;16805:3;16746:67;:::i;:::-;16739:74;;16822:93;16911:3;16822:93;:::i;:::-;16940:2;16935:3;16931:12;16924:19;;16583:366;;;:::o;16955:::-;17097:3;17118:67;17182:2;17177:3;17118:67;:::i;:::-;17111:74;;17194:93;17283:3;17194:93;:::i;:::-;17312:2;17307:3;17303:12;17296:19;;16955:366;;;:::o;17327:::-;17469:3;17490:67;17554:2;17549:3;17490:67;:::i;:::-;17483:74;;17566:93;17655:3;17566:93;:::i;:::-;17684:2;17679:3;17675:12;17668:19;;17327:366;;;:::o;17699:::-;17841:3;17862:67;17926:2;17921:3;17862:67;:::i;:::-;17855:74;;17938:93;18027:3;17938:93;:::i;:::-;18056:2;18051:3;18047:12;18040:19;;17699:366;;;:::o;18071:::-;18213:3;18234:67;18298:2;18293:3;18234:67;:::i;:::-;18227:74;;18310:93;18399:3;18310:93;:::i;:::-;18428:2;18423:3;18419:12;18412:19;;18071:366;;;:::o;18443:::-;18585:3;18606:67;18670:2;18665:3;18606:67;:::i;:::-;18599:74;;18682:93;18771:3;18682:93;:::i;:::-;18800:2;18795:3;18791:12;18784:19;;18443:366;;;:::o;18815:::-;18957:3;18978:67;19042:2;19037:3;18978:67;:::i;:::-;18971:74;;19054:93;19143:3;19054:93;:::i;:::-;19172:2;19167:3;19163:12;19156:19;;18815:366;;;:::o;19187:::-;19329:3;19350:67;19414:2;19409:3;19350:67;:::i;:::-;19343:74;;19426:93;19515:3;19426:93;:::i;:::-;19544:2;19539:3;19535:12;19528:19;;19187:366;;;:::o;19559:402::-;19719:3;19740:85;19822:2;19817:3;19740:85;:::i;:::-;19733:92;;19834:93;19923:3;19834:93;:::i;:::-;19952:2;19947:3;19943:12;19936:19;;19559:402;;;:::o;19967:::-;20127:3;20148:85;20230:2;20225:3;20148:85;:::i;:::-;20141:92;;20242:93;20331:3;20242:93;:::i;:::-;20360:2;20355:3;20351:12;20344:19;;19967:402;;;:::o;20375:366::-;20517:3;20538:67;20602:2;20597:3;20538:67;:::i;:::-;20531:74;;20614:93;20703:3;20614:93;:::i;:::-;20732:2;20727:3;20723:12;20716:19;;20375:366;;;:::o;20747:118::-;20834:24;20852:5;20834:24;:::i;:::-;20829:3;20822:37;20747:118;;:::o;20871:112::-;20954:22;20970:5;20954:22;:::i;:::-;20949:3;20942:35;20871:112;;:::o;20989:435::-;21169:3;21191:95;21282:3;21273:6;21191:95;:::i;:::-;21184:102;;21303:95;21394:3;21385:6;21303:95;:::i;:::-;21296:102;;21415:3;21408:10;;20989:435;;;;;:::o;21430:663::-;21671:3;21693:148;21837:3;21693:148;:::i;:::-;21686:155;;21851:75;21922:3;21913:6;21851:75;:::i;:::-;21951:2;21946:3;21942:12;21935:19;;21964:75;22035:3;22026:6;21964:75;:::i;:::-;22064:2;22059:3;22055:12;22048:19;;22084:3;22077:10;;21430:663;;;;;:::o;22099:967::-;22481:3;22503:148;22647:3;22503:148;:::i;:::-;22496:155;;22668:95;22759:3;22750:6;22668:95;:::i;:::-;22661:102;;22780:148;22924:3;22780:148;:::i;:::-;22773:155;;22945:95;23036:3;23027:6;22945:95;:::i;:::-;22938:102;;23057:3;23050:10;;22099:967;;;;;:::o;23072:222::-;23165:4;23203:2;23192:9;23188:18;23180:26;;23216:71;23284:1;23273:9;23269:17;23260:6;23216:71;:::i;:::-;23072:222;;;;:::o;23300:640::-;23495:4;23533:3;23522:9;23518:19;23510:27;;23547:71;23615:1;23604:9;23600:17;23591:6;23547:71;:::i;:::-;23628:72;23696:2;23685:9;23681:18;23672:6;23628:72;:::i;:::-;23710;23778:2;23767:9;23763:18;23754:6;23710:72;:::i;:::-;23829:9;23823:4;23819:20;23814:2;23803:9;23799:18;23792:48;23857:76;23928:4;23919:6;23857:76;:::i;:::-;23849:84;;23300:640;;;;;;;:::o;23946:210::-;24033:4;24071:2;24060:9;24056:18;24048:26;;24084:65;24146:1;24135:9;24131:17;24122:6;24084:65;:::i;:::-;23946:210;;;;:::o;24162:222::-;24255:4;24293:2;24282:9;24278:18;24270:26;;24306:71;24374:1;24363:9;24359:17;24350:6;24306:71;:::i;:::-;24162:222;;;;:::o;24390:332::-;24511:4;24549:2;24538:9;24534:18;24526:26;;24562:71;24630:1;24619:9;24615:17;24606:6;24562:71;:::i;:::-;24643:72;24711:2;24700:9;24696:18;24687:6;24643:72;:::i;:::-;24390:332;;;;;:::o;24728:664::-;24933:4;24971:3;24960:9;24956:19;24948:27;;24985:71;25053:1;25042:9;25038:17;25029:6;24985:71;:::i;:::-;25066:72;25134:2;25123:9;25119:18;25110:6;25066:72;:::i;:::-;25148;25216:2;25205:9;25201:18;25192:6;25148:72;:::i;:::-;25230;25298:2;25287:9;25283:18;25274:6;25230:72;:::i;:::-;25312:73;25380:3;25369:9;25365:19;25356:6;25312:73;:::i;:::-;24728:664;;;;;;;;:::o;25398:545::-;25571:4;25609:3;25598:9;25594:19;25586:27;;25623:71;25691:1;25680:9;25676:17;25667:6;25623:71;:::i;:::-;25704:68;25768:2;25757:9;25753:18;25744:6;25704:68;:::i;:::-;25782:72;25850:2;25839:9;25835:18;25826:6;25782:72;:::i;:::-;25864;25932:2;25921:9;25917:18;25908:6;25864:72;:::i;:::-;25398:545;;;;;;;:::o;25949:313::-;26062:4;26100:2;26089:9;26085:18;26077:26;;26149:9;26143:4;26139:20;26135:1;26124:9;26120:17;26113:47;26177:78;26250:4;26241:6;26177:78;:::i;:::-;26169:86;;25949:313;;;;:::o;26268:419::-;26434:4;26472:2;26461:9;26457:18;26449:26;;26521:9;26515:4;26511:20;26507:1;26496:9;26492:17;26485:47;26549:131;26675:4;26549:131;:::i;:::-;26541:139;;26268:419;;;:::o;26693:::-;26859:4;26897:2;26886:9;26882:18;26874:26;;26946:9;26940:4;26936:20;26932:1;26921:9;26917:17;26910:47;26974:131;27100:4;26974:131;:::i;:::-;26966:139;;26693:419;;;:::o;27118:::-;27284:4;27322:2;27311:9;27307:18;27299:26;;27371:9;27365:4;27361:20;27357:1;27346:9;27342:17;27335:47;27399:131;27525:4;27399:131;:::i;:::-;27391:139;;27118:419;;;:::o;27543:::-;27709:4;27747:2;27736:9;27732:18;27724:26;;27796:9;27790:4;27786:20;27782:1;27771:9;27767:17;27760:47;27824:131;27950:4;27824:131;:::i;:::-;27816:139;;27543:419;;;:::o;27968:::-;28134:4;28172:2;28161:9;28157:18;28149:26;;28221:9;28215:4;28211:20;28207:1;28196:9;28192:17;28185:47;28249:131;28375:4;28249:131;:::i;:::-;28241:139;;27968:419;;;:::o;28393:::-;28559:4;28597:2;28586:9;28582:18;28574:26;;28646:9;28640:4;28636:20;28632:1;28621:9;28617:17;28610:47;28674:131;28800:4;28674:131;:::i;:::-;28666:139;;28393:419;;;:::o;28818:::-;28984:4;29022:2;29011:9;29007:18;28999:26;;29071:9;29065:4;29061:20;29057:1;29046:9;29042:17;29035:47;29099:131;29225:4;29099:131;:::i;:::-;29091:139;;28818:419;;;:::o;29243:::-;29409:4;29447:2;29436:9;29432:18;29424:26;;29496:9;29490:4;29486:20;29482:1;29471:9;29467:17;29460:47;29524:131;29650:4;29524:131;:::i;:::-;29516:139;;29243:419;;;:::o;29668:::-;29834:4;29872:2;29861:9;29857:18;29849:26;;29921:9;29915:4;29911:20;29907:1;29896:9;29892:17;29885:47;29949:131;30075:4;29949:131;:::i;:::-;29941:139;;29668:419;;;:::o;30093:::-;30259:4;30297:2;30286:9;30282:18;30274:26;;30346:9;30340:4;30336:20;30332:1;30321:9;30317:17;30310:47;30374:131;30500:4;30374:131;:::i;:::-;30366:139;;30093:419;;;:::o;30518:::-;30684:4;30722:2;30711:9;30707:18;30699:26;;30771:9;30765:4;30761:20;30757:1;30746:9;30742:17;30735:47;30799:131;30925:4;30799:131;:::i;:::-;30791:139;;30518:419;;;:::o;30943:::-;31109:4;31147:2;31136:9;31132:18;31124:26;;31196:9;31190:4;31186:20;31182:1;31171:9;31167:17;31160:47;31224:131;31350:4;31224:131;:::i;:::-;31216:139;;30943:419;;;:::o;31368:::-;31534:4;31572:2;31561:9;31557:18;31549:26;;31621:9;31615:4;31611:20;31607:1;31596:9;31592:17;31585:47;31649:131;31775:4;31649:131;:::i;:::-;31641:139;;31368:419;;;:::o;31793:::-;31959:4;31997:2;31986:9;31982:18;31974:26;;32046:9;32040:4;32036:20;32032:1;32021:9;32017:17;32010:47;32074:131;32200:4;32074:131;:::i;:::-;32066:139;;31793:419;;;:::o;32218:::-;32384:4;32422:2;32411:9;32407:18;32399:26;;32471:9;32465:4;32461:20;32457:1;32446:9;32442:17;32435:47;32499:131;32625:4;32499:131;:::i;:::-;32491:139;;32218:419;;;:::o;32643:::-;32809:4;32847:2;32836:9;32832:18;32824:26;;32896:9;32890:4;32886:20;32882:1;32871:9;32867:17;32860:47;32924:131;33050:4;32924:131;:::i;:::-;32916:139;;32643:419;;;:::o;33068:::-;33234:4;33272:2;33261:9;33257:18;33249:26;;33321:9;33315:4;33311:20;33307:1;33296:9;33292:17;33285:47;33349:131;33475:4;33349:131;:::i;:::-;33341:139;;33068:419;;;:::o;33493:::-;33659:4;33697:2;33686:9;33682:18;33674:26;;33746:9;33740:4;33736:20;33732:1;33721:9;33717:17;33710:47;33774:131;33900:4;33774:131;:::i;:::-;33766:139;;33493:419;;;:::o;33918:::-;34084:4;34122:2;34111:9;34107:18;34099:26;;34171:9;34165:4;34161:20;34157:1;34146:9;34142:17;34135:47;34199:131;34325:4;34199:131;:::i;:::-;34191:139;;33918:419;;;:::o;34343:::-;34509:4;34547:2;34536:9;34532:18;34524:26;;34596:9;34590:4;34586:20;34582:1;34571:9;34567:17;34560:47;34624:131;34750:4;34624:131;:::i;:::-;34616:139;;34343:419;;;:::o;34768:::-;34934:4;34972:2;34961:9;34957:18;34949:26;;35021:9;35015:4;35011:20;35007:1;34996:9;34992:17;34985:47;35049:131;35175:4;35049:131;:::i;:::-;35041:139;;34768:419;;;:::o;35193:::-;35359:4;35397:2;35386:9;35382:18;35374:26;;35446:9;35440:4;35436:20;35432:1;35421:9;35417:17;35410:47;35474:131;35600:4;35474:131;:::i;:::-;35466:139;;35193:419;;;:::o;35618:::-;35784:4;35822:2;35811:9;35807:18;35799:26;;35871:9;35865:4;35861:20;35857:1;35846:9;35842:17;35835:47;35899:131;36025:4;35899:131;:::i;:::-;35891:139;;35618:419;;;:::o;36043:::-;36209:4;36247:2;36236:9;36232:18;36224:26;;36296:9;36290:4;36286:20;36282:1;36271:9;36267:17;36260:47;36324:131;36450:4;36324:131;:::i;:::-;36316:139;;36043:419;;;:::o;36468:::-;36634:4;36672:2;36661:9;36657:18;36649:26;;36721:9;36715:4;36711:20;36707:1;36696:9;36692:17;36685:47;36749:131;36875:4;36749:131;:::i;:::-;36741:139;;36468:419;;;:::o;36893:222::-;36986:4;37024:2;37013:9;37009:18;37001:26;;37037:71;37105:1;37094:9;37090:17;37081:6;37037:71;:::i;:::-;36893:222;;;;:::o;37121:129::-;37155:6;37182:20;;:::i;:::-;37172:30;;37211:33;37239:4;37231:6;37211:33;:::i;:::-;37121:129;;;:::o;37256:75::-;37289:6;37322:2;37316:9;37306:19;;37256:75;:::o;37337:307::-;37398:4;37488:18;37480:6;37477:30;37474:56;;;37510:18;;:::i;:::-;37474:56;37548:29;37570:6;37548:29;:::i;:::-;37540:37;;37632:4;37626;37622:15;37614:23;;37337:307;;;:::o;37650:98::-;37701:6;37735:5;37729:12;37719:22;;37650:98;;;:::o;37754:99::-;37806:6;37840:5;37834:12;37824:22;;37754:99;;;:::o;37859:168::-;37942:11;37976:6;37971:3;37964:19;38016:4;38011:3;38007:14;37992:29;;37859:168;;;;:::o;38033:169::-;38117:11;38151:6;38146:3;38139:19;38191:4;38186:3;38182:14;38167:29;;38033:169;;;;:::o;38208:148::-;38310:11;38347:3;38332:18;;38208:148;;;;:::o;38362:305::-;38402:3;38421:20;38439:1;38421:20;:::i;:::-;38416:25;;38455:20;38473:1;38455:20;:::i;:::-;38450:25;;38609:1;38541:66;38537:74;38534:1;38531:81;38528:107;;;38615:18;;:::i;:::-;38528:107;38659:1;38656;38652:9;38645:16;;38362:305;;;;:::o;38673:185::-;38713:1;38730:20;38748:1;38730:20;:::i;:::-;38725:25;;38764:20;38782:1;38764:20;:::i;:::-;38759:25;;38803:1;38793:35;;38808:18;;:::i;:::-;38793:35;38850:1;38847;38843:9;38838:14;;38673:185;;;;:::o;38864:348::-;38904:7;38927:20;38945:1;38927:20;:::i;:::-;38922:25;;38961:20;38979:1;38961:20;:::i;:::-;38956:25;;39149:1;39081:66;39077:74;39074:1;39071:81;39066:1;39059:9;39052:17;39048:105;39045:131;;;39156:18;;:::i;:::-;39045:131;39204:1;39201;39197:9;39186:20;;38864:348;;;;:::o;39218:191::-;39258:4;39278:20;39296:1;39278:20;:::i;:::-;39273:25;;39312:20;39330:1;39312:20;:::i;:::-;39307:25;;39351:1;39348;39345:8;39342:34;;;39356:18;;:::i;:::-;39342:34;39401:1;39398;39394:9;39386:17;;39218:191;;;;:::o;39415:96::-;39452:7;39481:24;39499:5;39481:24;:::i;:::-;39470:35;;39415:96;;;:::o;39517:90::-;39551:7;39594:5;39587:13;39580:21;39569:32;;39517:90;;;:::o;39613:77::-;39650:7;39679:5;39668:16;;39613:77;;;:::o;39696:149::-;39732:7;39772:66;39765:5;39761:78;39750:89;;39696:149;;;:::o;39851:126::-;39888:7;39928:42;39921:5;39917:54;39906:65;;39851:126;;;:::o;39983:77::-;40020:7;40049:5;40038:16;;39983:77;;;:::o;40066:86::-;40101:7;40141:4;40134:5;40130:16;40119:27;;40066:86;;;:::o;40158:154::-;40242:6;40237:3;40232;40219:30;40304:1;40295:6;40290:3;40286:16;40279:27;40158:154;;;:::o;40318:307::-;40386:1;40396:113;40410:6;40407:1;40404:13;40396:113;;;40495:1;40490:3;40486:11;40480:18;40476:1;40471:3;40467:11;40460:39;40432:2;40429:1;40425:10;40420:15;;40396:113;;;40527:6;40524:1;40521:13;40518:101;;;40607:1;40598:6;40593:3;40589:16;40582:27;40518:101;40367:258;40318:307;;;:::o;40631:171::-;40670:3;40693:24;40711:5;40693:24;:::i;:::-;40684:33;;40739:4;40732:5;40729:15;40726:41;;;40747:18;;:::i;:::-;40726:41;40794:1;40787:5;40783:13;40776:20;;40631:171;;;:::o;40808:320::-;40852:6;40889:1;40883:4;40879:12;40869:22;;40936:1;40930:4;40926:12;40957:18;40947:81;;41013:4;41005:6;41001:17;40991:27;;40947:81;41075:2;41067:6;41064:14;41044:18;41041:38;41038:84;;;41094:18;;:::i;:::-;41038:84;40859:269;40808:320;;;:::o;41134:281::-;41217:27;41239:4;41217:27;:::i;:::-;41209:6;41205:40;41347:6;41335:10;41332:22;41311:18;41299:10;41296:34;41293:62;41290:88;;;41358:18;;:::i;:::-;41290:88;41398:10;41394:2;41387:22;41177:238;41134:281;;:::o;41421:233::-;41460:3;41483:24;41501:5;41483:24;:::i;:::-;41474:33;;41529:66;41522:5;41519:77;41516:103;;;41599:18;;:::i;:::-;41516:103;41646:1;41639:5;41635:13;41628:20;;41421:233;;;:::o;41660:79::-;41699:7;41728:5;41717:16;;41660:79;;;:::o;41745:176::-;41777:1;41794:20;41812:1;41794:20;:::i;:::-;41789:25;;41828:20;41846:1;41828:20;:::i;:::-;41823:25;;41867:1;41857:35;;41872:18;;:::i;:::-;41857:35;41913:1;41910;41906:9;41901:14;;41745:176;;;;:::o;41927:180::-;41975:77;41972:1;41965:88;42072:4;42069:1;42062:15;42096:4;42093:1;42086:15;42113:180;42161:77;42158:1;42151:88;42258:4;42255:1;42248:15;42282:4;42279:1;42272:15;42299:180;42347:77;42344:1;42337:88;42444:4;42441:1;42434:15;42468:4;42465:1;42458:15;42485:180;42533:77;42530:1;42523:88;42630:4;42627:1;42620:15;42654:4;42651:1;42644:15;42671:180;42719:77;42716:1;42709:88;42816:4;42813:1;42806:15;42840:4;42837:1;42830:15;42857:180;42905:77;42902:1;42895:88;43002:4;42999:1;42992:15;43026:4;43023:1;43016:15;43043:180;43091:77;43088:1;43081:88;43188:4;43185:1;43178:15;43212:4;43209:1;43202:15;43229:117;43338:1;43335;43328:12;43352:117;43461:1;43458;43451:12;43475:117;43584:1;43581;43574:12;43598:117;43707:1;43704;43697:12;43721:117;43830:1;43827;43820:12;43844:117;43953:1;43950;43943:12;43967:102;44008:6;44059:2;44055:7;44050:2;44043:5;44039:14;44035:28;44025:38;;43967:102;;;:::o;44075:174::-;44215:26;44211:1;44203:6;44199:14;44192:50;44075:174;:::o;44255:182::-;44395:34;44391:1;44383:6;44379:14;44372:58;44255:182;:::o;44443:181::-;44583:33;44579:1;44571:6;44567:14;44560:57;44443:181;:::o;44630:230::-;44770:34;44766:1;44758:6;44754:14;44747:58;44839:13;44834:2;44826:6;44822:15;44815:38;44630:230;:::o;44866:237::-;45006:34;45002:1;44994:6;44990:14;44983:58;45075:20;45070:2;45062:6;45058:15;45051:45;44866:237;:::o;45109:225::-;45249:34;45245:1;45237:6;45233:14;45226:58;45318:8;45313:2;45305:6;45301:15;45294:33;45109:225;:::o;45340:178::-;45480:30;45476:1;45468:6;45464:14;45457:54;45340:178;:::o;45524:214::-;45664:66;45660:1;45652:6;45648:14;45641:90;45524:214;:::o;45744:223::-;45884:34;45880:1;45872:6;45868:14;45861:58;45953:6;45948:2;45940:6;45936:15;45929:31;45744:223;:::o;45973:175::-;46113:27;46109:1;46101:6;46097:14;46090:51;45973:175;:::o;46154:167::-;46294:19;46290:1;46282:6;46278:14;46271:43;46154:167;:::o;46327:221::-;46467:34;46463:1;46455:6;46451:14;46444:58;46536:4;46531:2;46523:6;46519:15;46512:29;46327:221;:::o;46554:231::-;46694:34;46690:1;46682:6;46678:14;46671:58;46763:14;46758:2;46750:6;46746:15;46739:39;46554:231;:::o;46791:243::-;46931:34;46927:1;46919:6;46915:14;46908:58;47000:26;46995:2;46987:6;46983:15;46976:51;46791:243;:::o;47040:229::-;47180:34;47176:1;47168:6;47164:14;47157:58;47249:12;47244:2;47236:6;47232:15;47225:37;47040:229;:::o;47275:228::-;47415:34;47411:1;47403:6;47399:14;47392:58;47484:11;47479:2;47471:6;47467:15;47460:36;47275:228;:::o;47509:221::-;47649:34;47645:1;47637:6;47633:14;47626:58;47718:4;47713:2;47705:6;47701:15;47694:29;47509:221;:::o;47736:182::-;47876:34;47872:1;47864:6;47860:14;47853:58;47736:182;:::o;47924:231::-;48064:34;48060:1;48052:6;48048:14;48041:58;48133:14;48128:2;48120:6;48116:15;48109:39;47924:231;:::o;48161:182::-;48301:34;48297:1;48289:6;48285:14;48278:58;48161:182;:::o;48349:228::-;48489:34;48485:1;48477:6;48473:14;48466:58;48558:11;48553:2;48545:6;48541:15;48534:36;48349:228;:::o;48583:234::-;48723:34;48719:1;48711:6;48707:14;48700:58;48792:17;48787:2;48779:6;48775:15;48768:42;48583:234;:::o;48823:220::-;48963:34;48959:1;48951:6;48947:14;48940:58;49032:3;49027:2;49019:6;49015:15;49008:28;48823:220;:::o;49049:236::-;49189:34;49185:1;49177:6;49173:14;49166:58;49258:19;49253:2;49245:6;49241:15;49234:44;49049:236;:::o;49291:231::-;49431:34;49427:1;49419:6;49415:14;49408:58;49500:14;49495:2;49487:6;49483:15;49476:39;49291:231;:::o;49528:173::-;49668:25;49664:1;49656:6;49652:14;49645:49;49528:173;:::o;49707:167::-;49847:19;49843:1;49835:6;49831:14;49824:43;49707:167;:::o;49880:234::-;50020:34;50016:1;50008:6;50004:14;49997:58;50089:17;50084:2;50076:6;50072:15;50065:42;49880:234;:::o;50120:122::-;50193:24;50211:5;50193:24;:::i;:::-;50186:5;50183:35;50173:63;;50232:1;50229;50222:12;50173:63;50120:122;:::o;50248:116::-;50318:21;50333:5;50318:21;:::i;:::-;50311:5;50308:32;50298:60;;50354:1;50351;50344:12;50298:60;50248:116;:::o;50370:122::-;50443:24;50461:5;50443:24;:::i;:::-;50436:5;50433:35;50423:63;;50482:1;50479;50472:12;50423:63;50370:122;:::o;50498:120::-;50570:23;50587:5;50570:23;:::i;:::-;50563:5;50560:34;50550:62;;50608:1;50605;50598:12;50550:62;50498:120;:::o;50624:122::-;50697:24;50715:5;50697:24;:::i;:::-;50690:5;50687:35;50677:63;;50736:1;50733;50726:12;50677:63;50624:122;:::o

Swarm Source

ipfs://0aa0a5f1ed056f87774453bfdf61156faf0bd51f1410c8a1deec712a7f1240c3
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.