ETH Price: $2,612.28 (+0.81%)

Token

SuperlativePunks (SPUNK)
 

Overview

Max Total Supply

160 SPUNK

Holders

74

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
khaleelu.eth
Balance
1 SPUNK
0xbadb049ea96bdfaf51423bb7b9151bbe3f4db90d
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
SuperlativePunks

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, GNU GPLv3 license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-11-05
*/

// File: @openzeppelin/contracts/utils/math/SafeMath.sol



pragma solidity ^0.8.0;

// CAUTION
// This version of SafeMath should only be used with Solidity 0.8 or later,
// because it relies on the compiler's built in overflow checks.

/**
 * @dev Wrappers over Solidity's arithmetic operations.
 *
 * NOTE: `SafeMath` is no longer needed starting with Solidity 0.8. The compiler
 * now has built in overflow checking.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the substraction of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b > a) return (false, 0);
            return (true, a - b);
        }
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
            // benefit is lost if 'b' is also tested.
            // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
            if (a == 0) return (true, 0);
            uint256 c = a * b;
            if (c / a != b) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the division of two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a / b);
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a % b);
        }
    }

    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        return a + b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return a - b;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        return a * b;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator.
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return a % b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {trySub}.
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b <= a, errorMessage);
            return a - b;
        }
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a / b;
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a % b;
        }
    }
}

// File: @openzeppelin/contracts/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/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/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() {
        _setOwner(_msgSender());
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _setOwner(address(0));
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _setOwner(newOwner);
    }

    function _setOwner(address newOwner) private {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

// File: @openzeppelin/contracts/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



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



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/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/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



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



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/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 {
        require(operator != _msgSender(), "ERC721: approve to caller");

        _operatorApprovals[_msgSender()][operator] = approved;
        emit ApprovalForAll(_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 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



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: contracts/SuperlativePunks.sol



/**
 * Superlative Punks
 */

pragma solidity ^0.8.0;






contract SuperlativePunks is ERC721Enumerable, Ownable {
    using Strings for uint256;
    using Address for address;

    // setting constants
    uint256 public constant maxSupply = 10000;
    uint256 public constant maxMintAmount = 10;
    uint256 public constant price = 50000000000000000; // 0.05 ETH

    // wallets
    address private cw = 0x5af50cE5Fa81C4Bfab3Afa0A3F3990D4ffE00137;
    address private tw = 0x2C3a307286997997b837E0EdAB1e8a147f2E9617;

    // tracking sale state
    bool public isSaleActive = false;

    // base URI for metadata
    string private baseURI;

    constructor(
        string memory _initBaseURI
    ) ERC721("SuperlativePunks", "SPUNK") {
        setBaseURI(_initBaseURI);
    }

    // @dev change base URI
    function setBaseURI(string memory _newBaseURI) public onlyOwner {
        baseURI = _newBaseURI;
    }

    // @dev base URI for computing token URI
    function _baseURI() internal view override returns (string memory) {
        return baseURI;
    }

    // @dev allow enabling/disabling sale state
    function flipSaleState() public onlyOwner {
        isSaleActive = !isSaleActive;
    }

    function mint(uint _mintAmount) public payable {
        uint256 supply = totalSupply();
        require(isSaleActive, "Sale is not active at the moment");
        require(supply + _mintAmount <= maxSupply, "All tokens available have been minted");
        require(_mintAmount > 0, "You must mint more than 0 tokens");
        require(_mintAmount <= maxMintAmount, "Exceeds the maximum mint amount");

        if (msg.sender != owner()) {
            require(msg.value >= price * _mintAmount, "The specified ETH value is incorrect");
        }

        for (uint256 i = 0; i < _mintAmount; i++) {
            _safeMint(msg.sender, supply + i);
        }
    }

    function withdraw() public payable onlyOwner {
        uint256 _community = (address(this).balance * 80) / 100;

        // calculated from remaining balance
        uint256 _team = address(this).balance - _community;

        payable(cw).transfer(_community);
        payable(tw).transfer(_team);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_initBaseURI","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":"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":[{"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":[],"name":"flipSaleState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isSaleActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","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":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseURI","type":"string"}],"name":"setBaseURI","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"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"}]

6080604052735af50ce5fa81c4bfab3afa0a3f3990d4ffe00137600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550732c3a307286997997b837e0edab1e8a147f2e9617600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600c60146101000a81548160ff021916908315150217905550348015620000d657600080fd5b50604051620045b2380380620045b28339818101604052810190620000fc9190620004a5565b6040518060400160405280601081526020017f53757065726c617469766550756e6b73000000000000000000000000000000008152506040518060400160405280600581526020017f5350554e4b00000000000000000000000000000000000000000000000000000081525081600090805190602001906200018092919062000377565b5080600190805190602001906200019992919062000377565b505050620001bc620001b0620001d460201b60201c565b620001dc60201b60201c565b620001cd81620002a260201b60201c565b50620006fd565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620002b2620001d460201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620002d86200034d60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff161462000331576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000328906200051d565b60405180910390fd5b80600d90805190602001906200034992919062000377565b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b8280546200038590620005e5565b90600052602060002090601f016020900481019282620003a95760008555620003f5565b82601f10620003c457805160ff1916838001178555620003f5565b82800160010185558215620003f5579182015b82811115620003f4578251825591602001919060010190620003d7565b5b50905062000404919062000408565b5090565b5b808211156200042357600081600090555060010162000409565b5090565b60006200043e620004388462000568565b6200053f565b9050828152602081018484840111156200045d576200045c620006b4565b5b6200046a848285620005af565b509392505050565b600082601f8301126200048a5762000489620006af565b5b81516200049c84826020860162000427565b91505092915050565b600060208284031215620004be57620004bd620006be565b5b600082015167ffffffffffffffff811115620004df57620004de620006b9565b5b620004ed8482850162000472565b91505092915050565b6000620005056020836200059e565b91506200051282620006d4565b602082019050919050565b600060208201905081810360008301526200053881620004f6565b9050919050565b60006200054b6200055e565b90506200055982826200061b565b919050565b6000604051905090565b600067ffffffffffffffff82111562000586576200058562000680565b5b6200059182620006c3565b9050602081019050919050565b600082825260208201905092915050565b60005b83811015620005cf578082015181840152602081019050620005b2565b83811115620005df576000848401525b50505050565b60006002820490506001821680620005fe57607f821691505b6020821081141562000615576200061462000651565b5b50919050565b6200062682620006c3565b810181811067ffffffffffffffff8211171562000648576200064762000680565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b613ea5806200070d6000396000f3fe60806040526004361061019c5760003560e01c8063564566a8116100ec578063a0712d681161008a578063c87b56dd11610064578063c87b56dd14610586578063d5abeb01146105c3578063e985e9c5146105ee578063f2fde38b1461062b5761019c565b8063a0712d6814610518578063a22cb46514610534578063b88d4fde1461055d5761019c565b8063715018a6116100c6578063715018a6146104805780638da5cb5b1461049757806395d89b41146104c2578063a035b1fe146104ed5761019c565b8063564566a8146103db5780636352211e1461040657806370a08231146104435761019c565b806323b872dd116101595780633ccfd60b116101335780633ccfd60b1461034257806342842e0e1461034c5780634f6ccce71461037557806355f804b3146103b25761019c565b806323b872dd146102c55780632f745c59146102ee57806334918dfd1461032b5761019c565b806301ffc9a7146101a157806306fdde03146101de578063081812fc14610209578063095ea7b31461024657806318160ddd1461026f578063239c70ae1461029a575b600080fd5b3480156101ad57600080fd5b506101c860048036038101906101c39190612acb565b610654565b6040516101d5919061301b565b60405180910390f35b3480156101ea57600080fd5b506101f36106ce565b6040516102009190613036565b60405180910390f35b34801561021557600080fd5b50610230600480360381019061022b9190612b6e565b610760565b60405161023d9190612fb4565b60405180910390f35b34801561025257600080fd5b5061026d60048036038101906102689190612a8b565b6107e5565b005b34801561027b57600080fd5b506102846108fd565b6040516102919190613338565b60405180910390f35b3480156102a657600080fd5b506102af61090a565b6040516102bc9190613338565b60405180910390f35b3480156102d157600080fd5b506102ec60048036038101906102e79190612975565b61090f565b005b3480156102fa57600080fd5b5061031560048036038101906103109190612a8b565b61096f565b6040516103229190613338565b60405180910390f35b34801561033757600080fd5b50610340610a14565b005b61034a610abc565b005b34801561035857600080fd5b50610373600480360381019061036e9190612975565b610c3b565b005b34801561038157600080fd5b5061039c60048036038101906103979190612b6e565b610c5b565b6040516103a99190613338565b60405180910390f35b3480156103be57600080fd5b506103d960048036038101906103d49190612b25565b610ccc565b005b3480156103e757600080fd5b506103f0610d62565b6040516103fd919061301b565b60405180910390f35b34801561041257600080fd5b5061042d60048036038101906104289190612b6e565b610d75565b60405161043a9190612fb4565b60405180910390f35b34801561044f57600080fd5b5061046a60048036038101906104659190612908565b610e27565b6040516104779190613338565b60405180910390f35b34801561048c57600080fd5b50610495610edf565b005b3480156104a357600080fd5b506104ac610f67565b6040516104b99190612fb4565b60405180910390f35b3480156104ce57600080fd5b506104d7610f91565b6040516104e49190613036565b60405180910390f35b3480156104f957600080fd5b50610502611023565b60405161050f9190613338565b60405180910390f35b610532600480360381019061052d9190612b6e565b61102e565b005b34801561054057600080fd5b5061055b60048036038101906105569190612a4b565b611228565b005b34801561056957600080fd5b50610584600480360381019061057f91906129c8565b6113a9565b005b34801561059257600080fd5b506105ad60048036038101906105a89190612b6e565b61140b565b6040516105ba9190613036565b60405180910390f35b3480156105cf57600080fd5b506105d86114b2565b6040516105e59190613338565b60405180910390f35b3480156105fa57600080fd5b5061061560048036038101906106109190612935565b6114b8565b604051610622919061301b565b60405180910390f35b34801561063757600080fd5b50610652600480360381019061064d9190612908565b61154c565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806106c757506106c682611644565b5b9050919050565b6060600080546106dd906135e8565b80601f0160208091040260200160405190810160405280929190818152602001828054610709906135e8565b80156107565780601f1061072b57610100808354040283529160200191610756565b820191906000526020600020905b81548152906001019060200180831161073957829003601f168201915b5050505050905090565b600061076b82611726565b6107aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107a1906131b8565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006107f082610d75565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610861576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161085890613258565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610880611792565b73ffffffffffffffffffffffffffffffffffffffff1614806108af57506108ae816108a9611792565b6114b8565b5b6108ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108e590613138565b60405180910390fd5b6108f8838361179a565b505050565b6000600880549050905090565b600a81565b61092061091a611792565b82611853565b61095f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610956906132d8565b60405180910390fd5b61096a838383611931565b505050565b600061097a83610e27565b82106109bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109b290613058565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610a1c611792565b73ffffffffffffffffffffffffffffffffffffffff16610a3a610f67565b73ffffffffffffffffffffffffffffffffffffffff1614610a90576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a87906131d8565b60405180910390fd5b600c60149054906101000a900460ff1615600c60146101000a81548160ff021916908315150217905550565b610ac4611792565b73ffffffffffffffffffffffffffffffffffffffff16610ae2610f67565b73ffffffffffffffffffffffffffffffffffffffff1614610b38576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2f906131d8565b60405180910390fd5b60006064605047610b4991906134a4565b610b539190613473565b905060008147610b6391906134fe565b9050600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f19350505050158015610bcd573d6000803e3d6000fd5b50600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610c36573d6000803e3d6000fd5b505050565b610c56838383604051806020016040528060008152506113a9565b505050565b6000610c656108fd565b8210610ca6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9d906132f8565b60405180910390fd5b60088281548110610cba57610cb9613781565b5b90600052602060002001549050919050565b610cd4611792565b73ffffffffffffffffffffffffffffffffffffffff16610cf2610f67565b73ffffffffffffffffffffffffffffffffffffffff1614610d48576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d3f906131d8565b60405180910390fd5b80600d9080519060200190610d5e92919061271c565b5050565b600c60149054906101000a900460ff1681565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610e1e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e1590613178565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610e98576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e8f90613158565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610ee7611792565b73ffffffffffffffffffffffffffffffffffffffff16610f05610f67565b73ffffffffffffffffffffffffffffffffffffffff1614610f5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f52906131d8565b60405180910390fd5b610f656000611b8d565b565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054610fa0906135e8565b80601f0160208091040260200160405190810160405280929190818152602001828054610fcc906135e8565b80156110195780601f10610fee57610100808354040283529160200191611019565b820191906000526020600020905b815481529060010190602001808311610ffc57829003601f168201915b5050505050905090565b66b1a2bc2ec5000081565b60006110386108fd565b9050600c60149054906101000a900460ff16611089576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161108090613318565b60405180910390fd5b6127108282611098919061341d565b11156110d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110d090613298565b60405180910390fd5b6000821161111c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611113906132b8565b60405180910390fd5b600a821115611160576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161115790613278565b60405180910390fd5b611168610f67565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146111f0578166b1a2bc2ec500006111ad91906134a4565b3410156111ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111e690613238565b60405180910390fd5b5b60005b828110156112235761121033828461120b919061341d565b611c53565b808061121b9061364b565b9150506111f3565b505050565b611230611792565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561129e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611295906130f8565b60405180910390fd5b80600560006112ab611792565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611358611792565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161139d919061301b565b60405180910390a35050565b6113ba6113b4611792565b83611853565b6113f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113f0906132d8565b60405180910390fd5b61140584848484611c71565b50505050565b606061141682611726565b611455576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161144c90613218565b60405180910390fd5b600061145f611ccd565b9050600081511161147f57604051806020016040528060008152506114aa565b8061148984611d5f565b60405160200161149a929190612f90565b6040516020818303038152906040525b915050919050565b61271081565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611554611792565b73ffffffffffffffffffffffffffffffffffffffff16611572610f67565b73ffffffffffffffffffffffffffffffffffffffff16146115c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115bf906131d8565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611638576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161162f90613098565b60405180910390fd5b61164181611b8d565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061170f57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061171f575061171e82611ec0565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661180d83610d75565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061185e82611726565b61189d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161189490613118565b60405180910390fd5b60006118a883610d75565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061191757508373ffffffffffffffffffffffffffffffffffffffff166118ff84610760565b73ffffffffffffffffffffffffffffffffffffffff16145b80611928575061192781856114b8565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661195182610d75565b73ffffffffffffffffffffffffffffffffffffffff16146119a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161199e906131f8565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611a17576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a0e906130d8565b60405180910390fd5b611a22838383611f2a565b611a2d60008261179a565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611a7d91906134fe565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611ad4919061341d565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b611c6d82826040518060200160405280600081525061203e565b5050565b611c7c848484611931565b611c8884848484612099565b611cc7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cbe90613078565b60405180910390fd5b50505050565b6060600d8054611cdc906135e8565b80601f0160208091040260200160405190810160405280929190818152602001828054611d08906135e8565b8015611d555780601f10611d2a57610100808354040283529160200191611d55565b820191906000526020600020905b815481529060010190602001808311611d3857829003601f168201915b5050505050905090565b60606000821415611da7576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050611ebb565b600082905060005b60008214611dd9578080611dc29061364b565b915050600a82611dd29190613473565b9150611daf565b60008167ffffffffffffffff811115611df557611df46137b0565b5b6040519080825280601f01601f191660200182016040528015611e275781602001600182028036833780820191505090505b5090505b60008514611eb457600182611e4091906134fe565b9150600a85611e4f9190613694565b6030611e5b919061341d565b60f81b818381518110611e7157611e70613781565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85611ead9190613473565b9450611e2b565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b611f35838383612230565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611f7857611f7381612235565b611fb7565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614611fb657611fb5838261227e565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611ffa57611ff5816123eb565b612039565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146120385761203782826124bc565b5b5b505050565b612048838361253b565b6120556000848484612099565b612094576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161208b90613078565b60405180910390fd5b505050565b60006120ba8473ffffffffffffffffffffffffffffffffffffffff16612709565b15612223578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026120e3611792565b8786866040518563ffffffff1660e01b81526004016121059493929190612fcf565b602060405180830381600087803b15801561211f57600080fd5b505af192505050801561215057506040513d601f19601f8201168201806040525081019061214d9190612af8565b60015b6121d3573d8060008114612180576040519150601f19603f3d011682016040523d82523d6000602084013e612185565b606091505b506000815114156121cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121c290613078565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612228565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161228b84610e27565b61229591906134fe565b905060006007600084815260200190815260200160002054905081811461237a576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506123ff91906134fe565b905060006009600084815260200190815260200160002054905060006008838154811061242f5761242e613781565b5b90600052602060002001549050806008838154811061245157612450613781565b5b9060005260206000200181905550816009600083815260200190815260200160002081905550600960008581526020019081526020016000206000905560088054806124a05761249f613752565b5b6001900381819060005260206000200160009055905550505050565b60006124c783610e27565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156125ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125a290613198565b60405180910390fd5b6125b481611726565b156125f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125eb906130b8565b60405180910390fd5b61260060008383611f2a565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612650919061341d565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b828054612728906135e8565b90600052602060002090601f01602090048101928261274a5760008555612791565b82601f1061276357805160ff1916838001178555612791565b82800160010185558215612791579182015b82811115612790578251825591602001919060010190612775565b5b50905061279e91906127a2565b5090565b5b808211156127bb5760008160009055506001016127a3565b5090565b60006127d26127cd84613378565b613353565b9050828152602081018484840111156127ee576127ed6137e4565b5b6127f98482856135a6565b509392505050565b600061281461280f846133a9565b613353565b9050828152602081018484840111156128305761282f6137e4565b5b61283b8482856135a6565b509392505050565b60008135905061285281613e13565b92915050565b60008135905061286781613e2a565b92915050565b60008135905061287c81613e41565b92915050565b60008151905061289181613e41565b92915050565b600082601f8301126128ac576128ab6137df565b5b81356128bc8482602086016127bf565b91505092915050565b600082601f8301126128da576128d96137df565b5b81356128ea848260208601612801565b91505092915050565b60008135905061290281613e58565b92915050565b60006020828403121561291e5761291d6137ee565b5b600061292c84828501612843565b91505092915050565b6000806040838503121561294c5761294b6137ee565b5b600061295a85828601612843565b925050602061296b85828601612843565b9150509250929050565b60008060006060848603121561298e5761298d6137ee565b5b600061299c86828701612843565b93505060206129ad86828701612843565b92505060406129be868287016128f3565b9150509250925092565b600080600080608085870312156129e2576129e16137ee565b5b60006129f087828801612843565b9450506020612a0187828801612843565b9350506040612a12878288016128f3565b925050606085013567ffffffffffffffff811115612a3357612a326137e9565b5b612a3f87828801612897565b91505092959194509250565b60008060408385031215612a6257612a616137ee565b5b6000612a7085828601612843565b9250506020612a8185828601612858565b9150509250929050565b60008060408385031215612aa257612aa16137ee565b5b6000612ab085828601612843565b9250506020612ac1858286016128f3565b9150509250929050565b600060208284031215612ae157612ae06137ee565b5b6000612aef8482850161286d565b91505092915050565b600060208284031215612b0e57612b0d6137ee565b5b6000612b1c84828501612882565b91505092915050565b600060208284031215612b3b57612b3a6137ee565b5b600082013567ffffffffffffffff811115612b5957612b586137e9565b5b612b65848285016128c5565b91505092915050565b600060208284031215612b8457612b836137ee565b5b6000612b92848285016128f3565b91505092915050565b612ba481613532565b82525050565b612bb381613544565b82525050565b6000612bc4826133da565b612bce81856133f0565b9350612bde8185602086016135b5565b612be7816137f3565b840191505092915050565b6000612bfd826133e5565b612c078185613401565b9350612c178185602086016135b5565b612c20816137f3565b840191505092915050565b6000612c36826133e5565b612c408185613412565b9350612c508185602086016135b5565b80840191505092915050565b6000612c69602b83613401565b9150612c7482613804565b604082019050919050565b6000612c8c603283613401565b9150612c9782613853565b604082019050919050565b6000612caf602683613401565b9150612cba826138a2565b604082019050919050565b6000612cd2601c83613401565b9150612cdd826138f1565b602082019050919050565b6000612cf5602483613401565b9150612d008261391a565b604082019050919050565b6000612d18601983613401565b9150612d2382613969565b602082019050919050565b6000612d3b602c83613401565b9150612d4682613992565b604082019050919050565b6000612d5e603883613401565b9150612d69826139e1565b604082019050919050565b6000612d81602a83613401565b9150612d8c82613a30565b604082019050919050565b6000612da4602983613401565b9150612daf82613a7f565b604082019050919050565b6000612dc7602083613401565b9150612dd282613ace565b602082019050919050565b6000612dea602c83613401565b9150612df582613af7565b604082019050919050565b6000612e0d602083613401565b9150612e1882613b46565b602082019050919050565b6000612e30602983613401565b9150612e3b82613b6f565b604082019050919050565b6000612e53602f83613401565b9150612e5e82613bbe565b604082019050919050565b6000612e76602483613401565b9150612e8182613c0d565b604082019050919050565b6000612e99602183613401565b9150612ea482613c5c565b604082019050919050565b6000612ebc601f83613401565b9150612ec782613cab565b602082019050919050565b6000612edf602583613401565b9150612eea82613cd4565b604082019050919050565b6000612f02602083613401565b9150612f0d82613d23565b602082019050919050565b6000612f25603183613401565b9150612f3082613d4c565b604082019050919050565b6000612f48602c83613401565b9150612f5382613d9b565b604082019050919050565b6000612f6b602083613401565b9150612f7682613dea565b602082019050919050565b612f8a8161359c565b82525050565b6000612f9c8285612c2b565b9150612fa88284612c2b565b91508190509392505050565b6000602082019050612fc96000830184612b9b565b92915050565b6000608082019050612fe46000830187612b9b565b612ff16020830186612b9b565b612ffe6040830185612f81565b81810360608301526130108184612bb9565b905095945050505050565b60006020820190506130306000830184612baa565b92915050565b600060208201905081810360008301526130508184612bf2565b905092915050565b6000602082019050818103600083015261307181612c5c565b9050919050565b6000602082019050818103600083015261309181612c7f565b9050919050565b600060208201905081810360008301526130b181612ca2565b9050919050565b600060208201905081810360008301526130d181612cc5565b9050919050565b600060208201905081810360008301526130f181612ce8565b9050919050565b6000602082019050818103600083015261311181612d0b565b9050919050565b6000602082019050818103600083015261313181612d2e565b9050919050565b6000602082019050818103600083015261315181612d51565b9050919050565b6000602082019050818103600083015261317181612d74565b9050919050565b6000602082019050818103600083015261319181612d97565b9050919050565b600060208201905081810360008301526131b181612dba565b9050919050565b600060208201905081810360008301526131d181612ddd565b9050919050565b600060208201905081810360008301526131f181612e00565b9050919050565b6000602082019050818103600083015261321181612e23565b9050919050565b6000602082019050818103600083015261323181612e46565b9050919050565b6000602082019050818103600083015261325181612e69565b9050919050565b6000602082019050818103600083015261327181612e8c565b9050919050565b6000602082019050818103600083015261329181612eaf565b9050919050565b600060208201905081810360008301526132b181612ed2565b9050919050565b600060208201905081810360008301526132d181612ef5565b9050919050565b600060208201905081810360008301526132f181612f18565b9050919050565b6000602082019050818103600083015261331181612f3b565b9050919050565b6000602082019050818103600083015261333181612f5e565b9050919050565b600060208201905061334d6000830184612f81565b92915050565b600061335d61336e565b9050613369828261361a565b919050565b6000604051905090565b600067ffffffffffffffff821115613393576133926137b0565b5b61339c826137f3565b9050602081019050919050565b600067ffffffffffffffff8211156133c4576133c36137b0565b5b6133cd826137f3565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006134288261359c565b91506134338361359c565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613468576134676136c5565b5b828201905092915050565b600061347e8261359c565b91506134898361359c565b925082613499576134986136f4565b5b828204905092915050565b60006134af8261359c565b91506134ba8361359c565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156134f3576134f26136c5565b5b828202905092915050565b60006135098261359c565b91506135148361359c565b925082821015613527576135266136c5565b5b828203905092915050565b600061353d8261357c565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156135d35780820151818401526020810190506135b8565b838111156135e2576000848401525b50505050565b6000600282049050600182168061360057607f821691505b6020821081141561361457613613613723565b5b50919050565b613623826137f3565b810181811067ffffffffffffffff82111715613642576136416137b0565b5b80604052505050565b60006136568261359c565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613689576136886136c5565b5b600182019050919050565b600061369f8261359c565b91506136aa8361359c565b9250826136ba576136b96136f4565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f54686520737065636966696564204554482076616c756520697320696e636f7260008201527f7265637400000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4578636565647320746865206d6178696d756d206d696e7420616d6f756e7400600082015250565b7f416c6c20746f6b656e7320617661696c61626c652068617665206265656e206d60008201527f696e746564000000000000000000000000000000000000000000000000000000602082015250565b7f596f75206d757374206d696e74206d6f7265207468616e203020746f6b656e73600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f53616c65206973206e6f742061637469766520617420746865206d6f6d656e74600082015250565b613e1c81613532565b8114613e2757600080fd5b50565b613e3381613544565b8114613e3e57600080fd5b50565b613e4a81613550565b8114613e5557600080fd5b50565b613e618161359c565b8114613e6c57600080fd5b5056fea26469706673582212203b6f4f87f68287391e7b3a601099339e36096e22807c26ab0f4d1a67495a183964736f6c6343000807003300000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d596735354c6971456156355559684e36327831733546705a696e6d756f4471586346786736473844577a616b2f00000000000000000000

Deployed Bytecode

0x60806040526004361061019c5760003560e01c8063564566a8116100ec578063a0712d681161008a578063c87b56dd11610064578063c87b56dd14610586578063d5abeb01146105c3578063e985e9c5146105ee578063f2fde38b1461062b5761019c565b8063a0712d6814610518578063a22cb46514610534578063b88d4fde1461055d5761019c565b8063715018a6116100c6578063715018a6146104805780638da5cb5b1461049757806395d89b41146104c2578063a035b1fe146104ed5761019c565b8063564566a8146103db5780636352211e1461040657806370a08231146104435761019c565b806323b872dd116101595780633ccfd60b116101335780633ccfd60b1461034257806342842e0e1461034c5780634f6ccce71461037557806355f804b3146103b25761019c565b806323b872dd146102c55780632f745c59146102ee57806334918dfd1461032b5761019c565b806301ffc9a7146101a157806306fdde03146101de578063081812fc14610209578063095ea7b31461024657806318160ddd1461026f578063239c70ae1461029a575b600080fd5b3480156101ad57600080fd5b506101c860048036038101906101c39190612acb565b610654565b6040516101d5919061301b565b60405180910390f35b3480156101ea57600080fd5b506101f36106ce565b6040516102009190613036565b60405180910390f35b34801561021557600080fd5b50610230600480360381019061022b9190612b6e565b610760565b60405161023d9190612fb4565b60405180910390f35b34801561025257600080fd5b5061026d60048036038101906102689190612a8b565b6107e5565b005b34801561027b57600080fd5b506102846108fd565b6040516102919190613338565b60405180910390f35b3480156102a657600080fd5b506102af61090a565b6040516102bc9190613338565b60405180910390f35b3480156102d157600080fd5b506102ec60048036038101906102e79190612975565b61090f565b005b3480156102fa57600080fd5b5061031560048036038101906103109190612a8b565b61096f565b6040516103229190613338565b60405180910390f35b34801561033757600080fd5b50610340610a14565b005b61034a610abc565b005b34801561035857600080fd5b50610373600480360381019061036e9190612975565b610c3b565b005b34801561038157600080fd5b5061039c60048036038101906103979190612b6e565b610c5b565b6040516103a99190613338565b60405180910390f35b3480156103be57600080fd5b506103d960048036038101906103d49190612b25565b610ccc565b005b3480156103e757600080fd5b506103f0610d62565b6040516103fd919061301b565b60405180910390f35b34801561041257600080fd5b5061042d60048036038101906104289190612b6e565b610d75565b60405161043a9190612fb4565b60405180910390f35b34801561044f57600080fd5b5061046a60048036038101906104659190612908565b610e27565b6040516104779190613338565b60405180910390f35b34801561048c57600080fd5b50610495610edf565b005b3480156104a357600080fd5b506104ac610f67565b6040516104b99190612fb4565b60405180910390f35b3480156104ce57600080fd5b506104d7610f91565b6040516104e49190613036565b60405180910390f35b3480156104f957600080fd5b50610502611023565b60405161050f9190613338565b60405180910390f35b610532600480360381019061052d9190612b6e565b61102e565b005b34801561054057600080fd5b5061055b60048036038101906105569190612a4b565b611228565b005b34801561056957600080fd5b50610584600480360381019061057f91906129c8565b6113a9565b005b34801561059257600080fd5b506105ad60048036038101906105a89190612b6e565b61140b565b6040516105ba9190613036565b60405180910390f35b3480156105cf57600080fd5b506105d86114b2565b6040516105e59190613338565b60405180910390f35b3480156105fa57600080fd5b5061061560048036038101906106109190612935565b6114b8565b604051610622919061301b565b60405180910390f35b34801561063757600080fd5b50610652600480360381019061064d9190612908565b61154c565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806106c757506106c682611644565b5b9050919050565b6060600080546106dd906135e8565b80601f0160208091040260200160405190810160405280929190818152602001828054610709906135e8565b80156107565780601f1061072b57610100808354040283529160200191610756565b820191906000526020600020905b81548152906001019060200180831161073957829003601f168201915b5050505050905090565b600061076b82611726565b6107aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107a1906131b8565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006107f082610d75565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610861576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161085890613258565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610880611792565b73ffffffffffffffffffffffffffffffffffffffff1614806108af57506108ae816108a9611792565b6114b8565b5b6108ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108e590613138565b60405180910390fd5b6108f8838361179a565b505050565b6000600880549050905090565b600a81565b61092061091a611792565b82611853565b61095f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610956906132d8565b60405180910390fd5b61096a838383611931565b505050565b600061097a83610e27565b82106109bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109b290613058565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610a1c611792565b73ffffffffffffffffffffffffffffffffffffffff16610a3a610f67565b73ffffffffffffffffffffffffffffffffffffffff1614610a90576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a87906131d8565b60405180910390fd5b600c60149054906101000a900460ff1615600c60146101000a81548160ff021916908315150217905550565b610ac4611792565b73ffffffffffffffffffffffffffffffffffffffff16610ae2610f67565b73ffffffffffffffffffffffffffffffffffffffff1614610b38576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2f906131d8565b60405180910390fd5b60006064605047610b4991906134a4565b610b539190613473565b905060008147610b6391906134fe565b9050600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f19350505050158015610bcd573d6000803e3d6000fd5b50600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610c36573d6000803e3d6000fd5b505050565b610c56838383604051806020016040528060008152506113a9565b505050565b6000610c656108fd565b8210610ca6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9d906132f8565b60405180910390fd5b60088281548110610cba57610cb9613781565b5b90600052602060002001549050919050565b610cd4611792565b73ffffffffffffffffffffffffffffffffffffffff16610cf2610f67565b73ffffffffffffffffffffffffffffffffffffffff1614610d48576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d3f906131d8565b60405180910390fd5b80600d9080519060200190610d5e92919061271c565b5050565b600c60149054906101000a900460ff1681565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610e1e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e1590613178565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610e98576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e8f90613158565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610ee7611792565b73ffffffffffffffffffffffffffffffffffffffff16610f05610f67565b73ffffffffffffffffffffffffffffffffffffffff1614610f5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f52906131d8565b60405180910390fd5b610f656000611b8d565b565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054610fa0906135e8565b80601f0160208091040260200160405190810160405280929190818152602001828054610fcc906135e8565b80156110195780601f10610fee57610100808354040283529160200191611019565b820191906000526020600020905b815481529060010190602001808311610ffc57829003601f168201915b5050505050905090565b66b1a2bc2ec5000081565b60006110386108fd565b9050600c60149054906101000a900460ff16611089576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161108090613318565b60405180910390fd5b6127108282611098919061341d565b11156110d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110d090613298565b60405180910390fd5b6000821161111c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611113906132b8565b60405180910390fd5b600a821115611160576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161115790613278565b60405180910390fd5b611168610f67565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146111f0578166b1a2bc2ec500006111ad91906134a4565b3410156111ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111e690613238565b60405180910390fd5b5b60005b828110156112235761121033828461120b919061341d565b611c53565b808061121b9061364b565b9150506111f3565b505050565b611230611792565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561129e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611295906130f8565b60405180910390fd5b80600560006112ab611792565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611358611792565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161139d919061301b565b60405180910390a35050565b6113ba6113b4611792565b83611853565b6113f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113f0906132d8565b60405180910390fd5b61140584848484611c71565b50505050565b606061141682611726565b611455576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161144c90613218565b60405180910390fd5b600061145f611ccd565b9050600081511161147f57604051806020016040528060008152506114aa565b8061148984611d5f565b60405160200161149a929190612f90565b6040516020818303038152906040525b915050919050565b61271081565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611554611792565b73ffffffffffffffffffffffffffffffffffffffff16611572610f67565b73ffffffffffffffffffffffffffffffffffffffff16146115c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115bf906131d8565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611638576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161162f90613098565b60405180910390fd5b61164181611b8d565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061170f57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061171f575061171e82611ec0565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661180d83610d75565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061185e82611726565b61189d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161189490613118565b60405180910390fd5b60006118a883610d75565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061191757508373ffffffffffffffffffffffffffffffffffffffff166118ff84610760565b73ffffffffffffffffffffffffffffffffffffffff16145b80611928575061192781856114b8565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661195182610d75565b73ffffffffffffffffffffffffffffffffffffffff16146119a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161199e906131f8565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611a17576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a0e906130d8565b60405180910390fd5b611a22838383611f2a565b611a2d60008261179a565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611a7d91906134fe565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611ad4919061341d565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b611c6d82826040518060200160405280600081525061203e565b5050565b611c7c848484611931565b611c8884848484612099565b611cc7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cbe90613078565b60405180910390fd5b50505050565b6060600d8054611cdc906135e8565b80601f0160208091040260200160405190810160405280929190818152602001828054611d08906135e8565b8015611d555780601f10611d2a57610100808354040283529160200191611d55565b820191906000526020600020905b815481529060010190602001808311611d3857829003601f168201915b5050505050905090565b60606000821415611da7576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050611ebb565b600082905060005b60008214611dd9578080611dc29061364b565b915050600a82611dd29190613473565b9150611daf565b60008167ffffffffffffffff811115611df557611df46137b0565b5b6040519080825280601f01601f191660200182016040528015611e275781602001600182028036833780820191505090505b5090505b60008514611eb457600182611e4091906134fe565b9150600a85611e4f9190613694565b6030611e5b919061341d565b60f81b818381518110611e7157611e70613781565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85611ead9190613473565b9450611e2b565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b611f35838383612230565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611f7857611f7381612235565b611fb7565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614611fb657611fb5838261227e565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611ffa57611ff5816123eb565b612039565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146120385761203782826124bc565b5b5b505050565b612048838361253b565b6120556000848484612099565b612094576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161208b90613078565b60405180910390fd5b505050565b60006120ba8473ffffffffffffffffffffffffffffffffffffffff16612709565b15612223578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026120e3611792565b8786866040518563ffffffff1660e01b81526004016121059493929190612fcf565b602060405180830381600087803b15801561211f57600080fd5b505af192505050801561215057506040513d601f19601f8201168201806040525081019061214d9190612af8565b60015b6121d3573d8060008114612180576040519150601f19603f3d011682016040523d82523d6000602084013e612185565b606091505b506000815114156121cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121c290613078565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612228565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161228b84610e27565b61229591906134fe565b905060006007600084815260200190815260200160002054905081811461237a576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506123ff91906134fe565b905060006009600084815260200190815260200160002054905060006008838154811061242f5761242e613781565b5b90600052602060002001549050806008838154811061245157612450613781565b5b9060005260206000200181905550816009600083815260200190815260200160002081905550600960008581526020019081526020016000206000905560088054806124a05761249f613752565b5b6001900381819060005260206000200160009055905550505050565b60006124c783610e27565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156125ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125a290613198565b60405180910390fd5b6125b481611726565b156125f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125eb906130b8565b60405180910390fd5b61260060008383611f2a565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612650919061341d565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b828054612728906135e8565b90600052602060002090601f01602090048101928261274a5760008555612791565b82601f1061276357805160ff1916838001178555612791565b82800160010185558215612791579182015b82811115612790578251825591602001919060010190612775565b5b50905061279e91906127a2565b5090565b5b808211156127bb5760008160009055506001016127a3565b5090565b60006127d26127cd84613378565b613353565b9050828152602081018484840111156127ee576127ed6137e4565b5b6127f98482856135a6565b509392505050565b600061281461280f846133a9565b613353565b9050828152602081018484840111156128305761282f6137e4565b5b61283b8482856135a6565b509392505050565b60008135905061285281613e13565b92915050565b60008135905061286781613e2a565b92915050565b60008135905061287c81613e41565b92915050565b60008151905061289181613e41565b92915050565b600082601f8301126128ac576128ab6137df565b5b81356128bc8482602086016127bf565b91505092915050565b600082601f8301126128da576128d96137df565b5b81356128ea848260208601612801565b91505092915050565b60008135905061290281613e58565b92915050565b60006020828403121561291e5761291d6137ee565b5b600061292c84828501612843565b91505092915050565b6000806040838503121561294c5761294b6137ee565b5b600061295a85828601612843565b925050602061296b85828601612843565b9150509250929050565b60008060006060848603121561298e5761298d6137ee565b5b600061299c86828701612843565b93505060206129ad86828701612843565b92505060406129be868287016128f3565b9150509250925092565b600080600080608085870312156129e2576129e16137ee565b5b60006129f087828801612843565b9450506020612a0187828801612843565b9350506040612a12878288016128f3565b925050606085013567ffffffffffffffff811115612a3357612a326137e9565b5b612a3f87828801612897565b91505092959194509250565b60008060408385031215612a6257612a616137ee565b5b6000612a7085828601612843565b9250506020612a8185828601612858565b9150509250929050565b60008060408385031215612aa257612aa16137ee565b5b6000612ab085828601612843565b9250506020612ac1858286016128f3565b9150509250929050565b600060208284031215612ae157612ae06137ee565b5b6000612aef8482850161286d565b91505092915050565b600060208284031215612b0e57612b0d6137ee565b5b6000612b1c84828501612882565b91505092915050565b600060208284031215612b3b57612b3a6137ee565b5b600082013567ffffffffffffffff811115612b5957612b586137e9565b5b612b65848285016128c5565b91505092915050565b600060208284031215612b8457612b836137ee565b5b6000612b92848285016128f3565b91505092915050565b612ba481613532565b82525050565b612bb381613544565b82525050565b6000612bc4826133da565b612bce81856133f0565b9350612bde8185602086016135b5565b612be7816137f3565b840191505092915050565b6000612bfd826133e5565b612c078185613401565b9350612c178185602086016135b5565b612c20816137f3565b840191505092915050565b6000612c36826133e5565b612c408185613412565b9350612c508185602086016135b5565b80840191505092915050565b6000612c69602b83613401565b9150612c7482613804565b604082019050919050565b6000612c8c603283613401565b9150612c9782613853565b604082019050919050565b6000612caf602683613401565b9150612cba826138a2565b604082019050919050565b6000612cd2601c83613401565b9150612cdd826138f1565b602082019050919050565b6000612cf5602483613401565b9150612d008261391a565b604082019050919050565b6000612d18601983613401565b9150612d2382613969565b602082019050919050565b6000612d3b602c83613401565b9150612d4682613992565b604082019050919050565b6000612d5e603883613401565b9150612d69826139e1565b604082019050919050565b6000612d81602a83613401565b9150612d8c82613a30565b604082019050919050565b6000612da4602983613401565b9150612daf82613a7f565b604082019050919050565b6000612dc7602083613401565b9150612dd282613ace565b602082019050919050565b6000612dea602c83613401565b9150612df582613af7565b604082019050919050565b6000612e0d602083613401565b9150612e1882613b46565b602082019050919050565b6000612e30602983613401565b9150612e3b82613b6f565b604082019050919050565b6000612e53602f83613401565b9150612e5e82613bbe565b604082019050919050565b6000612e76602483613401565b9150612e8182613c0d565b604082019050919050565b6000612e99602183613401565b9150612ea482613c5c565b604082019050919050565b6000612ebc601f83613401565b9150612ec782613cab565b602082019050919050565b6000612edf602583613401565b9150612eea82613cd4565b604082019050919050565b6000612f02602083613401565b9150612f0d82613d23565b602082019050919050565b6000612f25603183613401565b9150612f3082613d4c565b604082019050919050565b6000612f48602c83613401565b9150612f5382613d9b565b604082019050919050565b6000612f6b602083613401565b9150612f7682613dea565b602082019050919050565b612f8a8161359c565b82525050565b6000612f9c8285612c2b565b9150612fa88284612c2b565b91508190509392505050565b6000602082019050612fc96000830184612b9b565b92915050565b6000608082019050612fe46000830187612b9b565b612ff16020830186612b9b565b612ffe6040830185612f81565b81810360608301526130108184612bb9565b905095945050505050565b60006020820190506130306000830184612baa565b92915050565b600060208201905081810360008301526130508184612bf2565b905092915050565b6000602082019050818103600083015261307181612c5c565b9050919050565b6000602082019050818103600083015261309181612c7f565b9050919050565b600060208201905081810360008301526130b181612ca2565b9050919050565b600060208201905081810360008301526130d181612cc5565b9050919050565b600060208201905081810360008301526130f181612ce8565b9050919050565b6000602082019050818103600083015261311181612d0b565b9050919050565b6000602082019050818103600083015261313181612d2e565b9050919050565b6000602082019050818103600083015261315181612d51565b9050919050565b6000602082019050818103600083015261317181612d74565b9050919050565b6000602082019050818103600083015261319181612d97565b9050919050565b600060208201905081810360008301526131b181612dba565b9050919050565b600060208201905081810360008301526131d181612ddd565b9050919050565b600060208201905081810360008301526131f181612e00565b9050919050565b6000602082019050818103600083015261321181612e23565b9050919050565b6000602082019050818103600083015261323181612e46565b9050919050565b6000602082019050818103600083015261325181612e69565b9050919050565b6000602082019050818103600083015261327181612e8c565b9050919050565b6000602082019050818103600083015261329181612eaf565b9050919050565b600060208201905081810360008301526132b181612ed2565b9050919050565b600060208201905081810360008301526132d181612ef5565b9050919050565b600060208201905081810360008301526132f181612f18565b9050919050565b6000602082019050818103600083015261331181612f3b565b9050919050565b6000602082019050818103600083015261333181612f5e565b9050919050565b600060208201905061334d6000830184612f81565b92915050565b600061335d61336e565b9050613369828261361a565b919050565b6000604051905090565b600067ffffffffffffffff821115613393576133926137b0565b5b61339c826137f3565b9050602081019050919050565b600067ffffffffffffffff8211156133c4576133c36137b0565b5b6133cd826137f3565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006134288261359c565b91506134338361359c565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613468576134676136c5565b5b828201905092915050565b600061347e8261359c565b91506134898361359c565b925082613499576134986136f4565b5b828204905092915050565b60006134af8261359c565b91506134ba8361359c565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156134f3576134f26136c5565b5b828202905092915050565b60006135098261359c565b91506135148361359c565b925082821015613527576135266136c5565b5b828203905092915050565b600061353d8261357c565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156135d35780820151818401526020810190506135b8565b838111156135e2576000848401525b50505050565b6000600282049050600182168061360057607f821691505b6020821081141561361457613613613723565b5b50919050565b613623826137f3565b810181811067ffffffffffffffff82111715613642576136416137b0565b5b80604052505050565b60006136568261359c565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613689576136886136c5565b5b600182019050919050565b600061369f8261359c565b91506136aa8361359c565b9250826136ba576136b96136f4565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f54686520737065636966696564204554482076616c756520697320696e636f7260008201527f7265637400000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4578636565647320746865206d6178696d756d206d696e7420616d6f756e7400600082015250565b7f416c6c20746f6b656e7320617661696c61626c652068617665206265656e206d60008201527f696e746564000000000000000000000000000000000000000000000000000000602082015250565b7f596f75206d757374206d696e74206d6f7265207468616e203020746f6b656e73600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f53616c65206973206e6f742061637469766520617420746865206d6f6d656e74600082015250565b613e1c81613532565b8114613e2757600080fd5b50565b613e3381613544565b8114613e3e57600080fd5b50565b613e4a81613550565b8114613e5557600080fd5b50565b613e618161359c565b8114613e6c57600080fd5b5056fea26469706673582212203b6f4f87f68287391e7b3a601099339e36096e22807c26ab0f4d1a67495a183964736f6c63430008070033

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

00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d596735354c6971456156355559684e36327831733546705a696e6d756f4471586346786736473844577a616b2f00000000000000000000

-----Decoded View---------------
Arg [0] : _initBaseURI (string): ipfs://QmYg55LiqEaV5UYhN62x1s5FpZinmuoDqXcFxg6G8DWzak/

-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000020
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000036
Arg [2] : 697066733a2f2f516d596735354c6971456156355559684e3632783173354670
Arg [3] : 5a696e6d756f4471586346786736473844577a616b2f00000000000000000000


Deployed Bytecode Sourcemap

50190:2188:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43924:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31816:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33375:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32898:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44564:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50392:42;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34265:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44232:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51286:89;;;;;;;;;;;;;:::i;:::-;;52064:311;;;:::i;:::-;;34675:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44754:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50971:104;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50697:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31510:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31240:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11515:94;;;;;;;;;;;;;:::i;:::-;;10864:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31985:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50441:49;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51383:673;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33668:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34931:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32160:334;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50344:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34034:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11764:192;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43924:224;44026:4;44065:35;44050:50;;;:11;:50;;;;:90;;;;44104:36;44128:11;44104:23;:36::i;:::-;44050:90;44043:97;;43924:224;;;:::o;31816:100::-;31870:13;31903:5;31896:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31816:100;:::o;33375:221::-;33451:7;33479:16;33487:7;33479;:16::i;:::-;33471:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;33564:15;:24;33580:7;33564:24;;;;;;;;;;;;;;;;;;;;;33557:31;;33375:221;;;:::o;32898:411::-;32979:13;32995:23;33010:7;32995:14;:23::i;:::-;32979:39;;33043:5;33037:11;;:2;:11;;;;33029:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;33137:5;33121:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;33146:37;33163:5;33170:12;:10;:12::i;:::-;33146:16;:37::i;:::-;33121:62;33099:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;33280:21;33289:2;33293:7;33280:8;:21::i;:::-;32968:341;32898:411;;:::o;44564:113::-;44625:7;44652:10;:17;;;;44645:24;;44564:113;:::o;50392:42::-;50432:2;50392:42;:::o;34265:339::-;34460:41;34479:12;:10;:12::i;:::-;34493:7;34460:18;:41::i;:::-;34452:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;34568:28;34578:4;34584:2;34588:7;34568:9;:28::i;:::-;34265:339;;;:::o;44232:256::-;44329:7;44365:23;44382:5;44365:16;:23::i;:::-;44357:5;:31;44349:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;44454:12;:19;44467:5;44454:19;;;;;;;;;;;;;;;:26;44474:5;44454:26;;;;;;;;;;;;44447:33;;44232:256;;;;:::o;51286:89::-;11095:12;:10;:12::i;:::-;11084:23;;:7;:5;:7::i;:::-;:23;;;11076:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51355:12:::1;;;;;;;;;;;51354:13;51339:12;;:28;;;;;;;;;;;;;;;;;;51286:89::o:0;52064:311::-;11095:12;:10;:12::i;:::-;11084:23;;:7;:5;:7::i;:::-;:23;;;11076:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52120:18:::1;52172:3;52166:2;52142:21;:26;;;;:::i;:::-;52141:34;;;;:::i;:::-;52120:55;;52234:13;52274:10;52250:21;:34;;;;:::i;:::-;52234:50;;52305:2;;;;;;;;;;;52297:20;;:32;52318:10;52297:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;52348:2;;;;;;;;;;;52340:20;;:27;52361:5;52340:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;52109:266;;52064:311::o:0;34675:185::-;34813:39;34830:4;34836:2;34840:7;34813:39;;;;;;;;;;;;:16;:39::i;:::-;34675:185;;;:::o;44754:233::-;44829:7;44865:30;:28;:30::i;:::-;44857:5;:38;44849:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;44962:10;44973:5;44962:17;;;;;;;;:::i;:::-;;;;;;;;;;44955:24;;44754:233;;;:::o;50971:104::-;11095:12;:10;:12::i;:::-;11084:23;;:7;:5;:7::i;:::-;:23;;;11076:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51056:11:::1;51046:7;:21;;;;;;;;;;;;:::i;:::-;;50971:104:::0;:::o;50697:32::-;;;;;;;;;;;;;:::o;31510:239::-;31582:7;31602:13;31618:7;:16;31626:7;31618:16;;;;;;;;;;;;;;;;;;;;;31602:32;;31670:1;31653:19;;:5;:19;;;;31645:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;31736:5;31729:12;;;31510:239;;;:::o;31240:208::-;31312:7;31357:1;31340:19;;:5;:19;;;;31332:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;31424:9;:16;31434:5;31424:16;;;;;;;;;;;;;;;;31417:23;;31240:208;;;:::o;11515:94::-;11095:12;:10;:12::i;:::-;11084:23;;:7;:5;:7::i;:::-;:23;;;11076:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;11580:21:::1;11598:1;11580:9;:21::i;:::-;11515:94::o:0;10864:87::-;10910:7;10937:6;;;;;;;;;;;10930:13;;10864:87;:::o;31985:104::-;32041:13;32074:7;32067:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31985:104;:::o;50441:49::-;50473:17;50441:49;:::o;51383:673::-;51441:14;51458:13;:11;:13::i;:::-;51441:30;;51490:12;;;;;;;;;;;51482:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;50380:5;51567:11;51558:6;:20;;;;:::i;:::-;:33;;51550:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;51666:1;51652:11;:15;51644:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;50432:2;51723:11;:28;;51715:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;51818:7;:5;:7::i;:::-;51804:21;;:10;:21;;;51800:135;;51871:11;50473:17;51863:19;;;;:::i;:::-;51850:9;:32;;51842:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;51800:135;51952:9;51947:102;51971:11;51967:1;:15;51947:102;;;52004:33;52014:10;52035:1;52026:6;:10;;;;:::i;:::-;52004:9;:33::i;:::-;51984:3;;;;;:::i;:::-;;;;51947:102;;;;51430:626;51383:673;:::o;33668:295::-;33783:12;:10;:12::i;:::-;33771:24;;:8;:24;;;;33763:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;33883:8;33838:18;:32;33857:12;:10;:12::i;:::-;33838:32;;;;;;;;;;;;;;;:42;33871:8;33838:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;33936:8;33907:48;;33922:12;:10;:12::i;:::-;33907:48;;;33946:8;33907:48;;;;;;:::i;:::-;;;;;;;;33668:295;;:::o;34931:328::-;35106:41;35125:12;:10;:12::i;:::-;35139:7;35106:18;:41::i;:::-;35098:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;35212:39;35226:4;35232:2;35236:7;35245:5;35212:13;:39::i;:::-;34931:328;;;;:::o;32160:334::-;32233:13;32267:16;32275:7;32267;:16::i;:::-;32259:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;32348:21;32372:10;:8;:10::i;:::-;32348:34;;32424:1;32406:7;32400:21;:25;:86;;;;;;;;;;;;;;;;;32452:7;32461:18;:7;:16;:18::i;:::-;32435:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;32400:86;32393:93;;;32160:334;;;:::o;50344:41::-;50380:5;50344:41;:::o;34034:164::-;34131:4;34155:18;:25;34174:5;34155:25;;;;;;;;;;;;;;;:35;34181:8;34155:35;;;;;;;;;;;;;;;;;;;;;;;;;34148:42;;34034:164;;;;:::o;11764:192::-;11095:12;:10;:12::i;:::-;11084:23;;:7;:5;:7::i;:::-;:23;;;11076:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;11873:1:::1;11853:22;;:8;:22;;;;11845:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;11929:19;11939:8;11929:9;:19::i;:::-;11764:192:::0;:::o;30871:305::-;30973:4;31025:25;31010:40;;;:11;:40;;;;:105;;;;31082:33;31067:48;;;:11;:48;;;;31010:105;:158;;;;31132:36;31156:11;31132:23;:36::i;:::-;31010:158;30990:178;;30871:305;;;:::o;36769:127::-;36834:4;36886:1;36858:30;;:7;:16;36866:7;36858:16;;;;;;;;;;;;;;;;;;;;;:30;;;;36851:37;;36769:127;;;:::o;9652:98::-;9705:7;9732:10;9725:17;;9652:98;:::o;40751:174::-;40853:2;40826:15;:24;40842:7;40826:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;40909:7;40905:2;40871:46;;40880:23;40895:7;40880:14;:23::i;:::-;40871:46;;;;;;;;;;;;40751:174;;:::o;37063:348::-;37156:4;37181:16;37189:7;37181;:16::i;:::-;37173:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;37257:13;37273:23;37288:7;37273:14;:23::i;:::-;37257:39;;37326:5;37315:16;;:7;:16;;;:51;;;;37359:7;37335:31;;:20;37347:7;37335:11;:20::i;:::-;:31;;;37315:51;:87;;;;37370:32;37387:5;37394:7;37370:16;:32::i;:::-;37315:87;37307:96;;;37063:348;;;;:::o;40055:578::-;40214:4;40187:31;;:23;40202:7;40187:14;:23::i;:::-;:31;;;40179:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;40297:1;40283:16;;:2;:16;;;;40275:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;40353:39;40374:4;40380:2;40384:7;40353:20;:39::i;:::-;40457:29;40474:1;40478:7;40457:8;:29::i;:::-;40518:1;40499:9;:15;40509:4;40499:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;40547:1;40530:9;:13;40540:2;40530:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;40578:2;40559:7;:16;40567:7;40559:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;40617:7;40613:2;40598:27;;40607:4;40598:27;;;;;;;;;;;;40055:578;;;:::o;11964:173::-;12020:16;12039:6;;;;;;;;;;;12020:25;;12065:8;12056:6;;:17;;;;;;;;;;;;;;;;;;12120:8;12089:40;;12110:8;12089:40;;;;;;;;;;;;12009:128;11964:173;:::o;37753:110::-;37829:26;37839:2;37843:7;37829:26;;;;;;;;;;;;:9;:26::i;:::-;37753:110;;:::o;36141:315::-;36298:28;36308:4;36314:2;36318:7;36298:9;:28::i;:::-;36345:48;36368:4;36374:2;36378:7;36387:5;36345:22;:48::i;:::-;36337:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;36141:315;;;;:::o;51129:100::-;51181:13;51214:7;51207:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51129:100;:::o;7268:723::-;7324:13;7554:1;7545:5;:10;7541:53;;;7572:10;;;;;;;;;;;;;;;;;;;;;7541:53;7604:12;7619:5;7604:20;;7635:14;7660:78;7675:1;7667:4;:9;7660:78;;7693:8;;;;;:::i;:::-;;;;7724:2;7716:10;;;;;:::i;:::-;;;7660:78;;;7748:19;7780:6;7770:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7748:39;;7798:154;7814:1;7805:5;:10;7798:154;;7842:1;7832:11;;;;;:::i;:::-;;;7909:2;7901:5;:10;;;;:::i;:::-;7888:2;:24;;;;:::i;:::-;7875:39;;7858:6;7865;7858:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;7938:2;7929:11;;;;;:::i;:::-;;;7798:154;;;7976:6;7962:21;;;;;7268:723;;;;:::o;22850:157::-;22935:4;22974:25;22959:40;;;:11;:40;;;;22952:47;;22850:157;;;:::o;45600:589::-;45744:45;45771:4;45777:2;45781:7;45744:26;:45::i;:::-;45822:1;45806:18;;:4;:18;;;45802:187;;;45841:40;45873:7;45841:31;:40::i;:::-;45802:187;;;45911:2;45903:10;;:4;:10;;;45899:90;;45930:47;45963:4;45969:7;45930:32;:47::i;:::-;45899:90;45802:187;46017:1;46003:16;;:2;:16;;;45999:183;;;46036:45;46073:7;46036:36;:45::i;:::-;45999:183;;;46109:4;46103:10;;:2;:10;;;46099:83;;46130:40;46158:2;46162:7;46130:27;:40::i;:::-;46099:83;45999:183;45600:589;;;:::o;38090:321::-;38220:18;38226:2;38230:7;38220:5;:18::i;:::-;38271:54;38302:1;38306:2;38310:7;38319:5;38271:22;:54::i;:::-;38249:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;38090:321;;;:::o;41490:799::-;41645:4;41666:15;:2;:13;;;:15::i;:::-;41662:620;;;41718:2;41702:36;;;41739:12;:10;:12::i;:::-;41753:4;41759:7;41768:5;41702:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;41698:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41961:1;41944:6;:13;:18;41940:272;;;41987:60;;;;;;;;;;:::i;:::-;;;;;;;;41940:272;42162:6;42156:13;42147:6;42143:2;42139:15;42132:38;41698:529;41835:41;;;41825:51;;;:6;:51;;;;41818:58;;;;;41662:620;42266:4;42259:11;;41490:799;;;;;;;:::o;42861:126::-;;;;:::o;46912:164::-;47016:10;:17;;;;46989:15;:24;47005:7;46989:24;;;;;;;;;;;:44;;;;47044:10;47060:7;47044:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46912:164;:::o;47703:988::-;47969:22;48019:1;47994:22;48011:4;47994:16;:22::i;:::-;:26;;;;:::i;:::-;47969:51;;48031:18;48052:17;:26;48070:7;48052:26;;;;;;;;;;;;48031:47;;48199:14;48185:10;:28;48181:328;;48230:19;48252:12;:18;48265:4;48252:18;;;;;;;;;;;;;;;:34;48271:14;48252:34;;;;;;;;;;;;48230:56;;48336:11;48303:12;:18;48316:4;48303:18;;;;;;;;;;;;;;;:30;48322:10;48303:30;;;;;;;;;;;:44;;;;48453:10;48420:17;:30;48438:11;48420:30;;;;;;;;;;;:43;;;;48215:294;48181:328;48605:17;:26;48623:7;48605:26;;;;;;;;;;;48598:33;;;48649:12;:18;48662:4;48649:18;;;;;;;;;;;;;;;:34;48668:14;48649:34;;;;;;;;;;;48642:41;;;47784:907;;47703:988;;:::o;48986:1079::-;49239:22;49284:1;49264:10;:17;;;;:21;;;;:::i;:::-;49239:46;;49296:18;49317:15;:24;49333:7;49317:24;;;;;;;;;;;;49296:45;;49668:19;49690:10;49701:14;49690:26;;;;;;;;:::i;:::-;;;;;;;;;;49668:48;;49754:11;49729:10;49740;49729:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;49865:10;49834:15;:28;49850:11;49834:28;;;;;;;;;;;:41;;;;50006:15;:24;50022:7;50006:24;;;;;;;;;;;49999:31;;;50041:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;49057:1008;;;48986:1079;:::o;46490:221::-;46575:14;46592:20;46609:2;46592:16;:20::i;:::-;46575:37;;46650:7;46623:12;:16;46636:2;46623:16;;;;;;;;;;;;;;;:24;46640:6;46623:24;;;;;;;;;;;:34;;;;46697:6;46668:17;:26;46686:7;46668:26;;;;;;;;;;;:35;;;;46564:147;46490:221;;:::o;38747:382::-;38841:1;38827:16;;:2;:16;;;;38819:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;38900:16;38908:7;38900;:16::i;:::-;38899:17;38891:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;38962:45;38991:1;38995:2;38999:7;38962:20;:45::i;:::-;39037:1;39020:9;:13;39030:2;39020:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;39068:2;39049:7;:16;39057:7;39049:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;39113:7;39109:2;39088:33;;39105:1;39088:33;;;;;;;;;;;;38747:382;;:::o;12910:387::-;12970:4;13178:12;13245:7;13233:20;13225:28;;13288:1;13281:4;:8;13274:15;;;12910:387;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::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:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;986:133::-;1029:5;1067:6;1054:20;1045:29;;1083:30;1107:5;1083:30;:::i;:::-;986:133;;;;:::o;1125:137::-;1170:5;1208:6;1195:20;1186:29;;1224:32;1250:5;1224:32;:::i;:::-;1125:137;;;;:::o;1268:141::-;1324:5;1355:6;1349:13;1340:22;;1371:32;1397:5;1371:32;:::i;:::-;1268:141;;;;:::o;1428:338::-;1483:5;1532:3;1525:4;1517:6;1513:17;1509:27;1499:122;;1540:79;;:::i;:::-;1499:122;1657:6;1644:20;1682:78;1756:3;1748:6;1741:4;1733:6;1729:17;1682:78;:::i;:::-;1673:87;;1489:277;1428:338;;;;:::o;1786:340::-;1842:5;1891:3;1884:4;1876:6;1872:17;1868:27;1858:122;;1899:79;;:::i;:::-;1858:122;2016:6;2003:20;2041:79;2116:3;2108:6;2101:4;2093:6;2089:17;2041:79;:::i;:::-;2032:88;;1848:278;1786:340;;;;:::o;2132:139::-;2178:5;2216:6;2203:20;2194:29;;2232:33;2259:5;2232:33;:::i;:::-;2132:139;;;;:::o;2277:329::-;2336:6;2385:2;2373:9;2364:7;2360:23;2356:32;2353:119;;;2391:79;;:::i;:::-;2353:119;2511:1;2536:53;2581:7;2572:6;2561:9;2557:22;2536:53;:::i;:::-;2526:63;;2482:117;2277:329;;;;:::o;2612:474::-;2680:6;2688;2737:2;2725:9;2716:7;2712:23;2708:32;2705:119;;;2743:79;;:::i;:::-;2705:119;2863:1;2888:53;2933:7;2924:6;2913:9;2909:22;2888:53;:::i;:::-;2878:63;;2834:117;2990:2;3016:53;3061:7;3052:6;3041:9;3037:22;3016:53;:::i;:::-;3006:63;;2961:118;2612:474;;;;;:::o;3092:619::-;3169:6;3177;3185;3234:2;3222:9;3213:7;3209:23;3205:32;3202:119;;;3240:79;;:::i;:::-;3202:119;3360:1;3385:53;3430:7;3421:6;3410:9;3406:22;3385:53;:::i;:::-;3375:63;;3331:117;3487:2;3513:53;3558:7;3549:6;3538:9;3534:22;3513:53;:::i;:::-;3503:63;;3458:118;3615:2;3641:53;3686:7;3677:6;3666:9;3662:22;3641:53;:::i;:::-;3631:63;;3586:118;3092:619;;;;;:::o;3717:943::-;3812:6;3820;3828;3836;3885:3;3873:9;3864:7;3860:23;3856:33;3853:120;;;3892:79;;:::i;:::-;3853:120;4012:1;4037:53;4082:7;4073:6;4062:9;4058:22;4037:53;:::i;:::-;4027:63;;3983:117;4139:2;4165:53;4210:7;4201:6;4190:9;4186:22;4165:53;:::i;:::-;4155:63;;4110:118;4267:2;4293:53;4338:7;4329:6;4318:9;4314:22;4293:53;:::i;:::-;4283:63;;4238:118;4423:2;4412:9;4408:18;4395:32;4454:18;4446:6;4443:30;4440:117;;;4476:79;;:::i;:::-;4440:117;4581:62;4635:7;4626:6;4615:9;4611:22;4581:62;:::i;:::-;4571:72;;4366:287;3717:943;;;;;;;:::o;4666:468::-;4731:6;4739;4788:2;4776:9;4767:7;4763:23;4759:32;4756:119;;;4794:79;;:::i;:::-;4756:119;4914:1;4939:53;4984:7;4975:6;4964:9;4960:22;4939:53;:::i;:::-;4929:63;;4885:117;5041:2;5067:50;5109:7;5100:6;5089:9;5085:22;5067:50;:::i;:::-;5057:60;;5012:115;4666:468;;;;;:::o;5140:474::-;5208:6;5216;5265:2;5253:9;5244:7;5240:23;5236:32;5233:119;;;5271:79;;:::i;:::-;5233:119;5391:1;5416:53;5461:7;5452:6;5441:9;5437:22;5416:53;:::i;:::-;5406:63;;5362:117;5518:2;5544:53;5589:7;5580:6;5569:9;5565:22;5544:53;:::i;:::-;5534:63;;5489:118;5140:474;;;;;:::o;5620:327::-;5678:6;5727:2;5715:9;5706:7;5702:23;5698:32;5695:119;;;5733:79;;:::i;:::-;5695:119;5853:1;5878:52;5922:7;5913:6;5902:9;5898:22;5878:52;:::i;:::-;5868:62;;5824:116;5620:327;;;;:::o;5953:349::-;6022:6;6071:2;6059:9;6050:7;6046:23;6042:32;6039:119;;;6077:79;;:::i;:::-;6039:119;6197:1;6222:63;6277:7;6268:6;6257:9;6253:22;6222:63;:::i;:::-;6212:73;;6168:127;5953:349;;;;:::o;6308:509::-;6377:6;6426:2;6414:9;6405:7;6401:23;6397:32;6394:119;;;6432:79;;:::i;:::-;6394:119;6580:1;6569:9;6565:17;6552:31;6610:18;6602:6;6599:30;6596:117;;;6632:79;;:::i;:::-;6596:117;6737:63;6792:7;6783:6;6772:9;6768:22;6737:63;:::i;:::-;6727:73;;6523:287;6308:509;;;;:::o;6823:329::-;6882:6;6931:2;6919:9;6910:7;6906:23;6902:32;6899:119;;;6937:79;;:::i;:::-;6899:119;7057:1;7082:53;7127:7;7118:6;7107:9;7103:22;7082:53;:::i;:::-;7072:63;;7028:117;6823:329;;;;:::o;7158:118::-;7245:24;7263:5;7245:24;:::i;:::-;7240:3;7233:37;7158:118;;:::o;7282:109::-;7363:21;7378:5;7363:21;:::i;:::-;7358:3;7351:34;7282:109;;:::o;7397:360::-;7483:3;7511:38;7543:5;7511:38;:::i;:::-;7565:70;7628:6;7623:3;7565:70;:::i;:::-;7558:77;;7644:52;7689:6;7684:3;7677:4;7670:5;7666:16;7644:52;:::i;:::-;7721:29;7743:6;7721:29;:::i;:::-;7716:3;7712:39;7705:46;;7487:270;7397:360;;;;:::o;7763:364::-;7851:3;7879:39;7912:5;7879:39;:::i;:::-;7934:71;7998:6;7993:3;7934:71;:::i;:::-;7927:78;;8014:52;8059:6;8054:3;8047:4;8040:5;8036:16;8014:52;:::i;:::-;8091:29;8113:6;8091:29;:::i;:::-;8086:3;8082:39;8075:46;;7855:272;7763:364;;;;:::o;8133:377::-;8239:3;8267:39;8300:5;8267:39;:::i;:::-;8322:89;8404:6;8399:3;8322:89;:::i;:::-;8315:96;;8420:52;8465:6;8460:3;8453:4;8446:5;8442:16;8420:52;:::i;:::-;8497:6;8492:3;8488:16;8481:23;;8243:267;8133:377;;;;:::o;8516:366::-;8658:3;8679:67;8743:2;8738:3;8679:67;:::i;:::-;8672:74;;8755:93;8844:3;8755:93;:::i;:::-;8873:2;8868:3;8864:12;8857:19;;8516:366;;;:::o;8888:::-;9030:3;9051:67;9115:2;9110:3;9051:67;:::i;:::-;9044:74;;9127:93;9216:3;9127:93;:::i;:::-;9245:2;9240:3;9236:12;9229:19;;8888:366;;;:::o;9260:::-;9402:3;9423:67;9487:2;9482:3;9423:67;:::i;:::-;9416:74;;9499:93;9588:3;9499:93;:::i;:::-;9617:2;9612:3;9608:12;9601:19;;9260:366;;;:::o;9632:::-;9774:3;9795:67;9859:2;9854:3;9795:67;:::i;:::-;9788:74;;9871:93;9960:3;9871:93;:::i;:::-;9989:2;9984:3;9980:12;9973:19;;9632:366;;;:::o;10004:::-;10146:3;10167:67;10231:2;10226:3;10167:67;:::i;:::-;10160:74;;10243:93;10332:3;10243:93;:::i;:::-;10361:2;10356:3;10352:12;10345:19;;10004:366;;;:::o;10376:::-;10518:3;10539:67;10603:2;10598:3;10539:67;:::i;:::-;10532:74;;10615:93;10704:3;10615:93;:::i;:::-;10733:2;10728:3;10724:12;10717:19;;10376:366;;;:::o;10748:::-;10890:3;10911:67;10975:2;10970:3;10911:67;:::i;:::-;10904:74;;10987:93;11076:3;10987:93;:::i;:::-;11105:2;11100:3;11096:12;11089:19;;10748:366;;;:::o;11120:::-;11262:3;11283:67;11347:2;11342:3;11283:67;:::i;:::-;11276:74;;11359:93;11448:3;11359:93;:::i;:::-;11477:2;11472:3;11468:12;11461:19;;11120:366;;;:::o;11492:::-;11634:3;11655:67;11719:2;11714:3;11655:67;:::i;:::-;11648:74;;11731:93;11820:3;11731:93;:::i;:::-;11849:2;11844:3;11840:12;11833:19;;11492:366;;;:::o;11864:::-;12006:3;12027:67;12091:2;12086:3;12027:67;:::i;:::-;12020:74;;12103:93;12192:3;12103:93;:::i;:::-;12221:2;12216:3;12212:12;12205:19;;11864:366;;;:::o;12236:::-;12378:3;12399:67;12463:2;12458:3;12399:67;:::i;:::-;12392:74;;12475:93;12564:3;12475:93;:::i;:::-;12593:2;12588:3;12584:12;12577:19;;12236:366;;;:::o;12608:::-;12750:3;12771:67;12835:2;12830:3;12771:67;:::i;:::-;12764:74;;12847:93;12936:3;12847:93;:::i;:::-;12965:2;12960:3;12956:12;12949:19;;12608:366;;;:::o;12980:::-;13122:3;13143:67;13207:2;13202:3;13143:67;:::i;:::-;13136:74;;13219:93;13308:3;13219:93;:::i;:::-;13337:2;13332:3;13328:12;13321:19;;12980:366;;;:::o;13352:::-;13494:3;13515:67;13579:2;13574:3;13515:67;:::i;:::-;13508:74;;13591:93;13680:3;13591:93;:::i;:::-;13709:2;13704:3;13700:12;13693:19;;13352:366;;;:::o;13724:::-;13866:3;13887:67;13951:2;13946:3;13887:67;:::i;:::-;13880:74;;13963:93;14052:3;13963:93;:::i;:::-;14081:2;14076:3;14072:12;14065:19;;13724:366;;;:::o;14096:::-;14238:3;14259:67;14323:2;14318:3;14259:67;:::i;:::-;14252:74;;14335:93;14424:3;14335:93;:::i;:::-;14453:2;14448:3;14444:12;14437:19;;14096:366;;;:::o;14468:::-;14610:3;14631:67;14695:2;14690:3;14631:67;:::i;:::-;14624:74;;14707:93;14796:3;14707:93;:::i;:::-;14825:2;14820:3;14816:12;14809:19;;14468:366;;;:::o;14840:::-;14982:3;15003:67;15067:2;15062:3;15003:67;:::i;:::-;14996:74;;15079:93;15168:3;15079:93;:::i;:::-;15197:2;15192:3;15188:12;15181:19;;14840:366;;;:::o;15212:::-;15354:3;15375:67;15439:2;15434:3;15375:67;:::i;:::-;15368:74;;15451:93;15540:3;15451:93;:::i;:::-;15569:2;15564:3;15560:12;15553:19;;15212:366;;;:::o;15584:::-;15726:3;15747:67;15811:2;15806:3;15747:67;:::i;:::-;15740:74;;15823:93;15912:3;15823:93;:::i;:::-;15941:2;15936:3;15932:12;15925:19;;15584:366;;;:::o;15956:::-;16098:3;16119:67;16183:2;16178:3;16119:67;:::i;:::-;16112:74;;16195:93;16284:3;16195:93;:::i;:::-;16313:2;16308:3;16304:12;16297:19;;15956:366;;;:::o;16328:::-;16470:3;16491:67;16555:2;16550:3;16491:67;:::i;:::-;16484:74;;16567:93;16656:3;16567:93;:::i;:::-;16685:2;16680:3;16676:12;16669:19;;16328:366;;;:::o;16700:::-;16842:3;16863:67;16927:2;16922:3;16863:67;:::i;:::-;16856:74;;16939:93;17028:3;16939:93;:::i;:::-;17057:2;17052:3;17048:12;17041:19;;16700:366;;;:::o;17072:118::-;17159:24;17177:5;17159:24;:::i;:::-;17154:3;17147:37;17072:118;;:::o;17196:435::-;17376:3;17398:95;17489:3;17480:6;17398:95;:::i;:::-;17391:102;;17510:95;17601:3;17592:6;17510:95;:::i;:::-;17503:102;;17622:3;17615:10;;17196:435;;;;;:::o;17637:222::-;17730:4;17768:2;17757:9;17753:18;17745:26;;17781:71;17849:1;17838:9;17834:17;17825:6;17781:71;:::i;:::-;17637:222;;;;:::o;17865:640::-;18060:4;18098:3;18087:9;18083:19;18075:27;;18112:71;18180:1;18169:9;18165:17;18156:6;18112:71;:::i;:::-;18193:72;18261:2;18250:9;18246:18;18237:6;18193:72;:::i;:::-;18275;18343:2;18332:9;18328:18;18319:6;18275:72;:::i;:::-;18394:9;18388:4;18384:20;18379:2;18368:9;18364:18;18357:48;18422:76;18493:4;18484:6;18422:76;:::i;:::-;18414:84;;17865:640;;;;;;;:::o;18511:210::-;18598:4;18636:2;18625:9;18621:18;18613:26;;18649:65;18711:1;18700:9;18696:17;18687:6;18649:65;:::i;:::-;18511:210;;;;:::o;18727:313::-;18840:4;18878:2;18867:9;18863:18;18855:26;;18927:9;18921:4;18917:20;18913:1;18902:9;18898:17;18891:47;18955:78;19028:4;19019:6;18955:78;:::i;:::-;18947:86;;18727:313;;;;:::o;19046:419::-;19212:4;19250:2;19239:9;19235:18;19227:26;;19299:9;19293:4;19289:20;19285:1;19274:9;19270:17;19263:47;19327:131;19453:4;19327:131;:::i;:::-;19319:139;;19046:419;;;:::o;19471:::-;19637:4;19675:2;19664:9;19660:18;19652:26;;19724:9;19718:4;19714:20;19710:1;19699:9;19695:17;19688:47;19752:131;19878:4;19752:131;:::i;:::-;19744:139;;19471:419;;;:::o;19896:::-;20062:4;20100:2;20089:9;20085:18;20077:26;;20149:9;20143:4;20139:20;20135:1;20124:9;20120:17;20113:47;20177:131;20303:4;20177:131;:::i;:::-;20169:139;;19896:419;;;:::o;20321:::-;20487:4;20525:2;20514:9;20510:18;20502:26;;20574:9;20568:4;20564:20;20560:1;20549:9;20545:17;20538:47;20602:131;20728:4;20602:131;:::i;:::-;20594:139;;20321:419;;;:::o;20746:::-;20912:4;20950:2;20939:9;20935:18;20927:26;;20999:9;20993:4;20989:20;20985:1;20974:9;20970:17;20963:47;21027:131;21153:4;21027:131;:::i;:::-;21019:139;;20746:419;;;:::o;21171:::-;21337:4;21375:2;21364:9;21360:18;21352:26;;21424:9;21418:4;21414:20;21410:1;21399:9;21395:17;21388:47;21452:131;21578:4;21452:131;:::i;:::-;21444:139;;21171:419;;;:::o;21596:::-;21762:4;21800:2;21789:9;21785:18;21777:26;;21849:9;21843:4;21839:20;21835:1;21824:9;21820:17;21813:47;21877:131;22003:4;21877:131;:::i;:::-;21869:139;;21596:419;;;:::o;22021:::-;22187:4;22225:2;22214:9;22210:18;22202:26;;22274:9;22268:4;22264:20;22260:1;22249:9;22245:17;22238:47;22302:131;22428:4;22302:131;:::i;:::-;22294:139;;22021:419;;;:::o;22446:::-;22612:4;22650:2;22639:9;22635:18;22627:26;;22699:9;22693:4;22689:20;22685:1;22674:9;22670:17;22663:47;22727:131;22853:4;22727:131;:::i;:::-;22719:139;;22446:419;;;:::o;22871:::-;23037:4;23075:2;23064:9;23060:18;23052:26;;23124:9;23118:4;23114:20;23110:1;23099:9;23095:17;23088:47;23152:131;23278:4;23152:131;:::i;:::-;23144:139;;22871:419;;;:::o;23296:::-;23462:4;23500:2;23489:9;23485:18;23477:26;;23549:9;23543:4;23539:20;23535:1;23524:9;23520:17;23513:47;23577:131;23703:4;23577:131;:::i;:::-;23569:139;;23296:419;;;:::o;23721:::-;23887:4;23925:2;23914:9;23910:18;23902:26;;23974:9;23968:4;23964:20;23960:1;23949:9;23945:17;23938:47;24002:131;24128:4;24002:131;:::i;:::-;23994:139;;23721:419;;;:::o;24146:::-;24312:4;24350:2;24339:9;24335:18;24327:26;;24399:9;24393:4;24389:20;24385:1;24374:9;24370:17;24363:47;24427:131;24553:4;24427:131;:::i;:::-;24419:139;;24146:419;;;:::o;24571:::-;24737:4;24775:2;24764:9;24760:18;24752:26;;24824:9;24818:4;24814:20;24810:1;24799:9;24795:17;24788:47;24852:131;24978:4;24852:131;:::i;:::-;24844:139;;24571:419;;;:::o;24996:::-;25162:4;25200:2;25189:9;25185:18;25177:26;;25249:9;25243:4;25239:20;25235:1;25224:9;25220:17;25213:47;25277:131;25403:4;25277:131;:::i;:::-;25269:139;;24996:419;;;:::o;25421:::-;25587:4;25625:2;25614:9;25610:18;25602:26;;25674:9;25668:4;25664:20;25660:1;25649:9;25645:17;25638:47;25702:131;25828:4;25702:131;:::i;:::-;25694:139;;25421:419;;;:::o;25846:::-;26012:4;26050:2;26039:9;26035:18;26027:26;;26099:9;26093:4;26089:20;26085:1;26074:9;26070:17;26063:47;26127:131;26253:4;26127:131;:::i;:::-;26119:139;;25846:419;;;:::o;26271:::-;26437:4;26475:2;26464:9;26460:18;26452:26;;26524:9;26518:4;26514:20;26510:1;26499:9;26495:17;26488:47;26552:131;26678:4;26552:131;:::i;:::-;26544:139;;26271:419;;;:::o;26696:::-;26862:4;26900:2;26889:9;26885:18;26877:26;;26949:9;26943:4;26939:20;26935:1;26924:9;26920:17;26913:47;26977:131;27103:4;26977:131;:::i;:::-;26969:139;;26696:419;;;:::o;27121:::-;27287:4;27325:2;27314:9;27310:18;27302:26;;27374:9;27368:4;27364:20;27360:1;27349:9;27345:17;27338:47;27402:131;27528:4;27402:131;:::i;:::-;27394:139;;27121:419;;;:::o;27546:::-;27712:4;27750:2;27739:9;27735:18;27727:26;;27799:9;27793:4;27789:20;27785:1;27774:9;27770:17;27763:47;27827:131;27953:4;27827:131;:::i;:::-;27819:139;;27546:419;;;:::o;27971:::-;28137:4;28175:2;28164:9;28160:18;28152:26;;28224:9;28218:4;28214:20;28210:1;28199:9;28195:17;28188:47;28252:131;28378:4;28252:131;:::i;:::-;28244:139;;27971:419;;;:::o;28396:::-;28562:4;28600:2;28589:9;28585:18;28577:26;;28649:9;28643:4;28639:20;28635:1;28624:9;28620:17;28613:47;28677:131;28803:4;28677:131;:::i;:::-;28669:139;;28396:419;;;:::o;28821:222::-;28914:4;28952:2;28941:9;28937:18;28929:26;;28965:71;29033:1;29022:9;29018:17;29009:6;28965:71;:::i;:::-;28821:222;;;;:::o;29049:129::-;29083:6;29110:20;;:::i;:::-;29100:30;;29139:33;29167:4;29159:6;29139:33;:::i;:::-;29049:129;;;:::o;29184:75::-;29217:6;29250:2;29244:9;29234:19;;29184:75;:::o;29265:307::-;29326:4;29416:18;29408:6;29405:30;29402:56;;;29438:18;;:::i;:::-;29402:56;29476:29;29498:6;29476:29;:::i;:::-;29468:37;;29560:4;29554;29550:15;29542:23;;29265:307;;;:::o;29578:308::-;29640:4;29730:18;29722:6;29719:30;29716:56;;;29752:18;;:::i;:::-;29716:56;29790:29;29812:6;29790:29;:::i;:::-;29782:37;;29874:4;29868;29864:15;29856:23;;29578:308;;;:::o;29892:98::-;29943:6;29977:5;29971:12;29961:22;;29892:98;;;:::o;29996:99::-;30048:6;30082:5;30076:12;30066:22;;29996:99;;;:::o;30101:168::-;30184:11;30218:6;30213:3;30206:19;30258:4;30253:3;30249:14;30234:29;;30101:168;;;;:::o;30275:169::-;30359:11;30393:6;30388:3;30381:19;30433:4;30428:3;30424:14;30409:29;;30275:169;;;;:::o;30450:148::-;30552:11;30589:3;30574:18;;30450:148;;;;:::o;30604:305::-;30644:3;30663:20;30681:1;30663:20;:::i;:::-;30658:25;;30697:20;30715:1;30697:20;:::i;:::-;30692:25;;30851:1;30783:66;30779:74;30776:1;30773:81;30770:107;;;30857:18;;:::i;:::-;30770:107;30901:1;30898;30894:9;30887:16;;30604:305;;;;:::o;30915:185::-;30955:1;30972:20;30990:1;30972:20;:::i;:::-;30967:25;;31006:20;31024:1;31006:20;:::i;:::-;31001:25;;31045:1;31035:35;;31050:18;;:::i;:::-;31035:35;31092:1;31089;31085:9;31080:14;;30915:185;;;;:::o;31106:348::-;31146:7;31169:20;31187:1;31169:20;:::i;:::-;31164:25;;31203:20;31221:1;31203:20;:::i;:::-;31198:25;;31391:1;31323:66;31319:74;31316:1;31313:81;31308:1;31301:9;31294:17;31290:105;31287:131;;;31398:18;;:::i;:::-;31287:131;31446:1;31443;31439:9;31428:20;;31106:348;;;;:::o;31460:191::-;31500:4;31520:20;31538:1;31520:20;:::i;:::-;31515:25;;31554:20;31572:1;31554:20;:::i;:::-;31549:25;;31593:1;31590;31587:8;31584:34;;;31598:18;;:::i;:::-;31584:34;31643:1;31640;31636:9;31628:17;;31460:191;;;;:::o;31657:96::-;31694:7;31723:24;31741:5;31723:24;:::i;:::-;31712:35;;31657:96;;;:::o;31759:90::-;31793:7;31836:5;31829:13;31822:21;31811:32;;31759:90;;;:::o;31855:149::-;31891:7;31931:66;31924:5;31920:78;31909:89;;31855:149;;;:::o;32010:126::-;32047:7;32087:42;32080:5;32076:54;32065:65;;32010:126;;;:::o;32142:77::-;32179:7;32208:5;32197:16;;32142:77;;;:::o;32225:154::-;32309:6;32304:3;32299;32286:30;32371:1;32362:6;32357:3;32353:16;32346:27;32225:154;;;:::o;32385:307::-;32453:1;32463:113;32477:6;32474:1;32471:13;32463:113;;;32562:1;32557:3;32553:11;32547:18;32543:1;32538:3;32534:11;32527:39;32499:2;32496:1;32492:10;32487:15;;32463:113;;;32594:6;32591:1;32588:13;32585:101;;;32674:1;32665:6;32660:3;32656:16;32649:27;32585:101;32434:258;32385:307;;;:::o;32698:320::-;32742:6;32779:1;32773:4;32769:12;32759:22;;32826:1;32820:4;32816:12;32847:18;32837:81;;32903:4;32895:6;32891:17;32881:27;;32837:81;32965:2;32957:6;32954:14;32934:18;32931:38;32928:84;;;32984:18;;:::i;:::-;32928:84;32749:269;32698:320;;;:::o;33024:281::-;33107:27;33129:4;33107:27;:::i;:::-;33099:6;33095:40;33237:6;33225:10;33222:22;33201:18;33189:10;33186:34;33183:62;33180:88;;;33248:18;;:::i;:::-;33180:88;33288:10;33284:2;33277:22;33067:238;33024:281;;:::o;33311:233::-;33350:3;33373:24;33391:5;33373:24;:::i;:::-;33364:33;;33419:66;33412:5;33409:77;33406:103;;;33489:18;;:::i;:::-;33406:103;33536:1;33529:5;33525:13;33518:20;;33311:233;;;:::o;33550:176::-;33582:1;33599:20;33617:1;33599:20;:::i;:::-;33594:25;;33633:20;33651:1;33633:20;:::i;:::-;33628:25;;33672:1;33662:35;;33677:18;;:::i;:::-;33662:35;33718:1;33715;33711:9;33706:14;;33550:176;;;;:::o;33732:180::-;33780:77;33777:1;33770:88;33877:4;33874:1;33867:15;33901:4;33898:1;33891:15;33918:180;33966:77;33963:1;33956:88;34063:4;34060:1;34053:15;34087:4;34084:1;34077:15;34104:180;34152:77;34149:1;34142:88;34249:4;34246:1;34239:15;34273:4;34270:1;34263:15;34290:180;34338:77;34335:1;34328:88;34435:4;34432:1;34425:15;34459:4;34456:1;34449:15;34476:180;34524:77;34521:1;34514:88;34621:4;34618:1;34611:15;34645:4;34642:1;34635:15;34662:180;34710:77;34707:1;34700:88;34807:4;34804:1;34797:15;34831:4;34828:1;34821:15;34848:117;34957:1;34954;34947:12;34971:117;35080:1;35077;35070:12;35094:117;35203:1;35200;35193:12;35217:117;35326:1;35323;35316:12;35340:102;35381:6;35432:2;35428:7;35423:2;35416:5;35412:14;35408:28;35398:38;;35340:102;;;:::o;35448:230::-;35588:34;35584:1;35576:6;35572:14;35565:58;35657:13;35652:2;35644:6;35640:15;35633:38;35448:230;:::o;35684:237::-;35824:34;35820:1;35812:6;35808:14;35801:58;35893:20;35888:2;35880:6;35876:15;35869:45;35684:237;:::o;35927:225::-;36067:34;36063:1;36055:6;36051:14;36044:58;36136:8;36131:2;36123:6;36119:15;36112:33;35927:225;:::o;36158:178::-;36298:30;36294:1;36286:6;36282:14;36275:54;36158:178;:::o;36342:223::-;36482:34;36478:1;36470:6;36466:14;36459:58;36551:6;36546:2;36538:6;36534:15;36527:31;36342:223;:::o;36571:175::-;36711:27;36707:1;36699:6;36695:14;36688:51;36571:175;:::o;36752:231::-;36892:34;36888:1;36880:6;36876:14;36869:58;36961:14;36956:2;36948:6;36944:15;36937:39;36752:231;:::o;36989:243::-;37129:34;37125:1;37117:6;37113:14;37106:58;37198:26;37193:2;37185:6;37181:15;37174:51;36989:243;:::o;37238:229::-;37378:34;37374:1;37366:6;37362:14;37355:58;37447:12;37442:2;37434:6;37430:15;37423:37;37238:229;:::o;37473:228::-;37613:34;37609:1;37601:6;37597:14;37590:58;37682:11;37677:2;37669:6;37665:15;37658:36;37473:228;:::o;37707:182::-;37847:34;37843:1;37835:6;37831:14;37824:58;37707:182;:::o;37895:231::-;38035:34;38031:1;38023:6;38019:14;38012:58;38104:14;38099:2;38091:6;38087:15;38080:39;37895:231;:::o;38132:182::-;38272:34;38268:1;38260:6;38256:14;38249:58;38132:182;:::o;38320:228::-;38460:34;38456:1;38448:6;38444:14;38437:58;38529:11;38524:2;38516:6;38512:15;38505:36;38320:228;:::o;38554:234::-;38694:34;38690:1;38682:6;38678:14;38671:58;38763:17;38758:2;38750:6;38746:15;38739:42;38554:234;:::o;38794:223::-;38934:34;38930:1;38922:6;38918:14;38911:58;39003:6;38998:2;38990:6;38986:15;38979:31;38794:223;:::o;39023:220::-;39163:34;39159:1;39151:6;39147:14;39140:58;39232:3;39227:2;39219:6;39215:15;39208:28;39023:220;:::o;39249:181::-;39389:33;39385:1;39377:6;39373:14;39366:57;39249:181;:::o;39436:224::-;39576:34;39572:1;39564:6;39560:14;39553:58;39645:7;39640:2;39632:6;39628:15;39621:32;39436:224;:::o;39666:182::-;39806:34;39802:1;39794:6;39790:14;39783:58;39666:182;:::o;39854:236::-;39994:34;39990:1;39982:6;39978:14;39971:58;40063:19;40058:2;40050:6;40046:15;40039:44;39854:236;:::o;40096:231::-;40236:34;40232:1;40224:6;40220:14;40213:58;40305:14;40300:2;40292:6;40288:15;40281:39;40096:231;:::o;40333:182::-;40473:34;40469:1;40461:6;40457:14;40450:58;40333:182;:::o;40521:122::-;40594:24;40612:5;40594:24;:::i;:::-;40587:5;40584:35;40574:63;;40633:1;40630;40623:12;40574:63;40521:122;:::o;40649:116::-;40719:21;40734:5;40719:21;:::i;:::-;40712:5;40709:32;40699:60;;40755:1;40752;40745:12;40699:60;40649:116;:::o;40771:120::-;40843:23;40860:5;40843:23;:::i;:::-;40836:5;40833:34;40823:62;;40881:1;40878;40871:12;40823:62;40771:120;:::o;40897:122::-;40970:24;40988:5;40970:24;:::i;:::-;40963:5;40960:35;40950:63;;41009:1;41006;40999:12;40950:63;40897:122;:::o

Swarm Source

ipfs://3b6f4f87f68287391e7b3a601099339e36096e22807c26ab0f4d1a67495a1839
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.