ETH Price: $3,350.99 (-3.90%)

Cherub Fields (CHERUB)
 

Overview

TokenID

221

Total Transfers

-

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-
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:
CherubFields

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-05-22
*/

// Sources flattened with hardhat v2.8.2 https://hardhat.org
// SPDX-License-Identifier: MIT
// File @openzeppelin/contracts/utils/[email protected]

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

pragma solidity ^0.8.0;

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

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


// File @openzeppelin/contracts/access/[email protected]

// OpenZeppelin Contracts v4.4.1 (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 Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        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 @openzeppelin/contracts/security/[email protected]


// OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol)

pragma solidity ^0.8.0;

/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and making it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        // On the first call to nonReentrant, _notEntered will be true
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;

        _;

        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }
}


// File @openzeppelin/contracts/utils/introspection/[email protected]

// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC165 standard, as defined in the
 * https://eips.ethereum.org/EIPS/eip-165[EIP].
 *
 * Implementers can declare support of contract interfaces, which can then be
 * queried by others ({ERC165Checker}).
 *
 * For an implementation, see {ERC165}.
 */
interface IERC165 {
    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}


// File @openzeppelin/contracts/token/ERC721/[email protected]

// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;

/**
 * @dev Required interface of an ERC721 compliant contract.
 */
interface IERC721 is IERC165 {
    /**
     * @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
    ) external;

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

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

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

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

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes calldata data
    ) external;
}


// File @openzeppelin/contracts/token/ERC721/[email protected]


// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol)

pragma solidity ^0.8.0;

/**
 * @title ERC721 token receiver interface
 * @dev Interface for any contract that wants to support safeTransfers
 * from ERC721 asset contracts.
 */
interface IERC721Receiver {
    /**
     * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}
     * by `operator` from `from`, this function is called.
     *
     * It must return its Solidity selector to confirm the token transfer.
     * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.
     *
     * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`.
     */
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}


// File @openzeppelin/contracts/token/ERC721/extensions/[email protected]


// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)

pragma solidity ^0.8.0;

/**
 * @title ERC-721 Non-Fungible Token Standard, optional metadata extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Metadata is IERC721 {
    /**
     * @dev Returns the token collection name.
     */
    function name() external view returns (string memory);

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

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


// File @openzeppelin/contracts/token/ERC721/extensions/[email protected]

// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Enumerable.sol)

pragma solidity ^0.8.0;

/**
 * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Enumerable is IERC721 {
    /**
     * @dev Returns the total amount of tokens stored by the contract.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns a token ID owned by `owner` at a given `index` of its token list.
     * Use along with {balanceOf} to enumerate all of ``owner``'s tokens.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId);

    /**
     * @dev Returns a token ID at a given `index` of all the tokens stored by the contract.
     * Use along with {totalSupply} to enumerate all tokens.
     */
    function tokenByIndex(uint256 index) external view returns (uint256);
}


// File @openzeppelin/contracts/utils/[email protected]

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

pragma solidity ^0.8.0;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        (bool success, ) = recipient.call{value: amount}("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain `call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionCall(target, data, "Address: low-level call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        require(isContract(target), "Address: call to non-contract");

        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}


// File @openzeppelin/contracts/utils/[email protected]


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

pragma solidity ^0.8.0;

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

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


// File @openzeppelin/contracts/utils/introspection/[email protected]


// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)

pragma solidity ^0.8.0;

/**
 * @dev Implementation of the {IERC165} interface.
 *
 * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
 * for the additional interface id that will be supported. For example:
 *
 * ```solidity
 * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
 *     return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
 * }
 * ```
 *
 * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.
 */
abstract contract ERC165 is IERC165 {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IERC165).interfaceId;
    }
}


// File contracts/ERC721A.sol

// Creator: Chiru Labs

pragma solidity ^0.8.4;








error ApprovalCallerNotOwnerNorApproved();
error ApprovalQueryForNonexistentToken();
error ApproveToCaller();
error ApprovalToCurrentOwner();
error BalanceQueryForZeroAddress();
error MintedQueryForZeroAddress();
error BurnedQueryForZeroAddress();
error AuxQueryForZeroAddress();
error MintToZeroAddress();
error MintZeroQuantity();
error OwnerIndexOutOfBounds();
error OwnerQueryForNonexistentToken();
error TokenIndexOutOfBounds();
error TransferCallerNotOwnerNorApproved();
error TransferFromIncorrectOwner();
error TransferToNonERC721ReceiverImplementer();
error TransferToZeroAddress();
error URIQueryForNonexistentToken();

/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension. Built to optimize for lower gas during batch mints.
 *
 * Assumes serials are sequentially minted starting at 0 (e.g. 0, 1, 2, 3..).
 *
 * Assumes that an owner cannot have more than 2**64 - 1 (max value of uint64) of supply.
 *
 * Assumes that the maximum token id cannot exceed 2**256 - 1 (max value of uint256).
 */
contract ERC721A is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;

    // Compiler will pack this into a single 256bit word.
    struct TokenOwnership {
        // The address of the owner.
        address addr;
        // Keeps track of the start time of ownership with minimal overhead for tokenomics.
        uint64 startTimestamp;
        // Whether the token has been burned.
        bool burned;
    }

    // Compiler will pack this into a single 256bit word.
    struct AddressData {
        // Realistically, 2**64-1 is more than enough.
        uint64 balance;
        // Keeps track of mint count with minimal overhead for tokenomics.
        uint64 numberMinted;
        // Keeps track of burn count with minimal overhead for tokenomics.
        uint64 numberBurned;
        // For miscellaneous variable(s) pertaining to the address
        // (e.g. number of whitelist mint slots used). 
        // If there are multiple variables, please pack them into a uint64.
        uint64 aux;
    }

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

    // The number of tokens burned.
    uint256 internal _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 ownershipOf implementation for details.
    mapping(uint256 => TokenOwnership) internal _ownerships;

    // Mapping owner address to address data
    mapping(address => AddressData) private _addressData;

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

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

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

    /**
     * @dev See {IERC721Enumerable-totalSupply}.
     */
    function totalSupply() public view returns (uint256) {
        // Counter underflow is impossible as _burnCounter cannot be incremented
        // more than _currentIndex times
        unchecked {
            return _currentIndex - _burnCounter;    
        }
    }

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {
        return
            interfaceId == type(IERC721).interfaceId ||
            interfaceId == type(IERC721Metadata).interfaceId ||
            super.supportsInterface(interfaceId);
    }

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

    /**
     * Returns the number of tokens minted by `owner`.
     */
    function _numberMinted(address owner) internal view returns (uint256) {
        if (owner == address(0)) revert MintedQueryForZeroAddress();
        return uint256(_addressData[owner].numberMinted);
    }

    /**
     * Returns the number of tokens burned by or on behalf of `owner`.
     */
    function _numberBurned(address owner) internal view returns (uint256) {
        if (owner == address(0)) revert BurnedQueryForZeroAddress();
        return uint256(_addressData[owner].numberBurned);
    }

    /**
     * Returns the auxillary data for `owner`. (e.g. number of whitelist mint slots used).
     */
    function _getAux(address owner) internal view returns (uint64) {
        if (owner == address(0)) revert AuxQueryForZeroAddress();
        return _addressData[owner].aux;
    }

    /**
     * Sets the auxillary data for `owner`. (e.g. number of whitelist mint slots used).
     * If there are multiple variables, please pack them into a uint64.
     */
    function _setAux(address owner, uint64 aux) internal {
        if (owner == address(0)) revert AuxQueryForZeroAddress();
        _addressData[owner].aux = aux;
    }

    /**
     * Gas spent here starts off proportional to the maximum mint batch size.
     * It gradually moves to O(1) as tokens get transferred around in the collection over time.
     */
    function ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) {
        uint256 curr = tokenId;

        unchecked {
            if (curr < _currentIndex) {
                TokenOwnership memory ownership = _ownerships[curr];
                if (!ownership.burned) {
                    if (ownership.addr != address(0)) {
                        return ownership;
                    }
                    // Invariant: 
                    // There will always be an ownership that has an address and is not burned 
                    // before an ownership that does not have an address and is not burned.
                    // Hence, curr will not underflow.
                    while (true) {
                        curr--;
                        ownership = _ownerships[curr];
                        if (ownership.addr != address(0)) {
                            return ownership;
                        }
                    }
                }
            }
        }
        revert OwnerQueryForNonexistentToken();
    }

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

    /**
     * @dev See {IERC721Metadata-name}.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev See {IERC721Metadata-symbol}.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        if (!_exists(tokenId)) revert URIQueryForNonexistentToken();

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

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

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

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

        _approve(to, tokenId, owner);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view override returns (address) {
        if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken();

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public override {
        if (operator == _msgSender()) revert ApproveToCaller();

        _operatorApprovals[_msgSender()][operator] = approved;
        emit ApprovalForAll(_msgSender(), operator, approved);
    }

    /**
     * @dev See {IERC721-isApprovedForAll}.
     */
    function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {
        return _operatorApprovals[owner][operator];
    }

    /**
     * @dev See {IERC721-transferFrom}.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        _transfer(from, to, tokenId);
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        safeTransferFrom(from, to, tokenId, '');
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public virtual override {
        _transfer(from, to, tokenId);
        if (!_checkOnERC721Received(from, to, tokenId, _data)) {
            revert TransferToNonERC721ReceiverImplementer();
        }
    }

    /**
     * @dev Returns whether `tokenId` exists.
     *
     * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
     *
     * Tokens start existing when they are minted (`_mint`),
     */
    function _exists(uint256 tokenId) internal view returns (bool) {
        return tokenId < _currentIndex && !_ownerships[tokenId].burned;
    }

    function _safeMint(address to, uint256 quantity) internal {
        _safeMint(to, quantity, '');
    }

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

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

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

        // Overflows are incredibly unrealistic.
        // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1
        // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1
        unchecked {
            _addressData[to].balance += uint64(quantity);
            _addressData[to].numberMinted += uint64(quantity);

            _ownerships[startTokenId].addr = to;
            _ownerships[startTokenId].startTimestamp = uint64(block.timestamp);

            uint256 updatedIndex = startTokenId;

            for (uint256 i; i < quantity; i++) {
                emit Transfer(address(0), to, updatedIndex);
                if (safe && !_checkOnERC721Received(address(0), to, updatedIndex, _data)) {
                    revert TransferToNonERC721ReceiverImplementer();
                }
                updatedIndex++;
            }

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

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     *
     * Emits a {Transfer} event.
     */
    function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) private {
        TokenOwnership memory prevOwnership = ownershipOf(tokenId);

        bool isApprovedOrOwner = (_msgSender() == prevOwnership.addr ||
            isApprovedForAll(prevOwnership.addr, _msgSender()) ||
            getApproved(tokenId) == _msgSender());

        if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        if (prevOwnership.addr != from) revert TransferFromIncorrectOwner();
        if (to == address(0)) revert TransferToZeroAddress();

        _beforeTokenTransfers(from, to, tokenId, 1);

        // Clear approvals from the previous owner
        _approve(address(0), tokenId, prevOwnership.addr);

        // 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 {
            _addressData[from].balance -= 1;
            _addressData[to].balance += 1;

            _ownerships[tokenId].addr = to;
            _ownerships[tokenId].startTimestamp = uint64(block.timestamp);

            // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it.
            // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
            uint256 nextTokenId = tokenId + 1;
            if (_ownerships[nextTokenId].addr == address(0)) {
                // This will suffice for checking _exists(nextTokenId),
                // as a burned slot cannot contain the zero address.
                if (nextTokenId < _currentIndex) {
                    _ownerships[nextTokenId].addr = prevOwnership.addr;
                    _ownerships[nextTokenId].startTimestamp = prevOwnership.startTimestamp;
                }
            }
        }

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

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

        _beforeTokenTransfers(prevOwnership.addr, address(0), tokenId, 1);

        // Clear approvals from the previous owner
        _approve(address(0), tokenId, prevOwnership.addr);

        // 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 {
            _addressData[prevOwnership.addr].balance -= 1;
            _addressData[prevOwnership.addr].numberBurned += 1;

            // Keep track of who burned the token, and the timestamp of burning.
            _ownerships[tokenId].addr = prevOwnership.addr;
            _ownerships[tokenId].startTimestamp = uint64(block.timestamp);
            _ownerships[tokenId].burned = true;

            // If the ownership slot of tokenId+1 is not explicitly set, that means the burn initiator owns it.
            // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
            uint256 nextTokenId = tokenId + 1;
            if (_ownerships[nextTokenId].addr == address(0)) {
                // This will suffice for checking _exists(nextTokenId),
                // as a burned slot cannot contain the zero address.
                if (nextTokenId < _currentIndex) {
                    _ownerships[nextTokenId].addr = prevOwnership.addr;
                    _ownerships[nextTokenId].startTimestamp = prevOwnership.startTimestamp;
                }
            }
        }

        emit Transfer(prevOwnership.addr, address(0), tokenId);
        _afterTokenTransfers(prevOwnership.addr, address(0), tokenId, 1);

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

    /**
     * @dev Approve `to` to operate on `tokenId`
     *
     * Emits a {Approval} event.
     */
    function _approve(
        address to,
        uint256 tokenId,
        address owner
    ) private {
        _tokenApprovals[tokenId] = to;
        emit Approval(owner, to, tokenId);
    }

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.
     * The call is not executed if the target address is not a contract.
     *
     * @param from address representing the previous owner of the given token ID
     * @param to target address that will receive the tokens
     * @param tokenId uint256 ID of the token to be transferred
     * @param _data bytes optional data to send along with the call
     * @return bool whether the call correctly returned the expected magic value
     */
    function _checkOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        if (to.isContract()) {
            try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {
                return retval == IERC721Receiver(to).onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert TransferToNonERC721ReceiverImplementer();
                } else {
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

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


// File contracts/MerkleProof.sol

// OpenZeppelin Contracts v4.4.1 (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.
 */
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 Returns the rebuilt hash obtained by traversing a Merklee 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++) {
            bytes32 proofElement = proof[i];
            if (computedHash <= proofElement) {
                // Hash(current computed hash + current element of the proof)
                computedHash = keccak256(abi.encodePacked(computedHash, proofElement));
            } else {
                // Hash(current element of the proof + current computed hash)
                computedHash = keccak256(abi.encodePacked(proofElement, computedHash));
            }
        }
        return computedHash;
    }
}


// File @openzeppelin/contracts/utils/math/[email protected]


// OpenZeppelin Contracts v4.4.1 (utils/math/SafeMath.sol)

pragma solidity ^0.8.0;

// CAUTION
// This version of SafeMath should only be used with Solidity 0.8 or later,
// because it relies on the compiler's built in overflow checks.

/**
 * @dev Wrappers over Solidity's arithmetic operations.
 *
 * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler
 * now has built in overflow checking.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the substraction of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b > a) return (false, 0);
            return (true, a - b);
        }
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
            // benefit is lost if 'b' is also tested.
            // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
            if (a == 0) return (true, 0);
            uint256 c = a * b;
            if (c / a != b) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the division of two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a / b);
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a % b);
        }
    }

    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        return a + b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return a - b;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        return a * b;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator.
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return a % b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {trySub}.
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b <= a, errorMessage);
            return a - b;
        }
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a / b;
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a % b;
        }
    }
}


// File @openzeppelin/contracts/token/ERC721/[email protected]


// OpenZeppelin Contracts v4.4.1 (token/ERC721/ERC721.sol)

pragma solidity ^0.8.0;







/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension, but not including the Enumerable extension, which is available separately as
 * {ERC721Enumerable}.
 */
contract ERC721 is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to owner address
    mapping(uint256 => address) private _owners;

    // Mapping owner address to token count
    mapping(address => uint256) private _balances;

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

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

    /**
     * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {
        return
            interfaceId == type(IERC721).interfaceId ||
            interfaceId == type(IERC721Metadata).interfaceId ||
            super.supportsInterface(interfaceId);
    }

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view virtual override returns (uint256) {
        require(owner != address(0), "ERC721: balance query for the zero address");
        return _balances[owner];
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        address owner = _owners[tokenId];
        require(owner != address(0), "ERC721: owner query for nonexistent token");
        return owner;
    }

    /**
     * @dev See {IERC721Metadata-name}.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev See {IERC721Metadata-symbol}.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");

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

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

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public virtual override {
        address owner = ERC721.ownerOf(tokenId);
        require(to != owner, "ERC721: approval to current owner");

        require(
            _msgSender() == owner || isApprovedForAll(owner, _msgSender()),
            "ERC721: approve caller is not owner nor approved for all"
        );

        _approve(to, tokenId);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        require(_exists(tokenId), "ERC721: approved query for nonexistent token");

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        _setApprovalForAll(_msgSender(), operator, approved);
    }

    /**
     * @dev See {IERC721-isApprovedForAll}.
     */
    function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {
        return _operatorApprovals[owner][operator];
    }

    /**
     * @dev See {IERC721-transferFrom}.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");

        _transfer(from, to, tokenId);
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        safeTransferFrom(from, to, tokenId, "");
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public virtual override {
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");
        _safeTransfer(from, to, tokenId, _data);
    }

    /**
     * @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.
     *
     * `_data` is additional data, it has no specified format and it is sent in call to `to`.
     *
     * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.
     * implement alternative mechanisms to perform token transfer, such as signature-based.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeTransfer(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _transfer(from, to, tokenId);
        require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer");
    }

    /**
     * @dev Returns whether `tokenId` exists.
     *
     * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
     *
     * Tokens start existing when they are minted (`_mint`),
     * and stop existing when they are burned (`_burn`).
     */
    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return _owners[tokenId] != address(0);
    }

    /**
     * @dev Returns whether `spender` is allowed to manage `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) {
        require(_exists(tokenId), "ERC721: operator query for nonexistent token");
        address owner = ERC721.ownerOf(tokenId);
        return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender));
    }

    /**
     * @dev Safely mints `tokenId` and transfers it to `to`.
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(address to, uint256 tokenId) internal virtual {
        _safeMint(to, tokenId, "");
    }

    /**
     * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is
     * forwarded in {IERC721Receiver-onERC721Received} to contract recipients.
     */
    function _safeMint(
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _mint(to, tokenId);
        require(
            _checkOnERC721Received(address(0), to, tokenId, _data),
            "ERC721: transfer to non ERC721Receiver implementer"
        );
    }

    /**
     * @dev Mints `tokenId` and transfers it to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - `to` cannot be the zero address.
     *
     * Emits a {Transfer} event.
     */
    function _mint(address to, uint256 tokenId) internal virtual {
        require(to != address(0), "ERC721: mint to the zero address");
        require(!_exists(tokenId), "ERC721: token already minted");

        _beforeTokenTransfer(address(0), to, tokenId);

        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(address(0), to, tokenId);
    }

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

        _beforeTokenTransfer(owner, address(0), tokenId);

        // Clear approvals
        _approve(address(0), tokenId);

        _balances[owner] -= 1;
        delete _owners[tokenId];

        emit Transfer(owner, address(0), tokenId);
    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *  As opposed to {transferFrom}, this imposes no restrictions on msg.sender.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     *
     * Emits a {Transfer} event.
     */
    function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {
        require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own");
        require(to != address(0), "ERC721: transfer to the zero address");

        _beforeTokenTransfer(from, to, tokenId);

        // Clear approvals from the previous owner
        _approve(address(0), tokenId);

        _balances[from] -= 1;
        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(from, to, tokenId);
    }

    /**
     * @dev Approve `to` to operate on `tokenId`
     *
     * Emits a {Approval} event.
     */
    function _approve(address to, uint256 tokenId) internal virtual {
        _tokenApprovals[tokenId] = to;
        emit Approval(ERC721.ownerOf(tokenId), to, tokenId);
    }

    /**
     * @dev Approve `operator` to operate on all of `owner` tokens
     *
     * Emits a {ApprovalForAll} event.
     */
    function _setApprovalForAll(
        address owner,
        address operator,
        bool approved
    ) internal virtual {
        require(owner != operator, "ERC721: approve to caller");
        _operatorApprovals[owner][operator] = approved;
        emit ApprovalForAll(owner, operator, approved);
    }

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.
     * The call is not executed if the target address is not a contract.
     *
     * @param from address representing the previous owner of the given token ID
     * @param to target address that will receive the tokens
     * @param tokenId uint256 ID of the token to be transferred
     * @param _data bytes optional data to send along with the call
     * @return bool whether the call correctly returned the expected magic value
     */
    function _checkOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        if (to.isContract()) {
            try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {
                return retval == IERC721Receiver.onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert("ERC721: transfer to non ERC721Receiver implementer");
                } else {
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning.
     *
     * 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, ``from``'s `tokenId` will be burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {}
}


// File contracts/CherubFields.sol


pragma solidity ^0.8.0;






contract CherubFields is Ownable, ERC721A, ReentrancyGuard {
    using SafeMath for uint256;

    uint256 public immutable maxPerAddressDuringMint;
    uint256 public immutable MAX_AMOUNT;
    bytes32 public merkleRoot;

    mapping(address => uint8) public mintedWhitelist;
    mapping(address => bool) public mintedSharedToken;

    uint256 public NFTPrice = 0.077 ether;

    bool public saleIsActive = false;
    bool public isWhitelistActive = false;
    bool public isSharedHolderSaleActive = false;

    uint8 public availableTokensPerWhitelist = 3;

    address projectWallet = 0x4cF1bEaaec25AF63282ca93b6DDD36a8D63D373E;
    address devWallet = 0x38c0245C7C67576d1E73f3A11c6af76fE8d11dEA;
    address artWallet = 0x9e9161363Ff2f51246030fAF9A94049a42835c17;

    constructor(bytes32 merkleRoot_) ERC721A("Cherub Fields", "CHERUB") {
        MAX_AMOUNT = 1111;
        maxPerAddressDuringMint = 10;
        merkleRoot = merkleRoot_;
    }

    function mintReserveTokens(uint256 numberOfTokens) public onlyOwner {
        _safeMint(msg.sender, numberOfTokens);
        require(totalSupply() <= MAX_AMOUNT, "Limit reached");
    }

    function whitelistMint(
        bytes32[] calldata _merkleProof,
        uint8 numberOfTokens
    ) external payable {
        require(isWhitelistActive, "Whitelist is not active");
        require(
            NFTPrice.mul(numberOfTokens) <= msg.value,
            "Ether value sent is not correct"
        );

        uint8 mintedSoFar = mintedWhitelist[msg.sender] + numberOfTokens;
        require(
            mintedSoFar <= availableTokensPerWhitelist,
            "You can't mint that many"
        );

        bytes32 leaf = keccak256(abi.encodePacked(msg.sender));
        require(
            MerkleProof.verify(_merkleProof, merkleRoot, leaf) == true,
            "Incorrect Merkle Proof"
        );

        mintedWhitelist[msg.sender] = mintedSoFar;

        _safeMint(msg.sender, numberOfTokens);

        require(totalSupply() <= MAX_AMOUNT, "Limit reached");
    }

    function mintNFTAsSharedOwner() public payable {
        require(
            isSharedHolderSaleActive,
            "Sale must be active to mint a Cherub"
        );
        require(NFTPrice <= msg.value, "Ether value sent is not correct");
        require(
            isSharedOwner(msg.sender),
            "This wallet does not contain the right NFTs."
        );

        require(
            mintedSharedToken[msg.sender] == false,
            "You can't mint that many"
        );
        mintedSharedToken[msg.sender] = true;

        _safeMint(msg.sender, 1);

        require(totalSupply() <= MAX_AMOUNT, "Limit reached");
    }

    function mintNFT(uint256 numberOfTokens) public payable {
        require(saleIsActive, "Sale must be active to mint a Cherub");
        require(
            numberOfTokens <= maxPerAddressDuringMint,
            "You can't mint that many at once"
        );
        require(
            NFTPrice.mul(numberOfTokens) <= msg.value,
            "Ether value sent is not correct"
        );

        _safeMint(msg.sender, numberOfTokens);

        require(totalSupply() <= MAX_AMOUNT, "Limit reached");
    }

    function flipSaleState() public onlyOwner {
        saleIsActive = !saleIsActive;
    }

    function flipWhitelistState() public onlyOwner {
        isWhitelistActive = !isWhitelistActive;
    }

    function flipSharedHolderState() public onlyOwner {
        isSharedHolderSaleActive = !isSharedHolderSaleActive;
    }

    function isSharedOwner(address addr) public view returns (bool) {
        address milady =  0x5Af0D9827E0c53E4799BB226655A1de152A425a5;
        address tubby =   0xCa7cA7BcC765F77339bE2d648BA53ce9c8a262bD;
        address adworld = 0x62eb144FE92Ddc1B10bCAde03A0C09f6FBffBffb;

        return
            ERC721(milady).balanceOf(addr) > 0 ||
            ERC721(adworld).balanceOf(addr) > 0 ||
            ERC721(tubby).balanceOf(addr) > 0;
    }

    // // metadata URI
    string private _baseTokenURI;

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

    function setBaseURI(string calldata baseURI) external onlyOwner {
        _baseTokenURI = baseURI;
    }

    function setMerkleRoot(bytes32 merkleRoot_) external onlyOwner {
        merkleRoot = merkleRoot_;
    }

    function withdrawMoney() external onlyOwner nonReentrant {
        (bool success, ) = msg.sender.call{value: address(this).balance}("");
        require(success, "Transfer failed.");
    }

    function numberMinted(address owner) public view returns (uint256) {
        return _numberMinted(owner);
    }

    function getOwnershipData(uint256 tokenId)
        external
        view
        returns (TokenOwnership memory)
    {
        return ownershipOf(tokenId);
    }

    function setMintPrice(uint256 newPrice) external onlyOwner {
        NFTPrice = newPrice;
    }

    function withdrawAll() public payable onlyOwner {
        uint256 project = (address(this).balance * 6000) / 10000;
        uint256 dev = (address(this).balance * 2500) / 10000;
        uint256 art = (address(this).balance * 1500) / 10000;

        require(payable(projectWallet).send(project));
        require(payable(devWallet).send(dev));
        require(payable(artWallet).send(art));
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"bytes32","name":"merkleRoot_","type":"bytes32"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"MintedQueryForZeroAddress","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MAX_AMOUNT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NFTPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"availableTokensPerWhitelist","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"flipSaleState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"flipSharedHolderState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"flipWhitelistState","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":"uint256","name":"tokenId","type":"uint256"}],"name":"getOwnershipData","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"},{"internalType":"bool","name":"burned","type":"bool"}],"internalType":"struct ERC721A.TokenOwnership","name":"","type":"tuple"}],"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":"isSharedHolderSaleActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"isSharedOwner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isWhitelistActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPerAddressDuringMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"merkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"}],"name":"mintNFT","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintNFTAsSharedOwner","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"}],"name":"mintReserveTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"mintedSharedToken","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"mintedWhitelist","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"numberMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"saleIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"merkleRoot_","type":"bytes32"}],"name":"setMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newPrice","type":"uint256"}],"name":"setMintPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"},{"internalType":"uint8","name":"numberOfTokens","type":"uint8"}],"name":"whitelistMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"withdrawAll","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"withdrawMoney","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60c06040526701118f178fb48000600d556000600e60006101000a81548160ff0219169083151502179055506000600e60016101000a81548160ff0219169083151502179055506000600e60026101000a81548160ff0219169083151502179055506003600e60036101000a81548160ff021916908360ff160217905550734cf1beaaec25af63282ca93b6ddd36a8d63d373e600e60046101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507338c0245c7c67576d1e73f3a11c6af76fe8d11dea600f60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550739e9161363ff2f51246030faf9a94049a42835c17601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055503480156200018957600080fd5b5060405162005071380380620050718339818101604052810190620001af91906200042b565b6040518060400160405280600d81526020017f436865727562204669656c6473000000000000000000000000000000000000008152506040518060400160405280600681526020017f43484552554200000000000000000000000000000000000000000000000000008152506200023b6200022f6200029860201b60201c565b620002a060201b60201c565b81600390805190602001906200025392919062000364565b5080600490805190602001906200026c92919062000364565b505050600160098190555061045760a08181525050600a6080818152505080600a8190555050620004eb565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620003729062000467565b90600052602060002090601f016020900481019282620003965760008555620003e2565b82601f10620003b157805160ff1916838001178555620003e2565b82800160010185558215620003e2579182015b82811115620003e1578251825591602001919060010190620003c4565b5b509050620003f19190620003f5565b5090565b5b8082111562000410576000816000905550600101620003f6565b5090565b6000815190506200042581620004d1565b92915050565b600060208284031215620004445762000443620004cc565b5b6000620004548482850162000414565b91505092915050565b6000819050919050565b600060028204905060018216806200048057607f821691505b602082108114156200049757620004966200049d565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600080fd5b620004dc816200045d565b8114620004e857600080fd5b50565b60805160a051614b3d6200053460003960008181610cb7015281816111340152818161123601528181611b880152612153015260008181611a100152611ac40152614b3d6000f3fe6080604052600436106102515760003560e01c80638bc35c2f11610139578063becacc5b116100b6578063e7e9af7a1161007a578063e7e9af7a14610844578063e985e9c514610881578063eb8d2444146108be578063f2fde38b146108e9578063f4a0a52814610912578063f6fa26ab1461093b57610251565b8063becacc5b1461074b578063bff78e2214610788578063c87b56dd1461079f578063d40dc870146107dc578063dc33e6811461080757610251565b8063a22cb465116100fd578063a22cb4651461068c578063a38bffda146106b5578063ac446002146106e0578063b88d4fde146106f7578063bcb47dcc1461072057610251565b80638bc35c2f146105b25780638da5cb5b146105dd5780639231ab2a14610608578063926427441461064557806395d89b411461066157610251565b80632eb4a7ab116101d25780636352211e116101965780636352211e146104b157806370a08231146104ee578063715018a61461052b57806377596a01146105425780637cb647591461057f578063853828b6146105a857610251565b80632eb4a7ab146103f257806334918dfd1461041d57806342842e0e14610434578063524513d61461045d57806355f804b31461048857610251565b8063095ea7b311610219578063095ea7b31461034257806318160ddd1461036b5780631ef389071461039657806323b872dd146103a0578063288bd8fd146103c957610251565b806301ffc9a71461025657806302d179c81461029357806305cf3bfe146102af57806306fdde03146102da578063081812fc14610305575b600080fd5b34801561026257600080fd5b5061027d60048036038101906102789190613bb6565b610952565b60405161028a91906140f0565b60405180910390f35b6102ad60048036038101906102a89190613b29565b610a34565b005b3480156102bb57600080fd5b506102c4610d26565b6040516102d191906140f0565b60405180910390f35b3480156102e657600080fd5b506102ef610d39565b6040516102fc9190614126565b60405180910390f35b34801561031157600080fd5b5061032c60048036038101906103279190613c5d565b610dcb565b6040516103399190614089565b60405180910390f35b34801561034e57600080fd5b5061036960048036038101906103649190613ae9565b610e47565b005b34801561037757600080fd5b50610380610f52565b60405161038d91906142e3565b60405180910390f35b61039e610f60565b005b3480156103ac57600080fd5b506103c760048036038101906103c291906139d3565b61119e565b005b3480156103d557600080fd5b506103f060048036038101906103eb9190613c5d565b6111ae565b005b3480156103fe57600080fd5b506104076112a1565b604051610414919061410b565b60405180910390f35b34801561042957600080fd5b506104326112a7565b005b34801561044057600080fd5b5061045b600480360381019061045691906139d3565b61134f565b005b34801561046957600080fd5b5061047261136f565b60405161047f91906140f0565b60405180910390f35b34801561049457600080fd5b506104af60048036038101906104aa9190613c10565b611382565b005b3480156104bd57600080fd5b506104d860048036038101906104d39190613c5d565b611414565b6040516104e59190614089565b60405180910390f35b3480156104fa57600080fd5b5061051560048036038101906105109190613966565b61142a565b60405161052291906142e3565b60405180910390f35b34801561053757600080fd5b506105406114fa565b005b34801561054e57600080fd5b5061056960048036038101906105649190613966565b611582565b60405161057691906140f0565b60405180910390f35b34801561058b57600080fd5b506105a660048036038101906105a19190613b89565b61178a565b005b6105b0611810565b005b3480156105be57600080fd5b506105c7611a0e565b6040516105d491906142e3565b60405180910390f35b3480156105e957600080fd5b506105f2611a32565b6040516105ff9190614089565b60405180910390f35b34801561061457600080fd5b5061062f600480360381019061062a9190613c5d565b611a5b565b60405161063c91906142c8565b60405180910390f35b61065f600480360381019061065a9190613c5d565b611a73565b005b34801561066d57600080fd5b50610676611bf3565b6040516106839190614126565b60405180910390f35b34801561069857600080fd5b506106b360048036038101906106ae9190613aa9565b611c85565b005b3480156106c157600080fd5b506106ca611dfd565b6040516106d791906142e3565b60405180910390f35b3480156106ec57600080fd5b506106f5611e03565b005b34801561070357600080fd5b5061071e60048036038101906107199190613a26565b611f84565b005b34801561072c57600080fd5b50610735611fd7565b60405161074291906142fe565b60405180910390f35b34801561075757600080fd5b50610772600480360381019061076d9190613966565b611fea565b60405161077f91906142fe565b60405180910390f35b34801561079457600080fd5b5061079d61200a565b005b3480156107ab57600080fd5b506107c660048036038101906107c19190613c5d565b6120b2565b6040516107d39190614126565b60405180910390f35b3480156107e857600080fd5b506107f1612151565b6040516107fe91906142e3565b60405180910390f35b34801561081357600080fd5b5061082e60048036038101906108299190613966565b612175565b60405161083b91906142e3565b60405180910390f35b34801561085057600080fd5b5061086b60048036038101906108669190613966565b612187565b60405161087891906140f0565b60405180910390f35b34801561088d57600080fd5b506108a860048036038101906108a39190613993565b6121a7565b6040516108b591906140f0565b60405180910390f35b3480156108ca57600080fd5b506108d361223b565b6040516108e091906140f0565b60405180910390f35b3480156108f557600080fd5b50610910600480360381019061090b9190613966565b61224e565b005b34801561091e57600080fd5b5061093960048036038101906109349190613c5d565b612346565b005b34801561094757600080fd5b506109506123cc565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610a1d57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610a2d5750610a2c82612474565b5b9050919050565b600e60019054906101000a900460ff16610a83576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a7a90614148565b60405180910390fd5b34610a9c8260ff16600d546124de90919063ffffffff16565b1115610add576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ad4906141e8565b60405180910390fd5b600081600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16610b379190614413565b9050600e60039054906101000a900460ff1660ff168160ff161115610b91576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b8890614208565b60405180910390fd5b600033604051602001610ba49190614009565b60405160208183030381529060405280519060200120905060011515610c0e868680806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600a54846124f4565b151514610c50576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c4790614248565b60405180910390fd5b81600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908360ff160217905550610cb5338460ff1661250b565b7f0000000000000000000000000000000000000000000000000000000000000000610cde610f52565b1115610d1f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d16906141c8565b60405180910390fd5b5050505050565b600e60029054906101000a900460ff1681565b606060038054610d48906145ea565b80601f0160208091040260200160405190810160405280929190818152602001828054610d74906145ea565b8015610dc15780601f10610d9657610100808354040283529160200191610dc1565b820191906000526020600020905b815481529060010190602001808311610da457829003601f168201915b5050505050905090565b6000610dd682612529565b610e0c576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610e5282611414565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610eba576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610ed9612564565b73ffffffffffffffffffffffffffffffffffffffff1614158015610f0b5750610f0981610f04612564565b6121a7565b155b15610f42576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610f4d83838361256c565b505050565b600060025460015403905090565b600e60029054906101000a900460ff16610faf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fa690614288565b60405180910390fd5b34600d541115610ff4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610feb906141e8565b60405180910390fd5b610ffd33611582565b61103c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611033906141a8565b60405180910390fd5b60001515600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515146110cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110c690614208565b60405180910390fd5b6001600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555061113233600161250b565b7f000000000000000000000000000000000000000000000000000000000000000061115b610f52565b111561119c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611193906141c8565b60405180910390fd5b565b6111a983838361261e565b505050565b6111b6612564565b73ffffffffffffffffffffffffffffffffffffffff166111d4611a32565b73ffffffffffffffffffffffffffffffffffffffff161461122a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161122190614228565b60405180910390fd5b611234338261250b565b7f000000000000000000000000000000000000000000000000000000000000000061125d610f52565b111561129e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611295906141c8565b60405180910390fd5b50565b600a5481565b6112af612564565b73ffffffffffffffffffffffffffffffffffffffff166112cd611a32565b73ffffffffffffffffffffffffffffffffffffffff1614611323576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161131a90614228565b60405180910390fd5b600e60009054906101000a900460ff1615600e60006101000a81548160ff021916908315150217905550565b61136a83838360405180602001604052806000815250611f84565b505050565b600e60019054906101000a900460ff1681565b61138a612564565b73ffffffffffffffffffffffffffffffffffffffff166113a8611a32565b73ffffffffffffffffffffffffffffffffffffffff16146113fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113f590614228565b60405180910390fd5b81816011919061140f9291906136bc565b505050565b600061141f82612b0f565b600001519050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611492576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b611502612564565b73ffffffffffffffffffffffffffffffffffffffff16611520611a32565b73ffffffffffffffffffffffffffffffffffffffff1614611576576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161156d90614228565b60405180910390fd5b6115806000612d8b565b565b600080735af0d9827e0c53e4799bb226655a1de152a425a59050600073ca7ca7bcc765f77339be2d648ba53ce9c8a262bd905060007362eb144fe92ddc1b10bcade03a0c09f6fbffbffb905060008373ffffffffffffffffffffffffffffffffffffffff166370a08231876040518263ffffffff1660e01b81526004016116099190614089565b60206040518083038186803b15801561162157600080fd5b505afa158015611635573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116599190613c8a565b11806116ed575060008173ffffffffffffffffffffffffffffffffffffffff166370a08231876040518263ffffffff1660e01b815260040161169b9190614089565b60206040518083038186803b1580156116b357600080fd5b505afa1580156116c7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116eb9190613c8a565b115b80611780575060008273ffffffffffffffffffffffffffffffffffffffff166370a08231876040518263ffffffff1660e01b815260040161172e9190614089565b60206040518083038186803b15801561174657600080fd5b505afa15801561175a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061177e9190613c8a565b115b9350505050919050565b611792612564565b73ffffffffffffffffffffffffffffffffffffffff166117b0611a32565b73ffffffffffffffffffffffffffffffffffffffff1614611806576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117fd90614228565b60405180910390fd5b80600a8190555050565b611818612564565b73ffffffffffffffffffffffffffffffffffffffff16611836611a32565b73ffffffffffffffffffffffffffffffffffffffff161461188c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188390614228565b60405180910390fd5b60006127106117704761189f919061447b565b6118a9919061444a565b905060006127106109c4476118be919061447b565b6118c8919061444a565b905060006127106105dc476118dd919061447b565b6118e7919061444a565b9050600e60049054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc849081150290604051600060405180830381858888f1935050505061194957600080fd5b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f193505050506119a957600080fd5b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050611a0957600080fd5b505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611a63613742565b611a6c82612b0f565b9050919050565b600e60009054906101000a900460ff16611ac2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ab990614288565b60405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000000000811115611b25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b1c90614168565b60405180910390fd5b34611b3b82600d546124de90919063ffffffff16565b1115611b7c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b73906141e8565b60405180910390fd5b611b86338261250b565b7f0000000000000000000000000000000000000000000000000000000000000000611baf610f52565b1115611bf0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611be7906141c8565b60405180910390fd5b50565b606060048054611c02906145ea565b80601f0160208091040260200160405190810160405280929190818152602001828054611c2e906145ea565b8015611c7b5780601f10611c5057610100808354040283529160200191611c7b565b820191906000526020600020905b815481529060010190602001808311611c5e57829003601f168201915b5050505050905090565b611c8d612564565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611cf2576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060086000611cff612564565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611dac612564565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611df191906140f0565b60405180910390a35050565b600d5481565b611e0b612564565b73ffffffffffffffffffffffffffffffffffffffff16611e29611a32565b73ffffffffffffffffffffffffffffffffffffffff1614611e7f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e7690614228565b60405180910390fd5b60026009541415611ec5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ebc906142a8565b60405180910390fd5b600260098190555060003373ffffffffffffffffffffffffffffffffffffffff1647604051611ef390614074565b60006040518083038185875af1925050503d8060008114611f30576040519150601f19603f3d011682016040523d82523d6000602084013e611f35565b606091505b5050905080611f79576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f7090614268565b60405180910390fd5b506001600981905550565b611f8f84848461261e565b611f9b84848484612e4f565b611fd1576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b600e60039054906101000a900460ff1681565b600b6020528060005260406000206000915054906101000a900460ff1681565b612012612564565b73ffffffffffffffffffffffffffffffffffffffff16612030611a32565b73ffffffffffffffffffffffffffffffffffffffff1614612086576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161207d90614228565b60405180910390fd5b600e60029054906101000a900460ff1615600e60026101000a81548160ff021916908315150217905550565b60606120bd82612529565b6120f3576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006120fd612fdd565b905060008151141561211e5760405180602001604052806000815250612149565b806121288461306f565b604051602001612139929190614050565b6040516020818303038152906040525b915050919050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000612180826131d0565b9050919050565b600c6020528060005260406000206000915054906101000a900460ff1681565b6000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600e60009054906101000a900460ff1681565b612256612564565b73ffffffffffffffffffffffffffffffffffffffff16612274611a32565b73ffffffffffffffffffffffffffffffffffffffff16146122ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122c190614228565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561233a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161233190614188565b60405180910390fd5b61234381612d8b565b50565b61234e612564565b73ffffffffffffffffffffffffffffffffffffffff1661236c611a32565b73ffffffffffffffffffffffffffffffffffffffff16146123c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123b990614228565b60405180910390fd5b80600d8190555050565b6123d4612564565b73ffffffffffffffffffffffffffffffffffffffff166123f2611a32565b73ffffffffffffffffffffffffffffffffffffffff1614612448576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161243f90614228565b60405180910390fd5b600e60019054906101000a900460ff1615600e60016101000a81548160ff021916908315150217905550565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600081836124ec919061447b565b905092915050565b60008261250185846132a0565b1490509392505050565b612525828260405180602001604052806000815250613353565b5050565b60006001548210801561255d575060056000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b600033905090565b826007600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600061262982612b0f565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff16612650612564565b73ffffffffffffffffffffffffffffffffffffffff1614806126835750612682826000015161267d612564565b6121a7565b5b806126c85750612691612564565b73ffffffffffffffffffffffffffffffffffffffff166126b084610dcb565b73ffffffffffffffffffffffffffffffffffffffff16145b905080612701576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff161461276a576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156127d1576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6127de8585856001613365565b6127ee600084846000015161256c565b6001600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550836005600085815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426005600085815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600184019050600073ffffffffffffffffffffffffffffffffffffffff166005600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415612a9f57600154811015612a9e5782600001516005600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082602001516005600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b50828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612b08858585600161336b565b5050505050565b612b17613742565b6000829050600154811015612d54576000600560008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff16151515158152505090508060400151612d5257600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612c36578092505050612d86565b5b600115612d5157818060019003925050600560008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612d4c578092505050612d86565b612c37565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000612e708473ffffffffffffffffffffffffffffffffffffffff16613371565b15612fd0578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612e99612564565b8786866040518563ffffffff1660e01b8152600401612ebb94939291906140a4565b602060405180830381600087803b158015612ed557600080fd5b505af1925050508015612f0657506040513d601f19601f82011682018060405250810190612f039190613be3565b60015b612f80573d8060008114612f36576040519150601f19603f3d011682016040523d82523d6000602084013e612f3b565b606091505b50600081511415612f78576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612fd5565b600190505b949350505050565b606060118054612fec906145ea565b80601f0160208091040260200160405190810160405280929190818152602001828054613018906145ea565b80156130655780601f1061303a57610100808354040283529160200191613065565b820191906000526020600020905b81548152906001019060200180831161304857829003601f168201915b5050505050905090565b606060008214156130b7576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506131cb565b600082905060005b600082146130e95780806130d29061464d565b915050600a826130e2919061444a565b91506130bf565b60008167ffffffffffffffff811115613105576131046147b1565b5b6040519080825280601f01601f1916602001820160405280156131375781602001600182028036833780820191505090505b5090505b600085146131c45760018261315091906144d5565b9150600a8561315f91906146c4565b603061316b91906143bd565b60f81b81838151811061318157613180614782565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856131bd919061444a565b945061313b565b8093505050505b919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613238576040517f35ebb31900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160089054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b60008082905060005b84518110156133485760008582815181106132c7576132c6614782565b5b602002602001015190508083116133085782816040516020016132eb929190614024565b604051602081830303815290604052805190602001209250613334565b808360405160200161331b929190614024565b6040516020818303038152906040528051906020012092505b5080806133409061464d565b9150506132a9565b508091505092915050565b6133608383836001613384565b505050565b50505050565b50505050565b600080823b905060008111915050919050565b60006001549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614156133f2576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600084141561342d576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61343a6000868387613365565b83600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846005600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426005600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600081905060005b8581101561369f57818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a483801561365357506136516000888488612e4f565b155b1561368a576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b818060010192505080806001019150506135d8565b5080600181905550506136b5600086838761336b565b5050505050565b8280546136c8906145ea565b90600052602060002090601f0160209004810192826136ea5760008555613731565b82601f1061370357803560ff1916838001178555613731565b82800160010185558215613731579182015b82811115613730578235825591602001919060010190613715565b5b50905061373e9190613785565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b8082111561379e576000816000905550600101613786565b5090565b60006137b56137b08461433e565b614319565b9050828152602081018484840111156137d1576137d06147ef565b5b6137dc8482856145a8565b509392505050565b6000813590506137f381614a7d565b92915050565b60008083601f84011261380f5761380e6147e5565b5b8235905067ffffffffffffffff81111561382c5761382b6147e0565b5b602083019150836020820283011115613848576138476147ea565b5b9250929050565b60008135905061385e81614a94565b92915050565b60008135905061387381614aab565b92915050565b60008135905061388881614ac2565b92915050565b60008151905061389d81614ac2565b92915050565b600082601f8301126138b8576138b76147e5565b5b81356138c88482602086016137a2565b91505092915050565b60008083601f8401126138e7576138e66147e5565b5b8235905067ffffffffffffffff811115613904576139036147e0565b5b6020830191508360018202830111156139205761391f6147ea565b5b9250929050565b60008135905061393681614ad9565b92915050565b60008151905061394b81614ad9565b92915050565b60008135905061396081614af0565b92915050565b60006020828403121561397c5761397b6147f9565b5b600061398a848285016137e4565b91505092915050565b600080604083850312156139aa576139a96147f9565b5b60006139b8858286016137e4565b92505060206139c9858286016137e4565b9150509250929050565b6000806000606084860312156139ec576139eb6147f9565b5b60006139fa868287016137e4565b9350506020613a0b868287016137e4565b9250506040613a1c86828701613927565b9150509250925092565b60008060008060808587031215613a4057613a3f6147f9565b5b6000613a4e878288016137e4565b9450506020613a5f878288016137e4565b9350506040613a7087828801613927565b925050606085013567ffffffffffffffff811115613a9157613a906147f4565b5b613a9d878288016138a3565b91505092959194509250565b60008060408385031215613ac057613abf6147f9565b5b6000613ace858286016137e4565b9250506020613adf8582860161384f565b9150509250929050565b60008060408385031215613b0057613aff6147f9565b5b6000613b0e858286016137e4565b9250506020613b1f85828601613927565b9150509250929050565b600080600060408486031215613b4257613b416147f9565b5b600084013567ffffffffffffffff811115613b6057613b5f6147f4565b5b613b6c868287016137f9565b93509350506020613b7f86828701613951565b9150509250925092565b600060208284031215613b9f57613b9e6147f9565b5b6000613bad84828501613864565b91505092915050565b600060208284031215613bcc57613bcb6147f9565b5b6000613bda84828501613879565b91505092915050565b600060208284031215613bf957613bf86147f9565b5b6000613c078482850161388e565b91505092915050565b60008060208385031215613c2757613c266147f9565b5b600083013567ffffffffffffffff811115613c4557613c446147f4565b5b613c51858286016138d1565b92509250509250929050565b600060208284031215613c7357613c726147f9565b5b6000613c8184828501613927565b91505092915050565b600060208284031215613ca057613c9f6147f9565b5b6000613cae8482850161393c565b91505092915050565b613cc081614509565b82525050565b613ccf81614509565b82525050565b613ce6613ce182614509565b614696565b82525050565b613cf58161451b565b82525050565b613d048161451b565b82525050565b613d1381614527565b82525050565b613d2a613d2582614527565b6146a8565b82525050565b6000613d3b8261436f565b613d458185614385565b9350613d558185602086016145b7565b613d5e816147fe565b840191505092915050565b6000613d748261437a565b613d7e81856143a1565b9350613d8e8185602086016145b7565b613d97816147fe565b840191505092915050565b6000613dad8261437a565b613db781856143b2565b9350613dc78185602086016145b7565b80840191505092915050565b6000613de06017836143a1565b9150613deb8261481c565b602082019050919050565b6000613e036020836143a1565b9150613e0e82614845565b602082019050919050565b6000613e266026836143a1565b9150613e318261486e565b604082019050919050565b6000613e49602c836143a1565b9150613e54826148bd565b604082019050919050565b6000613e6c600d836143a1565b9150613e778261490c565b602082019050919050565b6000613e8f601f836143a1565b9150613e9a82614935565b602082019050919050565b6000613eb26018836143a1565b9150613ebd8261495e565b602082019050919050565b6000613ed56020836143a1565b9150613ee082614987565b602082019050919050565b6000613ef86016836143a1565b9150613f03826149b0565b602082019050919050565b6000613f1b600083614396565b9150613f26826149d9565b600082019050919050565b6000613f3e6010836143a1565b9150613f49826149dc565b602082019050919050565b6000613f616024836143a1565b9150613f6c82614a05565b604082019050919050565b6000613f84601f836143a1565b9150613f8f82614a54565b602082019050919050565b606082016000820151613fb06000850182613cb7565b506020820151613fc36020850182613feb565b506040820151613fd66040850182613cec565b50505050565b613fe58161457d565b82525050565b613ff481614587565b82525050565b6140038161459b565b82525050565b60006140158284613cd5565b60148201915081905092915050565b60006140308285613d19565b6020820191506140408284613d19565b6020820191508190509392505050565b600061405c8285613da2565b91506140688284613da2565b91508190509392505050565b600061407f82613f0e565b9150819050919050565b600060208201905061409e6000830184613cc6565b92915050565b60006080820190506140b96000830187613cc6565b6140c66020830186613cc6565b6140d36040830185613fdc565b81810360608301526140e58184613d30565b905095945050505050565b60006020820190506141056000830184613cfb565b92915050565b60006020820190506141206000830184613d0a565b92915050565b600060208201905081810360008301526141408184613d69565b905092915050565b6000602082019050818103600083015261416181613dd3565b9050919050565b6000602082019050818103600083015261418181613df6565b9050919050565b600060208201905081810360008301526141a181613e19565b9050919050565b600060208201905081810360008301526141c181613e3c565b9050919050565b600060208201905081810360008301526141e181613e5f565b9050919050565b6000602082019050818103600083015261420181613e82565b9050919050565b6000602082019050818103600083015261422181613ea5565b9050919050565b6000602082019050818103600083015261424181613ec8565b9050919050565b6000602082019050818103600083015261426181613eeb565b9050919050565b6000602082019050818103600083015261428181613f31565b9050919050565b600060208201905081810360008301526142a181613f54565b9050919050565b600060208201905081810360008301526142c181613f77565b9050919050565b60006060820190506142dd6000830184613f9a565b92915050565b60006020820190506142f86000830184613fdc565b92915050565b60006020820190506143136000830184613ffa565b92915050565b6000614323614334565b905061432f828261461c565b919050565b6000604051905090565b600067ffffffffffffffff821115614359576143586147b1565b5b614362826147fe565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b60006143c88261457d565b91506143d38361457d565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614408576144076146f5565b5b828201905092915050565b600061441e8261459b565b91506144298361459b565b92508260ff0382111561443f5761443e6146f5565b5b828201905092915050565b60006144558261457d565b91506144608361457d565b9250826144705761446f614724565b5b828204905092915050565b60006144868261457d565b91506144918361457d565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156144ca576144c96146f5565b5b828202905092915050565b60006144e08261457d565b91506144eb8361457d565b9250828210156144fe576144fd6146f5565b5b828203905092915050565b60006145148261455d565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600067ffffffffffffffff82169050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b838110156145d55780820151818401526020810190506145ba565b838111156145e4576000848401525b50505050565b6000600282049050600182168061460257607f821691505b6020821081141561461657614615614753565b5b50919050565b614625826147fe565b810181811067ffffffffffffffff82111715614644576146436147b1565b5b80604052505050565b60006146588261457d565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561468b5761468a6146f5565b5b600182019050919050565b60006146a1826146b2565b9050919050565b6000819050919050565b60006146bd8261480f565b9050919050565b60006146cf8261457d565b91506146da8361457d565b9250826146ea576146e9614724565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f57686974656c697374206973206e6f7420616374697665000000000000000000600082015250565b7f596f752063616e2774206d696e742074686174206d616e79206174206f6e6365600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f546869732077616c6c657420646f6573206e6f7420636f6e7461696e2074686560008201527f207269676874204e4654732e0000000000000000000000000000000000000000602082015250565b7f4c696d6974207265616368656400000000000000000000000000000000000000600082015250565b7f45746865722076616c75652073656e74206973206e6f7420636f727265637400600082015250565b7f596f752063616e2774206d696e742074686174206d616e790000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f496e636f7272656374204d65726b6c652050726f6f6600000000000000000000600082015250565b50565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b7f53616c65206d7573742062652061637469766520746f206d696e74206120436860008201527f6572756200000000000000000000000000000000000000000000000000000000602082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b614a8681614509565b8114614a9157600080fd5b50565b614a9d8161451b565b8114614aa857600080fd5b50565b614ab481614527565b8114614abf57600080fd5b50565b614acb81614531565b8114614ad657600080fd5b50565b614ae28161457d565b8114614aed57600080fd5b50565b614af98161459b565b8114614b0457600080fd5b5056fea26469706673582212205d382de8e25edc2af41181747ed91492116a26b3633df11e4ef94fe32d4223c264736f6c634300080700333ad067f9b885085dec8a056a09c2ac9d8f95f935ef8c6d9806fd608ff6f1cf05

Deployed Bytecode

0x6080604052600436106102515760003560e01c80638bc35c2f11610139578063becacc5b116100b6578063e7e9af7a1161007a578063e7e9af7a14610844578063e985e9c514610881578063eb8d2444146108be578063f2fde38b146108e9578063f4a0a52814610912578063f6fa26ab1461093b57610251565b8063becacc5b1461074b578063bff78e2214610788578063c87b56dd1461079f578063d40dc870146107dc578063dc33e6811461080757610251565b8063a22cb465116100fd578063a22cb4651461068c578063a38bffda146106b5578063ac446002146106e0578063b88d4fde146106f7578063bcb47dcc1461072057610251565b80638bc35c2f146105b25780638da5cb5b146105dd5780639231ab2a14610608578063926427441461064557806395d89b411461066157610251565b80632eb4a7ab116101d25780636352211e116101965780636352211e146104b157806370a08231146104ee578063715018a61461052b57806377596a01146105425780637cb647591461057f578063853828b6146105a857610251565b80632eb4a7ab146103f257806334918dfd1461041d57806342842e0e14610434578063524513d61461045d57806355f804b31461048857610251565b8063095ea7b311610219578063095ea7b31461034257806318160ddd1461036b5780631ef389071461039657806323b872dd146103a0578063288bd8fd146103c957610251565b806301ffc9a71461025657806302d179c81461029357806305cf3bfe146102af57806306fdde03146102da578063081812fc14610305575b600080fd5b34801561026257600080fd5b5061027d60048036038101906102789190613bb6565b610952565b60405161028a91906140f0565b60405180910390f35b6102ad60048036038101906102a89190613b29565b610a34565b005b3480156102bb57600080fd5b506102c4610d26565b6040516102d191906140f0565b60405180910390f35b3480156102e657600080fd5b506102ef610d39565b6040516102fc9190614126565b60405180910390f35b34801561031157600080fd5b5061032c60048036038101906103279190613c5d565b610dcb565b6040516103399190614089565b60405180910390f35b34801561034e57600080fd5b5061036960048036038101906103649190613ae9565b610e47565b005b34801561037757600080fd5b50610380610f52565b60405161038d91906142e3565b60405180910390f35b61039e610f60565b005b3480156103ac57600080fd5b506103c760048036038101906103c291906139d3565b61119e565b005b3480156103d557600080fd5b506103f060048036038101906103eb9190613c5d565b6111ae565b005b3480156103fe57600080fd5b506104076112a1565b604051610414919061410b565b60405180910390f35b34801561042957600080fd5b506104326112a7565b005b34801561044057600080fd5b5061045b600480360381019061045691906139d3565b61134f565b005b34801561046957600080fd5b5061047261136f565b60405161047f91906140f0565b60405180910390f35b34801561049457600080fd5b506104af60048036038101906104aa9190613c10565b611382565b005b3480156104bd57600080fd5b506104d860048036038101906104d39190613c5d565b611414565b6040516104e59190614089565b60405180910390f35b3480156104fa57600080fd5b5061051560048036038101906105109190613966565b61142a565b60405161052291906142e3565b60405180910390f35b34801561053757600080fd5b506105406114fa565b005b34801561054e57600080fd5b5061056960048036038101906105649190613966565b611582565b60405161057691906140f0565b60405180910390f35b34801561058b57600080fd5b506105a660048036038101906105a19190613b89565b61178a565b005b6105b0611810565b005b3480156105be57600080fd5b506105c7611a0e565b6040516105d491906142e3565b60405180910390f35b3480156105e957600080fd5b506105f2611a32565b6040516105ff9190614089565b60405180910390f35b34801561061457600080fd5b5061062f600480360381019061062a9190613c5d565b611a5b565b60405161063c91906142c8565b60405180910390f35b61065f600480360381019061065a9190613c5d565b611a73565b005b34801561066d57600080fd5b50610676611bf3565b6040516106839190614126565b60405180910390f35b34801561069857600080fd5b506106b360048036038101906106ae9190613aa9565b611c85565b005b3480156106c157600080fd5b506106ca611dfd565b6040516106d791906142e3565b60405180910390f35b3480156106ec57600080fd5b506106f5611e03565b005b34801561070357600080fd5b5061071e60048036038101906107199190613a26565b611f84565b005b34801561072c57600080fd5b50610735611fd7565b60405161074291906142fe565b60405180910390f35b34801561075757600080fd5b50610772600480360381019061076d9190613966565b611fea565b60405161077f91906142fe565b60405180910390f35b34801561079457600080fd5b5061079d61200a565b005b3480156107ab57600080fd5b506107c660048036038101906107c19190613c5d565b6120b2565b6040516107d39190614126565b60405180910390f35b3480156107e857600080fd5b506107f1612151565b6040516107fe91906142e3565b60405180910390f35b34801561081357600080fd5b5061082e60048036038101906108299190613966565b612175565b60405161083b91906142e3565b60405180910390f35b34801561085057600080fd5b5061086b60048036038101906108669190613966565b612187565b60405161087891906140f0565b60405180910390f35b34801561088d57600080fd5b506108a860048036038101906108a39190613993565b6121a7565b6040516108b591906140f0565b60405180910390f35b3480156108ca57600080fd5b506108d361223b565b6040516108e091906140f0565b60405180910390f35b3480156108f557600080fd5b50610910600480360381019061090b9190613966565b61224e565b005b34801561091e57600080fd5b5061093960048036038101906109349190613c5d565b612346565b005b34801561094757600080fd5b506109506123cc565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610a1d57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610a2d5750610a2c82612474565b5b9050919050565b600e60019054906101000a900460ff16610a83576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a7a90614148565b60405180910390fd5b34610a9c8260ff16600d546124de90919063ffffffff16565b1115610add576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ad4906141e8565b60405180910390fd5b600081600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16610b379190614413565b9050600e60039054906101000a900460ff1660ff168160ff161115610b91576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b8890614208565b60405180910390fd5b600033604051602001610ba49190614009565b60405160208183030381529060405280519060200120905060011515610c0e868680806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600a54846124f4565b151514610c50576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c4790614248565b60405180910390fd5b81600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908360ff160217905550610cb5338460ff1661250b565b7f0000000000000000000000000000000000000000000000000000000000000457610cde610f52565b1115610d1f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d16906141c8565b60405180910390fd5b5050505050565b600e60029054906101000a900460ff1681565b606060038054610d48906145ea565b80601f0160208091040260200160405190810160405280929190818152602001828054610d74906145ea565b8015610dc15780601f10610d9657610100808354040283529160200191610dc1565b820191906000526020600020905b815481529060010190602001808311610da457829003601f168201915b5050505050905090565b6000610dd682612529565b610e0c576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610e5282611414565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610eba576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610ed9612564565b73ffffffffffffffffffffffffffffffffffffffff1614158015610f0b5750610f0981610f04612564565b6121a7565b155b15610f42576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610f4d83838361256c565b505050565b600060025460015403905090565b600e60029054906101000a900460ff16610faf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fa690614288565b60405180910390fd5b34600d541115610ff4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610feb906141e8565b60405180910390fd5b610ffd33611582565b61103c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611033906141a8565b60405180910390fd5b60001515600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515146110cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110c690614208565b60405180910390fd5b6001600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555061113233600161250b565b7f000000000000000000000000000000000000000000000000000000000000045761115b610f52565b111561119c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611193906141c8565b60405180910390fd5b565b6111a983838361261e565b505050565b6111b6612564565b73ffffffffffffffffffffffffffffffffffffffff166111d4611a32565b73ffffffffffffffffffffffffffffffffffffffff161461122a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161122190614228565b60405180910390fd5b611234338261250b565b7f000000000000000000000000000000000000000000000000000000000000045761125d610f52565b111561129e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611295906141c8565b60405180910390fd5b50565b600a5481565b6112af612564565b73ffffffffffffffffffffffffffffffffffffffff166112cd611a32565b73ffffffffffffffffffffffffffffffffffffffff1614611323576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161131a90614228565b60405180910390fd5b600e60009054906101000a900460ff1615600e60006101000a81548160ff021916908315150217905550565b61136a83838360405180602001604052806000815250611f84565b505050565b600e60019054906101000a900460ff1681565b61138a612564565b73ffffffffffffffffffffffffffffffffffffffff166113a8611a32565b73ffffffffffffffffffffffffffffffffffffffff16146113fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113f590614228565b60405180910390fd5b81816011919061140f9291906136bc565b505050565b600061141f82612b0f565b600001519050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611492576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b611502612564565b73ffffffffffffffffffffffffffffffffffffffff16611520611a32565b73ffffffffffffffffffffffffffffffffffffffff1614611576576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161156d90614228565b60405180910390fd5b6115806000612d8b565b565b600080735af0d9827e0c53e4799bb226655a1de152a425a59050600073ca7ca7bcc765f77339be2d648ba53ce9c8a262bd905060007362eb144fe92ddc1b10bcade03a0c09f6fbffbffb905060008373ffffffffffffffffffffffffffffffffffffffff166370a08231876040518263ffffffff1660e01b81526004016116099190614089565b60206040518083038186803b15801561162157600080fd5b505afa158015611635573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116599190613c8a565b11806116ed575060008173ffffffffffffffffffffffffffffffffffffffff166370a08231876040518263ffffffff1660e01b815260040161169b9190614089565b60206040518083038186803b1580156116b357600080fd5b505afa1580156116c7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116eb9190613c8a565b115b80611780575060008273ffffffffffffffffffffffffffffffffffffffff166370a08231876040518263ffffffff1660e01b815260040161172e9190614089565b60206040518083038186803b15801561174657600080fd5b505afa15801561175a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061177e9190613c8a565b115b9350505050919050565b611792612564565b73ffffffffffffffffffffffffffffffffffffffff166117b0611a32565b73ffffffffffffffffffffffffffffffffffffffff1614611806576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117fd90614228565b60405180910390fd5b80600a8190555050565b611818612564565b73ffffffffffffffffffffffffffffffffffffffff16611836611a32565b73ffffffffffffffffffffffffffffffffffffffff161461188c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188390614228565b60405180910390fd5b60006127106117704761189f919061447b565b6118a9919061444a565b905060006127106109c4476118be919061447b565b6118c8919061444a565b905060006127106105dc476118dd919061447b565b6118e7919061444a565b9050600e60049054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc849081150290604051600060405180830381858888f1935050505061194957600080fd5b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f193505050506119a957600080fd5b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050611a0957600080fd5b505050565b7f000000000000000000000000000000000000000000000000000000000000000a81565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611a63613742565b611a6c82612b0f565b9050919050565b600e60009054906101000a900460ff16611ac2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ab990614288565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000a811115611b25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b1c90614168565b60405180910390fd5b34611b3b82600d546124de90919063ffffffff16565b1115611b7c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b73906141e8565b60405180910390fd5b611b86338261250b565b7f0000000000000000000000000000000000000000000000000000000000000457611baf610f52565b1115611bf0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611be7906141c8565b60405180910390fd5b50565b606060048054611c02906145ea565b80601f0160208091040260200160405190810160405280929190818152602001828054611c2e906145ea565b8015611c7b5780601f10611c5057610100808354040283529160200191611c7b565b820191906000526020600020905b815481529060010190602001808311611c5e57829003601f168201915b5050505050905090565b611c8d612564565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611cf2576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060086000611cff612564565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611dac612564565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611df191906140f0565b60405180910390a35050565b600d5481565b611e0b612564565b73ffffffffffffffffffffffffffffffffffffffff16611e29611a32565b73ffffffffffffffffffffffffffffffffffffffff1614611e7f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e7690614228565b60405180910390fd5b60026009541415611ec5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ebc906142a8565b60405180910390fd5b600260098190555060003373ffffffffffffffffffffffffffffffffffffffff1647604051611ef390614074565b60006040518083038185875af1925050503d8060008114611f30576040519150601f19603f3d011682016040523d82523d6000602084013e611f35565b606091505b5050905080611f79576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f7090614268565b60405180910390fd5b506001600981905550565b611f8f84848461261e565b611f9b84848484612e4f565b611fd1576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b600e60039054906101000a900460ff1681565b600b6020528060005260406000206000915054906101000a900460ff1681565b612012612564565b73ffffffffffffffffffffffffffffffffffffffff16612030611a32565b73ffffffffffffffffffffffffffffffffffffffff1614612086576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161207d90614228565b60405180910390fd5b600e60029054906101000a900460ff1615600e60026101000a81548160ff021916908315150217905550565b60606120bd82612529565b6120f3576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006120fd612fdd565b905060008151141561211e5760405180602001604052806000815250612149565b806121288461306f565b604051602001612139929190614050565b6040516020818303038152906040525b915050919050565b7f000000000000000000000000000000000000000000000000000000000000045781565b6000612180826131d0565b9050919050565b600c6020528060005260406000206000915054906101000a900460ff1681565b6000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600e60009054906101000a900460ff1681565b612256612564565b73ffffffffffffffffffffffffffffffffffffffff16612274611a32565b73ffffffffffffffffffffffffffffffffffffffff16146122ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122c190614228565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561233a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161233190614188565b60405180910390fd5b61234381612d8b565b50565b61234e612564565b73ffffffffffffffffffffffffffffffffffffffff1661236c611a32565b73ffffffffffffffffffffffffffffffffffffffff16146123c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123b990614228565b60405180910390fd5b80600d8190555050565b6123d4612564565b73ffffffffffffffffffffffffffffffffffffffff166123f2611a32565b73ffffffffffffffffffffffffffffffffffffffff1614612448576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161243f90614228565b60405180910390fd5b600e60019054906101000a900460ff1615600e60016101000a81548160ff021916908315150217905550565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600081836124ec919061447b565b905092915050565b60008261250185846132a0565b1490509392505050565b612525828260405180602001604052806000815250613353565b5050565b60006001548210801561255d575060056000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b600033905090565b826007600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600061262982612b0f565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff16612650612564565b73ffffffffffffffffffffffffffffffffffffffff1614806126835750612682826000015161267d612564565b6121a7565b5b806126c85750612691612564565b73ffffffffffffffffffffffffffffffffffffffff166126b084610dcb565b73ffffffffffffffffffffffffffffffffffffffff16145b905080612701576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff161461276a576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156127d1576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6127de8585856001613365565b6127ee600084846000015161256c565b6001600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550836005600085815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426005600085815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600184019050600073ffffffffffffffffffffffffffffffffffffffff166005600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415612a9f57600154811015612a9e5782600001516005600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082602001516005600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b50828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612b08858585600161336b565b5050505050565b612b17613742565b6000829050600154811015612d54576000600560008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff16151515158152505090508060400151612d5257600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612c36578092505050612d86565b5b600115612d5157818060019003925050600560008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612d4c578092505050612d86565b612c37565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000612e708473ffffffffffffffffffffffffffffffffffffffff16613371565b15612fd0578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612e99612564565b8786866040518563ffffffff1660e01b8152600401612ebb94939291906140a4565b602060405180830381600087803b158015612ed557600080fd5b505af1925050508015612f0657506040513d601f19601f82011682018060405250810190612f039190613be3565b60015b612f80573d8060008114612f36576040519150601f19603f3d011682016040523d82523d6000602084013e612f3b565b606091505b50600081511415612f78576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612fd5565b600190505b949350505050565b606060118054612fec906145ea565b80601f0160208091040260200160405190810160405280929190818152602001828054613018906145ea565b80156130655780601f1061303a57610100808354040283529160200191613065565b820191906000526020600020905b81548152906001019060200180831161304857829003601f168201915b5050505050905090565b606060008214156130b7576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506131cb565b600082905060005b600082146130e95780806130d29061464d565b915050600a826130e2919061444a565b91506130bf565b60008167ffffffffffffffff811115613105576131046147b1565b5b6040519080825280601f01601f1916602001820160405280156131375781602001600182028036833780820191505090505b5090505b600085146131c45760018261315091906144d5565b9150600a8561315f91906146c4565b603061316b91906143bd565b60f81b81838151811061318157613180614782565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856131bd919061444a565b945061313b565b8093505050505b919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613238576040517f35ebb31900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160089054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b60008082905060005b84518110156133485760008582815181106132c7576132c6614782565b5b602002602001015190508083116133085782816040516020016132eb929190614024565b604051602081830303815290604052805190602001209250613334565b808360405160200161331b929190614024565b6040516020818303038152906040528051906020012092505b5080806133409061464d565b9150506132a9565b508091505092915050565b6133608383836001613384565b505050565b50505050565b50505050565b600080823b905060008111915050919050565b60006001549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614156133f2576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600084141561342d576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61343a6000868387613365565b83600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846005600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426005600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600081905060005b8581101561369f57818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a483801561365357506136516000888488612e4f565b155b1561368a576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b818060010192505080806001019150506135d8565b5080600181905550506136b5600086838761336b565b5050505050565b8280546136c8906145ea565b90600052602060002090601f0160209004810192826136ea5760008555613731565b82601f1061370357803560ff1916838001178555613731565b82800160010185558215613731579182015b82811115613730578235825591602001919060010190613715565b5b50905061373e9190613785565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b8082111561379e576000816000905550600101613786565b5090565b60006137b56137b08461433e565b614319565b9050828152602081018484840111156137d1576137d06147ef565b5b6137dc8482856145a8565b509392505050565b6000813590506137f381614a7d565b92915050565b60008083601f84011261380f5761380e6147e5565b5b8235905067ffffffffffffffff81111561382c5761382b6147e0565b5b602083019150836020820283011115613848576138476147ea565b5b9250929050565b60008135905061385e81614a94565b92915050565b60008135905061387381614aab565b92915050565b60008135905061388881614ac2565b92915050565b60008151905061389d81614ac2565b92915050565b600082601f8301126138b8576138b76147e5565b5b81356138c88482602086016137a2565b91505092915050565b60008083601f8401126138e7576138e66147e5565b5b8235905067ffffffffffffffff811115613904576139036147e0565b5b6020830191508360018202830111156139205761391f6147ea565b5b9250929050565b60008135905061393681614ad9565b92915050565b60008151905061394b81614ad9565b92915050565b60008135905061396081614af0565b92915050565b60006020828403121561397c5761397b6147f9565b5b600061398a848285016137e4565b91505092915050565b600080604083850312156139aa576139a96147f9565b5b60006139b8858286016137e4565b92505060206139c9858286016137e4565b9150509250929050565b6000806000606084860312156139ec576139eb6147f9565b5b60006139fa868287016137e4565b9350506020613a0b868287016137e4565b9250506040613a1c86828701613927565b9150509250925092565b60008060008060808587031215613a4057613a3f6147f9565b5b6000613a4e878288016137e4565b9450506020613a5f878288016137e4565b9350506040613a7087828801613927565b925050606085013567ffffffffffffffff811115613a9157613a906147f4565b5b613a9d878288016138a3565b91505092959194509250565b60008060408385031215613ac057613abf6147f9565b5b6000613ace858286016137e4565b9250506020613adf8582860161384f565b9150509250929050565b60008060408385031215613b0057613aff6147f9565b5b6000613b0e858286016137e4565b9250506020613b1f85828601613927565b9150509250929050565b600080600060408486031215613b4257613b416147f9565b5b600084013567ffffffffffffffff811115613b6057613b5f6147f4565b5b613b6c868287016137f9565b93509350506020613b7f86828701613951565b9150509250925092565b600060208284031215613b9f57613b9e6147f9565b5b6000613bad84828501613864565b91505092915050565b600060208284031215613bcc57613bcb6147f9565b5b6000613bda84828501613879565b91505092915050565b600060208284031215613bf957613bf86147f9565b5b6000613c078482850161388e565b91505092915050565b60008060208385031215613c2757613c266147f9565b5b600083013567ffffffffffffffff811115613c4557613c446147f4565b5b613c51858286016138d1565b92509250509250929050565b600060208284031215613c7357613c726147f9565b5b6000613c8184828501613927565b91505092915050565b600060208284031215613ca057613c9f6147f9565b5b6000613cae8482850161393c565b91505092915050565b613cc081614509565b82525050565b613ccf81614509565b82525050565b613ce6613ce182614509565b614696565b82525050565b613cf58161451b565b82525050565b613d048161451b565b82525050565b613d1381614527565b82525050565b613d2a613d2582614527565b6146a8565b82525050565b6000613d3b8261436f565b613d458185614385565b9350613d558185602086016145b7565b613d5e816147fe565b840191505092915050565b6000613d748261437a565b613d7e81856143a1565b9350613d8e8185602086016145b7565b613d97816147fe565b840191505092915050565b6000613dad8261437a565b613db781856143b2565b9350613dc78185602086016145b7565b80840191505092915050565b6000613de06017836143a1565b9150613deb8261481c565b602082019050919050565b6000613e036020836143a1565b9150613e0e82614845565b602082019050919050565b6000613e266026836143a1565b9150613e318261486e565b604082019050919050565b6000613e49602c836143a1565b9150613e54826148bd565b604082019050919050565b6000613e6c600d836143a1565b9150613e778261490c565b602082019050919050565b6000613e8f601f836143a1565b9150613e9a82614935565b602082019050919050565b6000613eb26018836143a1565b9150613ebd8261495e565b602082019050919050565b6000613ed56020836143a1565b9150613ee082614987565b602082019050919050565b6000613ef86016836143a1565b9150613f03826149b0565b602082019050919050565b6000613f1b600083614396565b9150613f26826149d9565b600082019050919050565b6000613f3e6010836143a1565b9150613f49826149dc565b602082019050919050565b6000613f616024836143a1565b9150613f6c82614a05565b604082019050919050565b6000613f84601f836143a1565b9150613f8f82614a54565b602082019050919050565b606082016000820151613fb06000850182613cb7565b506020820151613fc36020850182613feb565b506040820151613fd66040850182613cec565b50505050565b613fe58161457d565b82525050565b613ff481614587565b82525050565b6140038161459b565b82525050565b60006140158284613cd5565b60148201915081905092915050565b60006140308285613d19565b6020820191506140408284613d19565b6020820191508190509392505050565b600061405c8285613da2565b91506140688284613da2565b91508190509392505050565b600061407f82613f0e565b9150819050919050565b600060208201905061409e6000830184613cc6565b92915050565b60006080820190506140b96000830187613cc6565b6140c66020830186613cc6565b6140d36040830185613fdc565b81810360608301526140e58184613d30565b905095945050505050565b60006020820190506141056000830184613cfb565b92915050565b60006020820190506141206000830184613d0a565b92915050565b600060208201905081810360008301526141408184613d69565b905092915050565b6000602082019050818103600083015261416181613dd3565b9050919050565b6000602082019050818103600083015261418181613df6565b9050919050565b600060208201905081810360008301526141a181613e19565b9050919050565b600060208201905081810360008301526141c181613e3c565b9050919050565b600060208201905081810360008301526141e181613e5f565b9050919050565b6000602082019050818103600083015261420181613e82565b9050919050565b6000602082019050818103600083015261422181613ea5565b9050919050565b6000602082019050818103600083015261424181613ec8565b9050919050565b6000602082019050818103600083015261426181613eeb565b9050919050565b6000602082019050818103600083015261428181613f31565b9050919050565b600060208201905081810360008301526142a181613f54565b9050919050565b600060208201905081810360008301526142c181613f77565b9050919050565b60006060820190506142dd6000830184613f9a565b92915050565b60006020820190506142f86000830184613fdc565b92915050565b60006020820190506143136000830184613ffa565b92915050565b6000614323614334565b905061432f828261461c565b919050565b6000604051905090565b600067ffffffffffffffff821115614359576143586147b1565b5b614362826147fe565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b60006143c88261457d565b91506143d38361457d565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614408576144076146f5565b5b828201905092915050565b600061441e8261459b565b91506144298361459b565b92508260ff0382111561443f5761443e6146f5565b5b828201905092915050565b60006144558261457d565b91506144608361457d565b9250826144705761446f614724565b5b828204905092915050565b60006144868261457d565b91506144918361457d565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156144ca576144c96146f5565b5b828202905092915050565b60006144e08261457d565b91506144eb8361457d565b9250828210156144fe576144fd6146f5565b5b828203905092915050565b60006145148261455d565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600067ffffffffffffffff82169050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b838110156145d55780820151818401526020810190506145ba565b838111156145e4576000848401525b50505050565b6000600282049050600182168061460257607f821691505b6020821081141561461657614615614753565b5b50919050565b614625826147fe565b810181811067ffffffffffffffff82111715614644576146436147b1565b5b80604052505050565b60006146588261457d565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561468b5761468a6146f5565b5b600182019050919050565b60006146a1826146b2565b9050919050565b6000819050919050565b60006146bd8261480f565b9050919050565b60006146cf8261457d565b91506146da8361457d565b9250826146ea576146e9614724565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f57686974656c697374206973206e6f7420616374697665000000000000000000600082015250565b7f596f752063616e2774206d696e742074686174206d616e79206174206f6e6365600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f546869732077616c6c657420646f6573206e6f7420636f6e7461696e2074686560008201527f207269676874204e4654732e0000000000000000000000000000000000000000602082015250565b7f4c696d6974207265616368656400000000000000000000000000000000000000600082015250565b7f45746865722076616c75652073656e74206973206e6f7420636f727265637400600082015250565b7f596f752063616e2774206d696e742074686174206d616e790000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f496e636f7272656374204d65726b6c652050726f6f6600000000000000000000600082015250565b50565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b7f53616c65206d7573742062652061637469766520746f206d696e74206120436860008201527f6572756200000000000000000000000000000000000000000000000000000000602082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b614a8681614509565b8114614a9157600080fd5b50565b614a9d8161451b565b8114614aa857600080fd5b50565b614ab481614527565b8114614abf57600080fd5b50565b614acb81614531565b8114614ad657600080fd5b50565b614ae28161457d565b8114614aed57600080fd5b50565b614af98161459b565b8114614b0457600080fd5b5056fea26469706673582212205d382de8e25edc2af41181747ed91492116a26b3633df11e4ef94fe32d4223c264736f6c63430008070033

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

3ad067f9b885085dec8a056a09c2ac9d8f95f935ef8c6d9806fd608ff6f1cf05

-----Decoded View---------------
Arg [0] : merkleRoot_ (bytes32): 0x3ad067f9b885085dec8a056a09c2ac9d8f95f935ef8c6d9806fd608ff6f1cf05

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 3ad067f9b885085dec8a056a09c2ac9d8f95f935ef8c6d9806fd608ff6f1cf05


Deployed Bytecode Sourcemap

70333:5499:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30045:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71508:907;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;70807:44;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33405:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34908:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34471:371;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29702:271;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;72423:657;;;:::i;:::-;;35765:170;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;71312:188;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;70531:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73615:89;;;;;;;;;;;;;:::i;:::-;;36006:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;70763:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;74598:106;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33214:124;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30414:206;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2709:103;;;;;;;;;;;;;:::i;:::-;;73953:454;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;74712:106;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;75426:403;;;:::i;:::-;;70434:48;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2058:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;75146:167;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73088:519;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33574:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35184:279;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;70678:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;74826:191;;;;;;;;;;;;;:::i;:::-;;36262:342;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;70860:44;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70565:48;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73824:121;;;;;;;;;;;;;:::i;:::-;;33749:318;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70489:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;75025:113;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70620:49;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35534:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70724:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2967:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;75321:97;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;73712:104;;;;;;;;;;;;;:::i;:::-;;30045:305;30147:4;30199:25;30184:40;;;:11;:40;;;;:105;;;;30256:33;30241:48;;;:11;:48;;;;30184:105;:158;;;;30306:36;30330:11;30306:23;:36::i;:::-;30184:158;30164:178;;30045:305;;;:::o;71508:907::-;71647:17;;;;;;;;;;;71639:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;71757:9;71725:28;71738:14;71725:28;;:8;;:12;;:28;;;;:::i;:::-;:41;;71703:122;;;;;;;;;;;;:::i;:::-;;;;;;;;;71838:17;71888:14;71858:15;:27;71874:10;71858:27;;;;;;;;;;;;;;;;;;;;;;;;;:44;;;;:::i;:::-;71838:64;;71950:27;;;;;;;;;;;71935:42;;:11;:42;;;;71913:116;;;;;;;;;;;;:::i;:::-;;;;;;;;;72042:12;72084:10;72067:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;72057:39;;;;;;72042:54;;72183:4;72129:58;;:50;72148:12;;72129:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;72162:10;;72174:4;72129:18;:50::i;:::-;:58;;;72107:130;;;;;;;;;;;;:::i;:::-;;;;;;;;;72280:11;72250:15;:27;72266:10;72250:27;;;;;;;;;;;;;;;;:41;;;;;;;;;;;;;;;;;;72304:37;72314:10;72326:14;72304:37;;:9;:37::i;:::-;72379:10;72362:13;:11;:13::i;:::-;:27;;72354:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;71628:787;;71508:907;;;:::o;70807:44::-;;;;;;;;;;;;;:::o;33405:100::-;33459:13;33492:5;33485:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33405:100;:::o;34908:204::-;34976:7;35001:16;35009:7;35001;:16::i;:::-;34996:64;;35026:34;;;;;;;;;;;;;;34996:64;35080:15;:24;35096:7;35080:24;;;;;;;;;;;;;;;;;;;;;35073:31;;34908:204;;;:::o;34471:371::-;34544:13;34560:24;34576:7;34560:15;:24::i;:::-;34544:40;;34605:5;34599:11;;:2;:11;;;34595:48;;;34619:24;;;;;;;;;;;;;;34595:48;34676:5;34660:21;;:12;:10;:12::i;:::-;:21;;;;:63;;;;;34686:37;34703:5;34710:12;:10;:12::i;:::-;34686:16;:37::i;:::-;34685:38;34660:63;34656:138;;;34747:35;;;;;;;;;;;;;;34656:138;34806:28;34815:2;34819:7;34828:5;34806:8;:28::i;:::-;34533:309;34471:371;;:::o;29702:271::-;29746:7;29938:12;;29922:13;;:28;29915:35;;29702:271;:::o;72423:657::-;72503:24;;;;;;;;;;;72481:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;72622:9;72610:8;;:21;;72602:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;72700:25;72714:10;72700:13;:25::i;:::-;72678:119;;;;;;;;;;;;:::i;:::-;;;;;;;;;72865:5;72832:38;;:17;:29;72850:10;72832:29;;;;;;;;;;;;;;;;;;;;;;;;;:38;;;72810:112;;;;;;;;;;;;:::i;:::-;;;;;;;;;72965:4;72933:17;:29;72951:10;72933:29;;;;;;;;;;;;;;;;:36;;;;;;;;;;;;;;;;;;72982:24;72992:10;73004:1;72982:9;:24::i;:::-;73044:10;73027:13;:11;:13::i;:::-;:27;;73019:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;72423:657::o;35765:170::-;35899:28;35909:4;35915:2;35919:7;35899:9;:28::i;:::-;35765:170;;;:::o;71312:188::-;2289:12;:10;:12::i;:::-;2278:23;;:7;:5;:7::i;:::-;:23;;;2270:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;71391:37:::1;71401:10;71413:14;71391:9;:37::i;:::-;71464:10;71447:13;:11;:13::i;:::-;:27;;71439:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;71312:188:::0;:::o;70531:25::-;;;;:::o;73615:89::-;2289:12;:10;:12::i;:::-;2278:23;;:7;:5;:7::i;:::-;:23;;;2270:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;73684:12:::1;;;;;;;;;;;73683:13;73668:12;;:28;;;;;;;;;;;;;;;;;;73615:89::o:0;36006:185::-;36144:39;36161:4;36167:2;36171:7;36144:39;;;;;;;;;;;;:16;:39::i;:::-;36006:185;;;:::o;70763:37::-;;;;;;;;;;;;;:::o;74598:106::-;2289:12;:10;:12::i;:::-;2278:23;;:7;:5;:7::i;:::-;:23;;;2270:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;74689:7:::1;;74673:13;:23;;;;;;;:::i;:::-;;74598:106:::0;;:::o;33214:124::-;33278:7;33305:20;33317:7;33305:11;:20::i;:::-;:25;;;33298:32;;33214:124;;;:::o;30414:206::-;30478:7;30519:1;30502:19;;:5;:19;;;30498:60;;;30530:28;;;;;;;;;;;;;;30498:60;30584:12;:19;30597:5;30584:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;30576:36;;30569:43;;30414:206;;;:::o;2709:103::-;2289:12;:10;:12::i;:::-;2278:23;;:7;:5;:7::i;:::-;:23;;;2270:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2774:30:::1;2801:1;2774:18;:30::i;:::-;2709:103::o:0;73953:454::-;74011:4;74028:14;74046:42;74028:60;;74099:13;74117:42;74099:60;;74170:15;74188:42;74170:60;;74296:1;74270:6;74263:24;;;74288:4;74263:30;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:34;:86;;;;74348:1;74321:7;74314:25;;;74340:4;74314:31;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:35;74263:86;:136;;;;74398:1;74373:5;74366:23;;;74390:4;74366:29;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:33;74263:136;74243:156;;;;;73953:454;;;:::o;74712:106::-;2289:12;:10;:12::i;:::-;2278:23;;:7;:5;:7::i;:::-;:23;;;2270:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;74799:11:::1;74786:10;:24;;;;74712:106:::0;:::o;75426:403::-;2289:12;:10;:12::i;:::-;2278:23;;:7;:5;:7::i;:::-;:23;;;2270:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;75485:15:::1;75536:5;75528:4;75504:21;:28;;;;:::i;:::-;75503:38;;;;:::i;:::-;75485:56;;75552:11;75599:5;75591:4;75567:21;:28;;;;:::i;:::-;75566:38;;;;:::i;:::-;75552:52;;75615:11;75662:5;75654:4;75630:21;:28;;;;:::i;:::-;75629:38;;;;:::i;:::-;75615:52;;75696:13;;;;;;;;;;;75688:27;;:36;75716:7;75688:36;;;;;;;;;;;;;;;;;;;;;;;75680:45;;;::::0;::::1;;75752:9;;;;;;;;;;;75744:23;;:28;75768:3;75744:28;;;;;;;;;;;;;;;;;;;;;;;75736:37;;;::::0;::::1;;75800:9;;;;;;;;;;;75792:23;;:28;75816:3;75792:28;;;;;;;;;;;;;;;;;;;;;;;75784:37;;;::::0;::::1;;75474:355;;;75426:403::o:0;70434:48::-;;;:::o;2058:87::-;2104:7;2131:6;;;;;;;;;;;2124:13;;2058:87;:::o;75146:167::-;75239:21;;:::i;:::-;75285:20;75297:7;75285:11;:20::i;:::-;75278:27;;75146:167;;;:::o;73088:519::-;73163:12;;;;;;;;;;;73155:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;73267:23;73249:14;:41;;73227:123;;;;;;;;;;;;:::i;:::-;;;;;;;;;73415:9;73383:28;73396:14;73383:8;;:12;;:28;;;;:::i;:::-;:41;;73361:122;;;;;;;;;;;;:::i;:::-;;;;;;;;;73496:37;73506:10;73518:14;73496:9;:37::i;:::-;73571:10;73554:13;:11;:13::i;:::-;:27;;73546:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;73088:519;:::o;33574:104::-;33630:13;33663:7;33656:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33574:104;:::o;35184:279::-;35287:12;:10;:12::i;:::-;35275:24;;:8;:24;;;35271:54;;;35308:17;;;;;;;;;;;;;;35271:54;35383:8;35338:18;:32;35357:12;:10;:12::i;:::-;35338:32;;;;;;;;;;;;;;;:42;35371:8;35338:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;35436:8;35407:48;;35422:12;:10;:12::i;:::-;35407:48;;;35446:8;35407:48;;;;;;:::i;:::-;;;;;;;;35184:279;;:::o;70678:37::-;;;;:::o;74826:191::-;2289:12;:10;:12::i;:::-;2278:23;;:7;:5;:7::i;:::-;:23;;;2270:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;5346:1:::1;5944:7;;:19;;5936:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;5346:1;6077:7;:18;;;;74895:12:::2;74913:10;:15;;74936:21;74913:49;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;74894:68;;;74981:7;74973:36;;;;;;;;;;;;:::i;:::-;;;;;;;;;74883:134;5302:1:::1;6256:7;:22;;;;74826:191::o:0;36262:342::-;36429:28;36439:4;36445:2;36449:7;36429:9;:28::i;:::-;36473:48;36496:4;36502:2;36506:7;36515:5;36473:22;:48::i;:::-;36468:129;;36545:40;;;;;;;;;;;;;;36468:129;36262:342;;;;:::o;70860:44::-;;;;;;;;;;;;;:::o;70565:48::-;;;;;;;;;;;;;;;;;;;;;;:::o;73824:121::-;2289:12;:10;:12::i;:::-;2278:23;;:7;:5;:7::i;:::-;:23;;;2270:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;73913:24:::1;;;;;;;;;;;73912:25;73885:24;;:52;;;;;;;;;;;;;;;;;;73824:121::o:0;33749:318::-;33822:13;33853:16;33861:7;33853;:16::i;:::-;33848:59;;33878:29;;;;;;;;;;;;;;33848:59;33920:21;33944:10;:8;:10::i;:::-;33920:34;;33997:1;33978:7;33972:21;:26;;:87;;;;;;;;;;;;;;;;;34025:7;34034:18;:7;:16;:18::i;:::-;34008:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;33972:87;33965:94;;;33749:318;;;:::o;70489:35::-;;;:::o;75025:113::-;75083:7;75110:20;75124:5;75110:13;:20::i;:::-;75103:27;;75025:113;;;:::o;70620:49::-;;;;;;;;;;;;;;;;;;;;;;:::o;35534:164::-;35631:4;35655:18;:25;35674:5;35655:25;;;;;;;;;;;;;;;:35;35681:8;35655:35;;;;;;;;;;;;;;;;;;;;;;;;;35648:42;;35534:164;;;;:::o;70724:32::-;;;;;;;;;;;;;:::o;2967:201::-;2289:12;:10;:12::i;:::-;2278:23;;:7;:5;:7::i;:::-;:23;;;2270:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;3076:1:::1;3056:22;;:8;:22;;;;3048:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;3132:28;3151:8;3132:18;:28::i;:::-;2967:201:::0;:::o;75321:97::-;2289:12;:10;:12::i;:::-;2278:23;;:7;:5;:7::i;:::-;:23;;;2270:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;75402:8:::1;75391;:19;;;;75321:97:::0;:::o;73712:104::-;2289:12;:10;:12::i;:::-;2278:23;;:7;:5;:7::i;:::-;:23;;;2270:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;73791:17:::1;;;;;;;;;;;73790:18;73770:17;;:38;;;;;;;;;;;;;;;;;;73712:104::o:0;26177:157::-;26262:4;26301:25;26286:40;;;:11;:40;;;;26279:47;;26177:157;;;:::o;52989:98::-;53047:7;53078:1;53074;:5;;;;:::i;:::-;53067:12;;52989:98;;;;:::o;48121:190::-;48246:4;48299;48270:25;48283:5;48290:4;48270:12;:25::i;:::-;:33;48263:40;;48121:190;;;;;:::o;37011:104::-;37080:27;37090:2;37094:8;37080:27;;;;;;;;;;;;:9;:27::i;:::-;37011:104;;:::o;36859:144::-;36916:4;36950:13;;36940:7;:23;:55;;;;;36968:11;:20;36980:7;36968:20;;;;;;;;;;;:27;;;;;;;;;;;;36967:28;36940:55;36933:62;;36859:144;;;:::o;778:98::-;831:7;858:10;851:17;;778:98;:::o;44065:196::-;44207:2;44180:15;:24;44196:7;44180:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;44245:7;44241:2;44225:28;;44234:5;44225:28;;;;;;;;;;;;44065:196;;;:::o;39566:2112::-;39681:35;39719:20;39731:7;39719:11;:20::i;:::-;39681:58;;39752:22;39794:13;:18;;;39778:34;;:12;:10;:12::i;:::-;:34;;;:101;;;;39829:50;39846:13;:18;;;39866:12;:10;:12::i;:::-;39829:16;:50::i;:::-;39778:101;:154;;;;39920:12;:10;:12::i;:::-;39896:36;;:20;39908:7;39896:11;:20::i;:::-;:36;;;39778:154;39752:181;;39951:17;39946:66;;39977:35;;;;;;;;;;;;;;39946:66;40049:4;40027:26;;:13;:18;;;:26;;;40023:67;;40062:28;;;;;;;;;;;;;;40023:67;40119:1;40105:16;;:2;:16;;;40101:52;;;40130:23;;;;;;;;;;;;;;40101:52;40166:43;40188:4;40194:2;40198:7;40207:1;40166:21;:43::i;:::-;40274:49;40291:1;40295:7;40304:13;:18;;;40274:8;:49::i;:::-;40649:1;40619:12;:18;40632:4;40619:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40693:1;40665:12;:16;40678:2;40665:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40739:2;40711:11;:20;40723:7;40711:20;;;;;;;;;;;:25;;;:30;;;;;;;;;;;;;;;;;;40801:15;40756:11;:20;40768:7;40756:20;;;;;;;;;;;:35;;;:61;;;;;;;;;;;;;;;;;;41069:19;41101:1;41091:7;:11;41069:33;;41162:1;41121:43;;:11;:24;41133:11;41121:24;;;;;;;;;;;:29;;;;;;;;;;;;:43;;;41117:445;;;41346:13;;41332:11;:27;41328:219;;;41416:13;:18;;;41384:11;:24;41396:11;41384:24;;;;;;;;;;;:29;;;:50;;;;;;;;;;;;;;;;;;41499:13;:28;;;41457:11;:24;41469:11;41457:24;;;;;;;;;;;:39;;;:70;;;;;;;;;;;;;;;;;;41328:219;41117:445;40594:979;41609:7;41605:2;41590:27;;41599:4;41590:27;;;;;;;;;;;;41628:42;41649:4;41655:2;41659:7;41668:1;41628:20;:42::i;:::-;39670:2008;;39566:2112;;;:::o;32069:1083::-;32130:21;;:::i;:::-;32164:12;32179:7;32164:22;;32235:13;;32228:4;:20;32224:861;;;32269:31;32303:11;:17;32315:4;32303:17;;;;;;;;;;;32269:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32344:9;:16;;;32339:731;;32415:1;32389:28;;:9;:14;;;:28;;;32385:101;;32453:9;32446:16;;;;;;32385:101;32790:261;32797:4;32790:261;;;32830:6;;;;;;;;32875:11;:17;32887:4;32875:17;;;;;;;;;;;32863:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32949:1;32923:28;;:9;:14;;;:28;;;32919:109;;32991:9;32984:16;;;;;;32919:109;32790:261;;;32339:731;32250:835;32224:861;33113:31;;;;;;;;;;;;;;32069:1083;;;;:::o;3328:191::-;3402:16;3421:6;;;;;;;;;;;3402:25;;3447:8;3438:6;;:17;;;;;;;;;;;;;;;;;;3502:8;3471:40;;3492:8;3471:40;;;;;;;;;;;;3391:128;3328:191;:::o;44826:790::-;44981:4;45002:15;:2;:13;;;:15::i;:::-;44998:611;;;45054:2;45038:36;;;45075:12;:10;:12::i;:::-;45089:4;45095:7;45104:5;45038:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;45034:520;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45301:1;45284:6;:13;:18;45280:259;;;45334:40;;;;;;;;;;;;;;45280:259;45489:6;45483:13;45474:6;45470:2;45466:15;45459:38;45034:520;45171:45;;;45161:55;;;:6;:55;;;;45154:62;;;;;44998:611;45593:4;45586:11;;44826:790;;;;;;;:::o;74476:114::-;74536:13;74569;74562:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;74476:114;:::o;23547:723::-;23603:13;23833:1;23824:5;:10;23820:53;;;23851:10;;;;;;;;;;;;;;;;;;;;;23820:53;23883:12;23898:5;23883:20;;23914:14;23939:78;23954:1;23946:4;:9;23939:78;;23972:8;;;;;:::i;:::-;;;;24003:2;23995:10;;;;;:::i;:::-;;;23939:78;;;24027:19;24059:6;24049:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24027:39;;24077:154;24093:1;24084:5;:10;24077:154;;24121:1;24111:11;;;;;:::i;:::-;;;24188:2;24180:5;:10;;;;:::i;:::-;24167:2;:24;;;;:::i;:::-;24154:39;;24137:6;24144;24137:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;24217:2;24208:11;;;;;:::i;:::-;;;24077:154;;;24255:6;24241:21;;;;;23547:723;;;;:::o;30702:207::-;30763:7;30804:1;30787:19;;:5;:19;;;30783:59;;;30815:27;;;;;;;;;;;;;;30783:59;30868:12;:19;30881:5;30868:19;;;;;;;;;;;;;;;:32;;;;;;;;;;;;30860:41;;30853:48;;30702:207;;;:::o;48673:701::-;48756:7;48776:20;48799:4;48776:27;;48819:9;48814:523;48838:5;:12;48834:1;:16;48814:523;;;48872:20;48895:5;48901:1;48895:8;;;;;;;;:::i;:::-;;;;;;;;48872:31;;48938:12;48922;:28;48918:408;;49092:12;49106;49075:44;;;;;;;;;:::i;:::-;;;;;;;;;;;;;49065:55;;;;;;49050:70;;48918:408;;;49282:12;49296;49265:44;;;;;;;;;:::i;:::-;;;;;;;;;;;;;49255:55;;;;;;49240:70;;48918:408;48857:480;48852:3;;;;;:::i;:::-;;;;48814:523;;;;49354:12;49347:19;;;48673:701;;;;:::o;37478:163::-;37601:32;37607:2;37611:8;37621:5;37628:4;37601:5;:32::i;:::-;37478:163;;;:::o;46264:159::-;;;;;:::o;47082:158::-;;;;;:::o;15843:387::-;15903:4;16111:12;16178:7;16166:20;16158:28;;16221:1;16214:4;:8;16207:15;;;15843:387;;;:::o;37900:1412::-;38039:20;38062:13;;38039:36;;38104:1;38090:16;;:2;:16;;;38086:48;;;38115:19;;;;;;;;;;;;;;38086:48;38161:1;38149:8;:13;38145:44;;;38171:18;;;;;;;;;;;;;;38145:44;38202:61;38232:1;38236:2;38240:12;38254:8;38202:21;:61::i;:::-;38575:8;38540:12;:16;38553:2;38540:16;;;;;;;;;;;;;;;:24;;;:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38639:8;38599:12;:16;38612:2;38599:16;;;;;;;;;;;;;;;:29;;;:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38698:2;38665:11;:25;38677:12;38665:25;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;38765:15;38715:11;:25;38727:12;38715:25;;;;;;;;;;;:40;;;:66;;;;;;;;;;;;;;;;;;38798:20;38821:12;38798:35;;38855:9;38850:328;38870:8;38866:1;:12;38850:328;;;38934:12;38930:2;38909:38;;38926:1;38909:38;;;;;;;;;;;;38970:4;:68;;;;;38979:59;39010:1;39014:2;39018:12;39032:5;38979:22;:59::i;:::-;38978:60;38970:68;38966:164;;;39070:40;;;;;;;;;;;;;;38966:164;39148:14;;;;;;;38880:3;;;;;;;38850:328;;;;39210:12;39194:13;:28;;;;38515:719;39244:60;39273:1;39277:2;39281:12;39295:8;39244:20;:60::i;:::-;38028:1284;37900:1412;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::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:139::-;469:5;507:6;494:20;485:29;;523:33;550:5;523:33;:::i;:::-;423:139;;;;:::o;585:568::-;658:8;668:6;718:3;711:4;703:6;699:17;695:27;685:122;;726:79;;:::i;:::-;685:122;839:6;826:20;816:30;;869:18;861:6;858:30;855:117;;;891:79;;:::i;:::-;855:117;1005:4;997:6;993:17;981:29;;1059:3;1051:4;1043:6;1039:17;1029:8;1025:32;1022:41;1019:128;;;1066:79;;:::i;:::-;1019:128;585:568;;;;;:::o;1159:133::-;1202:5;1240:6;1227:20;1218:29;;1256:30;1280:5;1256:30;:::i;:::-;1159:133;;;;:::o;1298:139::-;1344:5;1382:6;1369:20;1360:29;;1398:33;1425:5;1398:33;:::i;:::-;1298:139;;;;:::o;1443:137::-;1488:5;1526:6;1513:20;1504:29;;1542:32;1568:5;1542:32;:::i;:::-;1443:137;;;;:::o;1586:141::-;1642:5;1673:6;1667:13;1658:22;;1689:32;1715:5;1689:32;:::i;:::-;1586:141;;;;:::o;1746:338::-;1801:5;1850:3;1843:4;1835:6;1831:17;1827:27;1817:122;;1858:79;;:::i;:::-;1817:122;1975:6;1962:20;2000:78;2074:3;2066:6;2059:4;2051:6;2047:17;2000:78;:::i;:::-;1991:87;;1807:277;1746:338;;;;:::o;2104:553::-;2162:8;2172:6;2222:3;2215:4;2207:6;2203:17;2199:27;2189:122;;2230:79;;:::i;:::-;2189:122;2343:6;2330:20;2320:30;;2373:18;2365:6;2362:30;2359:117;;;2395:79;;:::i;:::-;2359:117;2509:4;2501:6;2497:17;2485:29;;2563:3;2555:4;2547:6;2543:17;2533:8;2529:32;2526:41;2523:128;;;2570:79;;:::i;:::-;2523:128;2104:553;;;;;:::o;2663:139::-;2709:5;2747:6;2734:20;2725:29;;2763:33;2790:5;2763:33;:::i;:::-;2663:139;;;;:::o;2808:143::-;2865:5;2896:6;2890:13;2881:22;;2912:33;2939:5;2912:33;:::i;:::-;2808:143;;;;:::o;2957:135::-;3001:5;3039:6;3026:20;3017:29;;3055:31;3080:5;3055:31;:::i;:::-;2957:135;;;;:::o;3098:329::-;3157:6;3206:2;3194:9;3185:7;3181:23;3177:32;3174:119;;;3212:79;;:::i;:::-;3174:119;3332:1;3357:53;3402:7;3393:6;3382:9;3378:22;3357:53;:::i;:::-;3347:63;;3303:117;3098:329;;;;:::o;3433:474::-;3501:6;3509;3558:2;3546:9;3537:7;3533:23;3529:32;3526:119;;;3564:79;;:::i;:::-;3526:119;3684:1;3709:53;3754:7;3745:6;3734:9;3730:22;3709:53;:::i;:::-;3699:63;;3655:117;3811:2;3837:53;3882:7;3873:6;3862:9;3858:22;3837:53;:::i;:::-;3827:63;;3782:118;3433:474;;;;;:::o;3913:619::-;3990:6;3998;4006;4055:2;4043:9;4034:7;4030:23;4026:32;4023:119;;;4061:79;;:::i;:::-;4023:119;4181:1;4206:53;4251:7;4242:6;4231:9;4227:22;4206:53;:::i;:::-;4196:63;;4152:117;4308:2;4334:53;4379:7;4370:6;4359:9;4355:22;4334:53;:::i;:::-;4324:63;;4279:118;4436:2;4462:53;4507:7;4498:6;4487:9;4483:22;4462:53;:::i;:::-;4452:63;;4407:118;3913:619;;;;;:::o;4538:943::-;4633:6;4641;4649;4657;4706:3;4694:9;4685:7;4681:23;4677:33;4674:120;;;4713:79;;:::i;:::-;4674:120;4833:1;4858:53;4903:7;4894:6;4883:9;4879:22;4858:53;:::i;:::-;4848:63;;4804:117;4960:2;4986:53;5031:7;5022:6;5011:9;5007:22;4986:53;:::i;:::-;4976:63;;4931:118;5088:2;5114:53;5159:7;5150:6;5139:9;5135:22;5114:53;:::i;:::-;5104:63;;5059:118;5244:2;5233:9;5229:18;5216:32;5275:18;5267:6;5264:30;5261:117;;;5297:79;;:::i;:::-;5261:117;5402:62;5456:7;5447:6;5436:9;5432:22;5402:62;:::i;:::-;5392:72;;5187:287;4538:943;;;;;;;:::o;5487:468::-;5552:6;5560;5609:2;5597:9;5588:7;5584:23;5580:32;5577:119;;;5615:79;;:::i;:::-;5577:119;5735:1;5760:53;5805:7;5796:6;5785:9;5781:22;5760:53;:::i;:::-;5750:63;;5706:117;5862:2;5888:50;5930:7;5921:6;5910:9;5906:22;5888:50;:::i;:::-;5878:60;;5833:115;5487:468;;;;;:::o;5961:474::-;6029:6;6037;6086:2;6074:9;6065:7;6061:23;6057:32;6054:119;;;6092:79;;:::i;:::-;6054:119;6212:1;6237:53;6282:7;6273:6;6262:9;6258:22;6237:53;:::i;:::-;6227:63;;6183:117;6339:2;6365:53;6410:7;6401:6;6390:9;6386:22;6365:53;:::i;:::-;6355:63;;6310:118;5961:474;;;;;:::o;6441:700::-;6534:6;6542;6550;6599:2;6587:9;6578:7;6574:23;6570:32;6567:119;;;6605:79;;:::i;:::-;6567:119;6753:1;6742:9;6738:17;6725:31;6783:18;6775:6;6772:30;6769:117;;;6805:79;;:::i;:::-;6769:117;6918:80;6990:7;6981:6;6970:9;6966:22;6918:80;:::i;:::-;6900:98;;;;6696:312;7047:2;7073:51;7116:7;7107:6;7096:9;7092:22;7073:51;:::i;:::-;7063:61;;7018:116;6441:700;;;;;:::o;7147:329::-;7206:6;7255:2;7243:9;7234:7;7230:23;7226:32;7223:119;;;7261:79;;:::i;:::-;7223:119;7381:1;7406:53;7451:7;7442:6;7431:9;7427:22;7406:53;:::i;:::-;7396:63;;7352:117;7147:329;;;;:::o;7482:327::-;7540:6;7589:2;7577:9;7568:7;7564:23;7560:32;7557:119;;;7595:79;;:::i;:::-;7557:119;7715:1;7740:52;7784:7;7775:6;7764:9;7760:22;7740:52;:::i;:::-;7730:62;;7686:116;7482:327;;;;:::o;7815:349::-;7884:6;7933:2;7921:9;7912:7;7908:23;7904:32;7901:119;;;7939:79;;:::i;:::-;7901:119;8059:1;8084:63;8139:7;8130:6;8119:9;8115:22;8084:63;:::i;:::-;8074:73;;8030:127;7815:349;;;;:::o;8170:529::-;8241:6;8249;8298:2;8286:9;8277:7;8273:23;8269:32;8266:119;;;8304:79;;:::i;:::-;8266:119;8452:1;8441:9;8437:17;8424:31;8482:18;8474:6;8471:30;8468:117;;;8504:79;;:::i;:::-;8468:117;8617:65;8674:7;8665:6;8654:9;8650:22;8617:65;:::i;:::-;8599:83;;;;8395:297;8170:529;;;;;:::o;8705:329::-;8764:6;8813:2;8801:9;8792:7;8788:23;8784:32;8781:119;;;8819:79;;:::i;:::-;8781:119;8939:1;8964:53;9009:7;9000:6;8989:9;8985:22;8964:53;:::i;:::-;8954:63;;8910:117;8705:329;;;;:::o;9040:351::-;9110:6;9159:2;9147:9;9138:7;9134:23;9130:32;9127:119;;;9165:79;;:::i;:::-;9127:119;9285:1;9310:64;9366:7;9357:6;9346:9;9342:22;9310:64;:::i;:::-;9300:74;;9256:128;9040:351;;;;:::o;9397:108::-;9474:24;9492:5;9474:24;:::i;:::-;9469:3;9462:37;9397:108;;:::o;9511:118::-;9598:24;9616:5;9598:24;:::i;:::-;9593:3;9586:37;9511:118;;:::o;9635:157::-;9740:45;9760:24;9778:5;9760:24;:::i;:::-;9740:45;:::i;:::-;9735:3;9728:58;9635:157;;:::o;9798:99::-;9869:21;9884:5;9869:21;:::i;:::-;9864:3;9857:34;9798:99;;:::o;9903:109::-;9984:21;9999:5;9984:21;:::i;:::-;9979:3;9972:34;9903:109;;:::o;10018:118::-;10105:24;10123:5;10105:24;:::i;:::-;10100:3;10093:37;10018:118;;:::o;10142:157::-;10247:45;10267:24;10285:5;10267:24;:::i;:::-;10247:45;:::i;:::-;10242:3;10235:58;10142:157;;:::o;10305:360::-;10391:3;10419:38;10451:5;10419:38;:::i;:::-;10473:70;10536:6;10531:3;10473:70;:::i;:::-;10466:77;;10552:52;10597:6;10592:3;10585:4;10578:5;10574:16;10552:52;:::i;:::-;10629:29;10651:6;10629:29;:::i;:::-;10624:3;10620:39;10613:46;;10395:270;10305:360;;;;:::o;10671:364::-;10759:3;10787:39;10820:5;10787:39;:::i;:::-;10842:71;10906:6;10901:3;10842:71;:::i;:::-;10835:78;;10922:52;10967:6;10962:3;10955:4;10948:5;10944:16;10922:52;:::i;:::-;10999:29;11021:6;10999:29;:::i;:::-;10994:3;10990:39;10983:46;;10763:272;10671:364;;;;:::o;11041:377::-;11147:3;11175:39;11208:5;11175:39;:::i;:::-;11230:89;11312:6;11307:3;11230:89;:::i;:::-;11223:96;;11328:52;11373:6;11368:3;11361:4;11354:5;11350:16;11328:52;:::i;:::-;11405:6;11400:3;11396:16;11389:23;;11151:267;11041:377;;;;:::o;11424:366::-;11566:3;11587:67;11651:2;11646:3;11587:67;:::i;:::-;11580:74;;11663:93;11752:3;11663:93;:::i;:::-;11781:2;11776:3;11772:12;11765:19;;11424:366;;;:::o;11796:::-;11938:3;11959:67;12023:2;12018:3;11959:67;:::i;:::-;11952:74;;12035:93;12124:3;12035:93;:::i;:::-;12153:2;12148:3;12144:12;12137:19;;11796:366;;;:::o;12168:::-;12310:3;12331:67;12395:2;12390:3;12331:67;:::i;:::-;12324:74;;12407:93;12496:3;12407:93;:::i;:::-;12525:2;12520:3;12516:12;12509:19;;12168:366;;;:::o;12540:::-;12682:3;12703:67;12767:2;12762:3;12703:67;:::i;:::-;12696:74;;12779:93;12868:3;12779:93;:::i;:::-;12897:2;12892:3;12888:12;12881:19;;12540:366;;;:::o;12912:::-;13054:3;13075:67;13139:2;13134:3;13075:67;:::i;:::-;13068:74;;13151:93;13240:3;13151:93;:::i;:::-;13269:2;13264:3;13260:12;13253:19;;12912:366;;;:::o;13284:::-;13426:3;13447:67;13511:2;13506:3;13447:67;:::i;:::-;13440:74;;13523:93;13612:3;13523:93;:::i;:::-;13641:2;13636:3;13632:12;13625:19;;13284:366;;;:::o;13656:::-;13798:3;13819:67;13883:2;13878:3;13819:67;:::i;:::-;13812:74;;13895:93;13984:3;13895:93;:::i;:::-;14013:2;14008:3;14004:12;13997:19;;13656:366;;;:::o;14028:::-;14170:3;14191:67;14255:2;14250:3;14191:67;:::i;:::-;14184:74;;14267:93;14356:3;14267:93;:::i;:::-;14385:2;14380:3;14376:12;14369:19;;14028:366;;;:::o;14400:::-;14542:3;14563:67;14627:2;14622:3;14563:67;:::i;:::-;14556:74;;14639:93;14728:3;14639:93;:::i;:::-;14757:2;14752:3;14748:12;14741:19;;14400:366;;;:::o;14772:398::-;14931:3;14952:83;15033:1;15028:3;14952:83;:::i;:::-;14945:90;;15044:93;15133:3;15044:93;:::i;:::-;15162:1;15157:3;15153:11;15146:18;;14772:398;;;:::o;15176:366::-;15318:3;15339:67;15403:2;15398:3;15339:67;:::i;:::-;15332:74;;15415:93;15504:3;15415:93;:::i;:::-;15533:2;15528:3;15524:12;15517:19;;15176:366;;;:::o;15548:::-;15690:3;15711:67;15775:2;15770:3;15711:67;:::i;:::-;15704:74;;15787:93;15876:3;15787:93;:::i;:::-;15905:2;15900:3;15896:12;15889:19;;15548:366;;;:::o;15920:::-;16062:3;16083:67;16147:2;16142:3;16083:67;:::i;:::-;16076:74;;16159:93;16248:3;16159:93;:::i;:::-;16277:2;16272:3;16268:12;16261:19;;15920:366;;;:::o;16362:697::-;16521:4;16516:3;16512:14;16608:4;16601:5;16597:16;16591:23;16627:63;16684:4;16679:3;16675:14;16661:12;16627:63;:::i;:::-;16536:164;16792:4;16785:5;16781:16;16775:23;16811:61;16866:4;16861:3;16857:14;16843:12;16811:61;:::i;:::-;16710:172;16966:4;16959:5;16955:16;16949:23;16985:57;17036:4;17031:3;17027:14;17013:12;16985:57;:::i;:::-;16892:160;16490:569;16362:697;;:::o;17065:118::-;17152:24;17170:5;17152:24;:::i;:::-;17147:3;17140:37;17065:118;;:::o;17189:105::-;17264:23;17281:5;17264:23;:::i;:::-;17259:3;17252:36;17189:105;;:::o;17300:112::-;17383:22;17399:5;17383:22;:::i;:::-;17378:3;17371:35;17300:112;;:::o;17418:256::-;17530:3;17545:75;17616:3;17607:6;17545:75;:::i;:::-;17645:2;17640:3;17636:12;17629:19;;17665:3;17658:10;;17418:256;;;;:::o;17680:397::-;17820:3;17835:75;17906:3;17897:6;17835:75;:::i;:::-;17935:2;17930:3;17926:12;17919:19;;17948:75;18019:3;18010:6;17948:75;:::i;:::-;18048:2;18043:3;18039:12;18032:19;;18068:3;18061:10;;17680:397;;;;;:::o;18083:435::-;18263:3;18285:95;18376:3;18367:6;18285:95;:::i;:::-;18278:102;;18397:95;18488:3;18479:6;18397:95;:::i;:::-;18390:102;;18509:3;18502:10;;18083:435;;;;;:::o;18524:379::-;18708:3;18730:147;18873:3;18730:147;:::i;:::-;18723:154;;18894:3;18887:10;;18524:379;;;:::o;18909:222::-;19002:4;19040:2;19029:9;19025:18;19017:26;;19053:71;19121:1;19110:9;19106:17;19097:6;19053:71;:::i;:::-;18909:222;;;;:::o;19137:640::-;19332:4;19370:3;19359:9;19355:19;19347:27;;19384:71;19452:1;19441:9;19437:17;19428:6;19384:71;:::i;:::-;19465:72;19533:2;19522:9;19518:18;19509:6;19465:72;:::i;:::-;19547;19615:2;19604:9;19600:18;19591:6;19547:72;:::i;:::-;19666:9;19660:4;19656:20;19651:2;19640:9;19636:18;19629:48;19694:76;19765:4;19756:6;19694:76;:::i;:::-;19686:84;;19137:640;;;;;;;:::o;19783:210::-;19870:4;19908:2;19897:9;19893:18;19885:26;;19921:65;19983:1;19972:9;19968:17;19959:6;19921:65;:::i;:::-;19783:210;;;;:::o;19999:222::-;20092:4;20130:2;20119:9;20115:18;20107:26;;20143:71;20211:1;20200:9;20196:17;20187:6;20143:71;:::i;:::-;19999:222;;;;:::o;20227:313::-;20340:4;20378:2;20367:9;20363:18;20355:26;;20427:9;20421:4;20417:20;20413:1;20402:9;20398:17;20391:47;20455:78;20528:4;20519:6;20455:78;:::i;:::-;20447:86;;20227:313;;;;:::o;20546:419::-;20712:4;20750:2;20739:9;20735:18;20727:26;;20799:9;20793:4;20789:20;20785:1;20774:9;20770:17;20763:47;20827:131;20953:4;20827:131;:::i;:::-;20819:139;;20546:419;;;:::o;20971:::-;21137:4;21175:2;21164:9;21160:18;21152:26;;21224:9;21218:4;21214:20;21210:1;21199:9;21195:17;21188:47;21252:131;21378:4;21252:131;:::i;:::-;21244:139;;20971:419;;;:::o;21396:::-;21562:4;21600:2;21589:9;21585:18;21577:26;;21649:9;21643:4;21639:20;21635:1;21624:9;21620:17;21613:47;21677:131;21803:4;21677:131;:::i;:::-;21669:139;;21396:419;;;:::o;21821:::-;21987:4;22025:2;22014:9;22010:18;22002:26;;22074:9;22068:4;22064:20;22060:1;22049:9;22045:17;22038:47;22102:131;22228:4;22102:131;:::i;:::-;22094:139;;21821:419;;;:::o;22246:::-;22412:4;22450:2;22439:9;22435:18;22427:26;;22499:9;22493:4;22489:20;22485:1;22474:9;22470:17;22463:47;22527:131;22653:4;22527:131;:::i;:::-;22519:139;;22246:419;;;:::o;22671:::-;22837:4;22875:2;22864:9;22860:18;22852:26;;22924:9;22918:4;22914:20;22910:1;22899:9;22895:17;22888:47;22952:131;23078:4;22952:131;:::i;:::-;22944:139;;22671:419;;;:::o;23096:::-;23262:4;23300:2;23289:9;23285:18;23277:26;;23349:9;23343:4;23339:20;23335:1;23324:9;23320:17;23313:47;23377:131;23503:4;23377:131;:::i;:::-;23369:139;;23096:419;;;:::o;23521:::-;23687:4;23725:2;23714:9;23710:18;23702:26;;23774:9;23768:4;23764:20;23760:1;23749:9;23745:17;23738:47;23802:131;23928:4;23802:131;:::i;:::-;23794:139;;23521:419;;;:::o;23946:::-;24112:4;24150:2;24139:9;24135:18;24127:26;;24199:9;24193:4;24189:20;24185:1;24174:9;24170:17;24163:47;24227:131;24353:4;24227:131;:::i;:::-;24219:139;;23946:419;;;:::o;24371:::-;24537:4;24575:2;24564:9;24560:18;24552:26;;24624:9;24618:4;24614:20;24610:1;24599:9;24595:17;24588:47;24652:131;24778:4;24652:131;:::i;:::-;24644:139;;24371:419;;;:::o;24796:::-;24962:4;25000:2;24989:9;24985:18;24977:26;;25049:9;25043:4;25039:20;25035:1;25024:9;25020:17;25013:47;25077:131;25203:4;25077:131;:::i;:::-;25069:139;;24796:419;;;:::o;25221:::-;25387:4;25425:2;25414:9;25410:18;25402:26;;25474:9;25468:4;25464:20;25460:1;25449:9;25445:17;25438:47;25502:131;25628:4;25502:131;:::i;:::-;25494:139;;25221:419;;;:::o;25646:346::-;25801:4;25839:2;25828:9;25824:18;25816:26;;25852:133;25982:1;25971:9;25967:17;25958:6;25852:133;:::i;:::-;25646:346;;;;:::o;25998:222::-;26091:4;26129:2;26118:9;26114:18;26106:26;;26142:71;26210:1;26199:9;26195:17;26186:6;26142:71;:::i;:::-;25998:222;;;;:::o;26226:214::-;26315:4;26353:2;26342:9;26338:18;26330:26;;26366:67;26430:1;26419:9;26415:17;26406:6;26366:67;:::i;:::-;26226:214;;;;:::o;26446:129::-;26480:6;26507:20;;:::i;:::-;26497:30;;26536:33;26564:4;26556:6;26536:33;:::i;:::-;26446:129;;;:::o;26581:75::-;26614:6;26647:2;26641:9;26631:19;;26581:75;:::o;26662:307::-;26723:4;26813:18;26805:6;26802:30;26799:56;;;26835:18;;:::i;:::-;26799:56;26873:29;26895:6;26873:29;:::i;:::-;26865:37;;26957:4;26951;26947:15;26939:23;;26662:307;;;:::o;26975:98::-;27026:6;27060:5;27054:12;27044:22;;26975:98;;;:::o;27079:99::-;27131:6;27165:5;27159:12;27149:22;;27079:99;;;:::o;27184:168::-;27267:11;27301:6;27296:3;27289:19;27341:4;27336:3;27332:14;27317:29;;27184:168;;;;:::o;27358:147::-;27459:11;27496:3;27481:18;;27358:147;;;;:::o;27511:169::-;27595:11;27629:6;27624:3;27617:19;27669:4;27664:3;27660:14;27645:29;;27511:169;;;;:::o;27686:148::-;27788:11;27825:3;27810:18;;27686:148;;;;:::o;27840:305::-;27880:3;27899:20;27917:1;27899:20;:::i;:::-;27894:25;;27933:20;27951:1;27933:20;:::i;:::-;27928:25;;28087:1;28019:66;28015:74;28012:1;28009:81;28006:107;;;28093:18;;:::i;:::-;28006:107;28137:1;28134;28130:9;28123:16;;27840:305;;;;:::o;28151:237::-;28189:3;28208:18;28224:1;28208:18;:::i;:::-;28203:23;;28240:18;28256:1;28240:18;:::i;:::-;28235:23;;28330:1;28324:4;28320:12;28317:1;28314:19;28311:45;;;28336:18;;:::i;:::-;28311:45;28380:1;28377;28373:9;28366:16;;28151:237;;;;:::o;28394:185::-;28434:1;28451:20;28469:1;28451:20;:::i;:::-;28446:25;;28485:20;28503:1;28485:20;:::i;:::-;28480:25;;28524:1;28514:35;;28529:18;;:::i;:::-;28514:35;28571:1;28568;28564:9;28559:14;;28394:185;;;;:::o;28585:348::-;28625:7;28648:20;28666:1;28648:20;:::i;:::-;28643:25;;28682:20;28700:1;28682:20;:::i;:::-;28677:25;;28870:1;28802:66;28798:74;28795:1;28792:81;28787:1;28780:9;28773:17;28769:105;28766:131;;;28877:18;;:::i;:::-;28766:131;28925:1;28922;28918:9;28907:20;;28585:348;;;;:::o;28939:191::-;28979:4;28999:20;29017:1;28999:20;:::i;:::-;28994:25;;29033:20;29051:1;29033:20;:::i;:::-;29028:25;;29072:1;29069;29066:8;29063:34;;;29077:18;;:::i;:::-;29063:34;29122:1;29119;29115:9;29107:17;;28939:191;;;;:::o;29136:96::-;29173:7;29202:24;29220:5;29202:24;:::i;:::-;29191:35;;29136:96;;;:::o;29238:90::-;29272:7;29315:5;29308:13;29301:21;29290:32;;29238:90;;;:::o;29334:77::-;29371:7;29400:5;29389:16;;29334:77;;;:::o;29417:149::-;29453:7;29493:66;29486:5;29482:78;29471:89;;29417:149;;;:::o;29572:126::-;29609:7;29649:42;29642:5;29638:54;29627:65;;29572:126;;;:::o;29704:77::-;29741:7;29770:5;29759:16;;29704:77;;;:::o;29787:101::-;29823:7;29863:18;29856:5;29852:30;29841:41;;29787:101;;;:::o;29894:86::-;29929:7;29969:4;29962:5;29958:16;29947:27;;29894:86;;;:::o;29986:154::-;30070:6;30065:3;30060;30047:30;30132:1;30123:6;30118:3;30114:16;30107:27;29986:154;;;:::o;30146:307::-;30214:1;30224:113;30238:6;30235:1;30232:13;30224:113;;;30323:1;30318:3;30314:11;30308:18;30304:1;30299:3;30295:11;30288:39;30260:2;30257:1;30253:10;30248:15;;30224:113;;;30355:6;30352:1;30349:13;30346:101;;;30435:1;30426:6;30421:3;30417:16;30410:27;30346:101;30195:258;30146:307;;;:::o;30459:320::-;30503:6;30540:1;30534:4;30530:12;30520:22;;30587:1;30581:4;30577:12;30608:18;30598:81;;30664:4;30656:6;30652:17;30642:27;;30598:81;30726:2;30718:6;30715:14;30695:18;30692:38;30689:84;;;30745:18;;:::i;:::-;30689:84;30510:269;30459:320;;;:::o;30785:281::-;30868:27;30890:4;30868:27;:::i;:::-;30860:6;30856:40;30998:6;30986:10;30983:22;30962:18;30950:10;30947:34;30944:62;30941:88;;;31009:18;;:::i;:::-;30941:88;31049:10;31045:2;31038:22;30828:238;30785:281;;:::o;31072:233::-;31111:3;31134:24;31152:5;31134:24;:::i;:::-;31125:33;;31180:66;31173:5;31170:77;31167:103;;;31250:18;;:::i;:::-;31167:103;31297:1;31290:5;31286:13;31279:20;;31072:233;;;:::o;31311:100::-;31350:7;31379:26;31399:5;31379:26;:::i;:::-;31368:37;;31311:100;;;:::o;31417:79::-;31456:7;31485:5;31474:16;;31417:79;;;:::o;31502:94::-;31541:7;31570:20;31584:5;31570:20;:::i;:::-;31559:31;;31502:94;;;:::o;31602:176::-;31634:1;31651:20;31669:1;31651:20;:::i;:::-;31646:25;;31685:20;31703:1;31685:20;:::i;:::-;31680:25;;31724:1;31714:35;;31729:18;;:::i;:::-;31714:35;31770:1;31767;31763:9;31758:14;;31602:176;;;;:::o;31784:180::-;31832:77;31829:1;31822:88;31929:4;31926:1;31919:15;31953:4;31950:1;31943:15;31970:180;32018:77;32015:1;32008:88;32115:4;32112:1;32105:15;32139:4;32136:1;32129:15;32156:180;32204:77;32201:1;32194:88;32301:4;32298:1;32291:15;32325:4;32322:1;32315:15;32342:180;32390:77;32387:1;32380:88;32487:4;32484:1;32477:15;32511:4;32508:1;32501:15;32528:180;32576:77;32573:1;32566:88;32673:4;32670:1;32663:15;32697:4;32694:1;32687:15;32714:117;32823:1;32820;32813:12;32837:117;32946:1;32943;32936:12;32960:117;33069:1;33066;33059:12;33083:117;33192:1;33189;33182:12;33206:117;33315:1;33312;33305:12;33329:117;33438:1;33435;33428:12;33452:102;33493:6;33544:2;33540:7;33535:2;33528:5;33524:14;33520:28;33510:38;;33452:102;;;:::o;33560:94::-;33593:8;33641:5;33637:2;33633:14;33612:35;;33560:94;;;:::o;33660:173::-;33800:25;33796:1;33788:6;33784:14;33777:49;33660:173;:::o;33839:182::-;33979:34;33975:1;33967:6;33963:14;33956:58;33839:182;:::o;34027:225::-;34167:34;34163:1;34155:6;34151:14;34144:58;34236:8;34231:2;34223:6;34219:15;34212:33;34027:225;:::o;34258:231::-;34398:34;34394:1;34386:6;34382:14;34375:58;34467:14;34462:2;34454:6;34450:15;34443:39;34258:231;:::o;34495:163::-;34635:15;34631:1;34623:6;34619:14;34612:39;34495:163;:::o;34664:181::-;34804:33;34800:1;34792:6;34788:14;34781:57;34664:181;:::o;34851:174::-;34991:26;34987:1;34979:6;34975:14;34968:50;34851:174;:::o;35031:182::-;35171:34;35167:1;35159:6;35155:14;35148:58;35031:182;:::o;35219:172::-;35359:24;35355:1;35347:6;35343:14;35336:48;35219:172;:::o;35397:114::-;;:::o;35517:166::-;35657:18;35653:1;35645:6;35641:14;35634:42;35517:166;:::o;35689:223::-;35829:34;35825:1;35817:6;35813:14;35806:58;35898:6;35893:2;35885:6;35881:15;35874:31;35689:223;:::o;35918:181::-;36058:33;36054:1;36046:6;36042:14;36035:57;35918:181;:::o;36105:122::-;36178:24;36196:5;36178:24;:::i;:::-;36171:5;36168:35;36158:63;;36217:1;36214;36207:12;36158:63;36105:122;:::o;36233:116::-;36303:21;36318:5;36303:21;:::i;:::-;36296:5;36293:32;36283:60;;36339:1;36336;36329:12;36283:60;36233:116;:::o;36355:122::-;36428:24;36446:5;36428:24;:::i;:::-;36421:5;36418:35;36408:63;;36467:1;36464;36457:12;36408:63;36355:122;:::o;36483:120::-;36555:23;36572:5;36555:23;:::i;:::-;36548:5;36545:34;36535:62;;36593:1;36590;36583:12;36535:62;36483:120;:::o;36609:122::-;36682:24;36700:5;36682:24;:::i;:::-;36675:5;36672:35;36662:63;;36721:1;36718;36711:12;36662:63;36609:122;:::o;36737:118::-;36808:22;36824:5;36808:22;:::i;:::-;36801:5;36798:33;36788:61;;36845:1;36842;36835:12;36788:61;36737:118;:::o

Swarm Source

ipfs://5d382de8e25edc2af41181747ed91492116a26b3633df11e4ef94fe32d4223c2
Loading...
Loading
Loading...
Loading
[ 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.