ETH Price: $3,386.06 (-1.50%)
Gas: 2 Gwei

Token

Avatar Y00ts (AY)
 

Overview

Max Total Supply

888 AY

Holders

884

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
0xjowi.eth
Balance
1 AY
0x4ae94ba1bc6100bc6865f802c1492070e266521b
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:
NFT

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

// File: @openzeppelin/contracts-upgradeable/utils/math/MathUpgradeable.sol


// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/Math.sol)

pragma solidity ^0.8.0;

/**
 * @dev Standard math utilities missing in the Solidity language.
 */
library MathUpgradeable {
    enum Rounding {
        Down, // Toward negative infinity
        Up, // Toward infinity
        Zero // Toward zero
    }

    /**
     * @dev Returns the largest of two numbers.
     */
    function max(uint256 a, uint256 b) internal pure returns (uint256) {
        return a > b ? a : b;
    }

    /**
     * @dev Returns the smallest of two numbers.
     */
    function min(uint256 a, uint256 b) internal pure returns (uint256) {
        return a < b ? a : b;
    }

    /**
     * @dev Returns the average of two numbers. The result is rounded towards
     * zero.
     */
    function average(uint256 a, uint256 b) internal pure returns (uint256) {
        // (a + b) / 2 can overflow.
        return (a & b) + (a ^ b) / 2;
    }

    /**
     * @dev Returns the ceiling of the division of two numbers.
     *
     * This differs from standard division with `/` in that it rounds up instead
     * of rounding down.
     */
    function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {
        // (a + b - 1) / b can overflow on addition, so we distribute.
        return a == 0 ? 0 : (a - 1) / b + 1;
    }

    /**
     * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0
     * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)
     * with further edits by Uniswap Labs also under MIT license.
     */
    function mulDiv(
        uint256 x,
        uint256 y,
        uint256 denominator
    ) internal pure returns (uint256 result) {
        unchecked {
            // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use
            // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256
            // variables such that product = prod1 * 2^256 + prod0.
            uint256 prod0; // Least significant 256 bits of the product
            uint256 prod1; // Most significant 256 bits of the product
            assembly {
                let mm := mulmod(x, y, not(0))
                prod0 := mul(x, y)
                prod1 := sub(sub(mm, prod0), lt(mm, prod0))
            }

            // Handle non-overflow cases, 256 by 256 division.
            if (prod1 == 0) {
                return prod0 / denominator;
            }

            // Make sure the result is less than 2^256. Also prevents denominator == 0.
            require(denominator > prod1);

            ///////////////////////////////////////////////
            // 512 by 256 division.
            ///////////////////////////////////////////////

            // Make division exact by subtracting the remainder from [prod1 prod0].
            uint256 remainder;
            assembly {
                // Compute remainder using mulmod.
                remainder := mulmod(x, y, denominator)

                // Subtract 256 bit number from 512 bit number.
                prod1 := sub(prod1, gt(remainder, prod0))
                prod0 := sub(prod0, remainder)
            }

            // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.
            // See https://cs.stackexchange.com/q/138556/92363.

            // Does not overflow because the denominator cannot be zero at this stage in the function.
            uint256 twos = denominator & (~denominator + 1);
            assembly {
                // Divide denominator by twos.
                denominator := div(denominator, twos)

                // Divide [prod1 prod0] by twos.
                prod0 := div(prod0, twos)

                // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.
                twos := add(div(sub(0, twos), twos), 1)
            }

            // Shift in bits from prod1 into prod0.
            prod0 |= prod1 * twos;

            // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such
            // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for
            // four bits. That is, denominator * inv = 1 mod 2^4.
            uint256 inverse = (3 * denominator) ^ 2;

            // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works
            // in modular arithmetic, doubling the correct bits in each step.
            inverse *= 2 - denominator * inverse; // inverse mod 2^8
            inverse *= 2 - denominator * inverse; // inverse mod 2^16
            inverse *= 2 - denominator * inverse; // inverse mod 2^32
            inverse *= 2 - denominator * inverse; // inverse mod 2^64
            inverse *= 2 - denominator * inverse; // inverse mod 2^128
            inverse *= 2 - denominator * inverse; // inverse mod 2^256

            // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.
            // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is
            // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1
            // is no longer required.
            result = prod0 * inverse;
            return result;
        }
    }

    /**
     * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.
     */
    function mulDiv(
        uint256 x,
        uint256 y,
        uint256 denominator,
        Rounding rounding
    ) internal pure returns (uint256) {
        uint256 result = mulDiv(x, y, denominator);
        if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {
            result += 1;
        }
        return result;
    }

    /**
     * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down.
     *
     * Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11).
     */
    function sqrt(uint256 a) internal pure returns (uint256) {
        if (a == 0) {
            return 0;
        }

        // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.
        //
        // We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have
        // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.
        //
        // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`
        // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`
        // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`
        //
        // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.
        uint256 result = 1 << (log2(a) >> 1);

        // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,
        // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at
        // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision
        // into the expected uint128 result.
        unchecked {
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            return min(result, a / result);
        }
    }

    /**
     * @notice Calculates sqrt(a), following the selected rounding direction.
     */
    function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = sqrt(a);
            return result + (rounding == Rounding.Up && result * result < a ? 1 : 0);
        }
    }

    /**
     * @dev Return the log in base 2, rounded down, of a positive value.
     * Returns 0 if given 0.
     */
    function log2(uint256 value) internal pure returns (uint256) {
        uint256 result = 0;
        unchecked {
            if (value >> 128 > 0) {
                value >>= 128;
                result += 128;
            }
            if (value >> 64 > 0) {
                value >>= 64;
                result += 64;
            }
            if (value >> 32 > 0) {
                value >>= 32;
                result += 32;
            }
            if (value >> 16 > 0) {
                value >>= 16;
                result += 16;
            }
            if (value >> 8 > 0) {
                value >>= 8;
                result += 8;
            }
            if (value >> 4 > 0) {
                value >>= 4;
                result += 4;
            }
            if (value >> 2 > 0) {
                value >>= 2;
                result += 2;
            }
            if (value >> 1 > 0) {
                result += 1;
            }
        }
        return result;
    }

    /**
     * @dev Return the log in base 2, following the selected rounding direction, of a positive value.
     * Returns 0 if given 0.
     */
    function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = log2(value);
            return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0);
        }
    }

    /**
     * @dev Return the log in base 10, rounded down, of a positive value.
     * Returns 0 if given 0.
     */
    function log10(uint256 value) internal pure returns (uint256) {
        uint256 result = 0;
        unchecked {
            if (value >= 10**64) {
                value /= 10**64;
                result += 64;
            }
            if (value >= 10**32) {
                value /= 10**32;
                result += 32;
            }
            if (value >= 10**16) {
                value /= 10**16;
                result += 16;
            }
            if (value >= 10**8) {
                value /= 10**8;
                result += 8;
            }
            if (value >= 10**4) {
                value /= 10**4;
                result += 4;
            }
            if (value >= 10**2) {
                value /= 10**2;
                result += 2;
            }
            if (value >= 10**1) {
                result += 1;
            }
        }
        return result;
    }

    /**
     * @dev Return the log in base 10, following the selected rounding direction, of a positive value.
     * Returns 0 if given 0.
     */
    function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = log10(value);
            return result + (rounding == Rounding.Up && 10**result < value ? 1 : 0);
        }
    }

    /**
     * @dev Return the log in base 256, rounded down, of a positive value.
     * Returns 0 if given 0.
     *
     * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.
     */
    function log256(uint256 value) internal pure returns (uint256) {
        uint256 result = 0;
        unchecked {
            if (value >> 128 > 0) {
                value >>= 128;
                result += 16;
            }
            if (value >> 64 > 0) {
                value >>= 64;
                result += 8;
            }
            if (value >> 32 > 0) {
                value >>= 32;
                result += 4;
            }
            if (value >> 16 > 0) {
                value >>= 16;
                result += 2;
            }
            if (value >> 8 > 0) {
                result += 1;
            }
        }
        return result;
    }

    /**
     * @dev Return the log in base 10, following the selected rounding direction, of a positive value.
     * Returns 0 if given 0.
     */
    function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = log256(value);
            return result + (rounding == Rounding.Up && 1 << (result * 8) < value ? 1 : 0);
        }
    }
}

// File: @openzeppelin/contracts-upgradeable/utils/StringsUpgradeable.sol


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

pragma solidity ^0.8.0;


/**
 * @dev String operations.
 */
library StringsUpgradeable {
    bytes16 private constant _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) {
        unchecked {
            uint256 length = MathUpgradeable.log10(value) + 1;
            string memory buffer = new string(length);
            uint256 ptr;
            /// @solidity memory-safe-assembly
            assembly {
                ptr := add(buffer, add(32, length))
            }
            while (true) {
                ptr--;
                /// @solidity memory-safe-assembly
                assembly {
                    mstore8(ptr, byte(mod(value, 10), _SYMBOLS))
                }
                value /= 10;
                if (value == 0) break;
            }
            return buffer;
        }
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        unchecked {
            return toHexString(value, MathUpgradeable.log256(value) + 1);
        }
    }

    /**
     * @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] = _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: erc721a/contracts/IERC721A.sol


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

pragma solidity ^0.8.4;

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

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

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

    /**
     * The `quantity` minted with ERC2309 exceeds the safety limit.
     */
    error MintERC2309QuantityExceedsLimit();

    /**
     * The `extraData` cannot be set on an unintialized ownership slot.
     */
    error OwnershipNotInitializedForExtraData();

    // =============================================================
    //                            STRUCTS
    // =============================================================

    struct TokenOwnership {
        // The address of the owner.
        address addr;
        // Stores the start time of ownership with minimal overhead for tokenomics.
        uint64 startTimestamp;
        // Whether the token has been burned.
        bool burned;
        // Arbitrary data similar to `startTimestamp` that can be set via {_extraData}.
        uint24 extraData;
    }

    // =============================================================
    //                         TOKEN COUNTERS
    // =============================================================

    /**
     * @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() external view returns (uint256);

    // =============================================================
    //                            IERC165
    // =============================================================

    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified)
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30000 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`,
     * 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,
        bytes calldata data
    ) external payable;

    /**
     * @dev Equivalent to `safeTransferFrom(from, to, tokenId, '')`.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external payable;

    /**
     * @dev Transfers `tokenId` 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 payable;

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

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

    // =============================================================
    //                           IERC2309
    // =============================================================

    /**
     * @dev Emitted when tokens in `fromTokenId` to `toTokenId`
     * (inclusive) is transferred from `from` to `to`, as defined in the
     * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309) standard.
     *
     * See {_mintERC2309} for more details.
     */
    event ConsecutiveTransfer(uint256 indexed fromTokenId, uint256 toTokenId, address indexed from, address indexed to);
}

// File: erc721a/contracts/ERC721A.sol


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

pragma solidity ^0.8.4;


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

/**
 * @title ERC721A
 *
 * @dev Implementation of the [ERC721](https://eips.ethereum.org/EIPS/eip-721)
 * Non-Fungible Token Standard, including the Metadata extension.
 * Optimized for lower gas during batch mints.
 *
 * Token IDs are minted in sequential order (e.g. 0, 1, 2, 3, ...)
 * starting from `_startTokenId()`.
 *
 * Assumptions:
 *
 * - An owner cannot have more than 2**64 - 1 (max value of uint64) of supply.
 * - The maximum token ID cannot exceed 2**256 - 1 (max value of uint256).
 */
contract ERC721A is IERC721A {
    // Bypass for a `--via-ir` bug (https://github.com/chiru-labs/ERC721A/pull/364).
    struct TokenApprovalRef {
        address value;
    }

    // =============================================================
    //                           CONSTANTS
    // =============================================================

    // 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 bit position of `extraData` in packed ownership.
    uint256 private constant _BITPOS_EXTRA_DATA = 232;

    // Mask of all 256 bits in a packed ownership except the 24 bits for `extraData`.
    uint256 private constant _BITMASK_EXTRA_DATA_COMPLEMENT = (1 << 232) - 1;

    // The mask of the lower 160 bits for addresses.
    uint256 private constant _BITMASK_ADDRESS = (1 << 160) - 1;

    // The maximum `quantity` that can be minted with {_mintERC2309}.
    // This limit is to prevent overflows on the address data entries.
    // For a limit of 5000, a total of 3.689e15 calls to {_mintERC2309}
    // is required to cause an overflow, which is unrealistic.
    uint256 private constant _MAX_MINT_ERC2309_QUANTITY_LIMIT = 5000;

    // The `Transfer` event signature is given by:
    // `keccak256(bytes("Transfer(address,address,uint256)"))`.
    bytes32 private constant _TRANSFER_EVENT_SIGNATURE =
        0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef;

    // =============================================================
    //                            STORAGE
    // =============================================================

    // The next token ID 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`
    // - [232..255] `extraData`
    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 => TokenApprovalRef) private _tokenApprovals;

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

    // =============================================================
    //                          CONSTRUCTOR
    // =============================================================

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

    // =============================================================
    //                   TOKEN COUNTING OPERATIONS
    // =============================================================

    /**
     * @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 virtual 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 virtual 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 virtual 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 virtual returns (uint256) {
        return _burnCounter;
    }

    // =============================================================
    //                    ADDRESS DATA OPERATIONS
    // =============================================================

    /**
     * @dev Returns the number of tokens in `owner`'s account.
     */
    function balanceOf(address owner) public view virtual override returns (uint256) {
        if (owner == address(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 auxiliary 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 auxiliary 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 virtual {
        uint256 packed = _packedAddressData[owner];
        uint256 auxCasted;
        // Cast `aux` with assembly to avoid redundant masking.
        assembly {
            auxCasted := aux
        }
        packed = (packed & _BITMASK_AUX_COMPLEMENT) | (auxCasted << _BITPOS_AUX);
        _packedAddressData[owner] = packed;
    }

    // =============================================================
    //                            IERC165
    // =============================================================

    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified)
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30000 gas.
     */
    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: [ERC165](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.
    }

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

    /**
     * @dev Returns the token collection name.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev Returns the token collection symbol.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
     */
    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, it can be overridden in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return '';
    }

    // =============================================================
    //                     OWNERSHIPS OPERATIONS
    // =============================================================

    /**
     * @dev Returns the owner of the `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        return address(uint160(_packedOwnershipOf(tokenId)));
    }

    /**
     * @dev Gas spent here starts off proportional to the maximum mint batch size.
     * It gradually moves to O(1) as tokens get transferred around over time.
     */
    function _ownershipOf(uint256 tokenId) internal view virtual returns (TokenOwnership memory) {
        return _unpackedOwnership(_packedOwnershipOf(tokenId));
    }

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

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

    /**
     * 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 initialized ownership slot
                        // (i.e. `ownership.addr != address(0) && ownership.burned == false`)
                        // before an unintialized ownership slot
                        // (i.e. `ownership.addr == address(0) && ownership.burned == false`)
                        // Hence, `curr` will not underflow.
                        //
                        // We can directly compare the packed value.
                        // If the address is zero, packed will be zero.
                        while (packed == 0) {
                            packed = _packedOwnerships[--curr];
                        }
                        return packed;
                    }
                }
        }
        revert OwnerQueryForNonexistentToken();
    }

    /**
     * @dev 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;
        ownership.extraData = uint24(packed >> _BITPOS_EXTRA_DATA);
    }

    /**
     * @dev Packs ownership data into a single uint256.
     */
    function _packOwnershipData(address owner, uint256 flags) private view returns (uint256 result) {
        assembly {
            // Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean.
            owner := and(owner, _BITMASK_ADDRESS)
            // `owner | (block.timestamp << _BITPOS_START_TIMESTAMP) | flags`.
            result := or(owner, or(shl(_BITPOS_START_TIMESTAMP, timestamp()), flags))
        }
    }

    /**
     * @dev Returns the `nextInitialized` flag set if `quantity` equals 1.
     */
    function _nextInitializedFlag(uint256 quantity) private pure returns (uint256 result) {
        // For branchless setting of the `nextInitialized` flag.
        assembly {
            // `(quantity == 1) << _BITPOS_NEXT_INITIALIZED`.
            result := shl(_BITPOS_NEXT_INITIALIZED, eq(quantity, 1))
        }
    }

    // =============================================================
    //                      APPROVAL OPERATIONS
    // =============================================================

    /**
     * @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) public payable virtual override {
        address owner = ownerOf(tokenId);

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

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

    /**
     * @dev Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken();

        return _tokenApprovals[tokenId].value;
    }

    /**
     * @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) public virtual override {
        _operatorApprovals[_msgSenderERC721A()][operator] = approved;
        emit ApprovalForAll(_msgSenderERC721A(), operator, approved);
    }

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

    /**
     * @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. See {_mint}.
     */
    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return
            _startTokenId() <= tokenId &&
            tokenId < _currentIndex && // If within bounds,
            _packedOwnerships[tokenId] & _BITMASK_BURNED == 0; // and not burned.
    }

    /**
     * @dev Returns whether `msgSender` is equal to `approvedAddress` or `owner`.
     */
    function _isSenderApprovedOrOwner(
        address approvedAddress,
        address owner,
        address msgSender
    ) private pure returns (bool result) {
        assembly {
            // Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean.
            owner := and(owner, _BITMASK_ADDRESS)
            // Mask `msgSender` to the lower 160 bits, in case the upper bits somehow aren't clean.
            msgSender := and(msgSender, _BITMASK_ADDRESS)
            // `msgSender == owner || msgSender == approvedAddress`.
            result := or(eq(msgSender, owner), eq(msgSender, approvedAddress))
        }
    }

    /**
     * @dev Returns the storage slot and value for the approved address of `tokenId`.
     */
    function _getApprovedSlotAndAddress(uint256 tokenId)
        private
        view
        returns (uint256 approvedAddressSlot, address approvedAddress)
    {
        TokenApprovalRef storage tokenApproval = _tokenApprovals[tokenId];
        // The following is equivalent to `approvedAddress = _tokenApprovals[tokenId].value`.
        assembly {
            approvedAddressSlot := tokenApproval.slot
            approvedAddress := sload(approvedAddressSlot)
        }
    }

    // =============================================================
    //                      TRANSFER OPERATIONS
    // =============================================================

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *
     * 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
    ) public payable virtual override {
        uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId);

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

        (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedSlotAndAddress(tokenId);

        // The nested ifs save around 20+ gas over a compound boolean condition.
        if (!_isSenderApprovedOrOwner(approvedAddress, from, _msgSenderERC721A()))
            if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved();

        if (to == address(0)) revert TransferToZeroAddress();

        _beforeTokenTransfers(from, to, tokenId, 1);

        // Clear approvals from the previous owner.
        assembly {
            if approvedAddress {
                // This is equivalent to `delete _tokenApprovals[tokenId]`.
                sstore(approvedAddressSlot, 0)
            }
        }

        // 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] = _packOwnershipData(
                to,
                _BITMASK_NEXT_INITIALIZED | _nextExtraData(from, to, prevOwnershipPacked)
            );

            // 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 `safeTransferFrom(from, to, tokenId, '')`.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public payable virtual override {
        safeTransferFrom(from, to, tokenId, '');
    }

    /**
     * @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 memory _data
    ) public payable virtual override {
        transferFrom(from, to, tokenId);
        if (to.code.length != 0)
            if (!_checkContractOnERC721Received(from, to, tokenId, _data)) {
                revert TransferToNonERC721ReceiverImplementer();
            }
    }

    /**
     * @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 Private function to invoke {IERC721Receiver-onERC721Received} on a target contract.
     *
     * `from` - Previous owner of the given token ID.
     * `to` - Target address that will receive the token.
     * `tokenId` - Token ID to be transferred.
     * `_data` - Optional data to send along with the call.
     *
     * Returns 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))
                }
            }
        }
    }

    // =============================================================
    //                        MINT OPERATIONS
    // =============================================================

    /**
     * @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 for each mint.
     */
    function _mint(address to, uint256 quantity) internal virtual {
        uint256 startTokenId = _currentIndex;
        if (quantity == 0) revert MintZeroQuantity();

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

        // Overflows are incredibly unrealistic.
        // `balance` and `numberMinted` have a maximum limit of 2**64.
        // `tokenId` has a maximum limit of 2**256.
        unchecked {
            // Updates:
            // - `balance += quantity`.
            // - `numberMinted += quantity`.
            //
            // We can directly add to the `balance` and `numberMinted`.
            _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] = _packOwnershipData(
                to,
                _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0)
            );

            uint256 toMasked;
            uint256 end = startTokenId + quantity;

            // Use assembly to loop and emit the `Transfer` event for gas savings.
            // The duplicated `log4` removes an extra check and reduces stack juggling.
            // The assembly, together with the surrounding Solidity code, have been
            // delicately arranged to nudge the compiler into producing optimized opcodes.
            assembly {
                // Mask `to` to the lower 160 bits, in case the upper bits somehow aren't clean.
                toMasked := and(to, _BITMASK_ADDRESS)
                // Emit the `Transfer` event.
                log4(
                    0, // Start of data (0, since no data).
                    0, // End of data (0, since no data).
                    _TRANSFER_EVENT_SIGNATURE, // Signature.
                    0, // `address(0)`.
                    toMasked, // `to`.
                    startTokenId // `tokenId`.
                )

                // The `iszero(eq(,))` check ensures that large values of `quantity`
                // that overflows uint256 will make the loop run out of gas.
                // The compiler will optimize the `iszero` away for performance.
                for {
                    let tokenId := add(startTokenId, 1)
                } iszero(eq(tokenId, end)) {
                    tokenId := add(tokenId, 1)
                } {
                    // Emit the `Transfer` event. Similar to above.
                    log4(0, 0, _TRANSFER_EVENT_SIGNATURE, 0, toMasked, tokenId)
                }
            }
            if (toMasked == 0) revert MintToZeroAddress();

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

    /**
     * @dev Mints `quantity` tokens and transfers them to `to`.
     *
     * This function is intended for efficient minting only during contract creation.
     *
     * It emits only one {ConsecutiveTransfer} as defined in
     * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309),
     * instead of a sequence of {Transfer} event(s).
     *
     * Calling this function outside of contract creation WILL make your contract
     * non-compliant with the ERC721 standard.
     * For full ERC721 compliance, substituting ERC721 {Transfer} event(s) with the ERC2309
     * {ConsecutiveTransfer} event is only permissible during contract creation.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `quantity` must be greater than 0.
     *
     * Emits a {ConsecutiveTransfer} event.
     */
    function _mintERC2309(address to, uint256 quantity) internal virtual {
        uint256 startTokenId = _currentIndex;
        if (to == address(0)) revert MintToZeroAddress();
        if (quantity == 0) revert MintZeroQuantity();
        if (quantity > _MAX_MINT_ERC2309_QUANTITY_LIMIT) revert MintERC2309QuantityExceedsLimit();

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

        // Overflows are unrealistic due to the above check for `quantity` to be below the limit.
        unchecked {
            // Updates:
            // - `balance += quantity`.
            // - `numberMinted += quantity`.
            //
            // We can directly add to the `balance` and `numberMinted`.
            _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] = _packOwnershipData(
                to,
                _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0)
            );

            emit ConsecutiveTransfer(startTokenId, startTokenId + quantity - 1, address(0), to);

            _currentIndex = startTokenId + quantity;
        }
        _afterTokenTransfers(address(0), to, startTokenId, 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.
     *
     * See {_mint}.
     *
     * Emits a {Transfer} event for each mint.
     */
    function _safeMint(
        address to,
        uint256 quantity,
        bytes memory _data
    ) internal virtual {
        _mint(to, quantity);

        unchecked {
            if (to.code.length != 0) {
                uint256 end = _currentIndex;
                uint256 index = end - quantity;
                do {
                    if (!_checkContractOnERC721Received(address(0), to, index++, _data)) {
                        revert TransferToNonERC721ReceiverImplementer();
                    }
                } while (index < end);
                // Reentrancy protection.
                if (_currentIndex != end) revert();
            }
        }
    }

    /**
     * @dev Equivalent to `_safeMint(to, quantity, '')`.
     */
    function _safeMint(address to, uint256 quantity) internal virtual {
        _safeMint(to, quantity, '');
    }

    // =============================================================
    //                        BURN OPERATIONS
    // =============================================================

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

        (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedSlotAndAddress(tokenId);

        if (approvalCheck) {
            // The nested ifs save around 20+ gas over a compound boolean condition.
            if (!_isSenderApprovedOrOwner(approvedAddress, from, _msgSenderERC721A()))
                if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved();
        }

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

        // Clear approvals from the previous owner.
        assembly {
            if approvedAddress {
                // This is equivalent to `delete _tokenApprovals[tokenId]`.
                sstore(approvedAddressSlot, 0)
            }
        }

        // 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] = _packOwnershipData(
                from,
                (_BITMASK_BURNED | _BITMASK_NEXT_INITIALIZED) | _nextExtraData(from, address(0), prevOwnershipPacked)
            );

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

    // =============================================================
    //                     EXTRA DATA OPERATIONS
    // =============================================================

    /**
     * @dev Directly sets the extra data for the ownership data `index`.
     */
    function _setExtraDataAt(uint256 index, uint24 extraData) internal virtual {
        uint256 packed = _packedOwnerships[index];
        if (packed == 0) revert OwnershipNotInitializedForExtraData();
        uint256 extraDataCasted;
        // Cast `extraData` with assembly to avoid redundant masking.
        assembly {
            extraDataCasted := extraData
        }
        packed = (packed & _BITMASK_EXTRA_DATA_COMPLEMENT) | (extraDataCasted << _BITPOS_EXTRA_DATA);
        _packedOwnerships[index] = packed;
    }

    /**
     * @dev Called during each token transfer to set the 24bit `extraData` field.
     * Intended to be overridden by the cosumer contract.
     *
     * `previousExtraData` - the value of `extraData` before transfer.
     *
     * 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 _extraData(
        address from,
        address to,
        uint24 previousExtraData
    ) internal view virtual returns (uint24) {}

    /**
     * @dev Returns the next extra data for the packed ownership data.
     * The returned result is shifted into position.
     */
    function _nextExtraData(
        address from,
        address to,
        uint256 prevOwnershipPacked
    ) private view returns (uint256) {
        uint24 extraData = uint24(prevOwnershipPacked >> _BITPOS_EXTRA_DATA);
        return uint256(_extraData(from, to, extraData)) << _BITPOS_EXTRA_DATA;
    }

    // =============================================================
    //                       OTHER OPERATIONS
    // =============================================================

    /**
     * @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 virtual returns (string memory str) {
        assembly {
            // The maximum value of a uint256 contains 78 digits (1 byte per digit), but
            // we allocate 0xa0 bytes to keep the free memory pointer 32-byte word aligned.
            // We will need 1 word for the trailing zeros padding, 1 word for the length,
            // and 3 words for a maximum of 78 digits. Total: 5 * 0x20 = 0xa0.
            let m := add(mload(0x40), 0xa0)
            // Update the free memory pointer to allocate.
            mstore(0x40, m)
            // Assign the `str` to the end.
            str := sub(m, 0x20)
            // Zeroize the slot after the string.
            mstore(str, 0)

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

            // We write the string from rightmost digit to leftmost digit.
            // The following is essentially a do-while loop that also handles the zero case.
            // prettier-ignore
            for { let temp := value } 1 {} {
                str := sub(str, 1)
                // Write the character to the pointer.
                // The ASCII index of the '0' character is 48.
                mstore8(str, add(48, mod(temp, 10)))
                // Keep dividing `temp` until zero.
                temp := div(temp, 10)
                // prettier-ignore
                if iszero(temp) { break }
            }

            let length := sub(end, str)
            // Move the pointer 32 bytes leftwards to make room for the length.
            str := sub(str, 0x20)
            // Store the length.
            mstore(str, length)
        }
    }
}

// File: contracts/Avatar_y00ts.sol



pragma solidity ^0.8.7;




contract NFT is ERC721A, Ownable {
  using StringsUpgradeable for uint256;
  string baseURI;
  string public baseExtension = ".json";
  uint256 public totalFree = 888;
  uint256 public maxSupply = 888;
  
  bool public paused = false;
  bool public revealed = false;
  string public notRevealedUri;
  
  uint256 public ownerSave = 0;
  uint256 public maxPerFree = 1;
  uint256 public maxCount = 8;
  uint256 public price = 0.002 ether;
  //uint256 public totalFreeMinted = 0;


  uint256 _startTime = 1671292800;
  mapping(address => uint256) public playerCount;
  mapping(address => uint256) public mintFreeAmout;


  constructor(
    string memory _name,
    string memory _symbol,
    string memory _initBaseURI,
    string memory _initNotRevealedUri
  ) ERC721A(_name, _symbol) {
    setBaseURI(_initBaseURI);
    setNotRevealedURI(_initNotRevealedUri);
  }

  function setStartTime(uint time) public onlyOwner {
    _startTime = time;
  }


  function setScaleData(uint256 maxPerFree_, uint256 maxCount_, uint256 price_, uint256 MaxTotalFree_) external onlyOwner 
  {
    maxPerFree = maxPerFree_;
    maxCount = maxCount_;
    price = price_;
    totalFree = MaxTotalFree_;
  }

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


  // public
  function mint(uint256 count) external payable {
    uint256 cost = price;
    
    uint256 supply = totalSupply();
    uint256 playerMintFreeAmout = mintFreeAmout[msg.sender];

    require(block.timestamp >= _startTime,"not the right time");
    require(count > 0,"mint Amount less than 1");
    require(supply + count <= (maxSupply - ownerSave),"No more");
    require(count + playerCount[msg.sender] <= maxCount,"player max mint");
    require(!paused,"scale paused");

      //   if ((totalFreeMinted + count < totalFree - ownerSave + 1) && (playerMintFreeAmout < maxPerFree)) { 
      //       if(count >= (maxPerFree - playerMintFreeAmout))
      //       {
      //        require(msg.value >= (count * cost) - ((maxPerFree - playerMintFreeAmout) * cost), "Please send the exact ETH amount");
      //        mintFreeAmout[msg.sender] = maxPerFree;
      //        totalFreeMinted += maxPerFree;
      //       }
      //       else
      //       {
      //        require(msg.value >= 0, "Please send the exact ETH amount");
      //        mintFreeAmout[msg.sender] += count;
      //        totalFreeMinted += count;
      //       }
      // }

    if ((playerMintFreeAmout < maxPerFree)) { 
            if(count >= (maxPerFree - playerMintFreeAmout))
            {
             require(msg.value >= (count * cost) - ((maxPerFree - playerMintFreeAmout) * cost), "Please send the exact ETH amount");
             mintFreeAmout[msg.sender] = maxPerFree;
            }
            else
            {
             require(msg.value >= 0, "Please send the exact ETH amount");
             mintFreeAmout[msg.sender] += count;
            }
      }
        
      else{
          require(msg.value >= count * cost, "Please send the exact ETH amount");
      }

    playerCount[msg.sender] += count;

    _safeMint(msg.sender, count);

  }

    
  function airDorp(address player,uint256 _airAmount) public payable onlyOwner{
    uint256 supply = totalSupply();
    require(_airAmount > 0);
    require(supply + _airAmount <= maxSupply);

    
      _safeMint(player, _airAmount);

  }




  // function walletOfOwner(address _owner)
  //   public
  //   view
  //   returns (uint256[] memory)
  // {
  //   uint256 ownerTokenCount = balanceOf(_owner);
  //   uint256[] memory tokenIds = new uint256[](ownerTokenCount);
  //   for (uint256 i; i < ownerTokenCount; i++) {
  //     tokenIds[i] = tokenOfOwnerByIndex(_owner, i);
  //   }
  //   return tokenIds;
  // }

  function tokenURI(uint256 tokenId)
    public
    view
    virtual
    override
    returns (string memory)
  {
    require(
      _exists(tokenId),
      "ERC721Metadata: URI query for nonexistent token"
    );
    
    if(revealed == false) {
        return notRevealedUri;
    }

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

  //only owner
  function reveal() public onlyOwner {
      revealed = true;
  }

    function setOwnerSave(uint count) public onlyOwner {
    ownerSave = count;
  }
  
  function maxFreePerWallet() public view returns (uint256) {
      return maxPerFree;
  }

  function setNotRevealedURI(string memory _notRevealedURI) public onlyOwner {
    notRevealedUri = _notRevealedURI;
  }

  function setBaseURI(string memory _newBaseURI) public onlyOwner {
    baseURI = _newBaseURI;
  }

  function setBaseExtension(string memory _newBaseExtension) public onlyOwner {
    baseExtension = _newBaseExtension;
  }

  function pause(bool _state) public onlyOwner {
    paused = _state;
  }
 
  function withdraw() public payable onlyOwner {

    // =============================================================================
    
    // This will payout the owner 95% of the contract balance.
    // Do not remove this otherwise you will not be able to withdraw the funds.
    // =============================================================================
    (bool os, ) = payable(owner()).call{value: address(this).balance}("");
    require(os);
    // =============================================================================
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"string","name":"_initBaseURI","type":"string"},{"internalType":"string","name":"_initNotRevealedUri","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintERC2309QuantityExceedsLimit","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"OwnershipNotInitializedForExtraData","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":"uint256","name":"fromTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"toTokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"ConsecutiveTransfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"player","type":"address"},{"internalType":"uint256","name":"_airAmount","type":"uint256"}],"name":"airDorp","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseExtension","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":"maxCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxFreePerWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPerFree","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"count","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"mintFreeAmout","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"notRevealedUri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ownerSave","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"playerCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reveal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","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":"payable","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":"payable","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":"_newBaseExtension","type":"string"}],"name":"setBaseExtension","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_notRevealedURI","type":"string"}],"name":"setNotRevealedURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"count","type":"uint256"}],"name":"setOwnerSave","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxPerFree_","type":"uint256"},{"internalType":"uint256","name":"maxCount_","type":"uint256"},{"internalType":"uint256","name":"price_","type":"uint256"},{"internalType":"uint256","name":"MaxTotalFree_","type":"uint256"}],"name":"setScaleData","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"time","type":"uint256"}],"name":"setStartTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalFree","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"}]

60806040526040518060400160405280600581526020017f2e6a736f6e000000000000000000000000000000000000000000000000000000815250600a90805190602001906200005192919062000367565b50610378600b55610378600c556000600d60006101000a81548160ff0219169083151502179055506000600d60016101000a81548160ff0219169083151502179055506000600f556001601055600860115566071afd498d000060125563639de780601355348015620000c357600080fd5b5060405162003e2738038062003e278339818101604052810190620000e9919062000495565b838381600290805190602001906200010392919062000367565b5080600390805190602001906200011c92919062000367565b506200012d6200018160201b60201c565b600081905550505062000155620001496200018660201b60201c565b6200018e60201b60201c565b62000166826200025460201b60201c565b62000177816200028060201b60201c565b505050506200078a565b600090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b62000264620002ac60201b60201c565b80600990805190602001906200027c92919062000367565b5050565b62000290620002ac60201b60201c565b80600e9080519060200190620002a892919062000367565b5050565b620002bc6200018660201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620002e26200033d60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16146200033b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200033290620005aa565b60405180910390fd5b565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b828054620003759062000672565b90600052602060002090601f016020900481019282620003995760008555620003e5565b82601f10620003b457805160ff1916838001178555620003e5565b82800160010185558215620003e5579182015b82811115620003e4578251825591602001919060010190620003c7565b5b509050620003f49190620003f8565b5090565b5b8082111562000413576000816000905550600101620003f9565b5090565b60006200042e6200042884620005f5565b620005cc565b9050828152602081018484840111156200044d576200044c62000741565b5b6200045a8482856200063c565b509392505050565b600082601f8301126200047a57620004796200073c565b5b81516200048c84826020860162000417565b91505092915050565b60008060008060808587031215620004b257620004b16200074b565b5b600085015167ffffffffffffffff811115620004d357620004d262000746565b5b620004e18782880162000462565b945050602085015167ffffffffffffffff81111562000505576200050462000746565b5b620005138782880162000462565b935050604085015167ffffffffffffffff81111562000537576200053662000746565b5b620005458782880162000462565b925050606085015167ffffffffffffffff81111562000569576200056862000746565b5b620005778782880162000462565b91505092959194509250565b6000620005926020836200062b565b91506200059f8262000761565b602082019050919050565b60006020820190508181036000830152620005c58162000583565b9050919050565b6000620005d8620005eb565b9050620005e68282620006a8565b919050565b6000604051905090565b600067ffffffffffffffff8211156200061357620006126200070d565b5b6200061e8262000750565b9050602081019050919050565b600082825260208201905092915050565b60005b838110156200065c5780820151818401526020810190506200063f565b838111156200066c576000848401525b50505050565b600060028204905060018216806200068b57607f821691505b60208210811415620006a257620006a1620006de565b5b50919050565b620006b38262000750565b810181811067ffffffffffffffff82111715620006d557620006d46200070d565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b61368d806200079a6000396000f3fe6080604052600436106102465760003560e01c80638da5cb5b11610139578063b88d4fde116100b6578063da3ef23f1161007a578063da3ef23f146107e9578063e3e3c66514610812578063e80509241461083d578063e985e9c51461087a578063f2c4ce1e146108b7578063f2fde38b146108e057610246565b8063b88d4fde1461070f578063c66828621461072b578063c7c39ffc14610756578063c87b56dd14610781578063d5abeb01146107be57610246565b8063a0712d68116100fd578063a0712d681461066c578063a22cb46514610688578063a475b5dd146106b1578063a7027357146106c8578063b3f50e72146106f357610246565b80638da5cb5b1461059757806395d89b41146105c257806397084843146105ed5780639ef2d87a14610616578063a035b1fe1461064157610246565b80633e0a322d116101c75780635c975abb1161018b5780635c975abb1461049e5780636246d7fb146104c95780636352211e1461050657806370a0823114610543578063715018a61461058057610246565b80633e0a322d146103dc5780633e8f7e9f1461040557806342842e0e1461042e578063518302271461044a57806355f804b31461047557610246565b8063095ea7b31161020e578063095ea7b31461034457806318160ddd1461036057806323b872dd1461038b578063333e44e6146103a75780633ccfd60b146103d257610246565b806301ffc9a71461024b57806302329a291461028857806306fdde03146102b1578063081812fc146102dc578063081c8c4414610319575b600080fd5b34801561025757600080fd5b50610272600480360381019061026d9190612a6a565b610909565b60405161027f9190612efb565b60405180910390f35b34801561029457600080fd5b506102af60048036038101906102aa9190612a3d565b61099b565b005b3480156102bd57600080fd5b506102c66109c0565b6040516102d39190612f16565b60405180910390f35b3480156102e857600080fd5b5061030360048036038101906102fe9190612b0d565b610a52565b6040516103109190612e94565b60405180910390f35b34801561032557600080fd5b5061032e610ad1565b60405161033b9190612f16565b60405180910390f35b61035e600480360381019061035991906129fd565b610b5f565b005b34801561036c57600080fd5b50610375610ca3565b6040516103829190613058565b60405180910390f35b6103a560048036038101906103a091906128e7565b610cba565b005b3480156103b357600080fd5b506103bc610fdf565b6040516103c99190613058565b60405180910390f35b6103da610fe5565b005b3480156103e857600080fd5b5061040360048036038101906103fe9190612b0d565b61106d565b005b34801561041157600080fd5b5061042c60048036038101906104279190612b0d565b61107f565b005b610448600480360381019061044391906128e7565b611091565b005b34801561045657600080fd5b5061045f6110b1565b60405161046c9190612efb565b60405180910390f35b34801561048157600080fd5b5061049c60048036038101906104979190612ac4565b6110c4565b005b3480156104aa57600080fd5b506104b36110e6565b6040516104c09190612efb565b60405180910390f35b3480156104d557600080fd5b506104f060048036038101906104eb919061287a565b6110f9565b6040516104fd9190613058565b60405180910390f35b34801561051257600080fd5b5061052d60048036038101906105289190612b0d565b611111565b60405161053a9190612e94565b60405180910390f35b34801561054f57600080fd5b5061056a6004803603810190610565919061287a565b611123565b6040516105779190613058565b60405180910390f35b34801561058c57600080fd5b506105956111dc565b005b3480156105a357600080fd5b506105ac6111f0565b6040516105b99190612e94565b60405180910390f35b3480156105ce57600080fd5b506105d761121a565b6040516105e49190612f16565b60405180910390f35b3480156105f957600080fd5b50610614600480360381019061060f9190612b3a565b6112ac565b005b34801561062257600080fd5b5061062b6112d6565b6040516106389190613058565b60405180910390f35b34801561064d57600080fd5b506106566112dc565b6040516106639190613058565b60405180910390f35b61068660048036038101906106819190612b0d565b6112e2565b005b34801561069457600080fd5b506106af60048036038101906106aa91906129bd565b61172c565b005b3480156106bd57600080fd5b506106c6611837565b005b3480156106d457600080fd5b506106dd61185c565b6040516106ea9190613058565b60405180910390f35b61070d600480360381019061070891906129fd565b611866565b005b6107296004803603810190610724919061293a565b6118b0565b005b34801561073757600080fd5b50610740611923565b60405161074d9190612f16565b60405180910390f35b34801561076257600080fd5b5061076b6119b1565b6040516107789190613058565b60405180910390f35b34801561078d57600080fd5b506107a860048036038101906107a39190612b0d565b6119b7565b6040516107b59190612f16565b60405180910390f35b3480156107ca57600080fd5b506107d3611b10565b6040516107e09190613058565b60405180910390f35b3480156107f557600080fd5b50610810600480360381019061080b9190612ac4565b611b16565b005b34801561081e57600080fd5b50610827611b38565b6040516108349190613058565b60405180910390f35b34801561084957600080fd5b50610864600480360381019061085f919061287a565b611b3e565b6040516108719190613058565b60405180910390f35b34801561088657600080fd5b506108a1600480360381019061089c91906128a7565b611b56565b6040516108ae9190612efb565b60405180910390f35b3480156108c357600080fd5b506108de60048036038101906108d99190612ac4565b611bea565b005b3480156108ec57600080fd5b506109076004803603810190610902919061287a565b611c0c565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061096457506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806109945750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b6109a3611c90565b80600d60006101000a81548160ff02191690831515021790555050565b6060600280546109cf906132f7565b80601f01602080910402602001604051908101604052809291908181526020018280546109fb906132f7565b8015610a485780601f10610a1d57610100808354040283529160200191610a48565b820191906000526020600020905b815481529060010190602001808311610a2b57829003601f168201915b5050505050905090565b6000610a5d82611d0e565b610a93576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600e8054610ade906132f7565b80601f0160208091040260200160405190810160405280929190818152602001828054610b0a906132f7565b8015610b575780601f10610b2c57610100808354040283529160200191610b57565b820191906000526020600020905b815481529060010190602001808311610b3a57829003601f168201915b505050505081565b6000610b6a82611111565b90508073ffffffffffffffffffffffffffffffffffffffff16610b8b611d6d565b73ffffffffffffffffffffffffffffffffffffffff1614610bee57610bb781610bb2611d6d565b611b56565b610bed576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000610cad611d75565b6001546000540303905090565b6000610cc582611d7a565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610d2c576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080610d3884611e48565b91509150610d4e8187610d49611d6d565b611e6f565b610d9a57610d6386610d5e611d6d565b611b56565b610d99576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415610e01576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610e0e8686866001611eb3565b8015610e1957600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815460010191905081905550610ee785610ec3888887611eb9565b7c020000000000000000000000000000000000000000000000000000000017611ee1565b600460008681526020019081526020016000208190555060007c020000000000000000000000000000000000000000000000000000000084161415610f6f576000600185019050600060046000838152602001908152602001600020541415610f6d576000548114610f6c578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4610fd78686866001611f0c565b505050505050565b600b5481565b610fed611c90565b6000610ff76111f0565b73ffffffffffffffffffffffffffffffffffffffff164760405161101a90612e7f565b60006040518083038185875af1925050503d8060008114611057576040519150601f19603f3d011682016040523d82523d6000602084013e61105c565b606091505b505090508061106a57600080fd5b50565b611075611c90565b8060138190555050565b611087611c90565b80600f8190555050565b6110ac838383604051806020016040528060008152506118b0565b505050565b600d60019054906101000a900460ff1681565b6110cc611c90565b80600990805190602001906110e292919061268e565b5050565b600d60009054906101000a900460ff1681565b60146020528060005260406000206000915090505481565b600061111c82611d7a565b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561118b576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b6111e4611c90565b6111ee6000611f12565b565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060038054611229906132f7565b80601f0160208091040260200160405190810160405280929190818152602001828054611255906132f7565b80156112a25780601f10611277576101008083540402835291602001916112a2565b820191906000526020600020905b81548152906001019060200180831161128557829003601f168201915b5050505050905090565b6112b4611c90565b83601081905550826011819055508160128190555080600b8190555050505050565b60115481565b60125481565b6000601254905060006112f3610ca3565b90506000601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060135442101561137e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161137590613018565b60405180910390fd5b600084116113c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113b890612f98565b60405180910390fd5b600f54600c546113d1919061320d565b84836113dd919061315d565b111561141e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161141590612f38565b60405180910390fd5b601154601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548561146c919061315d565b11156114ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114a490613038565b60405180910390fd5b600d60009054906101000a900460ff16156114fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114f490612f78565b60405180910390fd5b6010548110156116775780601054611515919061320d565b84106115d757828160105461152a919061320d565b61153491906131b3565b838561154091906131b3565b61154a919061320d565b34101561158c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161158390612fb8565b60405180910390fd5b601054601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611672565b600034101561161b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161161290612fb8565b60405180910390fd5b83601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461166a919061315d565b925050819055505b6116c6565b828461168391906131b3565b3410156116c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116bc90612fb8565b60405180910390fd5b5b83601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611715919061315d565b925050819055506117263385611fd8565b50505050565b8060076000611739611d6d565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166117e6611d6d565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161182b9190612efb565b60405180910390a35050565b61183f611c90565b6001600d60016101000a81548160ff021916908315150217905550565b6000601054905090565b61186e611c90565b6000611878610ca3565b90506000821161188757600080fd5b600c548282611896919061315d565b11156118a157600080fd5b6118ab8383611fd8565b505050565b6118bb848484610cba565b60008373ffffffffffffffffffffffffffffffffffffffff163b1461191d576118e684848484611ff6565b61191c576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b600a8054611930906132f7565b80601f016020809104026020016040519081016040528092919081815260200182805461195c906132f7565b80156119a95780601f1061197e576101008083540402835291602001916119a9565b820191906000526020600020905b81548152906001019060200180831161198c57829003601f168201915b505050505081565b60105481565b60606119c282611d0e565b611a01576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119f890612ff8565b60405180910390fd5b60001515600d60019054906101000a900460ff1615151415611aaf57600e8054611a2a906132f7565b80601f0160208091040260200160405190810160405280929190818152602001828054611a56906132f7565b8015611aa35780601f10611a7857610100808354040283529160200191611aa3565b820191906000526020600020905b815481529060010190602001808311611a8657829003601f168201915b50505050509050611b0b565b6000611ab9612156565b90506000815111611ad95760405180602001604052806000815250611b07565b80611ae3846121e8565b600a604051602001611af793929190612e4e565b6040516020818303038152906040525b9150505b919050565b600c5481565b611b1e611c90565b80600a9080519060200190611b3492919061268e565b5050565b600f5481565b60156020528060005260406000206000915090505481565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611bf2611c90565b80600e9080519060200190611c0892919061268e565b5050565b611c14611c90565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611c84576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c7b90612f58565b60405180910390fd5b611c8d81611f12565b50565b611c986122c0565b73ffffffffffffffffffffffffffffffffffffffff16611cb66111f0565b73ffffffffffffffffffffffffffffffffffffffff1614611d0c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d0390612fd8565b60405180910390fd5b565b600081611d19611d75565b11158015611d28575060005482105b8015611d66575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600033905090565b600090565b60008082905080611d89611d75565b11611e1157600054811015611e105760006004600083815260200190815260200160002054905060007c010000000000000000000000000000000000000000000000000000000082161415611e0e575b6000811415611e04576004600083600190039350838152602001908152602001600020549050611dd9565b8092505050611e43565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060006006600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e8611ed08686846122c8565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b611ff28282604051806020016040528060008152506122d1565b5050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261201c611d6d565b8786866040518563ffffffff1660e01b815260040161203e9493929190612eaf565b602060405180830381600087803b15801561205857600080fd5b505af192505050801561208957506040513d601f19601f820116820180604052508101906120869190612a97565b60015b612103573d80600081146120b9576040519150601f19603f3d011682016040523d82523d6000602084013e6120be565b606091505b506000815114156120fb576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b606060098054612165906132f7565b80601f0160208091040260200160405190810160405280929190818152602001828054612191906132f7565b80156121de5780601f106121b3576101008083540402835291602001916121de565b820191906000526020600020905b8154815290600101906020018083116121c157829003601f168201915b5050505050905090565b6060600060016121f78461236e565b01905060008167ffffffffffffffff811115612216576122156133e7565b5b6040519080825280601f01601f1916602001820160405280156122485781602001600182028036833780820191505090505b509050600082602001820190505b6001156122b5578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a858161229f5761229e613389565b5b04945060008514156122b0576122b5565b612256565b819350505050919050565b600033905090565b60009392505050565b6122db83836124c1565b60008373ffffffffffffffffffffffffffffffffffffffff163b1461236957600080549050600083820390505b61231b6000868380600101945086611ff6565b612351576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81811061230857816000541461236657600080fd5b50505b505050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000083106123cc577a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000083816123c2576123c1613389565b5b0492506040810190505b6d04ee2d6d415b85acef81000000008310612409576d04ee2d6d415b85acef810000000083816123ff576123fe613389565b5b0492506020810190505b662386f26fc10000831061243857662386f26fc10000838161242e5761242d613389565b5b0492506010810190505b6305f5e1008310612461576305f5e100838161245757612456613389565b5b0492506008810190505b612710831061248657612710838161247c5761247b613389565b5b0492506004810190505b606483106124a9576064838161249f5761249e613389565b5b0492506002810190505b600a83106124b8576001810190505b80915050919050565b6000805490506000821415612502576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61250f6000848385611eb3565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550612586836125776000866000611eb9565b6125808561267e565b17611ee1565b6004600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b81811461262757808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a46001810190506125ec565b506000821415612663576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060008190555050506126796000848385611f0c565b505050565b60006001821460e11b9050919050565b82805461269a906132f7565b90600052602060002090601f0160209004810192826126bc5760008555612703565b82601f106126d557805160ff1916838001178555612703565b82800160010185558215612703579182015b828111156127025782518255916020019190600101906126e7565b5b5090506127109190612714565b5090565b5b8082111561272d576000816000905550600101612715565b5090565b600061274461273f84613098565b613073565b9050828152602081018484840111156127605761275f61341b565b5b61276b8482856132b5565b509392505050565b6000612786612781846130c9565b613073565b9050828152602081018484840111156127a2576127a161341b565b5b6127ad8482856132b5565b509392505050565b6000813590506127c4816135fb565b92915050565b6000813590506127d981613612565b92915050565b6000813590506127ee81613629565b92915050565b60008151905061280381613629565b92915050565b600082601f83011261281e5761281d613416565b5b813561282e848260208601612731565b91505092915050565b600082601f83011261284c5761284b613416565b5b813561285c848260208601612773565b91505092915050565b60008135905061287481613640565b92915050565b6000602082840312156128905761288f613425565b5b600061289e848285016127b5565b91505092915050565b600080604083850312156128be576128bd613425565b5b60006128cc858286016127b5565b92505060206128dd858286016127b5565b9150509250929050565b600080600060608486031215612900576128ff613425565b5b600061290e868287016127b5565b935050602061291f868287016127b5565b925050604061293086828701612865565b9150509250925092565b6000806000806080858703121561295457612953613425565b5b6000612962878288016127b5565b9450506020612973878288016127b5565b935050604061298487828801612865565b925050606085013567ffffffffffffffff8111156129a5576129a4613420565b5b6129b187828801612809565b91505092959194509250565b600080604083850312156129d4576129d3613425565b5b60006129e2858286016127b5565b92505060206129f3858286016127ca565b9150509250929050565b60008060408385031215612a1457612a13613425565b5b6000612a22858286016127b5565b9250506020612a3385828601612865565b9150509250929050565b600060208284031215612a5357612a52613425565b5b6000612a61848285016127ca565b91505092915050565b600060208284031215612a8057612a7f613425565b5b6000612a8e848285016127df565b91505092915050565b600060208284031215612aad57612aac613425565b5b6000612abb848285016127f4565b91505092915050565b600060208284031215612ada57612ad9613425565b5b600082013567ffffffffffffffff811115612af857612af7613420565b5b612b0484828501612837565b91505092915050565b600060208284031215612b2357612b22613425565b5b6000612b3184828501612865565b91505092915050565b60008060008060808587031215612b5457612b53613425565b5b6000612b6287828801612865565b9450506020612b7387828801612865565b9350506040612b8487828801612865565b9250506060612b9587828801612865565b91505092959194509250565b612baa81613241565b82525050565b612bb981613253565b82525050565b6000612bca8261310f565b612bd48185613125565b9350612be48185602086016132c4565b612bed8161342a565b840191505092915050565b6000612c038261311a565b612c0d8185613141565b9350612c1d8185602086016132c4565b612c268161342a565b840191505092915050565b6000612c3c8261311a565b612c468185613152565b9350612c568185602086016132c4565b80840191505092915050565b60008154612c6f816132f7565b612c798186613152565b94506001821660008114612c945760018114612ca557612cd8565b60ff19831686528186019350612cd8565b612cae856130fa565b60005b83811015612cd057815481890152600182019150602081019050612cb1565b838801955050505b50505092915050565b6000612cee600783613141565b9150612cf98261343b565b602082019050919050565b6000612d11602683613141565b9150612d1c82613464565b604082019050919050565b6000612d34600c83613141565b9150612d3f826134b3565b602082019050919050565b6000612d57601783613141565b9150612d62826134dc565b602082019050919050565b6000612d7a602083613141565b9150612d8582613505565b602082019050919050565b6000612d9d602083613141565b9150612da88261352e565b602082019050919050565b6000612dc0602f83613141565b9150612dcb82613557565b604082019050919050565b6000612de3600083613136565b9150612dee826135a6565b600082019050919050565b6000612e06601283613141565b9150612e11826135a9565b602082019050919050565b6000612e29600f83613141565b9150612e34826135d2565b602082019050919050565b612e48816132ab565b82525050565b6000612e5a8286612c31565b9150612e668285612c31565b9150612e728284612c62565b9150819050949350505050565b6000612e8a82612dd6565b9150819050919050565b6000602082019050612ea96000830184612ba1565b92915050565b6000608082019050612ec46000830187612ba1565b612ed16020830186612ba1565b612ede6040830185612e3f565b8181036060830152612ef08184612bbf565b905095945050505050565b6000602082019050612f106000830184612bb0565b92915050565b60006020820190508181036000830152612f308184612bf8565b905092915050565b60006020820190508181036000830152612f5181612ce1565b9050919050565b60006020820190508181036000830152612f7181612d04565b9050919050565b60006020820190508181036000830152612f9181612d27565b9050919050565b60006020820190508181036000830152612fb181612d4a565b9050919050565b60006020820190508181036000830152612fd181612d6d565b9050919050565b60006020820190508181036000830152612ff181612d90565b9050919050565b6000602082019050818103600083015261301181612db3565b9050919050565b6000602082019050818103600083015261303181612df9565b9050919050565b6000602082019050818103600083015261305181612e1c565b9050919050565b600060208201905061306d6000830184612e3f565b92915050565b600061307d61308e565b90506130898282613329565b919050565b6000604051905090565b600067ffffffffffffffff8211156130b3576130b26133e7565b5b6130bc8261342a565b9050602081019050919050565b600067ffffffffffffffff8211156130e4576130e36133e7565b5b6130ed8261342a565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000613168826132ab565b9150613173836132ab565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156131a8576131a761335a565b5b828201905092915050565b60006131be826132ab565b91506131c9836132ab565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156132025761320161335a565b5b828202905092915050565b6000613218826132ab565b9150613223836132ab565b9250828210156132365761323561335a565b5b828203905092915050565b600061324c8261328b565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156132e25780820151818401526020810190506132c7565b838111156132f1576000848401525b50505050565b6000600282049050600182168061330f57607f821691505b60208210811415613323576133226133b8565b5b50919050565b6133328261342a565b810181811067ffffffffffffffff82111715613351576133506133e7565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e6f206d6f726500000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f7363616c65207061757365640000000000000000000000000000000000000000600082015250565b7f6d696e7420416d6f756e74206c657373207468616e2031000000000000000000600082015250565b7f506c656173652073656e64207468652065786163742045544820616d6f756e74600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b50565b7f6e6f74207468652072696768742074696d650000000000000000000000000000600082015250565b7f706c61796572206d6178206d696e740000000000000000000000000000000000600082015250565b61360481613241565b811461360f57600080fd5b50565b61361b81613253565b811461362657600080fd5b50565b6136328161325f565b811461363d57600080fd5b50565b613649816132ab565b811461365457600080fd5b5056fea2646970667358221220b93a4430f62bbedfe766134b48a8e80964b98d08d68c4726f95f89c2fd4d046564736f6c63430008070033000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000160000000000000000000000000000000000000000000000000000000000000000c4176617461722059303074730000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000241590000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d61797739706b6252396f776b435534594670514b333872783876347a6356564843776b654466755a73436d7a2f0000000000000000000000000000000000000000000000000000000000000000000000000000000000013100000000000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x6080604052600436106102465760003560e01c80638da5cb5b11610139578063b88d4fde116100b6578063da3ef23f1161007a578063da3ef23f146107e9578063e3e3c66514610812578063e80509241461083d578063e985e9c51461087a578063f2c4ce1e146108b7578063f2fde38b146108e057610246565b8063b88d4fde1461070f578063c66828621461072b578063c7c39ffc14610756578063c87b56dd14610781578063d5abeb01146107be57610246565b8063a0712d68116100fd578063a0712d681461066c578063a22cb46514610688578063a475b5dd146106b1578063a7027357146106c8578063b3f50e72146106f357610246565b80638da5cb5b1461059757806395d89b41146105c257806397084843146105ed5780639ef2d87a14610616578063a035b1fe1461064157610246565b80633e0a322d116101c75780635c975abb1161018b5780635c975abb1461049e5780636246d7fb146104c95780636352211e1461050657806370a0823114610543578063715018a61461058057610246565b80633e0a322d146103dc5780633e8f7e9f1461040557806342842e0e1461042e578063518302271461044a57806355f804b31461047557610246565b8063095ea7b31161020e578063095ea7b31461034457806318160ddd1461036057806323b872dd1461038b578063333e44e6146103a75780633ccfd60b146103d257610246565b806301ffc9a71461024b57806302329a291461028857806306fdde03146102b1578063081812fc146102dc578063081c8c4414610319575b600080fd5b34801561025757600080fd5b50610272600480360381019061026d9190612a6a565b610909565b60405161027f9190612efb565b60405180910390f35b34801561029457600080fd5b506102af60048036038101906102aa9190612a3d565b61099b565b005b3480156102bd57600080fd5b506102c66109c0565b6040516102d39190612f16565b60405180910390f35b3480156102e857600080fd5b5061030360048036038101906102fe9190612b0d565b610a52565b6040516103109190612e94565b60405180910390f35b34801561032557600080fd5b5061032e610ad1565b60405161033b9190612f16565b60405180910390f35b61035e600480360381019061035991906129fd565b610b5f565b005b34801561036c57600080fd5b50610375610ca3565b6040516103829190613058565b60405180910390f35b6103a560048036038101906103a091906128e7565b610cba565b005b3480156103b357600080fd5b506103bc610fdf565b6040516103c99190613058565b60405180910390f35b6103da610fe5565b005b3480156103e857600080fd5b5061040360048036038101906103fe9190612b0d565b61106d565b005b34801561041157600080fd5b5061042c60048036038101906104279190612b0d565b61107f565b005b610448600480360381019061044391906128e7565b611091565b005b34801561045657600080fd5b5061045f6110b1565b60405161046c9190612efb565b60405180910390f35b34801561048157600080fd5b5061049c60048036038101906104979190612ac4565b6110c4565b005b3480156104aa57600080fd5b506104b36110e6565b6040516104c09190612efb565b60405180910390f35b3480156104d557600080fd5b506104f060048036038101906104eb919061287a565b6110f9565b6040516104fd9190613058565b60405180910390f35b34801561051257600080fd5b5061052d60048036038101906105289190612b0d565b611111565b60405161053a9190612e94565b60405180910390f35b34801561054f57600080fd5b5061056a6004803603810190610565919061287a565b611123565b6040516105779190613058565b60405180910390f35b34801561058c57600080fd5b506105956111dc565b005b3480156105a357600080fd5b506105ac6111f0565b6040516105b99190612e94565b60405180910390f35b3480156105ce57600080fd5b506105d761121a565b6040516105e49190612f16565b60405180910390f35b3480156105f957600080fd5b50610614600480360381019061060f9190612b3a565b6112ac565b005b34801561062257600080fd5b5061062b6112d6565b6040516106389190613058565b60405180910390f35b34801561064d57600080fd5b506106566112dc565b6040516106639190613058565b60405180910390f35b61068660048036038101906106819190612b0d565b6112e2565b005b34801561069457600080fd5b506106af60048036038101906106aa91906129bd565b61172c565b005b3480156106bd57600080fd5b506106c6611837565b005b3480156106d457600080fd5b506106dd61185c565b6040516106ea9190613058565b60405180910390f35b61070d600480360381019061070891906129fd565b611866565b005b6107296004803603810190610724919061293a565b6118b0565b005b34801561073757600080fd5b50610740611923565b60405161074d9190612f16565b60405180910390f35b34801561076257600080fd5b5061076b6119b1565b6040516107789190613058565b60405180910390f35b34801561078d57600080fd5b506107a860048036038101906107a39190612b0d565b6119b7565b6040516107b59190612f16565b60405180910390f35b3480156107ca57600080fd5b506107d3611b10565b6040516107e09190613058565b60405180910390f35b3480156107f557600080fd5b50610810600480360381019061080b9190612ac4565b611b16565b005b34801561081e57600080fd5b50610827611b38565b6040516108349190613058565b60405180910390f35b34801561084957600080fd5b50610864600480360381019061085f919061287a565b611b3e565b6040516108719190613058565b60405180910390f35b34801561088657600080fd5b506108a1600480360381019061089c91906128a7565b611b56565b6040516108ae9190612efb565b60405180910390f35b3480156108c357600080fd5b506108de60048036038101906108d99190612ac4565b611bea565b005b3480156108ec57600080fd5b506109076004803603810190610902919061287a565b611c0c565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061096457506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806109945750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b6109a3611c90565b80600d60006101000a81548160ff02191690831515021790555050565b6060600280546109cf906132f7565b80601f01602080910402602001604051908101604052809291908181526020018280546109fb906132f7565b8015610a485780601f10610a1d57610100808354040283529160200191610a48565b820191906000526020600020905b815481529060010190602001808311610a2b57829003601f168201915b5050505050905090565b6000610a5d82611d0e565b610a93576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600e8054610ade906132f7565b80601f0160208091040260200160405190810160405280929190818152602001828054610b0a906132f7565b8015610b575780601f10610b2c57610100808354040283529160200191610b57565b820191906000526020600020905b815481529060010190602001808311610b3a57829003601f168201915b505050505081565b6000610b6a82611111565b90508073ffffffffffffffffffffffffffffffffffffffff16610b8b611d6d565b73ffffffffffffffffffffffffffffffffffffffff1614610bee57610bb781610bb2611d6d565b611b56565b610bed576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000610cad611d75565b6001546000540303905090565b6000610cc582611d7a565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610d2c576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080610d3884611e48565b91509150610d4e8187610d49611d6d565b611e6f565b610d9a57610d6386610d5e611d6d565b611b56565b610d99576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415610e01576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610e0e8686866001611eb3565b8015610e1957600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815460010191905081905550610ee785610ec3888887611eb9565b7c020000000000000000000000000000000000000000000000000000000017611ee1565b600460008681526020019081526020016000208190555060007c020000000000000000000000000000000000000000000000000000000084161415610f6f576000600185019050600060046000838152602001908152602001600020541415610f6d576000548114610f6c578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4610fd78686866001611f0c565b505050505050565b600b5481565b610fed611c90565b6000610ff76111f0565b73ffffffffffffffffffffffffffffffffffffffff164760405161101a90612e7f565b60006040518083038185875af1925050503d8060008114611057576040519150601f19603f3d011682016040523d82523d6000602084013e61105c565b606091505b505090508061106a57600080fd5b50565b611075611c90565b8060138190555050565b611087611c90565b80600f8190555050565b6110ac838383604051806020016040528060008152506118b0565b505050565b600d60019054906101000a900460ff1681565b6110cc611c90565b80600990805190602001906110e292919061268e565b5050565b600d60009054906101000a900460ff1681565b60146020528060005260406000206000915090505481565b600061111c82611d7a565b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561118b576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b6111e4611c90565b6111ee6000611f12565b565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060038054611229906132f7565b80601f0160208091040260200160405190810160405280929190818152602001828054611255906132f7565b80156112a25780601f10611277576101008083540402835291602001916112a2565b820191906000526020600020905b81548152906001019060200180831161128557829003601f168201915b5050505050905090565b6112b4611c90565b83601081905550826011819055508160128190555080600b8190555050505050565b60115481565b60125481565b6000601254905060006112f3610ca3565b90506000601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060135442101561137e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161137590613018565b60405180910390fd5b600084116113c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113b890612f98565b60405180910390fd5b600f54600c546113d1919061320d565b84836113dd919061315d565b111561141e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161141590612f38565b60405180910390fd5b601154601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548561146c919061315d565b11156114ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114a490613038565b60405180910390fd5b600d60009054906101000a900460ff16156114fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114f490612f78565b60405180910390fd5b6010548110156116775780601054611515919061320d565b84106115d757828160105461152a919061320d565b61153491906131b3565b838561154091906131b3565b61154a919061320d565b34101561158c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161158390612fb8565b60405180910390fd5b601054601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611672565b600034101561161b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161161290612fb8565b60405180910390fd5b83601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461166a919061315d565b925050819055505b6116c6565b828461168391906131b3565b3410156116c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116bc90612fb8565b60405180910390fd5b5b83601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611715919061315d565b925050819055506117263385611fd8565b50505050565b8060076000611739611d6d565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166117e6611d6d565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161182b9190612efb565b60405180910390a35050565b61183f611c90565b6001600d60016101000a81548160ff021916908315150217905550565b6000601054905090565b61186e611c90565b6000611878610ca3565b90506000821161188757600080fd5b600c548282611896919061315d565b11156118a157600080fd5b6118ab8383611fd8565b505050565b6118bb848484610cba565b60008373ffffffffffffffffffffffffffffffffffffffff163b1461191d576118e684848484611ff6565b61191c576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b600a8054611930906132f7565b80601f016020809104026020016040519081016040528092919081815260200182805461195c906132f7565b80156119a95780601f1061197e576101008083540402835291602001916119a9565b820191906000526020600020905b81548152906001019060200180831161198c57829003601f168201915b505050505081565b60105481565b60606119c282611d0e565b611a01576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119f890612ff8565b60405180910390fd5b60001515600d60019054906101000a900460ff1615151415611aaf57600e8054611a2a906132f7565b80601f0160208091040260200160405190810160405280929190818152602001828054611a56906132f7565b8015611aa35780601f10611a7857610100808354040283529160200191611aa3565b820191906000526020600020905b815481529060010190602001808311611a8657829003601f168201915b50505050509050611b0b565b6000611ab9612156565b90506000815111611ad95760405180602001604052806000815250611b07565b80611ae3846121e8565b600a604051602001611af793929190612e4e565b6040516020818303038152906040525b9150505b919050565b600c5481565b611b1e611c90565b80600a9080519060200190611b3492919061268e565b5050565b600f5481565b60156020528060005260406000206000915090505481565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611bf2611c90565b80600e9080519060200190611c0892919061268e565b5050565b611c14611c90565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611c84576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c7b90612f58565b60405180910390fd5b611c8d81611f12565b50565b611c986122c0565b73ffffffffffffffffffffffffffffffffffffffff16611cb66111f0565b73ffffffffffffffffffffffffffffffffffffffff1614611d0c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d0390612fd8565b60405180910390fd5b565b600081611d19611d75565b11158015611d28575060005482105b8015611d66575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600033905090565b600090565b60008082905080611d89611d75565b11611e1157600054811015611e105760006004600083815260200190815260200160002054905060007c010000000000000000000000000000000000000000000000000000000082161415611e0e575b6000811415611e04576004600083600190039350838152602001908152602001600020549050611dd9565b8092505050611e43565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060006006600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e8611ed08686846122c8565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b611ff28282604051806020016040528060008152506122d1565b5050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261201c611d6d565b8786866040518563ffffffff1660e01b815260040161203e9493929190612eaf565b602060405180830381600087803b15801561205857600080fd5b505af192505050801561208957506040513d601f19601f820116820180604052508101906120869190612a97565b60015b612103573d80600081146120b9576040519150601f19603f3d011682016040523d82523d6000602084013e6120be565b606091505b506000815114156120fb576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b606060098054612165906132f7565b80601f0160208091040260200160405190810160405280929190818152602001828054612191906132f7565b80156121de5780601f106121b3576101008083540402835291602001916121de565b820191906000526020600020905b8154815290600101906020018083116121c157829003601f168201915b5050505050905090565b6060600060016121f78461236e565b01905060008167ffffffffffffffff811115612216576122156133e7565b5b6040519080825280601f01601f1916602001820160405280156122485781602001600182028036833780820191505090505b509050600082602001820190505b6001156122b5578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a858161229f5761229e613389565b5b04945060008514156122b0576122b5565b612256565b819350505050919050565b600033905090565b60009392505050565b6122db83836124c1565b60008373ffffffffffffffffffffffffffffffffffffffff163b1461236957600080549050600083820390505b61231b6000868380600101945086611ff6565b612351576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81811061230857816000541461236657600080fd5b50505b505050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000083106123cc577a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000083816123c2576123c1613389565b5b0492506040810190505b6d04ee2d6d415b85acef81000000008310612409576d04ee2d6d415b85acef810000000083816123ff576123fe613389565b5b0492506020810190505b662386f26fc10000831061243857662386f26fc10000838161242e5761242d613389565b5b0492506010810190505b6305f5e1008310612461576305f5e100838161245757612456613389565b5b0492506008810190505b612710831061248657612710838161247c5761247b613389565b5b0492506004810190505b606483106124a9576064838161249f5761249e613389565b5b0492506002810190505b600a83106124b8576001810190505b80915050919050565b6000805490506000821415612502576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61250f6000848385611eb3565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550612586836125776000866000611eb9565b6125808561267e565b17611ee1565b6004600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b81811461262757808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a46001810190506125ec565b506000821415612663576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060008190555050506126796000848385611f0c565b505050565b60006001821460e11b9050919050565b82805461269a906132f7565b90600052602060002090601f0160209004810192826126bc5760008555612703565b82601f106126d557805160ff1916838001178555612703565b82800160010185558215612703579182015b828111156127025782518255916020019190600101906126e7565b5b5090506127109190612714565b5090565b5b8082111561272d576000816000905550600101612715565b5090565b600061274461273f84613098565b613073565b9050828152602081018484840111156127605761275f61341b565b5b61276b8482856132b5565b509392505050565b6000612786612781846130c9565b613073565b9050828152602081018484840111156127a2576127a161341b565b5b6127ad8482856132b5565b509392505050565b6000813590506127c4816135fb565b92915050565b6000813590506127d981613612565b92915050565b6000813590506127ee81613629565b92915050565b60008151905061280381613629565b92915050565b600082601f83011261281e5761281d613416565b5b813561282e848260208601612731565b91505092915050565b600082601f83011261284c5761284b613416565b5b813561285c848260208601612773565b91505092915050565b60008135905061287481613640565b92915050565b6000602082840312156128905761288f613425565b5b600061289e848285016127b5565b91505092915050565b600080604083850312156128be576128bd613425565b5b60006128cc858286016127b5565b92505060206128dd858286016127b5565b9150509250929050565b600080600060608486031215612900576128ff613425565b5b600061290e868287016127b5565b935050602061291f868287016127b5565b925050604061293086828701612865565b9150509250925092565b6000806000806080858703121561295457612953613425565b5b6000612962878288016127b5565b9450506020612973878288016127b5565b935050604061298487828801612865565b925050606085013567ffffffffffffffff8111156129a5576129a4613420565b5b6129b187828801612809565b91505092959194509250565b600080604083850312156129d4576129d3613425565b5b60006129e2858286016127b5565b92505060206129f3858286016127ca565b9150509250929050565b60008060408385031215612a1457612a13613425565b5b6000612a22858286016127b5565b9250506020612a3385828601612865565b9150509250929050565b600060208284031215612a5357612a52613425565b5b6000612a61848285016127ca565b91505092915050565b600060208284031215612a8057612a7f613425565b5b6000612a8e848285016127df565b91505092915050565b600060208284031215612aad57612aac613425565b5b6000612abb848285016127f4565b91505092915050565b600060208284031215612ada57612ad9613425565b5b600082013567ffffffffffffffff811115612af857612af7613420565b5b612b0484828501612837565b91505092915050565b600060208284031215612b2357612b22613425565b5b6000612b3184828501612865565b91505092915050565b60008060008060808587031215612b5457612b53613425565b5b6000612b6287828801612865565b9450506020612b7387828801612865565b9350506040612b8487828801612865565b9250506060612b9587828801612865565b91505092959194509250565b612baa81613241565b82525050565b612bb981613253565b82525050565b6000612bca8261310f565b612bd48185613125565b9350612be48185602086016132c4565b612bed8161342a565b840191505092915050565b6000612c038261311a565b612c0d8185613141565b9350612c1d8185602086016132c4565b612c268161342a565b840191505092915050565b6000612c3c8261311a565b612c468185613152565b9350612c568185602086016132c4565b80840191505092915050565b60008154612c6f816132f7565b612c798186613152565b94506001821660008114612c945760018114612ca557612cd8565b60ff19831686528186019350612cd8565b612cae856130fa565b60005b83811015612cd057815481890152600182019150602081019050612cb1565b838801955050505b50505092915050565b6000612cee600783613141565b9150612cf98261343b565b602082019050919050565b6000612d11602683613141565b9150612d1c82613464565b604082019050919050565b6000612d34600c83613141565b9150612d3f826134b3565b602082019050919050565b6000612d57601783613141565b9150612d62826134dc565b602082019050919050565b6000612d7a602083613141565b9150612d8582613505565b602082019050919050565b6000612d9d602083613141565b9150612da88261352e565b602082019050919050565b6000612dc0602f83613141565b9150612dcb82613557565b604082019050919050565b6000612de3600083613136565b9150612dee826135a6565b600082019050919050565b6000612e06601283613141565b9150612e11826135a9565b602082019050919050565b6000612e29600f83613141565b9150612e34826135d2565b602082019050919050565b612e48816132ab565b82525050565b6000612e5a8286612c31565b9150612e668285612c31565b9150612e728284612c62565b9150819050949350505050565b6000612e8a82612dd6565b9150819050919050565b6000602082019050612ea96000830184612ba1565b92915050565b6000608082019050612ec46000830187612ba1565b612ed16020830186612ba1565b612ede6040830185612e3f565b8181036060830152612ef08184612bbf565b905095945050505050565b6000602082019050612f106000830184612bb0565b92915050565b60006020820190508181036000830152612f308184612bf8565b905092915050565b60006020820190508181036000830152612f5181612ce1565b9050919050565b60006020820190508181036000830152612f7181612d04565b9050919050565b60006020820190508181036000830152612f9181612d27565b9050919050565b60006020820190508181036000830152612fb181612d4a565b9050919050565b60006020820190508181036000830152612fd181612d6d565b9050919050565b60006020820190508181036000830152612ff181612d90565b9050919050565b6000602082019050818103600083015261301181612db3565b9050919050565b6000602082019050818103600083015261303181612df9565b9050919050565b6000602082019050818103600083015261305181612e1c565b9050919050565b600060208201905061306d6000830184612e3f565b92915050565b600061307d61308e565b90506130898282613329565b919050565b6000604051905090565b600067ffffffffffffffff8211156130b3576130b26133e7565b5b6130bc8261342a565b9050602081019050919050565b600067ffffffffffffffff8211156130e4576130e36133e7565b5b6130ed8261342a565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000613168826132ab565b9150613173836132ab565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156131a8576131a761335a565b5b828201905092915050565b60006131be826132ab565b91506131c9836132ab565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156132025761320161335a565b5b828202905092915050565b6000613218826132ab565b9150613223836132ab565b9250828210156132365761323561335a565b5b828203905092915050565b600061324c8261328b565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156132e25780820151818401526020810190506132c7565b838111156132f1576000848401525b50505050565b6000600282049050600182168061330f57607f821691505b60208210811415613323576133226133b8565b5b50919050565b6133328261342a565b810181811067ffffffffffffffff82111715613351576133506133e7565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e6f206d6f726500000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f7363616c65207061757365640000000000000000000000000000000000000000600082015250565b7f6d696e7420416d6f756e74206c657373207468616e2031000000000000000000600082015250565b7f506c656173652073656e64207468652065786163742045544820616d6f756e74600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b50565b7f6e6f74207468652072696768742074696d650000000000000000000000000000600082015250565b7f706c61796572206d6178206d696e740000000000000000000000000000000000600082015250565b61360481613241565b811461360f57600080fd5b50565b61361b81613253565b811461362657600080fd5b50565b6136328161325f565b811461363d57600080fd5b50565b613649816132ab565b811461365457600080fd5b5056fea2646970667358221220b93a4430f62bbedfe766134b48a8e80964b98d08d68c4726f95f89c2fd4d046564736f6c63430008070033

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

000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000160000000000000000000000000000000000000000000000000000000000000000c4176617461722059303074730000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000241590000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d61797739706b6252396f776b435534594670514b333872783876347a6356564843776b654466755a73436d7a2f0000000000000000000000000000000000000000000000000000000000000000000000000000000000013100000000000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _name (string): Avatar Y00ts
Arg [1] : _symbol (string): AY
Arg [2] : _initBaseURI (string): ipfs://Qmayw9pkbR9owkCU4YFpQK38rx8v4zcVVHCwkeDfuZsCmz/
Arg [3] : _initNotRevealedUri (string): 1

-----Encoded View---------------
13 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000c0
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000100
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000160
Arg [4] : 000000000000000000000000000000000000000000000000000000000000000c
Arg [5] : 4176617461722059303074730000000000000000000000000000000000000000
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [7] : 4159000000000000000000000000000000000000000000000000000000000000
Arg [8] : 0000000000000000000000000000000000000000000000000000000000000036
Arg [9] : 697066733a2f2f516d61797739706b6252396f776b435534594670514b333872
Arg [10] : 783876347a6356564843776b654466755a73436d7a2f00000000000000000000
Arg [11] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [12] : 3100000000000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

70393:5694:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37286:639;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;75448:73;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38188:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44679:218;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70671:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44112:408;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33939:323;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48318:2825;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;70533:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;75528:556;;;:::i;:::-;;71291:80;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;74905:81;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51239:193;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;70638:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;75216:98;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;70607:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70927:46;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39581:152;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35123:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18065:103;;;;;;;;;;;;;:::i;:::-;;17417:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38364:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71379:241;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;70775:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70807:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71764:1890;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45237:234;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;74832:65;;;;;;;;;;;;;:::i;:::-;;74994:90;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73666:245;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52030:407;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;70491:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70741:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;74313:497;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70568:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;75320:122;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;70708:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70978:48;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45628:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;75090:120;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;18323:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37286:639;37371:4;37710:10;37695:25;;:11;:25;;;;:102;;;;37787:10;37772:25;;:11;:25;;;;37695:102;:179;;;;37864:10;37849:25;;:11;:25;;;;37695:179;37675:199;;37286:639;;;:::o;75448:73::-;17303:13;:11;:13::i;:::-;75509:6:::1;75500;;:15;;;;;;;;;;;;;;;;;;75448:73:::0;:::o;38188:100::-;38242:13;38275:5;38268:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38188:100;:::o;44679:218::-;44755:7;44780:16;44788:7;44780;:16::i;:::-;44775:64;;44805:34;;;;;;;;;;;;;;44775:64;44859:15;:24;44875:7;44859:24;;;;;;;;;;;:30;;;;;;;;;;;;44852:37;;44679:218;;;:::o;70671:28::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;44112:408::-;44201:13;44217:16;44225:7;44217;:16::i;:::-;44201:32;;44273:5;44250:28;;:19;:17;:19::i;:::-;:28;;;44246:175;;44298:44;44315:5;44322:19;:17;:19::i;:::-;44298:16;:44::i;:::-;44293:128;;44370:35;;;;;;;;;;;;;;44293:128;44246:175;44466:2;44433:15;:24;44449:7;44433:24;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;44504:7;44500:2;44484:28;;44493:5;44484:28;;;;;;;;;;;;44190:330;44112:408;;:::o;33939:323::-;34000:7;34228:15;:13;:15::i;:::-;34213:12;;34197:13;;:28;:46;34190:53;;33939:323;:::o;48318:2825::-;48460:27;48490;48509:7;48490:18;:27::i;:::-;48460:57;;48575:4;48534:45;;48550:19;48534:45;;;48530:86;;48588:28;;;;;;;;;;;;;;48530:86;48630:27;48659:23;48686:35;48713:7;48686:26;:35::i;:::-;48629:92;;;;48821:68;48846:15;48863:4;48869:19;:17;:19::i;:::-;48821:24;:68::i;:::-;48816:180;;48909:43;48926:4;48932:19;:17;:19::i;:::-;48909:16;:43::i;:::-;48904:92;;48961:35;;;;;;;;;;;;;;48904:92;48816:180;49027:1;49013:16;;:2;:16;;;49009:52;;;49038:23;;;;;;;;;;;;;;49009:52;49074:43;49096:4;49102:2;49106:7;49115:1;49074:21;:43::i;:::-;49210:15;49207:160;;;49350:1;49329:19;49322:30;49207:160;49747:18;:24;49766:4;49747:24;;;;;;;;;;;;;;;;49745:26;;;;;;;;;;;;49816:18;:22;49835:2;49816:22;;;;;;;;;;;;;;;;49814:24;;;;;;;;;;;50138:146;50175:2;50224:45;50239:4;50245:2;50249:19;50224:14;:45::i;:::-;30338:8;50196:73;50138:18;:146::i;:::-;50109:17;:26;50127:7;50109:26;;;;;;;;;;;:175;;;;50455:1;30338:8;50404:19;:47;:52;50400:627;;;50477:19;50509:1;50499:7;:11;50477:33;;50666:1;50632:17;:30;50650:11;50632:30;;;;;;;;;;;;:35;50628:384;;;50770:13;;50755:11;:28;50751:242;;50950:19;50917:17;:30;50935:11;50917:30;;;;;;;;;;;:52;;;;50751:242;50628:384;50458:569;50400:627;51074:7;51070:2;51055:27;;51064:4;51055:27;;;;;;;;;;;;51093:42;51114:4;51120:2;51124:7;51133:1;51093:20;:42::i;:::-;48449:2694;;;48318:2825;;;:::o;70533:30::-;;;;:::o;75528:556::-;17303:13;:11;:13::i;:::-;75906:7:::1;75927;:5;:7::i;:::-;75919:21;;75948;75919:55;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;75905:69;;;75989:2;75981:11;;;::::0;::::1;;75573:511;75528:556::o:0;71291:80::-;17303:13;:11;:13::i;:::-;71361:4:::1;71348:10;:17;;;;71291:80:::0;:::o;74905:81::-;17303:13;:11;:13::i;:::-;74975:5:::1;74963:9;:17;;;;74905:81:::0;:::o;51239:193::-;51385:39;51402:4;51408:2;51412:7;51385:39;;;;;;;;;;;;:16;:39::i;:::-;51239:193;;;:::o;70638:28::-;;;;;;;;;;;;;:::o;75216:98::-;17303:13;:11;:13::i;:::-;75297:11:::1;75287:7;:21;;;;;;;;;;;;:::i;:::-;;75216:98:::0;:::o;70607:26::-;;;;;;;;;;;;;:::o;70927:46::-;;;;;;;;;;;;;;;;;:::o;39581:152::-;39653:7;39696:27;39715:7;39696:18;:27::i;:::-;39673:52;;39581:152;;;:::o;35123:233::-;35195:7;35236:1;35219:19;;:5;:19;;;35215:60;;;35247:28;;;;;;;;;;;;;;35215:60;29282:13;35293:18;:25;35312:5;35293:25;;;;;;;;;;;;;;;;:55;35286:62;;35123:233;;;:::o;18065:103::-;17303:13;:11;:13::i;:::-;18130:30:::1;18157:1;18130:18;:30::i;:::-;18065:103::o:0;17417:87::-;17463:7;17490:6;;;;;;;;;;;17483:13;;17417:87;:::o;38364:104::-;38420:13;38453:7;38446:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38364:104;:::o;71379:241::-;17303:13;:11;:13::i;:::-;71523:11:::1;71510:10;:24;;;;71552:9;71541:8;:20;;;;71576:6;71568:5;:14;;;;71601:13;71589:9;:25;;;;71379:241:::0;;;;:::o;70775:27::-;;;;:::o;70807:34::-;;;;:::o;71764:1890::-;71817:12;71832:5;;71817:20;;71850:14;71867:13;:11;:13::i;:::-;71850:30;;71887:27;71917:13;:25;71931:10;71917:25;;;;;;;;;;;;;;;;71887:55;;71978:10;;71959:15;:29;;71951:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;72033:1;72025:5;:9;72017:44;;;;;;;;;;;;:::i;:::-;;;;;;;;;72107:9;;72095;;:21;;;;:::i;:::-;72085:5;72076:6;:14;;;;:::i;:::-;:41;;72068:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;72178:8;;72151:11;:23;72163:10;72151:23;;;;;;;;;;;;;;;;72143:5;:31;;;;:::i;:::-;:43;;72135:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;72221:6;;;;;;;;;;;72220:7;72212:31;;;;;;;;;;;;:::i;:::-;;;;;;;;;72978:10;;72956:19;:32;72951:618;;;73033:19;73020:10;;:32;;;;:::i;:::-;73010:5;:43;73007:438;;73160:4;73137:19;73124:10;;:32;;;;:::i;:::-;73123:41;;;;:::i;:::-;73114:4;73106:5;:12;;;;:::i;:::-;73105:60;;;;:::i;:::-;73092:9;:73;;73084:118;;;;;;;;;;;;:::i;:::-;;;;;;;;;73246:10;;73218:13;:25;73232:10;73218:25;;;;;;;;;;;;;;;:38;;;;73007:438;;;73341:1;73328:9;:14;;73320:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;73424:5;73395:13;:25;73409:10;73395:25;;;;;;;;;;;;;;;;:34;;;;;;;:::i;:::-;;;;;;;;73007:438;72951:618;;;73518:4;73510:5;:12;;;;:::i;:::-;73497:9;:25;;73489:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;72951:618;73604:5;73577:11;:23;73589:10;73577:23;;;;;;;;;;;;;;;;:32;;;;;;;:::i;:::-;;;;;;;;73618:28;73628:10;73640:5;73618:9;:28::i;:::-;71810:1844;;;71764:1890;:::o;45237:234::-;45384:8;45332:18;:39;45351:19;:17;:19::i;:::-;45332:39;;;;;;;;;;;;;;;:49;45372:8;45332:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;45444:8;45408:55;;45423:19;:17;:19::i;:::-;45408:55;;;45454:8;45408:55;;;;;;:::i;:::-;;;;;;;;45237:234;;:::o;74832:65::-;17303:13;:11;:13::i;:::-;74887:4:::1;74876:8;;:15;;;;;;;;;;;;;;;;;;74832:65::o:0;74994:90::-;75043:7;75068:10;;75061:17;;74994:90;:::o;73666:245::-;17303:13;:11;:13::i;:::-;73749:14:::1;73766:13;:11;:13::i;:::-;73749:30;;73807:1;73794:10;:14;73786:23;;;::::0;::::1;;73847:9;;73833:10;73824:6;:19;;;;:::i;:::-;:32;;73816:41;;;::::0;::::1;;73874:29;73884:6;73892:10;73874:9;:29::i;:::-;73742:169;73666:245:::0;;:::o;52030:407::-;52205:31;52218:4;52224:2;52228:7;52205:12;:31::i;:::-;52269:1;52251:2;:14;;;:19;52247:183;;52290:56;52321:4;52327:2;52331:7;52340:5;52290:30;:56::i;:::-;52285:145;;52374:40;;;;;;;;;;;;;;52285:145;52247:183;52030:407;;;;:::o;70491:37::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;70741:29::-;;;;:::o;74313:497::-;74411:13;74452:16;74460:7;74452;:16::i;:::-;74436:97;;;;;;;;;;;;:::i;:::-;;;;;;;;;74561:5;74549:17;;:8;;;;;;;;;;;:17;;;74546:62;;;74586:14;74579:21;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;74546:62;74616:28;74647:10;:8;:10::i;:::-;74616:41;;74702:1;74677:14;74671:28;:32;:133;;;;;;;;;;;;;;;;;74739:14;74755:18;:7;:16;:18::i;:::-;74775:13;74722:67;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;74671:133;74664:140;;;74313:497;;;;:::o;70568:30::-;;;;:::o;75320:122::-;17303:13;:11;:13::i;:::-;75419:17:::1;75403:13;:33;;;;;;;;;;;;:::i;:::-;;75320:122:::0;:::o;70708:28::-;;;;:::o;70978:48::-;;;;;;;;;;;;;;;;;:::o;45628:164::-;45725:4;45749:18;:25;45768:5;45749:25;;;;;;;;;;;;;;;:35;45775:8;45749:35;;;;;;;;;;;;;;;;;;;;;;;;;45742:42;;45628:164;;;;:::o;75090:120::-;17303:13;:11;:13::i;:::-;75189:15:::1;75172:14;:32;;;;;;;;;;;;:::i;:::-;;75090:120:::0;:::o;18323:201::-;17303:13;:11;:13::i;:::-;18432:1:::1;18412:22;;:8;:22;;;;18404:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;18488:28;18507:8;18488:18;:28::i;:::-;18323:201:::0;:::o;17582:132::-;17657:12;:10;:12::i;:::-;17646:23;;:7;:5;:7::i;:::-;:23;;;17638:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;17582:132::o;46050:282::-;46115:4;46171:7;46152:15;:13;:15::i;:::-;:26;;:66;;;;;46205:13;;46195:7;:23;46152:66;:153;;;;;46304:1;30058:8;46256:17;:26;46274:7;46256:26;;;;;;;;;;;;:44;:49;46152:153;46132:173;;46050:282;;;:::o;68358:105::-;68418:7;68445:10;68438:17;;68358:105;:::o;33455:92::-;33511:7;33455:92;:::o;40736:1275::-;40803:7;40823:12;40838:7;40823:22;;40906:4;40887:15;:13;:15::i;:::-;:23;40883:1061;;40940:13;;40933:4;:20;40929:1015;;;40978:14;40995:17;:23;41013:4;40995:23;;;;;;;;;;;;40978:40;;41112:1;30058:8;41084:6;:24;:29;41080:845;;;41749:113;41766:1;41756:6;:11;41749:113;;;41809:17;:25;41827:6;;;;;;;41809:25;;;;;;;;;;;;41800:34;;41749:113;;;41895:6;41888:13;;;;;;41080:845;40955:989;40929:1015;40883:1061;41972:31;;;;;;;;;;;;;;40736:1275;;;;:::o;47213:485::-;47315:27;47344:23;47385:38;47426:15;:24;47442:7;47426:24;;;;;;;;;;;47385:65;;47603:18;47580:41;;47660:19;47654:26;47635:45;;47565:126;47213:485;;;:::o;46441:659::-;46590:11;46755:16;46748:5;46744:28;46735:37;;46915:16;46904:9;46900:32;46887:45;;47065:15;47054:9;47051:30;47043:5;47032:9;47029:20;47026:56;47016:66;;46441:659;;;;;:::o;53099:159::-;;;;;:::o;67667:311::-;67802:7;67822:16;30462:3;67848:19;:41;;67822:68;;30462:3;67916:31;67927:4;67933:2;67937:9;67916:10;:31::i;:::-;67908:40;;:62;;67901:69;;;67667:311;;;;;:::o;42559:450::-;42639:14;42807:16;42800:5;42796:28;42787:37;;42984:5;42970:11;42945:23;42941:41;42938:52;42931:5;42928:63;42918:73;;42559:450;;;;:::o;53923:158::-;;;;;:::o;18684:191::-;18758:16;18777:6;;;;;;;;;;;18758:25;;18803:8;18794:6;;:17;;;;;;;;;;;;;;;;;;18858:8;18827:40;;18848:8;18827:40;;;;;;;;;;;;18747:128;18684:191;:::o;62190:112::-;62267:27;62277:2;62281:8;62267:27;;;;;;;;;;;;:9;:27::i;:::-;62190:112;;:::o;54521:716::-;54684:4;54730:2;54705:45;;;54751:19;:17;:19::i;:::-;54772:4;54778:7;54787:5;54705:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;54701:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55005:1;54988:6;:13;:18;54984:235;;;55034:40;;;;;;;;;;;;;;54984:235;55177:6;55171:13;55162:6;55158:2;55154:15;55147:38;54701:529;54874:54;;;54864:64;;;:6;:64;;;;54857:71;;;54521:716;;;;;;:::o;71641:102::-;71701:13;71730:7;71723:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;71641:102;:::o;13373:727::-;13429:13;13480:14;13528:1;13497:28;13519:5;13497:21;:28::i;:::-;:32;13480:49;;13544:20;13578:6;13567:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13544:41;;13600:11;13729:6;13725:2;13721:15;13713:6;13709:28;13702:35;;13766:288;13773:4;13766:288;;;13798:5;;;;;;;;13940:8;13935:2;13928:5;13924:14;13919:30;13914:3;13906:44;13996:2;13987:11;;;;;;:::i;:::-;;;;;14030:1;14021:5;:10;14017:21;;;14033:5;;14017:21;13766:288;;;14075:6;14068:13;;;;;13373:727;;;:::o;15968:98::-;16021:7;16048:10;16041:17;;15968:98;:::o;67368:147::-;67505:6;67368:147;;;;;:::o;61417:689::-;61548:19;61554:2;61558:8;61548:5;:19::i;:::-;61627:1;61609:2;:14;;;:19;61605:483;;61649:11;61663:13;;61649:27;;61695:13;61717:8;61711:3;:14;61695:30;;61744:233;61775:62;61814:1;61818:2;61822:7;;;;;;61831:5;61775:30;:62::i;:::-;61770:167;;61873:40;;;;;;;;;;;;;;61770:167;61972:3;61964:5;:11;61744:233;;62059:3;62042:13;;:20;62038:34;;62064:8;;;62038:34;61630:458;;61605:483;61417:689;;;:::o;10205:922::-;10258:7;10278:14;10295:1;10278:18;;10345:6;10336:5;:15;10332:102;;10381:6;10372:15;;;;;;:::i;:::-;;;;;10416:2;10406:12;;;;10332:102;10461:6;10452:5;:15;10448:102;;10497:6;10488:15;;;;;;:::i;:::-;;;;;10532:2;10522:12;;;;10448:102;10577:6;10568:5;:15;10564:102;;10613:6;10604:15;;;;;;:::i;:::-;;;;;10648:2;10638:12;;;;10564:102;10693:5;10684;:14;10680:99;;10728:5;10719:14;;;;;;:::i;:::-;;;;;10762:1;10752:11;;;;10680:99;10806:5;10797;:14;10793:99;;10841:5;10832:14;;;;;;:::i;:::-;;;;;10875:1;10865:11;;;;10793:99;10919:5;10910;:14;10906:99;;10954:5;10945:14;;;;;;:::i;:::-;;;;;10988:1;10978:11;;;;10906:99;11032:5;11023;:14;11019:66;;11068:1;11058:11;;;;11019:66;11113:6;11106:13;;;10205:922;;;:::o;55699:2966::-;55772:20;55795:13;;55772:36;;55835:1;55823:8;:13;55819:44;;;55845:18;;;;;;;;;;;;;;55819:44;55876:61;55906:1;55910:2;55914:12;55928:8;55876:21;:61::i;:::-;56420:1;29420:2;56390:1;:26;;56389:32;56377:8;:45;56351:18;:22;56370:2;56351:22;;;;;;;;;;;;;;;;:71;;;;;;;;;;;56699:139;56736:2;56790:33;56813:1;56817:2;56821:1;56790:14;:33::i;:::-;56757:30;56778:8;56757:20;:30::i;:::-;:66;56699:18;:139::i;:::-;56665:17;:31;56683:12;56665:31;;;;;;;;;;;:173;;;;56855:16;56886:11;56915:8;56900:12;:23;56886:37;;57436:16;57432:2;57428:25;57416:37;;57808:12;57768:8;57727:1;57665:25;57606:1;57545;57518:335;58179:1;58165:12;58161:20;58119:346;58220:3;58211:7;58208:16;58119:346;;58438:7;58428:8;58425:1;58398:25;58395:1;58392;58387:59;58273:1;58264:7;58260:15;58249:26;;58119:346;;;58123:77;58510:1;58498:8;:13;58494:45;;;58520:19;;;;;;;;;;;;;;58494:45;58572:3;58556:13;:19;;;;56125:2462;;58597:60;58626:1;58630:2;58634:12;58648:8;58597:20;:60::i;:::-;55761:2904;55699:2966;;:::o;43111:324::-;43181:14;43414:1;43404:8;43401:15;43375:24;43371:46;43361:56;;43111:324;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;986:133::-;1029:5;1067:6;1054:20;1045:29;;1083:30;1107:5;1083:30;:::i;:::-;986:133;;;;:::o;1125:137::-;1170:5;1208:6;1195:20;1186:29;;1224:32;1250:5;1224:32;:::i;:::-;1125:137;;;;:::o;1268:141::-;1324:5;1355:6;1349:13;1340:22;;1371:32;1397:5;1371:32;:::i;:::-;1268:141;;;;:::o;1428:338::-;1483:5;1532:3;1525:4;1517:6;1513:17;1509:27;1499:122;;1540:79;;:::i;:::-;1499:122;1657:6;1644:20;1682:78;1756:3;1748:6;1741:4;1733:6;1729:17;1682:78;:::i;:::-;1673:87;;1489:277;1428:338;;;;:::o;1786:340::-;1842:5;1891:3;1884:4;1876:6;1872:17;1868:27;1858:122;;1899:79;;:::i;:::-;1858:122;2016:6;2003:20;2041:79;2116:3;2108:6;2101:4;2093:6;2089:17;2041:79;:::i;:::-;2032:88;;1848:278;1786:340;;;;:::o;2132:139::-;2178:5;2216:6;2203:20;2194:29;;2232:33;2259:5;2232:33;:::i;:::-;2132:139;;;;:::o;2277:329::-;2336:6;2385:2;2373:9;2364:7;2360:23;2356:32;2353:119;;;2391:79;;:::i;:::-;2353:119;2511:1;2536:53;2581:7;2572:6;2561:9;2557:22;2536:53;:::i;:::-;2526:63;;2482:117;2277:329;;;;:::o;2612:474::-;2680:6;2688;2737:2;2725:9;2716:7;2712:23;2708:32;2705:119;;;2743:79;;:::i;:::-;2705:119;2863:1;2888:53;2933:7;2924:6;2913:9;2909:22;2888:53;:::i;:::-;2878:63;;2834:117;2990:2;3016:53;3061:7;3052:6;3041:9;3037:22;3016:53;:::i;:::-;3006:63;;2961:118;2612:474;;;;;:::o;3092:619::-;3169:6;3177;3185;3234:2;3222:9;3213:7;3209:23;3205:32;3202:119;;;3240:79;;:::i;:::-;3202:119;3360:1;3385:53;3430:7;3421:6;3410:9;3406:22;3385:53;:::i;:::-;3375:63;;3331:117;3487:2;3513:53;3558:7;3549:6;3538:9;3534:22;3513:53;:::i;:::-;3503:63;;3458:118;3615:2;3641:53;3686:7;3677:6;3666:9;3662:22;3641:53;:::i;:::-;3631:63;;3586:118;3092:619;;;;;:::o;3717:943::-;3812:6;3820;3828;3836;3885:3;3873:9;3864:7;3860:23;3856:33;3853:120;;;3892:79;;:::i;:::-;3853:120;4012:1;4037:53;4082:7;4073:6;4062:9;4058:22;4037:53;:::i;:::-;4027:63;;3983:117;4139:2;4165:53;4210:7;4201:6;4190:9;4186:22;4165:53;:::i;:::-;4155:63;;4110:118;4267:2;4293:53;4338:7;4329:6;4318:9;4314:22;4293:53;:::i;:::-;4283:63;;4238:118;4423:2;4412:9;4408:18;4395:32;4454:18;4446:6;4443:30;4440:117;;;4476:79;;:::i;:::-;4440:117;4581:62;4635:7;4626:6;4615:9;4611:22;4581:62;:::i;:::-;4571:72;;4366:287;3717:943;;;;;;;:::o;4666:468::-;4731:6;4739;4788:2;4776:9;4767:7;4763:23;4759:32;4756:119;;;4794:79;;:::i;:::-;4756:119;4914:1;4939:53;4984:7;4975:6;4964:9;4960:22;4939:53;:::i;:::-;4929:63;;4885:117;5041:2;5067:50;5109:7;5100:6;5089:9;5085:22;5067:50;:::i;:::-;5057:60;;5012:115;4666:468;;;;;:::o;5140:474::-;5208:6;5216;5265:2;5253:9;5244:7;5240:23;5236:32;5233:119;;;5271:79;;:::i;:::-;5233:119;5391:1;5416:53;5461:7;5452:6;5441:9;5437:22;5416:53;:::i;:::-;5406:63;;5362:117;5518:2;5544:53;5589:7;5580:6;5569:9;5565:22;5544:53;:::i;:::-;5534:63;;5489:118;5140:474;;;;;:::o;5620:323::-;5676:6;5725:2;5713:9;5704:7;5700:23;5696:32;5693:119;;;5731:79;;:::i;:::-;5693:119;5851:1;5876:50;5918:7;5909:6;5898:9;5894:22;5876:50;:::i;:::-;5866:60;;5822:114;5620:323;;;;:::o;5949:327::-;6007:6;6056:2;6044:9;6035:7;6031:23;6027:32;6024:119;;;6062:79;;:::i;:::-;6024:119;6182:1;6207:52;6251:7;6242:6;6231:9;6227:22;6207:52;:::i;:::-;6197:62;;6153:116;5949:327;;;;:::o;6282:349::-;6351:6;6400:2;6388:9;6379:7;6375:23;6371:32;6368:119;;;6406:79;;:::i;:::-;6368:119;6526:1;6551:63;6606:7;6597:6;6586:9;6582:22;6551:63;:::i;:::-;6541:73;;6497:127;6282:349;;;;:::o;6637:509::-;6706:6;6755:2;6743:9;6734:7;6730:23;6726:32;6723:119;;;6761:79;;:::i;:::-;6723:119;6909:1;6898:9;6894:17;6881:31;6939:18;6931:6;6928:30;6925:117;;;6961:79;;:::i;:::-;6925:117;7066:63;7121:7;7112:6;7101:9;7097:22;7066:63;:::i;:::-;7056:73;;6852:287;6637:509;;;;:::o;7152:329::-;7211:6;7260:2;7248:9;7239:7;7235:23;7231:32;7228:119;;;7266:79;;:::i;:::-;7228:119;7386:1;7411:53;7456:7;7447:6;7436:9;7432:22;7411:53;:::i;:::-;7401:63;;7357:117;7152:329;;;;:::o;7487:765::-;7573:6;7581;7589;7597;7646:3;7634:9;7625:7;7621:23;7617:33;7614:120;;;7653:79;;:::i;:::-;7614:120;7773:1;7798:53;7843:7;7834:6;7823:9;7819:22;7798:53;:::i;:::-;7788:63;;7744:117;7900:2;7926:53;7971:7;7962:6;7951:9;7947:22;7926:53;:::i;:::-;7916:63;;7871:118;8028:2;8054:53;8099:7;8090:6;8079:9;8075:22;8054:53;:::i;:::-;8044:63;;7999:118;8156:2;8182:53;8227:7;8218:6;8207:9;8203:22;8182:53;:::i;:::-;8172:63;;8127:118;7487:765;;;;;;;:::o;8258:118::-;8345:24;8363:5;8345:24;:::i;:::-;8340:3;8333:37;8258:118;;:::o;8382:109::-;8463:21;8478:5;8463:21;:::i;:::-;8458:3;8451:34;8382:109;;:::o;8497:360::-;8583:3;8611:38;8643:5;8611:38;:::i;:::-;8665:70;8728:6;8723:3;8665:70;:::i;:::-;8658:77;;8744:52;8789:6;8784:3;8777:4;8770:5;8766:16;8744:52;:::i;:::-;8821:29;8843:6;8821:29;:::i;:::-;8816:3;8812:39;8805:46;;8587:270;8497:360;;;;:::o;8863:364::-;8951:3;8979:39;9012:5;8979:39;:::i;:::-;9034:71;9098:6;9093:3;9034:71;:::i;:::-;9027:78;;9114:52;9159:6;9154:3;9147:4;9140:5;9136:16;9114:52;:::i;:::-;9191:29;9213:6;9191:29;:::i;:::-;9186:3;9182:39;9175:46;;8955:272;8863:364;;;;:::o;9233:377::-;9339:3;9367:39;9400:5;9367:39;:::i;:::-;9422:89;9504:6;9499:3;9422:89;:::i;:::-;9415:96;;9520:52;9565:6;9560:3;9553:4;9546:5;9542:16;9520:52;:::i;:::-;9597:6;9592:3;9588:16;9581:23;;9343:267;9233:377;;;;:::o;9640:845::-;9743:3;9780:5;9774:12;9809:36;9835:9;9809:36;:::i;:::-;9861:89;9943:6;9938:3;9861:89;:::i;:::-;9854:96;;9981:1;9970:9;9966:17;9997:1;9992:137;;;;10143:1;10138:341;;;;9959:520;;9992:137;10076:4;10072:9;10061;10057:25;10052:3;10045:38;10112:6;10107:3;10103:16;10096:23;;9992:137;;10138:341;10205:38;10237:5;10205:38;:::i;:::-;10265:1;10279:154;10293:6;10290:1;10287:13;10279:154;;;10367:7;10361:14;10357:1;10352:3;10348:11;10341:35;10417:1;10408:7;10404:15;10393:26;;10315:4;10312:1;10308:12;10303:17;;10279:154;;;10462:6;10457:3;10453:16;10446:23;;10145:334;;9959:520;;9747:738;;9640:845;;;;:::o;10491:365::-;10633:3;10654:66;10718:1;10713:3;10654:66;:::i;:::-;10647:73;;10729:93;10818:3;10729:93;:::i;:::-;10847:2;10842:3;10838:12;10831:19;;10491:365;;;:::o;10862:366::-;11004:3;11025:67;11089:2;11084:3;11025:67;:::i;:::-;11018:74;;11101:93;11190:3;11101:93;:::i;:::-;11219:2;11214:3;11210:12;11203:19;;10862:366;;;:::o;11234:::-;11376:3;11397:67;11461:2;11456:3;11397:67;:::i;:::-;11390:74;;11473:93;11562:3;11473:93;:::i;:::-;11591:2;11586:3;11582:12;11575:19;;11234:366;;;:::o;11606:::-;11748:3;11769:67;11833:2;11828:3;11769:67;:::i;:::-;11762:74;;11845:93;11934:3;11845:93;:::i;:::-;11963:2;11958:3;11954:12;11947:19;;11606:366;;;:::o;11978:::-;12120:3;12141:67;12205:2;12200:3;12141:67;:::i;:::-;12134:74;;12217:93;12306:3;12217:93;:::i;:::-;12335:2;12330:3;12326:12;12319:19;;11978:366;;;:::o;12350:::-;12492:3;12513:67;12577:2;12572:3;12513:67;:::i;:::-;12506:74;;12589:93;12678:3;12589:93;:::i;:::-;12707:2;12702:3;12698:12;12691:19;;12350:366;;;:::o;12722:::-;12864:3;12885:67;12949:2;12944:3;12885:67;:::i;:::-;12878:74;;12961:93;13050:3;12961:93;:::i;:::-;13079:2;13074:3;13070:12;13063:19;;12722:366;;;:::o;13094:398::-;13253:3;13274:83;13355:1;13350:3;13274:83;:::i;:::-;13267:90;;13366:93;13455:3;13366:93;:::i;:::-;13484:1;13479:3;13475:11;13468:18;;13094:398;;;:::o;13498:366::-;13640:3;13661:67;13725:2;13720:3;13661:67;:::i;:::-;13654:74;;13737:93;13826:3;13737:93;:::i;:::-;13855:2;13850:3;13846:12;13839:19;;13498:366;;;:::o;13870:::-;14012:3;14033:67;14097:2;14092:3;14033:67;:::i;:::-;14026:74;;14109:93;14198:3;14109:93;:::i;:::-;14227:2;14222:3;14218:12;14211:19;;13870:366;;;:::o;14242:118::-;14329:24;14347:5;14329:24;:::i;:::-;14324:3;14317:37;14242:118;;:::o;14366:589::-;14591:3;14613:95;14704:3;14695:6;14613:95;:::i;:::-;14606:102;;14725:95;14816:3;14807:6;14725:95;:::i;:::-;14718:102;;14837:92;14925:3;14916:6;14837:92;:::i;:::-;14830:99;;14946:3;14939:10;;14366:589;;;;;;:::o;14961:379::-;15145:3;15167:147;15310:3;15167:147;:::i;:::-;15160:154;;15331:3;15324:10;;14961:379;;;:::o;15346:222::-;15439:4;15477:2;15466:9;15462:18;15454:26;;15490:71;15558:1;15547:9;15543:17;15534:6;15490:71;:::i;:::-;15346:222;;;;:::o;15574:640::-;15769:4;15807:3;15796:9;15792:19;15784:27;;15821:71;15889:1;15878:9;15874:17;15865:6;15821:71;:::i;:::-;15902:72;15970:2;15959:9;15955:18;15946:6;15902:72;:::i;:::-;15984;16052:2;16041:9;16037:18;16028:6;15984:72;:::i;:::-;16103:9;16097:4;16093:20;16088:2;16077:9;16073:18;16066:48;16131:76;16202:4;16193:6;16131:76;:::i;:::-;16123:84;;15574:640;;;;;;;:::o;16220:210::-;16307:4;16345:2;16334:9;16330:18;16322:26;;16358:65;16420:1;16409:9;16405:17;16396:6;16358:65;:::i;:::-;16220:210;;;;:::o;16436:313::-;16549:4;16587:2;16576:9;16572:18;16564:26;;16636:9;16630:4;16626:20;16622:1;16611:9;16607:17;16600:47;16664:78;16737:4;16728:6;16664:78;:::i;:::-;16656:86;;16436:313;;;;:::o;16755:419::-;16921:4;16959:2;16948:9;16944:18;16936:26;;17008:9;17002:4;16998:20;16994:1;16983:9;16979:17;16972:47;17036:131;17162:4;17036:131;:::i;:::-;17028:139;;16755:419;;;:::o;17180:::-;17346:4;17384:2;17373:9;17369:18;17361:26;;17433:9;17427:4;17423:20;17419:1;17408:9;17404:17;17397:47;17461:131;17587:4;17461:131;:::i;:::-;17453:139;;17180:419;;;:::o;17605:::-;17771:4;17809:2;17798:9;17794:18;17786:26;;17858:9;17852:4;17848:20;17844:1;17833:9;17829:17;17822:47;17886:131;18012:4;17886:131;:::i;:::-;17878:139;;17605:419;;;:::o;18030:::-;18196:4;18234:2;18223:9;18219:18;18211:26;;18283:9;18277:4;18273:20;18269:1;18258:9;18254:17;18247:47;18311:131;18437:4;18311:131;:::i;:::-;18303:139;;18030:419;;;:::o;18455:::-;18621:4;18659:2;18648:9;18644:18;18636:26;;18708:9;18702:4;18698:20;18694:1;18683:9;18679:17;18672:47;18736:131;18862:4;18736:131;:::i;:::-;18728:139;;18455:419;;;:::o;18880:::-;19046:4;19084:2;19073:9;19069:18;19061:26;;19133:9;19127:4;19123:20;19119:1;19108:9;19104:17;19097:47;19161:131;19287:4;19161:131;:::i;:::-;19153:139;;18880:419;;;:::o;19305:::-;19471:4;19509:2;19498:9;19494:18;19486:26;;19558:9;19552:4;19548:20;19544:1;19533:9;19529:17;19522:47;19586:131;19712:4;19586:131;:::i;:::-;19578:139;;19305:419;;;:::o;19730:::-;19896:4;19934:2;19923:9;19919:18;19911:26;;19983:9;19977:4;19973:20;19969:1;19958:9;19954:17;19947:47;20011:131;20137:4;20011:131;:::i;:::-;20003:139;;19730:419;;;:::o;20155:::-;20321:4;20359:2;20348:9;20344:18;20336:26;;20408:9;20402:4;20398:20;20394:1;20383:9;20379:17;20372:47;20436:131;20562:4;20436:131;:::i;:::-;20428:139;;20155:419;;;:::o;20580:222::-;20673:4;20711:2;20700:9;20696:18;20688:26;;20724:71;20792:1;20781:9;20777:17;20768:6;20724:71;:::i;:::-;20580:222;;;;:::o;20808:129::-;20842:6;20869:20;;:::i;:::-;20859:30;;20898:33;20926:4;20918:6;20898:33;:::i;:::-;20808:129;;;:::o;20943:75::-;20976:6;21009:2;21003:9;20993:19;;20943:75;:::o;21024:307::-;21085:4;21175:18;21167:6;21164:30;21161:56;;;21197:18;;:::i;:::-;21161:56;21235:29;21257:6;21235:29;:::i;:::-;21227:37;;21319:4;21313;21309:15;21301:23;;21024:307;;;:::o;21337:308::-;21399:4;21489:18;21481:6;21478:30;21475:56;;;21511:18;;:::i;:::-;21475:56;21549:29;21571:6;21549:29;:::i;:::-;21541:37;;21633:4;21627;21623:15;21615:23;;21337:308;;;:::o;21651:141::-;21700:4;21723:3;21715:11;;21746:3;21743:1;21736:14;21780:4;21777:1;21767:18;21759:26;;21651:141;;;:::o;21798:98::-;21849:6;21883:5;21877:12;21867:22;;21798:98;;;:::o;21902:99::-;21954:6;21988:5;21982:12;21972:22;;21902:99;;;:::o;22007:168::-;22090:11;22124:6;22119:3;22112:19;22164:4;22159:3;22155:14;22140:29;;22007:168;;;;:::o;22181:147::-;22282:11;22319:3;22304:18;;22181:147;;;;:::o;22334:169::-;22418:11;22452:6;22447:3;22440:19;22492:4;22487:3;22483:14;22468:29;;22334:169;;;;:::o;22509:148::-;22611:11;22648:3;22633:18;;22509:148;;;;:::o;22663:305::-;22703:3;22722:20;22740:1;22722:20;:::i;:::-;22717:25;;22756:20;22774:1;22756:20;:::i;:::-;22751:25;;22910:1;22842:66;22838:74;22835:1;22832:81;22829:107;;;22916:18;;:::i;:::-;22829:107;22960:1;22957;22953:9;22946:16;;22663:305;;;;:::o;22974:348::-;23014:7;23037:20;23055:1;23037:20;:::i;:::-;23032:25;;23071:20;23089:1;23071:20;:::i;:::-;23066:25;;23259:1;23191:66;23187:74;23184:1;23181:81;23176:1;23169:9;23162:17;23158:105;23155:131;;;23266:18;;:::i;:::-;23155:131;23314:1;23311;23307:9;23296:20;;22974:348;;;;:::o;23328:191::-;23368:4;23388:20;23406:1;23388:20;:::i;:::-;23383:25;;23422:20;23440:1;23422:20;:::i;:::-;23417:25;;23461:1;23458;23455:8;23452:34;;;23466:18;;:::i;:::-;23452:34;23511:1;23508;23504:9;23496:17;;23328:191;;;;:::o;23525:96::-;23562:7;23591:24;23609:5;23591:24;:::i;:::-;23580:35;;23525:96;;;:::o;23627:90::-;23661:7;23704:5;23697:13;23690:21;23679:32;;23627:90;;;:::o;23723:149::-;23759:7;23799:66;23792:5;23788:78;23777:89;;23723:149;;;:::o;23878:126::-;23915:7;23955:42;23948:5;23944:54;23933:65;;23878:126;;;:::o;24010:77::-;24047:7;24076:5;24065:16;;24010:77;;;:::o;24093:154::-;24177:6;24172:3;24167;24154:30;24239:1;24230:6;24225:3;24221:16;24214:27;24093:154;;;:::o;24253:307::-;24321:1;24331:113;24345:6;24342:1;24339:13;24331:113;;;24430:1;24425:3;24421:11;24415:18;24411:1;24406:3;24402:11;24395:39;24367:2;24364:1;24360:10;24355:15;;24331:113;;;24462:6;24459:1;24456:13;24453:101;;;24542:1;24533:6;24528:3;24524:16;24517:27;24453:101;24302:258;24253:307;;;:::o;24566:320::-;24610:6;24647:1;24641:4;24637:12;24627:22;;24694:1;24688:4;24684:12;24715:18;24705:81;;24771:4;24763:6;24759:17;24749:27;;24705:81;24833:2;24825:6;24822:14;24802:18;24799:38;24796:84;;;24852:18;;:::i;:::-;24796:84;24617:269;24566:320;;;:::o;24892:281::-;24975:27;24997:4;24975:27;:::i;:::-;24967:6;24963:40;25105:6;25093:10;25090:22;25069:18;25057:10;25054:34;25051:62;25048:88;;;25116:18;;:::i;:::-;25048:88;25156:10;25152:2;25145:22;24935:238;24892:281;;:::o;25179:180::-;25227:77;25224:1;25217:88;25324:4;25321:1;25314:15;25348:4;25345:1;25338:15;25365:180;25413:77;25410:1;25403:88;25510:4;25507:1;25500:15;25534:4;25531:1;25524:15;25551:180;25599:77;25596:1;25589:88;25696:4;25693:1;25686:15;25720:4;25717:1;25710:15;25737:180;25785:77;25782:1;25775:88;25882:4;25879:1;25872:15;25906:4;25903:1;25896:15;25923:117;26032:1;26029;26022:12;26046:117;26155:1;26152;26145:12;26169:117;26278:1;26275;26268:12;26292:117;26401:1;26398;26391:12;26415:102;26456:6;26507:2;26503:7;26498:2;26491:5;26487:14;26483:28;26473:38;;26415:102;;;:::o;26523:157::-;26663:9;26659:1;26651:6;26647:14;26640:33;26523:157;:::o;26686:225::-;26826:34;26822:1;26814:6;26810:14;26803:58;26895:8;26890:2;26882:6;26878:15;26871:33;26686:225;:::o;26917:162::-;27057:14;27053:1;27045:6;27041:14;27034:38;26917:162;:::o;27085:173::-;27225:25;27221:1;27213:6;27209:14;27202:49;27085:173;:::o;27264:182::-;27404:34;27400:1;27392:6;27388:14;27381:58;27264:182;:::o;27452:::-;27592:34;27588:1;27580:6;27576:14;27569:58;27452:182;:::o;27640:234::-;27780:34;27776:1;27768:6;27764:14;27757:58;27849:17;27844:2;27836:6;27832:15;27825:42;27640:234;:::o;27880:114::-;;:::o;28000:168::-;28140:20;28136:1;28128:6;28124:14;28117:44;28000:168;:::o;28174:165::-;28314:17;28310:1;28302:6;28298:14;28291:41;28174:165;:::o;28345:122::-;28418:24;28436:5;28418:24;:::i;:::-;28411:5;28408:35;28398:63;;28457:1;28454;28447:12;28398:63;28345:122;:::o;28473:116::-;28543:21;28558:5;28543:21;:::i;:::-;28536:5;28533:32;28523:60;;28579:1;28576;28569:12;28523:60;28473:116;:::o;28595:120::-;28667:23;28684:5;28667:23;:::i;:::-;28660:5;28657:34;28647:62;;28705:1;28702;28695:12;28647:62;28595:120;:::o;28721:122::-;28794:24;28812:5;28794:24;:::i;:::-;28787:5;28784:35;28774:63;;28833:1;28830;28823:12;28774:63;28721:122;:::o

Swarm Source

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