ETH Price: $3,309.51 (+1.15%)
Gas: 3 Gwei

Token

FREEPickerPass (FREEPICKPass)
 

Overview

Max Total Supply

501 FREEPICKPass

Holders

484

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Balance
1 FREEPICKPass
0x8f63509ea9e1a3e991fcebacea06e8a59e023074
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:
FreePickerPass

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

// SPDX-License-Identifier: MIT

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


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

pragma solidity ^0.8.0;

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

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        // Inspired by OraclizeAPI's implementation - MIT licence
        // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol

        if (value == 0) {
            return "0";
        }
        uint256 temp = value;
        uint256 digits;
        while (temp != 0) {
            digits++;
            temp /= 10;
        }
        bytes memory buffer = new bytes(digits);
        while (value != 0) {
            digits -= 1;
            buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
            value /= 10;
        }
        return string(buffer);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        if (value == 0) {
            return "0x00";
        }
        uint256 temp = value;
        uint256 length = 0;
        while (temp != 0) {
            length++;
            temp >>= 8;
        }
        return toHexString(value, length);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
     */
    function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
        bytes memory buffer = new bytes(2 * length + 2);
        buffer[0] = "0";
        buffer[1] = "x";
        for (uint256 i = 2 * length + 1; i > 1; --i) {
            buffer[i] = _HEX_SYMBOLS[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }

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

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


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

pragma solidity ^0.8.0;


/**
 * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.
 *
 * These functions can be used to verify that a message was signed by the holder
 * of the private keys of a given address.
 */
library ECDSA {
    enum RecoverError {
        NoError,
        InvalidSignature,
        InvalidSignatureLength,
        InvalidSignatureS,
        InvalidSignatureV
    }

    function _throwError(RecoverError error) private pure {
        if (error == RecoverError.NoError) {
            return; // no error: do nothing
        } else if (error == RecoverError.InvalidSignature) {
            revert("ECDSA: invalid signature");
        } else if (error == RecoverError.InvalidSignatureLength) {
            revert("ECDSA: invalid signature length");
        } else if (error == RecoverError.InvalidSignatureS) {
            revert("ECDSA: invalid signature 's' value");
        } else if (error == RecoverError.InvalidSignatureV) {
            revert("ECDSA: invalid signature 'v' value");
        }
    }

    /**
     * @dev Returns the address that signed a hashed message (`hash`) with
     * `signature` or error string. This address can then be used for verification purposes.
     *
     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
     * this function rejects them by requiring the `s` value to be in the lower
     * half order, and the `v` value to be either 27 or 28.
     *
     * IMPORTANT: `hash` _must_ be the result of a hash operation for the
     * verification to be secure: it is possible to craft signatures that
     * recover to arbitrary addresses for non-hashed data. A safe way to ensure
     * this is by receiving a hash of the original message (which may otherwise
     * be too long), and then calling {toEthSignedMessageHash} on it.
     *
     * Documentation for signature generation:
     * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]
     * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]
     *
     * _Available since v4.3._
     */
    function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) {
        // Check the signature length
        // - case 65: r,s,v signature (standard)
        // - case 64: r,vs signature (cf https://eips.ethereum.org/EIPS/eip-2098) _Available since v4.1._
        if (signature.length == 65) {
            bytes32 r;
            bytes32 s;
            uint8 v;
            // ecrecover takes the signature parameters, and the only way to get them
            // currently is to use assembly.
            /// @solidity memory-safe-assembly
            assembly {
                r := mload(add(signature, 0x20))
                s := mload(add(signature, 0x40))
                v := byte(0, mload(add(signature, 0x60)))
            }
            return tryRecover(hash, v, r, s);
        } else if (signature.length == 64) {
            bytes32 r;
            bytes32 vs;
            // ecrecover takes the signature parameters, and the only way to get them
            // currently is to use assembly.
            /// @solidity memory-safe-assembly
            assembly {
                r := mload(add(signature, 0x20))
                vs := mload(add(signature, 0x40))
            }
            return tryRecover(hash, r, vs);
        } else {
            return (address(0), RecoverError.InvalidSignatureLength);
        }
    }

    /**
     * @dev Returns the address that signed a hashed message (`hash`) with
     * `signature`. This address can then be used for verification purposes.
     *
     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
     * this function rejects them by requiring the `s` value to be in the lower
     * half order, and the `v` value to be either 27 or 28.
     *
     * IMPORTANT: `hash` _must_ be the result of a hash operation for the
     * verification to be secure: it is possible to craft signatures that
     * recover to arbitrary addresses for non-hashed data. A safe way to ensure
     * this is by receiving a hash of the original message (which may otherwise
     * be too long), and then calling {toEthSignedMessageHash} on it.
     */
    function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, signature);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.
     *
     * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures]
     *
     * _Available since v4.3._
     */
    function tryRecover(
        bytes32 hash,
        bytes32 r,
        bytes32 vs
    ) internal pure returns (address, RecoverError) {
        bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff);
        uint8 v = uint8((uint256(vs) >> 255) + 27);
        return tryRecover(hash, v, r, s);
    }

    /**
     * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.
     *
     * _Available since v4.2._
     */
    function recover(
        bytes32 hash,
        bytes32 r,
        bytes32 vs
    ) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, r, vs);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Overload of {ECDSA-tryRecover} that receives the `v`,
     * `r` and `s` signature fields separately.
     *
     * _Available since v4.3._
     */
    function tryRecover(
        bytes32 hash,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal pure returns (address, RecoverError) {
        // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature
        // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines
        // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most
        // signatures from current libraries generate a unique signature with an s-value in the lower half order.
        //
        // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value
        // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or
        // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept
        // these malleable signatures as well.
        if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {
            return (address(0), RecoverError.InvalidSignatureS);
        }
        if (v != 27 && v != 28) {
            return (address(0), RecoverError.InvalidSignatureV);
        }

        // If the signature is valid (and not malleable), return the signer address
        address signer = ecrecover(hash, v, r, s);
        if (signer == address(0)) {
            return (address(0), RecoverError.InvalidSignature);
        }

        return (signer, RecoverError.NoError);
    }

    /**
     * @dev Overload of {ECDSA-recover} that receives the `v`,
     * `r` and `s` signature fields separately.
     */
    function recover(
        bytes32 hash,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, v, r, s);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Returns an Ethereum Signed Message, created from a `hash`. This
     * produces hash corresponding to the one signed with the
     * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]
     * JSON-RPC method as part of EIP-191.
     *
     * See {recover}.
     */
    function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {
        // 32 is the length in bytes of hash,
        // enforced by the type signature above
        return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash));
    }

    /**
     * @dev Returns an Ethereum Signed Message, created from `s`. This
     * produces hash corresponding to the one signed with the
     * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]
     * JSON-RPC method as part of EIP-191.
     *
     * See {recover}.
     */
    function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n", Strings.toString(s.length), s));
    }

    /**
     * @dev Returns an Ethereum Signed Typed Data, created from a
     * `domainSeparator` and a `structHash`. This produces hash corresponding
     * to the one signed with the
     * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`]
     * JSON-RPC method as part of EIP-712.
     *
     * See {recover}.
     */
    function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash));
    }
}

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

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

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

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

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

    /**
     * @dev Gives permission to `to` to transfer `tokenId` token to another account.
     * The approval is cleared when the token is transferred.
     *
     * Only a single account can be approved at a time, so approving the
     * zero address clears previous approvals.
     *
     * Requirements:
     *
     * - The caller must own the token or be an approved operator.
     * - `tokenId` must exist.
     *
     * Emits an {Approval} event.
     */
    function approve(address to, uint256 tokenId) external;

    /**
     * @dev Approve or remove `operator` as an operator for the caller.
     * Operators can call {transferFrom} or {safeTransferFrom}
     * for any token owned by the caller.
     *
     * Requirements:
     *
     * - The `operator` cannot be the caller.
     *
     * Emits an {ApprovalForAll} event.
     */
    function setApprovalForAll(address operator, bool _approved) external;

    /**
     * @dev Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

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

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

    /**
     * @dev Returns the token collection name.
     */
    function name() external view returns (string memory);

    /**
     * @dev Returns the token collection symbol.
     */
    function symbol() external view returns (string memory);

    /**
     * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
     */
    function tokenURI(uint256 tokenId) external view returns (string memory);

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

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

// File: erc721a/contracts/ERC721A.sol


// ERC721A Contracts v4.2.2
// 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 {
    // Reference type for token approval.
    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 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 {
        if (operator == _msgSenderERC721A()) revert ApproveToCaller();

        _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]`.
        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 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 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 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.
            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`.
                )

                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 0x80 bytes to keep the free memory pointer 32-byte word aliged.
            // We will need 1 32-byte word to store the length,
            // and 3 32-byte words to store a maximum of 78 digits. Total: 0x20 + 3 * 0x20 = 0x80.
            str := add(mload(0x40), 0x80)
            // Update the free memory pointer to allocate.
            mstore(0x40, str)

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

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

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

// File: contracts/NFTPickerPass.sol



pragma solidity >= 0.0.5 < 0.8.16;




contract FreePickerPass is ERC721A, Ownable {
    using Strings for uint256;

    uint256 MAX_SUPPLY = 3000;
    uint256 public constant MINT_PER_WALLET = 1;
    uint256 public PUBLIC_MINT_PRICE = 0.03 ether;
    
    string public tokenBaseUrl = "https://dweb.link/ipfs/bafybeigrf2i7dk5zb3szg5uo6rznqu5ksfm62fxjkbi3wxkeh2imierfsi/assets/";
    string public tokenUrlSuffix = ".json";

    constructor () ERC721A("FREEPickerPass", "FREEPICKPass") {
    }

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

    function _suffix() internal view virtual returns (string memory) {
        return tokenUrlSuffix;
    }

    function setMintPrice(uint256 _mintPrice) external onlyOwner {
        PUBLIC_MINT_PRICE = _mintPrice;
    }
    
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        if (!_exists(tokenId)) revert URIQueryForNonexistentToken();
        
        string memory baseURI = _baseURI();
        string memory suffix = _suffix();
        
        return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, _toString(tokenId), suffix)) : '';
    }

    function mint(uint256 numTokens) external payable onlyOrigin mintCompliance(numTokens) {
        if(500 > totalSupply()){
            require(msg.value == 0,"Value supplied is incorrect");
        }else{
            require(msg.value == PUBLIC_MINT_PRICE, "Value supplied is incorrect");
        }
        _safeMint(msg.sender, numTokens);
    }

    function setTokenBaseUrl(string memory _tokenBaseUrl) public onlyOwner {
        tokenBaseUrl = _tokenBaseUrl;
    }

    function setTokenSuffix(string memory _tokenUrlSuffix) public onlyOwner {
        tokenUrlSuffix = _tokenUrlSuffix;
    }
    
    function drain(address payable to) external onlyOwner {
        to.transfer(address(this).balance);
    }

    // - modifiers

    modifier onlyOrigin() {
        // disallow access from contracts
        require(msg.sender == tx.origin, "Come on!!!");
        _;
    }

    modifier mintCompliance(uint256 _numTokens) {
        require(_numTokens > 0, "You must mint at least one token.");
        require(totalSupply() + _numTokens < MAX_SUPPLY, "Max supply exceeded!");
        require(_numberMinted(msg.sender) + _numTokens < MINT_PER_WALLET + 1,"You are exceeding your minting limit");
        _;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintERC2309QuantityExceedsLimit","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"OwnershipNotInitializedForExtraData","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"fromTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"toTokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"ConsecutiveTransfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MINT_PER_WALLET","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PUBLIC_MINT_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address payable","name":"to","type":"address"}],"name":"drain","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numTokens","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintPrice","type":"uint256"}],"name":"setMintPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_tokenBaseUrl","type":"string"}],"name":"setTokenBaseUrl","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_tokenUrlSuffix","type":"string"}],"name":"setTokenSuffix","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":[],"name":"tokenBaseUrl","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenUrlSuffix","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6080604052610bb8600955666a94d74f430000600a556040518060800160405280605a815260200162002f9c605a9139600b90805190602001906200004692919062000252565b506040518060400160405280600581526020017f2e6a736f6e000000000000000000000000000000000000000000000000000000815250600c90805190602001906200009492919062000252565b50348015620000a257600080fd5b506040518060400160405280600e81526020017f465245455069636b6572506173730000000000000000000000000000000000008152506040518060400160405280600c81526020017f465245455049434b50617373000000000000000000000000000000000000000081525081600290805190602001906200012792919062000252565b5080600390805190602001906200014092919062000252565b50620001516200017f60201b60201c565b6000819055505050620001796200016d6200018460201b60201c565b6200018c60201b60201c565b62000367565b600090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620002609062000302565b90600052602060002090601f016020900481019282620002845760008555620002d0565b82601f106200029f57805160ff1916838001178555620002d0565b82800160010185558215620002d0579182015b82811115620002cf578251825591602001919060010190620002b2565b5b509050620002df9190620002e3565b5090565b5b80821115620002fe576000816000905550600101620002e4565b5090565b600060028204905060018216806200031b57607f821691505b6020821081141562000332576200033162000338565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b612c2580620003776000396000f3fe6080604052600436106101815760003560e01c80636ea0061b116100d1578063a22cb4651161008a578063e985e9c511610064578063e985e9c514610561578063ece531321461059e578063f2fde38b146105c7578063f4a0a528146105f057610181565b8063a22cb465146104d2578063b88d4fde146104fb578063c87b56dd1461052457610181565b80636ea0061b146103e357806370a082311461040c578063715018a6146104495780638da5cb5b1461046057806395d89b411461048b578063a0712d68146104b657610181565b806318160ddd1161013e57806346419b161161011857806346419b16146103255780634fff968a146103505780636352211e1461037b5780636bde2627146103b857610181565b806318160ddd146102a857806323b872dd146102d357806342842e0e146102fc57610181565b806301ffc9a714610186578063041e4680146101c357806306fdde03146101ee578063081812fc14610219578063095ea7b3146102565780630ef6a94b1461027f575b600080fd5b34801561019257600080fd5b506101ad60048036038101906101a89190612289565b610619565b6040516101ba91906125b6565b60405180910390f35b3480156101cf57600080fd5b506101d86106ab565b6040516101e591906125d1565b60405180910390f35b3480156101fa57600080fd5b50610203610739565b60405161021091906125d1565b60405180910390f35b34801561022557600080fd5b50610240600480360381019061023b919061232c565b6107cb565b60405161024d919061254f565b60405180910390f35b34801561026257600080fd5b5061027d60048036038101906102789190612249565b61084a565b005b34801561028b57600080fd5b506102a660048036038101906102a191906122e3565b61098e565b005b3480156102b457600080fd5b506102bd6109b0565b6040516102ca91906126d3565b60405180910390f35b3480156102df57600080fd5b506102fa60048036038101906102f59190612133565b6109c7565b005b34801561030857600080fd5b50610323600480360381019061031e9190612133565b610cec565b005b34801561033157600080fd5b5061033a610d0c565b60405161034791906125d1565b60405180910390f35b34801561035c57600080fd5b50610365610d9a565b60405161037291906126d3565b60405180910390f35b34801561038757600080fd5b506103a2600480360381019061039d919061232c565b610d9f565b6040516103af919061254f565b60405180910390f35b3480156103c457600080fd5b506103cd610db1565b6040516103da91906126d3565b60405180910390f35b3480156103ef57600080fd5b5061040a600480360381019061040591906122e3565b610db7565b005b34801561041857600080fd5b50610433600480360381019061042e9190612099565b610dd9565b60405161044091906126d3565b60405180910390f35b34801561045557600080fd5b5061045e610e92565b005b34801561046c57600080fd5b50610475610ea6565b604051610482919061254f565b60405180910390f35b34801561049757600080fd5b506104a0610ed0565b6040516104ad91906125d1565b60405180910390f35b6104d060048036038101906104cb919061232c565b610f62565b005b3480156104de57600080fd5b506104f960048036038101906104f49190612209565b611177565b005b34801561050757600080fd5b50610522600480360381019061051d9190612186565b6112ef565b005b34801561053057600080fd5b5061054b6004803603810190610546919061232c565b611362565b60405161055891906125d1565b60405180910390f35b34801561056d57600080fd5b50610588600480360381019061058391906120f3565b611410565b60405161059591906125b6565b60405180910390f35b3480156105aa57600080fd5b506105c560048036038101906105c091906120c6565b6114a4565b005b3480156105d357600080fd5b506105ee60048036038101906105e99190612099565b6114f6565b005b3480156105fc57600080fd5b506106176004803603810190610612919061232c565b61157a565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061067457506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806106a45750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b600b80546106b8906128d6565b80601f01602080910402602001604051908101604052809291908181526020018280546106e4906128d6565b80156107315780601f1061070657610100808354040283529160200191610731565b820191906000526020600020905b81548152906001019060200180831161071457829003601f168201915b505050505081565b606060028054610748906128d6565b80601f0160208091040260200160405190810160405280929190818152602001828054610774906128d6565b80156107c15780601f10610796576101008083540402835291602001916107c1565b820191906000526020600020905b8154815290600101906020018083116107a457829003601f168201915b5050505050905090565b60006107d68261158c565b61080c576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061085582610d9f565b90508073ffffffffffffffffffffffffffffffffffffffff166108766115eb565b73ffffffffffffffffffffffffffffffffffffffff16146108d9576108a28161089d6115eb565b611410565b6108d8576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6109966115f3565b80600c90805190602001906109ac929190611e98565b5050565b60006109ba611671565b6001546000540303905090565b60006109d282611676565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610a39576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080610a4584611744565b91509150610a5b8187610a566115eb565b61176b565b610aa757610a7086610a6b6115eb565b611410565b610aa6576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415610b0e576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610b1b86868660016117af565b8015610b2657600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815460010191905081905550610bf485610bd08888876117b5565b7c0200000000000000000000000000000000000000000000000000000000176117dd565b600460008681526020019081526020016000208190555060007c020000000000000000000000000000000000000000000000000000000084161415610c7c576000600185019050600060046000838152602001908152602001600020541415610c7a576000548114610c79578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4610ce48686866001611808565b505050505050565b610d07838383604051806020016040528060008152506112ef565b505050565b600c8054610d19906128d6565b80601f0160208091040260200160405190810160405280929190818152602001828054610d45906128d6565b8015610d925780601f10610d6757610100808354040283529160200191610d92565b820191906000526020600020905b815481529060010190602001808311610d7557829003601f168201915b505050505081565b600181565b6000610daa82611676565b9050919050565b600a5481565b610dbf6115f3565b80600b9080519060200190610dd5929190611e98565b5050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610e41576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b610e9a6115f3565b610ea4600061180e565b565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060038054610edf906128d6565b80601f0160208091040260200160405190810160405280929190818152602001828054610f0b906128d6565b8015610f585780601f10610f2d57610100808354040283529160200191610f58565b820191906000526020600020905b815481529060010190602001808311610f3b57829003601f168201915b5050505050905090565b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610fd0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fc790612673565b60405180910390fd5b8060008111611014576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161100b90612693565b60405180910390fd5b600954816110206109b0565b61102a91906127b8565b1061106a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161106190612653565b60405180910390fd5b60018061107791906127b8565b81611081336118d4565b61108b91906127b8565b106110cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110c2906126b3565b60405180910390fd5b6110d36109b0565b6101f41115611124576000341461111f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161111690612633565b60405180910390fd5b611169565b600a543414611168576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161115f90612633565b60405180910390fd5b5b611173338361192b565b5050565b61117f6115eb565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156111e4576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600760006111f16115eb565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661129e6115eb565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516112e391906125b6565b60405180910390a35050565b6112fa8484846109c7565b60008373ffffffffffffffffffffffffffffffffffffffff163b1461135c5761132584848484611949565b61135b576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b606061136d8261158c565b6113a3576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006113ad611aa9565b905060006113b9611b3b565b90506000825114156113da5760405180602001604052806000815250611407565b816113e485611bcd565b826040516020016113f79392919061251e565b6040516020818303038152906040525b92505050919050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6114ac6115f3565b8073ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f193505050501580156114f2573d6000803e3d6000fd5b5050565b6114fe6115f3565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561156e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611565906125f3565b60405180910390fd5b6115778161180e565b50565b6115826115f3565b80600a8190555050565b600081611597611671565b111580156115a6575060005482105b80156115e4575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600033905090565b6115fb611c1d565b73ffffffffffffffffffffffffffffffffffffffff16611619610ea6565b73ffffffffffffffffffffffffffffffffffffffff161461166f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161166690612613565b60405180910390fd5b565b600090565b60008082905080611685611671565b1161170d5760005481101561170c5760006004600083815260200190815260200160002054905060007c01000000000000000000000000000000000000000000000000000000008216141561170a575b60008114156117005760046000836001900393508381526020019081526020016000205490506116d5565b809250505061173f565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060006006600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e86117cc868684611c25565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600067ffffffffffffffff6040600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054901c169050919050565b611945828260405180602001604052806000815250611c2e565b5050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261196f6115eb565b8786866040518563ffffffff1660e01b8152600401611991949392919061256a565b602060405180830381600087803b1580156119ab57600080fd5b505af19250505080156119dc57506040513d601f19601f820116820180604052508101906119d991906122b6565b60015b611a56573d8060008114611a0c576040519150601f19603f3d011682016040523d82523d6000602084013e611a11565b606091505b50600081511415611a4e576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600b8054611ab8906128d6565b80601f0160208091040260200160405190810160405280929190818152602001828054611ae4906128d6565b8015611b315780601f10611b0657610100808354040283529160200191611b31565b820191906000526020600020905b815481529060010190602001808311611b1457829003601f168201915b5050505050905090565b6060600c8054611b4a906128d6565b80601f0160208091040260200160405190810160405280929190818152602001828054611b76906128d6565b8015611bc35780601f10611b9857610100808354040283529160200191611bc3565b820191906000526020600020905b815481529060010190602001808311611ba657829003601f168201915b5050505050905090565b606060806040510190508060405280825b600115611c0957600183039250600a81066030018353600a8104905080611c0457611c09565b611bde565b508181036020830392508083525050919050565b600033905090565b60009392505050565b611c388383611ccb565b60008373ffffffffffffffffffffffffffffffffffffffff163b14611cc657600080549050600083820390505b611c786000868380600101945086611949565b611cae576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b818110611c65578160005414611cc357600080fd5b50505b505050565b6000805490506000821415611d0c576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611d1960008483856117af565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550611d9083611d8160008660006117b5565b611d8a85611e88565b176117dd565b6004600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b818114611e3157808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600181019050611df6565b506000821415611e6d576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806000819055505050611e836000848385611808565b505050565b60006001821460e11b9050919050565b828054611ea4906128d6565b90600052602060002090601f016020900481019282611ec65760008555611f0d565b82601f10611edf57805160ff1916838001178555611f0d565b82800160010185558215611f0d579182015b82811115611f0c578251825591602001919060010190611ef1565b5b509050611f1a9190611f1e565b5090565b5b80821115611f37576000816000905550600101611f1f565b5090565b6000611f4e611f4984612713565b6126ee565b905082815260208101848484011115611f6a57611f696129cb565b5b611f75848285612894565b509392505050565b6000611f90611f8b84612744565b6126ee565b905082815260208101848484011115611fac57611fab6129cb565b5b611fb7848285612894565b509392505050565b600081359050611fce81612b7c565b92915050565b600081359050611fe381612b93565b92915050565b600081359050611ff881612baa565b92915050565b60008135905061200d81612bc1565b92915050565b60008151905061202281612bc1565b92915050565b600082601f83011261203d5761203c6129c6565b5b813561204d848260208601611f3b565b91505092915050565b600082601f83011261206b5761206a6129c6565b5b813561207b848260208601611f7d565b91505092915050565b60008135905061209381612bd8565b92915050565b6000602082840312156120af576120ae6129d5565b5b60006120bd84828501611fbf565b91505092915050565b6000602082840312156120dc576120db6129d5565b5b60006120ea84828501611fd4565b91505092915050565b6000806040838503121561210a576121096129d5565b5b600061211885828601611fbf565b925050602061212985828601611fbf565b9150509250929050565b60008060006060848603121561214c5761214b6129d5565b5b600061215a86828701611fbf565b935050602061216b86828701611fbf565b925050604061217c86828701612084565b9150509250925092565b600080600080608085870312156121a05761219f6129d5565b5b60006121ae87828801611fbf565b94505060206121bf87828801611fbf565b93505060406121d087828801612084565b925050606085013567ffffffffffffffff8111156121f1576121f06129d0565b5b6121fd87828801612028565b91505092959194509250565b600080604083850312156122205761221f6129d5565b5b600061222e85828601611fbf565b925050602061223f85828601611fe9565b9150509250929050565b600080604083850312156122605761225f6129d5565b5b600061226e85828601611fbf565b925050602061227f85828601612084565b9150509250929050565b60006020828403121561229f5761229e6129d5565b5b60006122ad84828501611ffe565b91505092915050565b6000602082840312156122cc576122cb6129d5565b5b60006122da84828501612013565b91505092915050565b6000602082840312156122f9576122f86129d5565b5b600082013567ffffffffffffffff811115612317576123166129d0565b5b61232384828501612056565b91505092915050565b600060208284031215612342576123416129d5565b5b600061235084828501612084565b91505092915050565b6123628161280e565b82525050565b61237181612832565b82525050565b600061238282612775565b61238c818561278b565b935061239c8185602086016128a3565b6123a5816129da565b840191505092915050565b60006123bb82612780565b6123c5818561279c565b93506123d58185602086016128a3565b6123de816129da565b840191505092915050565b60006123f482612780565b6123fe81856127ad565b935061240e8185602086016128a3565b80840191505092915050565b600061242760268361279c565b9150612432826129eb565b604082019050919050565b600061244a60208361279c565b915061245582612a3a565b602082019050919050565b600061246d601b8361279c565b915061247882612a63565b602082019050919050565b600061249060148361279c565b915061249b82612a8c565b602082019050919050565b60006124b3600a8361279c565b91506124be82612ab5565b602082019050919050565b60006124d660218361279c565b91506124e182612ade565b604082019050919050565b60006124f960248361279c565b915061250482612b2d565b604082019050919050565b6125188161288a565b82525050565b600061252a82866123e9565b915061253682856123e9565b915061254282846123e9565b9150819050949350505050565b60006020820190506125646000830184612359565b92915050565b600060808201905061257f6000830187612359565b61258c6020830186612359565b612599604083018561250f565b81810360608301526125ab8184612377565b905095945050505050565b60006020820190506125cb6000830184612368565b92915050565b600060208201905081810360008301526125eb81846123b0565b905092915050565b6000602082019050818103600083015261260c8161241a565b9050919050565b6000602082019050818103600083015261262c8161243d565b9050919050565b6000602082019050818103600083015261264c81612460565b9050919050565b6000602082019050818103600083015261266c81612483565b9050919050565b6000602082019050818103600083015261268c816124a6565b9050919050565b600060208201905081810360008301526126ac816124c9565b9050919050565b600060208201905081810360008301526126cc816124ec565b9050919050565b60006020820190506126e8600083018461250f565b92915050565b60006126f8612709565b90506127048282612908565b919050565b6000604051905090565b600067ffffffffffffffff82111561272e5761272d612997565b5b612737826129da565b9050602081019050919050565b600067ffffffffffffffff82111561275f5761275e612997565b5b612768826129da565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006127c38261288a565b91506127ce8361288a565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561280357612802612939565b5b828201905092915050565b60006128198261286a565b9050919050565b600061282b8261286a565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156128c15780820151818401526020810190506128a6565b838111156128d0576000848401525b50505050565b600060028204905060018216806128ee57607f821691505b6020821081141561290257612901612968565b5b50919050565b612911826129da565b810181811067ffffffffffffffff821117156129305761292f612997565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f56616c756520737570706c69656420697320696e636f72726563740000000000600082015250565b7f4d617820737570706c7920657863656564656421000000000000000000000000600082015250565b7f436f6d65206f6e21212100000000000000000000000000000000000000000000600082015250565b7f596f75206d757374206d696e74206174206c65617374206f6e6520746f6b656e60008201527f2e00000000000000000000000000000000000000000000000000000000000000602082015250565b7f596f752061726520657863656564696e6720796f7572206d696e74696e67206c60008201527f696d697400000000000000000000000000000000000000000000000000000000602082015250565b612b858161280e565b8114612b9057600080fd5b50565b612b9c81612820565b8114612ba757600080fd5b50565b612bb381612832565b8114612bbe57600080fd5b50565b612bca8161283e565b8114612bd557600080fd5b50565b612be18161288a565b8114612bec57600080fd5b5056fea26469706673582212201a314be9756ca04a415eeeb103ab88103ff75d9f0f45bab8e77a24932225a84464736f6c6343000807003368747470733a2f2f647765622e6c696e6b2f697066732f62616679626569677266326937646b357a6233737a6735756f36727a6e7175356b73666d363266786a6b62693377786b656832696d6965726673692f6173736574732f

Deployed Bytecode

0x6080604052600436106101815760003560e01c80636ea0061b116100d1578063a22cb4651161008a578063e985e9c511610064578063e985e9c514610561578063ece531321461059e578063f2fde38b146105c7578063f4a0a528146105f057610181565b8063a22cb465146104d2578063b88d4fde146104fb578063c87b56dd1461052457610181565b80636ea0061b146103e357806370a082311461040c578063715018a6146104495780638da5cb5b1461046057806395d89b411461048b578063a0712d68146104b657610181565b806318160ddd1161013e57806346419b161161011857806346419b16146103255780634fff968a146103505780636352211e1461037b5780636bde2627146103b857610181565b806318160ddd146102a857806323b872dd146102d357806342842e0e146102fc57610181565b806301ffc9a714610186578063041e4680146101c357806306fdde03146101ee578063081812fc14610219578063095ea7b3146102565780630ef6a94b1461027f575b600080fd5b34801561019257600080fd5b506101ad60048036038101906101a89190612289565b610619565b6040516101ba91906125b6565b60405180910390f35b3480156101cf57600080fd5b506101d86106ab565b6040516101e591906125d1565b60405180910390f35b3480156101fa57600080fd5b50610203610739565b60405161021091906125d1565b60405180910390f35b34801561022557600080fd5b50610240600480360381019061023b919061232c565b6107cb565b60405161024d919061254f565b60405180910390f35b34801561026257600080fd5b5061027d60048036038101906102789190612249565b61084a565b005b34801561028b57600080fd5b506102a660048036038101906102a191906122e3565b61098e565b005b3480156102b457600080fd5b506102bd6109b0565b6040516102ca91906126d3565b60405180910390f35b3480156102df57600080fd5b506102fa60048036038101906102f59190612133565b6109c7565b005b34801561030857600080fd5b50610323600480360381019061031e9190612133565b610cec565b005b34801561033157600080fd5b5061033a610d0c565b60405161034791906125d1565b60405180910390f35b34801561035c57600080fd5b50610365610d9a565b60405161037291906126d3565b60405180910390f35b34801561038757600080fd5b506103a2600480360381019061039d919061232c565b610d9f565b6040516103af919061254f565b60405180910390f35b3480156103c457600080fd5b506103cd610db1565b6040516103da91906126d3565b60405180910390f35b3480156103ef57600080fd5b5061040a600480360381019061040591906122e3565b610db7565b005b34801561041857600080fd5b50610433600480360381019061042e9190612099565b610dd9565b60405161044091906126d3565b60405180910390f35b34801561045557600080fd5b5061045e610e92565b005b34801561046c57600080fd5b50610475610ea6565b604051610482919061254f565b60405180910390f35b34801561049757600080fd5b506104a0610ed0565b6040516104ad91906125d1565b60405180910390f35b6104d060048036038101906104cb919061232c565b610f62565b005b3480156104de57600080fd5b506104f960048036038101906104f49190612209565b611177565b005b34801561050757600080fd5b50610522600480360381019061051d9190612186565b6112ef565b005b34801561053057600080fd5b5061054b6004803603810190610546919061232c565b611362565b60405161055891906125d1565b60405180910390f35b34801561056d57600080fd5b50610588600480360381019061058391906120f3565b611410565b60405161059591906125b6565b60405180910390f35b3480156105aa57600080fd5b506105c560048036038101906105c091906120c6565b6114a4565b005b3480156105d357600080fd5b506105ee60048036038101906105e99190612099565b6114f6565b005b3480156105fc57600080fd5b506106176004803603810190610612919061232c565b61157a565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061067457506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806106a45750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b600b80546106b8906128d6565b80601f01602080910402602001604051908101604052809291908181526020018280546106e4906128d6565b80156107315780601f1061070657610100808354040283529160200191610731565b820191906000526020600020905b81548152906001019060200180831161071457829003601f168201915b505050505081565b606060028054610748906128d6565b80601f0160208091040260200160405190810160405280929190818152602001828054610774906128d6565b80156107c15780601f10610796576101008083540402835291602001916107c1565b820191906000526020600020905b8154815290600101906020018083116107a457829003601f168201915b5050505050905090565b60006107d68261158c565b61080c576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061085582610d9f565b90508073ffffffffffffffffffffffffffffffffffffffff166108766115eb565b73ffffffffffffffffffffffffffffffffffffffff16146108d9576108a28161089d6115eb565b611410565b6108d8576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6109966115f3565b80600c90805190602001906109ac929190611e98565b5050565b60006109ba611671565b6001546000540303905090565b60006109d282611676565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610a39576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080610a4584611744565b91509150610a5b8187610a566115eb565b61176b565b610aa757610a7086610a6b6115eb565b611410565b610aa6576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415610b0e576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610b1b86868660016117af565b8015610b2657600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815460010191905081905550610bf485610bd08888876117b5565b7c0200000000000000000000000000000000000000000000000000000000176117dd565b600460008681526020019081526020016000208190555060007c020000000000000000000000000000000000000000000000000000000084161415610c7c576000600185019050600060046000838152602001908152602001600020541415610c7a576000548114610c79578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4610ce48686866001611808565b505050505050565b610d07838383604051806020016040528060008152506112ef565b505050565b600c8054610d19906128d6565b80601f0160208091040260200160405190810160405280929190818152602001828054610d45906128d6565b8015610d925780601f10610d6757610100808354040283529160200191610d92565b820191906000526020600020905b815481529060010190602001808311610d7557829003601f168201915b505050505081565b600181565b6000610daa82611676565b9050919050565b600a5481565b610dbf6115f3565b80600b9080519060200190610dd5929190611e98565b5050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610e41576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b610e9a6115f3565b610ea4600061180e565b565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060038054610edf906128d6565b80601f0160208091040260200160405190810160405280929190818152602001828054610f0b906128d6565b8015610f585780601f10610f2d57610100808354040283529160200191610f58565b820191906000526020600020905b815481529060010190602001808311610f3b57829003601f168201915b5050505050905090565b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610fd0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fc790612673565b60405180910390fd5b8060008111611014576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161100b90612693565b60405180910390fd5b600954816110206109b0565b61102a91906127b8565b1061106a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161106190612653565b60405180910390fd5b60018061107791906127b8565b81611081336118d4565b61108b91906127b8565b106110cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110c2906126b3565b60405180910390fd5b6110d36109b0565b6101f41115611124576000341461111f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161111690612633565b60405180910390fd5b611169565b600a543414611168576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161115f90612633565b60405180910390fd5b5b611173338361192b565b5050565b61117f6115eb565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156111e4576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600760006111f16115eb565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661129e6115eb565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516112e391906125b6565b60405180910390a35050565b6112fa8484846109c7565b60008373ffffffffffffffffffffffffffffffffffffffff163b1461135c5761132584848484611949565b61135b576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b606061136d8261158c565b6113a3576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006113ad611aa9565b905060006113b9611b3b565b90506000825114156113da5760405180602001604052806000815250611407565b816113e485611bcd565b826040516020016113f79392919061251e565b6040516020818303038152906040525b92505050919050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6114ac6115f3565b8073ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f193505050501580156114f2573d6000803e3d6000fd5b5050565b6114fe6115f3565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561156e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611565906125f3565b60405180910390fd5b6115778161180e565b50565b6115826115f3565b80600a8190555050565b600081611597611671565b111580156115a6575060005482105b80156115e4575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600033905090565b6115fb611c1d565b73ffffffffffffffffffffffffffffffffffffffff16611619610ea6565b73ffffffffffffffffffffffffffffffffffffffff161461166f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161166690612613565b60405180910390fd5b565b600090565b60008082905080611685611671565b1161170d5760005481101561170c5760006004600083815260200190815260200160002054905060007c01000000000000000000000000000000000000000000000000000000008216141561170a575b60008114156117005760046000836001900393508381526020019081526020016000205490506116d5565b809250505061173f565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060006006600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e86117cc868684611c25565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600067ffffffffffffffff6040600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054901c169050919050565b611945828260405180602001604052806000815250611c2e565b5050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261196f6115eb565b8786866040518563ffffffff1660e01b8152600401611991949392919061256a565b602060405180830381600087803b1580156119ab57600080fd5b505af19250505080156119dc57506040513d601f19601f820116820180604052508101906119d991906122b6565b60015b611a56573d8060008114611a0c576040519150601f19603f3d011682016040523d82523d6000602084013e611a11565b606091505b50600081511415611a4e576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600b8054611ab8906128d6565b80601f0160208091040260200160405190810160405280929190818152602001828054611ae4906128d6565b8015611b315780601f10611b0657610100808354040283529160200191611b31565b820191906000526020600020905b815481529060010190602001808311611b1457829003601f168201915b5050505050905090565b6060600c8054611b4a906128d6565b80601f0160208091040260200160405190810160405280929190818152602001828054611b76906128d6565b8015611bc35780601f10611b9857610100808354040283529160200191611bc3565b820191906000526020600020905b815481529060010190602001808311611ba657829003601f168201915b5050505050905090565b606060806040510190508060405280825b600115611c0957600183039250600a81066030018353600a8104905080611c0457611c09565b611bde565b508181036020830392508083525050919050565b600033905090565b60009392505050565b611c388383611ccb565b60008373ffffffffffffffffffffffffffffffffffffffff163b14611cc657600080549050600083820390505b611c786000868380600101945086611949565b611cae576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b818110611c65578160005414611cc357600080fd5b50505b505050565b6000805490506000821415611d0c576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611d1960008483856117af565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550611d9083611d8160008660006117b5565b611d8a85611e88565b176117dd565b6004600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b818114611e3157808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600181019050611df6565b506000821415611e6d576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806000819055505050611e836000848385611808565b505050565b60006001821460e11b9050919050565b828054611ea4906128d6565b90600052602060002090601f016020900481019282611ec65760008555611f0d565b82601f10611edf57805160ff1916838001178555611f0d565b82800160010185558215611f0d579182015b82811115611f0c578251825591602001919060010190611ef1565b5b509050611f1a9190611f1e565b5090565b5b80821115611f37576000816000905550600101611f1f565b5090565b6000611f4e611f4984612713565b6126ee565b905082815260208101848484011115611f6a57611f696129cb565b5b611f75848285612894565b509392505050565b6000611f90611f8b84612744565b6126ee565b905082815260208101848484011115611fac57611fab6129cb565b5b611fb7848285612894565b509392505050565b600081359050611fce81612b7c565b92915050565b600081359050611fe381612b93565b92915050565b600081359050611ff881612baa565b92915050565b60008135905061200d81612bc1565b92915050565b60008151905061202281612bc1565b92915050565b600082601f83011261203d5761203c6129c6565b5b813561204d848260208601611f3b565b91505092915050565b600082601f83011261206b5761206a6129c6565b5b813561207b848260208601611f7d565b91505092915050565b60008135905061209381612bd8565b92915050565b6000602082840312156120af576120ae6129d5565b5b60006120bd84828501611fbf565b91505092915050565b6000602082840312156120dc576120db6129d5565b5b60006120ea84828501611fd4565b91505092915050565b6000806040838503121561210a576121096129d5565b5b600061211885828601611fbf565b925050602061212985828601611fbf565b9150509250929050565b60008060006060848603121561214c5761214b6129d5565b5b600061215a86828701611fbf565b935050602061216b86828701611fbf565b925050604061217c86828701612084565b9150509250925092565b600080600080608085870312156121a05761219f6129d5565b5b60006121ae87828801611fbf565b94505060206121bf87828801611fbf565b93505060406121d087828801612084565b925050606085013567ffffffffffffffff8111156121f1576121f06129d0565b5b6121fd87828801612028565b91505092959194509250565b600080604083850312156122205761221f6129d5565b5b600061222e85828601611fbf565b925050602061223f85828601611fe9565b9150509250929050565b600080604083850312156122605761225f6129d5565b5b600061226e85828601611fbf565b925050602061227f85828601612084565b9150509250929050565b60006020828403121561229f5761229e6129d5565b5b60006122ad84828501611ffe565b91505092915050565b6000602082840312156122cc576122cb6129d5565b5b60006122da84828501612013565b91505092915050565b6000602082840312156122f9576122f86129d5565b5b600082013567ffffffffffffffff811115612317576123166129d0565b5b61232384828501612056565b91505092915050565b600060208284031215612342576123416129d5565b5b600061235084828501612084565b91505092915050565b6123628161280e565b82525050565b61237181612832565b82525050565b600061238282612775565b61238c818561278b565b935061239c8185602086016128a3565b6123a5816129da565b840191505092915050565b60006123bb82612780565b6123c5818561279c565b93506123d58185602086016128a3565b6123de816129da565b840191505092915050565b60006123f482612780565b6123fe81856127ad565b935061240e8185602086016128a3565b80840191505092915050565b600061242760268361279c565b9150612432826129eb565b604082019050919050565b600061244a60208361279c565b915061245582612a3a565b602082019050919050565b600061246d601b8361279c565b915061247882612a63565b602082019050919050565b600061249060148361279c565b915061249b82612a8c565b602082019050919050565b60006124b3600a8361279c565b91506124be82612ab5565b602082019050919050565b60006124d660218361279c565b91506124e182612ade565b604082019050919050565b60006124f960248361279c565b915061250482612b2d565b604082019050919050565b6125188161288a565b82525050565b600061252a82866123e9565b915061253682856123e9565b915061254282846123e9565b9150819050949350505050565b60006020820190506125646000830184612359565b92915050565b600060808201905061257f6000830187612359565b61258c6020830186612359565b612599604083018561250f565b81810360608301526125ab8184612377565b905095945050505050565b60006020820190506125cb6000830184612368565b92915050565b600060208201905081810360008301526125eb81846123b0565b905092915050565b6000602082019050818103600083015261260c8161241a565b9050919050565b6000602082019050818103600083015261262c8161243d565b9050919050565b6000602082019050818103600083015261264c81612460565b9050919050565b6000602082019050818103600083015261266c81612483565b9050919050565b6000602082019050818103600083015261268c816124a6565b9050919050565b600060208201905081810360008301526126ac816124c9565b9050919050565b600060208201905081810360008301526126cc816124ec565b9050919050565b60006020820190506126e8600083018461250f565b92915050565b60006126f8612709565b90506127048282612908565b919050565b6000604051905090565b600067ffffffffffffffff82111561272e5761272d612997565b5b612737826129da565b9050602081019050919050565b600067ffffffffffffffff82111561275f5761275e612997565b5b612768826129da565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006127c38261288a565b91506127ce8361288a565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561280357612802612939565b5b828201905092915050565b60006128198261286a565b9050919050565b600061282b8261286a565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156128c15780820151818401526020810190506128a6565b838111156128d0576000848401525b50505050565b600060028204905060018216806128ee57607f821691505b6020821081141561290257612901612968565b5b50919050565b612911826129da565b810181811067ffffffffffffffff821117156129305761292f612997565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f56616c756520737570706c69656420697320696e636f72726563740000000000600082015250565b7f4d617820737570706c7920657863656564656421000000000000000000000000600082015250565b7f436f6d65206f6e21212100000000000000000000000000000000000000000000600082015250565b7f596f75206d757374206d696e74206174206c65617374206f6e6520746f6b656e60008201527f2e00000000000000000000000000000000000000000000000000000000000000602082015250565b7f596f752061726520657863656564696e6720796f7572206d696e74696e67206c60008201527f696d697400000000000000000000000000000000000000000000000000000000602082015250565b612b858161280e565b8114612b9057600080fd5b50565b612b9c81612820565b8114612ba757600080fd5b50565b612bb381612832565b8114612bbe57600080fd5b50565b612bca8161283e565b8114612bd557600080fd5b50565b612be18161288a565b8114612bec57600080fd5b5056fea26469706673582212201a314be9756ca04a415eeeb103ab88103ff75d9f0f45bab8e77a24932225a84464736f6c63430008070033

Deployed Bytecode Sourcemap

66669:2472:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34190:639;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66894:121;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35092:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41575:218;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41016:400;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;68379:123;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30843:323;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45282:2817;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48195:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;67022:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66786:43;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36485:152;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66836:45;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68253:118;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32027:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;14938:103;;;;;;;;;;;;;:::i;:::-;;14290:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35268:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67893:352;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42133:308;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48978:399;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;67498:387;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42598:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68514:107;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;15196:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;67376:110;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34190:639;34275:4;34614:10;34599:25;;:11;:25;;;;:102;;;;34691:10;34676:25;;:11;:25;;;;34599:102;:179;;;;34768:10;34753:25;;:11;:25;;;;34599:179;34579:199;;34190:639;;;:::o;66894:121::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;35092:100::-;35146:13;35179:5;35172:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35092:100;:::o;41575:218::-;41651:7;41676:16;41684:7;41676;:16::i;:::-;41671:64;;41701:34;;;;;;;;;;;;;;41671:64;41755:15;:24;41771:7;41755:24;;;;;;;;;;;:30;;;;;;;;;;;;41748:37;;41575:218;;;:::o;41016:400::-;41097:13;41113:16;41121:7;41113;:16::i;:::-;41097:32;;41169:5;41146:28;;:19;:17;:19::i;:::-;:28;;;41142:175;;41194:44;41211:5;41218:19;:17;:19::i;:::-;41194:16;:44::i;:::-;41189:128;;41266:35;;;;;;;;;;;;;;41189:128;41142:175;41362:2;41329:15;:24;41345:7;41329:24;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;41400:7;41396:2;41380:28;;41389:5;41380:28;;;;;;;;;;;;41086:330;41016:400;;:::o;68379:123::-;14176:13;:11;:13::i;:::-;68479:15:::1;68462:14;:32;;;;;;;;;;;;:::i;:::-;;68379:123:::0;:::o;30843:323::-;30904:7;31132:15;:13;:15::i;:::-;31117:12;;31101:13;;:28;:46;31094:53;;30843:323;:::o;45282:2817::-;45416:27;45446;45465:7;45446:18;:27::i;:::-;45416:57;;45531:4;45490:45;;45506:19;45490:45;;;45486:86;;45544:28;;;;;;;;;;;;;;45486:86;45586:27;45615:23;45642:35;45669:7;45642:26;:35::i;:::-;45585:92;;;;45777:68;45802:15;45819:4;45825:19;:17;:19::i;:::-;45777:24;:68::i;:::-;45772:180;;45865:43;45882:4;45888:19;:17;:19::i;:::-;45865:16;:43::i;:::-;45860:92;;45917:35;;;;;;;;;;;;;;45860:92;45772:180;45983:1;45969:16;;:2;:16;;;45965:52;;;45994:23;;;;;;;;;;;;;;45965:52;46030:43;46052:4;46058:2;46062:7;46071:1;46030:21;:43::i;:::-;46166:15;46163:160;;;46306:1;46285:19;46278:30;46163:160;46703:18;:24;46722:4;46703:24;;;;;;;;;;;;;;;;46701:26;;;;;;;;;;;;46772:18;:22;46791:2;46772:22;;;;;;;;;;;;;;;;46770:24;;;;;;;;;;;47094:146;47131:2;47180:45;47195:4;47201:2;47205:19;47180:14;:45::i;:::-;27242:8;47152:73;47094:18;:146::i;:::-;47065:17;:26;47083:7;47065:26;;;;;;;;;;;:175;;;;47411:1;27242:8;47360:19;:47;:52;47356:627;;;47433:19;47465:1;47455:7;:11;47433:33;;47622:1;47588:17;:30;47606:11;47588:30;;;;;;;;;;;;:35;47584:384;;;47726:13;;47711:11;:28;47707:242;;47906:19;47873:17;:30;47891:11;47873:30;;;;;;;;;;;:52;;;;47707:242;47584:384;47414:569;47356:627;48030:7;48026:2;48011:27;;48020:4;48011:27;;;;;;;;;;;;48049:42;48070:4;48076:2;48080:7;48089:1;48049:20;:42::i;:::-;45405:2694;;;45282:2817;;;:::o;48195:185::-;48333:39;48350:4;48356:2;48360:7;48333:39;;;;;;;;;;;;:16;:39::i;:::-;48195:185;;;:::o;67022:38::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;66786:43::-;66828:1;66786:43;:::o;36485:152::-;36557:7;36600:27;36619:7;36600:18;:27::i;:::-;36577:52;;36485:152;;;:::o;66836:45::-;;;;:::o;68253:118::-;14176:13;:11;:13::i;:::-;68350::::1;68335:12;:28;;;;;;;;;;;;:::i;:::-;;68253:118:::0;:::o;32027:233::-;32099:7;32140:1;32123:19;;:5;:19;;;32119:60;;;32151:28;;;;;;;;;;;;;;32119:60;26186:13;32197:18;:25;32216:5;32197:25;;;;;;;;;;;;;;;;:55;32190:62;;32027:233;;;:::o;14938:103::-;14176:13;:11;:13::i;:::-;15003:30:::1;15030:1;15003:18;:30::i;:::-;14938:103::o:0;14290:87::-;14336:7;14363:6;;;;;;;;;;;14356:13;;14290:87;:::o;35268:104::-;35324:13;35357:7;35350:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35268:104;:::o;67893:352::-;68749:9;68735:23;;:10;:23;;;68727:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;67969:9:::1;68877:1;68864:10;:14;68856:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;68964:10;;68951;68935:13;:11;:13::i;:::-;:26;;;;:::i;:::-;:39;68927:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;69077:1;66828::::0;69059:19:::1;;;;:::i;:::-;69046:10;69018:25;69032:10;69018:13;:25::i;:::-;:38;;;;:::i;:::-;:60;69010:108;;;;;;;;;;;;:::i;:::-;;;;;;;;;68000:13:::2;:11;:13::i;:::-;67994:3;:19;67991:204;;;68050:1;68037:9;:14;68029:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;67991:204;;;68134:17;;68121:9;:30;68113:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;67991:204;68205:32;68215:10;68227:9;68205;:32::i;:::-;68784:1:::1;67893:352:::0;:::o;42133:308::-;42244:19;:17;:19::i;:::-;42232:31;;:8;:31;;;42228:61;;;42272:17;;;;;;;;;;;;;;42228:61;42354:8;42302:18;:39;42321:19;:17;:19::i;:::-;42302:39;;;;;;;;;;;;;;;:49;42342:8;42302:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;42414:8;42378:55;;42393:19;:17;:19::i;:::-;42378:55;;;42424:8;42378:55;;;;;;:::i;:::-;;;;;;;;42133:308;;:::o;48978:399::-;49145:31;49158:4;49164:2;49168:7;49145:12;:31::i;:::-;49209:1;49191:2;:14;;;:19;49187:183;;49230:56;49261:4;49267:2;49271:7;49280:5;49230:30;:56::i;:::-;49225:145;;49314:40;;;;;;;;;;;;;;49225:145;49187:183;48978:399;;;;:::o;67498:387::-;67571:13;67602:16;67610:7;67602;:16::i;:::-;67597:59;;67627:29;;;;;;;;;;;;;;67597:59;67677:21;67701:10;:8;:10::i;:::-;67677:34;;67722:20;67745:9;:7;:9::i;:::-;67722:32;;67807:1;67788:7;67782:21;:26;;:95;;;;;;;;;;;;;;;;;67835:7;67844:18;67854:7;67844:9;:18::i;:::-;67864:6;67818:53;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;67782:95;67775:102;;;;67498:387;;;:::o;42598:164::-;42695:4;42719:18;:25;42738:5;42719:25;;;;;;;;;;;;;;;:35;42745:8;42719:35;;;;;;;;;;;;;;;;;;;;;;;;;42712:42;;42598:164;;;;:::o;68514:107::-;14176:13;:11;:13::i;:::-;68579:2:::1;:11;;:34;68591:21;68579:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;68514:107:::0;:::o;15196:201::-;14176:13;:11;:13::i;:::-;15305:1:::1;15285:22;;:8;:22;;;;15277:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;15361:28;15380:8;15361:18;:28::i;:::-;15196:201:::0;:::o;67376:110::-;14176:13;:11;:13::i;:::-;67468:10:::1;67448:17;:30;;;;67376:110:::0;:::o;43020:282::-;43085:4;43141:7;43122:15;:13;:15::i;:::-;:26;;:66;;;;;43175:13;;43165:7;:23;43122:66;:153;;;;;43274:1;26962:8;43226:17;:26;43244:7;43226:26;;;;;;;;;;;;:44;:49;43122:153;43102:173;;43020:282;;;:::o;64786:105::-;64846:7;64873:10;64866:17;;64786:105;:::o;14455:132::-;14530:12;:10;:12::i;:::-;14519:23;;:7;:5;:7::i;:::-;:23;;;14511:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;14455:132::o;30359:92::-;30415:7;30359:92;:::o;37640:1275::-;37707:7;37727:12;37742:7;37727:22;;37810:4;37791:15;:13;:15::i;:::-;:23;37787:1061;;37844:13;;37837:4;:20;37833:1015;;;37882:14;37899:17;:23;37917:4;37899:23;;;;;;;;;;;;37882:40;;38016:1;26962:8;37988:6;:24;:29;37984:845;;;38653:113;38670:1;38660:6;:11;38653:113;;;38713:17;:25;38731:6;;;;;;;38713:25;;;;;;;;;;;;38704:34;;38653:113;;;38799:6;38792:13;;;;;;37984:845;37859:989;37833:1015;37787:1061;38876:31;;;;;;;;;;;;;;37640:1275;;;;:::o;44183:479::-;44285:27;44314:23;44355:38;44396:15;:24;44412:7;44396:24;;;;;;;;;;;44355:65;;44567:18;44544:41;;44624:19;44618:26;44599:45;;44529:126;44183:479;;;:::o;43411:659::-;43560:11;43725:16;43718:5;43714:28;43705:37;;43885:16;43874:9;43870:32;43857:45;;44035:15;44024:9;44021:30;44013:5;44002:9;43999:20;43996:56;43986:66;;43411:659;;;;;:::o;50039:159::-;;;;;:::o;64095:311::-;64230:7;64250:16;27366:3;64276:19;:41;;64250:68;;27366:3;64344:31;64355:4;64361:2;64365:9;64344:10;:31::i;:::-;64336:40;;:62;;64329:69;;;64095:311;;;;;:::o;39463:450::-;39543:14;39711:16;39704:5;39700:28;39691:37;;39888:5;39874:11;39849:23;39845:41;39842:52;39835:5;39832:63;39822:73;;39463:450;;;;:::o;50863:158::-;;;;;:::o;15557:191::-;15631:16;15650:6;;;;;;;;;;;15631:25;;15676:8;15667:6;;:17;;;;;;;;;;;;;;;;;;15731:8;15700:40;;15721:8;15700:40;;;;;;;;;;;;15620:128;15557:191;:::o;32342:178::-;32403:7;26186:13;26324:2;32431:18;:25;32450:5;32431:25;;;;;;;;;;;;;;;;:50;;32430:82;32423:89;;32342:178;;;:::o;58618:112::-;58695:27;58705:2;58709:8;58695:27;;;;;;;;;;;;:9;:27::i;:::-;58618:112;;:::o;51461:716::-;51624:4;51670:2;51645:45;;;51691:19;:17;:19::i;:::-;51712:4;51718:7;51727:5;51645:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;51641:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51945:1;51928:6;:13;:18;51924:235;;;51974:40;;;;;;;;;;;;;;51924:235;52117:6;52111:13;52102:6;52098:2;52094:15;52087:38;51641:529;51814:54;;;51804:64;;;:6;:64;;;;51797:71;;;51461:716;;;;;;:::o;67142:113::-;67202:13;67235:12;67228:19;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67142:113;:::o;67263:105::-;67313:13;67346:14;67339:21;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67263:105;:::o;64993:1581::-;65058:17;65483:4;65476;65470:11;65466:22;65459:29;;65575:3;65569:4;65562:17;65681:3;65920:5;65902:428;65928:1;65902:428;;;65968:1;65963:3;65959:11;65952:18;;66139:2;66133:4;66129:13;66125:2;66121:22;66116:3;66108:36;66233:2;66227:4;66223:13;66215:21;;66300:4;66290:25;;66308:5;;66290:25;65902:428;;;65906:21;66369:3;66364;66360:13;66484:4;66479:3;66475:14;66468:21;;66549:6;66544:3;66537:19;65097:1470;;64993:1581;;;:::o;12841:98::-;12894:7;12921:10;12914:17;;12841:98;:::o;63796:147::-;63933:6;63796:147;;;;;:::o;57845:689::-;57976:19;57982:2;57986:8;57976:5;:19::i;:::-;58055:1;58037:2;:14;;;:19;58033:483;;58077:11;58091:13;;58077:27;;58123:13;58145:8;58139:3;:14;58123:30;;58172:233;58203:62;58242:1;58246:2;58250:7;;;;;;58259:5;58203:30;:62::i;:::-;58198:167;;58301:40;;;;;;;;;;;;;;58198:167;58400:3;58392:5;:11;58172:233;;58487:3;58470:13;;:20;58466:34;;58492:8;;;58466:34;58058:458;;58033:483;57845:689;;;:::o;52639:2454::-;52712:20;52735:13;;52712:36;;52775:1;52763:8;:13;52759:44;;;52785:18;;;;;;;;;;;;;;52759:44;52816:61;52846:1;52850:2;52854:12;52868:8;52816:21;:61::i;:::-;53360:1;26324:2;53330:1;:26;;53329:32;53317:8;:45;53291:18;:22;53310:2;53291:22;;;;;;;;;;;;;;;;:71;;;;;;;;;;;53639:139;53676:2;53730:33;53753:1;53757:2;53761:1;53730:14;:33::i;:::-;53697:30;53718:8;53697:20;:30::i;:::-;:66;53639:18;:139::i;:::-;53605:17;:31;53623:12;53605:31;;;;;;;;;;;:173;;;;53795:16;53826:11;53855:8;53840:12;:23;53826:37;;54110:16;54106:2;54102:25;54090:37;;54482:12;54442:8;54401:1;54339:25;54280:1;54219;54192:335;54607:1;54593:12;54589:20;54547:346;54648:3;54639:7;54636:16;54547:346;;54866:7;54856:8;54853:1;54826:25;54823:1;54820;54815:59;54701:1;54692:7;54688:15;54677:26;;54547:346;;;54551:77;54938:1;54926:8;:13;54922:45;;;54948:19;;;;;;;;;;;;;;54922:45;55000:3;54984:13;:19;;;;53065:1950;;55025:60;55054:1;55058:2;55062:12;55076:8;55025:20;:60::i;:::-;52701:2392;52639:2454;;:::o;40015:324::-;40085:14;40318:1;40308:8;40305:15;40279:24;40275:46;40265:56;;40015:324;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;986:155::-;1040:5;1078:6;1065:20;1056:29;;1094:41;1129:5;1094:41;:::i;:::-;986:155;;;;:::o;1147:133::-;1190:5;1228:6;1215:20;1206:29;;1244:30;1268:5;1244:30;:::i;:::-;1147:133;;;;:::o;1286:137::-;1331:5;1369:6;1356:20;1347:29;;1385:32;1411:5;1385:32;:::i;:::-;1286:137;;;;:::o;1429:141::-;1485:5;1516:6;1510:13;1501:22;;1532:32;1558:5;1532:32;:::i;:::-;1429:141;;;;:::o;1589:338::-;1644:5;1693:3;1686:4;1678:6;1674:17;1670:27;1660:122;;1701:79;;:::i;:::-;1660:122;1818:6;1805:20;1843:78;1917:3;1909:6;1902:4;1894:6;1890:17;1843:78;:::i;:::-;1834:87;;1650:277;1589:338;;;;:::o;1947:340::-;2003:5;2052:3;2045:4;2037:6;2033:17;2029:27;2019:122;;2060:79;;:::i;:::-;2019:122;2177:6;2164:20;2202:79;2277:3;2269:6;2262:4;2254:6;2250:17;2202:79;:::i;:::-;2193:88;;2009:278;1947:340;;;;:::o;2293:139::-;2339:5;2377:6;2364:20;2355:29;;2393:33;2420:5;2393:33;:::i;:::-;2293:139;;;;:::o;2438:329::-;2497:6;2546:2;2534:9;2525:7;2521:23;2517:32;2514:119;;;2552:79;;:::i;:::-;2514:119;2672:1;2697:53;2742:7;2733:6;2722:9;2718:22;2697:53;:::i;:::-;2687:63;;2643:117;2438:329;;;;:::o;2773:345::-;2840:6;2889:2;2877:9;2868:7;2864:23;2860:32;2857:119;;;2895:79;;:::i;:::-;2857:119;3015:1;3040:61;3093:7;3084:6;3073:9;3069:22;3040:61;:::i;:::-;3030:71;;2986:125;2773:345;;;;:::o;3124:474::-;3192:6;3200;3249:2;3237:9;3228:7;3224:23;3220:32;3217:119;;;3255:79;;:::i;:::-;3217:119;3375:1;3400:53;3445:7;3436:6;3425:9;3421:22;3400:53;:::i;:::-;3390:63;;3346:117;3502:2;3528:53;3573:7;3564:6;3553:9;3549:22;3528:53;:::i;:::-;3518:63;;3473:118;3124:474;;;;;:::o;3604:619::-;3681:6;3689;3697;3746:2;3734:9;3725:7;3721:23;3717:32;3714:119;;;3752:79;;:::i;:::-;3714:119;3872:1;3897:53;3942:7;3933:6;3922:9;3918:22;3897:53;:::i;:::-;3887:63;;3843:117;3999:2;4025:53;4070:7;4061:6;4050:9;4046:22;4025:53;:::i;:::-;4015:63;;3970:118;4127:2;4153:53;4198:7;4189:6;4178:9;4174:22;4153:53;:::i;:::-;4143:63;;4098:118;3604:619;;;;;:::o;4229:943::-;4324:6;4332;4340;4348;4397:3;4385:9;4376:7;4372:23;4368:33;4365:120;;;4404:79;;:::i;:::-;4365:120;4524:1;4549:53;4594:7;4585:6;4574:9;4570:22;4549:53;:::i;:::-;4539:63;;4495:117;4651:2;4677:53;4722:7;4713:6;4702:9;4698:22;4677:53;:::i;:::-;4667:63;;4622:118;4779:2;4805:53;4850:7;4841:6;4830:9;4826:22;4805:53;:::i;:::-;4795:63;;4750:118;4935:2;4924:9;4920:18;4907:32;4966:18;4958:6;4955:30;4952:117;;;4988:79;;:::i;:::-;4952:117;5093:62;5147:7;5138:6;5127:9;5123:22;5093:62;:::i;:::-;5083:72;;4878:287;4229:943;;;;;;;:::o;5178:468::-;5243:6;5251;5300:2;5288:9;5279:7;5275:23;5271:32;5268:119;;;5306:79;;:::i;:::-;5268:119;5426:1;5451:53;5496:7;5487:6;5476:9;5472:22;5451:53;:::i;:::-;5441:63;;5397:117;5553:2;5579:50;5621:7;5612:6;5601:9;5597:22;5579:50;:::i;:::-;5569:60;;5524:115;5178:468;;;;;:::o;5652:474::-;5720:6;5728;5777:2;5765:9;5756:7;5752:23;5748:32;5745:119;;;5783:79;;:::i;:::-;5745:119;5903:1;5928:53;5973:7;5964:6;5953:9;5949:22;5928:53;:::i;:::-;5918:63;;5874:117;6030:2;6056:53;6101:7;6092:6;6081:9;6077:22;6056:53;:::i;:::-;6046:63;;6001:118;5652:474;;;;;:::o;6132:327::-;6190:6;6239:2;6227:9;6218:7;6214:23;6210:32;6207:119;;;6245:79;;:::i;:::-;6207:119;6365:1;6390:52;6434:7;6425:6;6414:9;6410:22;6390:52;:::i;:::-;6380:62;;6336:116;6132:327;;;;:::o;6465:349::-;6534:6;6583:2;6571:9;6562:7;6558:23;6554:32;6551:119;;;6589:79;;:::i;:::-;6551:119;6709:1;6734:63;6789:7;6780:6;6769:9;6765:22;6734:63;:::i;:::-;6724:73;;6680:127;6465:349;;;;:::o;6820:509::-;6889:6;6938:2;6926:9;6917:7;6913:23;6909:32;6906:119;;;6944:79;;:::i;:::-;6906:119;7092:1;7081:9;7077:17;7064:31;7122:18;7114:6;7111:30;7108:117;;;7144:79;;:::i;:::-;7108:117;7249:63;7304:7;7295:6;7284:9;7280:22;7249:63;:::i;:::-;7239:73;;7035:287;6820:509;;;;:::o;7335:329::-;7394:6;7443:2;7431:9;7422:7;7418:23;7414:32;7411:119;;;7449:79;;:::i;:::-;7411:119;7569:1;7594:53;7639:7;7630:6;7619:9;7615:22;7594:53;:::i;:::-;7584:63;;7540:117;7335:329;;;;:::o;7670:118::-;7757:24;7775:5;7757:24;:::i;:::-;7752:3;7745:37;7670:118;;:::o;7794:109::-;7875:21;7890:5;7875:21;:::i;:::-;7870:3;7863:34;7794:109;;:::o;7909:360::-;7995:3;8023:38;8055:5;8023:38;:::i;:::-;8077:70;8140:6;8135:3;8077:70;:::i;:::-;8070:77;;8156:52;8201:6;8196:3;8189:4;8182:5;8178:16;8156:52;:::i;:::-;8233:29;8255:6;8233:29;:::i;:::-;8228:3;8224:39;8217:46;;7999:270;7909:360;;;;:::o;8275:364::-;8363:3;8391:39;8424:5;8391:39;:::i;:::-;8446:71;8510:6;8505:3;8446:71;:::i;:::-;8439:78;;8526:52;8571:6;8566:3;8559:4;8552:5;8548:16;8526:52;:::i;:::-;8603:29;8625:6;8603:29;:::i;:::-;8598:3;8594:39;8587:46;;8367:272;8275:364;;;;:::o;8645:377::-;8751:3;8779:39;8812:5;8779:39;:::i;:::-;8834:89;8916:6;8911:3;8834:89;:::i;:::-;8827:96;;8932:52;8977:6;8972:3;8965:4;8958:5;8954:16;8932:52;:::i;:::-;9009:6;9004:3;9000:16;8993:23;;8755:267;8645:377;;;;:::o;9028:366::-;9170:3;9191:67;9255:2;9250:3;9191:67;:::i;:::-;9184:74;;9267:93;9356:3;9267:93;:::i;:::-;9385:2;9380:3;9376:12;9369:19;;9028:366;;;:::o;9400:::-;9542:3;9563:67;9627:2;9622:3;9563:67;:::i;:::-;9556:74;;9639:93;9728:3;9639:93;:::i;:::-;9757:2;9752:3;9748:12;9741:19;;9400:366;;;:::o;9772:::-;9914:3;9935:67;9999:2;9994:3;9935:67;:::i;:::-;9928:74;;10011:93;10100:3;10011:93;:::i;:::-;10129:2;10124:3;10120:12;10113:19;;9772:366;;;:::o;10144:::-;10286:3;10307:67;10371:2;10366:3;10307:67;:::i;:::-;10300:74;;10383:93;10472:3;10383:93;:::i;:::-;10501:2;10496:3;10492:12;10485:19;;10144:366;;;:::o;10516:::-;10658:3;10679:67;10743:2;10738:3;10679:67;:::i;:::-;10672:74;;10755:93;10844:3;10755:93;:::i;:::-;10873:2;10868:3;10864:12;10857:19;;10516:366;;;:::o;10888:::-;11030:3;11051:67;11115:2;11110:3;11051:67;:::i;:::-;11044:74;;11127:93;11216:3;11127:93;:::i;:::-;11245:2;11240:3;11236:12;11229:19;;10888:366;;;:::o;11260:::-;11402:3;11423:67;11487:2;11482:3;11423:67;:::i;:::-;11416:74;;11499:93;11588:3;11499:93;:::i;:::-;11617:2;11612:3;11608:12;11601:19;;11260:366;;;:::o;11632:118::-;11719:24;11737:5;11719:24;:::i;:::-;11714:3;11707:37;11632:118;;:::o;11756:595::-;11984:3;12006:95;12097:3;12088:6;12006:95;:::i;:::-;11999:102;;12118:95;12209:3;12200:6;12118:95;:::i;:::-;12111:102;;12230:95;12321:3;12312:6;12230:95;:::i;:::-;12223:102;;12342:3;12335:10;;11756:595;;;;;;:::o;12357:222::-;12450:4;12488:2;12477:9;12473:18;12465:26;;12501:71;12569:1;12558:9;12554:17;12545:6;12501:71;:::i;:::-;12357:222;;;;:::o;12585:640::-;12780:4;12818:3;12807:9;12803:19;12795:27;;12832:71;12900:1;12889:9;12885:17;12876:6;12832:71;:::i;:::-;12913:72;12981:2;12970:9;12966:18;12957:6;12913:72;:::i;:::-;12995;13063:2;13052:9;13048:18;13039:6;12995:72;:::i;:::-;13114:9;13108:4;13104:20;13099:2;13088:9;13084:18;13077:48;13142:76;13213:4;13204:6;13142:76;:::i;:::-;13134:84;;12585:640;;;;;;;:::o;13231:210::-;13318:4;13356:2;13345:9;13341:18;13333:26;;13369:65;13431:1;13420:9;13416:17;13407:6;13369:65;:::i;:::-;13231:210;;;;:::o;13447:313::-;13560:4;13598:2;13587:9;13583:18;13575:26;;13647:9;13641:4;13637:20;13633:1;13622:9;13618:17;13611:47;13675:78;13748:4;13739:6;13675:78;:::i;:::-;13667:86;;13447:313;;;;:::o;13766:419::-;13932:4;13970:2;13959:9;13955:18;13947:26;;14019:9;14013:4;14009:20;14005:1;13994:9;13990:17;13983:47;14047:131;14173:4;14047:131;:::i;:::-;14039:139;;13766:419;;;:::o;14191:::-;14357:4;14395:2;14384:9;14380:18;14372:26;;14444:9;14438:4;14434:20;14430:1;14419:9;14415:17;14408:47;14472:131;14598:4;14472:131;:::i;:::-;14464:139;;14191:419;;;:::o;14616:::-;14782:4;14820:2;14809:9;14805:18;14797:26;;14869:9;14863:4;14859:20;14855:1;14844:9;14840:17;14833:47;14897:131;15023:4;14897:131;:::i;:::-;14889:139;;14616:419;;;:::o;15041:::-;15207:4;15245:2;15234:9;15230:18;15222:26;;15294:9;15288:4;15284:20;15280:1;15269:9;15265:17;15258:47;15322:131;15448:4;15322:131;:::i;:::-;15314:139;;15041:419;;;:::o;15466:::-;15632:4;15670:2;15659:9;15655:18;15647:26;;15719:9;15713:4;15709:20;15705:1;15694:9;15690:17;15683:47;15747:131;15873:4;15747:131;:::i;:::-;15739:139;;15466:419;;;:::o;15891:::-;16057:4;16095:2;16084:9;16080:18;16072:26;;16144:9;16138:4;16134:20;16130:1;16119:9;16115:17;16108:47;16172:131;16298:4;16172:131;:::i;:::-;16164:139;;15891:419;;;:::o;16316:::-;16482:4;16520:2;16509:9;16505:18;16497:26;;16569:9;16563:4;16559:20;16555:1;16544:9;16540:17;16533:47;16597:131;16723:4;16597:131;:::i;:::-;16589:139;;16316:419;;;:::o;16741:222::-;16834:4;16872:2;16861:9;16857:18;16849:26;;16885:71;16953:1;16942:9;16938:17;16929:6;16885:71;:::i;:::-;16741:222;;;;:::o;16969:129::-;17003:6;17030:20;;:::i;:::-;17020:30;;17059:33;17087:4;17079:6;17059:33;:::i;:::-;16969:129;;;:::o;17104:75::-;17137:6;17170:2;17164:9;17154:19;;17104:75;:::o;17185:307::-;17246:4;17336:18;17328:6;17325:30;17322:56;;;17358:18;;:::i;:::-;17322:56;17396:29;17418:6;17396:29;:::i;:::-;17388:37;;17480:4;17474;17470:15;17462:23;;17185:307;;;:::o;17498:308::-;17560:4;17650:18;17642:6;17639:30;17636:56;;;17672:18;;:::i;:::-;17636:56;17710:29;17732:6;17710:29;:::i;:::-;17702:37;;17794:4;17788;17784:15;17776:23;;17498:308;;;:::o;17812:98::-;17863:6;17897:5;17891:12;17881:22;;17812:98;;;:::o;17916:99::-;17968:6;18002:5;17996:12;17986:22;;17916:99;;;:::o;18021:168::-;18104:11;18138:6;18133:3;18126:19;18178:4;18173:3;18169:14;18154:29;;18021:168;;;;:::o;18195:169::-;18279:11;18313:6;18308:3;18301:19;18353:4;18348:3;18344:14;18329:29;;18195:169;;;;:::o;18370:148::-;18472:11;18509:3;18494:18;;18370:148;;;;:::o;18524:305::-;18564:3;18583:20;18601:1;18583:20;:::i;:::-;18578:25;;18617:20;18635:1;18617:20;:::i;:::-;18612:25;;18771:1;18703:66;18699:74;18696:1;18693:81;18690:107;;;18777:18;;:::i;:::-;18690:107;18821:1;18818;18814:9;18807:16;;18524:305;;;;:::o;18835:96::-;18872:7;18901:24;18919:5;18901:24;:::i;:::-;18890:35;;18835:96;;;:::o;18937:104::-;18982:7;19011:24;19029:5;19011:24;:::i;:::-;19000:35;;18937:104;;;:::o;19047:90::-;19081:7;19124:5;19117:13;19110:21;19099:32;;19047:90;;;:::o;19143:149::-;19179:7;19219:66;19212:5;19208:78;19197:89;;19143:149;;;:::o;19298:126::-;19335:7;19375:42;19368:5;19364:54;19353:65;;19298:126;;;:::o;19430:77::-;19467:7;19496:5;19485:16;;19430:77;;;:::o;19513:154::-;19597:6;19592:3;19587;19574:30;19659:1;19650:6;19645:3;19641:16;19634:27;19513:154;;;:::o;19673:307::-;19741:1;19751:113;19765:6;19762:1;19759:13;19751:113;;;19850:1;19845:3;19841:11;19835:18;19831:1;19826:3;19822:11;19815:39;19787:2;19784:1;19780:10;19775:15;;19751:113;;;19882:6;19879:1;19876:13;19873:101;;;19962:1;19953:6;19948:3;19944:16;19937:27;19873:101;19722:258;19673:307;;;:::o;19986:320::-;20030:6;20067:1;20061:4;20057:12;20047:22;;20114:1;20108:4;20104:12;20135:18;20125:81;;20191:4;20183:6;20179:17;20169:27;;20125:81;20253:2;20245:6;20242:14;20222:18;20219:38;20216:84;;;20272:18;;:::i;:::-;20216:84;20037:269;19986:320;;;:::o;20312:281::-;20395:27;20417:4;20395:27;:::i;:::-;20387:6;20383:40;20525:6;20513:10;20510:22;20489:18;20477:10;20474:34;20471:62;20468:88;;;20536:18;;:::i;:::-;20468:88;20576:10;20572:2;20565:22;20355:238;20312:281;;:::o;20599:180::-;20647:77;20644:1;20637:88;20744:4;20741:1;20734:15;20768:4;20765:1;20758:15;20785:180;20833:77;20830:1;20823:88;20930:4;20927:1;20920:15;20954:4;20951:1;20944:15;20971:180;21019:77;21016:1;21009:88;21116:4;21113:1;21106:15;21140:4;21137:1;21130:15;21157:117;21266:1;21263;21256:12;21280:117;21389:1;21386;21379:12;21403:117;21512:1;21509;21502:12;21526:117;21635:1;21632;21625:12;21649:102;21690:6;21741:2;21737:7;21732:2;21725:5;21721:14;21717:28;21707:38;;21649:102;;;:::o;21757:225::-;21897:34;21893:1;21885:6;21881:14;21874:58;21966:8;21961:2;21953:6;21949:15;21942:33;21757:225;:::o;21988:182::-;22128:34;22124:1;22116:6;22112:14;22105:58;21988:182;:::o;22176:177::-;22316:29;22312:1;22304:6;22300:14;22293:53;22176:177;:::o;22359:170::-;22499:22;22495:1;22487:6;22483:14;22476:46;22359:170;:::o;22535:160::-;22675:12;22671:1;22663:6;22659:14;22652:36;22535:160;:::o;22701:220::-;22841:34;22837:1;22829:6;22825:14;22818:58;22910:3;22905:2;22897:6;22893:15;22886:28;22701:220;:::o;22927:223::-;23067:34;23063:1;23055:6;23051:14;23044:58;23136:6;23131:2;23123:6;23119:15;23112:31;22927:223;:::o;23156:122::-;23229:24;23247:5;23229:24;:::i;:::-;23222:5;23219:35;23209:63;;23268:1;23265;23258:12;23209:63;23156:122;:::o;23284:138::-;23365:32;23391:5;23365:32;:::i;:::-;23358:5;23355:43;23345:71;;23412:1;23409;23402:12;23345:71;23284:138;:::o;23428:116::-;23498:21;23513:5;23498:21;:::i;:::-;23491:5;23488:32;23478:60;;23534:1;23531;23524:12;23478:60;23428:116;:::o;23550:120::-;23622:23;23639:5;23622:23;:::i;:::-;23615:5;23612:34;23602:62;;23660:1;23657;23650:12;23602:62;23550:120;:::o;23676:122::-;23749:24;23767:5;23749:24;:::i;:::-;23742:5;23739:35;23729:63;;23788:1;23785;23778:12;23729:63;23676:122;:::o

Swarm Source

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