ETH Price: $3,821.61 (+4.74%)

Token

Anarchist (ANARC)
 

Overview

Max Total Supply

892 ANARC

Holders

489

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Balance
1 ANARC
0x7422ec1dacbd1f7893f35f7b0158559fc5aef8b0
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:
Anarchist

Compiler Version
v0.8.18+commit.87f61d96

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, GNU GPLv3 license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-04-28
*/

// SPDX-License-Identifier: GPL-3.0
// File: @openzeppelin/contracts/utils/cryptography/MerkleProof.sol


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

pragma solidity ^0.8.0;

/**
 * @dev These functions deal with verification of Merkle Tree proofs.
 *
 * The tree and the proofs can be generated using our
 * https://github.com/OpenZeppelin/merkle-tree[JavaScript library].
 * You will find a quickstart guide in the readme.
 *
 * WARNING: You should avoid using leaf values that are 64 bytes long prior to
 * hashing, or use a hash function other than keccak256 for hashing leaves.
 * This is because the concatenation of a sorted pair of internal nodes in
 * the merkle tree could be reinterpreted as a leaf value.
 * OpenZeppelin's JavaScript library generates merkle trees that are safe
 * against this attack out of the box.
 */
library MerkleProof {
    /**
     * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree
     * defined by `root`. For this, a `proof` must be provided, containing
     * sibling hashes on the branch from the leaf to the root of the tree. Each
     * pair of leaves and each pair of pre-images are assumed to be sorted.
     */
    function verify(
        bytes32[] memory proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        return processProof(proof, leaf) == root;
    }

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

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

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

    /**
     * @dev Returns true if the `leaves` can be simultaneously proven to be a part of a merkle tree defined by
     * `root`, according to `proof` and `proofFlags` as described in {processMultiProof}.
     *
     * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details.
     *
     * _Available since v4.7._
     */
    function multiProofVerify(
        bytes32[] memory proof,
        bool[] memory proofFlags,
        bytes32 root,
        bytes32[] memory leaves
    ) internal pure returns (bool) {
        return processMultiProof(proof, proofFlags, leaves) == root;
    }

    /**
     * @dev Calldata version of {multiProofVerify}
     *
     * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details.
     *
     * _Available since v4.7._
     */
    function multiProofVerifyCalldata(
        bytes32[] calldata proof,
        bool[] calldata proofFlags,
        bytes32 root,
        bytes32[] memory leaves
    ) internal pure returns (bool) {
        return processMultiProofCalldata(proof, proofFlags, leaves) == root;
    }

    /**
     * @dev Returns the root of a tree reconstructed from `leaves` and sibling nodes in `proof`. The reconstruction
     * proceeds by incrementally reconstructing all inner nodes by combining a leaf/inner node with either another
     * leaf/inner node or a proof sibling node, depending on whether each `proofFlags` item is true or false
     * respectively.
     *
     * CAUTION: Not all merkle trees admit multiproofs. To use multiproofs, it is sufficient to ensure that: 1) the tree
     * is complete (but not necessarily perfect), 2) the leaves to be proven are in the opposite order they are in the
     * tree (i.e., as seen from right to left starting at the deepest layer and continuing at the next layer).
     *
     * _Available since v4.7._
     */
    function processMultiProof(
        bytes32[] memory proof,
        bool[] memory proofFlags,
        bytes32[] memory leaves
    ) internal pure returns (bytes32 merkleRoot) {
        // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by
        // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the
        // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of
        // the merkle tree.
        uint256 leavesLen = leaves.length;
        uint256 totalHashes = proofFlags.length;

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

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

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/utils/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/extensions/IERC721AQueryable.sol


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

pragma solidity ^0.8.4;


/**
 * @dev Interface of ERC721AQueryable.
 */
interface IERC721AQueryable is IERC721A {
    /**
     * Invalid query range (`start` >= `stop`).
     */
    error InvalidQueryRange();

    /**
     * @dev Returns the `TokenOwnership` struct at `tokenId` without reverting.
     *
     * If the `tokenId` is out of bounds:
     *
     * - `addr = address(0)`
     * - `startTimestamp = 0`
     * - `burned = false`
     * - `extraData = 0`
     *
     * If the `tokenId` is burned:
     *
     * - `addr = <Address of owner before token was burned>`
     * - `startTimestamp = <Timestamp when token was burned>`
     * - `burned = true`
     * - `extraData = <Extra data when token was burned>`
     *
     * Otherwise:
     *
     * - `addr = <Address of owner>`
     * - `startTimestamp = <Timestamp of start of ownership>`
     * - `burned = false`
     * - `extraData = <Extra data at start of ownership>`
     */
    function explicitOwnershipOf(uint256 tokenId) external view returns (TokenOwnership memory);

    /**
     * @dev Returns an array of `TokenOwnership` structs at `tokenIds` in order.
     * See {ERC721AQueryable-explicitOwnershipOf}
     */
    function explicitOwnershipsOf(uint256[] memory tokenIds) external view returns (TokenOwnership[] memory);

    /**
     * @dev Returns an array of token IDs owned by `owner`,
     * in the range [`start`, `stop`)
     * (i.e. `start <= tokenId < stop`).
     *
     * This function allows for tokens to be queried if the collection
     * grows too big for a single call of {ERC721AQueryable-tokensOfOwner}.
     *
     * Requirements:
     *
     * - `start < stop`
     */
    function tokensOfOwnerIn(
        address owner,
        uint256 start,
        uint256 stop
    ) external view returns (uint256[] memory);

    /**
     * @dev Returns an array of token IDs owned by `owner`.
     *
     * This function scans the ownership mapping and is O(`totalSupply`) in complexity.
     * It is meant to be called off-chain.
     *
     * See {ERC721AQueryable-tokensOfOwnerIn} for splitting the scan into
     * multiple smaller scans if the collection is large enough to cause
     * an out-of-gas error (10K collections should be fine).
     */
    function tokensOfOwner(address owner) external view returns (uint256[] memory);
}

// 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: erc721a/contracts/extensions/ERC721AQueryable.sol


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

pragma solidity ^0.8.4;



/**
 * @title ERC721AQueryable.
 *
 * @dev ERC721A subclass with convenience query functions.
 */
abstract contract ERC721AQueryable is ERC721A, IERC721AQueryable {
    /**
     * @dev Returns the `TokenOwnership` struct at `tokenId` without reverting.
     *
     * If the `tokenId` is out of bounds:
     *
     * - `addr = address(0)`
     * - `startTimestamp = 0`
     * - `burned = false`
     * - `extraData = 0`
     *
     * If the `tokenId` is burned:
     *
     * - `addr = <Address of owner before token was burned>`
     * - `startTimestamp = <Timestamp when token was burned>`
     * - `burned = true`
     * - `extraData = <Extra data when token was burned>`
     *
     * Otherwise:
     *
     * - `addr = <Address of owner>`
     * - `startTimestamp = <Timestamp of start of ownership>`
     * - `burned = false`
     * - `extraData = <Extra data at start of ownership>`
     */
    function explicitOwnershipOf(uint256 tokenId) public view virtual override returns (TokenOwnership memory) {
        TokenOwnership memory ownership;
        if (tokenId < _startTokenId() || tokenId >= _nextTokenId()) {
            return ownership;
        }
        ownership = _ownershipAt(tokenId);
        if (ownership.burned) {
            return ownership;
        }
        return _ownershipOf(tokenId);
    }

    /**
     * @dev Returns an array of `TokenOwnership` structs at `tokenIds` in order.
     * See {ERC721AQueryable-explicitOwnershipOf}
     */
    function explicitOwnershipsOf(uint256[] calldata tokenIds)
        external
        view
        virtual
        override
        returns (TokenOwnership[] memory)
    {
        unchecked {
            uint256 tokenIdsLength = tokenIds.length;
            TokenOwnership[] memory ownerships = new TokenOwnership[](tokenIdsLength);
            for (uint256 i; i != tokenIdsLength; ++i) {
                ownerships[i] = explicitOwnershipOf(tokenIds[i]);
            }
            return ownerships;
        }
    }

    /**
     * @dev Returns an array of token IDs owned by `owner`,
     * in the range [`start`, `stop`)
     * (i.e. `start <= tokenId < stop`).
     *
     * This function allows for tokens to be queried if the collection
     * grows too big for a single call of {ERC721AQueryable-tokensOfOwner}.
     *
     * Requirements:
     *
     * - `start < stop`
     */
    function tokensOfOwnerIn(
        address owner,
        uint256 start,
        uint256 stop
    ) external view virtual override returns (uint256[] memory) {
        unchecked {
            if (start >= stop) revert InvalidQueryRange();
            uint256 tokenIdsIdx;
            uint256 stopLimit = _nextTokenId();
            // Set `start = max(start, _startTokenId())`.
            if (start < _startTokenId()) {
                start = _startTokenId();
            }
            // Set `stop = min(stop, stopLimit)`.
            if (stop > stopLimit) {
                stop = stopLimit;
            }
            uint256 tokenIdsMaxLength = balanceOf(owner);
            // Set `tokenIdsMaxLength = min(balanceOf(owner), stop - start)`,
            // to cater for cases where `balanceOf(owner)` is too big.
            if (start < stop) {
                uint256 rangeLength = stop - start;
                if (rangeLength < tokenIdsMaxLength) {
                    tokenIdsMaxLength = rangeLength;
                }
            } else {
                tokenIdsMaxLength = 0;
            }
            uint256[] memory tokenIds = new uint256[](tokenIdsMaxLength);
            if (tokenIdsMaxLength == 0) {
                return tokenIds;
            }
            // We need to call `explicitOwnershipOf(start)`,
            // because the slot at `start` may not be initialized.
            TokenOwnership memory ownership = explicitOwnershipOf(start);
            address currOwnershipAddr;
            // If the starting slot exists (i.e. not burned), initialize `currOwnershipAddr`.
            // `ownership.address` will not be zero, as `start` is clamped to the valid token ID range.
            if (!ownership.burned) {
                currOwnershipAddr = ownership.addr;
            }
            for (uint256 i = start; i != stop && tokenIdsIdx != tokenIdsMaxLength; ++i) {
                ownership = _ownershipAt(i);
                if (ownership.burned) {
                    continue;
                }
                if (ownership.addr != address(0)) {
                    currOwnershipAddr = ownership.addr;
                }
                if (currOwnershipAddr == owner) {
                    tokenIds[tokenIdsIdx++] = i;
                }
            }
            // Downsize the array to fit.
            assembly {
                mstore(tokenIds, tokenIdsIdx)
            }
            return tokenIds;
        }
    }

    /**
     * @dev Returns an array of token IDs owned by `owner`.
     *
     * This function scans the ownership mapping and is O(`totalSupply`) in complexity.
     * It is meant to be called off-chain.
     *
     * See {ERC721AQueryable-tokensOfOwnerIn} for splitting the scan into
     * multiple smaller scans if the collection is large enough to cause
     * an out-of-gas error (10K collections should be fine).
     */
    function tokensOfOwner(address owner) external view virtual override returns (uint256[] memory) {
        unchecked {
            uint256 tokenIdsIdx;
            address currOwnershipAddr;
            uint256 tokenIdsLength = balanceOf(owner);
            uint256[] memory tokenIds = new uint256[](tokenIdsLength);
            TokenOwnership memory ownership;
            for (uint256 i = _startTokenId(); tokenIdsIdx != tokenIdsLength; ++i) {
                ownership = _ownershipAt(i);
                if (ownership.burned) {
                    continue;
                }
                if (ownership.addr != address(0)) {
                    currOwnershipAddr = ownership.addr;
                }
                if (currOwnershipAddr == owner) {
                    tokenIds[tokenIdsIdx++] = i;
                }
            }
            return tokenIds;
        }
    }
}

// File: anarchist.sol



pragma solidity ^0.8.4 .0;





//  ▄▄▄       ███▄    █  ▄▄▄       ██▀███   ▄████▄   ██░ ██  ██▓  ██████ ▄▄▄█████▓
// ▒████▄     ██ ▀█   █ ▒████▄    ▓██ ▒ ██▒▒██▀ ▀█  ▓██░ ██▒▓██▒▒██    ▒ ▓  ██▒ ▓▒
// ▒██  ▀█▄  ▓██  ▀█ ██▒▒██  ▀█▄  ▓██ ░▄█ ▒▒▓█    ▄ ▒██▀▀██░▒██▒░ ▓██▄   ▒ ▓██░ ▒░
// ░██▄▄▄▄██ ▓██▒  ▐▌██▒░██▄▄▄▄██ ▒██▀▀█▄  ▒▓▓▄ ▄██▒░▓█ ░██ ░██░  ▒   ██▒░ ▓██▓ ░
//  ▓█   ▓██▒▒██░   ▓██░ ▓█   ▓██▒░██▓ ▒██▒▒ ▓███▀ ░░▓█▒░██▓░██░▒██████▒▒  ▒██▒ ░
//  ▒▒   ▓▒█░░ ▒░   ▒ ▒  ▒▒   ▓▒█░░ ▒▓ ░▒▓░░ ░▒ ▒  ░ ▒ ░░▒░▒░▓  ▒ ▒▓▒ ▒ ░  ▒ ░░
//   ▒   ▒▒ ░░ ░░   ░ ▒░  ▒   ▒▒ ░  ░▒ ░ ▒░  ░  ▒    ▒ ░▒░ ░ ▒ ░░ ░▒  ░ ░    ░
//   ░   ▒      ░   ░ ░   ░   ▒     ░░   ░ ░         ░  ░░ ░ ▒ ░░  ░  ░    ░
//       ░  ░         ░       ░  ░   ░     ░ ░       ░  ░  ░ ░        ░
//                                         ░

/// @title ERC721A contract for the Anarchist NFT collection
/// @author Syahmi Rafsan
contract Anarchist is ERC721A, ERC721AQueryable, Ownable {
    uint256 public constant MAX_SUPPLY = 3333;
    uint256 public price = 0.0069 ether;
    string private _startTokenURI;
    string private _endTokenURI;
    bool public mintPaused = false;
    bool public whitelistMinting = true;
    bytes32 public merkleRoot;
    uint public maxFreeMint;
    mapping(address => uint) public userHasMinted;

    constructor(
        string memory startTokenURI,
        string memory endTokenURI,
        bytes32 _merkleRoot,
        uint _maxFreeMint
    ) ERC721A("Anarchist", "ANARC") {
        _startTokenURI = startTokenURI;
        _endTokenURI = endTokenURI;
        merkleRoot = _merkleRoot;
        maxFreeMint = _maxFreeMint;
    }

    /// @notice The NFT minting function for public
    /// @param quantity The number of NFT to be minted
    function mintPublic(uint256 quantity) external payable {
        require(msg.sender == tx.origin, "Minter is a contract");
        require(!mintPaused, "Mint is paused");
        require(!whitelistMinting, "Mint is only for whitelist");
        require(
            _totalMinted() + quantity <= MAX_SUPPLY,
            "Maximum supply exceeded"
        );

        uint cost;
        uint free;
        int balance = int(maxFreeMint) - int(userHasMinted[msg.sender]);
        if (balance < 0) {
            free = 0;
        } else {
            int freeCalc = int(maxFreeMint) - int(userHasMinted[msg.sender]);
            free = uint(freeCalc);
        }

        if (quantity >= free) {
            cost = (price) * (quantity - free);
            userHasMinted[msg.sender] = userHasMinted[msg.sender] + free;
        } else {
            cost = 0;
            userHasMinted[msg.sender] = userHasMinted[msg.sender] + quantity;
        }

        require(msg.value >= cost, "Must send enough eth");
        if (msg.value > cost) {
            payable(msg.sender).transfer(msg.value - cost);
        }

        _mint(msg.sender, quantity);
    }

    /// @notice The NFT minting function for whitelisted addresses
    /// @param quantity The number of NFT to be minted
    /// @param proof The Merkle proof to validate with the Merkle root
    function mintWhitelist(
        uint quantity,
        bytes32[] memory proof
    ) external payable {
        require(
            isValid(proof, keccak256(abi.encodePacked(msg.sender))),
            "Sorry but you are not eligible to mint"
        );
        require(msg.sender == tx.origin, "Minter is a contract");
        require(!mintPaused, "Mint is paused");
        require(whitelistMinting, "Mint is open to public");
        require(
            _totalMinted() + quantity <= MAX_SUPPLY,
            "Maximum supply exceeded"
        );

        uint cost;
        uint free;
        int balance = int(maxFreeMint) - int(userHasMinted[msg.sender]);
        if (balance < 0) {
            free = 0;
        } else {
            int freeCalc = int(maxFreeMint) - int(userHasMinted[msg.sender]);
            free = uint(freeCalc);
        }

        if (quantity >= free) {
            cost = (price) * (quantity - free);
            userHasMinted[msg.sender] = userHasMinted[msg.sender] + free;
        } else {
            cost = 0;
            userHasMinted[msg.sender] = userHasMinted[msg.sender] + quantity;
        }

        require(msg.value >= cost, "Must send enough eth");
        if (msg.value > cost) {
            payable(msg.sender).transfer(msg.value - cost);
        }

        _mint(msg.sender, quantity);
    }

    /// @notice The NFT minting function for owner. Callable only by the contract owner.
    /// @param receiver The address receiving the minted NFT
    /// @param quantity The number of NFT to be minted
    function mintOwner(
        address receiver,
        uint256 quantity
    ) external onlyOwner {
        require(
            _totalMinted() + quantity <= MAX_SUPPLY,
            "Maximum supply exceeded"
        );

        _mint(receiver, quantity);
    }

    /// @notice The function to change mint configuration. Callable only by the contract owner.
    /// @param _merkleRoot The Merkle root of the whitelisted addresses
    /// @param _maxFreeMint The maximum number of free mints per wallet
    function setMintConfig(
        bytes32 _merkleRoot,
        uint _maxFreeMint
    ) external onlyOwner {
        merkleRoot = _merkleRoot;
        maxFreeMint = _maxFreeMint;
    }

    /// @notice The function to validate the Merkle proof with the Merkle root via leaf
    /// @param proof The Merkle proof to be validated
    /// @param leaf The mint price in wei
    function isValid(
        bytes32[] memory proof,
        bytes32 leaf
    ) public view returns (bool) {
        return MerkleProof.verify(proof, merkleRoot, leaf);
    }

    /// @notice The function to check the free mint balance of the sender
    /// @param sender The address of sender
    function freeMintBalance(address sender) public view returns (int) {
        int balance = int(maxFreeMint) - int(userHasMinted[sender]);
        if (balance < 0) {
            return 0;
        } else {
            int free = int(maxFreeMint) - int(userHasMinted[sender]);
            return free;
        }
    }

    /// @notice The function to check the cost of minting by sender
    /// @param quantity The mint quantity
    /// @param sender The address of sender
    function senderCost(
        uint256 quantity,
        address sender
    ) public view returns (uint256) {
        uint256 cost;
        uint free;
        int balance = int(maxFreeMint) - int(userHasMinted[sender]);
        if (balance < 0) {
            free = 0;
        } else {
            int freeCalc = int(maxFreeMint) - int(userHasMinted[sender]);
            free = uint(freeCalc);
        }

        if (quantity >= free) {
            cost = (price) * (quantity - free);
        } else {
            cost = 0;
        }

        return cost;
    }

    /// @notice The function to withdraw the contract balance to the contract owner. Callable only by the contract owner.
    function withdraw() external onlyOwner {
        (bool success, ) = msg.sender.call{value: address(this).balance}("");
        require(success, "Transfer failed");
    }

    /// @notice The function to pause the mint. Callable only by the contract owner.
    function pauseMint(bool _paused) external onlyOwner {
        mintPaused = _paused;
    }

    /// @notice The function to change the mint price. Callable only by the contract owner.
    /// @param _price The mint price in wei
    function setPrice(uint256 _price) external onlyOwner {
        price = _price;
    }

    /// @notice The function to change the max free mint per wallet. Callable only by the contract owner.
    /// @param _maxFreeMint The maximum number of free mints per wallet
    function setMaxFreeMint(uint _maxFreeMint) external onlyOwner {
        maxFreeMint = _maxFreeMint;
    }

    /// @notice The function to set the whitelist minting variable. Callable only by the contract owner.
    function setWhitelistMinting(bool _state) external onlyOwner {
        whitelistMinting = _state;
    }

    /// @notice The function to change the prefix and suffix of the tokenURI. Callable only by the contract owner.
    function setURI(
        string calldata startTokenURI,
        string calldata endTokenURI
    ) external onlyOwner {
        _startTokenURI = startTokenURI;
        _endTokenURI = endTokenURI;
    }

    /// @notice Overiddes the ERC721A function to show the tokenURI.
    function tokenURI(
        uint256 tokenId
    ) public view virtual override(ERC721A, IERC721A) returns (string memory) {
        if (!_exists(tokenId)) revert URIQueryForNonexistentToken();
        return
            bytes(_startTokenURI).length != 0
                ? string(
                    abi.encodePacked(
                        _startTokenURI,
                        _toString(tokenId),
                        _endTokenURI
                    )
                )
                : "";
    }

    /// @notice Overiddes the ERC721A function to start tokenId at 1.
    function _startTokenId() internal view virtual override returns (uint256) {
        return 1;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"startTokenURI","type":"string"},{"internalType":"string","name":"endTokenURI","type":"string"},{"internalType":"bytes32","name":"_merkleRoot","type":"bytes32"},{"internalType":"uint256","name":"_maxFreeMint","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"InvalidQueryRange","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":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"explicitOwnershipOf","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"},{"internalType":"bool","name":"burned","type":"bool"},{"internalType":"uint24","name":"extraData","type":"uint24"}],"internalType":"struct IERC721A.TokenOwnership","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"explicitOwnershipsOf","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"},{"internalType":"bool","name":"burned","type":"bool"},{"internalType":"uint24","name":"extraData","type":"uint24"}],"internalType":"struct IERC721A.TokenOwnership[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"}],"name":"freeMintBalance","outputs":[{"internalType":"int256","name":"","type":"int256"}],"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":[{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"},{"internalType":"bytes32","name":"leaf","type":"bytes32"}],"name":"isValid","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxFreeMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"merkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"mintOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"mintPaused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"mintPublic","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"mintWhitelist","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_paused","type":"bool"}],"name":"pauseMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"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":"uint256","name":"quantity","type":"uint256"},{"internalType":"address","name":"sender","type":"address"}],"name":"senderCost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxFreeMint","type":"uint256"}],"name":"setMaxFreeMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_merkleRoot","type":"bytes32"},{"internalType":"uint256","name":"_maxFreeMint","type":"uint256"}],"name":"setMintConfig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"startTokenURI","type":"string"},{"internalType":"string","name":"endTokenURI","type":"string"}],"name":"setURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setWhitelistMinting","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":[{"internalType":"address","name":"owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"stop","type":"uint256"}],"name":"tokensOfOwnerIn","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":[{"internalType":"address","name":"","type":"address"}],"name":"userHasMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"whitelistMinting","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526618838370f34000600955600c805461ffff19166101001790553480156200002b57600080fd5b5060405162002b5d38038062002b5d8339810160408190526200004e9162000208565b60405180604001604052806009815260200168105b985c98da1a5cdd60ba1b81525060405180604001604052806005815260200164414e41524360d81b81525081600290816200009f919062000311565b506003620000ae828262000311565b5050600160005550620000c133620000f1565b600a620000cf858262000311565b50600b620000de848262000311565b50600d91909155600e5550620003dd9050565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126200016b57600080fd5b81516001600160401b038082111562000188576200018862000143565b604051601f8301601f19908116603f01168101908282118183101715620001b357620001b362000143565b81604052838152602092508683858801011115620001d057600080fd5b600091505b83821015620001f45785820183015181830184015290820190620001d5565b600093810190920192909252949350505050565b600080600080608085870312156200021f57600080fd5b84516001600160401b03808211156200023757600080fd5b620002458883890162000159565b955060208701519150808211156200025c57600080fd5b506200026b8782880162000159565b604087015160609097015195989097509350505050565b600181811c908216806200029757607f821691505b602082108103620002b857634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200030c57600081815260208120601f850160051c81016020861015620002e75750805b601f850160051c820191505b818110156200030857828155600101620002f3565b5050505b505050565b81516001600160401b038111156200032d576200032d62000143565b62000345816200033e845462000282565b84620002be565b602080601f8311600181146200037d5760008415620003645750858301515b600019600386901b1c1916600185901b17855562000308565b600085815260208120601f198616915b82811015620003ae578886015182559484019460019091019084016200038d565b5085821015620003cd5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b61277080620003ed6000396000f3fe6080604052600436106102465760003560e01c80638462151c11610139578063b8af7ac3116100b6578063d1d18f501161007a578063d1d18f5014610684578063e985e9c5146106a4578063eba2c6c4146106ed578063efd0cbf91461070d578063f2fde38b14610720578063f30e6e771461074057600080fd5b8063b8af7ac3146105d7578063bf2db4c8146105f7578063c23dc68f14610617578063c40542ec14610644578063c87b56dd1461066457600080fd5b8063a035b1fe116100fd578063a035b1fe14610558578063a22cb4651461056e578063a591252d1461058e578063b88d4fde146105a4578063b8a20ed0146105b757600080fd5b80638462151c146104b85780638da5cb5b146104e557806391b7f5ed1461050357806395d89b411461052357806399a2557a1461053857600080fd5b80633ccfd60b116101c75780636992d2291161018b5780636992d2291461042a57806370a0823114610449578063715018a614610469578063742a4c9b1461047e5780637e4831d31461049e57600080fd5b80633ccfd60b14610395578063408cbf94146103aa57806342842e0e146103ca5780635bbb2177146103dd5780636352211e1461040a57600080fd5b806318160ddd1161020e57806318160ddd146103025780631d9857781461032957806323b872dd146103565780632eb4a7ab1461036957806332cb6b0c1461037f57600080fd5b806301ffc9a71461024b578063061431a81461028057806306fdde0314610295578063081812fc146102b7578063095ea7b3146102ef575b600080fd5b34801561025757600080fd5b5061026b610266366004611dfd565b610760565b60405190151581526020015b60405180910390f35b61029361028e366004611edf565b6107b2565b005b3480156102a157600080fd5b506102aa610ad2565b6040516102779190611f75565b3480156102c357600080fd5b506102d76102d2366004611f88565b610b64565b6040516001600160a01b039091168152602001610277565b6102936102fd366004611fbd565b610ba8565b34801561030e57600080fd5b5060015460005403600019015b604051908152602001610277565b34801561033557600080fd5b5061031b610344366004611fe7565b600f6020526000908152604090205481565b610293610364366004612002565b610c48565b34801561037557600080fd5b5061031b600d5481565b34801561038b57600080fd5b5061031b610d0581565b3480156103a157600080fd5b50610293610de1565b3480156103b657600080fd5b506102936103c5366004611fbd565b610e76565b6102936103d8366004612002565b610ec5565b3480156103e957600080fd5b506103fd6103f836600461203e565b610ee5565b60405161027791906120ee565b34801561041657600080fd5b506102d7610425366004611f88565b610fb0565b34801561043657600080fd5b50600c5461026b90610100900460ff1681565b34801561045557600080fd5b5061031b610464366004611fe7565b610fbb565b34801561047557600080fd5b50610293611009565b34801561048a57600080fd5b50610293610499366004611f88565b61101d565b3480156104aa57600080fd5b50600c5461026b9060ff1681565b3480156104c457600080fd5b506104d86104d3366004611fe7565b61102a565b6040516102779190612130565b3480156104f157600080fd5b506008546001600160a01b03166102d7565b34801561050f57600080fd5b5061029361051e366004611f88565b611132565b34801561052f57600080fd5b506102aa61113f565b34801561054457600080fd5b506104d8610553366004612168565b61114e565b34801561056457600080fd5b5061031b60095481565b34801561057a57600080fd5b506102936105893660046121ab565b6112d5565b34801561059a57600080fd5b5061031b600e5481565b6102936105b23660046121de565b611341565b3480156105c357600080fd5b5061026b6105d236600461229d565b61138b565b3480156105e357600080fd5b5061031b6105f23660046122e1565b61139a565b34801561060357600080fd5b5061029361061236600461234c565b611437565b34801561062357600080fd5b50610637610632366004611f88565b61145a565b60405161027791906123b7565b34801561065057600080fd5b5061029361065f3660046123c5565b6114e2565b34801561067057600080fd5b506102aa61067f366004611f88565b611504565b34801561069057600080fd5b5061031b61069f366004611fe7565b61158b565b3480156106b057600080fd5b5061026b6106bf3660046123e0565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b3480156106f957600080fd5b5061029361070836600461240a565b6115fa565b61029361071b366004611f88565b61160d565b34801561072c57600080fd5b5061029361073b366004611fe7565b61188f565b34801561074c57600080fd5b5061029361075b3660046123c5565b611905565b60006301ffc9a760e01b6001600160e01b03198316148061079157506380ac58cd60e01b6001600160e01b03198316145b806107ac5750635b5e139f60e01b6001600160e01b03198316145b92915050565b6040516bffffffffffffffffffffffff193360601b1660208201526107f19082906034016040516020818303038152906040528051906020012061138b565b6108515760405162461bcd60e51b815260206004820152602660248201527f536f7272792062757420796f7520617265206e6f7420656c696769626c6520746044820152651bc81b5a5b9d60d21b60648201526084015b60405180910390fd5b3332146108975760405162461bcd60e51b8152602060048201526014602482015273135a5b9d195c881a5cc8184818dbdb9d1c9858dd60621b6044820152606401610848565b600c5460ff16156108db5760405162461bcd60e51b815260206004820152600e60248201526d135a5b9d081a5cc81c185d5cd95960921b6044820152606401610848565b600c54610100900460ff1661092b5760405162461bcd60e51b81526020600482015260166024820152754d696e74206973206f70656e20746f207075626c696360501b6044820152606401610848565b610d058261093c6000546000190190565b6109469190612442565b11156109645760405162461bcd60e51b815260040161084890612455565b336000908152600f6020526040812054600e5482918291610985919061248c565b9050600081121561099957600091506109ba565b336000908152600f6020526040812054600e546109b6919061248c565b9250505b818510610a0b576109cb82866124b3565b6009546109d891906124c6565b336000908152600f60205260409020549093506109f6908390612442565b336000908152600f6020526040902055610a3a565b336000908152600f6020526040812054909350610a29908690612442565b336000908152600f60205260409020555b82341015610a815760405162461bcd60e51b815260206004820152601460248201527309aeae6e840e6cadcc840cadcdeeaced040cae8d60631b6044820152606401610848565b82341115610ac157336108fc610a9785346124b3565b6040518115909202916000818181858888f19350505050158015610abf573d6000803e3d6000fd5b505b610acb3386611920565b5050505050565b606060028054610ae1906124dd565b80601f0160208091040260200160405190810160405280929190818152602001828054610b0d906124dd565b8015610b5a5780601f10610b2f57610100808354040283529160200191610b5a565b820191906000526020600020905b815481529060010190602001808311610b3d57829003601f168201915b5050505050905090565b6000610b6f82611a1e565b610b8c576040516333d1c03960e21b815260040160405180910390fd5b506000908152600660205260409020546001600160a01b031690565b6000610bb382610fb0565b9050336001600160a01b03821614610bec57610bcf81336106bf565b610bec576040516367d9dca160e11b815260040160405180910390fd5b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6000610c5382611a53565b9050836001600160a01b0316816001600160a01b031614610c865760405162a1148160e81b815260040160405180910390fd5b60008281526006602052604090208054338082146001600160a01b03881690911417610cd357610cb686336106bf565b610cd357604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b038516610cfa57604051633a954ecd60e21b815260040160405180910390fd5b8015610d0557600082555b6001600160a01b038681166000908152600560205260408082208054600019019055918716808252919020805460010190554260a01b17600160e11b17600085815260046020526040812091909155600160e11b84169003610d9757600184016000818152600460205260408120549003610d95576000548114610d955760008181526004602052604090208490555b505b83856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b505050505050565b610de9611ac2565b604051600090339047908381818185875af1925050503d8060008114610e2b576040519150601f19603f3d011682016040523d82523d6000602084013e610e30565b606091505b5050905080610e735760405162461bcd60e51b815260206004820152600f60248201526e151c985b9cd9995c8819985a5b1959608a1b6044820152606401610848565b50565b610e7e611ac2565b610d0581610e8f6000546000190190565b610e999190612442565b1115610eb75760405162461bcd60e51b815260040161084890612455565b610ec18282611920565b5050565b610ee083838360405180602001604052806000815250611341565b505050565b6060816000816001600160401b03811115610f0257610f02611e1a565b604051908082528060200260200182016040528015610f5457816020015b604080516080810182526000808252602080830182905292820181905260608201528252600019909201910181610f205790505b50905060005b828114610fa757610f82868683818110610f7657610f76612511565b9050602002013561145a565b828281518110610f9457610f94612511565b6020908102919091010152600101610f5a565b50949350505050565b60006107ac82611a53565b60006001600160a01b038216610fe4576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b03166000908152600560205260409020546001600160401b031690565b611011611ac2565b61101b6000611b1c565b565b611025611ac2565b600e55565b6060600080600061103a85610fbb565b90506000816001600160401b0381111561105657611056611e1a565b60405190808252806020026020018201604052801561107f578160200160208202803683370190505b5090506110ac60408051608081018252600080825260208201819052918101829052606081019190915290565b60015b838614611126576110bf81611b6e565b9150816040015161111e5781516001600160a01b0316156110df57815194505b876001600160a01b0316856001600160a01b03160361111e578083878060010198508151811061111157611111612511565b6020026020010181815250505b6001016110af565b50909695505050505050565b61113a611ac2565b600955565b606060038054610ae1906124dd565b606081831061117057604051631960ccad60e11b815260040160405180910390fd5b60008061117c60005490565b9050600185101561118c57600194505b80841115611198578093505b60006111a387610fbb565b9050848610156111c257858503818110156111bc578091505b506111c6565b5060005b6000816001600160401b038111156111e0576111e0611e1a565b604051908082528060200260200182016040528015611209578160200160208202803683370190505b5090508160000361121f5793506112ce92505050565b600061122a8861145a565b90506000816040015161123b575080515b885b88811415801561124d5750848714155b156112c25761125b81611b6e565b925082604001516112ba5782516001600160a01b03161561127b57825191505b8a6001600160a01b0316826001600160a01b0316036112ba57808488806001019950815181106112ad576112ad612511565b6020026020010181815250505b60010161123d565b50505092835250909150505b9392505050565b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b61134c848484610c48565b6001600160a01b0383163b156113855761136884848484611baa565b611385576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b60006112ce83600d5484611c95565b6001600160a01b0381166000908152600f6020526040812054600e548291829182916113c59161248c565b905060008112156113d95760009150611403565b6001600160a01b0385166000908152600f6020526040812054600e546113ff919061248c565b9250505b8186106114285761141482876124b3565b60095461142191906124c6565b925061142d565b600092505b5090949350505050565b61143f611ac2565b600a61144c84868361256d565b50600b610acb82848361256d565b60408051608081018252600080825260208201819052918101829052606081019190915260408051608081018252600080825260208201819052918101829052606081019190915260018310806114b357506000548310155b156114be5792915050565b6114c783611b6e565b90508060400151156114d95792915050565b6112ce83611cab565b6114ea611ac2565b600c80549115156101000261ff0019909216919091179055565b606061150f82611a1e565b61152c57604051630a14c4b560e41b815260040160405180910390fd5b600a8054611539906124dd565b905060000361155757604051806020016040528060008152506107ac565b600a61156283611ce0565b600b6040516020016115769392919061269f565b60405160208183030381529060405292915050565b6001600160a01b0381166000908152600f6020526040812054600e5482916115b29161248c565b905060008112156115c65750600092915050565b6001600160a01b0383166000908152600f6020526040812054600e546115ec919061248c565b949350505050565b50919050565b611602611ac2565b600d91909155600e55565b3332146116535760405162461bcd60e51b8152602060048201526014602482015273135a5b9d195c881a5cc8184818dbdb9d1c9858dd60621b6044820152606401610848565b600c5460ff16156116975760405162461bcd60e51b815260206004820152600e60248201526d135a5b9d081a5cc81c185d5cd95960921b6044820152606401610848565b600c54610100900460ff16156116ef5760405162461bcd60e51b815260206004820152601a60248201527f4d696e74206973206f6e6c7920666f722077686974656c6973740000000000006044820152606401610848565b610d05816117006000546000190190565b61170a9190612442565b11156117285760405162461bcd60e51b815260040161084890612455565b336000908152600f6020526040812054600e5482918291611749919061248c565b9050600081121561175d576000915061177e565b336000908152600f6020526040812054600e5461177a919061248c565b9250505b8184106117cf5761178f82856124b3565b60095461179c91906124c6565b336000908152600f60205260409020549093506117ba908390612442565b336000908152600f60205260409020556117fe565b336000908152600f60205260408120549093506117ed908590612442565b336000908152600f60205260409020555b823410156118455760405162461bcd60e51b815260206004820152601460248201527309aeae6e840e6cadcc840cadcdeeaced040cae8d60631b6044820152606401610848565b8234111561188557336108fc61185b85346124b3565b6040518115909202916000818181858888f19350505050158015611883573d6000803e3d6000fd5b505b6113853385611920565b611897611ac2565b6001600160a01b0381166118fc5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610848565b610e7381611b1c565b61190d611ac2565b600c805460ff1916911515919091179055565b60008054908290036119455760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b03831660008181526005602090815260408083208054680100000000000000018802019055848352600490915281206001851460e11b4260a01b178317905582840190839083907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8180a4600183015b8181146119f457808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a46001016119bc565b5081600003611a1557604051622e076360e81b815260040160405180910390fd5b60005550505050565b600081600111158015611a32575060005482105b80156107ac575050600090815260046020526040902054600160e01b161590565b60008180600111611aa957600054811015611aa95760008181526004602052604081205490600160e01b82169003611aa7575b806000036112ce575060001901600081815260046020526040902054611a86565b505b604051636f96cda160e11b815260040160405180910390fd5b6008546001600160a01b0316331461101b5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610848565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6040805160808101825260008082526020820181905291810182905260608101919091526000828152600460205260409020546107ac90611d24565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a0290611bdf9033908990889088906004016126c7565b6020604051808303816000875af1925050508015611c1a575060408051601f3d908101601f19168201909252611c1791810190612704565b60015b611c78573d808015611c48576040519150601f19603f3d011682016040523d82523d6000602084013e611c4d565b606091505b508051600003611c70576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050949350505050565b600082611ca28584611d6b565b14949350505050565b6040805160808101825260008082526020820181905291810182905260608101919091526107ac611cdb83611a53565b611d24565b606060a06040510180604052602081039150506000815280825b600183039250600a81066030018353600a900480611cfa5750819003601f19909101908152919050565b604080516080810182526001600160a01b038316815260a083901c6001600160401b03166020820152600160e01b831615159181019190915260e89190911c606082015290565b600081815b8451811015611db057611d9c82868381518110611d8f57611d8f612511565b6020026020010151611db8565b915080611da881612721565b915050611d70565b509392505050565b6000818310611dd45760008281526020849052604090206112ce565b60008381526020839052604090206112ce565b6001600160e01b031981168114610e7357600080fd5b600060208284031215611e0f57600080fd5b81356112ce81611de7565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715611e5857611e58611e1a565b604052919050565b600082601f830112611e7157600080fd5b813560206001600160401b03821115611e8c57611e8c611e1a565b8160051b611e9b828201611e30565b9283528481018201928281019087851115611eb557600080fd5b83870192505b84831015611ed457823582529183019190830190611ebb565b979650505050505050565b60008060408385031215611ef257600080fd5b8235915060208301356001600160401b03811115611f0f57600080fd5b611f1b85828601611e60565b9150509250929050565b60005b83811015611f40578181015183820152602001611f28565b50506000910152565b60008151808452611f61816020860160208601611f25565b601f01601f19169290920160200192915050565b6020815260006112ce6020830184611f49565b600060208284031215611f9a57600080fd5b5035919050565b80356001600160a01b0381168114611fb857600080fd5b919050565b60008060408385031215611fd057600080fd5b611fd983611fa1565b946020939093013593505050565b600060208284031215611ff957600080fd5b6112ce82611fa1565b60008060006060848603121561201757600080fd5b61202084611fa1565b925061202e60208501611fa1565b9150604084013590509250925092565b6000806020838503121561205157600080fd5b82356001600160401b038082111561206857600080fd5b818501915085601f83011261207c57600080fd5b81358181111561208b57600080fd5b8660208260051b85010111156120a057600080fd5b60209290920196919550909350505050565b80516001600160a01b031682526020808201516001600160401b03169083015260408082015115159083015260609081015162ffffff16910152565b6020808252825182820181905260009190848201906040850190845b818110156111265761211d8385516120b2565b928401926080929092019160010161210a565b6020808252825182820181905260009190848201906040850190845b818110156111265783518352928401929184019160010161214c565b60008060006060848603121561217d57600080fd5b61218684611fa1565b95602085013595506040909401359392505050565b80358015158114611fb857600080fd5b600080604083850312156121be57600080fd5b6121c783611fa1565b91506121d56020840161219b565b90509250929050565b600080600080608085870312156121f457600080fd5b6121fd85611fa1565b9350602061220c818701611fa1565b93506040860135925060608601356001600160401b038082111561222f57600080fd5b818801915088601f83011261224357600080fd5b81358181111561225557612255611e1a565b612267601f8201601f19168501611e30565b9150808252898482850101111561227d57600080fd5b808484018584013760008482840101525080935050505092959194509250565b600080604083850312156122b057600080fd5b82356001600160401b038111156122c657600080fd5b6122d285828601611e60565b95602094909401359450505050565b600080604083850312156122f457600080fd5b823591506121d560208401611fa1565b60008083601f84011261231657600080fd5b5081356001600160401b0381111561232d57600080fd5b60208301915083602082850101111561234557600080fd5b9250929050565b6000806000806040858703121561236257600080fd5b84356001600160401b038082111561237957600080fd5b61238588838901612304565b9096509450602087013591508082111561239e57600080fd5b506123ab87828801612304565b95989497509550505050565b608081016107ac82846120b2565b6000602082840312156123d757600080fd5b6112ce8261219b565b600080604083850312156123f357600080fd5b6123fc83611fa1565b91506121d560208401611fa1565b6000806040838503121561241d57600080fd5b50508035926020909101359150565b634e487b7160e01b600052601160045260246000fd5b808201808211156107ac576107ac61242c565b60208082526017908201527f4d6178696d756d20737570706c79206578636565646564000000000000000000604082015260600190565b81810360008312801583831316838312821617156124ac576124ac61242c565b5092915050565b818103818111156107ac576107ac61242c565b80820281158282048414176107ac576107ac61242c565b600181811c908216806124f157607f821691505b6020821081036115f457634e487b7160e01b600052602260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b601f821115610ee057600081815260208120601f850160051c8101602086101561254e5750805b601f850160051c820191505b81811015610dd95782815560010161255a565b6001600160401b0383111561258457612584611e1a565b6125988361259283546124dd565b83612527565b6000601f8411600181146125cc57600085156125b45750838201355b600019600387901b1c1916600186901b178355610acb565b600083815260209020601f19861690835b828110156125fd57868501358255602094850194600190920191016125dd565b508682101561261a5760001960f88860031b161c19848701351681555b505060018560011b0183555050505050565b60008154612639816124dd565b60018281168015612651576001811461266657612695565b60ff1984168752821515830287019450612695565b8560005260208060002060005b8581101561268c5781548a820152908401908201612673565b50505082870194505b5050505092915050565b60006126ab828661262c565b84516126bb818360208901611f25565b611ed48183018661262c565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906126fa90830184611f49565b9695505050505050565b60006020828403121561271657600080fd5b81516112ce81611de7565b6000600182016127335761273361242c565b506001019056fea264697066735822122041b1702c5df631ac3ba84f8f77048fe976851c53c40a607e05796fdc0f5ce38864736f6c634300081200330000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000010057ff5b81ab0b224013be394efc3cca92f1a84910fc258cdc8dbf0ea30afe6faf00000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000043697066733a2f2f62616679626569616b37766f7934697a7a6278616f3470616c3464643670706664676564717a61326132617561757469687a6b686a6c78346561612f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000052e6a736f6e000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x6080604052600436106102465760003560e01c80638462151c11610139578063b8af7ac3116100b6578063d1d18f501161007a578063d1d18f5014610684578063e985e9c5146106a4578063eba2c6c4146106ed578063efd0cbf91461070d578063f2fde38b14610720578063f30e6e771461074057600080fd5b8063b8af7ac3146105d7578063bf2db4c8146105f7578063c23dc68f14610617578063c40542ec14610644578063c87b56dd1461066457600080fd5b8063a035b1fe116100fd578063a035b1fe14610558578063a22cb4651461056e578063a591252d1461058e578063b88d4fde146105a4578063b8a20ed0146105b757600080fd5b80638462151c146104b85780638da5cb5b146104e557806391b7f5ed1461050357806395d89b411461052357806399a2557a1461053857600080fd5b80633ccfd60b116101c75780636992d2291161018b5780636992d2291461042a57806370a0823114610449578063715018a614610469578063742a4c9b1461047e5780637e4831d31461049e57600080fd5b80633ccfd60b14610395578063408cbf94146103aa57806342842e0e146103ca5780635bbb2177146103dd5780636352211e1461040a57600080fd5b806318160ddd1161020e57806318160ddd146103025780631d9857781461032957806323b872dd146103565780632eb4a7ab1461036957806332cb6b0c1461037f57600080fd5b806301ffc9a71461024b578063061431a81461028057806306fdde0314610295578063081812fc146102b7578063095ea7b3146102ef575b600080fd5b34801561025757600080fd5b5061026b610266366004611dfd565b610760565b60405190151581526020015b60405180910390f35b61029361028e366004611edf565b6107b2565b005b3480156102a157600080fd5b506102aa610ad2565b6040516102779190611f75565b3480156102c357600080fd5b506102d76102d2366004611f88565b610b64565b6040516001600160a01b039091168152602001610277565b6102936102fd366004611fbd565b610ba8565b34801561030e57600080fd5b5060015460005403600019015b604051908152602001610277565b34801561033557600080fd5b5061031b610344366004611fe7565b600f6020526000908152604090205481565b610293610364366004612002565b610c48565b34801561037557600080fd5b5061031b600d5481565b34801561038b57600080fd5b5061031b610d0581565b3480156103a157600080fd5b50610293610de1565b3480156103b657600080fd5b506102936103c5366004611fbd565b610e76565b6102936103d8366004612002565b610ec5565b3480156103e957600080fd5b506103fd6103f836600461203e565b610ee5565b60405161027791906120ee565b34801561041657600080fd5b506102d7610425366004611f88565b610fb0565b34801561043657600080fd5b50600c5461026b90610100900460ff1681565b34801561045557600080fd5b5061031b610464366004611fe7565b610fbb565b34801561047557600080fd5b50610293611009565b34801561048a57600080fd5b50610293610499366004611f88565b61101d565b3480156104aa57600080fd5b50600c5461026b9060ff1681565b3480156104c457600080fd5b506104d86104d3366004611fe7565b61102a565b6040516102779190612130565b3480156104f157600080fd5b506008546001600160a01b03166102d7565b34801561050f57600080fd5b5061029361051e366004611f88565b611132565b34801561052f57600080fd5b506102aa61113f565b34801561054457600080fd5b506104d8610553366004612168565b61114e565b34801561056457600080fd5b5061031b60095481565b34801561057a57600080fd5b506102936105893660046121ab565b6112d5565b34801561059a57600080fd5b5061031b600e5481565b6102936105b23660046121de565b611341565b3480156105c357600080fd5b5061026b6105d236600461229d565b61138b565b3480156105e357600080fd5b5061031b6105f23660046122e1565b61139a565b34801561060357600080fd5b5061029361061236600461234c565b611437565b34801561062357600080fd5b50610637610632366004611f88565b61145a565b60405161027791906123b7565b34801561065057600080fd5b5061029361065f3660046123c5565b6114e2565b34801561067057600080fd5b506102aa61067f366004611f88565b611504565b34801561069057600080fd5b5061031b61069f366004611fe7565b61158b565b3480156106b057600080fd5b5061026b6106bf3660046123e0565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b3480156106f957600080fd5b5061029361070836600461240a565b6115fa565b61029361071b366004611f88565b61160d565b34801561072c57600080fd5b5061029361073b366004611fe7565b61188f565b34801561074c57600080fd5b5061029361075b3660046123c5565b611905565b60006301ffc9a760e01b6001600160e01b03198316148061079157506380ac58cd60e01b6001600160e01b03198316145b806107ac5750635b5e139f60e01b6001600160e01b03198316145b92915050565b6040516bffffffffffffffffffffffff193360601b1660208201526107f19082906034016040516020818303038152906040528051906020012061138b565b6108515760405162461bcd60e51b815260206004820152602660248201527f536f7272792062757420796f7520617265206e6f7420656c696769626c6520746044820152651bc81b5a5b9d60d21b60648201526084015b60405180910390fd5b3332146108975760405162461bcd60e51b8152602060048201526014602482015273135a5b9d195c881a5cc8184818dbdb9d1c9858dd60621b6044820152606401610848565b600c5460ff16156108db5760405162461bcd60e51b815260206004820152600e60248201526d135a5b9d081a5cc81c185d5cd95960921b6044820152606401610848565b600c54610100900460ff1661092b5760405162461bcd60e51b81526020600482015260166024820152754d696e74206973206f70656e20746f207075626c696360501b6044820152606401610848565b610d058261093c6000546000190190565b6109469190612442565b11156109645760405162461bcd60e51b815260040161084890612455565b336000908152600f6020526040812054600e5482918291610985919061248c565b9050600081121561099957600091506109ba565b336000908152600f6020526040812054600e546109b6919061248c565b9250505b818510610a0b576109cb82866124b3565b6009546109d891906124c6565b336000908152600f60205260409020549093506109f6908390612442565b336000908152600f6020526040902055610a3a565b336000908152600f6020526040812054909350610a29908690612442565b336000908152600f60205260409020555b82341015610a815760405162461bcd60e51b815260206004820152601460248201527309aeae6e840e6cadcc840cadcdeeaced040cae8d60631b6044820152606401610848565b82341115610ac157336108fc610a9785346124b3565b6040518115909202916000818181858888f19350505050158015610abf573d6000803e3d6000fd5b505b610acb3386611920565b5050505050565b606060028054610ae1906124dd565b80601f0160208091040260200160405190810160405280929190818152602001828054610b0d906124dd565b8015610b5a5780601f10610b2f57610100808354040283529160200191610b5a565b820191906000526020600020905b815481529060010190602001808311610b3d57829003601f168201915b5050505050905090565b6000610b6f82611a1e565b610b8c576040516333d1c03960e21b815260040160405180910390fd5b506000908152600660205260409020546001600160a01b031690565b6000610bb382610fb0565b9050336001600160a01b03821614610bec57610bcf81336106bf565b610bec576040516367d9dca160e11b815260040160405180910390fd5b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6000610c5382611a53565b9050836001600160a01b0316816001600160a01b031614610c865760405162a1148160e81b815260040160405180910390fd5b60008281526006602052604090208054338082146001600160a01b03881690911417610cd357610cb686336106bf565b610cd357604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b038516610cfa57604051633a954ecd60e21b815260040160405180910390fd5b8015610d0557600082555b6001600160a01b038681166000908152600560205260408082208054600019019055918716808252919020805460010190554260a01b17600160e11b17600085815260046020526040812091909155600160e11b84169003610d9757600184016000818152600460205260408120549003610d95576000548114610d955760008181526004602052604090208490555b505b83856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b505050505050565b610de9611ac2565b604051600090339047908381818185875af1925050503d8060008114610e2b576040519150601f19603f3d011682016040523d82523d6000602084013e610e30565b606091505b5050905080610e735760405162461bcd60e51b815260206004820152600f60248201526e151c985b9cd9995c8819985a5b1959608a1b6044820152606401610848565b50565b610e7e611ac2565b610d0581610e8f6000546000190190565b610e999190612442565b1115610eb75760405162461bcd60e51b815260040161084890612455565b610ec18282611920565b5050565b610ee083838360405180602001604052806000815250611341565b505050565b6060816000816001600160401b03811115610f0257610f02611e1a565b604051908082528060200260200182016040528015610f5457816020015b604080516080810182526000808252602080830182905292820181905260608201528252600019909201910181610f205790505b50905060005b828114610fa757610f82868683818110610f7657610f76612511565b9050602002013561145a565b828281518110610f9457610f94612511565b6020908102919091010152600101610f5a565b50949350505050565b60006107ac82611a53565b60006001600160a01b038216610fe4576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b03166000908152600560205260409020546001600160401b031690565b611011611ac2565b61101b6000611b1c565b565b611025611ac2565b600e55565b6060600080600061103a85610fbb565b90506000816001600160401b0381111561105657611056611e1a565b60405190808252806020026020018201604052801561107f578160200160208202803683370190505b5090506110ac60408051608081018252600080825260208201819052918101829052606081019190915290565b60015b838614611126576110bf81611b6e565b9150816040015161111e5781516001600160a01b0316156110df57815194505b876001600160a01b0316856001600160a01b03160361111e578083878060010198508151811061111157611111612511565b6020026020010181815250505b6001016110af565b50909695505050505050565b61113a611ac2565b600955565b606060038054610ae1906124dd565b606081831061117057604051631960ccad60e11b815260040160405180910390fd5b60008061117c60005490565b9050600185101561118c57600194505b80841115611198578093505b60006111a387610fbb565b9050848610156111c257858503818110156111bc578091505b506111c6565b5060005b6000816001600160401b038111156111e0576111e0611e1a565b604051908082528060200260200182016040528015611209578160200160208202803683370190505b5090508160000361121f5793506112ce92505050565b600061122a8861145a565b90506000816040015161123b575080515b885b88811415801561124d5750848714155b156112c25761125b81611b6e565b925082604001516112ba5782516001600160a01b03161561127b57825191505b8a6001600160a01b0316826001600160a01b0316036112ba57808488806001019950815181106112ad576112ad612511565b6020026020010181815250505b60010161123d565b50505092835250909150505b9392505050565b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b61134c848484610c48565b6001600160a01b0383163b156113855761136884848484611baa565b611385576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b60006112ce83600d5484611c95565b6001600160a01b0381166000908152600f6020526040812054600e548291829182916113c59161248c565b905060008112156113d95760009150611403565b6001600160a01b0385166000908152600f6020526040812054600e546113ff919061248c565b9250505b8186106114285761141482876124b3565b60095461142191906124c6565b925061142d565b600092505b5090949350505050565b61143f611ac2565b600a61144c84868361256d565b50600b610acb82848361256d565b60408051608081018252600080825260208201819052918101829052606081019190915260408051608081018252600080825260208201819052918101829052606081019190915260018310806114b357506000548310155b156114be5792915050565b6114c783611b6e565b90508060400151156114d95792915050565b6112ce83611cab565b6114ea611ac2565b600c80549115156101000261ff0019909216919091179055565b606061150f82611a1e565b61152c57604051630a14c4b560e41b815260040160405180910390fd5b600a8054611539906124dd565b905060000361155757604051806020016040528060008152506107ac565b600a61156283611ce0565b600b6040516020016115769392919061269f565b60405160208183030381529060405292915050565b6001600160a01b0381166000908152600f6020526040812054600e5482916115b29161248c565b905060008112156115c65750600092915050565b6001600160a01b0383166000908152600f6020526040812054600e546115ec919061248c565b949350505050565b50919050565b611602611ac2565b600d91909155600e55565b3332146116535760405162461bcd60e51b8152602060048201526014602482015273135a5b9d195c881a5cc8184818dbdb9d1c9858dd60621b6044820152606401610848565b600c5460ff16156116975760405162461bcd60e51b815260206004820152600e60248201526d135a5b9d081a5cc81c185d5cd95960921b6044820152606401610848565b600c54610100900460ff16156116ef5760405162461bcd60e51b815260206004820152601a60248201527f4d696e74206973206f6e6c7920666f722077686974656c6973740000000000006044820152606401610848565b610d05816117006000546000190190565b61170a9190612442565b11156117285760405162461bcd60e51b815260040161084890612455565b336000908152600f6020526040812054600e5482918291611749919061248c565b9050600081121561175d576000915061177e565b336000908152600f6020526040812054600e5461177a919061248c565b9250505b8184106117cf5761178f82856124b3565b60095461179c91906124c6565b336000908152600f60205260409020549093506117ba908390612442565b336000908152600f60205260409020556117fe565b336000908152600f60205260408120549093506117ed908590612442565b336000908152600f60205260409020555b823410156118455760405162461bcd60e51b815260206004820152601460248201527309aeae6e840e6cadcc840cadcdeeaced040cae8d60631b6044820152606401610848565b8234111561188557336108fc61185b85346124b3565b6040518115909202916000818181858888f19350505050158015611883573d6000803e3d6000fd5b505b6113853385611920565b611897611ac2565b6001600160a01b0381166118fc5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610848565b610e7381611b1c565b61190d611ac2565b600c805460ff1916911515919091179055565b60008054908290036119455760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b03831660008181526005602090815260408083208054680100000000000000018802019055848352600490915281206001851460e11b4260a01b178317905582840190839083907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8180a4600183015b8181146119f457808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a46001016119bc565b5081600003611a1557604051622e076360e81b815260040160405180910390fd5b60005550505050565b600081600111158015611a32575060005482105b80156107ac575050600090815260046020526040902054600160e01b161590565b60008180600111611aa957600054811015611aa95760008181526004602052604081205490600160e01b82169003611aa7575b806000036112ce575060001901600081815260046020526040902054611a86565b505b604051636f96cda160e11b815260040160405180910390fd5b6008546001600160a01b0316331461101b5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610848565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6040805160808101825260008082526020820181905291810182905260608101919091526000828152600460205260409020546107ac90611d24565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a0290611bdf9033908990889088906004016126c7565b6020604051808303816000875af1925050508015611c1a575060408051601f3d908101601f19168201909252611c1791810190612704565b60015b611c78573d808015611c48576040519150601f19603f3d011682016040523d82523d6000602084013e611c4d565b606091505b508051600003611c70576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050949350505050565b600082611ca28584611d6b565b14949350505050565b6040805160808101825260008082526020820181905291810182905260608101919091526107ac611cdb83611a53565b611d24565b606060a06040510180604052602081039150506000815280825b600183039250600a81066030018353600a900480611cfa5750819003601f19909101908152919050565b604080516080810182526001600160a01b038316815260a083901c6001600160401b03166020820152600160e01b831615159181019190915260e89190911c606082015290565b600081815b8451811015611db057611d9c82868381518110611d8f57611d8f612511565b6020026020010151611db8565b915080611da881612721565b915050611d70565b509392505050565b6000818310611dd45760008281526020849052604090206112ce565b60008381526020839052604090206112ce565b6001600160e01b031981168114610e7357600080fd5b600060208284031215611e0f57600080fd5b81356112ce81611de7565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715611e5857611e58611e1a565b604052919050565b600082601f830112611e7157600080fd5b813560206001600160401b03821115611e8c57611e8c611e1a565b8160051b611e9b828201611e30565b9283528481018201928281019087851115611eb557600080fd5b83870192505b84831015611ed457823582529183019190830190611ebb565b979650505050505050565b60008060408385031215611ef257600080fd5b8235915060208301356001600160401b03811115611f0f57600080fd5b611f1b85828601611e60565b9150509250929050565b60005b83811015611f40578181015183820152602001611f28565b50506000910152565b60008151808452611f61816020860160208601611f25565b601f01601f19169290920160200192915050565b6020815260006112ce6020830184611f49565b600060208284031215611f9a57600080fd5b5035919050565b80356001600160a01b0381168114611fb857600080fd5b919050565b60008060408385031215611fd057600080fd5b611fd983611fa1565b946020939093013593505050565b600060208284031215611ff957600080fd5b6112ce82611fa1565b60008060006060848603121561201757600080fd5b61202084611fa1565b925061202e60208501611fa1565b9150604084013590509250925092565b6000806020838503121561205157600080fd5b82356001600160401b038082111561206857600080fd5b818501915085601f83011261207c57600080fd5b81358181111561208b57600080fd5b8660208260051b85010111156120a057600080fd5b60209290920196919550909350505050565b80516001600160a01b031682526020808201516001600160401b03169083015260408082015115159083015260609081015162ffffff16910152565b6020808252825182820181905260009190848201906040850190845b818110156111265761211d8385516120b2565b928401926080929092019160010161210a565b6020808252825182820181905260009190848201906040850190845b818110156111265783518352928401929184019160010161214c565b60008060006060848603121561217d57600080fd5b61218684611fa1565b95602085013595506040909401359392505050565b80358015158114611fb857600080fd5b600080604083850312156121be57600080fd5b6121c783611fa1565b91506121d56020840161219b565b90509250929050565b600080600080608085870312156121f457600080fd5b6121fd85611fa1565b9350602061220c818701611fa1565b93506040860135925060608601356001600160401b038082111561222f57600080fd5b818801915088601f83011261224357600080fd5b81358181111561225557612255611e1a565b612267601f8201601f19168501611e30565b9150808252898482850101111561227d57600080fd5b808484018584013760008482840101525080935050505092959194509250565b600080604083850312156122b057600080fd5b82356001600160401b038111156122c657600080fd5b6122d285828601611e60565b95602094909401359450505050565b600080604083850312156122f457600080fd5b823591506121d560208401611fa1565b60008083601f84011261231657600080fd5b5081356001600160401b0381111561232d57600080fd5b60208301915083602082850101111561234557600080fd5b9250929050565b6000806000806040858703121561236257600080fd5b84356001600160401b038082111561237957600080fd5b61238588838901612304565b9096509450602087013591508082111561239e57600080fd5b506123ab87828801612304565b95989497509550505050565b608081016107ac82846120b2565b6000602082840312156123d757600080fd5b6112ce8261219b565b600080604083850312156123f357600080fd5b6123fc83611fa1565b91506121d560208401611fa1565b6000806040838503121561241d57600080fd5b50508035926020909101359150565b634e487b7160e01b600052601160045260246000fd5b808201808211156107ac576107ac61242c565b60208082526017908201527f4d6178696d756d20737570706c79206578636565646564000000000000000000604082015260600190565b81810360008312801583831316838312821617156124ac576124ac61242c565b5092915050565b818103818111156107ac576107ac61242c565b80820281158282048414176107ac576107ac61242c565b600181811c908216806124f157607f821691505b6020821081036115f457634e487b7160e01b600052602260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b601f821115610ee057600081815260208120601f850160051c8101602086101561254e5750805b601f850160051c820191505b81811015610dd95782815560010161255a565b6001600160401b0383111561258457612584611e1a565b6125988361259283546124dd565b83612527565b6000601f8411600181146125cc57600085156125b45750838201355b600019600387901b1c1916600186901b178355610acb565b600083815260209020601f19861690835b828110156125fd57868501358255602094850194600190920191016125dd565b508682101561261a5760001960f88860031b161c19848701351681555b505060018560011b0183555050505050565b60008154612639816124dd565b60018281168015612651576001811461266657612695565b60ff1984168752821515830287019450612695565b8560005260208060002060005b8581101561268c5781548a820152908401908201612673565b50505082870194505b5050505092915050565b60006126ab828661262c565b84516126bb818360208901611f25565b611ed48183018661262c565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906126fa90830184611f49565b9695505050505050565b60006020828403121561271657600080fd5b81516112ce81611de7565b6000600182016127335761273361242c565b506001019056fea264697066735822122041b1702c5df631ac3ba84f8f77048fe976851c53c40a607e05796fdc0f5ce38864736f6c63430008120033

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

0000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000010057ff5b81ab0b224013be394efc3cca92f1a84910fc258cdc8dbf0ea30afe6faf00000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000043697066733a2f2f62616679626569616b37766f7934697a7a6278616f3470616c3464643670706664676564717a61326132617561757469687a6b686a6c78346561612f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000052e6a736f6e000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : startTokenURI (string): ipfs://bafybeiak7voy4izzbxao4pal4dd6ppfdgedqza2a2auautihzkhjlx4eaa/
Arg [1] : endTokenURI (string): .json
Arg [2] : _merkleRoot (bytes32): 0x57ff5b81ab0b224013be394efc3cca92f1a84910fc258cdc8dbf0ea30afe6faf
Arg [3] : _maxFreeMint (uint256): 3

-----Encoded View---------------
10 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000100
Arg [2] : 57ff5b81ab0b224013be394efc3cca92f1a84910fc258cdc8dbf0ea30afe6faf
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000043
Arg [5] : 697066733a2f2f62616679626569616b37766f7934697a7a6278616f3470616c
Arg [6] : 3464643670706664676564717a61326132617561757469687a6b686a6c783465
Arg [7] : 61612f0000000000000000000000000000000000000000000000000000000000
Arg [8] : 0000000000000000000000000000000000000000000000000000000000000005
Arg [9] : 2e6a736f6e000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

75316:8466:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34119:639;;;;;;;;;;-1:-1:-1;34119:639:0;;;;;:::i;:::-;;:::i;:::-;;;565:14:1;;558:22;540:41;;528:2;513:18;34119:639:0;;;;;;;;77573:1376;;;;;;:::i;:::-;;:::i;:::-;;35021:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;41512:218::-;;;;;;;;;;-1:-1:-1;41512:218:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;3247:32:1;;;3229:51;;3217:2;3202:18;41512:218:0;3083:203:1;40945:408:0;;;;;;:::i;:::-;;:::i;30772:323::-;;;;;;;;;;-1:-1:-1;83770:1:0;31046:12;30833:7;31030:13;:28;-1:-1:-1;;31030:46:0;30772:323;;;3874:25:1;;;3862:2;3847:18;30772:323:0;3728:177:1;75681:45:0;;;;;;;;;;-1:-1:-1;75681:45:0;;;;;:::i;:::-;;;;;;;;;;;;;;45151:2825;;;;;;:::i;:::-;;:::i;75619:25::-;;;;;;;;;;;;;;;;75380:41;;;;;;;;;;;;75417:4;75380:41;;81569:172;;;;;;;;;;;;;:::i;79165:268::-;;;;;;;;;;-1:-1:-1;79165:268:0;;;;;:::i;:::-;;:::i;48072:193::-;;;;;;:::i;:::-;;:::i;68818:528::-;;;;;;;;;;-1:-1:-1;68818:528:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;36414:152::-;;;;;;;;;;-1:-1:-1;36414:152:0;;;;;:::i;:::-;;:::i;75577:35::-;;;;;;;;;;-1:-1:-1;75577:35:0;;;;;;;;;;;31956:233;;;;;;;;;;-1:-1:-1;31956:233:0;;;;;:::i;:::-;;:::i;12374:103::-;;;;;;;;;;;;;:::i;82346:107::-;;;;;;;;;;-1:-1:-1;82346:107:0;;;;;:::i;:::-;;:::i;75540:30::-;;;;;;;;;;-1:-1:-1;75540:30:0;;;;;;;;72694:900;;;;;;;;;;-1:-1:-1;72694:900:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;11726:87::-;;;;;;;;;;-1:-1:-1;11799:6:0;;-1:-1:-1;;;;;11799:6:0;11726:87;;82072:86;;;;;;;;;;-1:-1:-1;82072:86:0;;;;;:::i;:::-;;:::i;35197:104::-;;;;;;;;;;;;;:::i;69734:2513::-;;;;;;;;;;-1:-1:-1;69734:2513:0;;;;;:::i;:::-;;:::i;75428:35::-;;;;;;;;;;;;;;;;42070:234;;;;;;;;;;-1:-1:-1;42070:234:0;;;;;:::i;:::-;;:::i;75651:23::-;;;;;;;;;;;;;;;;48863:407;;;;;;:::i;:::-;;:::i;80066:176::-;;;;;;;;;;-1:-1:-1;80066:176:0;;;;;:::i;:::-;;:::i;80857:581::-;;;;;;;;;;-1:-1:-1;80857:581:0;;;;;:::i;:::-;;:::i;82796:206::-;;;;;;;;;;-1:-1:-1;82796:206:0;;;;;:::i;:::-;;:::i;68231:428::-;;;;;;;;;;-1:-1:-1;68231:428:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;82567:105::-;;;;;;;;;;-1:-1:-1;82567:105:0;;;;;:::i;:::-;;:::i;83080:519::-;;;;;;;;;;-1:-1:-1;83080:519:0;;;;;:::i;:::-;;:::i;80370:322::-;;;;;;;;;;-1:-1:-1;80370:322:0;;;;;:::i;:::-;;:::i;42461:164::-;;;;;;;;;;-1:-1:-1;42461:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;42582:25:0;;;42558:4;42582:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;42461:164;79684:187;;;;;;;;;;-1:-1:-1;79684:187:0;;;;;:::i;:::-;;:::i;76191:1178::-;;;;;;:::i;:::-;;:::i;12632:201::-;;;;;;;;;;-1:-1:-1;12632:201:0;;;;;:::i;:::-;;:::i;81835:91::-;;;;;;;;;;-1:-1:-1;81835:91:0;;;;;:::i;:::-;;:::i;34119:639::-;34204:4;-1:-1:-1;;;;;;;;;34528:25:0;;;;:102;;-1:-1:-1;;;;;;;;;;34605:25:0;;;34528:102;:179;;;-1:-1:-1;;;;;;;;;;34682:25:0;;;34528:179;34508:199;34119:639;-1:-1:-1;;34119:639:0:o;77573:1376::-;77735:28;;-1:-1:-1;;77752:10:0;11752:2:1;11748:15;11744:53;77735:28:0;;;11732:66:1;77710:55:0;;77718:5;;11814:12:1;;77735:28:0;;;;;;;;;;;;77725:39;;;;;;77710:7;:55::i;:::-;77688:143;;;;-1:-1:-1;;;77688:143:0;;12039:2:1;77688:143:0;;;12021:21:1;12078:2;12058:18;;;12051:30;12117:34;12097:18;;;12090:62;-1:-1:-1;;;12168:18:1;;;12161:36;12214:19;;77688:143:0;;;;;;;;;77850:10;77864:9;77850:23;77842:56;;;;-1:-1:-1;;;77842:56:0;;12446:2:1;77842:56:0;;;12428:21:1;12485:2;12465:18;;;12458:30;-1:-1:-1;;;12504:18:1;;;12497:50;12564:18;;77842:56:0;12244:344:1;77842:56:0;77918:10;;;;77917:11;77909:38;;;;-1:-1:-1;;;77909:38:0;;12795:2:1;77909:38:0;;;12777:21:1;12834:2;12814:18;;;12807:30;-1:-1:-1;;;12853:18:1;;;12846:44;12907:18;;77909:38:0;12593:338:1;77909:38:0;77966:16;;;;;;;77958:51;;;;-1:-1:-1;;;77958:51:0;;13138:2:1;77958:51:0;;;13120:21:1;13177:2;13157:18;;;13150:30;-1:-1:-1;;;13196:18:1;;;13189:52;13258:18;;77958:51:0;12936:346:1;77958:51:0;75417:4;78059:8;78042:14;31248:7;31439:13;-1:-1:-1;;31439:31:0;;31193:296;78042:14;:25;;;;:::i;:::-;:39;;78020:112;;;;-1:-1:-1;;;78020:112:0;;;;;;;:::i;:::-;78236:10;78145:9;78222:25;;;:13;:25;;;;;;78203:11;;78145:9;;;;78199:49;;78222:25;78199:49;:::i;:::-;78185:63;;78273:1;78263:7;:11;78259:185;;;78298:1;78291:8;;78259:185;;;78384:10;78332:12;78370:25;;;:13;:25;;;;;;78351:11;;78347:49;;78370:25;78347:49;:::i;:::-;78332:64;-1:-1:-1;;78259:185:0;78472:4;78460:8;:16;78456:278;;78511:15;78522:4;78511:8;:15;:::i;:::-;78501:5;;78500:27;;;;:::i;:::-;78584:10;78570:25;;;;:13;:25;;;;;;78493:34;;-1:-1:-1;78570:32:0;;78598:4;;78570:32;:::i;:::-;78556:10;78542:25;;;;:13;:25;;;;;:60;78456:278;;;78700:10;78642:1;78686:25;;;:13;:25;;;;;;78642:1;;-1:-1:-1;78686:36:0;;78714:8;;78686:36;:::i;:::-;78672:10;78658:25;;;;:13;:25;;;;;:64;78456:278;78767:4;78754:9;:17;;78746:50;;;;-1:-1:-1;;;78746:50:0;;14614:2:1;78746:50:0;;;14596:21:1;14653:2;14633:18;;;14626:30;-1:-1:-1;;;14672:18:1;;;14665:50;14732:18;;78746:50:0;14412:344:1;78746:50:0;78823:4;78811:9;:16;78807:95;;;78852:10;78844:46;78873:16;78885:4;78873:9;:16;:::i;:::-;78844:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;78807:95;78914:27;78920:10;78932:8;78914:5;:27::i;:::-;77677:1272;;;77573:1376;;:::o;35021:100::-;35075:13;35108:5;35101:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35021:100;:::o;41512:218::-;41588:7;41613:16;41621:7;41613;:16::i;:::-;41608:64;;41638:34;;-1:-1:-1;;;41638:34:0;;;;;;;;;;;41608:64;-1:-1:-1;41692:24:0;;;;:15;:24;;;;;:30;-1:-1:-1;;;;;41692:30:0;;41512:218::o;40945:408::-;41034:13;41050:16;41058:7;41050;:16::i;:::-;41034:32;-1:-1:-1;65278:10:0;-1:-1:-1;;;;;41083:28:0;;;41079:175;;41131:44;41148:5;65278:10;42461:164;:::i;41131:44::-;41126:128;;41203:35;;-1:-1:-1;;;41203:35:0;;;;;;;;;;;41126:128;41266:24;;;;:15;:24;;;;;;:35;;-1:-1:-1;;;;;;41266:35:0;-1:-1:-1;;;;;41266:35:0;;;;;;;;;41317:28;;41266:24;;41317:28;;;;;;;41023:330;40945:408;;:::o;45151:2825::-;45293:27;45323;45342:7;45323:18;:27::i;:::-;45293:57;;45408:4;-1:-1:-1;;;;;45367:45:0;45383:19;-1:-1:-1;;;;;45367:45:0;;45363:86;;45421:28;;-1:-1:-1;;;45421:28:0;;;;;;;;;;;45363:86;45463:27;44259:24;;;:15;:24;;;;;44487:26;;65278:10;43884:30;;;-1:-1:-1;;;;;43577:28:0;;43862:20;;;43859:56;45649:180;;45742:43;45759:4;65278:10;42461:164;:::i;45742:43::-;45737:92;;45794:35;;-1:-1:-1;;;45794:35:0;;;;;;;;;;;45737:92;-1:-1:-1;;;;;45846:16:0;;45842:52;;45871:23;;-1:-1:-1;;;45871:23:0;;;;;;;;;;;45842:52;46043:15;46040:160;;;46183:1;46162:19;46155:30;46040:160;-1:-1:-1;;;;;46580:24:0;;;;;;;:18;:24;;;;;;46578:26;;-1:-1:-1;;46578:26:0;;;46649:22;;;;;;;;;46647:24;;-1:-1:-1;46647:24:0;;;39803:11;39778:23;39774:41;39761:63;-1:-1:-1;;;39761:63:0;46942:26;;;;:17;:26;;;;;:175;;;;-1:-1:-1;;;47237:47:0;;:52;;47233:627;;47342:1;47332:11;;47310:19;47465:30;;;:17;:30;;;;;;:35;;47461:384;;47603:13;;47588:11;:28;47584:242;;47750:30;;;;:17;:30;;;;;:52;;;47584:242;47291:569;47233:627;47907:7;47903:2;-1:-1:-1;;;;;47888:27:0;47897:4;-1:-1:-1;;;;;47888:27:0;;;;;;;;;;;47926:42;45282:2694;;;45151:2825;;;:::o;81569:172::-;11612:13;:11;:13::i;:::-;81638:49:::1;::::0;81620:12:::1;::::0;81638:10:::1;::::0;81661:21:::1;::::0;81620:12;81638:49;81620:12;81638:49;81661:21;81638:10;:49:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;81619:68;;;81706:7;81698:35;;;::::0;-1:-1:-1;;;81698:35:0;;15558:2:1;81698:35:0::1;::::0;::::1;15540:21:1::0;15597:2;15577:18;;;15570:30;-1:-1:-1;;;15616:18:1;;;15609:45;15671:18;;81698:35:0::1;15356:339:1::0;81698:35:0::1;81608:133;81569:172::o:0;79165:268::-;11612:13;:11;:13::i;:::-;75417:4:::1;79314:8;79297:14;31248:7:::0;31439:13;-1:-1:-1;;31439:31:0;;31193:296;79297:14:::1;:25;;;;:::i;:::-;:39;;79275:112;;;;-1:-1:-1::0;;;79275:112:0::1;;;;;;;:::i;:::-;79400:25;79406:8;79416;79400:5;:25::i;:::-;79165:268:::0;;:::o;48072:193::-;48218:39;48235:4;48241:2;48245:7;48218:39;;;;;;;;;;;;:16;:39::i;:::-;48072:193;;;:::o;68818:528::-;68962:23;69053:8;69028:22;69053:8;-1:-1:-1;;;;;69120:36:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;69120:36:0;;-1:-1:-1;;69120:36:0;;;;;;;;;;;;69083:73;;69176:9;69171:125;69192:14;69187:1;:19;69171:125;;69248:32;69268:8;;69277:1;69268:11;;;;;;;:::i;:::-;;;;;;;69248:19;:32::i;:::-;69232:10;69243:1;69232:13;;;;;;;;:::i;:::-;;;;;;;;;;:48;69208:3;;69171:125;;;-1:-1:-1;69317:10:0;68818:528;-1:-1:-1;;;;68818:528:0:o;36414:152::-;36486:7;36529:27;36548:7;36529:18;:27::i;31956:233::-;32028:7;-1:-1:-1;;;;;32052:19:0;;32048:60;;32080:28;;-1:-1:-1;;;32080:28:0;;;;;;;;;;;32048:60;-1:-1:-1;;;;;;32126:25:0;;;;;:18;:25;;;;;;-1:-1:-1;;;;;32126:55:0;;31956:233::o;12374:103::-;11612:13;:11;:13::i;:::-;12439:30:::1;12466:1;12439:18;:30::i;:::-;12374:103::o:0;82346:107::-;11612:13;:11;:13::i;:::-;82419:11:::1;:26:::0;82346:107::o;72694:900::-;72772:16;72826:19;72860:25;72900:22;72925:16;72935:5;72925:9;:16::i;:::-;72900:41;;72956:25;72998:14;-1:-1:-1;;;;;72984:29:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;72984:29:0;;72956:57;;73028:31;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;73028:31:0;83770:1;73074:472;73123:14;73108:11;:29;73074:472;;73175:15;73188:1;73175:12;:15::i;:::-;73163:27;;73213:9;:16;;;73254:8;73209:73;73304:14;;-1:-1:-1;;;;;73304:28:0;;73300:111;;73377:14;;;-1:-1:-1;73300:111:0;73454:5;-1:-1:-1;;;;;73433:26:0;:17;-1:-1:-1;;;;;73433:26:0;;73429:102;;73510:1;73484:8;73493:13;;;;;;73484:23;;;;;;;;:::i;:::-;;;;;;:27;;;;;73429:102;73139:3;;73074:472;;;-1:-1:-1;73567:8:0;;72694:900;-1:-1:-1;;;;;;72694:900:0:o;82072:86::-;11612:13;:11;:13::i;:::-;82136:5:::1;:14:::0;82072:86::o;35197:104::-;35253:13;35286:7;35279:14;;;;;:::i;69734:2513::-;69877:16;69944:4;69935:5;:13;69931:45;;69957:19;;-1:-1:-1;;;69957:19:0;;;;;;;;;;;69931:45;69991:19;70025:17;70045:14;30514:7;30541:13;;30459:103;70045:14;70025:34;-1:-1:-1;83770:1:0;70137:5;:23;70133:87;;;83770:1;70181:23;;70133:87;70296:9;70289:4;:16;70285:73;;;70333:9;70326:16;;70285:73;70372:25;70400:16;70410:5;70400:9;:16::i;:::-;70372:44;;70594:4;70586:5;:12;70582:278;;;70641:12;;;70676:31;;;70672:111;;;70752:11;70732:31;;70672:111;70600:198;70582:278;;;-1:-1:-1;70843:1:0;70582:278;70874:25;70916:17;-1:-1:-1;;;;;70902:32:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;70902:32:0;;70874:60;;70953:17;70974:1;70953:22;70949:78;;71003:8;-1:-1:-1;70996:15:0;;-1:-1:-1;;;70996:15:0;70949:78;71171:31;71205:26;71225:5;71205:19;:26::i;:::-;71171:60;;71246:25;71491:9;:16;;;71486:92;;-1:-1:-1;71548:14:0;;71486:92;71609:5;71592:478;71621:4;71616:1;:9;;:45;;;;;71644:17;71629:11;:32;;71616:45;71592:478;;;71699:15;71712:1;71699:12;:15::i;:::-;71687:27;;71737:9;:16;;;71778:8;71733:73;71828:14;;-1:-1:-1;;;;;71828:28:0;;71824:111;;71901:14;;;-1:-1:-1;71824:111:0;71978:5;-1:-1:-1;;;;;71957:26:0;:17;-1:-1:-1;;;;;71957:26:0;;71953:102;;72034:1;72008:8;72017:13;;;;;;72008:23;;;;;;;;:::i;:::-;;;;;;:27;;;;;71953:102;71663:3;;71592:478;;;-1:-1:-1;;;72155:29:0;;;-1:-1:-1;72162:8:0;;-1:-1:-1;;69734:2513:0;;;;;;:::o;42070:234::-;65278:10;42165:39;;;;:18;:39;;;;;;;;-1:-1:-1;;;;;42165:49:0;;;;;;;;;;;;:60;;-1:-1:-1;;42165:60:0;;;;;;;;;;42241:55;;540:41:1;;;42165:49:0;;65278:10;42241:55;;513:18:1;42241:55:0;;;;;;;42070:234;;:::o;48863:407::-;49038:31;49051:4;49057:2;49061:7;49038:12;:31::i;:::-;-1:-1:-1;;;;;49084:14:0;;;:19;49080:183;;49123:56;49154:4;49160:2;49164:7;49173:5;49123:30;:56::i;:::-;49118:145;;49207:40;;-1:-1:-1;;;49207:40:0;;;;;;;;;;;49118:145;48863:407;;;;:::o;80066:176::-;80167:4;80191:43;80210:5;80217:10;;80229:4;80191:18;:43::i;80857:581::-;-1:-1:-1;;;;;81057:21:0;;80957:7;81057:21;;;:13;:21;;;;;;81038:11;;80957:7;;;;;;81034:45;;;:::i;:::-;81020:59;;81104:1;81094:7;:11;81090:181;;;81129:1;81122:8;;81090:181;;;-1:-1:-1;;;;;81201:21:0;;81163:12;81201:21;;;:13;:21;;;;;;81182:11;;81178:45;;81201:21;81178:45;:::i;:::-;81163:60;-1:-1:-1;;81090:181:0;81299:4;81287:8;:16;81283:124;;81338:15;81349:4;81338:8;:15;:::i;:::-;81328:5;;81327:27;;;;:::i;:::-;81320:34;;81283:124;;;81394:1;81387:8;;81283:124;-1:-1:-1;81426:4:0;;80857:581;-1:-1:-1;;;;80857:581:0:o;82796:206::-;11612:13;:11;:13::i;:::-;82927:14:::1;:30;82944:13:::0;;82927:14;:30:::1;:::i;:::-;-1:-1:-1::0;82968:12:0::1;:26;82983:11:::0;;82968:12;:26:::1;:::i;68231:428::-:0;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;83770:1:0;68395:7;:25;:54;;;-1:-1:-1;30514:7:0;30541:13;68424:7;:25;;68395:54;68391:103;;;68473:9;68231:428;-1:-1:-1;;68231:428:0:o;68391:103::-;68516:21;68529:7;68516:12;:21::i;:::-;68504:33;;68552:9;:16;;;68548:65;;;68592:9;68231:428;-1:-1:-1;;68231:428:0:o;68548:65::-;68630:21;68643:7;68630:12;:21::i;82567:105::-;11612:13;:11;:13::i;:::-;82639:16:::1;:25:::0;;;::::1;;;;-1:-1:-1::0;;82639:25:0;;::::1;::::0;;;::::1;::::0;;82567:105::o;83080:519::-;83188:13;83219:16;83227:7;83219;:16::i;:::-;83214:59;;83244:29;;-1:-1:-1;;;83244:29:0;;;;;;;;;;;83214:59;83310:14;83304:28;;;;;:::i;:::-;;;83336:1;83304:33;:287;;;;;;;;;;;;;;;;;83429:14;83470:18;83480:7;83470:9;:18::i;:::-;83515:12;83386:164;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;83284:307;83080:519;-1:-1:-1;;83080:519:0:o;80370:322::-;-1:-1:-1;;;;;80485:21:0;;80432:3;80485:21;;;:13;:21;;;;;;80466:11;;80432:3;;80462:45;;;:::i;:::-;80448:59;;80532:1;80522:7;:11;80518:167;;;-1:-1:-1;80557:1:0;;80370:322;-1:-1:-1;;80370:322:0:o;80518:167::-;-1:-1:-1;;;;;80625:21:0;;80591:8;80625:21;;;:13;:21;;;;;;80606:11;;80602:45;;80625:21;80602:45;:::i;:::-;80591:56;80370:322;-1:-1:-1;;;;80370:322:0:o;80518:167::-;80437:255;80370:322;;;:::o;79684:187::-;11612:13;:11;:13::i;:::-;79802:10:::1;:24:::0;;;;79837:11:::1;:26:::0;79684:187::o;76191:1178::-;76265:10;76279:9;76265:23;76257:56;;;;-1:-1:-1;;;76257:56:0;;12446:2:1;76257:56:0;;;12428:21:1;12485:2;12465:18;;;12458:30;-1:-1:-1;;;12504:18:1;;;12497:50;12564:18;;76257:56:0;12244:344:1;76257:56:0;76333:10;;;;76332:11;76324:38;;;;-1:-1:-1;;;76324:38:0;;12795:2:1;76324:38:0;;;12777:21:1;12834:2;12814:18;;;12807:30;-1:-1:-1;;;12853:18:1;;;12846:44;12907:18;;76324:38:0;12593:338:1;76324:38:0;76382:16;;;;;;;76381:17;76373:56;;;;-1:-1:-1;;;76373:56:0;;19293:2:1;76373:56:0;;;19275:21:1;19332:2;19312:18;;;19305:30;19371:28;19351:18;;;19344:56;19417:18;;76373:56:0;19091:350:1;76373:56:0;75417:4;76479:8;76462:14;31248:7;31439:13;-1:-1:-1;;31439:31:0;;31193:296;76462:14;:25;;;;:::i;:::-;:39;;76440:112;;;;-1:-1:-1;;;76440:112:0;;;;;;;:::i;:::-;76656:10;76565:9;76642:25;;;:13;:25;;;;;;76623:11;;76565:9;;;;76619:49;;76642:25;76619:49;:::i;:::-;76605:63;;76693:1;76683:7;:11;76679:185;;;76718:1;76711:8;;76679:185;;;76804:10;76752:12;76790:25;;;:13;:25;;;;;;76771:11;;76767:49;;76790:25;76767:49;:::i;:::-;76752:64;-1:-1:-1;;76679:185:0;76892:4;76880:8;:16;76876:278;;76931:15;76942:4;76931:8;:15;:::i;:::-;76921:5;;76920:27;;;;:::i;:::-;77004:10;76990:25;;;;:13;:25;;;;;;76913:34;;-1:-1:-1;76990:32:0;;77018:4;;76990:32;:::i;:::-;76976:10;76962:25;;;;:13;:25;;;;;:60;76876:278;;;77120:10;77062:1;77106:25;;;:13;:25;;;;;;77062:1;;-1:-1:-1;77106:36:0;;77134:8;;77106:36;:::i;:::-;77092:10;77078:25;;;;:13;:25;;;;;:64;76876:278;77187:4;77174:9;:17;;77166:50;;;;-1:-1:-1;;;77166:50:0;;14614:2:1;77166:50:0;;;14596:21:1;14653:2;14633:18;;;14626:30;-1:-1:-1;;;14672:18:1;;;14665:50;14732:18;;77166:50:0;14412:344:1;77166:50:0;77243:4;77231:9;:16;77227:95;;;77272:10;77264:46;77293:16;77305:4;77293:9;:16;:::i;:::-;77264:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;77227:95;77334:27;77340:10;77352:8;77334:5;:27::i;12632:201::-;11612:13;:11;:13::i;:::-;-1:-1:-1;;;;;12721:22:0;::::1;12713:73;;;::::0;-1:-1:-1;;;12713:73:0;;19648:2:1;12713:73:0::1;::::0;::::1;19630:21:1::0;19687:2;19667:18;;;19660:30;19726:34;19706:18;;;19699:62;-1:-1:-1;;;19777:18:1;;;19770:36;19823:19;;12713:73:0::1;19446:402:1::0;12713:73:0::1;12797:28;12816:8;12797:18;:28::i;81835:91::-:0;11612:13;:11;:13::i;:::-;81898:10:::1;:20:::0;;-1:-1:-1;;81898:20:0::1;::::0;::::1;;::::0;;;::::1;::::0;;81835:91::o;52532:2966::-;52605:20;52628:13;;;52656;;;52652:44;;52678:18;;-1:-1:-1;;;52678:18:0;;;;;;;;;;;52652:44;-1:-1:-1;;;;;53184:22:0;;;;;;:18;:22;;;;26253:2;53184:22;;;:71;;53222:32;53210:45;;53184:71;;;53498:31;;;:17;:31;;;;;-1:-1:-1;40234:15:0;;40208:24;40204:46;39803:11;39778:23;39774:41;39771:52;39761:63;;53498:173;;53733:23;;;;53498:31;;53184:22;;54498:25;53184:22;;54351:335;55012:1;54998:12;54994:20;54952:346;55053:3;55044:7;55041:16;54952:346;;55271:7;55261:8;55258:1;55231:25;55228:1;55225;55220:59;55106:1;55093:15;54952:346;;;54956:77;55331:8;55343:1;55331:13;55327:45;;55353:19;;-1:-1:-1;;;55353:19:0;;;;;;;;;;;55327:45;55389:13;:19;-1:-1:-1;48072:193:0;;;:::o;42883:282::-;42948:4;43004:7;83770:1;42985:26;;:66;;;;;43038:13;;43028:7;:23;42985:66;:153;;;;-1:-1:-1;;43089:26:0;;;;:17;:26;;;;;;-1:-1:-1;;;43089:44:0;:49;;42883:282::o;37569:1275::-;37636:7;37671;;83770:1;37720:23;37716:1061;;37773:13;;37766:4;:20;37762:1015;;;37811:14;37828:23;;;:17;:23;;;;;;;-1:-1:-1;;;37917:24:0;;:29;;37913:845;;38582:113;38589:6;38599:1;38589:11;38582:113;;-1:-1:-1;;;38660:6:0;38642:25;;;;:17;:25;;;;;;38582:113;;37913:845;37788:989;37762:1015;38805:31;;-1:-1:-1;;;38805:31:0;;;;;;;;;;;11891:132;11799:6;;-1:-1:-1;;;;;11799:6:0;65278:10;11955:23;11947:68;;;;-1:-1:-1;;;11947:68:0;;20055:2:1;11947:68:0;;;20037:21:1;;;20074:18;;;20067:30;20133:34;20113:18;;;20106:62;20185:18;;11947:68:0;19853:356:1;12993:191:0;13086:6;;;-1:-1:-1;;;;;13103:17:0;;;-1:-1:-1;;;;;;13103:17:0;;;;;;;13136:40;;13086:6;;;13103:17;13086:6;;13136:40;;13067:16;;13136:40;13056:128;12993:191;:::o;37017:161::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37145:24:0;;;;:17;:24;;;;;;37126:44;;:18;:44::i;51354:716::-;51538:88;;-1:-1:-1;;;51538:88:0;;51517:4;;-1:-1:-1;;;;;51538:45:0;;;;;:88;;65278:10;;51605:4;;51611:7;;51620:5;;51538:88;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;51538:88:0;;;;;;;;-1:-1:-1;;51538:88:0;;;;;;;;;;;;:::i;:::-;;;51534:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51821:6;:13;51838:1;51821:18;51817:235;;51867:40;;-1:-1:-1;;;51867:40:0;;;;;;;;;;;51817:235;52010:6;52004:13;51995:6;51991:2;51987:15;51980:38;51534:529;-1:-1:-1;;;;;;51697:64:0;-1:-1:-1;;;51697:64:0;;-1:-1:-1;51354:716:0;;;;;;:::o;1259:190::-;1384:4;1437;1408:25;1421:5;1428:4;1408:12;:25::i;:::-;:33;;1259:190;-1:-1:-1;;;;1259:190:0:o;36755:166::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36866:47:0;36885:27;36904:7;36885:18;:27::i;:::-;36866:18;:47::i;65398:1745::-;65463:17;65897:4;65890;65884:11;65880:22;65989:1;65983:4;65976:15;66064:4;66061:1;66057:12;66050:19;;;66146:1;66141:3;66134:14;66250:3;66489:5;66471:428;66537:1;66532:3;66528:11;66521:18;;66708:2;66702:4;66698:13;66694:2;66690:22;66685:3;66677:36;66802:2;66792:13;;66859:25;66471:428;66859:25;-1:-1:-1;66929:13:0;;;-1:-1:-1;;67044:14:0;;;67106:19;;;67044:14;65398:1745;-1:-1:-1;65398:1745:0:o;38943:366::-;-1:-1:-1;;;;;;;;;;;;;39053:41:0;;;;26774:3;39139:33;;;-1:-1:-1;;;;;39105:68:0;-1:-1:-1;;;39105:68:0;-1:-1:-1;;;39203:24:0;;:29;;-1:-1:-1;;;39184:48:0;;;;27295:3;39272:28;;;;-1:-1:-1;;;39243:58:0;-1:-1:-1;38943:366:0:o;2126:296::-;2209:7;2252:4;2209:7;2267:118;2291:5;:12;2287:1;:16;2267:118;;;2340:33;2350:12;2364:5;2370:1;2364:8;;;;;;;;:::i;:::-;;;;;;;2340:9;:33::i;:::-;2325:48;-1:-1:-1;2305:3:0;;;;:::i;:::-;;;;2267:118;;;-1:-1:-1;2402:12:0;2126:296;-1:-1:-1;;;2126:296:0:o;9166:149::-;9229:7;9260:1;9256;:5;:51;;9391:13;9485:15;;;9521:4;9514:15;;;9568:4;9552:21;;9256:51;;;9391:13;9485:15;;;9521:4;9514:15;;;9568:4;9552:21;;9264:20;9323:268;14:131:1;-1:-1:-1;;;;;;88:32:1;;78:43;;68:71;;135:1;132;125:12;150:245;208:6;261:2;249:9;240:7;236:23;232:32;229:52;;;277:1;274;267:12;229:52;316:9;303:23;335:30;359:5;335:30;:::i;592:127::-;653:10;648:3;644:20;641:1;634:31;684:4;681:1;674:15;708:4;705:1;698:15;724:275;795:2;789:9;860:2;841:13;;-1:-1:-1;;837:27:1;825:40;;-1:-1:-1;;;;;880:34:1;;916:22;;;877:62;874:88;;;942:18;;:::i;:::-;978:2;971:22;724:275;;-1:-1:-1;724:275:1:o;1004:712::-;1058:5;1111:3;1104:4;1096:6;1092:17;1088:27;1078:55;;1129:1;1126;1119:12;1078:55;1165:6;1152:20;1191:4;-1:-1:-1;;;;;1210:2:1;1207:26;1204:52;;;1236:18;;:::i;:::-;1282:2;1279:1;1275:10;1305:28;1329:2;1325;1321:11;1305:28;:::i;:::-;1367:15;;;1437;;;1433:24;;;1398:12;;;;1469:15;;;1466:35;;;1497:1;1494;1487:12;1466:35;1533:2;1525:6;1521:15;1510:26;;1545:142;1561:6;1556:3;1553:15;1545:142;;;1627:17;;1615:30;;1578:12;;;;1665;;;;1545:142;;;1705:5;1004:712;-1:-1:-1;;;;;;;1004:712:1:o;1721:416::-;1814:6;1822;1875:2;1863:9;1854:7;1850:23;1846:32;1843:52;;;1891:1;1888;1881:12;1843:52;1927:9;1914:23;1904:33;;1988:2;1977:9;1973:18;1960:32;-1:-1:-1;;;;;2007:6:1;2004:30;2001:50;;;2047:1;2044;2037:12;2001:50;2070:61;2123:7;2114:6;2103:9;2099:22;2070:61;:::i;:::-;2060:71;;;1721:416;;;;;:::o;2142:250::-;2227:1;2237:113;2251:6;2248:1;2245:13;2237:113;;;2327:11;;;2321:18;2308:11;;;2301:39;2273:2;2266:10;2237:113;;;-1:-1:-1;;2384:1:1;2366:16;;2359:27;2142:250::o;2397:271::-;2439:3;2477:5;2471:12;2504:6;2499:3;2492:19;2520:76;2589:6;2582:4;2577:3;2573:14;2566:4;2559:5;2555:16;2520:76;:::i;:::-;2650:2;2629:15;-1:-1:-1;;2625:29:1;2616:39;;;;2657:4;2612:50;;2397:271;-1:-1:-1;;2397:271:1:o;2673:220::-;2822:2;2811:9;2804:21;2785:4;2842:45;2883:2;2872:9;2868:18;2860:6;2842:45;:::i;2898:180::-;2957:6;3010:2;2998:9;2989:7;2985:23;2981:32;2978:52;;;3026:1;3023;3016:12;2978:52;-1:-1:-1;3049:23:1;;2898:180;-1:-1:-1;2898:180:1:o;3291:173::-;3359:20;;-1:-1:-1;;;;;3408:31:1;;3398:42;;3388:70;;3454:1;3451;3444:12;3388:70;3291:173;;;:::o;3469:254::-;3537:6;3545;3598:2;3586:9;3577:7;3573:23;3569:32;3566:52;;;3614:1;3611;3604:12;3566:52;3637:29;3656:9;3637:29;:::i;:::-;3627:39;3713:2;3698:18;;;;3685:32;;-1:-1:-1;;;3469:254:1:o;3910:186::-;3969:6;4022:2;4010:9;4001:7;3997:23;3993:32;3990:52;;;4038:1;4035;4028:12;3990:52;4061:29;4080:9;4061:29;:::i;4101:328::-;4178:6;4186;4194;4247:2;4235:9;4226:7;4222:23;4218:32;4215:52;;;4263:1;4260;4253:12;4215:52;4286:29;4305:9;4286:29;:::i;:::-;4276:39;;4334:38;4368:2;4357:9;4353:18;4334:38;:::i;:::-;4324:48;;4419:2;4408:9;4404:18;4391:32;4381:42;;4101:328;;;;;:::o;4616:615::-;4702:6;4710;4763:2;4751:9;4742:7;4738:23;4734:32;4731:52;;;4779:1;4776;4769:12;4731:52;4819:9;4806:23;-1:-1:-1;;;;;4889:2:1;4881:6;4878:14;4875:34;;;4905:1;4902;4895:12;4875:34;4943:6;4932:9;4928:22;4918:32;;4988:7;4981:4;4977:2;4973:13;4969:27;4959:55;;5010:1;5007;5000:12;4959:55;5050:2;5037:16;5076:2;5068:6;5065:14;5062:34;;;5092:1;5089;5082:12;5062:34;5145:7;5140:2;5130:6;5127:1;5123:14;5119:2;5115:23;5111:32;5108:45;5105:65;;;5166:1;5163;5156:12;5105:65;5197:2;5189:11;;;;;5219:6;;-1:-1:-1;4616:615:1;;-1:-1:-1;;;;4616:615:1:o;5236:349::-;5320:12;;-1:-1:-1;;;;;5316:38:1;5304:51;;5408:4;5397:16;;;5391:23;-1:-1:-1;;;;;5387:48:1;5371:14;;;5364:72;5499:4;5488:16;;;5482:23;5475:31;5468:39;5452:14;;;5445:63;5561:4;5550:16;;;5544:23;5569:8;5540:38;5524:14;;5517:62;5236:349::o;5590:722::-;5823:2;5875:21;;;5945:13;;5848:18;;;5967:22;;;5794:4;;5823:2;6046:15;;;;6020:2;6005:18;;;5794:4;6089:197;6103:6;6100:1;6097:13;6089:197;;;6152:52;6200:3;6191:6;6185:13;6152:52;:::i;:::-;6261:15;;;;6233:4;6224:14;;;;;6125:1;6118:9;6089:197;;6317:632;6488:2;6540:21;;;6610:13;;6513:18;;;6632:22;;;6459:4;;6488:2;6711:15;;;;6685:2;6670:18;;;6459:4;6754:169;6768:6;6765:1;6762:13;6754:169;;;6829:13;;6817:26;;6898:15;;;;6863:12;;;;6790:1;6783:9;6754:169;;6954:322;7031:6;7039;7047;7100:2;7088:9;7079:7;7075:23;7071:32;7068:52;;;7116:1;7113;7106:12;7068:52;7139:29;7158:9;7139:29;:::i;:::-;7129:39;7215:2;7200:18;;7187:32;;-1:-1:-1;7266:2:1;7251:18;;;7238:32;;6954:322;-1:-1:-1;;;6954:322:1:o;7281:160::-;7346:20;;7402:13;;7395:21;7385:32;;7375:60;;7431:1;7428;7421:12;7446:254;7511:6;7519;7572:2;7560:9;7551:7;7547:23;7543:32;7540:52;;;7588:1;7585;7578:12;7540:52;7611:29;7630:9;7611:29;:::i;:::-;7601:39;;7659:35;7690:2;7679:9;7675:18;7659:35;:::i;:::-;7649:45;;7446:254;;;;;:::o;7705:980::-;7800:6;7808;7816;7824;7877:3;7865:9;7856:7;7852:23;7848:33;7845:53;;;7894:1;7891;7884:12;7845:53;7917:29;7936:9;7917:29;:::i;:::-;7907:39;;7965:2;7986:38;8020:2;8009:9;8005:18;7986:38;:::i;:::-;7976:48;;8071:2;8060:9;8056:18;8043:32;8033:42;;8126:2;8115:9;8111:18;8098:32;-1:-1:-1;;;;;8190:2:1;8182:6;8179:14;8176:34;;;8206:1;8203;8196:12;8176:34;8244:6;8233:9;8229:22;8219:32;;8289:7;8282:4;8278:2;8274:13;8270:27;8260:55;;8311:1;8308;8301:12;8260:55;8347:2;8334:16;8369:2;8365;8362:10;8359:36;;;8375:18;;:::i;:::-;8417:53;8460:2;8441:13;;-1:-1:-1;;8437:27:1;8433:36;;8417:53;:::i;:::-;8404:66;;8493:2;8486:5;8479:17;8533:7;8528:2;8523;8519;8515:11;8511:20;8508:33;8505:53;;;8554:1;8551;8544:12;8505:53;8609:2;8604;8600;8596:11;8591:2;8584:5;8580:14;8567:45;8653:1;8648:2;8643;8636:5;8632:14;8628:23;8621:34;;8674:5;8664:15;;;;;7705:980;;;;;;;:::o;8690:416::-;8783:6;8791;8844:2;8832:9;8823:7;8819:23;8815:32;8812:52;;;8860:1;8857;8850:12;8812:52;8900:9;8887:23;-1:-1:-1;;;;;8925:6:1;8922:30;8919:50;;;8965:1;8962;8955:12;8919:50;8988:61;9041:7;9032:6;9021:9;9017:22;8988:61;:::i;:::-;8978:71;9096:2;9081:18;;;;9068:32;;-1:-1:-1;;;;8690:416:1:o;9111:254::-;9179:6;9187;9240:2;9228:9;9219:7;9215:23;9211:32;9208:52;;;9256:1;9253;9246:12;9208:52;9292:9;9279:23;9269:33;;9321:38;9355:2;9344:9;9340:18;9321:38;:::i;9370:348::-;9422:8;9432:6;9486:3;9479:4;9471:6;9467:17;9463:27;9453:55;;9504:1;9501;9494:12;9453:55;-1:-1:-1;9527:20:1;;-1:-1:-1;;;;;9559:30:1;;9556:50;;;9602:1;9599;9592:12;9556:50;9639:4;9631:6;9627:17;9615:29;;9691:3;9684:4;9675:6;9667;9663:19;9659:30;9656:39;9653:59;;;9708:1;9705;9698:12;9653:59;9370:348;;;;;:::o;9723:721::-;9815:6;9823;9831;9839;9892:2;9880:9;9871:7;9867:23;9863:32;9860:52;;;9908:1;9905;9898:12;9860:52;9948:9;9935:23;-1:-1:-1;;;;;10018:2:1;10010:6;10007:14;10004:34;;;10034:1;10031;10024:12;10004:34;10073:59;10124:7;10115:6;10104:9;10100:22;10073:59;:::i;:::-;10151:8;;-1:-1:-1;10047:85:1;-1:-1:-1;10239:2:1;10224:18;;10211:32;;-1:-1:-1;10255:16:1;;;10252:36;;;10284:1;10281;10274:12;10252:36;;10323:61;10376:7;10365:8;10354:9;10350:24;10323:61;:::i;:::-;9723:721;;;;-1:-1:-1;10403:8:1;-1:-1:-1;;;;9723:721:1:o;10449:266::-;10645:3;10630:19;;10658:51;10634:9;10691:6;10658:51;:::i;10720:180::-;10776:6;10829:2;10817:9;10808:7;10804:23;10800:32;10797:52;;;10845:1;10842;10835:12;10797:52;10868:26;10884:9;10868:26;:::i;11085:260::-;11153:6;11161;11214:2;11202:9;11193:7;11189:23;11185:32;11182:52;;;11230:1;11227;11220:12;11182:52;11253:29;11272:9;11253:29;:::i;:::-;11243:39;;11301:38;11335:2;11324:9;11320:18;11301:38;:::i;11350:248::-;11418:6;11426;11479:2;11467:9;11458:7;11454:23;11450:32;11447:52;;;11495:1;11492;11485:12;11447:52;-1:-1:-1;;11518:23:1;;;11588:2;11573:18;;;11560:32;;-1:-1:-1;11350:248:1:o;13287:127::-;13348:10;13343:3;13339:20;13336:1;13329:31;13379:4;13376:1;13369:15;13403:4;13400:1;13393:15;13419:125;13484:9;;;13505:10;;;13502:36;;;13518:18;;:::i;13549:347::-;13751:2;13733:21;;;13790:2;13770:18;;;13763:30;13829:25;13824:2;13809:18;;13802:53;13887:2;13872:18;;13549:347::o;13901:200::-;13967:9;;;13940:4;13995:9;;14023:10;;14035:12;;;14019:29;14058:12;;;14050:21;;14016:56;14013:82;;;14075:18;;:::i;:::-;14013:82;13901:200;;;;:::o;14106:128::-;14173:9;;;14194:11;;;14191:37;;;14208:18;;:::i;14239:168::-;14312:9;;;14343;;14360:15;;;14354:22;;14340:37;14330:71;;14381:18;;:::i;14761:380::-;14840:1;14836:12;;;;14883;;;14904:61;;14958:4;14950:6;14946:17;14936:27;;14904:61;15011:2;15003:6;15000:14;14980:18;14977:38;14974:161;;15057:10;15052:3;15048:20;15045:1;15038:31;15092:4;15089:1;15082:15;15120:4;15117:1;15110:15;15700:127;15761:10;15756:3;15752:20;15749:1;15742:31;15792:4;15789:1;15782:15;15816:4;15813:1;15806:15;15958:545;16060:2;16055:3;16052:11;16049:448;;;16096:1;16121:5;16117:2;16110:17;16166:4;16162:2;16152:19;16236:2;16224:10;16220:19;16217:1;16213:27;16207:4;16203:38;16272:4;16260:10;16257:20;16254:47;;;-1:-1:-1;16295:4:1;16254:47;16350:2;16345:3;16341:12;16338:1;16334:20;16328:4;16324:31;16314:41;;16405:82;16423:2;16416:5;16413:13;16405:82;;;16468:17;;;16449:1;16438:13;16405:82;;16679:1206;-1:-1:-1;;;;;16798:3:1;16795:27;16792:53;;;16825:18;;:::i;:::-;16854:94;16944:3;16904:38;16936:4;16930:11;16904:38;:::i;:::-;16898:4;16854:94;:::i;:::-;16974:1;16999:2;16994:3;16991:11;17016:1;17011:616;;;;17671:1;17688:3;17685:93;;;-1:-1:-1;17744:19:1;;;17731:33;17685:93;-1:-1:-1;;16636:1:1;16632:11;;;16628:24;16624:29;16614:40;16660:1;16656:11;;;16611:57;17791:78;;16984:895;;17011:616;15905:1;15898:14;;;15942:4;15929:18;;-1:-1:-1;;17047:17:1;;;17148:9;17170:229;17184:7;17181:1;17178:14;17170:229;;;17273:19;;;17260:33;17245:49;;17380:4;17365:20;;;;17333:1;17321:14;;;;17200:12;17170:229;;;17174:3;17427;17418:7;17415:16;17412:159;;;17551:1;17547:6;17541:3;17535;17532:1;17528:11;17524:21;17520:34;17516:39;17503:9;17498:3;17494:19;17481:33;17477:79;17469:6;17462:95;17412:159;;;17614:1;17608:3;17605:1;17601:11;17597:19;17591:4;17584:33;16984:895;;16679:1206;;;:::o;17890:722::-;17940:3;17981:5;17975:12;18010:36;18036:9;18010:36;:::i;:::-;18065:1;18082:18;;;18109:133;;;;18256:1;18251:355;;;;18075:531;;18109:133;-1:-1:-1;;18142:24:1;;18130:37;;18215:14;;18208:22;18196:35;;18187:45;;;-1:-1:-1;18109:133:1;;18251:355;18282:5;18279:1;18272:16;18311:4;18356:2;18353:1;18343:16;18381:1;18395:165;18409:6;18406:1;18403:13;18395:165;;;18487:14;;18474:11;;;18467:35;18530:16;;;;18424:10;;18395:165;;;18399:3;;;18589:6;18584:3;18580:16;18573:23;;18075:531;;;;;17890:722;;;;:::o;18617:469::-;18838:3;18866:38;18900:3;18892:6;18866:38;:::i;:::-;18933:6;18927:13;18949:65;19007:6;19003:2;18996:4;18988:6;18984:17;18949:65;:::i;:::-;19030:50;19072:6;19068:2;19064:15;19056:6;19030:50;:::i;20214:489::-;-1:-1:-1;;;;;20483:15:1;;;20465:34;;20535:15;;20530:2;20515:18;;20508:43;20582:2;20567:18;;20560:34;;;20630:3;20625:2;20610:18;;20603:31;;;20408:4;;20651:46;;20677:19;;20669:6;20651:46;:::i;:::-;20643:54;20214:489;-1:-1:-1;;;;;;20214:489:1:o;20708:249::-;20777:6;20830:2;20818:9;20809:7;20805:23;20801:32;20798:52;;;20846:1;20843;20836:12;20798:52;20878:9;20872:16;20897:30;20921:5;20897:30;:::i;20962:135::-;21001:3;21022:17;;;21019:43;;21042:18;;:::i;:::-;-1:-1:-1;21089:1:1;21078:13;;20962:135::o

Swarm Source

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