ETH Price: $3,501.79 (+4.66%)

Token

Potato By King George (PBKG)
 

Overview

Max Total Supply

6,429 PBKG

Holders

2,645

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
4 PBKG
0x207d9553703e3a43614f04c82ead0126836978c3
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:
PotatoByKingGeorge

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, Apache-2.0 license

Contract Source Code (Solidity)

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

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


// OpenZeppelin Contracts (last updated v4.7.0) (utils/cryptography/MerkleProof.sol)

pragma solidity ^0.8.0;

/**
 * @dev These functions deal with verification of Merkle Tree proofs.
 *
 * The proofs can be generated using the JavaScript library
 * https://github.com/miguelmota/merkletreejs[merkletreejs].
 * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled.
 *
 * See `test/utils/cryptography/MerkleProof.test.js` for some examples.
 *
 * WARNING: You should avoid using leaf values that are 64 bytes long prior to
 * hashing, or use a hash function other than keccak256 for hashing leaves.
 * This is because the concatenation of a sorted pair of internal nodes in
 * the merkle tree could be reinterpreted as a leaf value.
 */
library MerkleProof {
    /**
     * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree
     * defined by `root`. For this, a `proof` must be provided, containing
     * sibling hashes on the branch from the leaf to the root of the tree. Each
     * pair of leaves and each pair of pre-images are assumed to be sorted.
     */
    function verify(
        bytes32[] memory proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        return processProof(proof, leaf) == root;
    }

    /**
     * @dev Calldata version of {verify}
     *
     * _Available since v4.7._
     */
    function verifyCalldata(
        bytes32[] calldata proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        return processProofCalldata(proof, leaf) == root;
    }

    /**
     * @dev Returns the rebuilt hash obtained by traversing a Merkle tree up
     * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt
     * hash matches the root of the tree. When processing the proof, the pairs
     * of leafs & pre-images are assumed to be sorted.
     *
     * _Available since v4.4._
     */
    function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) {
        bytes32 computedHash = leaf;
        for (uint256 i = 0; i < proof.length; i++) {
            computedHash = _hashPair(computedHash, proof[i]);
        }
        return computedHash;
    }

    /**
     * @dev Calldata version of {processProof}
     *
     * _Available since v4.7._
     */
    function processProofCalldata(bytes32[] calldata proof, bytes32 leaf) internal pure returns (bytes32) {
        bytes32 computedHash = leaf;
        for (uint256 i = 0; i < proof.length; i++) {
            computedHash = _hashPair(computedHash, proof[i]);
        }
        return computedHash;
    }

    /**
     * @dev Returns true if the `leaves` can be proved to be a part of a Merkle tree defined by
     * `root`, according to `proof` and `proofFlags` as described in {processMultiProof}.
     *
     * _Available since v4.7._
     */
    function multiProofVerify(
        bytes32[] memory proof,
        bool[] memory proofFlags,
        bytes32 root,
        bytes32[] memory leaves
    ) internal pure returns (bool) {
        return processMultiProof(proof, proofFlags, leaves) == root;
    }

    /**
     * @dev Calldata version of {multiProofVerify}
     *
     * _Available since v4.7._
     */
    function multiProofVerifyCalldata(
        bytes32[] calldata proof,
        bool[] calldata proofFlags,
        bytes32 root,
        bytes32[] memory leaves
    ) internal pure returns (bool) {
        return processMultiProofCalldata(proof, proofFlags, leaves) == root;
    }

    /**
     * @dev Returns the root of a tree reconstructed from `leaves` and the sibling nodes in `proof`,
     * consuming from one or the other at each step according to the instructions given by
     * `proofFlags`.
     *
     * _Available since v4.7._
     */
    function processMultiProof(
        bytes32[] memory proof,
        bool[] memory proofFlags,
        bytes32[] memory leaves
    ) internal pure returns (bytes32 merkleRoot) {
        // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by
        // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the
        // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of
        // the merkle tree.
        uint256 leavesLen = leaves.length;
        uint256 totalHashes = proofFlags.length;

        // Check proof validity.
        require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof");

        // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using
        // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop".
        bytes32[] memory hashes = new bytes32[](totalHashes);
        uint256 leafPos = 0;
        uint256 hashPos = 0;
        uint256 proofPos = 0;
        // At each step, we compute the next hash using two values:
        // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we
        //   get the next hash.
        // - depending on the flag, either another value for the "main queue" (merging branches) or an element from the
        //   `proof` array.
        for (uint256 i = 0; i < totalHashes; i++) {
            bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];
            bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++];
            hashes[i] = _hashPair(a, b);
        }

        if (totalHashes > 0) {
            return hashes[totalHashes - 1];
        } else if (leavesLen > 0) {
            return leaves[0];
        } else {
            return proof[0];
        }
    }

    /**
     * @dev Calldata version of {processMultiProof}
     *
     * _Available since v4.7._
     */
    function processMultiProofCalldata(
        bytes32[] calldata proof,
        bool[] calldata proofFlags,
        bytes32[] memory leaves
    ) internal pure returns (bytes32 merkleRoot) {
        // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by
        // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the
        // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of
        // the merkle tree.
        uint256 leavesLen = leaves.length;
        uint256 totalHashes = proofFlags.length;

        // Check proof validity.
        require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof");

        // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using
        // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop".
        bytes32[] memory hashes = new bytes32[](totalHashes);
        uint256 leafPos = 0;
        uint256 hashPos = 0;
        uint256 proofPos = 0;
        // At each step, we compute the next hash using two values:
        // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we
        //   get the next hash.
        // - depending on the flag, either another value for the "main queue" (merging branches) or an element from the
        //   `proof` array.
        for (uint256 i = 0; i < totalHashes; i++) {
            bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];
            bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++];
            hashes[i] = _hashPair(a, b);
        }

        if (totalHashes > 0) {
            return hashes[totalHashes - 1];
        } else if (leavesLen > 0) {
            return leaves[0];
        } else {
            return proof[0];
        }
    }

    function _hashPair(bytes32 a, bytes32 b) private pure returns (bytes32) {
        return a < b ? _efficientHash(a, b) : _efficientHash(b, a);
    }

    function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) {
        /// @solidity memory-safe-assembly
        assembly {
            mstore(0x00, a)
            mstore(0x20, b)
            value := keccak256(0x00, 0x40)
        }
    }
}

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


// OpenZeppelin Contracts (last updated v4.7.0) (utils/Strings.sol)

pragma solidity ^0.8.0;

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

    /**
     * @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);
    }

    /**
     * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.
     */
    function toHexString(address addr) internal pure returns (string memory) {
        return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);
    }
}

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


// 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/Ownable.sol


// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)

pragma solidity ^0.8.0;


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

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

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

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

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

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        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: contracts/IERC721A.sol


// ERC721A Contracts v4.0.0
// Creator: Chiru Labs

pragma solidity ^0.8.4;

/**
 * @dev Interface of an ERC721A compliant contract.
 */
interface IERC721A {
    /**
     * The caller must own the token or be an approved operator.
     */
    error ApprovalCallerNotOwnerNorApproved();

    /**
     * The token does not exist.
     */
    error ApprovalQueryForNonexistentToken();

    /**
     * The caller cannot approve to their own address.
     */
    error ApproveToCaller();

    /**
     * The caller cannot approve to the current owner.
     */
    error ApprovalToCurrentOwner();

    /**
     * Cannot query the balance for the zero address.
     */
    error BalanceQueryForZeroAddress();

    /**
     * Cannot mint to the zero address.
     */
    error MintToZeroAddress();

    /**
     * The quantity of tokens minted must be more than zero.
     */
    error MintZeroQuantity();

    /**
     * The token does not exist.
     */
    error OwnerQueryForNonexistentToken();

    /**
     * The caller must own the token or be an approved operator.
     */
    error TransferCallerNotOwnerNorApproved();

    /**
     * The token must be owned by `from`.
     */
    error TransferFromIncorrectOwner();

    /**
     * Cannot safely transfer to a contract that does not implement the ERC721Receiver interface.
     */
    error TransferToNonERC721ReceiverImplementer();

    /**
     * Cannot transfer to the zero address.
     */
    error TransferToZeroAddress();

    /**
     * The token does not exist.
     */
    error URIQueryForNonexistentToken();

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

    /**
     * @dev Returns the total amount of tokens stored by the contract.
     *
     * Burned tokens are calculated here, use `_totalMinted()` if you want to count just minted tokens.
     */
    function totalSupply() external view returns (uint256);

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

    // ==============================
    //            IERC721
    // ==============================

    /**
     * @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`.
     *
     * 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;

    /**
     * @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 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 the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

    /**
     * @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);

    // ==============================
    //        IERC721Metadata
    // ==============================

    /**
     * @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: contracts/ERC721A.sol


// ERC721A Contracts v4.0.0
// Creator: Chiru Labs

pragma solidity ^0.8.4;


/**
 * @dev ERC721 token receiver interface.
 */
interface ERC721A__IERC721Receiver {
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension. Built to optimize for lower gas during batch mints.
 *
 * Assumes serials are sequentially minted starting at _startTokenId() (defaults to 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**256 - 1 (max value of uint256).
 */
contract ERC721A is IERC721A {
    // Mask of an entry in packed address data.
    uint256 private constant BITMASK_ADDRESS_DATA_ENTRY = (1 << 64) - 1;

    // The bit position of `numberMinted` in packed address data.
    uint256 private constant BITPOS_NUMBER_MINTED = 64;

    // The bit position of `numberBurned` in packed address data.
    uint256 private constant BITPOS_NUMBER_BURNED = 128;

    // The bit position of `aux` in packed address data.
    uint256 private constant BITPOS_AUX = 192;

    // Mask of all 256 bits in packed address data except the 64 bits for `aux`.
    uint256 private constant BITMASK_AUX_COMPLEMENT = (1 << 192) - 1;

    // The bit position of `startTimestamp` in packed ownership.
    uint256 private constant BITPOS_START_TIMESTAMP = 160;

    // The bit mask of the `burned` bit in packed ownership.
    uint256 private constant BITMASK_BURNED = 1 << 224;
    
    // The bit position of the `nextInitialized` bit in packed ownership.
    uint256 private constant BITPOS_NEXT_INITIALIZED = 225;

    // The bit mask of the `nextInitialized` bit in packed ownership.
    uint256 private constant BITMASK_NEXT_INITIALIZED = 1 << 225;

    // The tokenId of the next token to be minted.
    uint256 private _currentIndex;

    // The number of tokens burned.
    uint256 private _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 `_packedOwnershipOf` implementation for details.
    //
    // Bits Layout:
    // - [0..159]   `addr`
    // - [160..223] `startTimestamp`
    // - [224]      `burned`
    // - [225]      `nextInitialized`
    mapping(uint256 => uint256) private _packedOwnerships;

    // Mapping owner address to address data.
    //
    // Bits Layout:
    // - [0..63]    `balance`
    // - [64..127]  `numberMinted`
    // - [128..191] `numberBurned`
    // - [192..255] `aux`
    mapping(address => uint256) private _packedAddressData;

    // 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_;
        _currentIndex = _startTokenId();
    }

    /**
     * @dev Returns the starting token ID. 
     * To change the starting token ID, please override this function.
     */
    function _startTokenId() internal view virtual returns (uint256) {
        return 0;
    }

    /**
     * @dev Returns the next token ID to be minted.
     */
    function _nextTokenId() internal view returns (uint256) {
        return _currentIndex;
    }

    /**
     * @dev Returns the total number of tokens in existence.
     * Burned tokens will reduce the count. 
     * To get the total number of tokens minted, please see `_totalMinted`.
     */
    function totalSupply() public view override returns (uint256) {
        // Counter underflow is impossible as _burnCounter cannot be incremented
        // more than `_currentIndex - _startTokenId()` times.
        unchecked {
            return _currentIndex - _burnCounter - _startTokenId();
        }
    }

    /**
     * @dev Returns the total amount of tokens minted in the contract.
     */
    function _totalMinted() internal view returns (uint256) {
        // Counter underflow is impossible as _currentIndex does not decrement,
        // and it is initialized to `_startTokenId()`
        unchecked {
            return _currentIndex - _startTokenId();
        }
    }

    /**
     * @dev Returns the total number of tokens burned.
     */
    function _totalBurned() internal view returns (uint256) {
        return _burnCounter;
    }

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        // The interface IDs are constants representing the first 4 bytes of the XOR of
        // all function selectors in the interface. See: https://eips.ethereum.org/EIPS/eip-165
        // e.g. `bytes4(i.functionA.selector ^ i.functionB.selector ^ ...)`
        return
            interfaceId == 0x01ffc9a7 || // ERC165 interface ID for ERC165.
            interfaceId == 0x80ac58cd || // ERC165 interface ID for ERC721.
            interfaceId == 0x5b5e139f; // ERC165 interface ID for ERC721Metadata.
    }

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

    /**
     * Returns the number of tokens minted by `owner`.
     */
    function _numberMinted(address owner) internal view returns (uint256) {
        return (_packedAddressData[owner] >> BITPOS_NUMBER_MINTED) & BITMASK_ADDRESS_DATA_ENTRY;
    }

    /**
     * Returns the number of tokens burned by or on behalf of `owner`.
     */
    function _numberBurned(address owner) internal view returns (uint256) {
        return (_packedAddressData[owner] >> BITPOS_NUMBER_BURNED) & BITMASK_ADDRESS_DATA_ENTRY;
    }

    /**
     * Returns the auxillary data for `owner`. (e.g. number of whitelist mint slots used).
     */
    function _getAux(address owner) internal view returns (uint64) {
        return uint64(_packedAddressData[owner] >> BITPOS_AUX);
    }

    /**
     * Sets the auxillary data for `owner`. (e.g. number of whitelist mint slots used).
     * If there are multiple variables, please pack them into a uint64.
     */
    function _setAux(address owner, uint64 aux) internal {
        uint256 packed = _packedAddressData[owner];
        uint256 auxCasted;
        assembly { // Cast aux without masking.
            auxCasted := aux
        }
        packed = (packed & BITMASK_AUX_COMPLEMENT) | (auxCasted << BITPOS_AUX);
        _packedAddressData[owner] = packed;
    }

    /**
     * Returns the packed ownership data of `tokenId`.
     */
    function _packedOwnershipOf(uint256 tokenId) private view returns (uint256) {
        uint256 curr = tokenId;

        unchecked {
            if (_startTokenId() <= curr)
                if (curr < _currentIndex) {
                    uint256 packed = _packedOwnerships[curr];
                    // If not burned.
                    if (packed & BITMASK_BURNED == 0) {
                        // 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.
                        //
                        // We can directly compare the packed value.
                        // If the address is zero, packed is zero.
                        while (packed == 0) {
                            packed = _packedOwnerships[--curr];
                        }
                        return packed;
                    }
                }
        }
        revert OwnerQueryForNonexistentToken();
    }

    /**
     * Returns the unpacked `TokenOwnership` struct from `packed`.
     */
    function _unpackedOwnership(uint256 packed) private pure returns (TokenOwnership memory ownership) {
        ownership.addr = address(uint160(packed));
        ownership.startTimestamp = uint64(packed >> BITPOS_START_TIMESTAMP);
        ownership.burned = packed & BITMASK_BURNED != 0;
    }

    /**
     * Returns the unpacked `TokenOwnership` struct at `index`.
     */
    function _ownershipAt(uint256 index) internal view returns (TokenOwnership memory) {
        return _unpackedOwnership(_packedOwnerships[index]);
    }

    /**
     * @dev Initializes the ownership slot minted at `index` for efficiency purposes.
     */
    function _initializeOwnershipAt(uint256 index) internal {
        if (_packedOwnerships[index] == 0) {
            _packedOwnerships[index] = _packedOwnershipOf(index);
        }
    }

    /**
     * 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) {
        return _unpackedOwnership(_packedOwnershipOf(tokenId));
    }

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

    /**
     * @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, _toString(tokenId))) : '';
    }

    /**
     * @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 Casts the address to uint256 without masking.
     */
    function _addressToUint256(address value) private pure returns (uint256 result) {
        assembly {
            result := value
        }
    }

    /**
     * @dev Casts the boolean to uint256 without branching.
     */
    function _boolToUint256(bool value) private pure returns (uint256 result) {
        assembly {
            result := value
        }
    }

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public override {
        address owner = address(uint160(_packedOwnershipOf(tokenId)));
        if (to == owner) revert ApprovalToCurrentOwner();

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

        _tokenApprovals[tokenId] = to;
        emit Approval(owner, to, tokenId);
    }

    /**
     * @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 virtual override {
        if (operator == _msgSenderERC721A()) revert ApproveToCaller();

        _operatorApprovals[_msgSenderERC721A()][operator] = approved;
        emit ApprovalForAll(_msgSenderERC721A(), 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 (to.code.length != 0)
            if (!_checkContractOnERC721Received(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
            _startTokenId() <= tokenId &&
            tokenId < _currentIndex && // If within bounds,
            _packedOwnerships[tokenId] & BITMASK_BURNED == 0; // and not burned.
    }

    /**
     * @dev Equivalent to `_safeMint(to, quantity, '')`.
     */
    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 {
        uint256 startTokenId = _currentIndex;
        if (_addressToUint256(to) == 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 > 1.8e19 (2**64) - 1
        // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1
        unchecked {
            // Updates:
            // - `balance += quantity`.
            // - `numberMinted += quantity`.
            //
            // We can directly add to the balance and number minted.
            _packedAddressData[to] += quantity * ((1 << BITPOS_NUMBER_MINTED) | 1);

            // Updates:
            // - `address` to the owner.
            // - `startTimestamp` to the timestamp of minting.
            // - `burned` to `false`.
            // - `nextInitialized` to `quantity == 1`.
            _packedOwnerships[startTokenId] =
                _addressToUint256(to) |
                (block.timestamp << BITPOS_START_TIMESTAMP) |
                (_boolToUint256(quantity == 1) << BITPOS_NEXT_INITIALIZED);

            uint256 updatedIndex = startTokenId;
            uint256 end = updatedIndex + quantity;

            if (to.code.length != 0) {
                do {
                    emit Transfer(address(0), to, updatedIndex);
                    if (!_checkContractOnERC721Received(address(0), to, updatedIndex++, _data)) {
                        revert TransferToNonERC721ReceiverImplementer();
                    }
                } while (updatedIndex < end);
                // Reentrancy protection
                if (_currentIndex != startTokenId) revert();
            } else {
                do {
                    emit Transfer(address(0), to, updatedIndex++);
                } while (updatedIndex < end);
            }
            _currentIndex = updatedIndex;
        }
        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }

    /**
     * @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) internal {
        uint256 startTokenId = _currentIndex;
        if (_addressToUint256(to) == 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 > 1.8e19 (2**64) - 1
        // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1
        unchecked {
            // Updates:
            // - `balance += quantity`.
            // - `numberMinted += quantity`.
            //
            // We can directly add to the balance and number minted.
            _packedAddressData[to] += quantity * ((1 << BITPOS_NUMBER_MINTED) | 1);

            // Updates:
            // - `address` to the owner.
            // - `startTimestamp` to the timestamp of minting.
            // - `burned` to `false`.
            // - `nextInitialized` to `quantity == 1`.
            _packedOwnerships[startTokenId] =
                _addressToUint256(to) |
                (block.timestamp << BITPOS_START_TIMESTAMP) |
                (_boolToUint256(quantity == 1) << BITPOS_NEXT_INITIALIZED);

            uint256 updatedIndex = startTokenId;
            uint256 end = updatedIndex + quantity;

            do {
                emit Transfer(address(0), to, updatedIndex++);
            } while (updatedIndex < end);

            _currentIndex = 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 {
        uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId);

        if (address(uint160(prevOwnershipPacked)) != from) revert TransferFromIncorrectOwner();

        address approvedAddress = _tokenApprovals[tokenId];

        bool isApprovedOrOwner = (_msgSenderERC721A() == from ||
            isApprovedForAll(from, _msgSenderERC721A()) ||
            approvedAddress == _msgSenderERC721A());

        if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        if (_addressToUint256(to) == 0) revert TransferToZeroAddress();

        _beforeTokenTransfers(from, to, tokenId, 1);

        // Clear approvals from the previous owner.
        if (_addressToUint256(approvedAddress) != 0) {
            delete _tokenApprovals[tokenId];
        }

        // 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**256.
        unchecked {
            // We can directly increment and decrement the balances.
            --_packedAddressData[from]; // Updates: `balance -= 1`.
            ++_packedAddressData[to]; // Updates: `balance += 1`.

            // Updates:
            // - `address` to the next owner.
            // - `startTimestamp` to the timestamp of transfering.
            // - `burned` to `false`.
            // - `nextInitialized` to `true`.
            _packedOwnerships[tokenId] =
                _addressToUint256(to) |
                (block.timestamp << BITPOS_START_TIMESTAMP) |
                BITMASK_NEXT_INITIALIZED;

            // If the next slot may not have been initialized (i.e. `nextInitialized == false`) .
            if (prevOwnershipPacked & BITMASK_NEXT_INITIALIZED == 0) {
                uint256 nextTokenId = tokenId + 1;
                // If the next slot's address is zero and not burned (i.e. packed value is zero).
                if (_packedOwnerships[nextTokenId] == 0) {
                    // If the next slot is within bounds.
                    if (nextTokenId != _currentIndex) {
                        // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`.
                        _packedOwnerships[nextTokenId] = prevOwnershipPacked;
                    }
                }
            }
        }

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

    /**
     * @dev Equivalent to `_burn(tokenId, false)`.
     */
    function _burn(uint256 tokenId) internal virtual {
        _burn(tokenId, false);
    }

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

        address from = address(uint160(prevOwnershipPacked));
        address approvedAddress = _tokenApprovals[tokenId];

        if (approvalCheck) {
            bool isApprovedOrOwner = (_msgSenderERC721A() == from ||
                isApprovedForAll(from, _msgSenderERC721A()) ||
                approvedAddress == _msgSenderERC721A());

            if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        }

        _beforeTokenTransfers(from, address(0), tokenId, 1);

        // Clear approvals from the previous owner.
        if (_addressToUint256(approvedAddress) != 0) {
            delete _tokenApprovals[tokenId];
        }

        // 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**256.
        unchecked {
            // Updates:
            // - `balance -= 1`.
            // - `numberBurned += 1`.
            //
            // We can directly decrement the balance, and increment the number burned.
            // This is equivalent to `packed -= 1; packed += 1 << BITPOS_NUMBER_BURNED;`.
            _packedAddressData[from] += (1 << BITPOS_NUMBER_BURNED) - 1;

            // Updates:
            // - `address` to the last owner.
            // - `startTimestamp` to the timestamp of burning.
            // - `burned` to `true`.
            // - `nextInitialized` to `true`.
            _packedOwnerships[tokenId] =
                _addressToUint256(from) |
                (block.timestamp << BITPOS_START_TIMESTAMP) |
                BITMASK_BURNED | 
                BITMASK_NEXT_INITIALIZED;

            // If the next slot may not have been initialized (i.e. `nextInitialized == false`) .
            if (prevOwnershipPacked & BITMASK_NEXT_INITIALIZED == 0) {
                uint256 nextTokenId = tokenId + 1;
                // If the next slot's address is zero and not burned (i.e. packed value is zero).
                if (_packedOwnerships[nextTokenId] == 0) {
                    // If the next slot is within bounds.
                    if (nextTokenId != _currentIndex) {
                        // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`.
                        _packedOwnerships[nextTokenId] = prevOwnershipPacked;
                    }
                }
            }
        }

        emit Transfer(from, address(0), tokenId);
        _afterTokenTransfers(from, address(0), tokenId, 1);

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

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target 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 _checkContractOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        try ERC721A__IERC721Receiver(to).onERC721Received(_msgSenderERC721A(), from, tokenId, _data) returns (
            bytes4 retval
        ) {
            return retval == ERC721A__IERC721Receiver(to).onERC721Received.selector;
        } catch (bytes memory reason) {
            if (reason.length == 0) {
                revert TransferToNonERC721ReceiverImplementer();
            } else {
                assembly {
                    revert(add(32, reason), mload(reason))
                }
            }
        }
    }

    /**
     * @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 {}

    /**
     * @dev Returns the message sender (defaults to `msg.sender`).
     *
     * If you are writing GSN compatible contracts, you need to override this function.
     */
    function _msgSenderERC721A() internal view virtual returns (address) {
        return msg.sender;
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function _toString(uint256 value) internal pure returns (string memory ptr) {
        assembly {
            // The maximum value of a uint256 contains 78 digits (1 byte per digit), 
            // but we allocate 128 bytes to keep the free memory pointer 32-byte word aliged.
            // We will need 1 32-byte word to store the length, 
            // and 3 32-byte words to store a maximum of 78 digits. Total: 32 + 3 * 32 = 128.
            ptr := add(mload(0x40), 128)
            // Update the free memory pointer to allocate.
            mstore(0x40, ptr)

            // Cache the end of the memory to calculate the length later.
            let end := ptr

            // We write the string from the rightmost digit to the leftmost digit.
            // The following is essentially a do-while loop that also handles the zero case.
            // Costs a bit more than early returning for the zero case,
            // but cheaper in terms of deployment and overall runtime costs.
            for { 
                // Initialize and perform the first pass without check.
                let temp := value
                // Move the pointer 1 byte leftwards to point to an empty character slot.
                ptr := sub(ptr, 1)
                // Write the character to the pointer. 48 is the ASCII index of '0'.
                mstore8(ptr, add(48, mod(temp, 10)))
                temp := div(temp, 10)
            } temp { 
                // Keep dividing `temp` until zero.
                temp := div(temp, 10)
            } { // Body of the for loop.
                ptr := sub(ptr, 1)
                mstore8(ptr, add(48, mod(temp, 10)))
            }
            
            let length := sub(end, ptr)
            // Move the pointer 32 bytes leftwards to make room for the length.
            ptr := sub(ptr, 32)
            // Store the length.
            mstore(ptr, length)
        }
    }
}
// File: contracts/potatoByKingGeorge.sol

//SPDX-License-Identifier: MIT
// pragma solidity ^0.8.9;
pragma solidity >=0.7.0 <0.9.0;





contract PotatoByKingGeorge is ERC721A, Ownable {
    using Strings for uint256;
    
    uint256 public constant MAX_SUPPLY = 6666;
    bytes32 public merkleRoot;

    uint256 public salePrice = 0.015 ether;
    uint256 public maxPerTx = 5;

    bool private publicSale = false;
    bool private whitelistSale = false;

    string public baseURI;

    constructor() ERC721A("Potato By King George", "PBKG") {}

    /**
     * @notice token start from id 1
     */
    function _startTokenId() internal view virtual override returns (uint256) {
        return 1;
    }

    /**
     * @notice team mint
     */
    function teamMint(address[] memory to, uint quantity) external onlyOwner {
        require((to.length * quantity) + totalSupply() <= MAX_SUPPLY, "Sold out");

        for(uint i=0; i<to.length; i++){
            _mint(to[i], quantity);
        }
    }
    
    /**
     * @notice whitelist mint
     */
    function whitelistMint(uint quantity, bytes32[] memory proof) external payable {
        require(whitelistSale, "Whitelist sale is not Active.");
        require(MerkleProof.verify(proof, merkleRoot, keccak256(abi.encodePacked(msg.sender))), "Not whitelisted.");       
        _mint(quantity);
    }

    /**
     * @notice public mint
     */
    function publicMint(uint quantity) external payable {
        require(publicSale, "Public sale is not active.");
        _mint(quantity);
    }

    /**
     * @notice mint
     */
    function _mint(uint quantity) internal {
        require(quantity <= maxPerTx && quantity > 0, "Invalid quantity or Max Per Tx.");
        require(quantity + totalSupply() <= MAX_SUPPLY, "Sold out");
        if(balanceOf(_msgSender()) == 0) {
            require(msg.value >= salePrice * (quantity - 1), "Not enough ETH to mint");
        } else {
            require(msg.value >= salePrice * quantity, "Not enough ETH to mint");
        }
        _mint(_msgSender(), quantity);
    }

    /**
     * @notice set whitelist merkle root
     */
    function setMerkleRoot(bytes32 _rootHash) external onlyOwner {
        merkleRoot = _rootHash;
    }

    /**
     * @notice set max per transaction
     */
    function setMaxTx(uint256 _setMaxTx) external onlyOwner {
        maxPerTx = _setMaxTx;
    }
    
    /**
     * @notice set sale price
     */
    function setSalePrice(uint256 _salePrice) external onlyOwner {
        salePrice = _salePrice;
    }

    /**
     * @notice set base uri
     */
    function setBaseURI(string memory uri) external onlyOwner {
        baseURI = uri;
    }

    /**
     * @notice switch public sales status
     */
    function switchPublicSales() external onlyOwner {
        publicSale = !publicSale;
    }

    /**
     * @notice switch whitelist mint status
     */
    function switchWhitelistStatus() external onlyOwner {
        whitelistSale = !whitelistSale;
    }

    /**
     * @notice token URI
     */
    function tokenURI(uint256 _tokenId)
        public
        view
        virtual
        override
        returns (string memory)
    {
        require(_exists(_tokenId), "ERC721Metadata: URI query for nonexistent token");
        return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, _tokenId.toString())) : '';
    }

    /**
     * @notice transfer funds
     */
    function withdrawal() external onlyOwner {
        uint256 balance = address(this).balance;
        payable(msg.sender).transfer(balance);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"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":"OwnerQueryForNonexistentToken","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":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"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":"maxPerTx","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"merkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"publicMint","outputs":[],"stateMutability":"payable","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":[],"name":"salePrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":"uri","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_setMaxTx","type":"uint256"}],"name":"setMaxTx","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_rootHash","type":"bytes32"}],"name":"setMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_salePrice","type":"uint256"}],"name":"setSalePrice","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":"switchPublicSales","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"switchWhitelistStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"to","type":"address[]"},{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"teamMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"whitelistMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"withdrawal","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405266354a6ba7a18000600a556005600b556000600c60006101000a81548160ff0219169083151502179055506000600c60016101000a81548160ff0219169083151502179055503480156200005757600080fd5b506040518060400160405280601581526020017f506f7461746f204279204b696e672047656f72676500000000000000000000008152506040518060400160405280600481526020017f50424b47000000000000000000000000000000000000000000000000000000008152508160029080519060200190620000dc9291906200020b565b508060039080519060200190620000f59291906200020b565b50620001066200013460201b60201c565b60008190555050506200012e620001226200013d60201b60201c565b6200014560201b60201c565b62000320565b60006001905090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8280546200021990620002bb565b90600052602060002090601f0160209004810192826200023d576000855562000289565b82601f106200025857805160ff191683800117855562000289565b8280016001018555821562000289579182015b82811115620002885782518255916020019190600101906200026b565b5b5090506200029891906200029c565b5090565b5b80821115620002b75760008160009055506001016200029d565b5090565b60006002820490506001821680620002d457607f821691505b60208210811415620002eb57620002ea620002f1565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6133c580620003306000396000f3fe6080604052600436106101e35760003560e01c8063715018a611610102578063c87b56dd11610095578063f2dc824c11610064578063f2dc824c14610688578063f2fde38b146106b1578063f51f96dd146106da578063f968adbe14610705576101e3565b8063c87b56dd146105db578063d2cab05614610618578063d4e9329214610634578063e985e9c51461064b576101e3565b806395d89b41116100d157806395d89b4114610535578063a22cb46514610560578063b88d4fde14610589578063bc337182146105b2576101e3565b8063715018a6146104b357806375be64eb146104ca5780637cb64759146104e15780638da5cb5b1461050a576101e3565b80632db115441161017a57806355f804b31161014957806355f804b3146103e55780636352211e1461040e5780636c0360eb1461044b57806370a0823114610476576101e3565b80632db115441461034a5780632eb4a7ab1461036657806332cb6b0c1461039157806342842e0e146103bc576101e3565b806318160ddd116101b657806318160ddd146102b65780631919fed7146102e157806323b872dd1461030a5780632ba661f814610333576101e3565b806301ffc9a7146101e857806306fdde0314610225578063081812fc14610250578063095ea7b31461028d575b600080fd5b3480156101f457600080fd5b5061020f600480360381019061020a919061261b565b610730565b60405161021c9190612a9d565b60405180910390f35b34801561023157600080fd5b5061023a6107c2565b6040516102479190612ad3565b60405180910390f35b34801561025c57600080fd5b50610277600480360381019061027291906126be565b610854565b6040516102849190612a36565b60405180910390f35b34801561029957600080fd5b506102b460048036038101906102af9190612552565b6108d0565b005b3480156102c257600080fd5b506102cb610a77565b6040516102d89190612c15565b60405180910390f35b3480156102ed57600080fd5b50610308600480360381019061030391906126be565b610a8e565b005b34801561031657600080fd5b50610331600480360381019061032c919061243c565b610aa0565b005b34801561033f57600080fd5b50610348610ab0565b005b610364600480360381019061035f91906126be565b610ae4565b005b34801561037257600080fd5b5061037b610b3f565b6040516103889190612ab8565b60405180910390f35b34801561039d57600080fd5b506103a6610b45565b6040516103b39190612c15565b60405180910390f35b3480156103c857600080fd5b506103e360048036038101906103de919061243c565b610b4b565b005b3480156103f157600080fd5b5061040c60048036038101906104079190612675565b610b6b565b005b34801561041a57600080fd5b50610435600480360381019061043091906126be565b610b8d565b6040516104429190612a36565b60405180910390f35b34801561045757600080fd5b50610460610b9f565b60405161046d9190612ad3565b60405180910390f35b34801561048257600080fd5b5061049d600480360381019061049891906123cf565b610c2d565b6040516104aa9190612c15565b60405180910390f35b3480156104bf57600080fd5b506104c8610cc2565b005b3480156104d657600080fd5b506104df610cd6565b005b3480156104ed57600080fd5b50610508600480360381019061050391906125ee565b610d0a565b005b34801561051657600080fd5b5061051f610d1c565b60405161052c9190612a36565b60405180910390f35b34801561054157600080fd5b5061054a610d46565b6040516105579190612ad3565b60405180910390f35b34801561056c57600080fd5b5061058760048036038101906105829190612512565b610dd8565b005b34801561059557600080fd5b506105b060048036038101906105ab919061248f565b610f50565b005b3480156105be57600080fd5b506105d960048036038101906105d491906126be565b610fc3565b005b3480156105e757600080fd5b5061060260048036038101906105fd91906126be565b610fd5565b60405161060f9190612ad3565b60405180910390f35b610632600480360381019061062d91906126eb565b61107e565b005b34801561064057600080fd5b5061064961114c565b005b34801561065757600080fd5b50610672600480360381019061066d91906123fc565b6111a3565b60405161067f9190612a9d565b60405180910390f35b34801561069457600080fd5b506106af60048036038101906106aa9190612592565b611237565b005b3480156106bd57600080fd5b506106d860048036038101906106d391906123cf565b6112ea565b005b3480156106e657600080fd5b506106ef61136e565b6040516106fc9190612c15565b60405180910390f35b34801561071157600080fd5b5061071a611374565b6040516107279190612c15565b60405180910390f35b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061078b57506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806107bb5750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b6060600280546107d190612f3c565b80601f01602080910402602001604051908101604052809291908181526020018280546107fd90612f3c565b801561084a5780601f1061081f5761010080835404028352916020019161084a565b820191906000526020600020905b81548152906001019060200180831161082d57829003601f168201915b5050505050905090565b600061085f8261137a565b610895576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006108db826113d9565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610943576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166109626114a7565b73ffffffffffffffffffffffffffffffffffffffff16146109c55761098e816109896114a7565b6111a3565b6109c4576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000610a816114af565b6001546000540303905090565b610a966114b8565b80600a8190555050565b610aab838383611536565b505050565b610ab86114b8565b600c60019054906101000a900460ff1615600c60016101000a81548160ff021916908315150217905550565b600c60009054906101000a900460ff16610b33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2a90612b15565b60405180910390fd5b610b3c816118fe565b50565b60095481565b611a0a81565b610b6683838360405180602001604052806000815250610f50565b505050565b610b736114b8565b80600d9080519060200190610b89929190612092565b5050565b6000610b98826113d9565b9050919050565b600d8054610bac90612f3c565b80601f0160208091040260200160405190810160405280929190818152602001828054610bd890612f3c565b8015610c255780601f10610bfa57610100808354040283529160200191610c25565b820191906000526020600020905b815481529060010190602001808311610c0857829003601f168201915b505050505081565b600080610c3983611a84565b1415610c71576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b610cca6114b8565b610cd46000611a8e565b565b610cde6114b8565b600c60009054906101000a900460ff1615600c60006101000a81548160ff021916908315150217905550565b610d126114b8565b8060098190555050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060038054610d5590612f3c565b80601f0160208091040260200160405190810160405280929190818152602001828054610d8190612f3c565b8015610dce5780601f10610da357610100808354040283529160200191610dce565b820191906000526020600020905b815481529060010190602001808311610db157829003601f168201915b5050505050905090565b610de06114a7565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610e45576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000610e526114a7565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16610eff6114a7565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051610f449190612a9d565b60405180910390a35050565b610f5b848484611536565b60008373ffffffffffffffffffffffffffffffffffffffff163b14610fbd57610f8684848484611b54565b610fbc576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b610fcb6114b8565b80600b8190555050565b6060610fe08261137a565b61101f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101690612bb5565b60405180910390fd5b6000600d805461102e90612f3c565b9050141561104b5760405180602001604052806000815250611077565b600d61105683611cb4565b604051602001611067929190612a12565b6040516020818303038152906040525b9050919050565b600c60019054906101000a900460ff166110cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110c490612b35565b60405180910390fd5b61110081600954336040516020016110e591906129f7565b60405160208183030381529060405280519060200120611e15565b61113f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113690612bd5565b60405180910390fd5b611148826118fe565b5050565b6111546114b8565b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f1935050505015801561119f573d6000803e3d6000fd5b5050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61123f6114b8565b611a0a61124a610a77565b8284516112579190612dee565b6112619190612d67565b11156112a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161129990612bf5565b60405180910390fd5b60005b82518110156112e5576112d28382815181106112c4576112c36130ca565b5b602002602001015183611e2c565b80806112dd90612f9f565b9150506112a5565b505050565b6112f26114b8565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611362576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161135990612af5565b60405180910390fd5b61136b81611a8e565b50565b600a5481565b600b5481565b6000816113856114af565b11158015611394575060005482105b80156113d2575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600080829050806113e86114af565b116114705760005481101561146f5760006004600083815260200190815260200160002054905060007c01000000000000000000000000000000000000000000000000000000008216141561146d575b6000811415611463576004600083600190039350838152602001908152602001600020549050611438565b80925050506114a2565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b600033905090565b60006001905090565b6114c0611fdc565b73ffffffffffffffffffffffffffffffffffffffff166114de610d1c565b73ffffffffffffffffffffffffffffffffffffffff1614611534576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161152b90612b95565b60405180910390fd5b565b6000611541826113d9565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146115a8576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006006600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060008573ffffffffffffffffffffffffffffffffffffffff166116016114a7565b73ffffffffffffffffffffffffffffffffffffffff161480611630575061162f8661162a6114a7565b6111a3565b5b8061166d575061163e6114a7565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b9050806116a6576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006116b186611a84565b14156116e9576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6116f68686866001611fe4565b600061170183611a84565b1461173d576006600085815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154600101919050819055507c020000000000000000000000000000000000000000000000000000000060a042901b61180487611a84565b1717600460008681526020019081526020016000208190555060007c02000000000000000000000000000000000000000000000000000000008416141561188e57600060018501905060006004600083815260200190815260200160002054141561188c57600054811461188b578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46118f68686866001611fea565b505050505050565b600b5481111580156119105750600081115b61194f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161194690612b75565b60405180910390fd5b611a0a61195a610a77565b826119659190612d67565b11156119a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161199d90612bf5565b60405180910390fd5b60006119b86119b3611fdc565b610c2d565b1415611a1f576001816119cb9190612e48565b600a546119d89190612dee565b341015611a1a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a1190612b55565b60405180910390fd5b611a70565b80600a54611a2d9190612dee565b341015611a6f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a6690612b55565b60405180910390fd5b5b611a81611a7b611fdc565b82611e2c565b50565b6000819050919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611b7a6114a7565b8786866040518563ffffffff1660e01b8152600401611b9c9493929190612a51565b602060405180830381600087803b158015611bb657600080fd5b505af1925050508015611be757506040513d601f19601f82011682018060405250810190611be49190612648565b60015b611c61573d8060008114611c17576040519150601f19603f3d011682016040523d82523d6000602084013e611c1c565b606091505b50600081511415611c59576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b60606000821415611cfc576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050611e10565b600082905060005b60008214611d2e578080611d1790612f9f565b915050600a82611d279190612dbd565b9150611d04565b60008167ffffffffffffffff811115611d4a57611d496130f9565b5b6040519080825280601f01601f191660200182016040528015611d7c5781602001600182028036833780820191505090505b5090505b60008514611e0957600182611d959190612e48565b9150600a85611da4919061300c565b6030611db09190612d67565b60f81b818381518110611dc657611dc56130ca565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85611e029190612dbd565b9450611d80565b8093505050505b919050565b600082611e228584611ff0565b1490509392505050565b6000805490506000611e3d84611a84565b1415611e75576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000821415611eb0576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611ebd6000848385611fe4565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555060e1611f2260018414612046565b901b60a042901b611f3285611a84565b171760046000838152602001908152602001600020819055506000819050600083820190505b818060010192508573ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808210611f5857816000819055505050611fd76000848385611fea565b505050565b600033905090565b50505050565b50505050565b60008082905060005b845181101561203b5761202682868381518110612019576120186130ca565b5b6020026020010151612050565b9150808061203390612f9f565b915050611ff9565b508091505092915050565b6000819050919050565b600081831061206857612063828461207b565b612073565b612072838361207b565b5b905092915050565b600082600052816020526040600020905092915050565b82805461209e90612f3c565b90600052602060002090601f0160209004810192826120c05760008555612107565b82601f106120d957805160ff1916838001178555612107565b82800160010185558215612107579182015b828111156121065782518255916020019190600101906120eb565b5b5090506121149190612118565b5090565b5b80821115612131576000816000905550600101612119565b5090565b600061214861214384612c55565b612c30565b9050808382526020820190508285602086028201111561216b5761216a61312d565b5b60005b8581101561219b57816121818882612299565b84526020840193506020830192505060018101905061216e565b5050509392505050565b60006121b86121b384612c81565b612c30565b905080838252602082019050828560208602820111156121db576121da61312d565b5b60005b8581101561220b57816121f1888261231f565b8452602084019350602083019250506001810190506121de565b5050509392505050565b600061222861222384612cad565b612c30565b90508281526020810184848401111561224457612243613132565b5b61224f848285612efa565b509392505050565b600061226a61226584612cde565b612c30565b90508281526020810184848401111561228657612285613132565b5b612291848285612efa565b509392505050565b6000813590506122a88161331c565b92915050565b600082601f8301126122c3576122c2613128565b5b81356122d3848260208601612135565b91505092915050565b600082601f8301126122f1576122f0613128565b5b81356123018482602086016121a5565b91505092915050565b60008135905061231981613333565b92915050565b60008135905061232e8161334a565b92915050565b60008135905061234381613361565b92915050565b60008151905061235881613361565b92915050565b600082601f83011261237357612372613128565b5b8135612383848260208601612215565b91505092915050565b600082601f8301126123a1576123a0613128565b5b81356123b1848260208601612257565b91505092915050565b6000813590506123c981613378565b92915050565b6000602082840312156123e5576123e461313c565b5b60006123f384828501612299565b91505092915050565b600080604083850312156124135761241261313c565b5b600061242185828601612299565b925050602061243285828601612299565b9150509250929050565b6000806000606084860312156124555761245461313c565b5b600061246386828701612299565b935050602061247486828701612299565b9250506040612485868287016123ba565b9150509250925092565b600080600080608085870312156124a9576124a861313c565b5b60006124b787828801612299565b94505060206124c887828801612299565b93505060406124d9878288016123ba565b925050606085013567ffffffffffffffff8111156124fa576124f9613137565b5b6125068782880161235e565b91505092959194509250565b600080604083850312156125295761252861313c565b5b600061253785828601612299565b92505060206125488582860161230a565b9150509250929050565b600080604083850312156125695761256861313c565b5b600061257785828601612299565b9250506020612588858286016123ba565b9150509250929050565b600080604083850312156125a9576125a861313c565b5b600083013567ffffffffffffffff8111156125c7576125c6613137565b5b6125d3858286016122ae565b92505060206125e4858286016123ba565b9150509250929050565b6000602082840312156126045761260361313c565b5b60006126128482850161231f565b91505092915050565b6000602082840312156126315761263061313c565b5b600061263f84828501612334565b91505092915050565b60006020828403121561265e5761265d61313c565b5b600061266c84828501612349565b91505092915050565b60006020828403121561268b5761268a61313c565b5b600082013567ffffffffffffffff8111156126a9576126a8613137565b5b6126b58482850161238c565b91505092915050565b6000602082840312156126d4576126d361313c565b5b60006126e2848285016123ba565b91505092915050565b600080604083850312156127025761270161313c565b5b6000612710858286016123ba565b925050602083013567ffffffffffffffff81111561273157612730613137565b5b61273d858286016122dc565b9150509250929050565b61275081612e7c565b82525050565b61276761276282612e7c565b612fe8565b82525050565b61277681612e8e565b82525050565b61278581612e9a565b82525050565b600061279682612d24565b6127a08185612d3a565b93506127b0818560208601612f09565b6127b981613141565b840191505092915050565b60006127cf82612d2f565b6127d98185612d4b565b93506127e9818560208601612f09565b6127f281613141565b840191505092915050565b600061280882612d2f565b6128128185612d5c565b9350612822818560208601612f09565b80840191505092915050565b6000815461283b81612f3c565b6128458186612d5c565b945060018216600081146128605760018114612871576128a4565b60ff198316865281860193506128a4565b61287a85612d0f565b60005b8381101561289c5781548189015260018201915060208101905061287d565b838801955050505b50505092915050565b60006128ba602683612d4b565b91506128c58261315f565b604082019050919050565b60006128dd601a83612d4b565b91506128e8826131ae565b602082019050919050565b6000612900601d83612d4b565b915061290b826131d7565b602082019050919050565b6000612923601683612d4b565b915061292e82613200565b602082019050919050565b6000612946601f83612d4b565b915061295182613229565b602082019050919050565b6000612969602083612d4b565b915061297482613252565b602082019050919050565b600061298c602f83612d4b565b91506129978261327b565b604082019050919050565b60006129af601083612d4b565b91506129ba826132ca565b602082019050919050565b60006129d2600883612d4b565b91506129dd826132f3565b602082019050919050565b6129f181612ef0565b82525050565b6000612a038284612756565b60148201915081905092915050565b6000612a1e828561282e565b9150612a2a82846127fd565b91508190509392505050565b6000602082019050612a4b6000830184612747565b92915050565b6000608082019050612a666000830187612747565b612a736020830186612747565b612a8060408301856129e8565b8181036060830152612a92818461278b565b905095945050505050565b6000602082019050612ab2600083018461276d565b92915050565b6000602082019050612acd600083018461277c565b92915050565b60006020820190508181036000830152612aed81846127c4565b905092915050565b60006020820190508181036000830152612b0e816128ad565b9050919050565b60006020820190508181036000830152612b2e816128d0565b9050919050565b60006020820190508181036000830152612b4e816128f3565b9050919050565b60006020820190508181036000830152612b6e81612916565b9050919050565b60006020820190508181036000830152612b8e81612939565b9050919050565b60006020820190508181036000830152612bae8161295c565b9050919050565b60006020820190508181036000830152612bce8161297f565b9050919050565b60006020820190508181036000830152612bee816129a2565b9050919050565b60006020820190508181036000830152612c0e816129c5565b9050919050565b6000602082019050612c2a60008301846129e8565b92915050565b6000612c3a612c4b565b9050612c468282612f6e565b919050565b6000604051905090565b600067ffffffffffffffff821115612c7057612c6f6130f9565b5b602082029050602081019050919050565b600067ffffffffffffffff821115612c9c57612c9b6130f9565b5b602082029050602081019050919050565b600067ffffffffffffffff821115612cc857612cc76130f9565b5b612cd182613141565b9050602081019050919050565b600067ffffffffffffffff821115612cf957612cf86130f9565b5b612d0282613141565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000612d7282612ef0565b9150612d7d83612ef0565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612db257612db161303d565b5b828201905092915050565b6000612dc882612ef0565b9150612dd383612ef0565b925082612de357612de261306c565b5b828204905092915050565b6000612df982612ef0565b9150612e0483612ef0565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612e3d57612e3c61303d565b5b828202905092915050565b6000612e5382612ef0565b9150612e5e83612ef0565b925082821015612e7157612e7061303d565b5b828203905092915050565b6000612e8782612ed0565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015612f27578082015181840152602081019050612f0c565b83811115612f36576000848401525b50505050565b60006002820490506001821680612f5457607f821691505b60208210811415612f6857612f6761309b565b5b50919050565b612f7782613141565b810181811067ffffffffffffffff82111715612f9657612f956130f9565b5b80604052505050565b6000612faa82612ef0565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415612fdd57612fdc61303d565b5b600182019050919050565b6000612ff382612ffa565b9050919050565b600061300582613152565b9050919050565b600061301782612ef0565b915061302283612ef0565b9250826130325761303161306c565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f5075626c69632073616c65206973206e6f74206163746976652e000000000000600082015250565b7f57686974656c6973742073616c65206973206e6f74204163746976652e000000600082015250565b7f4e6f7420656e6f7567682045544820746f206d696e7400000000000000000000600082015250565b7f496e76616c6964207175616e74697479206f72204d6178205065722054782e00600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4e6f742077686974656c69737465642e00000000000000000000000000000000600082015250565b7f536f6c64206f7574000000000000000000000000000000000000000000000000600082015250565b61332581612e7c565b811461333057600080fd5b50565b61333c81612e8e565b811461334757600080fd5b50565b61335381612e9a565b811461335e57600080fd5b50565b61336a81612ea4565b811461337557600080fd5b50565b61338181612ef0565b811461338c57600080fd5b5056fea26469706673582212207d6a59381acc477b737523fe1b9bbda6c4e13124194e338cbaf8292bad3753c464736f6c63430008070033

Deployed Bytecode

0x6080604052600436106101e35760003560e01c8063715018a611610102578063c87b56dd11610095578063f2dc824c11610064578063f2dc824c14610688578063f2fde38b146106b1578063f51f96dd146106da578063f968adbe14610705576101e3565b8063c87b56dd146105db578063d2cab05614610618578063d4e9329214610634578063e985e9c51461064b576101e3565b806395d89b41116100d157806395d89b4114610535578063a22cb46514610560578063b88d4fde14610589578063bc337182146105b2576101e3565b8063715018a6146104b357806375be64eb146104ca5780637cb64759146104e15780638da5cb5b1461050a576101e3565b80632db115441161017a57806355f804b31161014957806355f804b3146103e55780636352211e1461040e5780636c0360eb1461044b57806370a0823114610476576101e3565b80632db115441461034a5780632eb4a7ab1461036657806332cb6b0c1461039157806342842e0e146103bc576101e3565b806318160ddd116101b657806318160ddd146102b65780631919fed7146102e157806323b872dd1461030a5780632ba661f814610333576101e3565b806301ffc9a7146101e857806306fdde0314610225578063081812fc14610250578063095ea7b31461028d575b600080fd5b3480156101f457600080fd5b5061020f600480360381019061020a919061261b565b610730565b60405161021c9190612a9d565b60405180910390f35b34801561023157600080fd5b5061023a6107c2565b6040516102479190612ad3565b60405180910390f35b34801561025c57600080fd5b50610277600480360381019061027291906126be565b610854565b6040516102849190612a36565b60405180910390f35b34801561029957600080fd5b506102b460048036038101906102af9190612552565b6108d0565b005b3480156102c257600080fd5b506102cb610a77565b6040516102d89190612c15565b60405180910390f35b3480156102ed57600080fd5b50610308600480360381019061030391906126be565b610a8e565b005b34801561031657600080fd5b50610331600480360381019061032c919061243c565b610aa0565b005b34801561033f57600080fd5b50610348610ab0565b005b610364600480360381019061035f91906126be565b610ae4565b005b34801561037257600080fd5b5061037b610b3f565b6040516103889190612ab8565b60405180910390f35b34801561039d57600080fd5b506103a6610b45565b6040516103b39190612c15565b60405180910390f35b3480156103c857600080fd5b506103e360048036038101906103de919061243c565b610b4b565b005b3480156103f157600080fd5b5061040c60048036038101906104079190612675565b610b6b565b005b34801561041a57600080fd5b50610435600480360381019061043091906126be565b610b8d565b6040516104429190612a36565b60405180910390f35b34801561045757600080fd5b50610460610b9f565b60405161046d9190612ad3565b60405180910390f35b34801561048257600080fd5b5061049d600480360381019061049891906123cf565b610c2d565b6040516104aa9190612c15565b60405180910390f35b3480156104bf57600080fd5b506104c8610cc2565b005b3480156104d657600080fd5b506104df610cd6565b005b3480156104ed57600080fd5b50610508600480360381019061050391906125ee565b610d0a565b005b34801561051657600080fd5b5061051f610d1c565b60405161052c9190612a36565b60405180910390f35b34801561054157600080fd5b5061054a610d46565b6040516105579190612ad3565b60405180910390f35b34801561056c57600080fd5b5061058760048036038101906105829190612512565b610dd8565b005b34801561059557600080fd5b506105b060048036038101906105ab919061248f565b610f50565b005b3480156105be57600080fd5b506105d960048036038101906105d491906126be565b610fc3565b005b3480156105e757600080fd5b5061060260048036038101906105fd91906126be565b610fd5565b60405161060f9190612ad3565b60405180910390f35b610632600480360381019061062d91906126eb565b61107e565b005b34801561064057600080fd5b5061064961114c565b005b34801561065757600080fd5b50610672600480360381019061066d91906123fc565b6111a3565b60405161067f9190612a9d565b60405180910390f35b34801561069457600080fd5b506106af60048036038101906106aa9190612592565b611237565b005b3480156106bd57600080fd5b506106d860048036038101906106d391906123cf565b6112ea565b005b3480156106e657600080fd5b506106ef61136e565b6040516106fc9190612c15565b60405180910390f35b34801561071157600080fd5b5061071a611374565b6040516107279190612c15565b60405180910390f35b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061078b57506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806107bb5750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b6060600280546107d190612f3c565b80601f01602080910402602001604051908101604052809291908181526020018280546107fd90612f3c565b801561084a5780601f1061081f5761010080835404028352916020019161084a565b820191906000526020600020905b81548152906001019060200180831161082d57829003601f168201915b5050505050905090565b600061085f8261137a565b610895576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006108db826113d9565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610943576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166109626114a7565b73ffffffffffffffffffffffffffffffffffffffff16146109c55761098e816109896114a7565b6111a3565b6109c4576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000610a816114af565b6001546000540303905090565b610a966114b8565b80600a8190555050565b610aab838383611536565b505050565b610ab86114b8565b600c60019054906101000a900460ff1615600c60016101000a81548160ff021916908315150217905550565b600c60009054906101000a900460ff16610b33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2a90612b15565b60405180910390fd5b610b3c816118fe565b50565b60095481565b611a0a81565b610b6683838360405180602001604052806000815250610f50565b505050565b610b736114b8565b80600d9080519060200190610b89929190612092565b5050565b6000610b98826113d9565b9050919050565b600d8054610bac90612f3c565b80601f0160208091040260200160405190810160405280929190818152602001828054610bd890612f3c565b8015610c255780601f10610bfa57610100808354040283529160200191610c25565b820191906000526020600020905b815481529060010190602001808311610c0857829003601f168201915b505050505081565b600080610c3983611a84565b1415610c71576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b610cca6114b8565b610cd46000611a8e565b565b610cde6114b8565b600c60009054906101000a900460ff1615600c60006101000a81548160ff021916908315150217905550565b610d126114b8565b8060098190555050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060038054610d5590612f3c565b80601f0160208091040260200160405190810160405280929190818152602001828054610d8190612f3c565b8015610dce5780601f10610da357610100808354040283529160200191610dce565b820191906000526020600020905b815481529060010190602001808311610db157829003601f168201915b5050505050905090565b610de06114a7565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610e45576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000610e526114a7565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16610eff6114a7565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051610f449190612a9d565b60405180910390a35050565b610f5b848484611536565b60008373ffffffffffffffffffffffffffffffffffffffff163b14610fbd57610f8684848484611b54565b610fbc576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b610fcb6114b8565b80600b8190555050565b6060610fe08261137a565b61101f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101690612bb5565b60405180910390fd5b6000600d805461102e90612f3c565b9050141561104b5760405180602001604052806000815250611077565b600d61105683611cb4565b604051602001611067929190612a12565b6040516020818303038152906040525b9050919050565b600c60019054906101000a900460ff166110cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110c490612b35565b60405180910390fd5b61110081600954336040516020016110e591906129f7565b60405160208183030381529060405280519060200120611e15565b61113f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113690612bd5565b60405180910390fd5b611148826118fe565b5050565b6111546114b8565b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f1935050505015801561119f573d6000803e3d6000fd5b5050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61123f6114b8565b611a0a61124a610a77565b8284516112579190612dee565b6112619190612d67565b11156112a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161129990612bf5565b60405180910390fd5b60005b82518110156112e5576112d28382815181106112c4576112c36130ca565b5b602002602001015183611e2c565b80806112dd90612f9f565b9150506112a5565b505050565b6112f26114b8565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611362576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161135990612af5565b60405180910390fd5b61136b81611a8e565b50565b600a5481565b600b5481565b6000816113856114af565b11158015611394575060005482105b80156113d2575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600080829050806113e86114af565b116114705760005481101561146f5760006004600083815260200190815260200160002054905060007c01000000000000000000000000000000000000000000000000000000008216141561146d575b6000811415611463576004600083600190039350838152602001908152602001600020549050611438565b80925050506114a2565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b600033905090565b60006001905090565b6114c0611fdc565b73ffffffffffffffffffffffffffffffffffffffff166114de610d1c565b73ffffffffffffffffffffffffffffffffffffffff1614611534576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161152b90612b95565b60405180910390fd5b565b6000611541826113d9565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146115a8576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006006600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060008573ffffffffffffffffffffffffffffffffffffffff166116016114a7565b73ffffffffffffffffffffffffffffffffffffffff161480611630575061162f8661162a6114a7565b6111a3565b5b8061166d575061163e6114a7565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b9050806116a6576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006116b186611a84565b14156116e9576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6116f68686866001611fe4565b600061170183611a84565b1461173d576006600085815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154600101919050819055507c020000000000000000000000000000000000000000000000000000000060a042901b61180487611a84565b1717600460008681526020019081526020016000208190555060007c02000000000000000000000000000000000000000000000000000000008416141561188e57600060018501905060006004600083815260200190815260200160002054141561188c57600054811461188b578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46118f68686866001611fea565b505050505050565b600b5481111580156119105750600081115b61194f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161194690612b75565b60405180910390fd5b611a0a61195a610a77565b826119659190612d67565b11156119a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161199d90612bf5565b60405180910390fd5b60006119b86119b3611fdc565b610c2d565b1415611a1f576001816119cb9190612e48565b600a546119d89190612dee565b341015611a1a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a1190612b55565b60405180910390fd5b611a70565b80600a54611a2d9190612dee565b341015611a6f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a6690612b55565b60405180910390fd5b5b611a81611a7b611fdc565b82611e2c565b50565b6000819050919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611b7a6114a7565b8786866040518563ffffffff1660e01b8152600401611b9c9493929190612a51565b602060405180830381600087803b158015611bb657600080fd5b505af1925050508015611be757506040513d601f19601f82011682018060405250810190611be49190612648565b60015b611c61573d8060008114611c17576040519150601f19603f3d011682016040523d82523d6000602084013e611c1c565b606091505b50600081511415611c59576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b60606000821415611cfc576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050611e10565b600082905060005b60008214611d2e578080611d1790612f9f565b915050600a82611d279190612dbd565b9150611d04565b60008167ffffffffffffffff811115611d4a57611d496130f9565b5b6040519080825280601f01601f191660200182016040528015611d7c5781602001600182028036833780820191505090505b5090505b60008514611e0957600182611d959190612e48565b9150600a85611da4919061300c565b6030611db09190612d67565b60f81b818381518110611dc657611dc56130ca565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85611e029190612dbd565b9450611d80565b8093505050505b919050565b600082611e228584611ff0565b1490509392505050565b6000805490506000611e3d84611a84565b1415611e75576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000821415611eb0576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611ebd6000848385611fe4565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555060e1611f2260018414612046565b901b60a042901b611f3285611a84565b171760046000838152602001908152602001600020819055506000819050600083820190505b818060010192508573ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808210611f5857816000819055505050611fd76000848385611fea565b505050565b600033905090565b50505050565b50505050565b60008082905060005b845181101561203b5761202682868381518110612019576120186130ca565b5b6020026020010151612050565b9150808061203390612f9f565b915050611ff9565b508091505092915050565b6000819050919050565b600081831061206857612063828461207b565b612073565b612072838361207b565b5b905092915050565b600082600052816020526040600020905092915050565b82805461209e90612f3c565b90600052602060002090601f0160209004810192826120c05760008555612107565b82601f106120d957805160ff1916838001178555612107565b82800160010185558215612107579182015b828111156121065782518255916020019190600101906120eb565b5b5090506121149190612118565b5090565b5b80821115612131576000816000905550600101612119565b5090565b600061214861214384612c55565b612c30565b9050808382526020820190508285602086028201111561216b5761216a61312d565b5b60005b8581101561219b57816121818882612299565b84526020840193506020830192505060018101905061216e565b5050509392505050565b60006121b86121b384612c81565b612c30565b905080838252602082019050828560208602820111156121db576121da61312d565b5b60005b8581101561220b57816121f1888261231f565b8452602084019350602083019250506001810190506121de565b5050509392505050565b600061222861222384612cad565b612c30565b90508281526020810184848401111561224457612243613132565b5b61224f848285612efa565b509392505050565b600061226a61226584612cde565b612c30565b90508281526020810184848401111561228657612285613132565b5b612291848285612efa565b509392505050565b6000813590506122a88161331c565b92915050565b600082601f8301126122c3576122c2613128565b5b81356122d3848260208601612135565b91505092915050565b600082601f8301126122f1576122f0613128565b5b81356123018482602086016121a5565b91505092915050565b60008135905061231981613333565b92915050565b60008135905061232e8161334a565b92915050565b60008135905061234381613361565b92915050565b60008151905061235881613361565b92915050565b600082601f83011261237357612372613128565b5b8135612383848260208601612215565b91505092915050565b600082601f8301126123a1576123a0613128565b5b81356123b1848260208601612257565b91505092915050565b6000813590506123c981613378565b92915050565b6000602082840312156123e5576123e461313c565b5b60006123f384828501612299565b91505092915050565b600080604083850312156124135761241261313c565b5b600061242185828601612299565b925050602061243285828601612299565b9150509250929050565b6000806000606084860312156124555761245461313c565b5b600061246386828701612299565b935050602061247486828701612299565b9250506040612485868287016123ba565b9150509250925092565b600080600080608085870312156124a9576124a861313c565b5b60006124b787828801612299565b94505060206124c887828801612299565b93505060406124d9878288016123ba565b925050606085013567ffffffffffffffff8111156124fa576124f9613137565b5b6125068782880161235e565b91505092959194509250565b600080604083850312156125295761252861313c565b5b600061253785828601612299565b92505060206125488582860161230a565b9150509250929050565b600080604083850312156125695761256861313c565b5b600061257785828601612299565b9250506020612588858286016123ba565b9150509250929050565b600080604083850312156125a9576125a861313c565b5b600083013567ffffffffffffffff8111156125c7576125c6613137565b5b6125d3858286016122ae565b92505060206125e4858286016123ba565b9150509250929050565b6000602082840312156126045761260361313c565b5b60006126128482850161231f565b91505092915050565b6000602082840312156126315761263061313c565b5b600061263f84828501612334565b91505092915050565b60006020828403121561265e5761265d61313c565b5b600061266c84828501612349565b91505092915050565b60006020828403121561268b5761268a61313c565b5b600082013567ffffffffffffffff8111156126a9576126a8613137565b5b6126b58482850161238c565b91505092915050565b6000602082840312156126d4576126d361313c565b5b60006126e2848285016123ba565b91505092915050565b600080604083850312156127025761270161313c565b5b6000612710858286016123ba565b925050602083013567ffffffffffffffff81111561273157612730613137565b5b61273d858286016122dc565b9150509250929050565b61275081612e7c565b82525050565b61276761276282612e7c565b612fe8565b82525050565b61277681612e8e565b82525050565b61278581612e9a565b82525050565b600061279682612d24565b6127a08185612d3a565b93506127b0818560208601612f09565b6127b981613141565b840191505092915050565b60006127cf82612d2f565b6127d98185612d4b565b93506127e9818560208601612f09565b6127f281613141565b840191505092915050565b600061280882612d2f565b6128128185612d5c565b9350612822818560208601612f09565b80840191505092915050565b6000815461283b81612f3c565b6128458186612d5c565b945060018216600081146128605760018114612871576128a4565b60ff198316865281860193506128a4565b61287a85612d0f565b60005b8381101561289c5781548189015260018201915060208101905061287d565b838801955050505b50505092915050565b60006128ba602683612d4b565b91506128c58261315f565b604082019050919050565b60006128dd601a83612d4b565b91506128e8826131ae565b602082019050919050565b6000612900601d83612d4b565b915061290b826131d7565b602082019050919050565b6000612923601683612d4b565b915061292e82613200565b602082019050919050565b6000612946601f83612d4b565b915061295182613229565b602082019050919050565b6000612969602083612d4b565b915061297482613252565b602082019050919050565b600061298c602f83612d4b565b91506129978261327b565b604082019050919050565b60006129af601083612d4b565b91506129ba826132ca565b602082019050919050565b60006129d2600883612d4b565b91506129dd826132f3565b602082019050919050565b6129f181612ef0565b82525050565b6000612a038284612756565b60148201915081905092915050565b6000612a1e828561282e565b9150612a2a82846127fd565b91508190509392505050565b6000602082019050612a4b6000830184612747565b92915050565b6000608082019050612a666000830187612747565b612a736020830186612747565b612a8060408301856129e8565b8181036060830152612a92818461278b565b905095945050505050565b6000602082019050612ab2600083018461276d565b92915050565b6000602082019050612acd600083018461277c565b92915050565b60006020820190508181036000830152612aed81846127c4565b905092915050565b60006020820190508181036000830152612b0e816128ad565b9050919050565b60006020820190508181036000830152612b2e816128d0565b9050919050565b60006020820190508181036000830152612b4e816128f3565b9050919050565b60006020820190508181036000830152612b6e81612916565b9050919050565b60006020820190508181036000830152612b8e81612939565b9050919050565b60006020820190508181036000830152612bae8161295c565b9050919050565b60006020820190508181036000830152612bce8161297f565b9050919050565b60006020820190508181036000830152612bee816129a2565b9050919050565b60006020820190508181036000830152612c0e816129c5565b9050919050565b6000602082019050612c2a60008301846129e8565b92915050565b6000612c3a612c4b565b9050612c468282612f6e565b919050565b6000604051905090565b600067ffffffffffffffff821115612c7057612c6f6130f9565b5b602082029050602081019050919050565b600067ffffffffffffffff821115612c9c57612c9b6130f9565b5b602082029050602081019050919050565b600067ffffffffffffffff821115612cc857612cc76130f9565b5b612cd182613141565b9050602081019050919050565b600067ffffffffffffffff821115612cf957612cf86130f9565b5b612d0282613141565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000612d7282612ef0565b9150612d7d83612ef0565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612db257612db161303d565b5b828201905092915050565b6000612dc882612ef0565b9150612dd383612ef0565b925082612de357612de261306c565b5b828204905092915050565b6000612df982612ef0565b9150612e0483612ef0565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612e3d57612e3c61303d565b5b828202905092915050565b6000612e5382612ef0565b9150612e5e83612ef0565b925082821015612e7157612e7061303d565b5b828203905092915050565b6000612e8782612ed0565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015612f27578082015181840152602081019050612f0c565b83811115612f36576000848401525b50505050565b60006002820490506001821680612f5457607f821691505b60208210811415612f6857612f6761309b565b5b50919050565b612f7782613141565b810181811067ffffffffffffffff82111715612f9657612f956130f9565b5b80604052505050565b6000612faa82612ef0565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415612fdd57612fdc61303d565b5b600182019050919050565b6000612ff382612ffa565b9050919050565b600061300582613152565b9050919050565b600061301782612ef0565b915061302283612ef0565b9250826130325761303161306c565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f5075626c69632073616c65206973206e6f74206163746976652e000000000000600082015250565b7f57686974656c6973742073616c65206973206e6f74204163746976652e000000600082015250565b7f4e6f7420656e6f7567682045544820746f206d696e7400000000000000000000600082015250565b7f496e76616c6964207175616e74697479206f72204d6178205065722054782e00600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4e6f742077686974656c69737465642e00000000000000000000000000000000600082015250565b7f536f6c64206f7574000000000000000000000000000000000000000000000000600082015250565b61332581612e7c565b811461333057600080fd5b50565b61333c81612e8e565b811461334757600080fd5b50565b61335381612e9a565b811461335e57600080fd5b50565b61336a81612ea4565b811461337557600080fd5b50565b61338181612ef0565b811461338c57600080fd5b5056fea26469706673582212207d6a59381acc477b737523fe1b9bbda6c4e13124194e338cbaf8292bad3753c464736f6c63430008070033

Deployed Bytecode Sourcemap

53586:3574:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27870:615;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32893:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34961:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34421:474;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26924:315;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55981:102;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35847:170;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56459:101;;;;;;;;;;;;;:::i;:::-;;54903:146;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53727:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53679:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36088:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56138:90;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32682:144;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53923:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28549:234;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13998:103;;;;;;;;;;;;;:::i;:::-;;56297:91;;;;;;;;;;;;;:::i;:::-;;55657:102;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;13350:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33062:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35237:308;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36344:396;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55825:95;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56612:341;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54545:304;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57010:147;;;;;;;;;;;;;:::i;:::-;;35616:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54227:257;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;14256:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53761:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53806:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27870:615;27955:4;28270:10;28255:25;;:11;:25;;;;:102;;;;28347:10;28332:25;;:11;:25;;;;28255:102;:179;;;;28424:10;28409:25;;:11;:25;;;;28255:179;28235:199;;27870:615;;;:::o;32893:100::-;32947:13;32980:5;32973:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32893:100;:::o;34961:204::-;35029:7;35054:16;35062:7;35054;:16::i;:::-;35049:64;;35079:34;;;;;;;;;;;;;;35049:64;35133:15;:24;35149:7;35133:24;;;;;;;;;;;;;;;;;;;;;35126:31;;34961:204;;;:::o;34421:474::-;34494:13;34526:27;34545:7;34526:18;:27::i;:::-;34494:61;;34576:5;34570:11;;:2;:11;;;34566:48;;;34590:24;;;;;;;;;;;;;;34566:48;34654:5;34631:28;;:19;:17;:19::i;:::-;:28;;;34627:175;;34679:44;34696:5;34703:19;:17;:19::i;:::-;34679:16;:44::i;:::-;34674:128;;34751:35;;;;;;;;;;;;;;34674:128;34627:175;34841:2;34814:15;:24;34830:7;34814:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;34879:7;34875:2;34859:28;;34868:5;34859:28;;;;;;;;;;;;34483:412;34421:474;;:::o;26924:315::-;26977:7;27205:15;:13;:15::i;:::-;27190:12;;27174:13;;:28;:46;27167:53;;26924:315;:::o;55981:102::-;13236:13;:11;:13::i;:::-;56065:10:::1;56053:9;:22;;;;55981:102:::0;:::o;35847:170::-;35981:28;35991:4;35997:2;36001:7;35981:9;:28::i;:::-;35847:170;;;:::o;56459:101::-;13236:13;:11;:13::i;:::-;56539::::1;;;;;;;;;;;56538:14;56522:13;;:30;;;;;;;;;;;;;;;;;;56459:101::o:0;54903:146::-;54974:10;;;;;;;;;;;54966:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;55026:15;55032:8;55026:5;:15::i;:::-;54903:146;:::o;53727:25::-;;;;:::o;53679:41::-;53716:4;53679:41;:::o;36088:185::-;36226:39;36243:4;36249:2;36253:7;36226:39;;;;;;;;;;;;:16;:39::i;:::-;36088:185;;;:::o;56138:90::-;13236:13;:11;:13::i;:::-;56217:3:::1;56207:7;:13;;;;;;;;;;;;:::i;:::-;;56138:90:::0;:::o;32682:144::-;32746:7;32789:27;32808:7;32789:18;:27::i;:::-;32766:52;;32682:144;;;:::o;53923:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;28549:234::-;28613:7;28665:1;28637:24;28655:5;28637:17;:24::i;:::-;:29;28633:70;;;28675:28;;;;;;;;;;;;;;28633:70;23888:13;28721:18;:25;28740:5;28721:25;;;;;;;;;;;;;;;;:54;28714:61;;28549:234;;;:::o;13998:103::-;13236:13;:11;:13::i;:::-;14063:30:::1;14090:1;14063:18;:30::i;:::-;13998:103::o:0;56297:91::-;13236:13;:11;:13::i;:::-;56370:10:::1;;;;;;;;;;;56369:11;56356:10;;:24;;;;;;;;;;;;;;;;;;56297:91::o:0;55657:102::-;13236:13;:11;:13::i;:::-;55742:9:::1;55729:10;:22;;;;55657:102:::0;:::o;13350:87::-;13396:7;13423:6;;;;;;;;;;;13416:13;;13350:87;:::o;33062:104::-;33118:13;33151:7;33144:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33062:104;:::o;35237:308::-;35348:19;:17;:19::i;:::-;35336:31;;:8;:31;;;35332:61;;;35376:17;;;;;;;;;;;;;;35332:61;35458:8;35406:18;:39;35425:19;:17;:19::i;:::-;35406:39;;;;;;;;;;;;;;;:49;35446:8;35406:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;35518:8;35482:55;;35497:19;:17;:19::i;:::-;35482:55;;;35528:8;35482:55;;;;;;:::i;:::-;;;;;;;;35237:308;;:::o;36344:396::-;36511:28;36521:4;36527:2;36531:7;36511:9;:28::i;:::-;36572:1;36554:2;:14;;;:19;36550:183;;36593:56;36624:4;36630:2;36634:7;36643:5;36593:30;:56::i;:::-;36588:145;;36677:40;;;;;;;;;;;;;;36588:145;36550:183;36344:396;;;;:::o;55825:95::-;13236:13;:11;:13::i;:::-;55903:9:::1;55892:8;:20;;;;55825:95:::0;:::o;56612:341::-;56731:13;56770:17;56778:8;56770:7;:17::i;:::-;56762:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;56882:1;56863:7;56857:21;;;;;:::i;:::-;;;:26;;:88;;;;;;;;;;;;;;;;;56910:7;56919:19;:8;:17;:19::i;:::-;56893:46;;;;;;;;;:::i;:::-;;;;;;;;;;;;;56857:88;56850:95;;56612:341;;;:::o;54545:304::-;54643:13;;;;;;;;;;;54635:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;54709:78;54728:5;54735:10;;54774;54757:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;54747:39;;;;;;54709:18;:78::i;:::-;54701:107;;;;;;;;;;;;:::i;:::-;;;;;;;;;54826:15;54832:8;54826:5;:15::i;:::-;54545:304;;:::o;57010:147::-;13236:13;:11;:13::i;:::-;57062:15:::1;57080:21;57062:39;;57120:10;57112:28;;:37;57141:7;57112:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;57051:106;57010:147::o:0;35616:164::-;35713:4;35737:18;:25;35756:5;35737:25;;;;;;;;;;;;;;;:35;35763:8;35737:35;;;;;;;;;;;;;;;;;;;;;;;;;35730:42;;35616:164;;;;:::o;54227:257::-;13236:13;:11;:13::i;:::-;53716:4:::1;54344:13;:11;:13::i;:::-;54332:8;54320:2;:9;:20;;;;:::i;:::-;54319:38;;;;:::i;:::-;:52;;54311:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;54401:6;54397:80;54413:2;:9;54411:1;:11;54397:80;;;54443:22;54449:2;54452:1;54449:5;;;;;;;;:::i;:::-;;;;;;;;54456:8;54443:5;:22::i;:::-;54424:3;;;;;:::i;:::-;;;;54397:80;;;;54227:257:::0;;:::o;14256:201::-;13236:13;:11;:13::i;:::-;14365:1:::1;14345:22;;:8;:22;;;;14337:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;14421:28;14440:8;14421:18;:28::i;:::-;14256:201:::0;:::o;53761:38::-;;;;:::o;53806:27::-;;;;:::o;36995:273::-;37052:4;37108:7;37089:15;:13;:15::i;:::-;:26;;:66;;;;;37142:13;;37132:7;:23;37089:66;:152;;;;;37240:1;24658:8;37193:17;:26;37211:7;37193:26;;;;;;;;;;;;:43;:48;37089:152;37069:172;;36995:273;;;:::o;30197:1129::-;30264:7;30284:12;30299:7;30284:22;;30367:4;30348:15;:13;:15::i;:::-;:23;30344:915;;30401:13;;30394:4;:20;30390:869;;;30439:14;30456:17;:23;30474:4;30456:23;;;;;;;;;;;;30439:40;;30572:1;24658:8;30545:6;:23;:28;30541:699;;;31064:113;31081:1;31071:6;:11;31064:113;;;31124:17;:25;31142:6;;;;;;;31124:25;;;;;;;;;;;;31115:34;;31064:113;;;31210:6;31203:13;;;;;;30541:699;30416:843;30390:869;30344:915;31287:31;;;;;;;;;;;;;;30197:1129;;;;:::o;51263:105::-;51323:7;51350:10;51343:17;;51263:105;:::o;54074:101::-;54139:7;54166:1;54159:8;;54074:101;:::o;13515:132::-;13590:12;:10;:12::i;:::-;13579:23;;:7;:5;:7::i;:::-;:23;;;13571:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;13515:132::o;42254:2654::-;42369:27;42399;42418:7;42399:18;:27::i;:::-;42369:57;;42484:4;42443:45;;42459:19;42443:45;;;42439:86;;42497:28;;;;;;;;;;;;;;42439:86;42538:23;42564:15;:24;42580:7;42564:24;;;;;;;;;;;;;;;;;;;;;42538:50;;42601:22;42650:4;42627:27;;:19;:17;:19::i;:::-;:27;;;:87;;;;42671:43;42688:4;42694:19;:17;:19::i;:::-;42671:16;:43::i;:::-;42627:87;:142;;;;42750:19;:17;:19::i;:::-;42731:38;;:15;:38;;;42627:142;42601:169;;42788:17;42783:66;;42814:35;;;;;;;;;;;;;;42783:66;42889:1;42864:21;42882:2;42864:17;:21::i;:::-;:26;42860:62;;;42899:23;;;;;;;;;;;;;;42860:62;42935:43;42957:4;42963:2;42967:7;42976:1;42935:21;:43::i;:::-;43086:1;43048:34;43066:15;43048:17;:34::i;:::-;:39;43044:103;;43111:15;:24;43127:7;43111:24;;;;;;;;;;;;43104:31;;;;;;;;;;;43044:103;43514:18;:24;43533:4;43514:24;;;;;;;;;;;;;;;;43512:26;;;;;;;;;;;;43583:18;:22;43602:2;43583:22;;;;;;;;;;;;;;;;43581:24;;;;;;;;;;;24940:8;24542:3;43964:15;:41;;43922:21;43940:2;43922:17;:21::i;:::-;:84;:128;43876:17;:26;43894:7;43876:26;;;;;;;;;;;:174;;;;44220:1;24940:8;44170:19;:46;:51;44166:626;;;44242:19;44274:1;44264:7;:11;44242:33;;44431:1;44397:17;:30;44415:11;44397:30;;;;;;;;;;;;:35;44393:384;;;44535:13;;44520:11;:28;44516:242;;44715:19;44682:17;:30;44700:11;44682:30;;;;;;;;;;;:52;;;;44516:242;44393:384;44223:569;44166:626;44839:7;44835:2;44820:27;;44829:4;44820:27;;;;;;;;;;;;44858:42;44879:4;44885:2;44889:7;44898:1;44858:20;:42::i;:::-;42358:2550;;;42254:2654;;;:::o;55096:493::-;55166:8;;55154;:20;;:36;;;;;55189:1;55178:8;:12;55154:36;55146:80;;;;;;;;;;;;:::i;:::-;;;;;;;;;53716:4;55256:13;:11;:13::i;:::-;55245:8;:24;;;;:::i;:::-;:38;;55237:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;55337:1;55310:23;55320:12;:10;:12::i;:::-;55310:9;:23::i;:::-;:28;55307:235;;;55400:1;55389:8;:12;;;;:::i;:::-;55376:9;;:26;;;;:::i;:::-;55363:9;:39;;55355:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;55307:235;;;55495:8;55483:9;;:20;;;;:::i;:::-;55470:9;:33;;55462:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55307:235;55552:29;55558:12;:10;:12::i;:::-;55572:8;55552:5;:29::i;:::-;55096:493;:::o;33982:148::-;34046:14;34107:5;34097:15;;33982:148;;;:::o;14617:191::-;14691:16;14710:6;;;;;;;;;;;14691:25;;14736:8;14727:6;;:17;;;;;;;;;;;;;;;;;;14791:8;14760:40;;14781:8;14760:40;;;;;;;;;;;;14680:128;14617:191;:::o;48732:716::-;48895:4;48941:2;48916:45;;;48962:19;:17;:19::i;:::-;48983:4;48989:7;48998:5;48916:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;48912:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49216:1;49199:6;:13;:18;49195:235;;;49245:40;;;;;;;;;;;;;;49195:235;49388:6;49382:13;49373:6;49369:2;49365:15;49358:38;48912:529;49085:54;;;49075:64;;;:6;:64;;;;49068:71;;;48732:716;;;;;;:::o;9155:723::-;9211:13;9441:1;9432:5;:10;9428:53;;;9459:10;;;;;;;;;;;;;;;;;;;;;9428:53;9491:12;9506:5;9491:20;;9522:14;9547:78;9562:1;9554:4;:9;9547:78;;9580:8;;;;;:::i;:::-;;;;9611:2;9603:10;;;;;:::i;:::-;;;9547:78;;;9635:19;9667:6;9657:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9635:39;;9685:154;9701:1;9692:5;:10;9685:154;;9729:1;9719:11;;;;;:::i;:::-;;;9796:2;9788:5;:10;;;;:::i;:::-;9775:2;:24;;;;:::i;:::-;9762:39;;9745:6;9752;9745:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;9825:2;9816:11;;;;;:::i;:::-;;;9685:154;;;9863:6;9849:21;;;;;9155:723;;;;:::o;1219:190::-;1344:4;1397;1368:25;1381:5;1388:4;1368:12;:25::i;:::-;:33;1361:40;;1219:190;;;;;:::o;40334:1666::-;40399:20;40422:13;;40399:36;;40475:1;40450:21;40468:2;40450:17;:21::i;:::-;:26;40446:58;;;40485:19;;;;;;;;;;;;;;40446:58;40531:1;40519:8;:13;40515:44;;;40541:18;;;;;;;;;;;;;;40515:44;40572:61;40602:1;40606:2;40610:12;40624:8;40572:21;:61::i;:::-;41176:1;24025:2;41147:1;:25;;41146:31;41134:8;:44;41108:18;:22;41127:2;41108:22;;;;;;;;;;;;;;;;:70;;;;;;;;;;;24805:3;41577:29;41604:1;41592:8;:13;41577:14;:29::i;:::-;:56;;24542:3;41514:15;:41;;41472:21;41490:2;41472:17;:21::i;:::-;:84;:162;41421:17;:31;41439:12;41421:31;;;;;;;;;;;:213;;;;41651:20;41674:12;41651:35;;41701:11;41730:8;41715:12;:23;41701:37;;41755:111;41807:14;;;;;;41803:2;41782:40;;41799:1;41782:40;;;;;;;;;;;;41861:3;41846:12;:18;41755:111;;41898:12;41882:13;:28;;;;40885:1037;;41932:60;41961:1;41965:2;41969:12;41983:8;41932:20;:60::i;:::-;40388:1612;40334:1666;;:::o;11901:98::-;11954:7;11981:10;11974:17;;11901:98;:::o;50096:159::-;;;;;:::o;50914:158::-;;;;;:::o;2086:296::-;2169:7;2189:20;2212:4;2189:27;;2232:9;2227:118;2251:5;:12;2247:1;:16;2227:118;;;2300:33;2310:12;2324:5;2330:1;2324:8;;;;;;;;:::i;:::-;;;;;;;;2300:9;:33::i;:::-;2285:48;;2265:3;;;;;:::i;:::-;;;;2227:118;;;;2362:12;2355:19;;;2086:296;;;;:::o;34217:142::-;34275:14;34336:5;34326:15;;34217:142;;;:::o;8293:149::-;8356:7;8387:1;8383;:5;:51;;8414:20;8429:1;8432;8414:14;:20::i;:::-;8383:51;;;8391:20;8406:1;8409;8391:14;:20::i;:::-;8383:51;8376:58;;8293:149;;;;:::o;8450:268::-;8518:13;8625:1;8619:4;8612:15;8654:1;8648:4;8641:15;8695:4;8689;8679:21;8670:30;;8450:268;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;24:722:1:-;120:5;145:81;161:64;218:6;161:64;:::i;:::-;145:81;:::i;:::-;136:90;;246:5;275:6;268:5;261:21;309:4;302:5;298:16;291:23;;335:6;385:3;377:4;369:6;365:17;360:3;356:27;353:36;350:143;;;404:79;;:::i;:::-;350:143;517:1;502:238;527:6;524:1;521:13;502:238;;;595:3;624:37;657:3;645:10;624:37;:::i;:::-;619:3;612:50;691:4;686:3;682:14;675:21;;725:4;720:3;716:14;709:21;;562:178;549:1;546;542:9;537:14;;502:238;;;506:14;126:620;;24:722;;;;;:::o;769:::-;865:5;890:81;906:64;963:6;906:64;:::i;:::-;890:81;:::i;:::-;881:90;;991:5;1020:6;1013:5;1006:21;1054:4;1047:5;1043:16;1036:23;;1080:6;1130:3;1122:4;1114:6;1110:17;1105:3;1101:27;1098:36;1095:143;;;1149:79;;:::i;:::-;1095:143;1262:1;1247:238;1272:6;1269:1;1266:13;1247:238;;;1340:3;1369:37;1402:3;1390:10;1369:37;:::i;:::-;1364:3;1357:50;1436:4;1431:3;1427:14;1420:21;;1470:4;1465:3;1461:14;1454:21;;1307:178;1294:1;1291;1287:9;1282:14;;1247:238;;;1251:14;871:620;;769:722;;;;;:::o;1497:410::-;1574:5;1599:65;1615:48;1656:6;1615:48;:::i;:::-;1599:65;:::i;:::-;1590:74;;1687:6;1680:5;1673:21;1725:4;1718:5;1714:16;1763:3;1754:6;1749:3;1745:16;1742:25;1739:112;;;1770:79;;:::i;:::-;1739:112;1860:41;1894:6;1889:3;1884;1860:41;:::i;:::-;1580:327;1497:410;;;;;:::o;1913:412::-;1991:5;2016:66;2032:49;2074:6;2032:49;:::i;:::-;2016:66;:::i;:::-;2007:75;;2105:6;2098:5;2091:21;2143:4;2136:5;2132:16;2181:3;2172:6;2167:3;2163:16;2160:25;2157:112;;;2188:79;;:::i;:::-;2157:112;2278:41;2312:6;2307:3;2302;2278:41;:::i;:::-;1997:328;1913:412;;;;;:::o;2331:139::-;2377:5;2415:6;2402:20;2393:29;;2431:33;2458:5;2431:33;:::i;:::-;2331:139;;;;:::o;2493:370::-;2564:5;2613:3;2606:4;2598:6;2594:17;2590:27;2580:122;;2621:79;;:::i;:::-;2580:122;2738:6;2725:20;2763:94;2853:3;2845:6;2838:4;2830:6;2826:17;2763:94;:::i;:::-;2754:103;;2570:293;2493:370;;;;:::o;2886:::-;2957:5;3006:3;2999:4;2991:6;2987:17;2983:27;2973:122;;3014:79;;:::i;:::-;2973:122;3131:6;3118:20;3156:94;3246:3;3238:6;3231:4;3223:6;3219:17;3156:94;:::i;:::-;3147:103;;2963:293;2886:370;;;;:::o;3262:133::-;3305:5;3343:6;3330:20;3321:29;;3359:30;3383:5;3359:30;:::i;:::-;3262:133;;;;:::o;3401:139::-;3447:5;3485:6;3472:20;3463:29;;3501:33;3528:5;3501:33;:::i;:::-;3401:139;;;;:::o;3546:137::-;3591:5;3629:6;3616:20;3607:29;;3645:32;3671:5;3645:32;:::i;:::-;3546:137;;;;:::o;3689:141::-;3745:5;3776:6;3770:13;3761:22;;3792:32;3818:5;3792:32;:::i;:::-;3689:141;;;;:::o;3849:338::-;3904:5;3953:3;3946:4;3938:6;3934:17;3930:27;3920:122;;3961:79;;:::i;:::-;3920:122;4078:6;4065:20;4103:78;4177:3;4169:6;4162:4;4154:6;4150:17;4103:78;:::i;:::-;4094:87;;3910:277;3849:338;;;;:::o;4207:340::-;4263:5;4312:3;4305:4;4297:6;4293:17;4289:27;4279:122;;4320:79;;:::i;:::-;4279:122;4437:6;4424:20;4462:79;4537:3;4529:6;4522:4;4514:6;4510:17;4462:79;:::i;:::-;4453:88;;4269:278;4207:340;;;;:::o;4553:139::-;4599:5;4637:6;4624:20;4615:29;;4653:33;4680:5;4653:33;:::i;:::-;4553:139;;;;:::o;4698:329::-;4757:6;4806:2;4794:9;4785:7;4781:23;4777:32;4774:119;;;4812:79;;:::i;:::-;4774:119;4932:1;4957:53;5002:7;4993:6;4982:9;4978:22;4957:53;:::i;:::-;4947:63;;4903:117;4698:329;;;;:::o;5033:474::-;5101:6;5109;5158:2;5146:9;5137:7;5133:23;5129:32;5126:119;;;5164:79;;:::i;:::-;5126:119;5284:1;5309:53;5354:7;5345:6;5334:9;5330:22;5309:53;:::i;:::-;5299:63;;5255:117;5411:2;5437:53;5482:7;5473:6;5462:9;5458:22;5437:53;:::i;:::-;5427:63;;5382:118;5033:474;;;;;:::o;5513:619::-;5590:6;5598;5606;5655:2;5643:9;5634:7;5630:23;5626:32;5623:119;;;5661:79;;:::i;:::-;5623:119;5781:1;5806:53;5851:7;5842:6;5831:9;5827:22;5806:53;:::i;:::-;5796:63;;5752:117;5908:2;5934:53;5979:7;5970:6;5959:9;5955:22;5934:53;:::i;:::-;5924:63;;5879:118;6036:2;6062:53;6107:7;6098:6;6087:9;6083:22;6062:53;:::i;:::-;6052:63;;6007:118;5513:619;;;;;:::o;6138:943::-;6233:6;6241;6249;6257;6306:3;6294:9;6285:7;6281:23;6277:33;6274:120;;;6313:79;;:::i;:::-;6274:120;6433:1;6458:53;6503:7;6494:6;6483:9;6479:22;6458:53;:::i;:::-;6448:63;;6404:117;6560:2;6586:53;6631:7;6622:6;6611:9;6607:22;6586:53;:::i;:::-;6576:63;;6531:118;6688:2;6714:53;6759:7;6750:6;6739:9;6735:22;6714:53;:::i;:::-;6704:63;;6659:118;6844:2;6833:9;6829:18;6816:32;6875:18;6867:6;6864:30;6861:117;;;6897:79;;:::i;:::-;6861:117;7002:62;7056:7;7047:6;7036:9;7032:22;7002:62;:::i;:::-;6992:72;;6787:287;6138:943;;;;;;;:::o;7087:468::-;7152:6;7160;7209:2;7197:9;7188:7;7184:23;7180:32;7177:119;;;7215:79;;:::i;:::-;7177:119;7335:1;7360:53;7405:7;7396:6;7385:9;7381:22;7360:53;:::i;:::-;7350:63;;7306:117;7462:2;7488:50;7530:7;7521:6;7510:9;7506:22;7488:50;:::i;:::-;7478:60;;7433:115;7087:468;;;;;:::o;7561:474::-;7629:6;7637;7686:2;7674:9;7665:7;7661:23;7657:32;7654:119;;;7692:79;;:::i;:::-;7654:119;7812:1;7837:53;7882:7;7873:6;7862:9;7858:22;7837:53;:::i;:::-;7827:63;;7783:117;7939:2;7965:53;8010:7;8001:6;7990:9;7986:22;7965:53;:::i;:::-;7955:63;;7910:118;7561:474;;;;;:::o;8041:684::-;8134:6;8142;8191:2;8179:9;8170:7;8166:23;8162:32;8159:119;;;8197:79;;:::i;:::-;8159:119;8345:1;8334:9;8330:17;8317:31;8375:18;8367:6;8364:30;8361:117;;;8397:79;;:::i;:::-;8361:117;8502:78;8572:7;8563:6;8552:9;8548:22;8502:78;:::i;:::-;8492:88;;8288:302;8629:2;8655:53;8700:7;8691:6;8680:9;8676:22;8655:53;:::i;:::-;8645:63;;8600:118;8041:684;;;;;:::o;8731:329::-;8790:6;8839:2;8827:9;8818:7;8814:23;8810:32;8807:119;;;8845:79;;:::i;:::-;8807:119;8965:1;8990:53;9035:7;9026:6;9015:9;9011:22;8990:53;:::i;:::-;8980:63;;8936:117;8731:329;;;;:::o;9066:327::-;9124:6;9173:2;9161:9;9152:7;9148:23;9144:32;9141:119;;;9179:79;;:::i;:::-;9141:119;9299:1;9324:52;9368:7;9359:6;9348:9;9344:22;9324:52;:::i;:::-;9314:62;;9270:116;9066:327;;;;:::o;9399:349::-;9468:6;9517:2;9505:9;9496:7;9492:23;9488:32;9485:119;;;9523:79;;:::i;:::-;9485:119;9643:1;9668:63;9723:7;9714:6;9703:9;9699:22;9668:63;:::i;:::-;9658:73;;9614:127;9399:349;;;;:::o;9754:509::-;9823:6;9872:2;9860:9;9851:7;9847:23;9843:32;9840:119;;;9878:79;;:::i;:::-;9840:119;10026:1;10015:9;10011:17;9998:31;10056:18;10048:6;10045:30;10042:117;;;10078:79;;:::i;:::-;10042:117;10183:63;10238:7;10229:6;10218:9;10214:22;10183:63;:::i;:::-;10173:73;;9969:287;9754:509;;;;:::o;10269:329::-;10328:6;10377:2;10365:9;10356:7;10352:23;10348:32;10345:119;;;10383:79;;:::i;:::-;10345:119;10503:1;10528:53;10573:7;10564:6;10553:9;10549:22;10528:53;:::i;:::-;10518:63;;10474:117;10269:329;;;;:::o;10604:684::-;10697:6;10705;10754:2;10742:9;10733:7;10729:23;10725:32;10722:119;;;10760:79;;:::i;:::-;10722:119;10880:1;10905:53;10950:7;10941:6;10930:9;10926:22;10905:53;:::i;:::-;10895:63;;10851:117;11035:2;11024:9;11020:18;11007:32;11066:18;11058:6;11055:30;11052:117;;;11088:79;;:::i;:::-;11052:117;11193:78;11263:7;11254:6;11243:9;11239:22;11193:78;:::i;:::-;11183:88;;10978:303;10604:684;;;;;:::o;11294:118::-;11381:24;11399:5;11381:24;:::i;:::-;11376:3;11369:37;11294:118;;:::o;11418:157::-;11523:45;11543:24;11561:5;11543:24;:::i;:::-;11523:45;:::i;:::-;11518:3;11511:58;11418:157;;:::o;11581:109::-;11662:21;11677:5;11662:21;:::i;:::-;11657:3;11650:34;11581:109;;:::o;11696:118::-;11783:24;11801:5;11783:24;:::i;:::-;11778:3;11771:37;11696:118;;:::o;11820:360::-;11906:3;11934:38;11966:5;11934:38;:::i;:::-;11988:70;12051:6;12046:3;11988:70;:::i;:::-;11981:77;;12067:52;12112:6;12107:3;12100:4;12093:5;12089:16;12067:52;:::i;:::-;12144:29;12166:6;12144:29;:::i;:::-;12139:3;12135:39;12128:46;;11910:270;11820:360;;;;:::o;12186:364::-;12274:3;12302:39;12335:5;12302:39;:::i;:::-;12357:71;12421:6;12416:3;12357:71;:::i;:::-;12350:78;;12437:52;12482:6;12477:3;12470:4;12463:5;12459:16;12437:52;:::i;:::-;12514:29;12536:6;12514:29;:::i;:::-;12509:3;12505:39;12498:46;;12278:272;12186:364;;;;:::o;12556:377::-;12662:3;12690:39;12723:5;12690:39;:::i;:::-;12745:89;12827:6;12822:3;12745:89;:::i;:::-;12738:96;;12843:52;12888:6;12883:3;12876:4;12869:5;12865:16;12843:52;:::i;:::-;12920:6;12915:3;12911:16;12904:23;;12666:267;12556:377;;;;:::o;12963:845::-;13066:3;13103:5;13097:12;13132:36;13158:9;13132:36;:::i;:::-;13184:89;13266:6;13261:3;13184:89;:::i;:::-;13177:96;;13304:1;13293:9;13289:17;13320:1;13315:137;;;;13466:1;13461:341;;;;13282:520;;13315:137;13399:4;13395:9;13384;13380:25;13375:3;13368:38;13435:6;13430:3;13426:16;13419:23;;13315:137;;13461:341;13528:38;13560:5;13528:38;:::i;:::-;13588:1;13602:154;13616:6;13613:1;13610:13;13602:154;;;13690:7;13684:14;13680:1;13675:3;13671:11;13664:35;13740:1;13731:7;13727:15;13716:26;;13638:4;13635:1;13631:12;13626:17;;13602:154;;;13785:6;13780:3;13776:16;13769:23;;13468:334;;13282:520;;13070:738;;12963:845;;;;:::o;13814:366::-;13956:3;13977:67;14041:2;14036:3;13977:67;:::i;:::-;13970:74;;14053:93;14142:3;14053:93;:::i;:::-;14171:2;14166:3;14162:12;14155:19;;13814:366;;;:::o;14186:::-;14328:3;14349:67;14413:2;14408:3;14349:67;:::i;:::-;14342:74;;14425:93;14514:3;14425:93;:::i;:::-;14543:2;14538:3;14534:12;14527:19;;14186:366;;;:::o;14558:::-;14700:3;14721:67;14785:2;14780:3;14721:67;:::i;:::-;14714:74;;14797:93;14886:3;14797:93;:::i;:::-;14915:2;14910:3;14906:12;14899:19;;14558:366;;;:::o;14930:::-;15072:3;15093:67;15157:2;15152:3;15093:67;:::i;:::-;15086:74;;15169:93;15258:3;15169:93;:::i;:::-;15287:2;15282:3;15278:12;15271:19;;14930:366;;;:::o;15302:::-;15444:3;15465:67;15529:2;15524:3;15465:67;:::i;:::-;15458:74;;15541:93;15630:3;15541:93;:::i;:::-;15659:2;15654:3;15650:12;15643:19;;15302:366;;;:::o;15674:::-;15816:3;15837:67;15901:2;15896:3;15837:67;:::i;:::-;15830:74;;15913:93;16002:3;15913:93;:::i;:::-;16031:2;16026:3;16022:12;16015:19;;15674:366;;;:::o;16046:::-;16188:3;16209:67;16273:2;16268:3;16209:67;:::i;:::-;16202:74;;16285:93;16374:3;16285:93;:::i;:::-;16403:2;16398:3;16394:12;16387:19;;16046:366;;;:::o;16418:::-;16560:3;16581:67;16645:2;16640:3;16581:67;:::i;:::-;16574:74;;16657:93;16746:3;16657:93;:::i;:::-;16775:2;16770:3;16766:12;16759:19;;16418:366;;;:::o;16790:365::-;16932:3;16953:66;17017:1;17012:3;16953:66;:::i;:::-;16946:73;;17028:93;17117:3;17028:93;:::i;:::-;17146:2;17141:3;17137:12;17130:19;;16790:365;;;:::o;17161:118::-;17248:24;17266:5;17248:24;:::i;:::-;17243:3;17236:37;17161:118;;:::o;17285:256::-;17397:3;17412:75;17483:3;17474:6;17412:75;:::i;:::-;17512:2;17507:3;17503:12;17496:19;;17532:3;17525:10;;17285:256;;;;:::o;17547:429::-;17724:3;17746:92;17834:3;17825:6;17746:92;:::i;:::-;17739:99;;17855:95;17946:3;17937:6;17855:95;:::i;:::-;17848:102;;17967:3;17960:10;;17547:429;;;;;:::o;17982:222::-;18075:4;18113:2;18102:9;18098:18;18090:26;;18126:71;18194:1;18183:9;18179:17;18170:6;18126:71;:::i;:::-;17982:222;;;;:::o;18210:640::-;18405:4;18443:3;18432:9;18428:19;18420:27;;18457:71;18525:1;18514:9;18510:17;18501:6;18457:71;:::i;:::-;18538:72;18606:2;18595:9;18591:18;18582:6;18538:72;:::i;:::-;18620;18688:2;18677:9;18673:18;18664:6;18620:72;:::i;:::-;18739:9;18733:4;18729:20;18724:2;18713:9;18709:18;18702:48;18767:76;18838:4;18829:6;18767:76;:::i;:::-;18759:84;;18210:640;;;;;;;:::o;18856:210::-;18943:4;18981:2;18970:9;18966:18;18958:26;;18994:65;19056:1;19045:9;19041:17;19032:6;18994:65;:::i;:::-;18856:210;;;;:::o;19072:222::-;19165:4;19203:2;19192:9;19188:18;19180:26;;19216:71;19284:1;19273:9;19269:17;19260:6;19216:71;:::i;:::-;19072:222;;;;:::o;19300:313::-;19413:4;19451:2;19440:9;19436:18;19428:26;;19500:9;19494:4;19490:20;19486:1;19475:9;19471:17;19464:47;19528:78;19601:4;19592:6;19528:78;:::i;:::-;19520:86;;19300:313;;;;:::o;19619:419::-;19785:4;19823:2;19812:9;19808:18;19800:26;;19872:9;19866:4;19862:20;19858:1;19847:9;19843:17;19836:47;19900:131;20026:4;19900:131;:::i;:::-;19892:139;;19619:419;;;:::o;20044:::-;20210:4;20248:2;20237:9;20233:18;20225:26;;20297:9;20291:4;20287:20;20283:1;20272:9;20268:17;20261:47;20325:131;20451:4;20325:131;:::i;:::-;20317:139;;20044:419;;;:::o;20469:::-;20635:4;20673:2;20662:9;20658:18;20650:26;;20722:9;20716:4;20712:20;20708:1;20697:9;20693:17;20686:47;20750:131;20876:4;20750:131;:::i;:::-;20742:139;;20469:419;;;:::o;20894:::-;21060:4;21098:2;21087:9;21083:18;21075:26;;21147:9;21141:4;21137:20;21133:1;21122:9;21118:17;21111:47;21175:131;21301:4;21175:131;:::i;:::-;21167:139;;20894:419;;;:::o;21319:::-;21485:4;21523:2;21512:9;21508:18;21500:26;;21572:9;21566:4;21562:20;21558:1;21547:9;21543:17;21536:47;21600:131;21726:4;21600:131;:::i;:::-;21592:139;;21319:419;;;:::o;21744:::-;21910:4;21948:2;21937:9;21933:18;21925:26;;21997:9;21991:4;21987:20;21983:1;21972:9;21968:17;21961:47;22025:131;22151:4;22025:131;:::i;:::-;22017:139;;21744:419;;;:::o;22169:::-;22335:4;22373:2;22362:9;22358:18;22350:26;;22422:9;22416:4;22412:20;22408:1;22397:9;22393:17;22386:47;22450:131;22576:4;22450:131;:::i;:::-;22442:139;;22169:419;;;:::o;22594:::-;22760:4;22798:2;22787:9;22783:18;22775:26;;22847:9;22841:4;22837:20;22833:1;22822:9;22818:17;22811:47;22875:131;23001:4;22875:131;:::i;:::-;22867:139;;22594:419;;;:::o;23019:::-;23185:4;23223:2;23212:9;23208:18;23200:26;;23272:9;23266:4;23262:20;23258:1;23247:9;23243:17;23236:47;23300:131;23426:4;23300:131;:::i;:::-;23292:139;;23019:419;;;:::o;23444:222::-;23537:4;23575:2;23564:9;23560:18;23552:26;;23588:71;23656:1;23645:9;23641:17;23632:6;23588:71;:::i;:::-;23444:222;;;;:::o;23672:129::-;23706:6;23733:20;;:::i;:::-;23723:30;;23762:33;23790:4;23782:6;23762:33;:::i;:::-;23672:129;;;:::o;23807:75::-;23840:6;23873:2;23867:9;23857:19;;23807:75;:::o;23888:311::-;23965:4;24055:18;24047:6;24044:30;24041:56;;;24077:18;;:::i;:::-;24041:56;24127:4;24119:6;24115:17;24107:25;;24187:4;24181;24177:15;24169:23;;23888:311;;;:::o;24205:::-;24282:4;24372:18;24364:6;24361:30;24358:56;;;24394:18;;:::i;:::-;24358:56;24444:4;24436:6;24432:17;24424:25;;24504:4;24498;24494:15;24486:23;;24205:311;;;:::o;24522:307::-;24583:4;24673:18;24665:6;24662:30;24659:56;;;24695:18;;:::i;:::-;24659:56;24733:29;24755:6;24733:29;:::i;:::-;24725:37;;24817:4;24811;24807:15;24799:23;;24522:307;;;:::o;24835:308::-;24897:4;24987:18;24979:6;24976:30;24973:56;;;25009:18;;:::i;:::-;24973:56;25047:29;25069:6;25047:29;:::i;:::-;25039:37;;25131:4;25125;25121:15;25113:23;;24835:308;;;:::o;25149:141::-;25198:4;25221:3;25213:11;;25244:3;25241:1;25234:14;25278:4;25275:1;25265:18;25257:26;;25149:141;;;:::o;25296:98::-;25347:6;25381:5;25375:12;25365:22;;25296:98;;;:::o;25400:99::-;25452:6;25486:5;25480:12;25470:22;;25400:99;;;:::o;25505:168::-;25588:11;25622:6;25617:3;25610:19;25662:4;25657:3;25653:14;25638:29;;25505:168;;;;:::o;25679:169::-;25763:11;25797:6;25792:3;25785:19;25837:4;25832:3;25828:14;25813:29;;25679:169;;;;:::o;25854:148::-;25956:11;25993:3;25978:18;;25854:148;;;;:::o;26008:305::-;26048:3;26067:20;26085:1;26067:20;:::i;:::-;26062:25;;26101:20;26119:1;26101:20;:::i;:::-;26096:25;;26255:1;26187:66;26183:74;26180:1;26177:81;26174:107;;;26261:18;;:::i;:::-;26174:107;26305:1;26302;26298:9;26291:16;;26008:305;;;;:::o;26319:185::-;26359:1;26376:20;26394:1;26376:20;:::i;:::-;26371:25;;26410:20;26428:1;26410:20;:::i;:::-;26405:25;;26449:1;26439:35;;26454:18;;:::i;:::-;26439:35;26496:1;26493;26489:9;26484:14;;26319:185;;;;:::o;26510:348::-;26550:7;26573:20;26591:1;26573:20;:::i;:::-;26568:25;;26607:20;26625:1;26607:20;:::i;:::-;26602:25;;26795:1;26727:66;26723:74;26720:1;26717:81;26712:1;26705:9;26698:17;26694:105;26691:131;;;26802:18;;:::i;:::-;26691:131;26850:1;26847;26843:9;26832:20;;26510:348;;;;:::o;26864:191::-;26904:4;26924:20;26942:1;26924:20;:::i;:::-;26919:25;;26958:20;26976:1;26958:20;:::i;:::-;26953:25;;26997:1;26994;26991:8;26988:34;;;27002:18;;:::i;:::-;26988:34;27047:1;27044;27040:9;27032:17;;26864:191;;;;:::o;27061:96::-;27098:7;27127:24;27145:5;27127:24;:::i;:::-;27116:35;;27061:96;;;:::o;27163:90::-;27197:7;27240:5;27233:13;27226:21;27215:32;;27163:90;;;:::o;27259:77::-;27296:7;27325:5;27314:16;;27259:77;;;:::o;27342:149::-;27378:7;27418:66;27411:5;27407:78;27396:89;;27342:149;;;:::o;27497:126::-;27534:7;27574:42;27567:5;27563:54;27552:65;;27497:126;;;:::o;27629:77::-;27666:7;27695:5;27684:16;;27629:77;;;:::o;27712:154::-;27796:6;27791:3;27786;27773:30;27858:1;27849:6;27844:3;27840:16;27833:27;27712:154;;;:::o;27872:307::-;27940:1;27950:113;27964:6;27961:1;27958:13;27950:113;;;28049:1;28044:3;28040:11;28034:18;28030:1;28025:3;28021:11;28014:39;27986:2;27983:1;27979:10;27974:15;;27950:113;;;28081:6;28078:1;28075:13;28072:101;;;28161:1;28152:6;28147:3;28143:16;28136:27;28072:101;27921:258;27872:307;;;:::o;28185:320::-;28229:6;28266:1;28260:4;28256:12;28246:22;;28313:1;28307:4;28303:12;28334:18;28324:81;;28390:4;28382:6;28378:17;28368:27;;28324:81;28452:2;28444:6;28441:14;28421:18;28418:38;28415:84;;;28471:18;;:::i;:::-;28415:84;28236:269;28185:320;;;:::o;28511:281::-;28594:27;28616:4;28594:27;:::i;:::-;28586:6;28582:40;28724:6;28712:10;28709:22;28688:18;28676:10;28673:34;28670:62;28667:88;;;28735:18;;:::i;:::-;28667:88;28775:10;28771:2;28764:22;28554:238;28511:281;;:::o;28798:233::-;28837:3;28860:24;28878:5;28860:24;:::i;:::-;28851:33;;28906:66;28899:5;28896:77;28893:103;;;28976:18;;:::i;:::-;28893:103;29023:1;29016:5;29012:13;29005:20;;28798:233;;;:::o;29037:100::-;29076:7;29105:26;29125:5;29105:26;:::i;:::-;29094:37;;29037:100;;;:::o;29143:94::-;29182:7;29211:20;29225:5;29211:20;:::i;:::-;29200:31;;29143:94;;;:::o;29243:176::-;29275:1;29292:20;29310:1;29292:20;:::i;:::-;29287:25;;29326:20;29344:1;29326:20;:::i;:::-;29321:25;;29365:1;29355:35;;29370:18;;:::i;:::-;29355:35;29411:1;29408;29404:9;29399:14;;29243:176;;;;:::o;29425:180::-;29473:77;29470:1;29463:88;29570:4;29567:1;29560:15;29594:4;29591:1;29584:15;29611:180;29659:77;29656:1;29649:88;29756:4;29753:1;29746:15;29780:4;29777:1;29770:15;29797:180;29845:77;29842:1;29835:88;29942:4;29939:1;29932:15;29966:4;29963:1;29956:15;29983:180;30031:77;30028:1;30021:88;30128:4;30125:1;30118:15;30152:4;30149:1;30142:15;30169:180;30217:77;30214:1;30207:88;30314:4;30311:1;30304:15;30338:4;30335:1;30328:15;30355:117;30464:1;30461;30454:12;30478:117;30587:1;30584;30577:12;30601:117;30710:1;30707;30700:12;30724:117;30833:1;30830;30823:12;30847:117;30956:1;30953;30946:12;30970:102;31011:6;31062:2;31058:7;31053:2;31046:5;31042:14;31038:28;31028:38;;30970:102;;;:::o;31078:94::-;31111:8;31159:5;31155:2;31151:14;31130:35;;31078:94;;;:::o;31178:225::-;31318:34;31314:1;31306:6;31302:14;31295:58;31387:8;31382:2;31374:6;31370:15;31363:33;31178:225;:::o;31409:176::-;31549:28;31545:1;31537:6;31533:14;31526:52;31409:176;:::o;31591:179::-;31731:31;31727:1;31719:6;31715:14;31708:55;31591:179;:::o;31776:172::-;31916:24;31912:1;31904:6;31900:14;31893:48;31776:172;:::o;31954:181::-;32094:33;32090:1;32082:6;32078:14;32071:57;31954:181;:::o;32141:182::-;32281:34;32277:1;32269:6;32265:14;32258:58;32141:182;:::o;32329:234::-;32469:34;32465:1;32457:6;32453:14;32446:58;32538:17;32533:2;32525:6;32521:15;32514:42;32329:234;:::o;32569:166::-;32709:18;32705:1;32697:6;32693:14;32686:42;32569:166;:::o;32741:158::-;32881:10;32877:1;32869:6;32865:14;32858:34;32741:158;:::o;32905:122::-;32978:24;32996:5;32978:24;:::i;:::-;32971:5;32968:35;32958:63;;33017:1;33014;33007:12;32958:63;32905:122;:::o;33033:116::-;33103:21;33118:5;33103:21;:::i;:::-;33096:5;33093:32;33083:60;;33139:1;33136;33129:12;33083:60;33033:116;:::o;33155:122::-;33228:24;33246:5;33228:24;:::i;:::-;33221:5;33218:35;33208:63;;33267:1;33264;33257:12;33208:63;33155:122;:::o;33283:120::-;33355:23;33372:5;33355:23;:::i;:::-;33348:5;33345:34;33335:62;;33393:1;33390;33383:12;33335:62;33283:120;:::o;33409:122::-;33482:24;33500:5;33482:24;:::i;:::-;33475:5;33472:35;33462:63;;33521:1;33518;33511:12;33462:63;33409:122;:::o

Swarm Source

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