ETH Price: $3,309.84 (-3.62%)
Gas: 18 Gwei

Token

Kevin3L (Kevin3L)
 

Overview

Max Total Supply

1,088 Kevin3L

Holders

161

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
wa1do.eth
Balance
10 Kevin3L
0x85b826b5eb230d03ce1bb41ded646909bf0c3f4e
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:
Kevin3L

Compiler Version
v0.8.4+commit.c7e474f2

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-03-03
*/

// Sources flattened with hardhat v2.8.4 https://hardhat.org

// File @openzeppelin/contracts/utils/[email protected]


// OpenZeppelin Contracts v4.4.1 (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/[email protected]


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

pragma solidity ^0.8.0;

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

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _transferOwnership(_msgSender());
    }

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

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

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

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

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


// File @openzeppelin/contracts/security/[email protected]


// OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol)

pragma solidity ^0.8.0;

/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and making it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        // On the first call to nonReentrant, _notEntered will be true
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;

        _;

        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }
}


// File @openzeppelin/contracts/utils/introspection/[email protected]


// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

pragma solidity ^0.8.0;

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


// File @openzeppelin/contracts/token/ERC721/[email protected]


// OpenZeppelin Contracts v4.4.1 (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/[email protected]


// OpenZeppelin Contracts v4.4.1 (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/token/ERC721/extensions/[email protected]


// OpenZeppelin Contracts v4.4.1 (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/extensions/[email protected]


// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol)

pragma solidity ^0.8.0;

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

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

    /**
     * @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/utils/[email protected]


// OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol)

pragma solidity ^0.8.1;

/**
 * @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
     * ====
     *
     * [IMPORTANT]
     * ====
     * You shouldn't rely on `isContract` to protect against flash loan attacks!
     *
     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
     * constructor.
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.

        return account.code.length > 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/utils/[email protected]


// OpenZeppelin Contracts v4.4.1 (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/introspection/[email protected]


// OpenZeppelin Contracts v4.4.1 (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 erc721a/contracts/[email protected]


// Creator: Chiru Labs

pragma solidity ^0.8.4;








error ApprovalCallerNotOwnerNorApproved();
error ApprovalQueryForNonexistentToken();
error ApproveToCaller();
error ApprovalToCurrentOwner();
error BalanceQueryForZeroAddress();
error MintedQueryForZeroAddress();
error BurnedQueryForZeroAddress();
error MintToZeroAddress();
error MintZeroQuantity();
error OwnerIndexOutOfBounds();
error OwnerQueryForNonexistentToken();
error TokenIndexOutOfBounds();
error TransferCallerNotOwnerNorApproved();
error TransferFromIncorrectOwner();
error TransferToNonERC721ReceiverImplementer();
error TransferToZeroAddress();
error URIQueryForNonexistentToken();

/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata and Enumerable extension. Built to optimize for lower gas during batch mints.
 *
 * Assumes serials are sequentially minted starting at 0 (e.g. 0, 1, 2, 3..).
 *
 * Assumes that an owner cannot have more than 2**64 - 1 (max value of uint64) of supply.
 *
 * Assumes that the maximum token id cannot exceed 2**128 - 1 (max value of uint128).
 */
contract ERC721A is Context, ERC165, IERC721, IERC721Metadata, IERC721Enumerable {
    using Address for address;
    using Strings for uint256;

    // Compiler will pack this into a single 256bit word.
    struct TokenOwnership {
        // The address of the owner.
        address addr;
        // Keeps track of the start time of ownership with minimal overhead for tokenomics.
        uint64 startTimestamp;
        // Whether the token has been burned.
        bool burned;
    }

    // Compiler will pack this into a single 256bit word.
    struct AddressData {
        // Realistically, 2**64-1 is more than enough.
        uint64 balance;
        // Keeps track of mint count with minimal overhead for tokenomics.
        uint64 numberMinted;
        // Keeps track of burn count with minimal overhead for tokenomics.
        uint64 numberBurned;
    }

    // Compiler will pack the following 
    // _currentIndex and _burnCounter into a single 256bit word.
    
    // The tokenId of the next token to be minted.
    uint128 internal _currentIndex;

    // The number of tokens burned.
    uint128 internal _burnCounter;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to ownership details
    // An empty struct value does not necessarily mean the token is unowned. See ownershipOf implementation for details.
    mapping(uint256 => TokenOwnership) internal _ownerships;

    // Mapping owner address to address data
    mapping(address => AddressData) private _addressData;

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

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

    /**
     * @dev See {IERC721Enumerable-totalSupply}.
     */
    function totalSupply() public view override returns (uint256) {
        // Counter underflow is impossible as _burnCounter cannot be incremented
        // more than _currentIndex times
        unchecked {
            return _currentIndex - _burnCounter;    
        }
    }

    /**
     * @dev See {IERC721Enumerable-tokenByIndex}.
     * This read function is O(totalSupply). If calling from a separate contract, be sure to test gas first.
     * It may also degrade with extremely large collection sizes (e.g >> 10000), test for your use case.
     */
    function tokenByIndex(uint256 index) public view override returns (uint256) {
        uint256 numMintedSoFar = _currentIndex;
        uint256 tokenIdsIdx;

        // Counter overflow is impossible as the loop breaks when
        // uint256 i is equal to another uint256 numMintedSoFar.
        unchecked {
            for (uint256 i; i < numMintedSoFar; i++) {
                TokenOwnership memory ownership = _ownerships[i];
                if (!ownership.burned) {
                    if (tokenIdsIdx == index) {
                        return i;
                    }
                    tokenIdsIdx++;
                }
            }
        }
        revert TokenIndexOutOfBounds();
    }

    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     * This read function is O(totalSupply). If calling from a separate contract, be sure to test gas first.
     * It may also degrade with extremely large collection sizes (e.g >> 10000), test for your use case.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) public view override returns (uint256) {
        if (index >= balanceOf(owner)) revert OwnerIndexOutOfBounds();
        uint256 numMintedSoFar = _currentIndex;
        uint256 tokenIdsIdx;
        address currOwnershipAddr;

        // Counter overflow is impossible as the loop breaks when
        // uint256 i is equal to another uint256 numMintedSoFar.
        unchecked {
            for (uint256 i; i < numMintedSoFar; i++) {
                TokenOwnership memory ownership = _ownerships[i];
                if (ownership.burned) {
                    continue;
                }
                if (ownership.addr != address(0)) {
                    currOwnershipAddr = ownership.addr;
                }
                if (currOwnershipAddr == owner) {
                    if (tokenIdsIdx == index) {
                        return i;
                    }
                    tokenIdsIdx++;
                }
            }
        }

        // Execution should never reach this point.
        revert();
    }

    /**
     * @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 ||
            interfaceId == type(IERC721Enumerable).interfaceId ||
            super.supportsInterface(interfaceId);
    }

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view override returns (uint256) {
        if (owner == address(0)) revert BalanceQueryForZeroAddress();
        return uint256(_addressData[owner].balance);
    }

    function _numberMinted(address owner) internal view returns (uint256) {
        if (owner == address(0)) revert MintedQueryForZeroAddress();
        return uint256(_addressData[owner].numberMinted);
    }

    function _numberBurned(address owner) internal view returns (uint256) {
        if (owner == address(0)) revert BurnedQueryForZeroAddress();
        return uint256(_addressData[owner].numberBurned);
    }

    /**
     * Gas spent here starts off proportional to the maximum mint batch size.
     * It gradually moves to O(1) as tokens get transferred around in the collection over time.
     */
    function ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) {
        uint256 curr = tokenId;

        unchecked {
            if (curr < _currentIndex) {
                TokenOwnership memory ownership = _ownerships[curr];
                if (!ownership.burned) {
                    if (ownership.addr != address(0)) {
                        return ownership;
                    }
                    // Invariant: 
                    // There will always be an ownership that has an address and is not burned 
                    // before an ownership that does not have an address and is not burned.
                    // Hence, curr will not underflow.
                    while (true) {
                        curr--;
                        ownership = _ownerships[curr];
                        if (ownership.addr != address(0)) {
                            return ownership;
                        }
                    }
                }
            }
        }
        revert OwnerQueryForNonexistentToken();
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view override returns (address) {
        return ownershipOf(tokenId).addr;
    }

    /**
     * @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) {
        if (!_exists(tokenId)) revert URIQueryForNonexistentToken();

        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 override {
        address owner = ERC721A.ownerOf(tokenId);
        if (to == owner) revert ApprovalToCurrentOwner();

        if (_msgSender() != owner && !isApprovedForAll(owner, _msgSender())) {
            revert ApprovalCallerNotOwnerNorApproved();
        }

        _approve(to, tokenId, owner);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view override returns (address) {
        if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken();

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public override {
        if (operator == _msgSender()) revert ApproveToCaller();

        _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 {
        _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 {
        _transfer(from, to, tokenId);
        if (!_checkOnERC721Received(from, to, tokenId, _data)) {
            revert TransferToNonERC721ReceiverImplementer();
        }
    }

    /**
     * @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`),
     */
    function _exists(uint256 tokenId) internal view returns (bool) {
        return tokenId < _currentIndex && !_ownerships[tokenId].burned;
    }

    function _safeMint(address to, uint256 quantity) internal {
        _safeMint(to, quantity, '');
    }

    /**
     * @dev Safely mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called for each safe transfer.
     * - `quantity` must be greater than 0.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(
        address to,
        uint256 quantity,
        bytes memory _data
    ) internal {
        _mint(to, quantity, _data, true);
    }

    /**
     * @dev Mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `quantity` must be greater than 0.
     *
     * Emits a {Transfer} event.
     */
    function _mint(
        address to,
        uint256 quantity,
        bytes memory _data,
        bool safe
    ) internal {
        uint256 startTokenId = _currentIndex;
        if (to == address(0)) revert MintToZeroAddress();
        if (quantity == 0) revert MintZeroQuantity();

        _beforeTokenTransfers(address(0), to, startTokenId, quantity);

        // Overflows are incredibly unrealistic.
        // balance or numberMinted overflow if current value of either + quantity > 3.4e38 (2**128) - 1
        // updatedIndex overflows if _currentIndex + quantity > 3.4e38 (2**128) - 1
        unchecked {
            _addressData[to].balance += uint64(quantity);
            _addressData[to].numberMinted += uint64(quantity);

            _ownerships[startTokenId].addr = to;
            _ownerships[startTokenId].startTimestamp = uint64(block.timestamp);

            uint256 updatedIndex = startTokenId;

            for (uint256 i; i < quantity; i++) {
                emit Transfer(address(0), to, updatedIndex);
                if (safe && !_checkOnERC721Received(address(0), to, updatedIndex, _data)) {
                    revert TransferToNonERC721ReceiverImplementer();
                }
                updatedIndex++;
            }

            _currentIndex = uint128(updatedIndex);
        }
        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *
     * 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
    ) private {
        TokenOwnership memory prevOwnership = ownershipOf(tokenId);

        bool isApprovedOrOwner = (_msgSender() == prevOwnership.addr ||
            isApprovedForAll(prevOwnership.addr, _msgSender()) ||
            getApproved(tokenId) == _msgSender());

        if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        if (prevOwnership.addr != from) revert TransferFromIncorrectOwner();
        if (to == address(0)) revert TransferToZeroAddress();

        _beforeTokenTransfers(from, to, tokenId, 1);

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

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        // Counter overflow is incredibly unrealistic as tokenId would have to be 2**128.
        unchecked {
            _addressData[from].balance -= 1;
            _addressData[to].balance += 1;

            _ownerships[tokenId].addr = to;
            _ownerships[tokenId].startTimestamp = uint64(block.timestamp);

            // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it.
            // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
            uint256 nextTokenId = tokenId + 1;
            if (_ownerships[nextTokenId].addr == address(0)) {
                // This will suffice for checking _exists(nextTokenId),
                // as a burned slot cannot contain the zero address.
                if (nextTokenId < _currentIndex) {
                    _ownerships[nextTokenId].addr = prevOwnership.addr;
                    _ownerships[nextTokenId].startTimestamp = prevOwnership.startTimestamp;
                }
            }
        }

        emit Transfer(from, to, tokenId);
        _afterTokenTransfers(from, to, tokenId, 1);
    }

    /**
     * @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 {
        TokenOwnership memory prevOwnership = ownershipOf(tokenId);

        _beforeTokenTransfers(prevOwnership.addr, address(0), tokenId, 1);

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

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        // Counter overflow is incredibly unrealistic as tokenId would have to be 2**128.
        unchecked {
            _addressData[prevOwnership.addr].balance -= 1;
            _addressData[prevOwnership.addr].numberBurned += 1;

            // Keep track of who burned the token, and the timestamp of burning.
            _ownerships[tokenId].addr = prevOwnership.addr;
            _ownerships[tokenId].startTimestamp = uint64(block.timestamp);
            _ownerships[tokenId].burned = true;

            // If the ownership slot of tokenId+1 is not explicitly set, that means the burn initiator owns it.
            // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
            uint256 nextTokenId = tokenId + 1;
            if (_ownerships[nextTokenId].addr == address(0)) {
                // This will suffice for checking _exists(nextTokenId),
                // as a burned slot cannot contain the zero address.
                if (nextTokenId < _currentIndex) {
                    _ownerships[nextTokenId].addr = prevOwnership.addr;
                    _ownerships[nextTokenId].startTimestamp = prevOwnership.startTimestamp;
                }
            }
        }

        emit Transfer(prevOwnership.addr, address(0), tokenId);
        _afterTokenTransfers(prevOwnership.addr, address(0), tokenId, 1);

        // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times.
        unchecked { 
            _burnCounter++;
        }
    }

    /**
     * @dev Approve `to` to operate on `tokenId`
     *
     * Emits a {Approval} event.
     */
    function _approve(
        address to,
        uint256 tokenId,
        address owner
    ) private {
        _tokenApprovals[tokenId] = to;
        emit Approval(owner, 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(to).onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert TransferToNonERC721ReceiverImplementer();
                } else {
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

    /**
     * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting.
     * And also called before burning one token.
     *
     * startTokenId - the first token id to be transferred
     * quantity - the amount to be transferred
     *
     * 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, `tokenId` will be burned by `from`.
     * - `from` and `to` are never both zero.
     */
    function _beforeTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}

    /**
     * @dev Hook that is called after a set of serially-ordered token ids have been transferred. This includes
     * minting.
     * And also called after one token has been burned.
     *
     * startTokenId - the first token id to be transferred
     * quantity - the amount to be transferred
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been
     * transferred to `to`.
     * - When `from` is zero, `tokenId` has been minted for `to`.
     * - When `to` is zero, `tokenId` has been burned by `from`.
     * - `from` and `to` are never both zero.
     */
    function _afterTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}
}


// File contracts/Kevin3L.sol

//SPDX-License-Identifier: MIT
pragma solidity ^0.8.4;



contract Kevin3L is Ownable, ERC721A, ReentrancyGuard {
    uint256 public immutable maxQty = 2000;
    uint256 public immutable firstFree = 1000;
    uint256 public immutable mintPrice = 0.01 ether;
    uint256 public immutable maxMintPerAddr = 10;
    string private _baseTokenURI;

    constructor(string memory baseURI)
        ERC721A("Kevin3L", "Kevin3L")
    {
        _baseTokenURI = baseURI;
    }

    function mint(uint256 quantity) external payable nonReentrant {
        require(tx.origin == msg.sender, "Contracts not allowed");
        uint256 totalsupply = totalSupply();
        require(totalsupply + quantity <= maxQty, "Exceed sales max limit");
        require(
            numberMinted(msg.sender) + quantity <= maxMintPerAddr,
            "cannot mint this many"
        );
        if(totalsupply >= firstFree) {
            uint256 cost;
            unchecked {
                cost = quantity * mintPrice;
            }
            require(msg.value == cost, "wrong payment");
        }
        _safeMint(msg.sender, quantity);
    }

    function numberMinted(address owner) public view returns (uint256) {
        return _numberMinted(owner);
    }

    function _baseURI() internal view virtual override returns (string memory) {
        return _baseTokenURI;
    }

    function setBaseURI(string calldata baseURI) external onlyOwner {
        _baseTokenURI = baseURI;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"MintedQueryForZeroAddress","type":"error"},{"inputs":[],"name":"OwnerIndexOutOfBounds","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TokenIndexOutOfBounds","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"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":"firstFree","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintPerAddr","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxQty","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"numberMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"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"}]

6101006040526107d06080908152506103e860a090815250662386f26fc1000060c090815250600a60e0908152503480156200003a57600080fd5b5060405162003ccc38038062003ccc833981810160405281019062000060919062000336565b6040518060400160405280600781526020017f4b6576696e334c000000000000000000000000000000000000000000000000008152506040518060400160405280600781526020017f4b6576696e334c00000000000000000000000000000000000000000000000000815250620000ec620000e06200014860201b60201c565b6200015060201b60201c565b81600290805190602001906200010492919062000214565b5080600390805190602001906200011d92919062000214565b505050600160088190555080600990805190602001906200014092919062000214565b5050620004eb565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620002229062000410565b90600052602060002090601f01602090048101928262000246576000855562000292565b82601f106200026157805160ff191683800117855562000292565b8280016001018555821562000292579182015b828111156200029157825182559160200191906001019062000274565b5b509050620002a19190620002a5565b5090565b5b80821115620002c0576000816000905550600101620002a6565b5090565b6000620002db620002d584620003a4565b6200037b565b905082815260208101848484011115620002f457600080fd5b62000301848285620003da565b509392505050565b600082601f8301126200031b57600080fd5b81516200032d848260208601620002c4565b91505092915050565b6000602082840312156200034957600080fd5b600082015167ffffffffffffffff8111156200036457600080fd5b620003728482850162000309565b91505092915050565b6000620003876200039a565b905062000395828262000446565b919050565b6000604051905090565b600067ffffffffffffffff821115620003c257620003c1620004ab565b5b620003cd82620004da565b9050602081019050919050565b60005b83811015620003fa578082015181840152602081019050620003dd565b838111156200040a576000848401525b50505050565b600060028204905060018216806200042957607f821691505b6020821081141562000440576200043f6200047c565b5b50919050565b6200045182620004da565b810181811067ffffffffffffffff82111715620004735762000472620004ab565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b60805160a05160c05160e05161378b62000541600039600081816111d201526114df015260008181610e65015261127101526000818161124801526114680152600081816111640152611503015261378b6000f3fe6080604052600436106101815760003560e01c8063715018a6116100d1578063b88d4fde1161008a578063c87b56dd11610064578063c87b56dd14610575578063dc33e681146105b2578063e985e9c5146105ef578063f2fde38b1461062c57610181565b8063b88d4fde146104f6578063c1dffe321461051f578063c7a954801461054a57610181565b8063715018a6146104195780638da5cb5b1461043057806395d89b411461045b578063a0712d6814610486578063a22cb465146104a2578063b4654a43146104cb57610181565b80632f745c591161013e57806355f804b31161011857806355f804b31461034b5780636352211e146103745780636817c76c146103b157806370a08231146103dc57610181565b80632f745c59146102a857806342842e0e146102e55780634f6ccce71461030e57610181565b806301ffc9a71461018657806306fdde03146101c3578063081812fc146101ee578063095ea7b31461022b57806318160ddd1461025457806323b872dd1461027f575b600080fd5b34801561019257600080fd5b506101ad60048036038101906101a89190612db8565b610655565b6040516101ba91906130c8565b60405180910390f35b3480156101cf57600080fd5b506101d861079f565b6040516101e591906130e3565b60405180910390f35b3480156101fa57600080fd5b5061021560048036038101906102109190612e4f565b610831565b6040516102229190613061565b60405180910390f35b34801561023757600080fd5b50610252600480360381019061024d9190612d7c565b6108ad565b005b34801561026057600080fd5b506102696109b8565b60405161027691906131e5565b60405180910390f35b34801561028b57600080fd5b506102a660048036038101906102a19190612c76565b610a10565b005b3480156102b457600080fd5b506102cf60048036038101906102ca9190612d7c565b610a20565b6040516102dc91906131e5565b60405180910390f35b3480156102f157600080fd5b5061030c60048036038101906103079190612c76565b610c28565b005b34801561031a57600080fd5b5061033560048036038101906103309190612e4f565b610c48565b60405161034291906131e5565b60405180910390f35b34801561035757600080fd5b50610372600480360381019061036d9190612e0a565b610dbb565b005b34801561038057600080fd5b5061039b60048036038101906103969190612e4f565b610e4d565b6040516103a89190613061565b60405180910390f35b3480156103bd57600080fd5b506103c6610e63565b6040516103d391906131e5565b60405180910390f35b3480156103e857600080fd5b5061040360048036038101906103fe9190612c11565b610e87565b60405161041091906131e5565b60405180910390f35b34801561042557600080fd5b5061042e610f57565b005b34801561043c57600080fd5b50610445610fdf565b6040516104529190613061565b60405180910390f35b34801561046757600080fd5b50610470611008565b60405161047d91906130e3565b60405180910390f35b6104a0600480360381019061049b9190612e4f565b61109a565b005b3480156104ae57600080fd5b506104c960048036038101906104c49190612d40565b6112ee565b005b3480156104d757600080fd5b506104e0611466565b6040516104ed91906131e5565b60405180910390f35b34801561050257600080fd5b5061051d60048036038101906105189190612cc5565b61148a565b005b34801561052b57600080fd5b506105346114dd565b60405161054191906131e5565b60405180910390f35b34801561055657600080fd5b5061055f611501565b60405161056c91906131e5565b60405180910390f35b34801561058157600080fd5b5061059c60048036038101906105979190612e4f565b611525565b6040516105a991906130e3565b60405180910390f35b3480156105be57600080fd5b506105d960048036038101906105d49190612c11565b6115c4565b6040516105e691906131e5565b60405180910390f35b3480156105fb57600080fd5b5061061660048036038101906106119190612c3a565b6115d6565b60405161062391906130c8565b60405180910390f35b34801561063857600080fd5b50610653600480360381019061064e9190612c11565b61166a565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061072057507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061078857507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610798575061079782611762565b5b9050919050565b6060600280546107ae9061340a565b80601f01602080910402602001604051908101604052809291908181526020018280546107da9061340a565b80156108275780601f106107fc57610100808354040283529160200191610827565b820191906000526020600020905b81548152906001019060200180831161080a57829003601f168201915b5050505050905090565b600061083c826117cc565b610872576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006108b882610e4d565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610920576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661093f611835565b73ffffffffffffffffffffffffffffffffffffffff1614158015610971575061096f8161096a611835565b6115d6565b155b156109a8576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6109b383838361183d565b505050565b6000600160109054906101000a90046fffffffffffffffffffffffffffffffff16600160009054906101000a90046fffffffffffffffffffffffffffffffff16036fffffffffffffffffffffffffffffffff16905090565b610a1b8383836118ef565b505050565b6000610a2b83610e87565b8210610a63576040517f0ddac30e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000600160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16905060008060005b83811015610c1c576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050806040015115610b7b5750610c0f565b600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614610bbb57806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610c0d5786841415610c04578195505050505050610c22565b83806001019450505b505b8080600101915050610a9e565b50600080fd5b92915050565b610c438383836040518060200160405280600081525061148a565b505050565b600080600160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1690506000805b82811015610d83576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff16151515158152505090508060400151610d755785831415610d6c5781945050505050610db6565b82806001019350505b508080600101915050610c82565b506040517fa723001c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b610dc3611835565b73ffffffffffffffffffffffffffffffffffffffff16610de1610fdf565b73ffffffffffffffffffffffffffffffffffffffff1614610e37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e2e90613165565b60405180910390fd5b818160099190610e48929190612a10565b505050565b6000610e5882611e0e565b600001519050919050565b7f000000000000000000000000000000000000000000000000000000000000000081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610eef576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b610f5f611835565b73ffffffffffffffffffffffffffffffffffffffff16610f7d610fdf565b73ffffffffffffffffffffffffffffffffffffffff1614610fd3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fca90613165565b60405180910390fd5b610fdd60006120b8565b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600380546110179061340a565b80601f01602080910402602001604051908101604052809291908181526020018280546110439061340a565b80156110905780601f1061106557610100808354040283529160200191611090565b820191906000526020600020905b81548152906001019060200180831161107357829003601f168201915b5050505050905090565b600260085414156110e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110d7906131c5565b60405180910390fd5b60026008819055503373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614611156576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161114d90613185565b60405180910390fd5b60006111606109b8565b90507f0000000000000000000000000000000000000000000000000000000000000000828261118f9190613299565b11156111d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111c790613145565b60405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000000000826111fb336115c4565b6112059190613299565b1115611246576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161123d906131a5565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000081106112d85760007f0000000000000000000000000000000000000000000000000000000000000000830290508034146112d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112cd90613125565b60405180910390fd5b505b6112e2338361217c565b50600160088190555050565b6112f6611835565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561135b576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000611368611835565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611415611835565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161145a91906130c8565b60405180910390a35050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6114958484846118ef565b6114a18484848461219a565b6114d7576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b6060611530826117cc565b611566576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000611570612328565b905060008151141561159157604051806020016040528060008152506115bc565b8061159b846123ba565b6040516020016115ac92919061303d565b6040516020818303038152906040525b915050919050565b60006115cf82612567565b9050919050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611672611835565b73ffffffffffffffffffffffffffffffffffffffff16611690610fdf565b73ffffffffffffffffffffffffffffffffffffffff16146116e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116dd90613165565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611756576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174d90613105565b60405180910390fd5b61175f816120b8565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6000600160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff168210801561182e575060046000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b600033905090565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006118fa82611e0e565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff16611921611835565b73ffffffffffffffffffffffffffffffffffffffff1614806119545750611953826000015161194e611835565b6115d6565b5b806119995750611962611835565b73ffffffffffffffffffffffffffffffffffffffff1661198184610831565b73ffffffffffffffffffffffffffffffffffffffff16145b9050806119d2576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614611a3b576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611aa2576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611aaf8585856001612637565b611abf600084846000015161183d565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550836004600085815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600085815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600184019050600073ffffffffffffffffffffffffffffffffffffffff166004600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415611d9e57600160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16811015611d9d5782600001516004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082602001516004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b50828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611e07858585600161263d565b5050505050565b611e16612a96565b6000829050600160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16811015612081576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050806040015161207f57600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614611f635780925050506120b3565b5b60011561207e57818060019003925050600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146120795780925050506120b3565b611f64565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612196828260405180602001604052806000815250612643565b5050565b60006121bb8473ffffffffffffffffffffffffffffffffffffffff16612655565b1561231b578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026121e4611835565b8786866040518563ffffffff1660e01b8152600401612206949392919061307c565b602060405180830381600087803b15801561222057600080fd5b505af192505050801561225157506040513d601f19601f8201168201806040525081019061224e9190612de1565b60015b6122cb573d8060008114612281576040519150601f19603f3d011682016040523d82523d6000602084013e612286565b606091505b506000815114156122c3576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612320565b600190505b949350505050565b6060600980546123379061340a565b80601f01602080910402602001604051908101604052809291908181526020018280546123639061340a565b80156123b05780601f10612385576101008083540402835291602001916123b0565b820191906000526020600020905b81548152906001019060200180831161239357829003601f168201915b5050505050905090565b60606000821415612402576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612562565b600082905060005b6000821461243457808061241d9061346d565b915050600a8261242d91906132ef565b915061240a565b60008167ffffffffffffffff811115612476577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156124a85781602001600182028036833780820191505090505b5090505b6000851461255b576001826124c19190613320565b9150600a856124d091906134b6565b60306124dc9190613299565b60f81b818381518110612518577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561255491906132ef565b94506124ac565b8093505050505b919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156125cf576040517f35ebb31900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160089054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b50505050565b50505050565b6126508383836001612678565b505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6000600160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415612714576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600084141561274f576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61275c6000868387612637565b83600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600081905060005b858110156129c157818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48380156129755750612973600088848861219a565b155b156129ac576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b818060010192505080806001019150506128fa565b5080600160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555050612a09600086838761263d565b5050505050565b828054612a1c9061340a565b90600052602060002090601f016020900481019282612a3e5760008555612a85565b82601f10612a5757803560ff1916838001178555612a85565b82800160010185558215612a85579182015b82811115612a84578235825591602001919060010190612a69565b5b509050612a929190612ad9565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b80821115612af2576000816000905550600101612ada565b5090565b6000612b09612b0484613225565b613200565b905082815260208101848484011115612b2157600080fd5b612b2c8482856133c8565b509392505050565b600081359050612b43816136f9565b92915050565b600081359050612b5881613710565b92915050565b600081359050612b6d81613727565b92915050565b600081519050612b8281613727565b92915050565b600082601f830112612b9957600080fd5b8135612ba9848260208601612af6565b91505092915050565b60008083601f840112612bc457600080fd5b8235905067ffffffffffffffff811115612bdd57600080fd5b602083019150836001820283011115612bf557600080fd5b9250929050565b600081359050612c0b8161373e565b92915050565b600060208284031215612c2357600080fd5b6000612c3184828501612b34565b91505092915050565b60008060408385031215612c4d57600080fd5b6000612c5b85828601612b34565b9250506020612c6c85828601612b34565b9150509250929050565b600080600060608486031215612c8b57600080fd5b6000612c9986828701612b34565b9350506020612caa86828701612b34565b9250506040612cbb86828701612bfc565b9150509250925092565b60008060008060808587031215612cdb57600080fd5b6000612ce987828801612b34565b9450506020612cfa87828801612b34565b9350506040612d0b87828801612bfc565b925050606085013567ffffffffffffffff811115612d2857600080fd5b612d3487828801612b88565b91505092959194509250565b60008060408385031215612d5357600080fd5b6000612d6185828601612b34565b9250506020612d7285828601612b49565b9150509250929050565b60008060408385031215612d8f57600080fd5b6000612d9d85828601612b34565b9250506020612dae85828601612bfc565b9150509250929050565b600060208284031215612dca57600080fd5b6000612dd884828501612b5e565b91505092915050565b600060208284031215612df357600080fd5b6000612e0184828501612b73565b91505092915050565b60008060208385031215612e1d57600080fd5b600083013567ffffffffffffffff811115612e3757600080fd5b612e4385828601612bb2565b92509250509250929050565b600060208284031215612e6157600080fd5b6000612e6f84828501612bfc565b91505092915050565b612e8181613354565b82525050565b612e9081613366565b82525050565b6000612ea182613256565b612eab818561326c565b9350612ebb8185602086016133d7565b612ec4816135a3565b840191505092915050565b6000612eda82613261565b612ee4818561327d565b9350612ef48185602086016133d7565b612efd816135a3565b840191505092915050565b6000612f1382613261565b612f1d818561328e565b9350612f2d8185602086016133d7565b80840191505092915050565b6000612f4660268361327d565b9150612f51826135b4565b604082019050919050565b6000612f69600d8361327d565b9150612f7482613603565b602082019050919050565b6000612f8c60168361327d565b9150612f978261362c565b602082019050919050565b6000612faf60208361327d565b9150612fba82613655565b602082019050919050565b6000612fd260158361327d565b9150612fdd8261367e565b602082019050919050565b6000612ff560158361327d565b9150613000826136a7565b602082019050919050565b6000613018601f8361327d565b9150613023826136d0565b602082019050919050565b613037816133be565b82525050565b60006130498285612f08565b91506130558284612f08565b91508190509392505050565b60006020820190506130766000830184612e78565b92915050565b60006080820190506130916000830187612e78565b61309e6020830186612e78565b6130ab604083018561302e565b81810360608301526130bd8184612e96565b905095945050505050565b60006020820190506130dd6000830184612e87565b92915050565b600060208201905081810360008301526130fd8184612ecf565b905092915050565b6000602082019050818103600083015261311e81612f39565b9050919050565b6000602082019050818103600083015261313e81612f5c565b9050919050565b6000602082019050818103600083015261315e81612f7f565b9050919050565b6000602082019050818103600083015261317e81612fa2565b9050919050565b6000602082019050818103600083015261319e81612fc5565b9050919050565b600060208201905081810360008301526131be81612fe8565b9050919050565b600060208201905081810360008301526131de8161300b565b9050919050565b60006020820190506131fa600083018461302e565b92915050565b600061320a61321b565b9050613216828261343c565b919050565b6000604051905090565b600067ffffffffffffffff8211156132405761323f613574565b5b613249826135a3565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006132a4826133be565b91506132af836133be565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156132e4576132e36134e7565b5b828201905092915050565b60006132fa826133be565b9150613305836133be565b92508261331557613314613516565b5b828204905092915050565b600061332b826133be565b9150613336836133be565b925082821015613349576133486134e7565b5b828203905092915050565b600061335f8261339e565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156133f55780820151818401526020810190506133da565b83811115613404576000848401525b50505050565b6000600282049050600182168061342257607f821691505b6020821081141561343657613435613545565b5b50919050565b613445826135a3565b810181811067ffffffffffffffff8211171561346457613463613574565b5b80604052505050565b6000613478826133be565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156134ab576134aa6134e7565b5b600182019050919050565b60006134c1826133be565b91506134cc836133be565b9250826134dc576134db613516565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f77726f6e67207061796d656e7400000000000000000000000000000000000000600082015250565b7f4578636565642073616c6573206d6178206c696d697400000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f436f6e747261637473206e6f7420616c6c6f7765640000000000000000000000600082015250565b7f63616e6e6f74206d696e742074686973206d616e790000000000000000000000600082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b61370281613354565b811461370d57600080fd5b50565b61371981613366565b811461372457600080fd5b50565b61373081613372565b811461373b57600080fd5b50565b613747816133be565b811461375257600080fd5b5056fea26469706673582212208b78327a8f40f4a1ab17dfd6bc6345616f5df52db38d526f49e996e67a49d91964736f6c634300080400330000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000766616b6555726900000000000000000000000000000000000000000000000000

Deployed Bytecode

0x6080604052600436106101815760003560e01c8063715018a6116100d1578063b88d4fde1161008a578063c87b56dd11610064578063c87b56dd14610575578063dc33e681146105b2578063e985e9c5146105ef578063f2fde38b1461062c57610181565b8063b88d4fde146104f6578063c1dffe321461051f578063c7a954801461054a57610181565b8063715018a6146104195780638da5cb5b1461043057806395d89b411461045b578063a0712d6814610486578063a22cb465146104a2578063b4654a43146104cb57610181565b80632f745c591161013e57806355f804b31161011857806355f804b31461034b5780636352211e146103745780636817c76c146103b157806370a08231146103dc57610181565b80632f745c59146102a857806342842e0e146102e55780634f6ccce71461030e57610181565b806301ffc9a71461018657806306fdde03146101c3578063081812fc146101ee578063095ea7b31461022b57806318160ddd1461025457806323b872dd1461027f575b600080fd5b34801561019257600080fd5b506101ad60048036038101906101a89190612db8565b610655565b6040516101ba91906130c8565b60405180910390f35b3480156101cf57600080fd5b506101d861079f565b6040516101e591906130e3565b60405180910390f35b3480156101fa57600080fd5b5061021560048036038101906102109190612e4f565b610831565b6040516102229190613061565b60405180910390f35b34801561023757600080fd5b50610252600480360381019061024d9190612d7c565b6108ad565b005b34801561026057600080fd5b506102696109b8565b60405161027691906131e5565b60405180910390f35b34801561028b57600080fd5b506102a660048036038101906102a19190612c76565b610a10565b005b3480156102b457600080fd5b506102cf60048036038101906102ca9190612d7c565b610a20565b6040516102dc91906131e5565b60405180910390f35b3480156102f157600080fd5b5061030c60048036038101906103079190612c76565b610c28565b005b34801561031a57600080fd5b5061033560048036038101906103309190612e4f565b610c48565b60405161034291906131e5565b60405180910390f35b34801561035757600080fd5b50610372600480360381019061036d9190612e0a565b610dbb565b005b34801561038057600080fd5b5061039b60048036038101906103969190612e4f565b610e4d565b6040516103a89190613061565b60405180910390f35b3480156103bd57600080fd5b506103c6610e63565b6040516103d391906131e5565b60405180910390f35b3480156103e857600080fd5b5061040360048036038101906103fe9190612c11565b610e87565b60405161041091906131e5565b60405180910390f35b34801561042557600080fd5b5061042e610f57565b005b34801561043c57600080fd5b50610445610fdf565b6040516104529190613061565b60405180910390f35b34801561046757600080fd5b50610470611008565b60405161047d91906130e3565b60405180910390f35b6104a0600480360381019061049b9190612e4f565b61109a565b005b3480156104ae57600080fd5b506104c960048036038101906104c49190612d40565b6112ee565b005b3480156104d757600080fd5b506104e0611466565b6040516104ed91906131e5565b60405180910390f35b34801561050257600080fd5b5061051d60048036038101906105189190612cc5565b61148a565b005b34801561052b57600080fd5b506105346114dd565b60405161054191906131e5565b60405180910390f35b34801561055657600080fd5b5061055f611501565b60405161056c91906131e5565b60405180910390f35b34801561058157600080fd5b5061059c60048036038101906105979190612e4f565b611525565b6040516105a991906130e3565b60405180910390f35b3480156105be57600080fd5b506105d960048036038101906105d49190612c11565b6115c4565b6040516105e691906131e5565b60405180910390f35b3480156105fb57600080fd5b5061061660048036038101906106119190612c3a565b6115d6565b60405161062391906130c8565b60405180910390f35b34801561063857600080fd5b50610653600480360381019061064e9190612c11565b61166a565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061072057507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061078857507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610798575061079782611762565b5b9050919050565b6060600280546107ae9061340a565b80601f01602080910402602001604051908101604052809291908181526020018280546107da9061340a565b80156108275780601f106107fc57610100808354040283529160200191610827565b820191906000526020600020905b81548152906001019060200180831161080a57829003601f168201915b5050505050905090565b600061083c826117cc565b610872576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006108b882610e4d565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610920576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661093f611835565b73ffffffffffffffffffffffffffffffffffffffff1614158015610971575061096f8161096a611835565b6115d6565b155b156109a8576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6109b383838361183d565b505050565b6000600160109054906101000a90046fffffffffffffffffffffffffffffffff16600160009054906101000a90046fffffffffffffffffffffffffffffffff16036fffffffffffffffffffffffffffffffff16905090565b610a1b8383836118ef565b505050565b6000610a2b83610e87565b8210610a63576040517f0ddac30e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000600160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16905060008060005b83811015610c1c576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050806040015115610b7b5750610c0f565b600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614610bbb57806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610c0d5786841415610c04578195505050505050610c22565b83806001019450505b505b8080600101915050610a9e565b50600080fd5b92915050565b610c438383836040518060200160405280600081525061148a565b505050565b600080600160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1690506000805b82811015610d83576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff16151515158152505090508060400151610d755785831415610d6c5781945050505050610db6565b82806001019350505b508080600101915050610c82565b506040517fa723001c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b610dc3611835565b73ffffffffffffffffffffffffffffffffffffffff16610de1610fdf565b73ffffffffffffffffffffffffffffffffffffffff1614610e37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e2e90613165565b60405180910390fd5b818160099190610e48929190612a10565b505050565b6000610e5882611e0e565b600001519050919050565b7f000000000000000000000000000000000000000000000000002386f26fc1000081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610eef576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b610f5f611835565b73ffffffffffffffffffffffffffffffffffffffff16610f7d610fdf565b73ffffffffffffffffffffffffffffffffffffffff1614610fd3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fca90613165565b60405180910390fd5b610fdd60006120b8565b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600380546110179061340a565b80601f01602080910402602001604051908101604052809291908181526020018280546110439061340a565b80156110905780601f1061106557610100808354040283529160200191611090565b820191906000526020600020905b81548152906001019060200180831161107357829003601f168201915b5050505050905090565b600260085414156110e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110d7906131c5565b60405180910390fd5b60026008819055503373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614611156576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161114d90613185565b60405180910390fd5b60006111606109b8565b90507f00000000000000000000000000000000000000000000000000000000000007d0828261118f9190613299565b11156111d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111c790613145565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000a826111fb336115c4565b6112059190613299565b1115611246576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161123d906131a5565b60405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000003e881106112d85760007f000000000000000000000000000000000000000000000000002386f26fc10000830290508034146112d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112cd90613125565b60405180910390fd5b505b6112e2338361217c565b50600160088190555050565b6112f6611835565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561135b576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000611368611835565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611415611835565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161145a91906130c8565b60405180910390a35050565b7f00000000000000000000000000000000000000000000000000000000000003e881565b6114958484846118ef565b6114a18484848461219a565b6114d7576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b7f000000000000000000000000000000000000000000000000000000000000000a81565b7f00000000000000000000000000000000000000000000000000000000000007d081565b6060611530826117cc565b611566576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000611570612328565b905060008151141561159157604051806020016040528060008152506115bc565b8061159b846123ba565b6040516020016115ac92919061303d565b6040516020818303038152906040525b915050919050565b60006115cf82612567565b9050919050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611672611835565b73ffffffffffffffffffffffffffffffffffffffff16611690610fdf565b73ffffffffffffffffffffffffffffffffffffffff16146116e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116dd90613165565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611756576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174d90613105565b60405180910390fd5b61175f816120b8565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6000600160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff168210801561182e575060046000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b600033905090565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006118fa82611e0e565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff16611921611835565b73ffffffffffffffffffffffffffffffffffffffff1614806119545750611953826000015161194e611835565b6115d6565b5b806119995750611962611835565b73ffffffffffffffffffffffffffffffffffffffff1661198184610831565b73ffffffffffffffffffffffffffffffffffffffff16145b9050806119d2576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614611a3b576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611aa2576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611aaf8585856001612637565b611abf600084846000015161183d565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550836004600085815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600085815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600184019050600073ffffffffffffffffffffffffffffffffffffffff166004600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415611d9e57600160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16811015611d9d5782600001516004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082602001516004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b50828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611e07858585600161263d565b5050505050565b611e16612a96565b6000829050600160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16811015612081576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050806040015161207f57600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614611f635780925050506120b3565b5b60011561207e57818060019003925050600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146120795780925050506120b3565b611f64565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612196828260405180602001604052806000815250612643565b5050565b60006121bb8473ffffffffffffffffffffffffffffffffffffffff16612655565b1561231b578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026121e4611835565b8786866040518563ffffffff1660e01b8152600401612206949392919061307c565b602060405180830381600087803b15801561222057600080fd5b505af192505050801561225157506040513d601f19601f8201168201806040525081019061224e9190612de1565b60015b6122cb573d8060008114612281576040519150601f19603f3d011682016040523d82523d6000602084013e612286565b606091505b506000815114156122c3576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612320565b600190505b949350505050565b6060600980546123379061340a565b80601f01602080910402602001604051908101604052809291908181526020018280546123639061340a565b80156123b05780601f10612385576101008083540402835291602001916123b0565b820191906000526020600020905b81548152906001019060200180831161239357829003601f168201915b5050505050905090565b60606000821415612402576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612562565b600082905060005b6000821461243457808061241d9061346d565b915050600a8261242d91906132ef565b915061240a565b60008167ffffffffffffffff811115612476577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156124a85781602001600182028036833780820191505090505b5090505b6000851461255b576001826124c19190613320565b9150600a856124d091906134b6565b60306124dc9190613299565b60f81b818381518110612518577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561255491906132ef565b94506124ac565b8093505050505b919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156125cf576040517f35ebb31900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160089054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b50505050565b50505050565b6126508383836001612678565b505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6000600160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415612714576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600084141561274f576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61275c6000868387612637565b83600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600081905060005b858110156129c157818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48380156129755750612973600088848861219a565b155b156129ac576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b818060010192505080806001019150506128fa565b5080600160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555050612a09600086838761263d565b5050505050565b828054612a1c9061340a565b90600052602060002090601f016020900481019282612a3e5760008555612a85565b82601f10612a5757803560ff1916838001178555612a85565b82800160010185558215612a85579182015b82811115612a84578235825591602001919060010190612a69565b5b509050612a929190612ad9565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b80821115612af2576000816000905550600101612ada565b5090565b6000612b09612b0484613225565b613200565b905082815260208101848484011115612b2157600080fd5b612b2c8482856133c8565b509392505050565b600081359050612b43816136f9565b92915050565b600081359050612b5881613710565b92915050565b600081359050612b6d81613727565b92915050565b600081519050612b8281613727565b92915050565b600082601f830112612b9957600080fd5b8135612ba9848260208601612af6565b91505092915050565b60008083601f840112612bc457600080fd5b8235905067ffffffffffffffff811115612bdd57600080fd5b602083019150836001820283011115612bf557600080fd5b9250929050565b600081359050612c0b8161373e565b92915050565b600060208284031215612c2357600080fd5b6000612c3184828501612b34565b91505092915050565b60008060408385031215612c4d57600080fd5b6000612c5b85828601612b34565b9250506020612c6c85828601612b34565b9150509250929050565b600080600060608486031215612c8b57600080fd5b6000612c9986828701612b34565b9350506020612caa86828701612b34565b9250506040612cbb86828701612bfc565b9150509250925092565b60008060008060808587031215612cdb57600080fd5b6000612ce987828801612b34565b9450506020612cfa87828801612b34565b9350506040612d0b87828801612bfc565b925050606085013567ffffffffffffffff811115612d2857600080fd5b612d3487828801612b88565b91505092959194509250565b60008060408385031215612d5357600080fd5b6000612d6185828601612b34565b9250506020612d7285828601612b49565b9150509250929050565b60008060408385031215612d8f57600080fd5b6000612d9d85828601612b34565b9250506020612dae85828601612bfc565b9150509250929050565b600060208284031215612dca57600080fd5b6000612dd884828501612b5e565b91505092915050565b600060208284031215612df357600080fd5b6000612e0184828501612b73565b91505092915050565b60008060208385031215612e1d57600080fd5b600083013567ffffffffffffffff811115612e3757600080fd5b612e4385828601612bb2565b92509250509250929050565b600060208284031215612e6157600080fd5b6000612e6f84828501612bfc565b91505092915050565b612e8181613354565b82525050565b612e9081613366565b82525050565b6000612ea182613256565b612eab818561326c565b9350612ebb8185602086016133d7565b612ec4816135a3565b840191505092915050565b6000612eda82613261565b612ee4818561327d565b9350612ef48185602086016133d7565b612efd816135a3565b840191505092915050565b6000612f1382613261565b612f1d818561328e565b9350612f2d8185602086016133d7565b80840191505092915050565b6000612f4660268361327d565b9150612f51826135b4565b604082019050919050565b6000612f69600d8361327d565b9150612f7482613603565b602082019050919050565b6000612f8c60168361327d565b9150612f978261362c565b602082019050919050565b6000612faf60208361327d565b9150612fba82613655565b602082019050919050565b6000612fd260158361327d565b9150612fdd8261367e565b602082019050919050565b6000612ff560158361327d565b9150613000826136a7565b602082019050919050565b6000613018601f8361327d565b9150613023826136d0565b602082019050919050565b613037816133be565b82525050565b60006130498285612f08565b91506130558284612f08565b91508190509392505050565b60006020820190506130766000830184612e78565b92915050565b60006080820190506130916000830187612e78565b61309e6020830186612e78565b6130ab604083018561302e565b81810360608301526130bd8184612e96565b905095945050505050565b60006020820190506130dd6000830184612e87565b92915050565b600060208201905081810360008301526130fd8184612ecf565b905092915050565b6000602082019050818103600083015261311e81612f39565b9050919050565b6000602082019050818103600083015261313e81612f5c565b9050919050565b6000602082019050818103600083015261315e81612f7f565b9050919050565b6000602082019050818103600083015261317e81612fa2565b9050919050565b6000602082019050818103600083015261319e81612fc5565b9050919050565b600060208201905081810360008301526131be81612fe8565b9050919050565b600060208201905081810360008301526131de8161300b565b9050919050565b60006020820190506131fa600083018461302e565b92915050565b600061320a61321b565b9050613216828261343c565b919050565b6000604051905090565b600067ffffffffffffffff8211156132405761323f613574565b5b613249826135a3565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006132a4826133be565b91506132af836133be565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156132e4576132e36134e7565b5b828201905092915050565b60006132fa826133be565b9150613305836133be565b92508261331557613314613516565b5b828204905092915050565b600061332b826133be565b9150613336836133be565b925082821015613349576133486134e7565b5b828203905092915050565b600061335f8261339e565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156133f55780820151818401526020810190506133da565b83811115613404576000848401525b50505050565b6000600282049050600182168061342257607f821691505b6020821081141561343657613435613545565b5b50919050565b613445826135a3565b810181811067ffffffffffffffff8211171561346457613463613574565b5b80604052505050565b6000613478826133be565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156134ab576134aa6134e7565b5b600182019050919050565b60006134c1826133be565b91506134cc836133be565b9250826134dc576134db613516565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f77726f6e67207061796d656e7400000000000000000000000000000000000000600082015250565b7f4578636565642073616c6573206d6178206c696d697400000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f436f6e747261637473206e6f7420616c6c6f7765640000000000000000000000600082015250565b7f63616e6e6f74206d696e742074686973206d616e790000000000000000000000600082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b61370281613354565b811461370d57600080fd5b50565b61371981613366565b811461372457600080fd5b50565b61373081613372565b811461373b57600080fd5b50565b613747816133be565b811461375257600080fd5b5056fea26469706673582212208b78327a8f40f4a1ab17dfd6bc6345616f5df52db38d526f49e996e67a49d91964736f6c63430008040033

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

0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000766616b6555726900000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : baseURI (string): fakeUri

-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000020
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [2] : 66616b6555726900000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

49274:1446:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32714:372;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35324:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36827:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36390:371;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29951:280;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37684:170;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31537:1105;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37925:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30524:713;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50611:106;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35133:124;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49428:47;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33150:206;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2682:103;;;;;;;;;;;;;:::i;:::-;;2031:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35493:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49699:661;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37103:279;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49380:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38181:342;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49482:44;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49335:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35668:318;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50368:113;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37453:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2940:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32714:372;32816:4;32868:25;32853:40;;;:11;:40;;;;:105;;;;32925:33;32910:48;;;:11;:48;;;;32853:105;:172;;;;32990:35;32975:50;;;:11;:50;;;;32853:172;:225;;;;33042:36;33066:11;33042:23;:36::i;:::-;32853:225;32833:245;;32714:372;;;:::o;35324:100::-;35378:13;35411:5;35404:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35324:100;:::o;36827:204::-;36895:7;36920:16;36928:7;36920;:16::i;:::-;36915:64;;36945:34;;;;;;;;;;;;;;36915:64;36999:15;:24;37015:7;36999:24;;;;;;;;;;;;;;;;;;;;;36992:31;;36827:204;;;:::o;36390:371::-;36463:13;36479:24;36495:7;36479:15;:24::i;:::-;36463:40;;36524:5;36518:11;;:2;:11;;;36514:48;;;36538:24;;;;;;;;;;;;;;36514:48;36595:5;36579:21;;:12;:10;:12::i;:::-;:21;;;;:63;;;;;36605:37;36622:5;36629:12;:10;:12::i;:::-;36605:16;:37::i;:::-;36604:38;36579:63;36575:138;;;36666:35;;;;;;;;;;;;;;36575:138;36725:28;36734:2;36738:7;36747:5;36725:8;:28::i;:::-;36390:371;;;:::o;29951:280::-;30004:7;30196:12;;;;;;;;;;;30180:13;;;;;;;;;;;:28;30173:35;;;;29951:280;:::o;37684:170::-;37818:28;37828:4;37834:2;37838:7;37818:9;:28::i;:::-;37684:170;;;:::o;31537:1105::-;31626:7;31659:16;31669:5;31659:9;:16::i;:::-;31650:5;:25;31646:61;;31684:23;;;;;;;;;;;;;;31646:61;31718:22;31743:13;;;;;;;;;;;31718:38;;;;31767:19;31797:25;31998:9;31993:557;32013:14;32009:1;:18;31993:557;;;32053:31;32087:11;:14;32099:1;32087:14;;;;;;;;;;;32053:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32124:9;:16;;;32120:73;;;32165:8;;;32120:73;32241:1;32215:28;;:9;:14;;;:28;;;32211:111;;32288:9;:14;;;32268:34;;32211:111;32365:5;32344:26;;:17;:26;;;32340:195;;;32414:5;32399:11;:20;32395:85;;;32455:1;32448:8;;;;;;;;;32395:85;32502:13;;;;;;;32340:195;31993:557;;32029:3;;;;;;;31993:557;;;;32626:8;;;31537:1105;;;;;:::o;37925:185::-;38063:39;38080:4;38086:2;38090:7;38063:39;;;;;;;;;;;;:16;:39::i;:::-;37925:185;;;:::o;30524:713::-;30591:7;30611:22;30636:13;;;;;;;;;;;30611:38;;;;30660:19;30855:9;30850:328;30870:14;30866:1;:18;30850:328;;;30910:31;30944:11;:14;30956:1;30944:14;;;;;;;;;;;30910:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30982:9;:16;;;30977:186;;31042:5;31027:11;:20;31023:85;;;31083:1;31076:8;;;;;;;;31023:85;31130:13;;;;;;;30977:186;30850:328;30886:3;;;;;;;30850:328;;;;31206:23;;;;;;;;;;;;;;30524:713;;;;:::o;50611:106::-;2262:12;:10;:12::i;:::-;2251:23;;:7;:5;:7::i;:::-;:23;;;2243:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50702:7:::1;;50686:13;:23;;;;;;;:::i;:::-;;50611:106:::0;;:::o;35133:124::-;35197:7;35224:20;35236:7;35224:11;:20::i;:::-;:25;;;35217:32;;35133:124;;;:::o;49428:47::-;;;:::o;33150:206::-;33214:7;33255:1;33238:19;;:5;:19;;;33234:60;;;33266:28;;;;;;;;;;;;;;33234:60;33320:12;:19;33333:5;33320:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;33312:36;;33305:43;;33150:206;;;:::o;2682:103::-;2262:12;:10;:12::i;:::-;2251:23;;:7;:5;:7::i;:::-;:23;;;2243:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2747:30:::1;2774:1;2747:18;:30::i;:::-;2682:103::o:0;2031:87::-;2077:7;2104:6;;;;;;;;;;;2097:13;;2031:87;:::o;35493:104::-;35549:13;35582:7;35575:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35493:104;:::o;49699:661::-;5319:1;5917:7;;:19;;5909:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;5319:1;6050:7;:18;;;;49793:10:::1;49780:23;;:9;:23;;;49772:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;49840:19;49862:13;:11;:13::i;:::-;49840:35;;49920:6;49908:8;49894:11;:22;;;;:::i;:::-;:32;;49886:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;50025:14;50013:8;49986:24;49999:10;49986:12;:24::i;:::-;:35;;;;:::i;:::-;:53;;49964:124;;;;;;;;;;;;:::i;:::-;;;;;;;;;50117:9;50102:11;:24;50099:212;;50143:12;50217:9;50206:8;:20;50199:27;;50277:4;50264:9;:17;50256:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;50099:212;;50321:31;50331:10;50343:8;50321:9;:31::i;:::-;6081:1;5275::::0;6229:7;:22;;;;49699:661;:::o;37103:279::-;37206:12;:10;:12::i;:::-;37194:24;;:8;:24;;;37190:54;;;37227:17;;;;;;;;;;;;;;37190:54;37302:8;37257:18;:32;37276:12;:10;:12::i;:::-;37257:32;;;;;;;;;;;;;;;:42;37290:8;37257:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;37355:8;37326:48;;37341:12;:10;:12::i;:::-;37326:48;;;37365:8;37326:48;;;;;;:::i;:::-;;;;;;;;37103:279;;:::o;49380:41::-;;;:::o;38181:342::-;38348:28;38358:4;38364:2;38368:7;38348:9;:28::i;:::-;38392:48;38415:4;38421:2;38425:7;38434:5;38392:22;:48::i;:::-;38387:129;;38464:40;;;;;;;;;;;;;;38387:129;38181:342;;;;:::o;49482:44::-;;;:::o;49335:38::-;;;:::o;35668:318::-;35741:13;35772:16;35780:7;35772;:16::i;:::-;35767:59;;35797:29;;;;;;;;;;;;;;35767:59;35839:21;35863:10;:8;:10::i;:::-;35839:34;;35916:1;35897:7;35891:21;:26;;:87;;;;;;;;;;;;;;;;;35944:7;35953:18;:7;:16;:18::i;:::-;35927:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;35891:87;35884:94;;;35668:318;;;:::o;50368:113::-;50426:7;50453:20;50467:5;50453:13;:20::i;:::-;50446:27;;50368:113;;;:::o;37453:164::-;37550:4;37574:18;:25;37593:5;37574:25;;;;;;;;;;;;;;;:35;37600:8;37574:35;;;;;;;;;;;;;;;;;;;;;;;;;37567:42;;37453:164;;;;:::o;2940:201::-;2262:12;:10;:12::i;:::-;2251:23;;:7;:5;:7::i;:::-;:23;;;2243:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;3049:1:::1;3029:22;;:8;:22;;;;3021:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;3105:28;3124:8;3105:18;:28::i;:::-;2940:201:::0;:::o;26517:157::-;26602:4;26641:25;26626:40;;;:11;:40;;;;26619:47;;26517:157;;;:::o;38778:144::-;38835:4;38869:13;;;;;;;;;;;38859:23;;:7;:23;:55;;;;;38887:11;:20;38899:7;38887:20;;;;;;;;;;;:27;;;;;;;;;;;;38886:28;38859:55;38852:62;;38778:144;;;:::o;749:98::-;802:7;829:10;822:17;;749:98;:::o;45994:196::-;46136:2;46109:15;:24;46125:7;46109:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;46174:7;46170:2;46154:28;;46163:5;46154:28;;;;;;;;;;;;45994:196;;;:::o;41495:2112::-;41610:35;41648:20;41660:7;41648:11;:20::i;:::-;41610:58;;41681:22;41723:13;:18;;;41707:34;;:12;:10;:12::i;:::-;:34;;;:101;;;;41758:50;41775:13;:18;;;41795:12;:10;:12::i;:::-;41758:16;:50::i;:::-;41707:101;:154;;;;41849:12;:10;:12::i;:::-;41825:36;;:20;41837:7;41825:11;:20::i;:::-;:36;;;41707:154;41681:181;;41880:17;41875:66;;41906:35;;;;;;;;;;;;;;41875:66;41978:4;41956:26;;:13;:18;;;:26;;;41952:67;;41991:28;;;;;;;;;;;;;;41952:67;42048:1;42034:16;;:2;:16;;;42030:52;;;42059:23;;;;;;;;;;;;;;42030:52;42095:43;42117:4;42123:2;42127:7;42136:1;42095:21;:43::i;:::-;42203:49;42220:1;42224:7;42233:13;:18;;;42203:8;:49::i;:::-;42578:1;42548:12;:18;42561:4;42548:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42622:1;42594:12;:16;42607:2;42594:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42668:2;42640:11;:20;42652:7;42640:20;;;;;;;;;;;:25;;;:30;;;;;;;;;;;;;;;;;;42730:15;42685:11;:20;42697:7;42685:20;;;;;;;;;;;:35;;;:61;;;;;;;;;;;;;;;;;;42998:19;43030:1;43020:7;:11;42998:33;;43091:1;43050:43;;:11;:24;43062:11;43050:24;;;;;;;;;;;:29;;;;;;;;;;;;:43;;;43046:445;;;43275:13;;;;;;;;;;;43261:27;;:11;:27;43257:219;;;43345:13;:18;;;43313:11;:24;43325:11;43313:24;;;;;;;;;;;:29;;;:50;;;;;;;;;;;;;;;;;;43428:13;:28;;;43386:11;:24;43398:11;43386:24;;;;;;;;;;;:39;;;:70;;;;;;;;;;;;;;;;;;43257:219;43046:445;41495:2112;43538:7;43534:2;43519:27;;43528:4;43519:27;;;;;;;;;;;;43557:42;43578:4;43584:2;43588:7;43597:1;43557:20;:42::i;:::-;41495:2112;;;;;:::o;33988:1083::-;34049:21;;:::i;:::-;34083:12;34098:7;34083:22;;34154:13;;;;;;;;;;;34147:20;;:4;:20;34143:861;;;34188:31;34222:11;:17;34234:4;34222:17;;;;;;;;;;;34188:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34263:9;:16;;;34258:731;;34334:1;34308:28;;:9;:14;;;:28;;;34304:101;;34372:9;34365:16;;;;;;34304:101;34709:261;34716:4;34709:261;;;34749:6;;;;;;;;34794:11;:17;34806:4;34794:17;;;;;;;;;;;34782:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34868:1;34842:28;;:9;:14;;;:28;;;34838:109;;34910:9;34903:16;;;;;;34838:109;34709:261;;;34258:731;34143:861;;35032:31;;;;;;;;;;;;;;33988:1083;;;;:::o;3301:191::-;3375:16;3394:6;;;;;;;;;;;3375:25;;3420:8;3411:6;;:17;;;;;;;;;;;;;;;;;;3475:8;3444:40;;3465:8;3444:40;;;;;;;;;;;;3301:191;;:::o;38930:104::-;38999:27;39009:2;39013:8;38999:27;;;;;;;;;;;;:9;:27::i;:::-;38930:104;;:::o;46755:790::-;46910:4;46931:15;:2;:13;;;:15::i;:::-;46927:611;;;46983:2;46967:36;;;47004:12;:10;:12::i;:::-;47018:4;47024:7;47033:5;46967:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;46963:520;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47230:1;47213:6;:13;:18;47209:259;;;47263:40;;;;;;;;;;;;;;47209:259;47418:6;47412:13;47403:6;47399:2;47395:15;47388:38;46963:520;47100:45;;;47090:55;;;:6;:55;;;;47083:62;;;;;46927:611;47522:4;47515:11;;46755:790;;;;;;;:::o;50489:114::-;50549:13;50582;50575:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50489:114;:::o;23887:723::-;23943:13;24173:1;24164:5;:10;24160:53;;;24191:10;;;;;;;;;;;;;;;;;;;;;24160:53;24223:12;24238:5;24223:20;;24254:14;24279:78;24294:1;24286:4;:9;24279:78;;24312:8;;;;;:::i;:::-;;;;24343:2;24335:10;;;;;:::i;:::-;;;24279:78;;;24367:19;24399:6;24389:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24367:39;;24417:154;24433:1;24424:5;:10;24417:154;;24461:1;24451:11;;;;;:::i;:::-;;;24528:2;24520:5;:10;;;;:::i;:::-;24507:2;:24;;;;:::i;:::-;24494:39;;24477:6;24484;24477:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;24557:2;24548:11;;;;;:::i;:::-;;;24417:154;;;24595:6;24581:21;;;;;23887:723;;;;:::o;33364:207::-;33425:7;33466:1;33449:19;;:5;:19;;;33445:59;;;33477:27;;;;;;;;;;;;;;33445:59;33530:12;:19;33543:5;33530:19;;;;;;;;;;;;;;;:32;;;;;;;;;;;;33522:41;;33515:48;;33364:207;;;:::o;48193:159::-;;;;;:::o;49011:158::-;;;;;:::o;39397:163::-;39520:32;39526:2;39530:8;39540:5;39547:4;39520:5;:32::i;:::-;39397:163;;;:::o;16244:326::-;16304:4;16561:1;16539:7;:19;;;:23;16532:30;;16244:326;;;:::o;39819:1422::-;39958:20;39981:13;;;;;;;;;;;39958:36;;;;40023:1;40009:16;;:2;:16;;;40005:48;;;40034:19;;;;;;;;;;;;;;40005:48;40080:1;40068:8;:13;40064:44;;;40090:18;;;;;;;;;;;;;;40064:44;40121:61;40151:1;40155:2;40159:12;40173:8;40121:21;:61::i;:::-;40495:8;40460:12;:16;40473:2;40460:16;;;;;;;;;;;;;;;:24;;;:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40559:8;40519:12;:16;40532:2;40519:16;;;;;;;;;;;;;;;:29;;;:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40618:2;40585:11;:25;40597:12;40585:25;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;40685:15;40635:11;:25;40647:12;40635:25;;;;;;;;;;;:40;;;:66;;;;;;;;;;;;;;;;;;40718:20;40741:12;40718:35;;40775:9;40770:328;40790:8;40786:1;:12;40770:328;;;40854:12;40850:2;40829:38;;40846:1;40829:38;;;;;;;;;;;;40890:4;:68;;;;;40899:59;40930:1;40934:2;40938:12;40952:5;40899:22;:59::i;:::-;40898:60;40890:68;40886:164;;;40990:40;;;;;;;;;;;;;;40886:164;41068:14;;;;;;;40800:3;;;;;;;40770:328;;;;41138:12;41114:13;;:37;;;;;;;;;;;;;;;;;;39819:1422;41173:60;41202:1;41206:2;41210:12;41224:8;41173:20;:60::i;:::-;39819:1422;;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:343: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:2;;;290:1;287;280:12;249:2;303:41;337:6;332:3;327;303:41;:::i;:::-;90:260;;;;;;:::o;356:139::-;402:5;440:6;427:20;418:29;;456:33;483:5;456:33;:::i;:::-;408:87;;;;:::o;501:133::-;544:5;582:6;569:20;560:29;;598:30;622:5;598:30;:::i;:::-;550:84;;;;:::o;640:137::-;685:5;723:6;710:20;701:29;;739:32;765:5;739:32;:::i;:::-;691:86;;;;:::o;783:141::-;839:5;870:6;864:13;855:22;;886:32;912:5;886:32;:::i;:::-;845:79;;;;:::o;943:271::-;998:5;1047:3;1040:4;1032:6;1028:17;1024:27;1014:2;;1065:1;1062;1055:12;1014:2;1105:6;1092:20;1130:78;1204:3;1196:6;1189:4;1181:6;1177:17;1130:78;:::i;:::-;1121:87;;1004:210;;;;;:::o;1234:352::-;1292:8;1302:6;1352:3;1345:4;1337:6;1333:17;1329:27;1319:2;;1370:1;1367;1360:12;1319:2;1406:6;1393:20;1383:30;;1436:18;1428:6;1425:30;1422:2;;;1468:1;1465;1458:12;1422:2;1505:4;1497:6;1493:17;1481:29;;1559:3;1551:4;1543:6;1539:17;1529:8;1525:32;1522:41;1519:2;;;1576:1;1573;1566:12;1519:2;1309:277;;;;;:::o;1592:139::-;1638:5;1676:6;1663:20;1654:29;;1692:33;1719:5;1692:33;:::i;:::-;1644:87;;;;:::o;1737:262::-;1796:6;1845:2;1833:9;1824:7;1820:23;1816:32;1813:2;;;1861:1;1858;1851:12;1813:2;1904:1;1929:53;1974:7;1965:6;1954:9;1950:22;1929:53;:::i;:::-;1919:63;;1875:117;1803:196;;;;:::o;2005:407::-;2073:6;2081;2130:2;2118:9;2109:7;2105:23;2101:32;2098:2;;;2146:1;2143;2136:12;2098:2;2189:1;2214:53;2259:7;2250:6;2239:9;2235:22;2214:53;:::i;:::-;2204:63;;2160:117;2316:2;2342:53;2387:7;2378:6;2367:9;2363:22;2342:53;:::i;:::-;2332:63;;2287:118;2088:324;;;;;:::o;2418:552::-;2495:6;2503;2511;2560:2;2548:9;2539:7;2535:23;2531:32;2528:2;;;2576:1;2573;2566:12;2528:2;2619:1;2644:53;2689:7;2680:6;2669:9;2665:22;2644:53;:::i;:::-;2634:63;;2590:117;2746:2;2772:53;2817:7;2808:6;2797:9;2793:22;2772:53;:::i;:::-;2762:63;;2717:118;2874:2;2900:53;2945:7;2936:6;2925:9;2921:22;2900:53;:::i;:::-;2890:63;;2845:118;2518:452;;;;;:::o;2976:809::-;3071:6;3079;3087;3095;3144:3;3132:9;3123:7;3119:23;3115:33;3112:2;;;3161:1;3158;3151:12;3112:2;3204:1;3229:53;3274:7;3265:6;3254:9;3250:22;3229:53;:::i;:::-;3219:63;;3175:117;3331:2;3357:53;3402:7;3393:6;3382:9;3378:22;3357:53;:::i;:::-;3347:63;;3302:118;3459:2;3485:53;3530:7;3521:6;3510:9;3506:22;3485:53;:::i;:::-;3475:63;;3430:118;3615:2;3604:9;3600:18;3587:32;3646:18;3638:6;3635:30;3632:2;;;3678:1;3675;3668:12;3632:2;3706:62;3760:7;3751:6;3740:9;3736:22;3706:62;:::i;:::-;3696:72;;3558:220;3102:683;;;;;;;:::o;3791:401::-;3856:6;3864;3913:2;3901:9;3892:7;3888:23;3884:32;3881:2;;;3929:1;3926;3919:12;3881:2;3972:1;3997:53;4042:7;4033:6;4022:9;4018:22;3997:53;:::i;:::-;3987:63;;3943:117;4099:2;4125:50;4167:7;4158:6;4147:9;4143:22;4125:50;:::i;:::-;4115:60;;4070:115;3871:321;;;;;:::o;4198:407::-;4266:6;4274;4323:2;4311:9;4302:7;4298:23;4294:32;4291:2;;;4339:1;4336;4329:12;4291:2;4382:1;4407:53;4452:7;4443:6;4432:9;4428:22;4407:53;:::i;:::-;4397:63;;4353:117;4509:2;4535:53;4580:7;4571:6;4560:9;4556:22;4535:53;:::i;:::-;4525:63;;4480:118;4281:324;;;;;:::o;4611:260::-;4669:6;4718:2;4706:9;4697:7;4693:23;4689:32;4686:2;;;4734:1;4731;4724:12;4686:2;4777:1;4802:52;4846:7;4837:6;4826:9;4822:22;4802:52;:::i;:::-;4792:62;;4748:116;4676:195;;;;:::o;4877:282::-;4946:6;4995:2;4983:9;4974:7;4970:23;4966:32;4963:2;;;5011:1;5008;5001:12;4963:2;5054:1;5079:63;5134:7;5125:6;5114:9;5110:22;5079:63;:::i;:::-;5069:73;;5025:127;4953:206;;;;:::o;5165:395::-;5236:6;5244;5293:2;5281:9;5272:7;5268:23;5264:32;5261:2;;;5309:1;5306;5299:12;5261:2;5380:1;5369:9;5365:17;5352:31;5410:18;5402:6;5399:30;5396:2;;;5442:1;5439;5432:12;5396:2;5478:65;5535:7;5526:6;5515:9;5511:22;5478:65;:::i;:::-;5460:83;;;;5323:230;5251:309;;;;;:::o;5566:262::-;5625:6;5674:2;5662:9;5653:7;5649:23;5645:32;5642:2;;;5690:1;5687;5680:12;5642:2;5733:1;5758:53;5803:7;5794:6;5783:9;5779:22;5758:53;:::i;:::-;5748:63;;5704:117;5632:196;;;;:::o;5834:118::-;5921:24;5939:5;5921:24;:::i;:::-;5916:3;5909:37;5899:53;;:::o;5958:109::-;6039:21;6054:5;6039:21;:::i;:::-;6034:3;6027:34;6017:50;;:::o;6073:360::-;6159:3;6187:38;6219:5;6187:38;:::i;:::-;6241:70;6304:6;6299:3;6241:70;:::i;:::-;6234:77;;6320:52;6365:6;6360:3;6353:4;6346:5;6342:16;6320:52;:::i;:::-;6397:29;6419:6;6397:29;:::i;:::-;6392:3;6388:39;6381:46;;6163:270;;;;;:::o;6439:364::-;6527:3;6555:39;6588:5;6555:39;:::i;:::-;6610:71;6674:6;6669:3;6610:71;:::i;:::-;6603:78;;6690:52;6735:6;6730:3;6723:4;6716:5;6712:16;6690:52;:::i;:::-;6767:29;6789:6;6767:29;:::i;:::-;6762:3;6758:39;6751:46;;6531:272;;;;;:::o;6809:377::-;6915:3;6943:39;6976:5;6943:39;:::i;:::-;6998:89;7080:6;7075:3;6998:89;:::i;:::-;6991:96;;7096:52;7141:6;7136:3;7129:4;7122:5;7118:16;7096:52;:::i;:::-;7173:6;7168:3;7164:16;7157:23;;6919:267;;;;;:::o;7192:366::-;7334:3;7355:67;7419:2;7414:3;7355:67;:::i;:::-;7348:74;;7431:93;7520:3;7431:93;:::i;:::-;7549:2;7544:3;7540:12;7533:19;;7338:220;;;:::o;7564:366::-;7706:3;7727:67;7791:2;7786:3;7727:67;:::i;:::-;7720:74;;7803:93;7892:3;7803:93;:::i;:::-;7921:2;7916:3;7912:12;7905:19;;7710:220;;;:::o;7936:366::-;8078:3;8099:67;8163:2;8158:3;8099:67;:::i;:::-;8092:74;;8175:93;8264:3;8175:93;:::i;:::-;8293:2;8288:3;8284:12;8277:19;;8082:220;;;:::o;8308:366::-;8450:3;8471:67;8535:2;8530:3;8471:67;:::i;:::-;8464:74;;8547:93;8636:3;8547:93;:::i;:::-;8665:2;8660:3;8656:12;8649:19;;8454:220;;;:::o;8680:366::-;8822:3;8843:67;8907:2;8902:3;8843:67;:::i;:::-;8836:74;;8919:93;9008:3;8919:93;:::i;:::-;9037:2;9032:3;9028:12;9021:19;;8826:220;;;:::o;9052:366::-;9194:3;9215:67;9279:2;9274:3;9215:67;:::i;:::-;9208:74;;9291:93;9380:3;9291:93;:::i;:::-;9409:2;9404:3;9400:12;9393:19;;9198:220;;;:::o;9424:366::-;9566:3;9587:67;9651:2;9646:3;9587:67;:::i;:::-;9580:74;;9663:93;9752:3;9663:93;:::i;:::-;9781:2;9776:3;9772:12;9765:19;;9570:220;;;:::o;9796:118::-;9883:24;9901:5;9883:24;:::i;:::-;9878:3;9871:37;9861:53;;:::o;9920:435::-;10100:3;10122:95;10213:3;10204:6;10122:95;:::i;:::-;10115:102;;10234:95;10325:3;10316:6;10234:95;:::i;:::-;10227:102;;10346:3;10339:10;;10104:251;;;;;:::o;10361:222::-;10454:4;10492:2;10481:9;10477:18;10469:26;;10505:71;10573:1;10562:9;10558:17;10549:6;10505:71;:::i;:::-;10459:124;;;;:::o;10589:640::-;10784:4;10822:3;10811:9;10807:19;10799:27;;10836:71;10904:1;10893:9;10889:17;10880:6;10836:71;:::i;:::-;10917:72;10985:2;10974:9;10970:18;10961:6;10917:72;:::i;:::-;10999;11067:2;11056:9;11052:18;11043:6;10999:72;:::i;:::-;11118:9;11112:4;11108:20;11103:2;11092:9;11088:18;11081:48;11146:76;11217:4;11208:6;11146:76;:::i;:::-;11138:84;;10789:440;;;;;;;:::o;11235:210::-;11322:4;11360:2;11349:9;11345:18;11337:26;;11373:65;11435:1;11424:9;11420:17;11411:6;11373:65;:::i;:::-;11327:118;;;;:::o;11451:313::-;11564:4;11602:2;11591:9;11587:18;11579:26;;11651:9;11645:4;11641:20;11637:1;11626:9;11622:17;11615:47;11679:78;11752:4;11743:6;11679:78;:::i;:::-;11671:86;;11569:195;;;;:::o;11770:419::-;11936:4;11974:2;11963:9;11959:18;11951:26;;12023:9;12017:4;12013:20;12009:1;11998:9;11994:17;11987:47;12051:131;12177:4;12051:131;:::i;:::-;12043:139;;11941:248;;;:::o;12195:419::-;12361:4;12399:2;12388:9;12384:18;12376:26;;12448:9;12442:4;12438:20;12434:1;12423:9;12419:17;12412:47;12476:131;12602:4;12476:131;:::i;:::-;12468:139;;12366:248;;;:::o;12620:419::-;12786:4;12824:2;12813:9;12809:18;12801:26;;12873:9;12867:4;12863:20;12859:1;12848:9;12844:17;12837:47;12901:131;13027:4;12901:131;:::i;:::-;12893:139;;12791:248;;;:::o;13045:419::-;13211:4;13249:2;13238:9;13234:18;13226:26;;13298:9;13292:4;13288:20;13284:1;13273:9;13269:17;13262:47;13326:131;13452:4;13326:131;:::i;:::-;13318:139;;13216:248;;;:::o;13470:419::-;13636:4;13674:2;13663:9;13659:18;13651:26;;13723:9;13717:4;13713:20;13709:1;13698:9;13694:17;13687:47;13751:131;13877:4;13751:131;:::i;:::-;13743:139;;13641:248;;;:::o;13895:419::-;14061:4;14099:2;14088:9;14084:18;14076:26;;14148:9;14142:4;14138:20;14134:1;14123:9;14119:17;14112:47;14176:131;14302:4;14176:131;:::i;:::-;14168:139;;14066:248;;;:::o;14320:419::-;14486:4;14524:2;14513:9;14509:18;14501:26;;14573:9;14567:4;14563:20;14559:1;14548:9;14544:17;14537:47;14601:131;14727:4;14601:131;:::i;:::-;14593:139;;14491:248;;;:::o;14745:222::-;14838:4;14876:2;14865:9;14861:18;14853:26;;14889:71;14957:1;14946:9;14942:17;14933:6;14889:71;:::i;:::-;14843:124;;;;:::o;14973:129::-;15007:6;15034:20;;:::i;:::-;15024:30;;15063:33;15091:4;15083:6;15063:33;:::i;:::-;15014:88;;;:::o;15108:75::-;15141:6;15174:2;15168:9;15158:19;;15148:35;:::o;15189:307::-;15250:4;15340:18;15332:6;15329:30;15326:2;;;15362:18;;:::i;:::-;15326:2;15400:29;15422:6;15400:29;:::i;:::-;15392:37;;15484:4;15478;15474:15;15466:23;;15255:241;;;:::o;15502:98::-;15553:6;15587:5;15581:12;15571:22;;15560:40;;;:::o;15606:99::-;15658:6;15692:5;15686:12;15676:22;;15665:40;;;:::o;15711:168::-;15794:11;15828:6;15823:3;15816:19;15868:4;15863:3;15859:14;15844:29;;15806:73;;;;:::o;15885:169::-;15969:11;16003:6;15998:3;15991:19;16043:4;16038:3;16034:14;16019:29;;15981:73;;;;:::o;16060:148::-;16162:11;16199:3;16184:18;;16174:34;;;;:::o;16214:305::-;16254:3;16273:20;16291:1;16273:20;:::i;:::-;16268:25;;16307:20;16325:1;16307:20;:::i;:::-;16302:25;;16461:1;16393:66;16389:74;16386:1;16383:81;16380:2;;;16467:18;;:::i;:::-;16380:2;16511:1;16508;16504:9;16497:16;;16258:261;;;;:::o;16525:185::-;16565:1;16582:20;16600:1;16582:20;:::i;:::-;16577:25;;16616:20;16634:1;16616:20;:::i;:::-;16611:25;;16655:1;16645:2;;16660:18;;:::i;:::-;16645:2;16702:1;16699;16695:9;16690:14;;16567:143;;;;:::o;16716:191::-;16756:4;16776:20;16794:1;16776:20;:::i;:::-;16771:25;;16810:20;16828:1;16810:20;:::i;:::-;16805:25;;16849:1;16846;16843:8;16840:2;;;16854:18;;:::i;:::-;16840:2;16899:1;16896;16892:9;16884:17;;16761:146;;;;:::o;16913:96::-;16950:7;16979:24;16997:5;16979:24;:::i;:::-;16968:35;;16958:51;;;:::o;17015:90::-;17049:7;17092:5;17085:13;17078:21;17067:32;;17057:48;;;:::o;17111:149::-;17147:7;17187:66;17180:5;17176:78;17165:89;;17155:105;;;:::o;17266:126::-;17303:7;17343:42;17336:5;17332:54;17321:65;;17311:81;;;:::o;17398:77::-;17435:7;17464:5;17453:16;;17443:32;;;:::o;17481:154::-;17565:6;17560:3;17555;17542:30;17627:1;17618:6;17613:3;17609:16;17602:27;17532:103;;;:::o;17641:307::-;17709:1;17719:113;17733:6;17730:1;17727:13;17719:113;;;17818:1;17813:3;17809:11;17803:18;17799:1;17794:3;17790:11;17783:39;17755:2;17752:1;17748:10;17743:15;;17719:113;;;17850:6;17847:1;17844:13;17841:2;;;17930:1;17921:6;17916:3;17912:16;17905:27;17841:2;17690:258;;;;:::o;17954:320::-;17998:6;18035:1;18029:4;18025:12;18015:22;;18082:1;18076:4;18072:12;18103:18;18093:2;;18159:4;18151:6;18147:17;18137:27;;18093:2;18221;18213:6;18210:14;18190:18;18187:38;18184:2;;;18240:18;;:::i;:::-;18184:2;18005:269;;;;:::o;18280:281::-;18363:27;18385:4;18363:27;:::i;:::-;18355:6;18351:40;18493:6;18481:10;18478:22;18457:18;18445:10;18442:34;18439:62;18436:2;;;18504:18;;:::i;:::-;18436:2;18544:10;18540:2;18533:22;18323:238;;;:::o;18567:233::-;18606:3;18629:24;18647:5;18629:24;:::i;:::-;18620:33;;18675:66;18668:5;18665:77;18662:2;;;18745:18;;:::i;:::-;18662:2;18792:1;18785:5;18781:13;18774:20;;18610:190;;;:::o;18806:176::-;18838:1;18855:20;18873:1;18855:20;:::i;:::-;18850:25;;18889:20;18907:1;18889:20;:::i;:::-;18884:25;;18928:1;18918:2;;18933:18;;:::i;:::-;18918:2;18974:1;18971;18967:9;18962:14;;18840:142;;;;:::o;18988:180::-;19036:77;19033:1;19026:88;19133:4;19130:1;19123:15;19157:4;19154:1;19147:15;19174:180;19222:77;19219:1;19212:88;19319:4;19316:1;19309:15;19343:4;19340:1;19333:15;19360:180;19408:77;19405:1;19398:88;19505:4;19502:1;19495:15;19529:4;19526:1;19519:15;19546:180;19594:77;19591:1;19584:88;19691:4;19688:1;19681:15;19715:4;19712:1;19705:15;19732:102;19773:6;19824:2;19820:7;19815:2;19808:5;19804:14;19800:28;19790:38;;19780:54;;;:::o;19840:225::-;19980:34;19976:1;19968:6;19964:14;19957:58;20049:8;20044:2;20036:6;20032:15;20025:33;19946:119;:::o;20071:163::-;20211:15;20207:1;20199:6;20195:14;20188:39;20177:57;:::o;20240:172::-;20380:24;20376:1;20368:6;20364:14;20357:48;20346:66;:::o;20418:182::-;20558:34;20554:1;20546:6;20542:14;20535:58;20524:76;:::o;20606:171::-;20746:23;20742:1;20734:6;20730:14;20723:47;20712:65;:::o;20783:171::-;20923:23;20919:1;20911:6;20907:14;20900:47;20889:65;:::o;20960:181::-;21100:33;21096:1;21088:6;21084:14;21077:57;21066:75;:::o;21147:122::-;21220:24;21238:5;21220:24;:::i;:::-;21213:5;21210:35;21200:2;;21259:1;21256;21249:12;21200:2;21190:79;:::o;21275:116::-;21345:21;21360:5;21345:21;:::i;:::-;21338:5;21335:32;21325:2;;21381:1;21378;21371:12;21325:2;21315:76;:::o;21397:120::-;21469:23;21486:5;21469:23;:::i;:::-;21462:5;21459:34;21449:2;;21507:1;21504;21497:12;21449:2;21439:78;:::o;21523:122::-;21596:24;21614:5;21596:24;:::i;:::-;21589:5;21586:35;21576:2;;21635:1;21632;21625:12;21576:2;21566:79;:::o

Swarm Source

ipfs://8b78327a8f40f4a1ab17dfd6bc6345616f5df52db38d526f49e996e67a49d919
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.