ETH Price: $2,284.44 (-2.53%)

Token

Pixseas (PIXSEAS)
 

Overview

Max Total Supply

333 PIXSEAS

Holders

169

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 PIXSEAS
0x5c806C6AfeBbaa233490bBE6120EFE961cc6466c
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:
Pixseas

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-10-26
*/

// File: contracts/IMeta.sol


// ____  __  _  _  ____  ____   __   ____ 
//(  _ \(  )( \/ )/ ___)(  __) / _\ / ___)
// ) __/ )(  )  ( \___ \ ) _) /    \\___ \
//(__)  (__)(_/\_)(____/(____)\_/\_/(____/
//                             
//creator : @debugger - twitter.com/debuggerguy
//website : pixseas.xyz

pragma solidity ^0.8.0;

interface IMeta 
{
    function getMetadata(uint256 tokenId) external view returns (string memory);
}
// File: contracts/MerkleProof.sol


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

pragma solidity ^0.8.0;

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

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

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

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

    /**
     * @dev Returns true if a `leafs` can be proved to be a part of a Merkle tree
     * defined by `root`. For this, `proofs` for each leaf must be provided, containing
     * sibling hashes on the branch from the leaf to the root of the tree. Then
     * 'proofFlag' designates the nodes needed for the multi proof.
     *
     * _Available since v4.7._
     */
    function multiProofVerify(
        bytes32 root,
        bytes32[] calldata leaves,
        bytes32[] calldata proofs,
        bool[] calldata proofFlag
    ) internal pure returns (bool) {
        return processMultiProof(leaves, proofs, proofFlag) == root;
    }

    /**
     * @dev Returns the rebuilt hash obtained by traversing a Merkle tree up
     * from `leaf` using the multi proof as `proofFlag`. A multi proof is
     * valid if the final hash matches the root of the tree.
     *
     * _Available since v4.7._
     */
    function processMultiProof(
        bytes32[] calldata leaves,
        bytes32[] calldata proofs,
        bool[] calldata proofFlag
    ) internal pure returns (bytes32 merkleRoot) {
        // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by
        // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the
        // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of
        // the merkle tree.
        uint256 leavesLen = leaves.length;
        uint256 totalHashes = proofFlag.length;

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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


// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

/**
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}

// File: @openzeppelin/contracts/security/Pausable.sol


// OpenZeppelin Contracts (last updated v4.7.0) (security/Pausable.sol)

pragma solidity ^0.8.0;


/**
 * @dev Contract module which allows children to implement an emergency stop
 * mechanism that can be triggered by an authorized account.
 *
 * This module is used through inheritance. It will make available the
 * modifiers `whenNotPaused` and `whenPaused`, which can be applied to
 * the functions of your contract. Note that they will not be pausable by
 * simply including this module, only once the modifiers are put in place.
 */
abstract contract Pausable is Context {
    /**
     * @dev Emitted when the pause is triggered by `account`.
     */
    event Paused(address account);

    /**
     * @dev Emitted when the pause is lifted by `account`.
     */
    event Unpaused(address account);

    bool private _paused;

    /**
     * @dev Initializes the contract in unpaused state.
     */
    constructor() {
        _paused = false;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is not paused.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    modifier whenNotPaused() {
        _requireNotPaused();
        _;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is paused.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    modifier whenPaused() {
        _requirePaused();
        _;
    }

    /**
     * @dev Returns true if the contract is paused, and false otherwise.
     */
    function paused() public view virtual returns (bool) {
        return _paused;
    }

    /**
     * @dev Throws if the contract is paused.
     */
    function _requireNotPaused() internal view virtual {
        require(!paused(), "Pausable: paused");
    }

    /**
     * @dev Throws if the contract is not paused.
     */
    function _requirePaused() internal view virtual {
        require(paused(), "Pausable: not paused");
    }

    /**
     * @dev Triggers stopped state.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    function _pause() internal virtual whenNotPaused {
        _paused = true;
        emit Paused(_msgSender());
    }

    /**
     * @dev Returns to normal state.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    function _unpause() internal virtual whenPaused {
        _paused = false;
        emit Unpaused(_msgSender());
    }
}

// File: @openzeppelin/contracts/access/Ownable.sol


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

pragma solidity ^0.8.0;


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

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

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

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

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

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
    }

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

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

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

// File: erc721a/contracts/IERC721A.sol


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

pragma solidity ^0.8.4;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    /**
     * @dev Returns the total number of tokens in existence.
     * Burned tokens will reduce the count.
     * To get the total number of tokens minted, please see {_totalMinted}.
     */
    function totalSupply() external view returns (uint256);

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

    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified)
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);

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

    /**
     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.
     */
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
     */
    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables or disables
     * (`approved`) `operator` to manage all of its assets.
     */
    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

    /**
     * @dev Returns the number of tokens in `owner`'s account.
     */
    function balanceOf(address owner) external view returns (uint256 balance);

    /**
     * @dev Returns the owner of the `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function ownerOf(uint256 tokenId) external view returns (address owner);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`,
     * checking first that contract recipients are aware of the ERC721 protocol
     * to prevent tokens from being forever locked.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be have been allowed to move
     * this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement
     * {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes calldata data
    ) external payable;

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

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {safeTransferFrom}
     * whenever possible.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token
     * by either {approve} or {setApprovalForAll}.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external payable;

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

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

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

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

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

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

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

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

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

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

// File: erc721a/contracts/ERC721A.sol


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

pragma solidity ^0.8.4;


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

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

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

    // Mask of an entry in packed address data.
    uint256 private constant _BITMASK_ADDRESS_DATA_ENTRY = (1 << 64) - 1;

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

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

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

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

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

    // The bit mask of the `burned` bit in packed ownership.
    uint256 private constant _BITMASK_BURNED = 1 << 224;

    // The bit position of the `nextInitialized` bit in packed ownership.
    uint256 private constant _BITPOS_NEXT_INITIALIZED = 225;

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

    // The bit position of `extraData` in packed ownership.
    uint256 private constant _BITPOS_EXTRA_DATA = 232;

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

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

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

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

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

    // The next token ID to be minted.
    uint256 private _currentIndex;

    // The number of tokens burned.
    uint256 private _burnCounter;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to ownership details
    // An empty struct value does not necessarily mean the token is unowned.
    // See {_packedOwnershipOf} implementation for details.
    //
    // Bits Layout:
    // - [0..159]   `addr`
    // - [160..223] `startTimestamp`
    // - [224]      `burned`
    // - [225]      `nextInitialized`
    // - [232..255] `extraData`
    mapping(uint256 => uint256) private _packedOwnerships;

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

    // Mapping from token ID to approved address.
    mapping(uint256 => TokenApprovalRef) private _tokenApprovals;

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

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

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

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

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

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

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

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

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

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

    /**
     * @dev Returns the number of tokens in `owner`'s account.
     */
    function balanceOf(address owner) public view virtual override returns (uint256) {
        if (owner == address(0)) revert BalanceQueryForZeroAddress();
        return _packedAddressData[owner] & _BITMASK_ADDRESS_DATA_ENTRY;
    }

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

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

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

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

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

    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified)
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30000 gas.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        // The interface IDs are constants representing the first 4 bytes
        // of the XOR of all function selectors in the interface.
        // See: [ERC165](https://eips.ethereum.org/EIPS/eip-165)
        // (e.g. `bytes4(i.functionA.selector ^ i.functionB.selector ^ ...)`)
        return
            interfaceId == 0x01ffc9a7 || // ERC165 interface ID for ERC165.
            interfaceId == 0x80ac58cd || // ERC165 interface ID for ERC721.
            interfaceId == 0x5b5e139f; // ERC165 interface ID for ERC721Metadata.
    }

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

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

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

    /**
     * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        if (!_exists(tokenId)) revert URIQueryForNonexistentToken();

        string memory baseURI = _baseURI();
        return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, _toString(tokenId))) : '';
    }

    /**
     * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each
     * token will be the concatenation of the `baseURI` and the `tokenId`. Empty
     * by default, it can be overridden in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return '';
    }

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

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

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

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

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

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

        unchecked {
            if (_startTokenId() <= curr)
                if (curr < _currentIndex) {
                    uint256 packed = _packedOwnerships[curr];
                    // If not burned.
                    if (packed & _BITMASK_BURNED == 0) {
                        // Invariant:
                        // There will always be an initialized ownership slot
                        // (i.e. `ownership.addr != address(0) && ownership.burned == false`)
                        // before an unintialized ownership slot
                        // (i.e. `ownership.addr == address(0) && ownership.burned == false`)
                        // Hence, `curr` will not underflow.
                        //
                        // We can directly compare the packed value.
                        // If the address is zero, packed will be zero.
                        while (packed == 0) {
                            packed = _packedOwnerships[--curr];
                        }
                        return packed;
                    }
                }
        }
        revert OwnerQueryForNonexistentToken();
    }

    /**
     * @dev Returns the unpacked `TokenOwnership` struct from `packed`.
     */
    function _unpackedOwnership(uint256 packed) private pure returns (TokenOwnership memory ownership) {
        ownership.addr = address(uint160(packed));
        ownership.startTimestamp = uint64(packed >> _BITPOS_START_TIMESTAMP);
        ownership.burned = packed & _BITMASK_BURNED != 0;
        ownership.extraData = uint24(packed >> _BITPOS_EXTRA_DATA);
    }

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

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

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

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

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

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

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

        return _tokenApprovals[tokenId].value;
    }

    /**
     * @dev Approve or remove `operator` as an operator for the caller.
     * Operators can call {transferFrom} or {safeTransferFrom}
     * for any token owned by the caller.
     *
     * Requirements:
     *
     * - The `operator` cannot be the caller.
     *
     * Emits an {ApprovalForAll} event.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        _operatorApprovals[_msgSenderERC721A()][operator] = approved;
        emit ApprovalForAll(_msgSenderERC721A(), operator, approved);
    }

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

    /**
     * @dev Returns whether `tokenId` exists.
     *
     * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
     *
     * Tokens start existing when they are minted. See {_mint}.
     */
    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return
            _startTokenId() <= tokenId &&
            tokenId < _currentIndex && // If within bounds,
            _packedOwnerships[tokenId] & _BITMASK_BURNED == 0; // and not burned.
    }

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

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

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

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token
     * by either {approve} or {setApprovalForAll}.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public payable virtual override {
        uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId);

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

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

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

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

        _beforeTokenTransfers(from, to, tokenId, 1);

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

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        // Counter overflow is incredibly unrealistic as `tokenId` would have to be 2**256.
        unchecked {
            // We can directly increment and decrement the balances.
            --_packedAddressData[from]; // Updates: `balance -= 1`.
            ++_packedAddressData[to]; // Updates: `balance += 1`.

            // Updates:
            // - `address` to the next owner.
            // - `startTimestamp` to the timestamp of transfering.
            // - `burned` to `false`.
            // - `nextInitialized` to `true`.
            _packedOwnerships[tokenId] = _packOwnershipData(
                to,
                _BITMASK_NEXT_INITIALIZED | _nextExtraData(from, to, prevOwnershipPacked)
            );

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

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

    /**
     * @dev Equivalent to `safeTransferFrom(from, to, tokenId, '')`.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public payable virtual override {
        safeTransferFrom(from, to, tokenId, '');
    }

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token
     * by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement
     * {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public payable virtual override {
        transferFrom(from, to, tokenId);
        if (to.code.length != 0)
            if (!_checkContractOnERC721Received(from, to, tokenId, _data)) {
                revert TransferToNonERC721ReceiverImplementer();
            }
    }

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

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

    /**
     * @dev Private function to invoke {IERC721Receiver-onERC721Received} on a target contract.
     *
     * `from` - Previous owner of the given token ID.
     * `to` - Target address that will receive the token.
     * `tokenId` - Token ID to be transferred.
     * `_data` - Optional data to send along with the call.
     *
     * Returns whether the call correctly returned the expected magic value.
     */
    function _checkContractOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        try ERC721A__IERC721Receiver(to).onERC721Received(_msgSenderERC721A(), from, tokenId, _data) returns (
            bytes4 retval
        ) {
            return retval == ERC721A__IERC721Receiver(to).onERC721Received.selector;
        } catch (bytes memory reason) {
            if (reason.length == 0) {
                revert TransferToNonERC721ReceiverImplementer();
            } else {
                assembly {
                    revert(add(32, reason), mload(reason))
                }
            }
        }
    }

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

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

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

        // Overflows are incredibly unrealistic.
        // `balance` and `numberMinted` have a maximum limit of 2**64.
        // `tokenId` has a maximum limit of 2**256.
        unchecked {
            // Updates:
            // - `balance += quantity`.
            // - `numberMinted += quantity`.
            //
            // We can directly add to the `balance` and `numberMinted`.
            _packedAddressData[to] += quantity * ((1 << _BITPOS_NUMBER_MINTED) | 1);

            // Updates:
            // - `address` to the owner.
            // - `startTimestamp` to the timestamp of minting.
            // - `burned` to `false`.
            // - `nextInitialized` to `quantity == 1`.
            _packedOwnerships[startTokenId] = _packOwnershipData(
                to,
                _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0)
            );

            uint256 toMasked;
            uint256 end = startTokenId + quantity;

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

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

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

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

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

        // Overflows are unrealistic due to the above check for `quantity` to be below the limit.
        unchecked {
            // Updates:
            // - `balance += quantity`.
            // - `numberMinted += quantity`.
            //
            // We can directly add to the `balance` and `numberMinted`.
            _packedAddressData[to] += quantity * ((1 << _BITPOS_NUMBER_MINTED) | 1);

            // Updates:
            // - `address` to the owner.
            // - `startTimestamp` to the timestamp of minting.
            // - `burned` to `false`.
            // - `nextInitialized` to `quantity == 1`.
            _packedOwnerships[startTokenId] = _packOwnershipData(
                to,
                _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0)
            );

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

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

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

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

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

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

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

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

        address from = address(uint160(prevOwnershipPacked));

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

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

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

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

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        // Counter overflow is incredibly unrealistic as `tokenId` would have to be 2**256.
        unchecked {
            // Updates:
            // - `balance -= 1`.
            // - `numberBurned += 1`.
            //
            // We can directly decrement the balance, and increment the number burned.
            // This is equivalent to `packed -= 1; packed += 1 << _BITPOS_NUMBER_BURNED;`.
            _packedAddressData[from] += (1 << _BITPOS_NUMBER_BURNED) - 1;

            // Updates:
            // - `address` to the last owner.
            // - `startTimestamp` to the timestamp of burning.
            // - `burned` to `true`.
            // - `nextInitialized` to `true`.
            _packedOwnerships[tokenId] = _packOwnershipData(
                from,
                (_BITMASK_BURNED | _BITMASK_NEXT_INITIALIZED) | _nextExtraData(from, address(0), prevOwnershipPacked)
            );

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

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

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

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

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

    /**
     * @dev Called during each token transfer to set the 24bit `extraData` field.
     * Intended to be overridden by the cosumer contract.
     *
     * `previousExtraData` - the value of `extraData` before transfer.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, `tokenId` will be burned by `from`.
     * - `from` and `to` are never both zero.
     */
    function _extraData(
        address from,
        address to,
        uint24 previousExtraData
    ) internal view virtual returns (uint24) {}

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

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

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

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

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

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

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

// File: contracts/Pixseas.sol

//SPDX-License-Identifier: MIT
// ____  __  _  _  ____  ____   __   ____ 
//(  _ \(  )( \/ )/ ___)(  __) / _\ / ___)
// ) __/ )(  )  ( \___ \ ) _) /    \\___ \
//(__)  (__)(_/\_)(____/(____)\_/\_/(____/
//    
//creator : @debugger - twitter.com/debuggerguy
//website : pixseas.xyz

pragma solidity ^0.8.0; 







contract Pixseas is ERC721A, Ownable, Pausable 
{
    using Strings for uint256;
    
    uint256 public totalColSize = 5999;
    uint256 public pixListColSize = 1499;
    
    uint256 public pixListMintPrice = 0.0149 ether;
    uint256 public pixListWalletLimit = 2;

    uint256 public publicMintPrice = 0.0299 ether;
    uint256 public publicWalletLimit = 5;

    mapping(address => uint256) public mintPixList;
    mapping(address => uint256) public mintPublicList;

    bytes32 public pixListMerkleRoot = 0x7e338027177c5fc9284cd333cb533e0f15c2680b0125fff596ee7436798bf95d;
    address public mdProvider;
    string private baseTokenURI;
    bool public providerBasedURI;
    bool public pixListMintActive;
    bool public publicMintActive;

    constructor
    ( 
       string memory _name,
       string memory _symbol,
       string memory _baseTokenURI
    ) ERC721A(_name, _symbol) 
    {
        baseTokenURI = _baseTokenURI;
    }

    modifier callerIsUser() 
    {
        require(tx.origin == msg.sender, "Caller is contract");
        _;
    }

    modifier onlyPixListMintActive() {
        require(pixListMintActive, "WL Minting is not active");
        _;
    }
    modifier onlyPublicMintActive() 
    {
        require( publicMintActive ? publicMintActive : ( totalSupply() >= pixListColSize ), "Public Minting is not active");
        _;
    }

    function setMdProvider(address _mdProvider) external onlyOwner {
        mdProvider = _mdProvider;
    }

    function tokenURI(uint256 _tokenId)
        public
        view
        virtual
        override
        returns (string memory)
    {
        require(_exists(_tokenId), "Token not existed");
        require( providerBasedURI ? ( mdProvider != address(0) ) : ( keccak256(abi.encodePacked(baseTokenURI)) != keccak256(abi.encodePacked("")) ),
            "Invalid metadata provider address"
        );

        return providerBasedURI ? IMeta(mdProvider).getMetadata(_tokenId) : string(abi.encodePacked(baseTokenURI, _tokenId.toString(),".json"));
    }
    
    
    function setBaseURI(string calldata _baseTokenURI) external onlyOwner 
    {
        baseTokenURI = _baseTokenURI;
    }
    
    function toggleProviderBasedURI() 
        external 
        onlyOwner 
    {
        providerBasedURI = !providerBasedURI;
    }


    function _startTokenId() internal pure override returns (uint256) {
        return 1;
    }

    function setPixListMerkleRoot(bytes32 _pixListMerkleRoot)
        external
        onlyOwner
    {
        pixListMerkleRoot = _pixListMerkleRoot;
    }


    function pixListMint(bytes32[] calldata _merkleProof, uint256 quantity)
        external
        payable
        onlyPixListMintActive
        callerIsUser 
    {
        require(mintPixList[msg.sender] + quantity <= pixListWalletLimit, "Up to 2 mints allowed per wallet");
        require(msg.value >= pixListMintPrice * quantity, "Insufficient funds");
        require(totalSupply() + quantity <= pixListColSize, "EXCEED_COL_SIZE");   
        bytes32 leaf = keccak256(abi.encodePacked(msg.sender));
        require(
             MerkleProof.verify(_merkleProof, pixListMerkleRoot, leaf),
             "You are not pixlisted"
         );

        mintPixList[msg.sender] += quantity;
        _safeMint(msg.sender, quantity);
    }

    function publicMint(uint256 quantity)
        external
        payable
        onlyPublicMintActive
        callerIsUser    
    {
        require(mintPublicList[msg.sender] + quantity <= publicWalletLimit, "Up to 5 mints allowed per wallet");
        require(msg.value >= publicMintPrice * quantity, "Insufficient funds");
        require(totalSupply() + quantity <= totalColSize, "EXCEED_COL_SIZE");

        mintPublicList[msg.sender] += quantity;
        _safeMint(msg.sender, quantity);
    }
    
    function teamMint(uint256 quantity)
        external
        payable
        onlyOwner
    {
        require(quantity > 0, "Invalid quantity");
        require(totalSupply() + quantity <= totalColSize, "EXCEED_COL_SIZE");

        _safeMint(msg.sender, quantity);
    }

    function toggleSoldOut() 
        external 
        onlyOwner 
    {
        publicMintActive = !publicMintActive;
    }

    function airdrop(address toAdd,uint256 quantity)
        external
        payable
        onlyOwner
    {
        require(quantity > 0, "Invalid quantity");
        require(totalSupply() + quantity <= totalColSize, "EXCEED_COL_SIZE");

        _safeMint(toAdd, quantity);
    }


    function togglePixListMint() 
        external 
        onlyOwner 
    {
        pixListMintActive = !pixListMintActive;
    }

    function togglePublicMint() 
        external 
        onlyOwner 
    {
        pixListMintActive = !pixListMintActive;
        publicMintActive = !publicMintActive;
    }


    function pause() external onlyOwner {
        _pause();
    }

    function unpause() external onlyOwner {
        _unpause();
    }
    
    function _beforeTokenTransfers(
        address from,
        address to,
        uint256 tokenId,
        uint256 quantity
    ) internal override(ERC721A) whenNotPaused 
    {
        super._beforeTokenTransfers(from, to, tokenId, quantity);
    }

    function changeSupply(uint256 _decreaseAmount) 
        external 
        onlyOwner 
    {
        require(_decreaseAmount > 0 ,"Amount must be greater than 0");
        require(totalSupply() < totalColSize ,"Just sold out" );
        require(totalColSize - _decreaseAmount >= totalSupply() ,"Insufficient amount" );
        totalColSize -= _decreaseAmount;
    }

    function changePixListWalletLimit(uint256 _newPixListWalletLimit) 
        external 
        onlyOwner 
    {
        require(_newPixListWalletLimit > 0 ,"Invalid value");
        pixListWalletLimit = _newPixListWalletLimit;
    }
    function changePublicWalletLimit(uint256 _newPublicWalletLimit) 
        external 
        onlyOwner 
    {
        require(_newPublicWalletLimit > 0 ,"Invalid value");
        publicWalletLimit = _newPublicWalletLimit;
    }

    
    function changePixListMintPrice(uint256 _pixListMintPrice) 
        external 
        onlyOwner 
    {
        require(_pixListMintPrice >= 0 ,"Invalid price");
        pixListMintPrice = _pixListMintPrice;
    }
    function changePublictMintPrice(uint256 _publicMintPrice) 
        external 
        onlyOwner 
    {
        require(_publicMintPrice >= 0 ,"Invalid price");
        publicMintPrice = _publicMintPrice;
    }

    function changePixListColSize(uint256 _pixListColSize) 
        external 
        onlyOwner 
    {
        require(_pixListColSize >= 0 ,"Invalid price");
        pixListColSize = _pixListColSize;
    }
    

    function withdraw() 
        external 
        onlyOwner 
    {
        uint256 totalBalance = address(this).balance;

        address COMMUNITY_WALLET = 0x667e47CF9037327fdAFf8EcD393639CB7b63936F;
        address TECH_LEAD = 0x211584043e8D2E1c7a94764A8813Ea84aFc3e7aa;
        address ARTIST = 0xD55779fA12Ed38445CE5111C527b450AFE4DF32D;
        address PROJECT_MANAGER = 0xda60A92eA9054d1864c659230008684C708e53da;
        
        payable(COMMUNITY_WALLET).transfer(
             ((totalBalance * 2500) / 10000)
        );
        payable(TECH_LEAD).transfer(
             ((totalBalance * 2500) / 10000)
        );
        payable(ARTIST).transfer(
             ((totalBalance * 2500) / 10000)
        );
        payable(PROJECT_MANAGER).transfer(
             ((totalBalance * 2500) / 10000)
        );
    }

}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"string","name":"_baseTokenURI","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintERC2309QuantityExceedsLimit","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"OwnershipNotInitializedForExtraData","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"fromTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"toTokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"ConsecutiveTransfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[{"internalType":"address","name":"toAdd","type":"address"},{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"airdrop","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pixListColSize","type":"uint256"}],"name":"changePixListColSize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pixListMintPrice","type":"uint256"}],"name":"changePixListMintPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newPixListWalletLimit","type":"uint256"}],"name":"changePixListWalletLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newPublicWalletLimit","type":"uint256"}],"name":"changePublicWalletLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_publicMintPrice","type":"uint256"}],"name":"changePublictMintPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_decreaseAmount","type":"uint256"}],"name":"changeSupply","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":[],"name":"mdProvider","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"mintPixList","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"mintPublicList","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"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":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pixListColSize","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pixListMerkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"},{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"pixListMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"pixListMintActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pixListMintPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pixListWalletLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"providerBasedURI","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"publicMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"publicMintActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicMintPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicWalletLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_baseTokenURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_mdProvider","type":"address"}],"name":"setMdProvider","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_pixListMerkleRoot","type":"bytes32"}],"name":"setPixListMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"teamMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"togglePixListMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"toggleProviderBasedURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"togglePublicMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"toggleSoldOut","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalColSize","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405261176f6009556105db600a556634ef7897274000600b556002600c55666a39e43ec8c000600d556005600e557f7e338027177c5fc9284cd333cb533e0f15c2680b0125fff596ee7436798bf95d60001b6011553480156200006457600080fd5b5060405162004d7838038062004d7883398181016040528101906200008a919062000338565b82828160029080519060200190620000a49291906200020a565b508060039080519060200190620000bd9291906200020a565b50620000ce6200013360201b60201c565b6000819055505050620000f6620000ea6200013c60201b60201c565b6200014460201b60201c565b6000600860146101000a81548160ff0219169083151502179055508060139080519060200190620001299291906200020a565b5050505062000575565b60006001905090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620002189062000486565b90600052602060002090601f0160209004810192826200023c576000855562000288565b82601f106200025757805160ff191683800117855562000288565b8280016001018555821562000288579182015b82811115620002875782518255916020019190600101906200026a565b5b5090506200029791906200029b565b5090565b5b80821115620002b65760008160009055506001016200029c565b5090565b6000620002d1620002cb846200041a565b620003f1565b905082815260208101848484011115620002f057620002ef62000555565b5b620002fd84828562000450565b509392505050565b600082601f8301126200031d576200031c62000550565b5b81516200032f848260208601620002ba565b91505092915050565b6000806000606084860312156200035457620003536200055f565b5b600084015167ffffffffffffffff8111156200037557620003746200055a565b5b620003838682870162000305565b935050602084015167ffffffffffffffff811115620003a757620003a66200055a565b5b620003b58682870162000305565b925050604084015167ffffffffffffffff811115620003d957620003d86200055a565b5b620003e78682870162000305565b9150509250925092565b6000620003fd62000410565b90506200040b8282620004bc565b919050565b6000604051905090565b600067ffffffffffffffff82111562000438576200043762000521565b5b620004438262000564565b9050602081019050919050565b60005b838110156200047057808201518184015260208101905062000453565b8381111562000480576000848401525b50505050565b600060028204905060018216806200049f57607f821691505b60208210811415620004b657620004b5620004f2565b5b50919050565b620004c78262000564565b810181811067ffffffffffffffff82111715620004e957620004e862000521565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b6147f380620005856000396000f3fe6080604052600436106102e45760003560e01c8063785a40d611610190578063b67c25a3116100dc578063e7bc47b311610095578063eee9a8f11161006f578063eee9a8f114610a57578063f2ac71ee14610a6e578063f2fde38b14610a97578063f65d59a914610ac0576102e4565b8063e7bc47b3146109c8578063e985e9c5146109f1578063edab2d4b14610a2e576102e4565b8063b67c25a3146108c5578063b88d4fde146108f0578063c566fc151461090c578063c87b56dd14610937578063d74ea69d14610974578063dc53fd921461099d576102e4565b80638da5cb5b116101495780639ab4ce65116101235780639ab4ce651461081d578063a22cb46514610848578063abd0359614610871578063b303d7731461089c576102e4565b80638da5cb5b146107b05780638ed21d6a146107db57806395d89b41146107f2576102e4565b8063785a40d6146106e557806378c68e16146107105780637a2c88f11461073b5780637bb232ad146107525780638456cb591461077d5780638ba4cc3c14610794576102e4565b80633f4ba83a1161024f5780636352211e11610208578063715018a6116101e2578063715018a61461063d5780637267c7ed14610654578063757efe481461067f57806378165f31146106bc576102e4565b80636352211e146105985780636dba5840146105d557806370a0823114610600576102e4565b80633f4ba83a146104d15780634047638d146104e857806342842e0e146104ff57806352148e731461051b57806355f804b3146105445780635c975abb1461056d576102e4565b806326916fc0116102a157806326916fc0146103f15780632db115441461042e5780632fbba1151461044a57806339a7919f146104665780633ccfd60b1461048f5780633e7afb86146104a6576102e4565b806301ffc9a7146102e957806306fdde0314610326578063081812fc14610351578063095ea7b31461038e57806318160ddd146103aa57806323b872dd146103d5575b600080fd5b3480156102f557600080fd5b50610310600480360381019061030b919061355e565b610adc565b60405161031d9190613bcf565b60405180910390f35b34801561033257600080fd5b5061033b610b6e565b6040516103489190613c05565b60405180910390f35b34801561035d57600080fd5b506103786004803603810190610373919061364e565b610c00565b6040516103859190613b68565b60405180910390f35b6103a860048036038101906103a39190613491565b610c7f565b005b3480156103b657600080fd5b506103bf610dc3565b6040516103cc9190613ea7565b60405180910390f35b6103ef60048036038101906103ea919061337b565b610dda565b005b3480156103fd57600080fd5b506104186004803603810190610413919061330e565b6110ff565b6040516104259190613ea7565b60405180910390f35b6104486004803603810190610443919061364e565b611117565b005b610464600480360381019061045f919061364e565b611394565b005b34801561047257600080fd5b5061048d6004803603810190610488919061364e565b611443565b005b34801561049b57600080fd5b506104a461154c565b005b3480156104b257600080fd5b506104bb611748565b6040516104c89190613ea7565b60405180910390f35b3480156104dd57600080fd5b506104e661174e565b005b3480156104f457600080fd5b506104fd611760565b005b6105196004803603810190610514919061337b565b6117be565b005b34801561052757600080fd5b50610542600480360381019061053d919061330e565b6117de565b005b34801561055057600080fd5b5061056b600480360381019061056691906135b8565b61182a565b005b34801561057957600080fd5b50610582611848565b60405161058f9190613bcf565b60405180910390f35b3480156105a457600080fd5b506105bf60048036038101906105ba919061364e565b61185f565b6040516105cc9190613b68565b60405180910390f35b3480156105e157600080fd5b506105ea611871565b6040516105f79190613ea7565b60405180910390f35b34801561060c57600080fd5b506106276004803603810190610622919061330e565b611877565b6040516106349190613ea7565b60405180910390f35b34801561064957600080fd5b50610652611930565b005b34801561066057600080fd5b50610669611944565b6040516106769190613bcf565b60405180910390f35b34801561068b57600080fd5b506106a660048036038101906106a1919061330e565b611957565b6040516106b39190613ea7565b60405180910390f35b3480156106c857600080fd5b506106e360048036038101906106de919061364e565b61196f565b005b3480156106f157600080fd5b506106fa6119c5565b6040516107079190613bea565b60405180910390f35b34801561071c57600080fd5b506107256119cb565b6040516107329190613b68565b60405180910390f35b34801561074757600080fd5b506107506119f1565b005b34801561075e57600080fd5b50610767611a25565b6040516107749190613ea7565b60405180910390f35b34801561078957600080fd5b50610792611a2b565b005b6107ae60048036038101906107a99190613491565b611a3d565b005b3480156107bc57600080fd5b506107c5611aed565b6040516107d29190613b68565b60405180910390f35b3480156107e757600080fd5b506107f0611b17565b005b3480156107fe57600080fd5b50610807611b4b565b6040516108149190613c05565b60405180910390f35b34801561082957600080fd5b50610832611bdd565b60405161083f9190613ea7565b60405180910390f35b34801561085457600080fd5b5061086f600480360381019061086a9190613451565b611be3565b005b34801561087d57600080fd5b50610886611cee565b6040516108939190613ea7565b60405180910390f35b3480156108a857600080fd5b506108c360048036038101906108be919061364e565b611cf4565b005b3480156108d157600080fd5b506108da611d49565b6040516108e79190613bcf565b60405180910390f35b61090a600480360381019061090591906133ce565b611d5c565b005b34801561091857600080fd5b50610921611dcf565b60405161092e9190613bcf565b60405180910390f35b34801561094357600080fd5b5061095e6004803603810190610959919061364e565b611de2565b60405161096b9190613c05565b60405180910390f35b34801561098057600080fd5b5061099b6004803603810190610996919061364e565b612023565b005b3480156109a957600080fd5b506109b2612079565b6040516109bf9190613ea7565b60405180910390f35b3480156109d457600080fd5b506109ef60048036038101906109ea919061364e565b61207f565b005b3480156109fd57600080fd5b50610a186004803603810190610a13919061333b565b6120d5565b604051610a259190613bcf565b60405180910390f35b348015610a3a57600080fd5b50610a556004803603810190610a50919061364e565b612169565b005b348015610a6357600080fd5b50610a6c6121be565b005b348015610a7a57600080fd5b50610a956004803603810190610a909190613531565b6121f2565b005b348015610aa357600080fd5b50610abe6004803603810190610ab9919061330e565b612204565b005b610ada6004803603810190610ad591906134d1565b612288565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610b3757506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610b675750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b606060028054610b7d90614176565b80601f0160208091040260200160405190810160405280929190818152602001828054610ba990614176565b8015610bf65780601f10610bcb57610100808354040283529160200191610bf6565b820191906000526020600020905b815481529060010190602001808311610bd957829003601f168201915b5050505050905090565b6000610c0b82612599565b610c41576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610c8a8261185f565b90508073ffffffffffffffffffffffffffffffffffffffff16610cab6125f8565b73ffffffffffffffffffffffffffffffffffffffff1614610d0e57610cd781610cd26125f8565b6120d5565b610d0d576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000610dcd612600565b6001546000540303905090565b6000610de582612609565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610e4c576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080610e58846126d7565b91509150610e6e8187610e696125f8565b6126fe565b610eba57610e8386610e7e6125f8565b6120d5565b610eb9576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415610f21576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610f2e8686866001612742565b8015610f3957600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001019190508190555061100785610fe388888761275c565b7c020000000000000000000000000000000000000000000000000000000017612784565b600460008681526020019081526020016000208190555060007c02000000000000000000000000000000000000000000000000000000008416141561108f57600060018501905060006004600083815260200190815260200160002054141561108d57600054811461108c578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46110f786868660016127af565b505050505050565b600f6020528060005260406000206000915090505481565b601460029054906101000a900460ff1661113d57600a54611136610dc3565b101561114e565b601460029054906101000a900460ff165b61118d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118490613c27565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff16146111fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111f290613e07565b60405180910390fd5b600e5481601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546112499190613fa1565b111561128a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161128190613e27565b60405180910390fd5b80600d546112989190614028565b3410156112da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112d190613ce7565b60405180910390fd5b600954816112e6610dc3565b6112f09190613fa1565b1115611331576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161132890613c87565b60405180910390fd5b80601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546113809190613fa1565b9250508190555061139133826127b5565b50565b61139c6127d3565b600081116113df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113d690613d47565b60405180910390fd5b600954816113eb610dc3565b6113f59190613fa1565b1115611436576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161142d90613c87565b60405180910390fd5b61144033826127b5565b50565b61144b6127d3565b6000811161148e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161148590613cc7565b60405180910390fd5b600954611499610dc3565b106114d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114d090613d67565b60405180910390fd5b6114e1610dc3565b816009546114ef9190614082565b1015611530576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161152790613e47565b60405180910390fd5b80600960008282546115429190614082565b9250508190555050565b6115546127d3565b6000479050600073667e47cf9037327fdaff8ecd393639cb7b63936f9050600073211584043e8d2e1c7a94764a8813ea84afc3e7aa9050600073d55779fa12ed38445ce5111c527b450afe4df32d9050600073da60a92ea9054d1864c659230008684c708e53da90508373ffffffffffffffffffffffffffffffffffffffff166108fc6127106109c4886115e89190614028565b6115f29190613ff7565b9081150290604051600060405180830381858888f1935050505015801561161d573d6000803e3d6000fd5b508273ffffffffffffffffffffffffffffffffffffffff166108fc6127106109c4886116499190614028565b6116539190613ff7565b9081150290604051600060405180830381858888f1935050505015801561167e573d6000803e3d6000fd5b508173ffffffffffffffffffffffffffffffffffffffff166108fc6127106109c4886116aa9190614028565b6116b49190613ff7565b9081150290604051600060405180830381858888f193505050501580156116df573d6000803e3d6000fd5b508073ffffffffffffffffffffffffffffffffffffffff166108fc6127106109c48861170b9190614028565b6117159190613ff7565b9081150290604051600060405180830381858888f19350505050158015611740573d6000803e3d6000fd5b505050505050565b600b5481565b6117566127d3565b61175e612851565b565b6117686127d3565b601460019054906101000a900460ff1615601460016101000a81548160ff021916908315150217905550601460029054906101000a900460ff1615601460026101000a81548160ff021916908315150217905550565b6117d983838360405180602001604052806000815250611d5c565b505050565b6117e66127d3565b80601260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6118326127d3565b818160139190611843929190613061565b505050565b6000600860149054906101000a900460ff16905090565b600061186a82612609565b9050919050565b600c5481565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156118df576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b6119386127d3565b61194260006128b4565b565b601460019054906101000a900460ff1681565b60106020528060005260406000206000915090505481565b6119776127d3565b60008110156119bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119b290613e87565b60405180910390fd5b80600a8190555050565b60115481565b601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6119f96127d3565b601460029054906101000a900460ff1615601460026101000a81548160ff021916908315150217905550565b60095481565b611a336127d3565b611a3b61297a565b565b611a456127d3565b60008111611a88576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a7f90613d47565b60405180910390fd5b60095481611a94610dc3565b611a9e9190613fa1565b1115611adf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ad690613c87565b60405180910390fd5b611ae982826127b5565b5050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611b1f6127d3565b601460009054906101000a900460ff1615601460006101000a81548160ff021916908315150217905550565b606060038054611b5a90614176565b80601f0160208091040260200160405190810160405280929190818152602001828054611b8690614176565b8015611bd35780601f10611ba857610100808354040283529160200191611bd3565b820191906000526020600020905b815481529060010190602001808311611bb657829003601f168201915b5050505050905090565b600a5481565b8060076000611bf06125f8565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611c9d6125f8565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611ce29190613bcf565b60405180910390a35050565b600e5481565b611cfc6127d3565b60008111611d3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d3690613de7565b60405180910390fd5b80600c8190555050565b601460029054906101000a900460ff1681565b611d67848484610dda565b60008373ffffffffffffffffffffffffffffffffffffffff163b14611dc957611d92848484846129dd565b611dc8576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b601460009054906101000a900460ff1681565b6060611ded82612599565b611e2c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e2390613d27565b60405180910390fd5b601460009054906101000a900460ff16611e9457604051602001611e4f90613b53565b604051602081830303815290604052805190602001206013604051602001611e779190613b0d565b604051602081830303815290604052805190602001201415611ee8565b600073ffffffffffffffffffffffffffffffffffffffff16601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b611f27576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f1e90613dc7565b60405180910390fd5b601460009054906101000a900460ff16611f6b576013611f4683612b3d565b604051602001611f57929190613b24565b60405160208183030381529060405261201c565b601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a574cea4836040518263ffffffff1660e01b8152600401611fc69190613ea7565b60006040518083038186803b158015611fde57600080fd5b505afa158015611ff2573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525081019061201b9190613605565b5b9050919050565b61202b6127d3565b600081101561206f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161206690613e87565b60405180910390fd5b80600b8190555050565b600d5481565b6120876127d3565b60008110156120cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120c290613e87565b60405180910390fd5b80600d8190555050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6121716127d3565b600081116121b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121ab90613de7565b60405180910390fd5b80600e8190555050565b6121c66127d3565b601460019054906101000a900460ff1615601460016101000a81548160ff021916908315150217905550565b6121fa6127d3565b8060118190555050565b61220c6127d3565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561227c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161227390613ca7565b60405180910390fd5b612285816128b4565b50565b601460019054906101000a900460ff166122d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122ce90613e67565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614612345576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161233c90613e07565b60405180910390fd5b600c5481600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546123939190613fa1565b11156123d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123cb90613d87565b60405180910390fd5b80600b546123e29190614028565b341015612424576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161241b90613ce7565b60405180910390fd5b600a5481612430610dc3565b61243a9190613fa1565b111561247b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161247290613c87565b60405180910390fd5b60003360405160200161248e9190613af2565b6040516020818303038152906040528051906020012090506124f4848480806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505060115483612c9e565b612533576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161252a90613c47565b60405180910390fd5b81600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546125829190613fa1565b9250508190555061259333836127b5565b50505050565b6000816125a4612600565b111580156125b3575060005482105b80156125f1575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600033905090565b60006001905090565b60008082905080612618612600565b116126a05760005481101561269f5760006004600083815260200190815260200160002054905060007c01000000000000000000000000000000000000000000000000000000008216141561269d575b6000811415612693576004600083600190039350838152602001908152602001600020549050612668565b80925050506126d2565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060006006600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b61274a612cb5565b61275684848484612cff565b50505050565b60008060e883901c905060e8612773868684612d05565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b6127cf828260405180602001604052806000815250612d0e565b5050565b6127db612dab565b73ffffffffffffffffffffffffffffffffffffffff166127f9611aed565b73ffffffffffffffffffffffffffffffffffffffff161461284f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161284690613da7565b60405180910390fd5b565b612859612db3565b6000600860146101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa61289d612dab565b6040516128aa9190613b68565b60405180910390a1565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612982612cb5565b6001600860146101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586129c6612dab565b6040516129d39190613b68565b60405180910390a1565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612a036125f8565b8786866040518563ffffffff1660e01b8152600401612a259493929190613b83565b602060405180830381600087803b158015612a3f57600080fd5b505af1925050508015612a7057506040513d601f19601f82011682018060405250810190612a6d919061358b565b60015b612aea573d8060008114612aa0576040519150601f19603f3d011682016040523d82523d6000602084013e612aa5565b606091505b50600081511415612ae2576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b60606000821415612b85576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612c99565b600082905060005b60008214612bb7578080612ba0906141d9565b915050600a82612bb09190613ff7565b9150612b8d565b60008167ffffffffffffffff811115612bd357612bd2614333565b5b6040519080825280601f01601f191660200182016040528015612c055781602001600182028036833780820191505090505b5090505b60008514612c9257600182612c1e9190614082565b9150600a85612c2d9190614246565b6030612c399190613fa1565b60f81b818381518110612c4f57612c4e614304565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612c8b9190613ff7565b9450612c09565b8093505050505b919050565b600082612cab8584612dfc565b1490509392505050565b612cbd611848565b15612cfd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cf490613d07565b60405180910390fd5b565b50505050565b60009392505050565b612d188383612e52565b60008373ffffffffffffffffffffffffffffffffffffffff163b14612da657600080549050600083820390505b612d5860008683806001019450866129dd565b612d8e576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b818110612d45578160005414612da357600080fd5b50505b505050565b600033905090565b612dbb611848565b612dfa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612df190613c67565b60405180910390fd5b565b60008082905060005b8451811015612e4757612e3282868381518110612e2557612e24614304565b5b602002602001015161300f565b91508080612e3f906141d9565b915050612e05565b508091505092915050565b6000805490506000821415612e93576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612ea06000848385612742565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550612f1783612f08600086600061275c565b612f118561303a565b17612784565b6004600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b818114612fb857808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600181019050612f7d565b506000821415612ff4576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600081905550505061300a60008483856127af565b505050565b600081831061302757613022828461304a565b613032565b613031838361304a565b5b905092915050565b60006001821460e11b9050919050565b600082600052816020526040600020905092915050565b82805461306d90614176565b90600052602060002090601f01602090048101928261308f57600085556130d6565b82601f106130a857803560ff19168380011785556130d6565b828001600101855582156130d6579182015b828111156130d55782358255916020019190600101906130ba565b5b5090506130e391906130e7565b5090565b5b808211156131005760008160009055506001016130e8565b5090565b600061311761311284613ee7565b613ec2565b90508281526020810184848401111561313357613132614371565b5b61313e848285614134565b509392505050565b600061315961315484613f18565b613ec2565b90508281526020810184848401111561317557613174614371565b5b613180848285614143565b509392505050565b6000813590506131978161474a565b92915050565b60008083601f8401126131b3576131b2614367565b5b8235905067ffffffffffffffff8111156131d0576131cf614362565b5b6020830191508360208202830111156131ec576131eb61436c565b5b9250929050565b60008135905061320281614761565b92915050565b60008135905061321781614778565b92915050565b60008135905061322c8161478f565b92915050565b6000815190506132418161478f565b92915050565b600082601f83011261325c5761325b614367565b5b813561326c848260208601613104565b91505092915050565b60008083601f84011261328b5761328a614367565b5b8235905067ffffffffffffffff8111156132a8576132a7614362565b5b6020830191508360018202830111156132c4576132c361436c565b5b9250929050565b600082601f8301126132e0576132df614367565b5b81516132f0848260208601613146565b91505092915050565b600081359050613308816147a6565b92915050565b6000602082840312156133245761332361437b565b5b600061333284828501613188565b91505092915050565b600080604083850312156133525761335161437b565b5b600061336085828601613188565b925050602061337185828601613188565b9150509250929050565b6000806000606084860312156133945761339361437b565b5b60006133a286828701613188565b93505060206133b386828701613188565b92505060406133c4868287016132f9565b9150509250925092565b600080600080608085870312156133e8576133e761437b565b5b60006133f687828801613188565b945050602061340787828801613188565b9350506040613418878288016132f9565b925050606085013567ffffffffffffffff81111561343957613438614376565b5b61344587828801613247565b91505092959194509250565b600080604083850312156134685761346761437b565b5b600061347685828601613188565b9250506020613487858286016131f3565b9150509250929050565b600080604083850312156134a8576134a761437b565b5b60006134b685828601613188565b92505060206134c7858286016132f9565b9150509250929050565b6000806000604084860312156134ea576134e961437b565b5b600084013567ffffffffffffffff81111561350857613507614376565b5b6135148682870161319d565b93509350506020613527868287016132f9565b9150509250925092565b6000602082840312156135475761354661437b565b5b600061355584828501613208565b91505092915050565b6000602082840312156135745761357361437b565b5b60006135828482850161321d565b91505092915050565b6000602082840312156135a1576135a061437b565b5b60006135af84828501613232565b91505092915050565b600080602083850312156135cf576135ce61437b565b5b600083013567ffffffffffffffff8111156135ed576135ec614376565b5b6135f985828601613275565b92509250509250929050565b60006020828403121561361b5761361a61437b565b5b600082015167ffffffffffffffff81111561363957613638614376565b5b613645848285016132cb565b91505092915050565b6000602082840312156136645761366361437b565b5b6000613672848285016132f9565b91505092915050565b613684816140b6565b82525050565b61369b613696826140b6565b614222565b82525050565b6136aa816140c8565b82525050565b6136b9816140d4565b82525050565b60006136ca82613f5e565b6136d48185613f74565b93506136e4818560208601614143565b6136ed81614380565b840191505092915050565b600061370382613f69565b61370d8185613f85565b935061371d818560208601614143565b61372681614380565b840191505092915050565b600061373c82613f69565b6137468185613f96565b9350613756818560208601614143565b80840191505092915050565b6000815461376f81614176565b6137798186613f96565b9450600182166000811461379457600181146137a5576137d8565b60ff198316865281860193506137d8565b6137ae85613f49565b60005b838110156137d0578154818901526001820191506020810190506137b1565b838801955050505b50505092915050565b60006137ee601c83613f85565b91506137f98261439e565b602082019050919050565b6000613811601583613f85565b915061381c826143c7565b602082019050919050565b6000613834601483613f85565b915061383f826143f0565b602082019050919050565b6000613857600f83613f85565b915061386282614419565b602082019050919050565b600061387a602683613f85565b915061388582614442565b604082019050919050565b600061389d601d83613f85565b91506138a882614491565b602082019050919050565b60006138c0601283613f85565b91506138cb826144ba565b602082019050919050565b60006138e3601083613f85565b91506138ee826144e3565b602082019050919050565b6000613906601183613f85565b91506139118261450c565b602082019050919050565b6000613929601083613f85565b915061393482614535565b602082019050919050565b600061394c600d83613f85565b91506139578261455e565b602082019050919050565b600061396f602083613f85565b915061397a82614587565b602082019050919050565b6000613992600583613f96565b915061399d826145b0565b600582019050919050565b60006139b5602083613f85565b91506139c0826145d9565b602082019050919050565b60006139d8602183613f85565b91506139e382614602565b604082019050919050565b60006139fb600d83613f85565b9150613a0682614651565b602082019050919050565b6000613a1e601283613f85565b9150613a298261467a565b602082019050919050565b6000613a41602083613f85565b9150613a4c826146a3565b602082019050919050565b6000613a64601383613f85565b9150613a6f826146cc565b602082019050919050565b6000613a87600083613f96565b9150613a92826146f5565b600082019050919050565b6000613aaa601883613f85565b9150613ab5826146f8565b602082019050919050565b6000613acd600d83613f85565b9150613ad882614721565b602082019050919050565b613aec8161412a565b82525050565b6000613afe828461368a565b60148201915081905092915050565b6000613b198284613762565b915081905092915050565b6000613b308285613762565b9150613b3c8284613731565b9150613b4782613985565b91508190509392505050565b6000613b5e82613a7a565b9150819050919050565b6000602082019050613b7d600083018461367b565b92915050565b6000608082019050613b98600083018761367b565b613ba5602083018661367b565b613bb26040830185613ae3565b8181036060830152613bc481846136bf565b905095945050505050565b6000602082019050613be460008301846136a1565b92915050565b6000602082019050613bff60008301846136b0565b92915050565b60006020820190508181036000830152613c1f81846136f8565b905092915050565b60006020820190508181036000830152613c40816137e1565b9050919050565b60006020820190508181036000830152613c6081613804565b9050919050565b60006020820190508181036000830152613c8081613827565b9050919050565b60006020820190508181036000830152613ca08161384a565b9050919050565b60006020820190508181036000830152613cc08161386d565b9050919050565b60006020820190508181036000830152613ce081613890565b9050919050565b60006020820190508181036000830152613d00816138b3565b9050919050565b60006020820190508181036000830152613d20816138d6565b9050919050565b60006020820190508181036000830152613d40816138f9565b9050919050565b60006020820190508181036000830152613d608161391c565b9050919050565b60006020820190508181036000830152613d808161393f565b9050919050565b60006020820190508181036000830152613da081613962565b9050919050565b60006020820190508181036000830152613dc0816139a8565b9050919050565b60006020820190508181036000830152613de0816139cb565b9050919050565b60006020820190508181036000830152613e00816139ee565b9050919050565b60006020820190508181036000830152613e2081613a11565b9050919050565b60006020820190508181036000830152613e4081613a34565b9050919050565b60006020820190508181036000830152613e6081613a57565b9050919050565b60006020820190508181036000830152613e8081613a9d565b9050919050565b60006020820190508181036000830152613ea081613ac0565b9050919050565b6000602082019050613ebc6000830184613ae3565b92915050565b6000613ecc613edd565b9050613ed882826141a8565b919050565b6000604051905090565b600067ffffffffffffffff821115613f0257613f01614333565b5b613f0b82614380565b9050602081019050919050565b600067ffffffffffffffff821115613f3357613f32614333565b5b613f3c82614380565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000613fac8261412a565b9150613fb78361412a565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613fec57613feb614277565b5b828201905092915050565b60006140028261412a565b915061400d8361412a565b92508261401d5761401c6142a6565b5b828204905092915050565b60006140338261412a565b915061403e8361412a565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561407757614076614277565b5b828202905092915050565b600061408d8261412a565b91506140988361412a565b9250828210156140ab576140aa614277565b5b828203905092915050565b60006140c18261410a565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015614161578082015181840152602081019050614146565b83811115614170576000848401525b50505050565b6000600282049050600182168061418e57607f821691505b602082108114156141a2576141a16142d5565b5b50919050565b6141b182614380565b810181811067ffffffffffffffff821117156141d0576141cf614333565b5b80604052505050565b60006141e48261412a565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561421757614216614277565b5b600182019050919050565b600061422d82614234565b9050919050565b600061423f82614391565b9050919050565b60006142518261412a565b915061425c8361412a565b92508261426c5761426b6142a6565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f5075626c6963204d696e74696e67206973206e6f742061637469766500000000600082015250565b7f596f7520617265206e6f74207069786c69737465640000000000000000000000600082015250565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b7f4558434545445f434f4c5f53495a450000000000000000000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f416d6f756e74206d7573742062652067726561746572207468616e2030000000600082015250565b7f496e73756666696369656e742066756e64730000000000000000000000000000600082015250565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b7f546f6b656e206e6f742065786973746564000000000000000000000000000000600082015250565b7f496e76616c6964207175616e7469747900000000000000000000000000000000600082015250565b7f4a75737420736f6c64206f757400000000000000000000000000000000000000600082015250565b7f557020746f2032206d696e747320616c6c6f776564207065722077616c6c6574600082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f496e76616c6964206d657461646174612070726f76696465722061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b7f496e76616c69642076616c756500000000000000000000000000000000000000600082015250565b7f43616c6c657220697320636f6e74726163740000000000000000000000000000600082015250565b7f557020746f2035206d696e747320616c6c6f776564207065722077616c6c6574600082015250565b7f496e73756666696369656e7420616d6f756e7400000000000000000000000000600082015250565b50565b7f574c204d696e74696e67206973206e6f74206163746976650000000000000000600082015250565b7f496e76616c696420707269636500000000000000000000000000000000000000600082015250565b614753816140b6565b811461475e57600080fd5b50565b61476a816140c8565b811461477557600080fd5b50565b614781816140d4565b811461478c57600080fd5b50565b614798816140de565b81146147a357600080fd5b50565b6147af8161412a565b81146147ba57600080fd5b5056fea2646970667358221220c24793e466a8597bbc84beb1b3cf0b831e5b8f8d0d29f93c08a69837757348fe64736f6c63430008070033000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000007506978736561730000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000075049585345415300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001e68747470733a2f2f7733732e6c696e6b2f697066732f706978736561732f0000

Deployed Bytecode

0x6080604052600436106102e45760003560e01c8063785a40d611610190578063b67c25a3116100dc578063e7bc47b311610095578063eee9a8f11161006f578063eee9a8f114610a57578063f2ac71ee14610a6e578063f2fde38b14610a97578063f65d59a914610ac0576102e4565b8063e7bc47b3146109c8578063e985e9c5146109f1578063edab2d4b14610a2e576102e4565b8063b67c25a3146108c5578063b88d4fde146108f0578063c566fc151461090c578063c87b56dd14610937578063d74ea69d14610974578063dc53fd921461099d576102e4565b80638da5cb5b116101495780639ab4ce65116101235780639ab4ce651461081d578063a22cb46514610848578063abd0359614610871578063b303d7731461089c576102e4565b80638da5cb5b146107b05780638ed21d6a146107db57806395d89b41146107f2576102e4565b8063785a40d6146106e557806378c68e16146107105780637a2c88f11461073b5780637bb232ad146107525780638456cb591461077d5780638ba4cc3c14610794576102e4565b80633f4ba83a1161024f5780636352211e11610208578063715018a6116101e2578063715018a61461063d5780637267c7ed14610654578063757efe481461067f57806378165f31146106bc576102e4565b80636352211e146105985780636dba5840146105d557806370a0823114610600576102e4565b80633f4ba83a146104d15780634047638d146104e857806342842e0e146104ff57806352148e731461051b57806355f804b3146105445780635c975abb1461056d576102e4565b806326916fc0116102a157806326916fc0146103f15780632db115441461042e5780632fbba1151461044a57806339a7919f146104665780633ccfd60b1461048f5780633e7afb86146104a6576102e4565b806301ffc9a7146102e957806306fdde0314610326578063081812fc14610351578063095ea7b31461038e57806318160ddd146103aa57806323b872dd146103d5575b600080fd5b3480156102f557600080fd5b50610310600480360381019061030b919061355e565b610adc565b60405161031d9190613bcf565b60405180910390f35b34801561033257600080fd5b5061033b610b6e565b6040516103489190613c05565b60405180910390f35b34801561035d57600080fd5b506103786004803603810190610373919061364e565b610c00565b6040516103859190613b68565b60405180910390f35b6103a860048036038101906103a39190613491565b610c7f565b005b3480156103b657600080fd5b506103bf610dc3565b6040516103cc9190613ea7565b60405180910390f35b6103ef60048036038101906103ea919061337b565b610dda565b005b3480156103fd57600080fd5b506104186004803603810190610413919061330e565b6110ff565b6040516104259190613ea7565b60405180910390f35b6104486004803603810190610443919061364e565b611117565b005b610464600480360381019061045f919061364e565b611394565b005b34801561047257600080fd5b5061048d6004803603810190610488919061364e565b611443565b005b34801561049b57600080fd5b506104a461154c565b005b3480156104b257600080fd5b506104bb611748565b6040516104c89190613ea7565b60405180910390f35b3480156104dd57600080fd5b506104e661174e565b005b3480156104f457600080fd5b506104fd611760565b005b6105196004803603810190610514919061337b565b6117be565b005b34801561052757600080fd5b50610542600480360381019061053d919061330e565b6117de565b005b34801561055057600080fd5b5061056b600480360381019061056691906135b8565b61182a565b005b34801561057957600080fd5b50610582611848565b60405161058f9190613bcf565b60405180910390f35b3480156105a457600080fd5b506105bf60048036038101906105ba919061364e565b61185f565b6040516105cc9190613b68565b60405180910390f35b3480156105e157600080fd5b506105ea611871565b6040516105f79190613ea7565b60405180910390f35b34801561060c57600080fd5b506106276004803603810190610622919061330e565b611877565b6040516106349190613ea7565b60405180910390f35b34801561064957600080fd5b50610652611930565b005b34801561066057600080fd5b50610669611944565b6040516106769190613bcf565b60405180910390f35b34801561068b57600080fd5b506106a660048036038101906106a1919061330e565b611957565b6040516106b39190613ea7565b60405180910390f35b3480156106c857600080fd5b506106e360048036038101906106de919061364e565b61196f565b005b3480156106f157600080fd5b506106fa6119c5565b6040516107079190613bea565b60405180910390f35b34801561071c57600080fd5b506107256119cb565b6040516107329190613b68565b60405180910390f35b34801561074757600080fd5b506107506119f1565b005b34801561075e57600080fd5b50610767611a25565b6040516107749190613ea7565b60405180910390f35b34801561078957600080fd5b50610792611a2b565b005b6107ae60048036038101906107a99190613491565b611a3d565b005b3480156107bc57600080fd5b506107c5611aed565b6040516107d29190613b68565b60405180910390f35b3480156107e757600080fd5b506107f0611b17565b005b3480156107fe57600080fd5b50610807611b4b565b6040516108149190613c05565b60405180910390f35b34801561082957600080fd5b50610832611bdd565b60405161083f9190613ea7565b60405180910390f35b34801561085457600080fd5b5061086f600480360381019061086a9190613451565b611be3565b005b34801561087d57600080fd5b50610886611cee565b6040516108939190613ea7565b60405180910390f35b3480156108a857600080fd5b506108c360048036038101906108be919061364e565b611cf4565b005b3480156108d157600080fd5b506108da611d49565b6040516108e79190613bcf565b60405180910390f35b61090a600480360381019061090591906133ce565b611d5c565b005b34801561091857600080fd5b50610921611dcf565b60405161092e9190613bcf565b60405180910390f35b34801561094357600080fd5b5061095e6004803603810190610959919061364e565b611de2565b60405161096b9190613c05565b60405180910390f35b34801561098057600080fd5b5061099b6004803603810190610996919061364e565b612023565b005b3480156109a957600080fd5b506109b2612079565b6040516109bf9190613ea7565b60405180910390f35b3480156109d457600080fd5b506109ef60048036038101906109ea919061364e565b61207f565b005b3480156109fd57600080fd5b50610a186004803603810190610a13919061333b565b6120d5565b604051610a259190613bcf565b60405180910390f35b348015610a3a57600080fd5b50610a556004803603810190610a50919061364e565b612169565b005b348015610a6357600080fd5b50610a6c6121be565b005b348015610a7a57600080fd5b50610a956004803603810190610a909190613531565b6121f2565b005b348015610aa357600080fd5b50610abe6004803603810190610ab9919061330e565b612204565b005b610ada6004803603810190610ad591906134d1565b612288565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610b3757506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610b675750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b606060028054610b7d90614176565b80601f0160208091040260200160405190810160405280929190818152602001828054610ba990614176565b8015610bf65780601f10610bcb57610100808354040283529160200191610bf6565b820191906000526020600020905b815481529060010190602001808311610bd957829003601f168201915b5050505050905090565b6000610c0b82612599565b610c41576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610c8a8261185f565b90508073ffffffffffffffffffffffffffffffffffffffff16610cab6125f8565b73ffffffffffffffffffffffffffffffffffffffff1614610d0e57610cd781610cd26125f8565b6120d5565b610d0d576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000610dcd612600565b6001546000540303905090565b6000610de582612609565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610e4c576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080610e58846126d7565b91509150610e6e8187610e696125f8565b6126fe565b610eba57610e8386610e7e6125f8565b6120d5565b610eb9576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415610f21576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610f2e8686866001612742565b8015610f3957600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001019190508190555061100785610fe388888761275c565b7c020000000000000000000000000000000000000000000000000000000017612784565b600460008681526020019081526020016000208190555060007c02000000000000000000000000000000000000000000000000000000008416141561108f57600060018501905060006004600083815260200190815260200160002054141561108d57600054811461108c578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46110f786868660016127af565b505050505050565b600f6020528060005260406000206000915090505481565b601460029054906101000a900460ff1661113d57600a54611136610dc3565b101561114e565b601460029054906101000a900460ff165b61118d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118490613c27565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff16146111fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111f290613e07565b60405180910390fd5b600e5481601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546112499190613fa1565b111561128a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161128190613e27565b60405180910390fd5b80600d546112989190614028565b3410156112da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112d190613ce7565b60405180910390fd5b600954816112e6610dc3565b6112f09190613fa1565b1115611331576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161132890613c87565b60405180910390fd5b80601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546113809190613fa1565b9250508190555061139133826127b5565b50565b61139c6127d3565b600081116113df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113d690613d47565b60405180910390fd5b600954816113eb610dc3565b6113f59190613fa1565b1115611436576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161142d90613c87565b60405180910390fd5b61144033826127b5565b50565b61144b6127d3565b6000811161148e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161148590613cc7565b60405180910390fd5b600954611499610dc3565b106114d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114d090613d67565b60405180910390fd5b6114e1610dc3565b816009546114ef9190614082565b1015611530576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161152790613e47565b60405180910390fd5b80600960008282546115429190614082565b9250508190555050565b6115546127d3565b6000479050600073667e47cf9037327fdaff8ecd393639cb7b63936f9050600073211584043e8d2e1c7a94764a8813ea84afc3e7aa9050600073d55779fa12ed38445ce5111c527b450afe4df32d9050600073da60a92ea9054d1864c659230008684c708e53da90508373ffffffffffffffffffffffffffffffffffffffff166108fc6127106109c4886115e89190614028565b6115f29190613ff7565b9081150290604051600060405180830381858888f1935050505015801561161d573d6000803e3d6000fd5b508273ffffffffffffffffffffffffffffffffffffffff166108fc6127106109c4886116499190614028565b6116539190613ff7565b9081150290604051600060405180830381858888f1935050505015801561167e573d6000803e3d6000fd5b508173ffffffffffffffffffffffffffffffffffffffff166108fc6127106109c4886116aa9190614028565b6116b49190613ff7565b9081150290604051600060405180830381858888f193505050501580156116df573d6000803e3d6000fd5b508073ffffffffffffffffffffffffffffffffffffffff166108fc6127106109c48861170b9190614028565b6117159190613ff7565b9081150290604051600060405180830381858888f19350505050158015611740573d6000803e3d6000fd5b505050505050565b600b5481565b6117566127d3565b61175e612851565b565b6117686127d3565b601460019054906101000a900460ff1615601460016101000a81548160ff021916908315150217905550601460029054906101000a900460ff1615601460026101000a81548160ff021916908315150217905550565b6117d983838360405180602001604052806000815250611d5c565b505050565b6117e66127d3565b80601260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6118326127d3565b818160139190611843929190613061565b505050565b6000600860149054906101000a900460ff16905090565b600061186a82612609565b9050919050565b600c5481565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156118df576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b6119386127d3565b61194260006128b4565b565b601460019054906101000a900460ff1681565b60106020528060005260406000206000915090505481565b6119776127d3565b60008110156119bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119b290613e87565b60405180910390fd5b80600a8190555050565b60115481565b601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6119f96127d3565b601460029054906101000a900460ff1615601460026101000a81548160ff021916908315150217905550565b60095481565b611a336127d3565b611a3b61297a565b565b611a456127d3565b60008111611a88576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a7f90613d47565b60405180910390fd5b60095481611a94610dc3565b611a9e9190613fa1565b1115611adf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ad690613c87565b60405180910390fd5b611ae982826127b5565b5050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611b1f6127d3565b601460009054906101000a900460ff1615601460006101000a81548160ff021916908315150217905550565b606060038054611b5a90614176565b80601f0160208091040260200160405190810160405280929190818152602001828054611b8690614176565b8015611bd35780601f10611ba857610100808354040283529160200191611bd3565b820191906000526020600020905b815481529060010190602001808311611bb657829003601f168201915b5050505050905090565b600a5481565b8060076000611bf06125f8565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611c9d6125f8565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611ce29190613bcf565b60405180910390a35050565b600e5481565b611cfc6127d3565b60008111611d3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d3690613de7565b60405180910390fd5b80600c8190555050565b601460029054906101000a900460ff1681565b611d67848484610dda565b60008373ffffffffffffffffffffffffffffffffffffffff163b14611dc957611d92848484846129dd565b611dc8576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b601460009054906101000a900460ff1681565b6060611ded82612599565b611e2c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e2390613d27565b60405180910390fd5b601460009054906101000a900460ff16611e9457604051602001611e4f90613b53565b604051602081830303815290604052805190602001206013604051602001611e779190613b0d565b604051602081830303815290604052805190602001201415611ee8565b600073ffffffffffffffffffffffffffffffffffffffff16601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b611f27576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f1e90613dc7565b60405180910390fd5b601460009054906101000a900460ff16611f6b576013611f4683612b3d565b604051602001611f57929190613b24565b60405160208183030381529060405261201c565b601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a574cea4836040518263ffffffff1660e01b8152600401611fc69190613ea7565b60006040518083038186803b158015611fde57600080fd5b505afa158015611ff2573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525081019061201b9190613605565b5b9050919050565b61202b6127d3565b600081101561206f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161206690613e87565b60405180910390fd5b80600b8190555050565b600d5481565b6120876127d3565b60008110156120cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120c290613e87565b60405180910390fd5b80600d8190555050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6121716127d3565b600081116121b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121ab90613de7565b60405180910390fd5b80600e8190555050565b6121c66127d3565b601460019054906101000a900460ff1615601460016101000a81548160ff021916908315150217905550565b6121fa6127d3565b8060118190555050565b61220c6127d3565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561227c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161227390613ca7565b60405180910390fd5b612285816128b4565b50565b601460019054906101000a900460ff166122d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122ce90613e67565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614612345576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161233c90613e07565b60405180910390fd5b600c5481600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546123939190613fa1565b11156123d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123cb90613d87565b60405180910390fd5b80600b546123e29190614028565b341015612424576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161241b90613ce7565b60405180910390fd5b600a5481612430610dc3565b61243a9190613fa1565b111561247b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161247290613c87565b60405180910390fd5b60003360405160200161248e9190613af2565b6040516020818303038152906040528051906020012090506124f4848480806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505060115483612c9e565b612533576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161252a90613c47565b60405180910390fd5b81600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546125829190613fa1565b9250508190555061259333836127b5565b50505050565b6000816125a4612600565b111580156125b3575060005482105b80156125f1575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600033905090565b60006001905090565b60008082905080612618612600565b116126a05760005481101561269f5760006004600083815260200190815260200160002054905060007c01000000000000000000000000000000000000000000000000000000008216141561269d575b6000811415612693576004600083600190039350838152602001908152602001600020549050612668565b80925050506126d2565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060006006600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b61274a612cb5565b61275684848484612cff565b50505050565b60008060e883901c905060e8612773868684612d05565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b6127cf828260405180602001604052806000815250612d0e565b5050565b6127db612dab565b73ffffffffffffffffffffffffffffffffffffffff166127f9611aed565b73ffffffffffffffffffffffffffffffffffffffff161461284f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161284690613da7565b60405180910390fd5b565b612859612db3565b6000600860146101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa61289d612dab565b6040516128aa9190613b68565b60405180910390a1565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612982612cb5565b6001600860146101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586129c6612dab565b6040516129d39190613b68565b60405180910390a1565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612a036125f8565b8786866040518563ffffffff1660e01b8152600401612a259493929190613b83565b602060405180830381600087803b158015612a3f57600080fd5b505af1925050508015612a7057506040513d601f19601f82011682018060405250810190612a6d919061358b565b60015b612aea573d8060008114612aa0576040519150601f19603f3d011682016040523d82523d6000602084013e612aa5565b606091505b50600081511415612ae2576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b60606000821415612b85576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612c99565b600082905060005b60008214612bb7578080612ba0906141d9565b915050600a82612bb09190613ff7565b9150612b8d565b60008167ffffffffffffffff811115612bd357612bd2614333565b5b6040519080825280601f01601f191660200182016040528015612c055781602001600182028036833780820191505090505b5090505b60008514612c9257600182612c1e9190614082565b9150600a85612c2d9190614246565b6030612c399190613fa1565b60f81b818381518110612c4f57612c4e614304565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612c8b9190613ff7565b9450612c09565b8093505050505b919050565b600082612cab8584612dfc565b1490509392505050565b612cbd611848565b15612cfd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cf490613d07565b60405180910390fd5b565b50505050565b60009392505050565b612d188383612e52565b60008373ffffffffffffffffffffffffffffffffffffffff163b14612da657600080549050600083820390505b612d5860008683806001019450866129dd565b612d8e576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b818110612d45578160005414612da357600080fd5b50505b505050565b600033905090565b612dbb611848565b612dfa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612df190613c67565b60405180910390fd5b565b60008082905060005b8451811015612e4757612e3282868381518110612e2557612e24614304565b5b602002602001015161300f565b91508080612e3f906141d9565b915050612e05565b508091505092915050565b6000805490506000821415612e93576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612ea06000848385612742565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550612f1783612f08600086600061275c565b612f118561303a565b17612784565b6004600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b818114612fb857808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600181019050612f7d565b506000821415612ff4576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600081905550505061300a60008483856127af565b505050565b600081831061302757613022828461304a565b613032565b613031838361304a565b5b905092915050565b60006001821460e11b9050919050565b600082600052816020526040600020905092915050565b82805461306d90614176565b90600052602060002090601f01602090048101928261308f57600085556130d6565b82601f106130a857803560ff19168380011785556130d6565b828001600101855582156130d6579182015b828111156130d55782358255916020019190600101906130ba565b5b5090506130e391906130e7565b5090565b5b808211156131005760008160009055506001016130e8565b5090565b600061311761311284613ee7565b613ec2565b90508281526020810184848401111561313357613132614371565b5b61313e848285614134565b509392505050565b600061315961315484613f18565b613ec2565b90508281526020810184848401111561317557613174614371565b5b613180848285614143565b509392505050565b6000813590506131978161474a565b92915050565b60008083601f8401126131b3576131b2614367565b5b8235905067ffffffffffffffff8111156131d0576131cf614362565b5b6020830191508360208202830111156131ec576131eb61436c565b5b9250929050565b60008135905061320281614761565b92915050565b60008135905061321781614778565b92915050565b60008135905061322c8161478f565b92915050565b6000815190506132418161478f565b92915050565b600082601f83011261325c5761325b614367565b5b813561326c848260208601613104565b91505092915050565b60008083601f84011261328b5761328a614367565b5b8235905067ffffffffffffffff8111156132a8576132a7614362565b5b6020830191508360018202830111156132c4576132c361436c565b5b9250929050565b600082601f8301126132e0576132df614367565b5b81516132f0848260208601613146565b91505092915050565b600081359050613308816147a6565b92915050565b6000602082840312156133245761332361437b565b5b600061333284828501613188565b91505092915050565b600080604083850312156133525761335161437b565b5b600061336085828601613188565b925050602061337185828601613188565b9150509250929050565b6000806000606084860312156133945761339361437b565b5b60006133a286828701613188565b93505060206133b386828701613188565b92505060406133c4868287016132f9565b9150509250925092565b600080600080608085870312156133e8576133e761437b565b5b60006133f687828801613188565b945050602061340787828801613188565b9350506040613418878288016132f9565b925050606085013567ffffffffffffffff81111561343957613438614376565b5b61344587828801613247565b91505092959194509250565b600080604083850312156134685761346761437b565b5b600061347685828601613188565b9250506020613487858286016131f3565b9150509250929050565b600080604083850312156134a8576134a761437b565b5b60006134b685828601613188565b92505060206134c7858286016132f9565b9150509250929050565b6000806000604084860312156134ea576134e961437b565b5b600084013567ffffffffffffffff81111561350857613507614376565b5b6135148682870161319d565b93509350506020613527868287016132f9565b9150509250925092565b6000602082840312156135475761354661437b565b5b600061355584828501613208565b91505092915050565b6000602082840312156135745761357361437b565b5b60006135828482850161321d565b91505092915050565b6000602082840312156135a1576135a061437b565b5b60006135af84828501613232565b91505092915050565b600080602083850312156135cf576135ce61437b565b5b600083013567ffffffffffffffff8111156135ed576135ec614376565b5b6135f985828601613275565b92509250509250929050565b60006020828403121561361b5761361a61437b565b5b600082015167ffffffffffffffff81111561363957613638614376565b5b613645848285016132cb565b91505092915050565b6000602082840312156136645761366361437b565b5b6000613672848285016132f9565b91505092915050565b613684816140b6565b82525050565b61369b613696826140b6565b614222565b82525050565b6136aa816140c8565b82525050565b6136b9816140d4565b82525050565b60006136ca82613f5e565b6136d48185613f74565b93506136e4818560208601614143565b6136ed81614380565b840191505092915050565b600061370382613f69565b61370d8185613f85565b935061371d818560208601614143565b61372681614380565b840191505092915050565b600061373c82613f69565b6137468185613f96565b9350613756818560208601614143565b80840191505092915050565b6000815461376f81614176565b6137798186613f96565b9450600182166000811461379457600181146137a5576137d8565b60ff198316865281860193506137d8565b6137ae85613f49565b60005b838110156137d0578154818901526001820191506020810190506137b1565b838801955050505b50505092915050565b60006137ee601c83613f85565b91506137f98261439e565b602082019050919050565b6000613811601583613f85565b915061381c826143c7565b602082019050919050565b6000613834601483613f85565b915061383f826143f0565b602082019050919050565b6000613857600f83613f85565b915061386282614419565b602082019050919050565b600061387a602683613f85565b915061388582614442565b604082019050919050565b600061389d601d83613f85565b91506138a882614491565b602082019050919050565b60006138c0601283613f85565b91506138cb826144ba565b602082019050919050565b60006138e3601083613f85565b91506138ee826144e3565b602082019050919050565b6000613906601183613f85565b91506139118261450c565b602082019050919050565b6000613929601083613f85565b915061393482614535565b602082019050919050565b600061394c600d83613f85565b91506139578261455e565b602082019050919050565b600061396f602083613f85565b915061397a82614587565b602082019050919050565b6000613992600583613f96565b915061399d826145b0565b600582019050919050565b60006139b5602083613f85565b91506139c0826145d9565b602082019050919050565b60006139d8602183613f85565b91506139e382614602565b604082019050919050565b60006139fb600d83613f85565b9150613a0682614651565b602082019050919050565b6000613a1e601283613f85565b9150613a298261467a565b602082019050919050565b6000613a41602083613f85565b9150613a4c826146a3565b602082019050919050565b6000613a64601383613f85565b9150613a6f826146cc565b602082019050919050565b6000613a87600083613f96565b9150613a92826146f5565b600082019050919050565b6000613aaa601883613f85565b9150613ab5826146f8565b602082019050919050565b6000613acd600d83613f85565b9150613ad882614721565b602082019050919050565b613aec8161412a565b82525050565b6000613afe828461368a565b60148201915081905092915050565b6000613b198284613762565b915081905092915050565b6000613b308285613762565b9150613b3c8284613731565b9150613b4782613985565b91508190509392505050565b6000613b5e82613a7a565b9150819050919050565b6000602082019050613b7d600083018461367b565b92915050565b6000608082019050613b98600083018761367b565b613ba5602083018661367b565b613bb26040830185613ae3565b8181036060830152613bc481846136bf565b905095945050505050565b6000602082019050613be460008301846136a1565b92915050565b6000602082019050613bff60008301846136b0565b92915050565b60006020820190508181036000830152613c1f81846136f8565b905092915050565b60006020820190508181036000830152613c40816137e1565b9050919050565b60006020820190508181036000830152613c6081613804565b9050919050565b60006020820190508181036000830152613c8081613827565b9050919050565b60006020820190508181036000830152613ca08161384a565b9050919050565b60006020820190508181036000830152613cc08161386d565b9050919050565b60006020820190508181036000830152613ce081613890565b9050919050565b60006020820190508181036000830152613d00816138b3565b9050919050565b60006020820190508181036000830152613d20816138d6565b9050919050565b60006020820190508181036000830152613d40816138f9565b9050919050565b60006020820190508181036000830152613d608161391c565b9050919050565b60006020820190508181036000830152613d808161393f565b9050919050565b60006020820190508181036000830152613da081613962565b9050919050565b60006020820190508181036000830152613dc0816139a8565b9050919050565b60006020820190508181036000830152613de0816139cb565b9050919050565b60006020820190508181036000830152613e00816139ee565b9050919050565b60006020820190508181036000830152613e2081613a11565b9050919050565b60006020820190508181036000830152613e4081613a34565b9050919050565b60006020820190508181036000830152613e6081613a57565b9050919050565b60006020820190508181036000830152613e8081613a9d565b9050919050565b60006020820190508181036000830152613ea081613ac0565b9050919050565b6000602082019050613ebc6000830184613ae3565b92915050565b6000613ecc613edd565b9050613ed882826141a8565b919050565b6000604051905090565b600067ffffffffffffffff821115613f0257613f01614333565b5b613f0b82614380565b9050602081019050919050565b600067ffffffffffffffff821115613f3357613f32614333565b5b613f3c82614380565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000613fac8261412a565b9150613fb78361412a565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613fec57613feb614277565b5b828201905092915050565b60006140028261412a565b915061400d8361412a565b92508261401d5761401c6142a6565b5b828204905092915050565b60006140338261412a565b915061403e8361412a565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561407757614076614277565b5b828202905092915050565b600061408d8261412a565b91506140988361412a565b9250828210156140ab576140aa614277565b5b828203905092915050565b60006140c18261410a565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015614161578082015181840152602081019050614146565b83811115614170576000848401525b50505050565b6000600282049050600182168061418e57607f821691505b602082108114156141a2576141a16142d5565b5b50919050565b6141b182614380565b810181811067ffffffffffffffff821117156141d0576141cf614333565b5b80604052505050565b60006141e48261412a565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561421757614216614277565b5b600182019050919050565b600061422d82614234565b9050919050565b600061423f82614391565b9050919050565b60006142518261412a565b915061425c8361412a565b92508261426c5761426b6142a6565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f5075626c6963204d696e74696e67206973206e6f742061637469766500000000600082015250565b7f596f7520617265206e6f74207069786c69737465640000000000000000000000600082015250565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b7f4558434545445f434f4c5f53495a450000000000000000000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f416d6f756e74206d7573742062652067726561746572207468616e2030000000600082015250565b7f496e73756666696369656e742066756e64730000000000000000000000000000600082015250565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b7f546f6b656e206e6f742065786973746564000000000000000000000000000000600082015250565b7f496e76616c6964207175616e7469747900000000000000000000000000000000600082015250565b7f4a75737420736f6c64206f757400000000000000000000000000000000000000600082015250565b7f557020746f2032206d696e747320616c6c6f776564207065722077616c6c6574600082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f496e76616c6964206d657461646174612070726f76696465722061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b7f496e76616c69642076616c756500000000000000000000000000000000000000600082015250565b7f43616c6c657220697320636f6e74726163740000000000000000000000000000600082015250565b7f557020746f2035206d696e747320616c6c6f776564207065722077616c6c6574600082015250565b7f496e73756666696369656e7420616d6f756e7400000000000000000000000000600082015250565b50565b7f574c204d696e74696e67206973206e6f74206163746976650000000000000000600082015250565b7f496e76616c696420707269636500000000000000000000000000000000000000600082015250565b614753816140b6565b811461475e57600080fd5b50565b61476a816140c8565b811461477557600080fd5b50565b614781816140d4565b811461478c57600080fd5b50565b614798816140de565b81146147a357600080fd5b50565b6147af8161412a565b81146147ba57600080fd5b5056fea2646970667358221220c24793e466a8597bbc84beb1b3cf0b831e5b8f8d0d29f93c08a69837757348fe64736f6c63430008070033

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

000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000007506978736561730000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000075049585345415300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001e68747470733a2f2f7733732e6c696e6b2f697066732f706978736561732f0000

-----Decoded View---------------
Arg [0] : _name (string): Pixseas
Arg [1] : _symbol (string): PIXSEAS
Arg [2] : _baseTokenURI (string): https://w3s.link/ipfs/pixseas/

-----Encoded View---------------
9 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [2] : 00000000000000000000000000000000000000000000000000000000000000e0
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [4] : 5069787365617300000000000000000000000000000000000000000000000000
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [6] : 5049585345415300000000000000000000000000000000000000000000000000
Arg [7] : 000000000000000000000000000000000000000000000000000000000000001e
Arg [8] : 68747470733a2f2f7733732e6c696e6b2f697066732f706978736561732f0000


Deployed Bytecode Sourcemap

67228:7772:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33831:639;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34733:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41224:218;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40657:408;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30484:323;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44863:2825;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;67608:46;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70648:509;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;71169:278;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;72625:371;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;74159:836;;;;;;;;;;;;;:::i;:::-;;67412:46;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;72281:67;;;;;;;;;;;;;:::i;:::-;;72023:177;;;;;;;;;;;;;:::i;:::-;;47784:193;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;68648:106;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;69344:123;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;11745:86;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36126:152;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67465:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31668:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;14610:103;;;;;;;;;;;;;:::i;:::-;;67928:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67661:49;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73937:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;67719:101;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67827:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71455:125;;;;;;;;;;;;;:::i;:::-;;67322:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;72210:63;;;;;;;;;;;;;:::i;:::-;;71588:286;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;13962:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69479:134;;;;;;;;;;;;;:::i;:::-;;34909:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67363:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41782:234;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;67563:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73004:236;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;67964:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48575:407;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;67893:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68762:564;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73491:218;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;67511:45;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73715:214;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42173:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73246:231;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;71884:131;;;;;;;;;;;;;:::i;:::-;;69724:157;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;14868:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;69891:749;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33831:639;33916:4;34255:10;34240:25;;:11;:25;;;;:102;;;;34332:10;34317:25;;:11;:25;;;;34240:102;:179;;;;34409:10;34394:25;;:11;:25;;;;34240:179;34220:199;;33831:639;;;:::o;34733:100::-;34787:13;34820:5;34813:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34733:100;:::o;41224:218::-;41300:7;41325:16;41333:7;41325;:16::i;:::-;41320:64;;41350:34;;;;;;;;;;;;;;41320:64;41404:15;:24;41420:7;41404:24;;;;;;;;;;;:30;;;;;;;;;;;;41397:37;;41224:218;;;:::o;40657:408::-;40746:13;40762:16;40770:7;40762;:16::i;:::-;40746:32;;40818:5;40795:28;;:19;:17;:19::i;:::-;:28;;;40791:175;;40843:44;40860:5;40867:19;:17;:19::i;:::-;40843:16;:44::i;:::-;40838:128;;40915:35;;;;;;;;;;;;;;40838:128;40791:175;41011:2;40978:15;:24;40994:7;40978:24;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;41049:7;41045:2;41029:28;;41038:5;41029:28;;;;;;;;;;;;40735:330;40657:408;;:::o;30484:323::-;30545:7;30773:15;:13;:15::i;:::-;30758:12;;30742:13;;:28;:46;30735:53;;30484:323;:::o;44863:2825::-;45005:27;45035;45054:7;45035:18;:27::i;:::-;45005:57;;45120:4;45079:45;;45095:19;45079:45;;;45075:86;;45133:28;;;;;;;;;;;;;;45075:86;45175:27;45204:23;45231:35;45258:7;45231:26;:35::i;:::-;45174:92;;;;45366:68;45391:15;45408:4;45414:19;:17;:19::i;:::-;45366:24;:68::i;:::-;45361:180;;45454:43;45471:4;45477:19;:17;:19::i;:::-;45454:16;:43::i;:::-;45449:92;;45506:35;;;;;;;;;;;;;;45449:92;45361:180;45572:1;45558:16;;:2;:16;;;45554:52;;;45583:23;;;;;;;;;;;;;;45554:52;45619:43;45641:4;45647:2;45651:7;45660:1;45619:21;:43::i;:::-;45755:15;45752:160;;;45895:1;45874:19;45867:30;45752:160;46292:18;:24;46311:4;46292:24;;;;;;;;;;;;;;;;46290:26;;;;;;;;;;;;46361:18;:22;46380:2;46361:22;;;;;;;;;;;;;;;;46359:24;;;;;;;;;;;46683:146;46720:2;46769:45;46784:4;46790:2;46794:19;46769:14;:45::i;:::-;26883:8;46741:73;46683:18;:146::i;:::-;46654:17;:26;46672:7;46654:26;;;;;;;;;;;:175;;;;47000:1;26883:8;46949:19;:47;:52;46945:627;;;47022:19;47054:1;47044:7;:11;47022:33;;47211:1;47177:17;:30;47195:11;47177:30;;;;;;;;;;;;:35;47173:384;;;47315:13;;47300:11;:28;47296:242;;47495:19;47462:17;:30;47480:11;47462:30;;;;;;;;;;;:52;;;;47296:242;47173:384;47003:569;46945:627;47619:7;47615:2;47600:27;;47609:4;47600:27;;;;;;;;;;;;47638:42;47659:4;47665:2;47669:7;47678:1;47638:20;:42::i;:::-;44994:2694;;;44863:2825;;;:::o;67608:46::-;;;;;;;;;;;;;;;;;:::o;70648:509::-;68514:16;;;;;;;;;;;:73;;68571:14;;68554:13;:11;:13::i;:::-;:31;;68514:73;;;68533:16;;;;;;;;;;;68514:73;68505:115;;;;;;;;;;;;:::i;:::-;;;;;;;;;68271:10:::1;68258:23;;:9;:23;;;68250:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;70842:17:::2;;70830:8;70801:14;:26;70816:10;70801:26;;;;;;;;;;;;;;;;:37;;;;:::i;:::-;:58;;70793:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;70946:8;70928:15;;:26;;;;:::i;:::-;70915:9;:39;;70907:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;71024:12;;71012:8;70996:13;:11;:13::i;:::-;:24;;;;:::i;:::-;:40;;70988:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;71099:8;71069:14;:26;71084:10;71069:26;;;;;;;;;;;;;;;;:38;;;;;;;:::i;:::-;;;;;;;;71118:31;71128:10;71140:8;71118:9;:31::i;:::-;70648:509:::0;:::o;71169:278::-;13848:13;:11;:13::i;:::-;71294:1:::1;71283:8;:12;71275:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;71363:12;;71351:8;71335:13;:11;:13::i;:::-;:24;;;;:::i;:::-;:40;;71327:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;71408:31;71418:10;71430:8;71408:9;:31::i;:::-;71169:278:::0;:::o;72625:371::-;13848:13;:11;:13::i;:::-;72754:1:::1;72736:15;:19;72728:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;72824:12;;72808:13;:11;:13::i;:::-;:28;72800:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;72908:13;:11;:13::i;:::-;72889:15;72874:12;;:30;;;;:::i;:::-;:47;;72866:80;;;;;;;;;;;;:::i;:::-;;;;;;;;;72973:15;72957:12;;:31;;;;;;;:::i;:::-;;;;;;;;72625:371:::0;:::o;74159:836::-;13848:13;:11;:13::i;:::-;74235:20:::1;74258:21;74235:44;;74292:24;74319:42;74292:69;;74372:17;74392:42;74372:62;;74445:14;74462:42;74445:59;;74515:23;74541:42;74515:68;;74612:16;74604:34;;:92;74679:5;74671:4;74656:12;:19;;;;:::i;:::-;74655:29;;;;:::i;:::-;74604:92;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;74715:9;74707:27;;:85;74775:5;74767:4;74752:12;:19;;;;:::i;:::-;74751:29;;;;:::i;:::-;74707:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;74811:6;74803:24;;:82;74868:5;74860:4;74845:12;:19;;;;:::i;:::-;74844:29;;;;:::i;:::-;74803:82;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;74904:15;74896:33;;:91;74970:5;74962:4;74947:12;:19;;;;:::i;:::-;74946:29;;;;:::i;:::-;74896:91;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;74224:771;;;;;74159:836::o:0;67412:46::-;;;;:::o;72281:67::-;13848:13;:11;:13::i;:::-;72330:10:::1;:8;:10::i;:::-;72281:67::o:0;72023:177::-;13848:13;:11;:13::i;:::-;72128:17:::1;;;;;;;;;;;72127:18;72107:17;;:38;;;;;;;;;;;;;;;;;;72176:16;;;;;;;;;;;72175:17;72156:16;;:36;;;;;;;;;;;;;;;;;;72023:177::o:0;47784:193::-;47930:39;47947:4;47953:2;47957:7;47930:39;;;;;;;;;;;;:16;:39::i;:::-;47784:193;;;:::o;68648:106::-;13848:13;:11;:13::i;:::-;68735:11:::1;68722:10;;:24;;;;;;;;;;;;;;;;;;68648:106:::0;:::o;69344:123::-;13848:13;:11;:13::i;:::-;69446::::1;;69431:12;:28;;;;;;;:::i;:::-;;69344:123:::0;;:::o;11745:86::-;11792:4;11816:7;;;;;;;;;;;11809:14;;11745:86;:::o;36126:152::-;36198:7;36241:27;36260:7;36241:18;:27::i;:::-;36218:52;;36126:152;;;:::o;67465:37::-;;;;:::o;31668:233::-;31740:7;31781:1;31764:19;;:5;:19;;;31760:60;;;31792:28;;;;;;;;;;;;;;31760:60;25827:13;31838:18;:25;31857:5;31838:25;;;;;;;;;;;;;;;;:55;31831:62;;31668:233;;;:::o;14610:103::-;13848:13;:11;:13::i;:::-;14675:30:::1;14702:1;14675:18;:30::i;:::-;14610:103::o:0;67928:29::-;;;;;;;;;;;;;:::o;67661:49::-;;;;;;;;;;;;;;;;;:::o;73937:208::-;13848:13;:11;:13::i;:::-;74075:1:::1;74056:15;:20;;74048:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;74122:15;74105:14;:32;;;;73937:208:::0;:::o;67719:101::-;;;;:::o;67827:25::-;;;;;;;;;;;;;:::o;71455:125::-;13848:13;:11;:13::i;:::-;71556:16:::1;;;;;;;;;;;71555:17;71536:16;;:36;;;;;;;;;;;;;;;;;;71455:125::o:0;67322:34::-;;;;:::o;72210:63::-;13848:13;:11;:13::i;:::-;72257:8:::1;:6;:8::i;:::-;72210:63::o:0;71588:286::-;13848:13;:11;:13::i;:::-;71726:1:::1;71715:8;:12;71707:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;71795:12;;71783:8;71767:13;:11;:13::i;:::-;:24;;;;:::i;:::-;:40;;71759:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;71840:26;71850:5;71857:8;71840:9;:26::i;:::-;71588:286:::0;;:::o;13962:87::-;14008:7;14035:6;;;;;;;;;;;14028:13;;13962:87;:::o;69479:134::-;13848:13;:11;:13::i;:::-;69589:16:::1;;;;;;;;;;;69588:17;69569:16;;:36;;;;;;;;;;;;;;;;;;69479:134::o:0;34909:104::-;34965:13;34998:7;34991:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34909:104;:::o;67363:36::-;;;;:::o;41782:234::-;41929:8;41877:18;:39;41896:19;:17;:19::i;:::-;41877:39;;;;;;;;;;;;;;;:49;41917:8;41877:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;41989:8;41953:55;;41968:19;:17;:19::i;:::-;41953:55;;;41999:8;41953:55;;;;;;:::i;:::-;;;;;;;;41782:234;;:::o;67563:36::-;;;;:::o;73004:236::-;13848:13;:11;:13::i;:::-;73159:1:::1;73134:22;:26;73126:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;73210:22;73189:18;:43;;;;73004:236:::0;:::o;67964:28::-;;;;;;;;;;;;;:::o;48575:407::-;48750:31;48763:4;48769:2;48773:7;48750:12;:31::i;:::-;48814:1;48796:2;:14;;;:19;48792:183;;48835:56;48866:4;48872:2;48876:7;48885:5;48835:30;:56::i;:::-;48830:145;;48919:40;;;;;;;;;;;;;;48830:145;48792:183;48575:407;;;;:::o;67893:28::-;;;;;;;;;;;;;:::o;68762:564::-;68881:13;68920:17;68928:8;68920:7;:17::i;:::-;68912:47;;;;;;;;;;;;:::i;:::-;;;;;;;;;68979:16;;;;;;;;;;;:130;;69086:20;;;;;;;:::i;:::-;;;;;;;;;;;;;69076:31;;;;;;69058:12;69041:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;69031:41;;;;;;:76;;68979:130;;;69022:1;69000:24;;:10;;;;;;;;;;;:24;;;;68979:130;68970:200;;;;;;;;;;;;:::i;:::-;;;;;;;;;69190:16;;;;;;;;;;;:128;;69275:12;69289:19;:8;:17;:19::i;:::-;69258:59;;;;;;;;;:::i;:::-;;;;;;;;;;;;;69190:128;;;69215:10;;;;;;;;;;;69209:29;;;69239:8;69209:39;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;69190:128;69183:135;;68762:564;;;:::o;73491:218::-;13848:13;:11;:13::i;:::-;73635:1:::1;73614:17;:22;;73606:48;;;;;;;;;;;;:::i;:::-;;;;;;;;;73684:17;73665:16;:36;;;;73491:218:::0;:::o;67511:45::-;;;;:::o;73715:214::-;13848:13;:11;:13::i;:::-;73857:1:::1;73837:16;:21;;73829:47;;;;;;;;;;;;:::i;:::-;;;;;;;;;73905:16;73887:15;:34;;;;73715:214:::0;:::o;42173:164::-;42270:4;42294:18;:25;42313:5;42294:25;;;;;;;;;;;;;;;:35;42320:8;42294:35;;;;;;;;;;;;;;;;;;;;;;;;;42287:42;;42173:164;;;;:::o;73246:231::-;13848:13;:11;:13::i;:::-;73398:1:::1;73374:21;:25;73366:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;73448:21;73428:17;:41;;;;73246:231:::0;:::o;71884:131::-;13848:13;:11;:13::i;:::-;71990:17:::1;;;;;;;;;;;71989:18;71969:17;;:38;;;;;;;;;;;;;;;;;;71884:131::o:0;69724:157::-;13848:13;:11;:13::i;:::-;69855:18:::1;69835:17;:38;;;;69724:157:::0;:::o;14868:201::-;13848:13;:11;:13::i;:::-;14977:1:::1;14957:22;;:8;:22;;;;14949:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;15033:28;15052:8;15033:18;:28::i;:::-;14868:201:::0;:::o;69891:749::-;68384:17;;;;;;;;;;;68376:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;68271:10:::1;68258:23;;:9;:23;;;68250:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;70114:18:::2;;70102:8;70076:11;:23;70088:10;70076:23;;;;;;;;;;;;;;;;:34;;;;:::i;:::-;:56;;70068:101;;;;;;;;;;;;:::i;:::-;;;;;;;;;70220:8;70201:16;;:27;;;;:::i;:::-;70188:9;:40;;70180:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;70298:14;;70286:8;70270:13;:11;:13::i;:::-;:24;;;;:::i;:::-;:42;;70262:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;70346:12;70388:10;70371:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;70361:39;;;;;;70346:54;;70434:57;70453:12;;70434:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;70467:17;;70486:4;70434:18;:57::i;:::-;70411:131;;;;;;;;;;;;:::i;:::-;;;;;;;;;70582:8;70555:11;:23;70567:10;70555:23;;;;;;;;;;;;;;;;:35;;;;;;;:::i;:::-;;;;;;;;70601:31;70611:10;70623:8;70601:9;:31::i;:::-;70057:583;69891:749:::0;;;:::o;42595:282::-;42660:4;42716:7;42697:15;:13;:15::i;:::-;:26;;:66;;;;;42750:13;;42740:7;:23;42697:66;:153;;;;;42849:1;26603:8;42801:17;:26;42819:7;42801:26;;;;;;;;;;;;:44;:49;42697:153;42677:173;;42595:282;;;:::o;64903:105::-;64963:7;64990:10;64983:17;;64903:105;:::o;69623:93::-;69680:7;69707:1;69700:8;;69623:93;:::o;37281:1275::-;37348:7;37368:12;37383:7;37368:22;;37451:4;37432:15;:13;:15::i;:::-;:23;37428:1061;;37485:13;;37478:4;:20;37474:1015;;;37523:14;37540:17;:23;37558:4;37540:23;;;;;;;;;;;;37523:40;;37657:1;26603:8;37629:6;:24;:29;37625:845;;;38294:113;38311:1;38301:6;:11;38294:113;;;38354:17;:25;38372:6;;;;;;;38354:25;;;;;;;;;;;;38345:34;;38294:113;;;38440:6;38433:13;;;;;;37625:845;37500:989;37474:1015;37428:1061;38517:31;;;;;;;;;;;;;;37281:1275;;;;:::o;43758:485::-;43860:27;43889:23;43930:38;43971:15;:24;43987:7;43971:24;;;;;;;;;;;43930:65;;44148:18;44125:41;;44205:19;44199:26;44180:45;;44110:126;43758:485;;;:::o;42986:659::-;43135:11;43300:16;43293:5;43289:28;43280:37;;43460:16;43449:9;43445:32;43432:45;;43610:15;43599:9;43596:30;43588:5;43577:9;43574:20;43571:56;43561:66;;42986:659;;;;;:::o;72360:257::-;11350:19;:17;:19::i;:::-;72553:56:::1;72581:4;72587:2;72591:7;72600:8;72553:27;:56::i;:::-;72360:257:::0;;;;:::o;64212:311::-;64347:7;64367:16;27007:3;64393:19;:41;;64367:68;;27007:3;64461:31;64472:4;64478:2;64482:9;64461:10;:31::i;:::-;64453:40;;:62;;64446:69;;;64212:311;;;;;:::o;39104:450::-;39184:14;39352:16;39345:5;39341:28;39332:37;;39529:5;39515:11;39490:23;39486:41;39483:52;39476:5;39473:63;39463:73;;39104:450;;;;:::o;50468:158::-;;;;;:::o;58735:112::-;58812:27;58822:2;58826:8;58812:27;;;;;;;;;;;;:9;:27::i;:::-;58735:112;;:::o;14127:132::-;14202:12;:10;:12::i;:::-;14191:23;;:7;:5;:7::i;:::-;:23;;;14183:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;14127:132::o;12600:120::-;11609:16;:14;:16::i;:::-;12669:5:::1;12659:7;;:15;;;;;;;;;;;;;;;;;;12690:22;12699:12;:10;:12::i;:::-;12690:22;;;;;;:::i;:::-;;;;;;;;12600:120::o:0;15229:191::-;15303:16;15322:6;;;;;;;;;;;15303:25;;15348:8;15339:6;;:17;;;;;;;;;;;;;;;;;;15403:8;15372:40;;15393:8;15372:40;;;;;;;;;;;;15292:128;15229:191;:::o;12341:118::-;11350:19;:17;:19::i;:::-;12411:4:::1;12401:7;;:14;;;;;;;;;;;;;;;;;;12431:20;12438:12;:10;:12::i;:::-;12431:20;;;;;;:::i;:::-;;;;;;;;12341:118::o:0;51066:716::-;51229:4;51275:2;51250:45;;;51296:19;:17;:19::i;:::-;51317:4;51323:7;51332:5;51250:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;51246:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51550:1;51533:6;:13;:18;51529:235;;;51579:40;;;;;;;;;;;;;;51529:235;51722:6;51716:13;51707:6;51703:2;51699:15;51692:38;51246:529;51419:54;;;51409:64;;;:6;:64;;;;51402:71;;;51066:716;;;;;;:::o;7112:723::-;7168:13;7398:1;7389:5;:10;7385:53;;;7416:10;;;;;;;;;;;;;;;;;;;;;7385:53;7448:12;7463:5;7448:20;;7479:14;7504:78;7519:1;7511:4;:9;7504:78;;7537:8;;;;;:::i;:::-;;;;7568:2;7560:10;;;;;:::i;:::-;;;7504:78;;;7592:19;7624:6;7614:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7592:39;;7642:154;7658:1;7649:5;:10;7642:154;;7686:1;7676:11;;;;;:::i;:::-;;;7753:2;7745:5;:10;;;;:::i;:::-;7732:2;:24;;;;:::i;:::-;7719:39;;7702:6;7709;7702:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;7782:2;7773:11;;;;;:::i;:::-;;;7642:154;;;7820:6;7806:21;;;;;7112:723;;;;:::o;1639:190::-;1764:4;1817;1788:25;1801:5;1808:4;1788:12;:25::i;:::-;:33;1781:40;;1639:190;;;;;:::o;11904:108::-;11975:8;:6;:8::i;:::-;11974:9;11966:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;11904:108::o;49644:159::-;;;;;:::o;63913:147::-;64050:6;63913:147;;;;;:::o;57962:689::-;58093:19;58099:2;58103:8;58093:5;:19::i;:::-;58172:1;58154:2;:14;;;:19;58150:483;;58194:11;58208:13;;58194:27;;58240:13;58262:8;58256:3;:14;58240:30;;58289:233;58320:62;58359:1;58363:2;58367:7;;;;;;58376:5;58320:30;:62::i;:::-;58315:167;;58418:40;;;;;;;;;;;;;;58315:167;58517:3;58509:5;:11;58289:233;;58604:3;58587:13;;:20;58583:34;;58609:8;;;58583:34;58175:458;;58150:483;57962:689;;;:::o;9858:98::-;9911:7;9938:10;9931:17;;9858:98;:::o;12089:108::-;12156:8;:6;:8::i;:::-;12148:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;12089:108::o;2506:296::-;2589:7;2609:20;2632:4;2609:27;;2652:9;2647:118;2671:5;:12;2667:1;:16;2647:118;;;2720:33;2730:12;2744:5;2750:1;2744:8;;;;;;;;:::i;:::-;;;;;;;;2720:9;:33::i;:::-;2705:48;;2685:3;;;;;:::i;:::-;;;;2647:118;;;;2782:12;2775:19;;;2506:296;;;;:::o;52244:2966::-;52317:20;52340:13;;52317:36;;52380:1;52368:8;:13;52364:44;;;52390:18;;;;;;;;;;;;;;52364:44;52421:61;52451:1;52455:2;52459:12;52473:8;52421:21;:61::i;:::-;52965:1;25965:2;52935:1;:26;;52934:32;52922:8;:45;52896:18;:22;52915:2;52896:22;;;;;;;;;;;;;;;;:71;;;;;;;;;;;53244:139;53281:2;53335:33;53358:1;53362:2;53366:1;53335:14;:33::i;:::-;53302:30;53323:8;53302:20;:30::i;:::-;:66;53244:18;:139::i;:::-;53210:17;:31;53228:12;53210:31;;;;;;;;;;;:173;;;;53400:16;53431:11;53460:8;53445:12;:23;53431:37;;53981:16;53977:2;53973:25;53961:37;;54353:12;54313:8;54272:1;54210:25;54151:1;54090;54063:335;54724:1;54710:12;54706:20;54664:346;54765:3;54756:7;54753:16;54664:346;;54983:7;54973:8;54970:1;54943:25;54940:1;54937;54932:59;54818:1;54809:7;54805:15;54794:26;;54664:346;;;54668:77;55055:1;55043:8;:13;55039:45;;;55065:19;;;;;;;;;;;;;;55039:45;55117:3;55101:13;:19;;;;52670:2462;;55142:60;55171:1;55175:2;55179:12;55193:8;55142:20;:60::i;:::-;52306:2904;52244:2966;;:::o;6252:149::-;6315:7;6346:1;6342;:5;:51;;6373:20;6388:1;6391;6373:14;:20::i;:::-;6342:51;;;6350:20;6365:1;6368;6350:14;:20::i;:::-;6342:51;6335:58;;6252:149;;;;:::o;39656:324::-;39726:14;39959:1;39949:8;39946:15;39920:24;39916:46;39906:56;;39656:324;;;:::o;6409:268::-;6477:13;6584:1;6578:4;6571:15;6613:1;6607:4;6600:15;6654:4;6648;6638:21;6629:30;;6409:268;;;;:::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:421::-;512:5;537:66;553:49;595:6;553:49;:::i;:::-;537:66;:::i;:::-;528:75;;626:6;619:5;612:21;664:4;657:5;653:16;702:3;693:6;688:3;684:16;681:25;678:112;;;709:79;;:::i;:::-;678:112;799:39;831:6;826:3;821;799:39;:::i;:::-;518:326;423:421;;;;;:::o;850:139::-;896:5;934:6;921:20;912:29;;950:33;977:5;950:33;:::i;:::-;850:139;;;;:::o;1012:568::-;1085:8;1095:6;1145:3;1138:4;1130:6;1126:17;1122:27;1112:122;;1153:79;;:::i;:::-;1112:122;1266:6;1253:20;1243:30;;1296:18;1288:6;1285:30;1282:117;;;1318:79;;:::i;:::-;1282:117;1432:4;1424:6;1420:17;1408:29;;1486:3;1478:4;1470:6;1466:17;1456:8;1452:32;1449:41;1446:128;;;1493:79;;:::i;:::-;1446:128;1012:568;;;;;:::o;1586:133::-;1629:5;1667:6;1654:20;1645:29;;1683:30;1707:5;1683:30;:::i;:::-;1586:133;;;;:::o;1725:139::-;1771:5;1809:6;1796:20;1787:29;;1825:33;1852:5;1825:33;:::i;:::-;1725:139;;;;:::o;1870:137::-;1915:5;1953:6;1940:20;1931:29;;1969:32;1995:5;1969:32;:::i;:::-;1870:137;;;;:::o;2013:141::-;2069:5;2100:6;2094:13;2085:22;;2116:32;2142:5;2116:32;:::i;:::-;2013:141;;;;:::o;2173:338::-;2228:5;2277:3;2270:4;2262:6;2258:17;2254:27;2244:122;;2285:79;;:::i;:::-;2244:122;2402:6;2389:20;2427:78;2501:3;2493:6;2486:4;2478:6;2474:17;2427:78;:::i;:::-;2418:87;;2234:277;2173:338;;;;:::o;2531:553::-;2589:8;2599:6;2649:3;2642:4;2634:6;2630:17;2626:27;2616:122;;2657:79;;:::i;:::-;2616:122;2770:6;2757:20;2747:30;;2800:18;2792:6;2789:30;2786:117;;;2822:79;;:::i;:::-;2786:117;2936:4;2928:6;2924:17;2912:29;;2990:3;2982:4;2974:6;2970:17;2960:8;2956:32;2953:41;2950:128;;;2997:79;;:::i;:::-;2950:128;2531:553;;;;;:::o;3104:355::-;3171:5;3220:3;3213:4;3205:6;3201:17;3197:27;3187:122;;3228:79;;:::i;:::-;3187:122;3338:6;3332:13;3363:90;3449:3;3441:6;3434:4;3426:6;3422:17;3363:90;:::i;:::-;3354:99;;3177:282;3104:355;;;;:::o;3465:139::-;3511:5;3549:6;3536:20;3527:29;;3565:33;3592:5;3565:33;:::i;:::-;3465:139;;;;:::o;3610:329::-;3669:6;3718:2;3706:9;3697:7;3693:23;3689:32;3686:119;;;3724:79;;:::i;:::-;3686:119;3844:1;3869:53;3914:7;3905:6;3894:9;3890:22;3869:53;:::i;:::-;3859:63;;3815:117;3610:329;;;;:::o;3945:474::-;4013:6;4021;4070:2;4058:9;4049:7;4045:23;4041:32;4038:119;;;4076:79;;:::i;:::-;4038:119;4196:1;4221:53;4266:7;4257:6;4246:9;4242:22;4221:53;:::i;:::-;4211:63;;4167:117;4323:2;4349:53;4394:7;4385:6;4374:9;4370:22;4349:53;:::i;:::-;4339:63;;4294:118;3945:474;;;;;:::o;4425:619::-;4502:6;4510;4518;4567:2;4555:9;4546:7;4542:23;4538:32;4535:119;;;4573:79;;:::i;:::-;4535:119;4693:1;4718:53;4763:7;4754:6;4743:9;4739:22;4718:53;:::i;:::-;4708:63;;4664:117;4820:2;4846:53;4891:7;4882:6;4871:9;4867:22;4846:53;:::i;:::-;4836:63;;4791:118;4948:2;4974:53;5019:7;5010:6;4999:9;4995:22;4974:53;:::i;:::-;4964:63;;4919:118;4425:619;;;;;:::o;5050:943::-;5145:6;5153;5161;5169;5218:3;5206:9;5197:7;5193:23;5189:33;5186:120;;;5225:79;;:::i;:::-;5186:120;5345:1;5370:53;5415:7;5406:6;5395:9;5391:22;5370:53;:::i;:::-;5360:63;;5316:117;5472:2;5498:53;5543:7;5534:6;5523:9;5519:22;5498:53;:::i;:::-;5488:63;;5443:118;5600:2;5626:53;5671:7;5662:6;5651:9;5647:22;5626:53;:::i;:::-;5616:63;;5571:118;5756:2;5745:9;5741:18;5728:32;5787:18;5779:6;5776:30;5773:117;;;5809:79;;:::i;:::-;5773:117;5914:62;5968:7;5959:6;5948:9;5944:22;5914:62;:::i;:::-;5904:72;;5699:287;5050:943;;;;;;;:::o;5999:468::-;6064:6;6072;6121:2;6109:9;6100:7;6096:23;6092:32;6089:119;;;6127:79;;:::i;:::-;6089:119;6247:1;6272:53;6317:7;6308:6;6297:9;6293:22;6272:53;:::i;:::-;6262:63;;6218:117;6374:2;6400:50;6442:7;6433:6;6422:9;6418:22;6400:50;:::i;:::-;6390:60;;6345:115;5999:468;;;;;:::o;6473:474::-;6541:6;6549;6598:2;6586:9;6577:7;6573:23;6569:32;6566:119;;;6604:79;;:::i;:::-;6566:119;6724:1;6749:53;6794:7;6785:6;6774:9;6770:22;6749:53;:::i;:::-;6739:63;;6695:117;6851:2;6877:53;6922:7;6913:6;6902:9;6898:22;6877:53;:::i;:::-;6867:63;;6822:118;6473:474;;;;;:::o;6953:704::-;7048:6;7056;7064;7113:2;7101:9;7092:7;7088:23;7084:32;7081:119;;;7119:79;;:::i;:::-;7081:119;7267:1;7256:9;7252:17;7239:31;7297:18;7289:6;7286:30;7283:117;;;7319:79;;:::i;:::-;7283:117;7432:80;7504:7;7495:6;7484:9;7480:22;7432:80;:::i;:::-;7414:98;;;;7210:312;7561:2;7587:53;7632:7;7623:6;7612:9;7608:22;7587:53;:::i;:::-;7577:63;;7532:118;6953:704;;;;;:::o;7663:329::-;7722:6;7771:2;7759:9;7750:7;7746:23;7742:32;7739:119;;;7777:79;;:::i;:::-;7739:119;7897:1;7922:53;7967:7;7958:6;7947:9;7943:22;7922:53;:::i;:::-;7912:63;;7868:117;7663:329;;;;:::o;7998:327::-;8056:6;8105:2;8093:9;8084:7;8080:23;8076:32;8073:119;;;8111:79;;:::i;:::-;8073:119;8231:1;8256:52;8300:7;8291:6;8280:9;8276:22;8256:52;:::i;:::-;8246:62;;8202:116;7998:327;;;;:::o;8331:349::-;8400:6;8449:2;8437:9;8428:7;8424:23;8420:32;8417:119;;;8455:79;;:::i;:::-;8417:119;8575:1;8600:63;8655:7;8646:6;8635:9;8631:22;8600:63;:::i;:::-;8590:73;;8546:127;8331:349;;;;:::o;8686:529::-;8757:6;8765;8814:2;8802:9;8793:7;8789:23;8785:32;8782:119;;;8820:79;;:::i;:::-;8782:119;8968:1;8957:9;8953:17;8940:31;8998:18;8990:6;8987:30;8984:117;;;9020:79;;:::i;:::-;8984:117;9133:65;9190:7;9181:6;9170:9;9166:22;9133:65;:::i;:::-;9115:83;;;;8911:297;8686:529;;;;;:::o;9221:524::-;9301:6;9350:2;9338:9;9329:7;9325:23;9321:32;9318:119;;;9356:79;;:::i;:::-;9318:119;9497:1;9486:9;9482:17;9476:24;9527:18;9519:6;9516:30;9513:117;;;9549:79;;:::i;:::-;9513:117;9654:74;9720:7;9711:6;9700:9;9696:22;9654:74;:::i;:::-;9644:84;;9447:291;9221:524;;;;:::o;9751:329::-;9810:6;9859:2;9847:9;9838:7;9834:23;9830:32;9827:119;;;9865:79;;:::i;:::-;9827:119;9985:1;10010:53;10055:7;10046:6;10035:9;10031:22;10010:53;:::i;:::-;10000:63;;9956:117;9751:329;;;;:::o;10086:118::-;10173:24;10191:5;10173:24;:::i;:::-;10168:3;10161:37;10086:118;;:::o;10210:157::-;10315:45;10335:24;10353:5;10335:24;:::i;:::-;10315:45;:::i;:::-;10310:3;10303:58;10210:157;;:::o;10373:109::-;10454:21;10469:5;10454:21;:::i;:::-;10449:3;10442:34;10373:109;;:::o;10488:118::-;10575:24;10593:5;10575:24;:::i;:::-;10570:3;10563:37;10488:118;;:::o;10612:360::-;10698:3;10726:38;10758:5;10726:38;:::i;:::-;10780:70;10843:6;10838:3;10780:70;:::i;:::-;10773:77;;10859:52;10904:6;10899:3;10892:4;10885:5;10881:16;10859:52;:::i;:::-;10936:29;10958:6;10936:29;:::i;:::-;10931:3;10927:39;10920:46;;10702:270;10612:360;;;;:::o;10978:364::-;11066:3;11094:39;11127:5;11094:39;:::i;:::-;11149:71;11213:6;11208:3;11149:71;:::i;:::-;11142:78;;11229:52;11274:6;11269:3;11262:4;11255:5;11251:16;11229:52;:::i;:::-;11306:29;11328:6;11306:29;:::i;:::-;11301:3;11297:39;11290:46;;11070:272;10978:364;;;;:::o;11348:377::-;11454:3;11482:39;11515:5;11482:39;:::i;:::-;11537:89;11619:6;11614:3;11537:89;:::i;:::-;11530:96;;11635:52;11680:6;11675:3;11668:4;11661:5;11657:16;11635:52;:::i;:::-;11712:6;11707:3;11703:16;11696:23;;11458:267;11348:377;;;;:::o;11755:845::-;11858:3;11895:5;11889:12;11924:36;11950:9;11924:36;:::i;:::-;11976:89;12058:6;12053:3;11976:89;:::i;:::-;11969:96;;12096:1;12085:9;12081:17;12112:1;12107:137;;;;12258:1;12253:341;;;;12074:520;;12107:137;12191:4;12187:9;12176;12172:25;12167:3;12160:38;12227:6;12222:3;12218:16;12211:23;;12107:137;;12253:341;12320:38;12352:5;12320:38;:::i;:::-;12380:1;12394:154;12408:6;12405:1;12402:13;12394:154;;;12482:7;12476:14;12472:1;12467:3;12463:11;12456:35;12532:1;12523:7;12519:15;12508:26;;12430:4;12427:1;12423:12;12418:17;;12394:154;;;12577:6;12572:3;12568:16;12561:23;;12260:334;;12074:520;;11862:738;;11755:845;;;;:::o;12606:366::-;12748:3;12769:67;12833:2;12828:3;12769:67;:::i;:::-;12762:74;;12845:93;12934:3;12845:93;:::i;:::-;12963:2;12958:3;12954:12;12947:19;;12606:366;;;:::o;12978:::-;13120:3;13141:67;13205:2;13200:3;13141:67;:::i;:::-;13134:74;;13217:93;13306:3;13217:93;:::i;:::-;13335:2;13330:3;13326:12;13319:19;;12978:366;;;:::o;13350:::-;13492:3;13513:67;13577:2;13572:3;13513:67;:::i;:::-;13506:74;;13589:93;13678:3;13589:93;:::i;:::-;13707:2;13702:3;13698:12;13691:19;;13350:366;;;:::o;13722:::-;13864:3;13885:67;13949:2;13944:3;13885:67;:::i;:::-;13878:74;;13961:93;14050:3;13961:93;:::i;:::-;14079:2;14074:3;14070:12;14063:19;;13722:366;;;:::o;14094:::-;14236:3;14257:67;14321:2;14316:3;14257:67;:::i;:::-;14250:74;;14333:93;14422:3;14333:93;:::i;:::-;14451:2;14446:3;14442:12;14435:19;;14094:366;;;:::o;14466:::-;14608:3;14629:67;14693:2;14688:3;14629:67;:::i;:::-;14622:74;;14705:93;14794:3;14705:93;:::i;:::-;14823:2;14818:3;14814:12;14807:19;;14466:366;;;:::o;14838:::-;14980:3;15001:67;15065:2;15060:3;15001:67;:::i;:::-;14994:74;;15077:93;15166:3;15077:93;:::i;:::-;15195:2;15190:3;15186:12;15179:19;;14838:366;;;:::o;15210:::-;15352:3;15373:67;15437:2;15432:3;15373:67;:::i;:::-;15366:74;;15449:93;15538:3;15449:93;:::i;:::-;15567:2;15562:3;15558:12;15551:19;;15210:366;;;:::o;15582:::-;15724:3;15745:67;15809:2;15804:3;15745:67;:::i;:::-;15738:74;;15821:93;15910:3;15821:93;:::i;:::-;15939:2;15934:3;15930:12;15923:19;;15582:366;;;:::o;15954:::-;16096:3;16117:67;16181:2;16176:3;16117:67;:::i;:::-;16110:74;;16193:93;16282:3;16193:93;:::i;:::-;16311:2;16306:3;16302:12;16295:19;;15954:366;;;:::o;16326:::-;16468:3;16489:67;16553:2;16548:3;16489:67;:::i;:::-;16482:74;;16565:93;16654:3;16565:93;:::i;:::-;16683:2;16678:3;16674:12;16667:19;;16326:366;;;:::o;16698:::-;16840:3;16861:67;16925:2;16920:3;16861:67;:::i;:::-;16854:74;;16937:93;17026:3;16937:93;:::i;:::-;17055:2;17050:3;17046:12;17039:19;;16698:366;;;:::o;17070:400::-;17230:3;17251:84;17333:1;17328:3;17251:84;:::i;:::-;17244:91;;17344:93;17433:3;17344:93;:::i;:::-;17462:1;17457:3;17453:11;17446:18;;17070:400;;;:::o;17476:366::-;17618:3;17639:67;17703:2;17698:3;17639:67;:::i;:::-;17632:74;;17715:93;17804:3;17715:93;:::i;:::-;17833:2;17828:3;17824:12;17817:19;;17476:366;;;:::o;17848:::-;17990:3;18011:67;18075:2;18070:3;18011:67;:::i;:::-;18004:74;;18087:93;18176:3;18087:93;:::i;:::-;18205:2;18200:3;18196:12;18189:19;;17848:366;;;:::o;18220:::-;18362:3;18383:67;18447:2;18442:3;18383:67;:::i;:::-;18376:74;;18459:93;18548:3;18459:93;:::i;:::-;18577:2;18572:3;18568:12;18561:19;;18220:366;;;:::o;18592:::-;18734:3;18755:67;18819:2;18814:3;18755:67;:::i;:::-;18748:74;;18831:93;18920:3;18831:93;:::i;:::-;18949:2;18944:3;18940:12;18933:19;;18592:366;;;:::o;18964:::-;19106:3;19127:67;19191:2;19186:3;19127:67;:::i;:::-;19120:74;;19203:93;19292:3;19203:93;:::i;:::-;19321:2;19316:3;19312:12;19305:19;;18964:366;;;:::o;19336:::-;19478:3;19499:67;19563:2;19558:3;19499:67;:::i;:::-;19492:74;;19575:93;19664:3;19575:93;:::i;:::-;19693:2;19688:3;19684:12;19677:19;;19336:366;;;:::o;19708:400::-;19868:3;19889:84;19971:1;19966:3;19889:84;:::i;:::-;19882:91;;19982:93;20071:3;19982:93;:::i;:::-;20100:1;20095:3;20091:11;20084:18;;19708:400;;;:::o;20114:366::-;20256:3;20277:67;20341:2;20336:3;20277:67;:::i;:::-;20270:74;;20353:93;20442:3;20353:93;:::i;:::-;20471:2;20466:3;20462:12;20455:19;;20114:366;;;:::o;20486:::-;20628:3;20649:67;20713:2;20708:3;20649:67;:::i;:::-;20642:74;;20725:93;20814:3;20725:93;:::i;:::-;20843:2;20838:3;20834:12;20827:19;;20486:366;;;:::o;20858:118::-;20945:24;20963:5;20945:24;:::i;:::-;20940:3;20933:37;20858:118;;:::o;20982:256::-;21094:3;21109:75;21180:3;21171:6;21109:75;:::i;:::-;21209:2;21204:3;21200:12;21193:19;;21229:3;21222:10;;20982:256;;;;:::o;21244:269::-;21373:3;21395:92;21483:3;21474:6;21395:92;:::i;:::-;21388:99;;21504:3;21497:10;;21244:269;;;;:::o;21519:695::-;21797:3;21819:92;21907:3;21898:6;21819:92;:::i;:::-;21812:99;;21928:95;22019:3;22010:6;21928:95;:::i;:::-;21921:102;;22040:148;22184:3;22040:148;:::i;:::-;22033:155;;22205:3;22198:10;;21519:695;;;;;:::o;22220:381::-;22405:3;22427:148;22571:3;22427:148;:::i;:::-;22420:155;;22592:3;22585:10;;22220:381;;;:::o;22607:222::-;22700:4;22738:2;22727:9;22723:18;22715:26;;22751:71;22819:1;22808:9;22804:17;22795:6;22751:71;:::i;:::-;22607:222;;;;:::o;22835:640::-;23030:4;23068:3;23057:9;23053:19;23045:27;;23082:71;23150:1;23139:9;23135:17;23126:6;23082:71;:::i;:::-;23163:72;23231:2;23220:9;23216:18;23207:6;23163:72;:::i;:::-;23245;23313:2;23302:9;23298:18;23289:6;23245:72;:::i;:::-;23364:9;23358:4;23354:20;23349:2;23338:9;23334:18;23327:48;23392:76;23463:4;23454:6;23392:76;:::i;:::-;23384:84;;22835:640;;;;;;;:::o;23481:210::-;23568:4;23606:2;23595:9;23591:18;23583:26;;23619:65;23681:1;23670:9;23666:17;23657:6;23619:65;:::i;:::-;23481:210;;;;:::o;23697:222::-;23790:4;23828:2;23817:9;23813:18;23805:26;;23841:71;23909:1;23898:9;23894:17;23885:6;23841:71;:::i;:::-;23697:222;;;;:::o;23925:313::-;24038:4;24076:2;24065:9;24061:18;24053:26;;24125:9;24119:4;24115:20;24111:1;24100:9;24096:17;24089:47;24153:78;24226:4;24217:6;24153:78;:::i;:::-;24145:86;;23925:313;;;;:::o;24244:419::-;24410:4;24448:2;24437:9;24433:18;24425:26;;24497:9;24491:4;24487:20;24483:1;24472:9;24468:17;24461:47;24525:131;24651:4;24525:131;:::i;:::-;24517:139;;24244:419;;;:::o;24669:::-;24835:4;24873:2;24862:9;24858:18;24850:26;;24922:9;24916:4;24912:20;24908:1;24897:9;24893:17;24886:47;24950:131;25076:4;24950:131;:::i;:::-;24942:139;;24669:419;;;:::o;25094:::-;25260:4;25298:2;25287:9;25283:18;25275:26;;25347:9;25341:4;25337:20;25333:1;25322:9;25318:17;25311:47;25375:131;25501:4;25375:131;:::i;:::-;25367:139;;25094:419;;;:::o;25519:::-;25685:4;25723:2;25712:9;25708:18;25700:26;;25772:9;25766:4;25762:20;25758:1;25747:9;25743:17;25736:47;25800:131;25926:4;25800:131;:::i;:::-;25792:139;;25519:419;;;:::o;25944:::-;26110:4;26148:2;26137:9;26133:18;26125:26;;26197:9;26191:4;26187:20;26183:1;26172:9;26168:17;26161:47;26225:131;26351:4;26225:131;:::i;:::-;26217:139;;25944:419;;;:::o;26369:::-;26535:4;26573:2;26562:9;26558:18;26550:26;;26622:9;26616:4;26612:20;26608:1;26597:9;26593:17;26586:47;26650:131;26776:4;26650:131;:::i;:::-;26642:139;;26369:419;;;:::o;26794:::-;26960:4;26998:2;26987:9;26983:18;26975:26;;27047:9;27041:4;27037:20;27033:1;27022:9;27018:17;27011:47;27075:131;27201:4;27075:131;:::i;:::-;27067:139;;26794:419;;;:::o;27219:::-;27385:4;27423:2;27412:9;27408:18;27400:26;;27472:9;27466:4;27462:20;27458:1;27447:9;27443:17;27436:47;27500:131;27626:4;27500:131;:::i;:::-;27492:139;;27219:419;;;:::o;27644:::-;27810:4;27848:2;27837:9;27833:18;27825:26;;27897:9;27891:4;27887:20;27883:1;27872:9;27868:17;27861:47;27925:131;28051:4;27925:131;:::i;:::-;27917:139;;27644:419;;;:::o;28069:::-;28235:4;28273:2;28262:9;28258:18;28250:26;;28322:9;28316:4;28312:20;28308:1;28297:9;28293:17;28286:47;28350:131;28476:4;28350:131;:::i;:::-;28342:139;;28069:419;;;:::o;28494:::-;28660:4;28698:2;28687:9;28683:18;28675:26;;28747:9;28741:4;28737:20;28733:1;28722:9;28718:17;28711:47;28775:131;28901:4;28775:131;:::i;:::-;28767:139;;28494:419;;;:::o;28919:::-;29085:4;29123:2;29112:9;29108:18;29100:26;;29172:9;29166:4;29162:20;29158:1;29147:9;29143:17;29136:47;29200:131;29326:4;29200:131;:::i;:::-;29192:139;;28919:419;;;:::o;29344:::-;29510:4;29548:2;29537:9;29533:18;29525:26;;29597:9;29591:4;29587:20;29583:1;29572:9;29568:17;29561:47;29625:131;29751:4;29625:131;:::i;:::-;29617:139;;29344:419;;;:::o;29769:::-;29935:4;29973:2;29962:9;29958:18;29950:26;;30022:9;30016:4;30012:20;30008:1;29997:9;29993:17;29986:47;30050:131;30176:4;30050:131;:::i;:::-;30042:139;;29769:419;;;:::o;30194:::-;30360:4;30398:2;30387:9;30383:18;30375:26;;30447:9;30441:4;30437:20;30433:1;30422:9;30418:17;30411:47;30475:131;30601:4;30475:131;:::i;:::-;30467:139;;30194:419;;;:::o;30619:::-;30785:4;30823:2;30812:9;30808:18;30800:26;;30872:9;30866:4;30862:20;30858:1;30847:9;30843:17;30836:47;30900:131;31026:4;30900:131;:::i;:::-;30892:139;;30619:419;;;:::o;31044:::-;31210:4;31248:2;31237:9;31233:18;31225:26;;31297:9;31291:4;31287:20;31283:1;31272:9;31268:17;31261:47;31325:131;31451:4;31325:131;:::i;:::-;31317:139;;31044:419;;;:::o;31469:::-;31635:4;31673:2;31662:9;31658:18;31650:26;;31722:9;31716:4;31712:20;31708:1;31697:9;31693:17;31686:47;31750:131;31876:4;31750:131;:::i;:::-;31742:139;;31469:419;;;:::o;31894:::-;32060:4;32098:2;32087:9;32083:18;32075:26;;32147:9;32141:4;32137:20;32133:1;32122:9;32118:17;32111:47;32175:131;32301:4;32175:131;:::i;:::-;32167:139;;31894:419;;;:::o;32319:::-;32485:4;32523:2;32512:9;32508:18;32500:26;;32572:9;32566:4;32562:20;32558:1;32547:9;32543:17;32536:47;32600:131;32726:4;32600:131;:::i;:::-;32592:139;;32319:419;;;:::o;32744:222::-;32837:4;32875:2;32864:9;32860:18;32852:26;;32888:71;32956:1;32945:9;32941:17;32932:6;32888:71;:::i;:::-;32744:222;;;;:::o;32972:129::-;33006:6;33033:20;;:::i;:::-;33023:30;;33062:33;33090:4;33082:6;33062:33;:::i;:::-;32972:129;;;:::o;33107:75::-;33140:6;33173:2;33167:9;33157:19;;33107:75;:::o;33188:307::-;33249:4;33339:18;33331:6;33328:30;33325:56;;;33361:18;;:::i;:::-;33325:56;33399:29;33421:6;33399:29;:::i;:::-;33391:37;;33483:4;33477;33473:15;33465:23;;33188:307;;;:::o;33501:308::-;33563:4;33653:18;33645:6;33642:30;33639:56;;;33675:18;;:::i;:::-;33639:56;33713:29;33735:6;33713:29;:::i;:::-;33705:37;;33797:4;33791;33787:15;33779:23;;33501:308;;;:::o;33815:141::-;33864:4;33887:3;33879:11;;33910:3;33907:1;33900:14;33944:4;33941:1;33931:18;33923:26;;33815:141;;;:::o;33962:98::-;34013:6;34047:5;34041:12;34031:22;;33962:98;;;:::o;34066:99::-;34118:6;34152:5;34146:12;34136:22;;34066:99;;;:::o;34171:168::-;34254:11;34288:6;34283:3;34276:19;34328:4;34323:3;34319:14;34304:29;;34171:168;;;;:::o;34345:169::-;34429:11;34463:6;34458:3;34451:19;34503:4;34498:3;34494:14;34479:29;;34345:169;;;;:::o;34520:148::-;34622:11;34659:3;34644:18;;34520:148;;;;:::o;34674:305::-;34714:3;34733:20;34751:1;34733:20;:::i;:::-;34728:25;;34767:20;34785:1;34767:20;:::i;:::-;34762:25;;34921:1;34853:66;34849:74;34846:1;34843:81;34840:107;;;34927:18;;:::i;:::-;34840:107;34971:1;34968;34964:9;34957:16;;34674:305;;;;:::o;34985:185::-;35025:1;35042:20;35060:1;35042:20;:::i;:::-;35037:25;;35076:20;35094:1;35076:20;:::i;:::-;35071:25;;35115:1;35105:35;;35120:18;;:::i;:::-;35105:35;35162:1;35159;35155:9;35150:14;;34985:185;;;;:::o;35176:348::-;35216:7;35239:20;35257:1;35239:20;:::i;:::-;35234:25;;35273:20;35291:1;35273:20;:::i;:::-;35268:25;;35461:1;35393:66;35389:74;35386:1;35383:81;35378:1;35371:9;35364:17;35360:105;35357:131;;;35468:18;;:::i;:::-;35357:131;35516:1;35513;35509:9;35498:20;;35176:348;;;;:::o;35530:191::-;35570:4;35590:20;35608:1;35590:20;:::i;:::-;35585:25;;35624:20;35642:1;35624:20;:::i;:::-;35619:25;;35663:1;35660;35657:8;35654:34;;;35668:18;;:::i;:::-;35654:34;35713:1;35710;35706:9;35698:17;;35530:191;;;;:::o;35727:96::-;35764:7;35793:24;35811:5;35793:24;:::i;:::-;35782:35;;35727:96;;;:::o;35829:90::-;35863:7;35906:5;35899:13;35892:21;35881:32;;35829:90;;;:::o;35925:77::-;35962:7;35991:5;35980:16;;35925:77;;;:::o;36008:149::-;36044:7;36084:66;36077:5;36073:78;36062:89;;36008:149;;;:::o;36163:126::-;36200:7;36240:42;36233:5;36229:54;36218:65;;36163:126;;;:::o;36295:77::-;36332:7;36361:5;36350:16;;36295:77;;;:::o;36378:154::-;36462:6;36457:3;36452;36439:30;36524:1;36515:6;36510:3;36506:16;36499:27;36378:154;;;:::o;36538:307::-;36606:1;36616:113;36630:6;36627:1;36624:13;36616:113;;;36715:1;36710:3;36706:11;36700:18;36696:1;36691:3;36687:11;36680:39;36652:2;36649:1;36645:10;36640:15;;36616:113;;;36747:6;36744:1;36741:13;36738:101;;;36827:1;36818:6;36813:3;36809:16;36802:27;36738:101;36587:258;36538:307;;;:::o;36851:320::-;36895:6;36932:1;36926:4;36922:12;36912:22;;36979:1;36973:4;36969:12;37000:18;36990:81;;37056:4;37048:6;37044:17;37034:27;;36990:81;37118:2;37110:6;37107:14;37087:18;37084:38;37081:84;;;37137:18;;:::i;:::-;37081:84;36902:269;36851:320;;;:::o;37177:281::-;37260:27;37282:4;37260:27;:::i;:::-;37252:6;37248:40;37390:6;37378:10;37375:22;37354:18;37342:10;37339:34;37336:62;37333:88;;;37401:18;;:::i;:::-;37333:88;37441:10;37437:2;37430:22;37220:238;37177:281;;:::o;37464:233::-;37503:3;37526:24;37544:5;37526:24;:::i;:::-;37517:33;;37572:66;37565:5;37562:77;37559:103;;;37642:18;;:::i;:::-;37559:103;37689:1;37682:5;37678:13;37671:20;;37464:233;;;:::o;37703:100::-;37742:7;37771:26;37791:5;37771:26;:::i;:::-;37760:37;;37703:100;;;:::o;37809:94::-;37848:7;37877:20;37891:5;37877:20;:::i;:::-;37866:31;;37809:94;;;:::o;37909:176::-;37941:1;37958:20;37976:1;37958:20;:::i;:::-;37953:25;;37992:20;38010:1;37992:20;:::i;:::-;37987:25;;38031:1;38021:35;;38036:18;;:::i;:::-;38021:35;38077:1;38074;38070:9;38065:14;;37909:176;;;;:::o;38091:180::-;38139:77;38136:1;38129:88;38236:4;38233:1;38226:15;38260:4;38257:1;38250:15;38277:180;38325:77;38322:1;38315:88;38422:4;38419:1;38412:15;38446:4;38443:1;38436:15;38463:180;38511:77;38508:1;38501:88;38608:4;38605:1;38598:15;38632:4;38629:1;38622:15;38649:180;38697:77;38694:1;38687:88;38794:4;38791:1;38784:15;38818:4;38815:1;38808:15;38835:180;38883:77;38880:1;38873:88;38980:4;38977:1;38970:15;39004:4;39001:1;38994:15;39021:117;39130:1;39127;39120:12;39144:117;39253:1;39250;39243:12;39267:117;39376:1;39373;39366:12;39390:117;39499:1;39496;39489:12;39513:117;39622:1;39619;39612:12;39636:117;39745:1;39742;39735:12;39759:102;39800:6;39851:2;39847:7;39842:2;39835:5;39831:14;39827:28;39817:38;;39759:102;;;:::o;39867:94::-;39900:8;39948:5;39944:2;39940:14;39919:35;;39867:94;;;:::o;39967:178::-;40107:30;40103:1;40095:6;40091:14;40084:54;39967:178;:::o;40151:171::-;40291:23;40287:1;40279:6;40275:14;40268:47;40151:171;:::o;40328:170::-;40468:22;40464:1;40456:6;40452:14;40445:46;40328:170;:::o;40504:165::-;40644:17;40640:1;40632:6;40628:14;40621:41;40504:165;:::o;40675:225::-;40815:34;40811:1;40803:6;40799:14;40792:58;40884:8;40879:2;40871:6;40867:15;40860:33;40675:225;:::o;40906:179::-;41046:31;41042:1;41034:6;41030:14;41023:55;40906:179;:::o;41091:168::-;41231:20;41227:1;41219:6;41215:14;41208:44;41091:168;:::o;41265:166::-;41405:18;41401:1;41393:6;41389:14;41382:42;41265:166;:::o;41437:167::-;41577:19;41573:1;41565:6;41561:14;41554:43;41437:167;:::o;41610:166::-;41750:18;41746:1;41738:6;41734:14;41727:42;41610:166;:::o;41782:163::-;41922:15;41918:1;41910:6;41906:14;41899:39;41782:163;:::o;41951:182::-;42091:34;42087:1;42079:6;42075:14;42068:58;41951:182;:::o;42139:155::-;42279:7;42275:1;42267:6;42263:14;42256:31;42139:155;:::o;42300:182::-;42440:34;42436:1;42428:6;42424:14;42417:58;42300:182;:::o;42488:220::-;42628:34;42624:1;42616:6;42612:14;42605:58;42697:3;42692:2;42684:6;42680:15;42673:28;42488:220;:::o;42714:163::-;42854:15;42850:1;42842:6;42838:14;42831:39;42714:163;:::o;42883:168::-;43023:20;43019:1;43011:6;43007:14;43000:44;42883:168;:::o;43057:182::-;43197:34;43193:1;43185:6;43181:14;43174:58;43057:182;:::o;43245:169::-;43385:21;43381:1;43373:6;43369:14;43362:45;43245:169;:::o;43420:114::-;;:::o;43540:174::-;43680:26;43676:1;43668:6;43664:14;43657:50;43540:174;:::o;43720:163::-;43860:15;43856:1;43848:6;43844:14;43837:39;43720:163;:::o;43889:122::-;43962:24;43980:5;43962:24;:::i;:::-;43955:5;43952:35;43942:63;;44001:1;43998;43991:12;43942:63;43889:122;:::o;44017:116::-;44087:21;44102:5;44087:21;:::i;:::-;44080:5;44077:32;44067:60;;44123:1;44120;44113:12;44067:60;44017:116;:::o;44139:122::-;44212:24;44230:5;44212:24;:::i;:::-;44205:5;44202:35;44192:63;;44251:1;44248;44241:12;44192:63;44139:122;:::o;44267:120::-;44339:23;44356:5;44339:23;:::i;:::-;44332:5;44329:34;44319:62;;44377:1;44374;44367:12;44319:62;44267:120;:::o;44393:122::-;44466:24;44484:5;44466:24;:::i;:::-;44459:5;44456:35;44446:63;;44505:1;44502;44495:12;44446:63;44393:122;:::o

Swarm Source

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