ETH Price: $2,581.25 (-2.52%)

Token

NAMES (NAMES)
 

Overview

Max Total Supply

1,000 NAMES

Holders

168

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Balance
2 NAMES
0xe74BAf8Bd40C54192304a2f963F3F949406311AE
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:
NAMES

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-09-30
*/

// SPDX-License-Identifier: MIT and GPL-3.0

// 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/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 (last updated v4.7.0) (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`.
     *
     * 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;

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

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

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


// File @openzeppelin/contracts/token/ERC721/[email protected]
// OpenZeppelin Contracts (last updated v4.6.0) (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 `IERC721Receiver.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 (last updated v4.5.0) (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);

    /**
     * @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 (last updated v4.7.0) (utils/Address.sol)

pragma solidity ^0.8.1;

/**
 * @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
     * ====
     *
     * [IMPORTANT]
     * ====
     * You shouldn't rely on `isContract` to protect against flash loan attacks!
     *
     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
     * constructor.
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.

        return account.code.length > 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
                /// @solidity memory-safe-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/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/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 _startTokenId() (defaults to 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_;
        _currentIndex = _startTokenId();
    }

    /**
     * To change the starting tokenId, please override this function.
     */
    function _startTokenId() internal view virtual returns (uint256) {
        return 1;
    }

    /**
     * @dev See {IERC721Enumerable-totalSupply}.
     * @dev Burned tokens are calculated here, use _totalMinted() if you want to count just minted tokens.
     */
    function totalSupply() public view returns (uint256) {
        // Counter underflow is impossible as _burnCounter cannot be incremented
        // more than _currentIndex - _startTokenId() times
        unchecked {
            return _currentIndex - _burnCounter - _startTokenId();
        }
    }

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

    /**
     * @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 (_startTokenId() <= curr && 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(), ".json")) : '';
    }

    /**
     * @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 (to.isContract() && !_checkContractOnERC721Received(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 _startTokenId() <= tokenId && 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;
            uint256 end = updatedIndex + quantity;

            if (safe && to.isContract()) {
                do {
                    emit Transfer(address(0), to, updatedIndex);
                    if (!_checkContractOnERC721Received(address(0), to, updatedIndex++, _data)) {
                        revert TransferToNonERC721ReceiverImplementer();
                    }
                } while (updatedIndex != end);
                // Reentrancy protection
                if (_currentIndex != startTokenId) revert();
            } else {
                do {
                    emit Transfer(address(0), to, updatedIndex++);
                } while (updatedIndex != end);
            }
            _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 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 _checkContractOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        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))
                }
            }
        }
    }

    /**
     * @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/mocks/StartTokenIdHelper.sol
// Creators: Chiru Labs

pragma solidity ^0.8.4;

/**
 * This Helper is used to return a dynmamic value in the overriden _startTokenId() function.
 * Extending this Helper before the ERC721A contract give us access to the herein set `startTokenId`
 * to be returned by the overriden `_startTokenId()` function of ERC721A in the ERC721AStartTokenId mocks.
 */
contract StartTokenIdHelper {
    uint256 public immutable startTokenId;

    constructor(uint256 startTokenId_) {
        startTokenId = startTokenId_;
    }
}


// File @openzeppelin/contracts/access/[email protected]
// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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


// File @openzeppelin/contracts/utils/cryptography/[email protected]
// OpenZeppelin Contracts (last updated v4.7.0) (utils/cryptography/MerkleProof.sol)

pragma solidity ^0.8.0;

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

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

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

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

    /**
     * @dev Returns true if the `leaves` can be proved to be a part of a Merkle tree defined by
     * `root`, according to `proof` and `proofFlags` as described in {processMultiProof}.
     *
     * _Available since v4.7._
     */
    function multiProofVerify(
        bytes32[] memory proof,
        bool[] memory proofFlags,
        bytes32 root,
        bytes32[] memory leaves
    ) internal pure returns (bool) {
        return processMultiProof(proof, proofFlags, leaves) == root;
    }

    /**
     * @dev Calldata version of {multiProofVerify}
     *
     * _Available since v4.7._
     */
    function multiProofVerifyCalldata(
        bytes32[] calldata proof,
        bool[] calldata proofFlags,
        bytes32 root,
        bytes32[] memory leaves
    ) internal pure returns (bool) {
        return processMultiProofCalldata(proof, proofFlags, leaves) == root;
    }

    /**
     * @dev Returns the root of a tree reconstructed from `leaves` and the sibling nodes in `proof`,
     * consuming from one or the other at each step according to the instructions given by
     * `proofFlags`.
     *
     * _Available since v4.7._
     */
    function processMultiProof(
        bytes32[] memory proof,
        bool[] memory proofFlags,
        bytes32[] memory leaves
    ) internal pure returns (bytes32 merkleRoot) {
        // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by
        // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the
        // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of
        // the merkle tree.
        uint256 leavesLen = leaves.length;
        uint256 totalHashes = proofFlags.length;

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

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

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

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

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

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

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

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

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



pragma solidity >=0.8.0 <0.9.0;


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

    uint256 constant MAX_SUPPLY = 1000;
    uint256 constant publicMintPrice = 0 ether;
    uint256 public MAX_PER_ADDRESS = 5;

    mapping(address => bool) public whitelist;

    enum Status {
        NOT_LIVE,
        ALLOWLIST,
        PUBLIC,
        ENDED,
        REVEALED
    }

    /// Minting Variables
    string public _preRevealURI = "ipfs://QmeKEvNuCvHcpzNe8uXLmA5V77WnYmmCUCFwf3GFBgkz2d";
    string public baseURI;
    Status public state;

    constructor() ERC721A("NAMES", "NAMES") {
    }

    function setAllowList(address[] calldata addresses) external onlyOwner {
        for (uint256 i = 0; i < addresses.length; i++) {
            whitelist[addresses[i]] = true;
        }
    }

    function resetAllowList(address[] calldata addresses) external onlyOwner {
        for (uint256 i = 0; i < addresses.length; i++) {
            whitelist[addresses[i]] = false;
        }
    }
    
    function addWhitelist(address _newEntry) external onlyOwner {
        require(!whitelist[_newEntry], "Already in whitelist");
        whitelist[_newEntry] = true;
    }
  
    function removeWhitelist(address _newEntry) external onlyOwner {
        require(whitelist[_newEntry], "Previous not in whitelist");
        whitelist[_newEntry] = false;
    }

    function isAllowlist(address _address) external view returns (bool _allowlisted) {
        return whitelist[_address];
    }

    function getPrice() external pure returns (uint256 _price) {
        return publicMintPrice;
    }

    function maxSupply() external pure returns (uint256 _supply) {
        return MAX_SUPPLY;
    }

    function setMaxMint(uint256 mintAmount) external onlyOwner {
        MAX_PER_ADDRESS = mintAmount;
    }

    function publicMint(uint256 _quantity) external payable {
        require(state == Status.PUBLIC || state == Status.ALLOWLIST, "Mint Not Active");
        if(state == Status.ALLOWLIST){
            require(whitelist[msg.sender], "Not in whitelist");
        }
        require(totalSupply() + _quantity <= MAX_SUPPLY, "Mint Supply Exceeded");
        require(_numberMinted(msg.sender) + _quantity <= MAX_PER_ADDRESS, "Exceeds Max Per Wallet");
        _safeMint(msg.sender, _quantity);
    }

    function airdrop(address _address, uint256 _quantity) external onlyOwner {
        require(state == Status.ENDED, "Must Not Be Live");
        require(totalSupply() + _quantity <= MAX_SUPPLY, "Mint Supply Exceeded");

        _safeMint(_address, _quantity);
    }

    function setState(Status _state) external onlyOwner {
        state = _state;
    }

    function tokenURI(uint256 tokenId) public view override returns (string memory) {
        if (state != Status.REVEALED) {
            return _preRevealURI;
        }

        return super.tokenURI(tokenId);
    }
    
    function setURI(string calldata _newURI) external onlyOwner {
        baseURI = _newURI;
    }

    function setPrerevealURI(string calldata _newURI) external onlyOwner {
        _preRevealURI = _newURI;
    }

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

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

}

Contract Security Audit

Contract ABI

[{"inputs":[],"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_PER_ADDRESS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_preRevealURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_newEntry","type":"address"}],"name":"addWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"},{"internalType":"uint256","name":"_quantity","type":"uint256"}],"name":"airdrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPrice","outputs":[{"internalType":"uint256","name":"_price","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"isAllowlist","outputs":[{"internalType":"bool","name":"_allowlisted","type":"bool"}],"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":"maxSupply","outputs":[{"internalType":"uint256","name":"_supply","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_quantity","type":"uint256"}],"name":"publicMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_newEntry","type":"address"}],"name":"removeWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"}],"name":"resetAllowList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"}],"name":"setAllowList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"mintAmount","type":"uint256"}],"name":"setMaxMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newURI","type":"string"}],"name":"setPrerevealURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"enum NAMES.Status","name":"_state","type":"uint8"}],"name":"setState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newURI","type":"string"}],"name":"setURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"state","outputs":[{"internalType":"enum NAMES.Status","name":"","type":"uint8"}],"stateMutability":"view","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":"address","name":"","type":"address"}],"name":"whitelist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdrawMoney","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405260056009556040518060600160405280603581526020016200424a60359139600b90805190602001906200003a929190620001fc565b503480156200004857600080fd5b506040518060400160405280600581526020017f4e414d45530000000000000000000000000000000000000000000000000000008152506040518060400160405280600581526020017f4e414d45530000000000000000000000000000000000000000000000000000008152508160029080519060200190620000cd929190620001fc565b508060039080519060200190620000e6929190620001fc565b50620000f76200012560201b60201c565b60008190555050506200011f620001136200012e60201b60201c565b6200013660201b60201c565b62000311565b60006001905090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8280546200020a90620002ac565b90600052602060002090601f0160209004810192826200022e57600085556200027a565b82601f106200024957805160ff19168380011785556200027a565b828001600101855582156200027a579182015b82811115620002795782518255916020019190600101906200025c565b5b5090506200028991906200028d565b5090565b5b80821115620002a85760008160009055506001016200028e565b5090565b60006002820490506001821680620002c557607f821691505b60208210811415620002dc57620002db620002e2565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b613f2980620003216000396000f3fe60806040526004361061020f5760003560e01c806370a0823111610118578063a22cb465116100a0578063c87b56dd1161006f578063c87b56dd14610764578063d5abeb01146107a1578063e985e9c5146107cc578063f2fde38b14610809578063f80f5dd5146108325761020f565b8063a22cb465146106d0578063ac446002146106f9578063b88d4fde14610710578063c19d93fb146107395761020f565b80638ba4cc3c116100e75780638ba4cc3c146105e95780638da5cb5b1461061257806395d89b411461063d57806398d5fdca146106685780639b19251a146106935761020f565b806370a0823114610543578063715018a61461058057806378c8cda7146105975780637f41bf43146105c05761020f565b806323b872dd1161019b57806356de96db1161016a57806356de96db1461044c5780636352211e146104755780636447c35d146104b25780636c0360eb146104db5780636c350ba6146105065761020f565b806323b872dd146103b55780632db11544146103de57806342842e0e146103fa578063547520fe146104235761020f565b8063078eef28116101e2578063078eef28146102d0578063081812fc146102f9578063095ea7b3146103365780630aaef2851461035f57806318160ddd1461038a5761020f565b806301ffc9a7146102145780630293741b1461025157806302fe53051461027c57806306fdde03146102a5575b600080fd5b34801561022057600080fd5b5061023b60048036038101906102369190613245565b61085b565b6040516102489190613674565b60405180910390f35b34801561025d57600080fd5b5061026661093d565b60405161027391906136aa565b60405180910390f35b34801561028857600080fd5b506102a3600480360381019061029e91906132cc565b6109cb565b005b3480156102b157600080fd5b506102ba6109e9565b6040516102c791906136aa565b60405180910390f35b3480156102dc57600080fd5b506102f760048036038101906102f291906132cc565b610a7b565b005b34801561030557600080fd5b50610320600480360381019061031b9190613319565b610a99565b60405161032d919061360d565b60405180910390f35b34801561034257600080fd5b5061035d600480360381019061035891906131b8565b610b15565b005b34801561036b57600080fd5b50610374610c20565b604051610381919061380c565b60405180910390f35b34801561039657600080fd5b5061039f610c26565b6040516103ac919061380c565b60405180910390f35b3480156103c157600080fd5b506103dc60048036038101906103d791906130a2565b610c3d565b005b6103f860048036038101906103f39190613319565b610c4d565b005b34801561040657600080fd5b50610421600480360381019061041c91906130a2565b610e86565b005b34801561042f57600080fd5b5061044a60048036038101906104459190613319565b610ea6565b005b34801561045857600080fd5b50610473600480360381019061046e919061329f565b610eb8565b005b34801561048157600080fd5b5061049c60048036038101906104979190613319565b610eed565b6040516104a9919061360d565b60405180910390f35b3480156104be57600080fd5b506104d960048036038101906104d491906131f8565b610f03565b005b3480156104e757600080fd5b506104f0610fb0565b6040516104fd91906136aa565b60405180910390f35b34801561051257600080fd5b5061052d60048036038101906105289190613035565b61103e565b60405161053a9190613674565b60405180910390f35b34801561054f57600080fd5b5061056a60048036038101906105659190613035565b611094565b604051610577919061380c565b60405180910390f35b34801561058c57600080fd5b50610595611164565b005b3480156105a357600080fd5b506105be60048036038101906105b99190613035565b611178565b005b3480156105cc57600080fd5b506105e760048036038101906105e291906131f8565b611267565b005b3480156105f557600080fd5b50610610600480360381019061060b91906131b8565b611314565b005b34801561061e57600080fd5b506106276113f7565b604051610634919061360d565b60405180910390f35b34801561064957600080fd5b50610652611421565b60405161065f91906136aa565b60405180910390f35b34801561067457600080fd5b5061067d6114b3565b60405161068a919061380c565b60405180910390f35b34801561069f57600080fd5b506106ba60048036038101906106b59190613035565b6114b8565b6040516106c79190613674565b60405180910390f35b3480156106dc57600080fd5b506106f760048036038101906106f29190613178565b6114d8565b005b34801561070557600080fd5b5061070e611650565b005b34801561071c57600080fd5b50610737600480360381019061073291906130f5565b611707565b005b34801561074557600080fd5b5061074e611783565b60405161075b919061368f565b60405180910390f35b34801561077057600080fd5b5061078b60048036038101906107869190613319565b611796565b60405161079891906136aa565b60405180910390f35b3480156107ad57600080fd5b506107b6611875565b6040516107c3919061380c565b60405180910390f35b3480156107d857600080fd5b506107f360048036038101906107ee9190613062565b61187f565b6040516108009190613674565b60405180910390f35b34801561081557600080fd5b50610830600480360381019061082b9190613035565b611913565b005b34801561083e57600080fd5b5061085960048036038101906108549190613035565b611997565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061092657507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610936575061093582611a87565b5b9050919050565b600b805461094a90613a61565b80601f016020809104026020016040519081016040528092919081815260200182805461097690613a61565b80156109c35780601f10610998576101008083540402835291602001916109c3565b820191906000526020600020905b8154815290600101906020018083116109a657829003601f168201915b505050505081565b6109d3611af1565b8181600c91906109e4929190612db5565b505050565b6060600280546109f890613a61565b80601f0160208091040260200160405190810160405280929190818152602001828054610a2490613a61565b8015610a715780601f10610a4657610100808354040283529160200191610a71565b820191906000526020600020905b815481529060010190602001808311610a5457829003601f168201915b5050505050905090565b610a83611af1565b8181600b9190610a94929190612db5565b505050565b6000610aa482611b6f565b610ada576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610b2082610eed565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610b88576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610ba7611bbd565b73ffffffffffffffffffffffffffffffffffffffff1614158015610bd95750610bd781610bd2611bbd565b61187f565b155b15610c10576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610c1b838383611bc5565b505050565b60095481565b6000610c30611c77565b6001546000540303905090565b610c48838383611c80565b505050565b60026004811115610c6157610c60613b9c565b5b600d60009054906101000a900460ff166004811115610c8357610c82613b9c565b5b1480610cc2575060016004811115610c9e57610c9d613b9c565b5b600d60009054906101000a900460ff166004811115610cc057610cbf613b9c565b5b145b610d01576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cf8906136cc565b60405180910390fd5b60016004811115610d1557610d14613b9c565b5b600d60009054906101000a900460ff166004811115610d3757610d36613b9c565b5b1415610dca57600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16610dc9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dc09061378c565b60405180910390fd5b5b6103e881610dd6610c26565b610de091906138cb565b1115610e21576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e189061372c565b60405180910390fd5b60095481610e2e33612171565b610e3891906138cb565b1115610e79576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e70906137ec565b60405180910390fd5b610e833382612241565b50565b610ea183838360405180602001604052806000815250611707565b505050565b610eae611af1565b8060098190555050565b610ec0611af1565b80600d60006101000a81548160ff02191690836004811115610ee557610ee4613b9c565b5b021790555050565b6000610ef88261225f565b600001519050919050565b610f0b611af1565b60005b82829050811015610fab576001600a6000858585818110610f3257610f31613bfa565b5b9050602002016020810190610f479190613035565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508080610fa390613ac4565b915050610f0e565b505050565b600c8054610fbd90613a61565b80601f0160208091040260200160405190810160405280929190818152602001828054610fe990613a61565b80156110365780601f1061100b57610100808354040283529160200191611036565b820191906000526020600020905b81548152906001019060200180831161101957829003601f168201915b505050505081565b6000600a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156110fc576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b61116c611af1565b61117660006124ee565b565b611180611af1565b600a60008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661120c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112039061370c565b60405180910390fd5b6000600a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b61126f611af1565b60005b8282905081101561130f576000600a600085858581811061129657611295613bfa565b5b90506020020160208101906112ab9190613035565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550808061130790613ac4565b915050611272565b505050565b61131c611af1565b600360048111156113305761132f613b9c565b5b600d60009054906101000a900460ff16600481111561135257611351613b9c565b5b14611392576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611389906137cc565b60405180910390fd5b6103e88161139e610c26565b6113a891906138cb565b11156113e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113e09061372c565b60405180910390fd5b6113f38282612241565b5050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606003805461143090613a61565b80601f016020809104026020016040519081016040528092919081815260200182805461145c90613a61565b80156114a95780601f1061147e576101008083540402835291602001916114a9565b820191906000526020600020905b81548152906001019060200180831161148c57829003601f168201915b5050505050905090565b600090565b600a6020528060005260406000206000915054906101000a900460ff1681565b6114e0611bbd565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611545576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000611552611bbd565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166115ff611bbd565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516116449190613674565b60405180910390a35050565b611658611af1565b60003373ffffffffffffffffffffffffffffffffffffffff164760405161167e906135f8565b60006040518083038185875af1925050503d80600081146116bb576040519150601f19603f3d011682016040523d82523d6000602084013e6116c0565b606091505b5050905080611704576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116fb9061376c565b60405180910390fd5b50565b611712848484611c80565b6117318373ffffffffffffffffffffffffffffffffffffffff166125b4565b80156117465750611744848484846125d7565b155b1561177d576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b600d60009054906101000a900460ff1681565b60606004808111156117ab576117aa613b9c565b5b600d60009054906101000a900460ff1660048111156117cd576117cc613b9c565b5b1461186457600b80546117df90613a61565b80601f016020809104026020016040519081016040528092919081815260200182805461180b90613a61565b80156118585780601f1061182d57610100808354040283529160200191611858565b820191906000526020600020905b81548152906001019060200180831161183b57829003601f168201915b50505050509050611870565b61186d82612737565b90505b919050565b60006103e8905090565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61191b611af1565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561198b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611982906136ec565b60405180910390fd5b611994816124ee565b50565b61199f611af1565b600a60008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615611a2c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a239061374c565b60405180910390fd5b6001600a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b611af9611bbd565b73ffffffffffffffffffffffffffffffffffffffff16611b176113f7565b73ffffffffffffffffffffffffffffffffffffffff1614611b6d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b64906137ac565b60405180910390fd5b565b600081611b7a611c77565b11158015611b89575060005482105b8015611bb6575060046000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b600033905090565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006001905090565b6000611c8b8261225f565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff16611cb2611bbd565b73ffffffffffffffffffffffffffffffffffffffff161480611ce55750611ce48260000151611cdf611bbd565b61187f565b5b80611d2a5750611cf3611bbd565b73ffffffffffffffffffffffffffffffffffffffff16611d1284610a99565b73ffffffffffffffffffffffffffffffffffffffff16145b905080611d63576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614611dcc576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611e33576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611e4085858560016127d6565b611e506000848460000151611bc5565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550836004600085815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600085815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600184019050600073ffffffffffffffffffffffffffffffffffffffff166004600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415612101576000548110156121005782600001516004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082602001516004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b50828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461216a85858560016127dc565b5050505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156121d9576040517f35ebb31900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160089054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b61225b8282604051806020016040528060008152506127e2565b5050565b612267612e3b565b600082905080612275611c77565b11158015612284575060005481105b156124b7576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff161515151581525050905080604001516124b557600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146123995780925050506124e9565b5b6001156124b457818060019003925050600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146124af5780925050506124e9565b61239a565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a026125fd611bbd565b8786866040518563ffffffff1660e01b815260040161261f9493929190613628565b602060405180830381600087803b15801561263957600080fd5b505af192505050801561266a57506040513d601f19601f820116820180604052508101906126679190613272565b60015b6126e4573d806000811461269a576040519150601f19603f3d011682016040523d82523d6000602084013e61269f565b606091505b506000815114156126dc576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b606061274282611b6f565b612778576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006127826127f4565b90506000815114156127a357604051806020016040528060008152506127ce565b806127ad84612886565b6040516020016127be9291906135c9565b6040516020818303038152906040525b915050919050565b50505050565b50505050565b6127ef83838360016129e7565b505050565b6060600c805461280390613a61565b80601f016020809104026020016040519081016040528092919081815260200182805461282f90613a61565b801561287c5780601f106128515761010080835404028352916020019161287c565b820191906000526020600020905b81548152906001019060200180831161285f57829003601f168201915b5050505050905090565b606060008214156128ce576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506129e2565b600082905060005b600082146129005780806128e990613ac4565b915050600a826128f99190613921565b91506128d6565b60008167ffffffffffffffff81111561291c5761291b613c29565b5b6040519080825280601f01601f19166020018201604052801561294e5781602001600182028036833780820191505090505b5090505b600085146129db576001826129679190613952565b9150600a856129769190613b0d565b603061298291906138cb565b60f81b81838151811061299857612997613bfa565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856129d49190613921565b9450612952565b8093505050505b919050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415612a54576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000841415612a8f576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612a9c60008683876127d6565b83600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600081905060008582019050838015612c665750612c658773ffffffffffffffffffffffffffffffffffffffff166125b4565b5b15612d2c575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612cdb60008884806001019550886125d7565b612d11576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80821415612c6c578260005414612d2757600080fd5b612d98565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a480821415612d2d575b816000819055505050612dae60008683876127dc565b5050505050565b828054612dc190613a61565b90600052602060002090601f016020900481019282612de35760008555612e2a565b82601f10612dfc57803560ff1916838001178555612e2a565b82800160010185558215612e2a579182015b82811115612e29578235825591602001919060010190612e0e565b5b509050612e379190612e7e565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b80821115612e97576000816000905550600101612e7f565b5090565b6000612eae612ea98461384c565b613827565b905082815260208101848484011115612eca57612ec9613c67565b5b612ed5848285613a1f565b509392505050565b600081359050612eec81613e87565b92915050565b60008083601f840112612f0857612f07613c5d565b5b8235905067ffffffffffffffff811115612f2557612f24613c58565b5b602083019150836020820283011115612f4157612f40613c62565b5b9250929050565b600081359050612f5781613e9e565b92915050565b600081359050612f6c81613eb5565b92915050565b600081519050612f8181613eb5565b92915050565b600082601f830112612f9c57612f9b613c5d565b5b8135612fac848260208601612e9b565b91505092915050565b600081359050612fc481613ecc565b92915050565b60008083601f840112612fe057612fdf613c5d565b5b8235905067ffffffffffffffff811115612ffd57612ffc613c58565b5b60208301915083600182028301111561301957613018613c62565b5b9250929050565b60008135905061302f81613edc565b92915050565b60006020828403121561304b5761304a613c71565b5b600061305984828501612edd565b91505092915050565b6000806040838503121561307957613078613c71565b5b600061308785828601612edd565b925050602061309885828601612edd565b9150509250929050565b6000806000606084860312156130bb576130ba613c71565b5b60006130c986828701612edd565b93505060206130da86828701612edd565b92505060406130eb86828701613020565b9150509250925092565b6000806000806080858703121561310f5761310e613c71565b5b600061311d87828801612edd565b945050602061312e87828801612edd565b935050604061313f87828801613020565b925050606085013567ffffffffffffffff8111156131605761315f613c6c565b5b61316c87828801612f87565b91505092959194509250565b6000806040838503121561318f5761318e613c71565b5b600061319d85828601612edd565b92505060206131ae85828601612f48565b9150509250929050565b600080604083850312156131cf576131ce613c71565b5b60006131dd85828601612edd565b92505060206131ee85828601613020565b9150509250929050565b6000806020838503121561320f5761320e613c71565b5b600083013567ffffffffffffffff81111561322d5761322c613c6c565b5b61323985828601612ef2565b92509250509250929050565b60006020828403121561325b5761325a613c71565b5b600061326984828501612f5d565b91505092915050565b60006020828403121561328857613287613c71565b5b600061329684828501612f72565b91505092915050565b6000602082840312156132b5576132b4613c71565b5b60006132c384828501612fb5565b91505092915050565b600080602083850312156132e3576132e2613c71565b5b600083013567ffffffffffffffff81111561330157613300613c6c565b5b61330d85828601612fca565b92509250509250929050565b60006020828403121561332f5761332e613c71565b5b600061333d84828501613020565b91505092915050565b61334f81613986565b82525050565b61335e81613998565b82525050565b600061336f8261387d565b6133798185613893565b9350613389818560208601613a2e565b61339281613c76565b840191505092915050565b6133a681613a0d565b82525050565b60006133b782613888565b6133c181856138af565b93506133d1818560208601613a2e565b6133da81613c76565b840191505092915050565b60006133f082613888565b6133fa81856138c0565b935061340a818560208601613a2e565b80840191505092915050565b6000613423600f836138af565b915061342e82613c87565b602082019050919050565b60006134466026836138af565b915061345182613cb0565b604082019050919050565b60006134696019836138af565b915061347482613cff565b602082019050919050565b600061348c6014836138af565b915061349782613d28565b602082019050919050565b60006134af6014836138af565b91506134ba82613d51565b602082019050919050565b60006134d26010836138af565b91506134dd82613d7a565b602082019050919050565b60006134f56010836138af565b915061350082613da3565b602082019050919050565b60006135186005836138c0565b915061352382613dcc565b600582019050919050565b600061353b6020836138af565b915061354682613df5565b602082019050919050565b600061355e6010836138af565b915061356982613e1e565b602082019050919050565b60006135816000836138a4565b915061358c82613e47565b600082019050919050565b60006135a46016836138af565b91506135af82613e4a565b602082019050919050565b6135c381613a03565b82525050565b60006135d582856133e5565b91506135e182846133e5565b91506135ec8261350b565b91508190509392505050565b600061360382613574565b9150819050919050565b60006020820190506136226000830184613346565b92915050565b600060808201905061363d6000830187613346565b61364a6020830186613346565b61365760408301856135ba565b81810360608301526136698184613364565b905095945050505050565b60006020820190506136896000830184613355565b92915050565b60006020820190506136a4600083018461339d565b92915050565b600060208201905081810360008301526136c481846133ac565b905092915050565b600060208201905081810360008301526136e581613416565b9050919050565b6000602082019050818103600083015261370581613439565b9050919050565b600060208201905081810360008301526137258161345c565b9050919050565b600060208201905081810360008301526137458161347f565b9050919050565b60006020820190508181036000830152613765816134a2565b9050919050565b60006020820190508181036000830152613785816134c5565b9050919050565b600060208201905081810360008301526137a5816134e8565b9050919050565b600060208201905081810360008301526137c58161352e565b9050919050565b600060208201905081810360008301526137e581613551565b9050919050565b6000602082019050818103600083015261380581613597565b9050919050565b600060208201905061382160008301846135ba565b92915050565b6000613831613842565b905061383d8282613a93565b919050565b6000604051905090565b600067ffffffffffffffff82111561386757613866613c29565b5b61387082613c76565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b60006138d682613a03565b91506138e183613a03565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561391657613915613b3e565b5b828201905092915050565b600061392c82613a03565b915061393783613a03565b92508261394757613946613b6d565b5b828204905092915050565b600061395d82613a03565b915061396883613a03565b92508282101561397b5761397a613b3e565b5b828203905092915050565b6000613991826139e3565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b60008190506139de82613e73565b919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b6000613a18826139d0565b9050919050565b82818337600083830152505050565b60005b83811015613a4c578082015181840152602081019050613a31565b83811115613a5b576000848401525b50505050565b60006002820490506001821680613a7957607f821691505b60208210811415613a8d57613a8c613bcb565b5b50919050565b613a9c82613c76565b810181811067ffffffffffffffff82111715613abb57613aba613c29565b5b80604052505050565b6000613acf82613a03565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613b0257613b01613b3e565b5b600182019050919050565b6000613b1882613a03565b9150613b2383613a03565b925082613b3357613b32613b6d565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4d696e74204e6f74204163746976650000000000000000000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f50726576696f7573206e6f7420696e2077686974656c69737400000000000000600082015250565b7f4d696e7420537570706c79204578636565646564000000000000000000000000600082015250565b7f416c726561647920696e2077686974656c697374000000000000000000000000600082015250565b7f5769746864726177206661696c65642e00000000000000000000000000000000600082015250565b7f4e6f7420696e2077686974656c69737400000000000000000000000000000000600082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4d757374204e6f74204265204c69766500000000000000000000000000000000600082015250565b50565b7f45786365656473204d6178205065722057616c6c657400000000000000000000600082015250565b60058110613e8457613e83613b9c565b5b50565b613e9081613986565b8114613e9b57600080fd5b50565b613ea781613998565b8114613eb257600080fd5b50565b613ebe816139a4565b8114613ec957600080fd5b50565b60058110613ed957600080fd5b50565b613ee581613a03565b8114613ef057600080fd5b5056fea26469706673582212201fe368dcce0f4a37f499fd0d6f01568c08b479d0bab4a1376fc86cb8bcf8ba1e64736f6c63430008070033697066733a2f2f516d654b45764e7543764863707a4e653875584c6d4135563737576e596d6d43554346776633474642676b7a3264

Deployed Bytecode

0x60806040526004361061020f5760003560e01c806370a0823111610118578063a22cb465116100a0578063c87b56dd1161006f578063c87b56dd14610764578063d5abeb01146107a1578063e985e9c5146107cc578063f2fde38b14610809578063f80f5dd5146108325761020f565b8063a22cb465146106d0578063ac446002146106f9578063b88d4fde14610710578063c19d93fb146107395761020f565b80638ba4cc3c116100e75780638ba4cc3c146105e95780638da5cb5b1461061257806395d89b411461063d57806398d5fdca146106685780639b19251a146106935761020f565b806370a0823114610543578063715018a61461058057806378c8cda7146105975780637f41bf43146105c05761020f565b806323b872dd1161019b57806356de96db1161016a57806356de96db1461044c5780636352211e146104755780636447c35d146104b25780636c0360eb146104db5780636c350ba6146105065761020f565b806323b872dd146103b55780632db11544146103de57806342842e0e146103fa578063547520fe146104235761020f565b8063078eef28116101e2578063078eef28146102d0578063081812fc146102f9578063095ea7b3146103365780630aaef2851461035f57806318160ddd1461038a5761020f565b806301ffc9a7146102145780630293741b1461025157806302fe53051461027c57806306fdde03146102a5575b600080fd5b34801561022057600080fd5b5061023b60048036038101906102369190613245565b61085b565b6040516102489190613674565b60405180910390f35b34801561025d57600080fd5b5061026661093d565b60405161027391906136aa565b60405180910390f35b34801561028857600080fd5b506102a3600480360381019061029e91906132cc565b6109cb565b005b3480156102b157600080fd5b506102ba6109e9565b6040516102c791906136aa565b60405180910390f35b3480156102dc57600080fd5b506102f760048036038101906102f291906132cc565b610a7b565b005b34801561030557600080fd5b50610320600480360381019061031b9190613319565b610a99565b60405161032d919061360d565b60405180910390f35b34801561034257600080fd5b5061035d600480360381019061035891906131b8565b610b15565b005b34801561036b57600080fd5b50610374610c20565b604051610381919061380c565b60405180910390f35b34801561039657600080fd5b5061039f610c26565b6040516103ac919061380c565b60405180910390f35b3480156103c157600080fd5b506103dc60048036038101906103d791906130a2565b610c3d565b005b6103f860048036038101906103f39190613319565b610c4d565b005b34801561040657600080fd5b50610421600480360381019061041c91906130a2565b610e86565b005b34801561042f57600080fd5b5061044a60048036038101906104459190613319565b610ea6565b005b34801561045857600080fd5b50610473600480360381019061046e919061329f565b610eb8565b005b34801561048157600080fd5b5061049c60048036038101906104979190613319565b610eed565b6040516104a9919061360d565b60405180910390f35b3480156104be57600080fd5b506104d960048036038101906104d491906131f8565b610f03565b005b3480156104e757600080fd5b506104f0610fb0565b6040516104fd91906136aa565b60405180910390f35b34801561051257600080fd5b5061052d60048036038101906105289190613035565b61103e565b60405161053a9190613674565b60405180910390f35b34801561054f57600080fd5b5061056a60048036038101906105659190613035565b611094565b604051610577919061380c565b60405180910390f35b34801561058c57600080fd5b50610595611164565b005b3480156105a357600080fd5b506105be60048036038101906105b99190613035565b611178565b005b3480156105cc57600080fd5b506105e760048036038101906105e291906131f8565b611267565b005b3480156105f557600080fd5b50610610600480360381019061060b91906131b8565b611314565b005b34801561061e57600080fd5b506106276113f7565b604051610634919061360d565b60405180910390f35b34801561064957600080fd5b50610652611421565b60405161065f91906136aa565b60405180910390f35b34801561067457600080fd5b5061067d6114b3565b60405161068a919061380c565b60405180910390f35b34801561069f57600080fd5b506106ba60048036038101906106b59190613035565b6114b8565b6040516106c79190613674565b60405180910390f35b3480156106dc57600080fd5b506106f760048036038101906106f29190613178565b6114d8565b005b34801561070557600080fd5b5061070e611650565b005b34801561071c57600080fd5b50610737600480360381019061073291906130f5565b611707565b005b34801561074557600080fd5b5061074e611783565b60405161075b919061368f565b60405180910390f35b34801561077057600080fd5b5061078b60048036038101906107869190613319565b611796565b60405161079891906136aa565b60405180910390f35b3480156107ad57600080fd5b506107b6611875565b6040516107c3919061380c565b60405180910390f35b3480156107d857600080fd5b506107f360048036038101906107ee9190613062565b61187f565b6040516108009190613674565b60405180910390f35b34801561081557600080fd5b50610830600480360381019061082b9190613035565b611913565b005b34801561083e57600080fd5b5061085960048036038101906108549190613035565b611997565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061092657507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610936575061093582611a87565b5b9050919050565b600b805461094a90613a61565b80601f016020809104026020016040519081016040528092919081815260200182805461097690613a61565b80156109c35780601f10610998576101008083540402835291602001916109c3565b820191906000526020600020905b8154815290600101906020018083116109a657829003601f168201915b505050505081565b6109d3611af1565b8181600c91906109e4929190612db5565b505050565b6060600280546109f890613a61565b80601f0160208091040260200160405190810160405280929190818152602001828054610a2490613a61565b8015610a715780601f10610a4657610100808354040283529160200191610a71565b820191906000526020600020905b815481529060010190602001808311610a5457829003601f168201915b5050505050905090565b610a83611af1565b8181600b9190610a94929190612db5565b505050565b6000610aa482611b6f565b610ada576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610b2082610eed565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610b88576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610ba7611bbd565b73ffffffffffffffffffffffffffffffffffffffff1614158015610bd95750610bd781610bd2611bbd565b61187f565b155b15610c10576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610c1b838383611bc5565b505050565b60095481565b6000610c30611c77565b6001546000540303905090565b610c48838383611c80565b505050565b60026004811115610c6157610c60613b9c565b5b600d60009054906101000a900460ff166004811115610c8357610c82613b9c565b5b1480610cc2575060016004811115610c9e57610c9d613b9c565b5b600d60009054906101000a900460ff166004811115610cc057610cbf613b9c565b5b145b610d01576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cf8906136cc565b60405180910390fd5b60016004811115610d1557610d14613b9c565b5b600d60009054906101000a900460ff166004811115610d3757610d36613b9c565b5b1415610dca57600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16610dc9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dc09061378c565b60405180910390fd5b5b6103e881610dd6610c26565b610de091906138cb565b1115610e21576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e189061372c565b60405180910390fd5b60095481610e2e33612171565b610e3891906138cb565b1115610e79576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e70906137ec565b60405180910390fd5b610e833382612241565b50565b610ea183838360405180602001604052806000815250611707565b505050565b610eae611af1565b8060098190555050565b610ec0611af1565b80600d60006101000a81548160ff02191690836004811115610ee557610ee4613b9c565b5b021790555050565b6000610ef88261225f565b600001519050919050565b610f0b611af1565b60005b82829050811015610fab576001600a6000858585818110610f3257610f31613bfa565b5b9050602002016020810190610f479190613035565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508080610fa390613ac4565b915050610f0e565b505050565b600c8054610fbd90613a61565b80601f0160208091040260200160405190810160405280929190818152602001828054610fe990613a61565b80156110365780601f1061100b57610100808354040283529160200191611036565b820191906000526020600020905b81548152906001019060200180831161101957829003601f168201915b505050505081565b6000600a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156110fc576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b61116c611af1565b61117660006124ee565b565b611180611af1565b600a60008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661120c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112039061370c565b60405180910390fd5b6000600a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b61126f611af1565b60005b8282905081101561130f576000600a600085858581811061129657611295613bfa565b5b90506020020160208101906112ab9190613035565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550808061130790613ac4565b915050611272565b505050565b61131c611af1565b600360048111156113305761132f613b9c565b5b600d60009054906101000a900460ff16600481111561135257611351613b9c565b5b14611392576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611389906137cc565b60405180910390fd5b6103e88161139e610c26565b6113a891906138cb565b11156113e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113e09061372c565b60405180910390fd5b6113f38282612241565b5050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606003805461143090613a61565b80601f016020809104026020016040519081016040528092919081815260200182805461145c90613a61565b80156114a95780601f1061147e576101008083540402835291602001916114a9565b820191906000526020600020905b81548152906001019060200180831161148c57829003601f168201915b5050505050905090565b600090565b600a6020528060005260406000206000915054906101000a900460ff1681565b6114e0611bbd565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611545576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000611552611bbd565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166115ff611bbd565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516116449190613674565b60405180910390a35050565b611658611af1565b60003373ffffffffffffffffffffffffffffffffffffffff164760405161167e906135f8565b60006040518083038185875af1925050503d80600081146116bb576040519150601f19603f3d011682016040523d82523d6000602084013e6116c0565b606091505b5050905080611704576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116fb9061376c565b60405180910390fd5b50565b611712848484611c80565b6117318373ffffffffffffffffffffffffffffffffffffffff166125b4565b80156117465750611744848484846125d7565b155b1561177d576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b600d60009054906101000a900460ff1681565b60606004808111156117ab576117aa613b9c565b5b600d60009054906101000a900460ff1660048111156117cd576117cc613b9c565b5b1461186457600b80546117df90613a61565b80601f016020809104026020016040519081016040528092919081815260200182805461180b90613a61565b80156118585780601f1061182d57610100808354040283529160200191611858565b820191906000526020600020905b81548152906001019060200180831161183b57829003601f168201915b50505050509050611870565b61186d82612737565b90505b919050565b60006103e8905090565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61191b611af1565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561198b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611982906136ec565b60405180910390fd5b611994816124ee565b50565b61199f611af1565b600a60008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615611a2c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a239061374c565b60405180910390fd5b6001600a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b611af9611bbd565b73ffffffffffffffffffffffffffffffffffffffff16611b176113f7565b73ffffffffffffffffffffffffffffffffffffffff1614611b6d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b64906137ac565b60405180910390fd5b565b600081611b7a611c77565b11158015611b89575060005482105b8015611bb6575060046000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b600033905090565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006001905090565b6000611c8b8261225f565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff16611cb2611bbd565b73ffffffffffffffffffffffffffffffffffffffff161480611ce55750611ce48260000151611cdf611bbd565b61187f565b5b80611d2a5750611cf3611bbd565b73ffffffffffffffffffffffffffffffffffffffff16611d1284610a99565b73ffffffffffffffffffffffffffffffffffffffff16145b905080611d63576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614611dcc576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611e33576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611e4085858560016127d6565b611e506000848460000151611bc5565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550836004600085815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600085815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600184019050600073ffffffffffffffffffffffffffffffffffffffff166004600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415612101576000548110156121005782600001516004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082602001516004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b50828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461216a85858560016127dc565b5050505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156121d9576040517f35ebb31900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160089054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b61225b8282604051806020016040528060008152506127e2565b5050565b612267612e3b565b600082905080612275611c77565b11158015612284575060005481105b156124b7576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff161515151581525050905080604001516124b557600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146123995780925050506124e9565b5b6001156124b457818060019003925050600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146124af5780925050506124e9565b61239a565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a026125fd611bbd565b8786866040518563ffffffff1660e01b815260040161261f9493929190613628565b602060405180830381600087803b15801561263957600080fd5b505af192505050801561266a57506040513d601f19601f820116820180604052508101906126679190613272565b60015b6126e4573d806000811461269a576040519150601f19603f3d011682016040523d82523d6000602084013e61269f565b606091505b506000815114156126dc576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b606061274282611b6f565b612778576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006127826127f4565b90506000815114156127a357604051806020016040528060008152506127ce565b806127ad84612886565b6040516020016127be9291906135c9565b6040516020818303038152906040525b915050919050565b50505050565b50505050565b6127ef83838360016129e7565b505050565b6060600c805461280390613a61565b80601f016020809104026020016040519081016040528092919081815260200182805461282f90613a61565b801561287c5780601f106128515761010080835404028352916020019161287c565b820191906000526020600020905b81548152906001019060200180831161285f57829003601f168201915b5050505050905090565b606060008214156128ce576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506129e2565b600082905060005b600082146129005780806128e990613ac4565b915050600a826128f99190613921565b91506128d6565b60008167ffffffffffffffff81111561291c5761291b613c29565b5b6040519080825280601f01601f19166020018201604052801561294e5781602001600182028036833780820191505090505b5090505b600085146129db576001826129679190613952565b9150600a856129769190613b0d565b603061298291906138cb565b60f81b81838151811061299857612997613bfa565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856129d49190613921565b9450612952565b8093505050505b919050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415612a54576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000841415612a8f576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612a9c60008683876127d6565b83600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600081905060008582019050838015612c665750612c658773ffffffffffffffffffffffffffffffffffffffff166125b4565b5b15612d2c575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612cdb60008884806001019550886125d7565b612d11576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80821415612c6c578260005414612d2757600080fd5b612d98565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a480821415612d2d575b816000819055505050612dae60008683876127dc565b5050505050565b828054612dc190613a61565b90600052602060002090601f016020900481019282612de35760008555612e2a565b82601f10612dfc57803560ff1916838001178555612e2a565b82800160010185558215612e2a579182015b82811115612e29578235825591602001919060010190612e0e565b5b509050612e379190612e7e565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b80821115612e97576000816000905550600101612e7f565b5090565b6000612eae612ea98461384c565b613827565b905082815260208101848484011115612eca57612ec9613c67565b5b612ed5848285613a1f565b509392505050565b600081359050612eec81613e87565b92915050565b60008083601f840112612f0857612f07613c5d565b5b8235905067ffffffffffffffff811115612f2557612f24613c58565b5b602083019150836020820283011115612f4157612f40613c62565b5b9250929050565b600081359050612f5781613e9e565b92915050565b600081359050612f6c81613eb5565b92915050565b600081519050612f8181613eb5565b92915050565b600082601f830112612f9c57612f9b613c5d565b5b8135612fac848260208601612e9b565b91505092915050565b600081359050612fc481613ecc565b92915050565b60008083601f840112612fe057612fdf613c5d565b5b8235905067ffffffffffffffff811115612ffd57612ffc613c58565b5b60208301915083600182028301111561301957613018613c62565b5b9250929050565b60008135905061302f81613edc565b92915050565b60006020828403121561304b5761304a613c71565b5b600061305984828501612edd565b91505092915050565b6000806040838503121561307957613078613c71565b5b600061308785828601612edd565b925050602061309885828601612edd565b9150509250929050565b6000806000606084860312156130bb576130ba613c71565b5b60006130c986828701612edd565b93505060206130da86828701612edd565b92505060406130eb86828701613020565b9150509250925092565b6000806000806080858703121561310f5761310e613c71565b5b600061311d87828801612edd565b945050602061312e87828801612edd565b935050604061313f87828801613020565b925050606085013567ffffffffffffffff8111156131605761315f613c6c565b5b61316c87828801612f87565b91505092959194509250565b6000806040838503121561318f5761318e613c71565b5b600061319d85828601612edd565b92505060206131ae85828601612f48565b9150509250929050565b600080604083850312156131cf576131ce613c71565b5b60006131dd85828601612edd565b92505060206131ee85828601613020565b9150509250929050565b6000806020838503121561320f5761320e613c71565b5b600083013567ffffffffffffffff81111561322d5761322c613c6c565b5b61323985828601612ef2565b92509250509250929050565b60006020828403121561325b5761325a613c71565b5b600061326984828501612f5d565b91505092915050565b60006020828403121561328857613287613c71565b5b600061329684828501612f72565b91505092915050565b6000602082840312156132b5576132b4613c71565b5b60006132c384828501612fb5565b91505092915050565b600080602083850312156132e3576132e2613c71565b5b600083013567ffffffffffffffff81111561330157613300613c6c565b5b61330d85828601612fca565b92509250509250929050565b60006020828403121561332f5761332e613c71565b5b600061333d84828501613020565b91505092915050565b61334f81613986565b82525050565b61335e81613998565b82525050565b600061336f8261387d565b6133798185613893565b9350613389818560208601613a2e565b61339281613c76565b840191505092915050565b6133a681613a0d565b82525050565b60006133b782613888565b6133c181856138af565b93506133d1818560208601613a2e565b6133da81613c76565b840191505092915050565b60006133f082613888565b6133fa81856138c0565b935061340a818560208601613a2e565b80840191505092915050565b6000613423600f836138af565b915061342e82613c87565b602082019050919050565b60006134466026836138af565b915061345182613cb0565b604082019050919050565b60006134696019836138af565b915061347482613cff565b602082019050919050565b600061348c6014836138af565b915061349782613d28565b602082019050919050565b60006134af6014836138af565b91506134ba82613d51565b602082019050919050565b60006134d26010836138af565b91506134dd82613d7a565b602082019050919050565b60006134f56010836138af565b915061350082613da3565b602082019050919050565b60006135186005836138c0565b915061352382613dcc565b600582019050919050565b600061353b6020836138af565b915061354682613df5565b602082019050919050565b600061355e6010836138af565b915061356982613e1e565b602082019050919050565b60006135816000836138a4565b915061358c82613e47565b600082019050919050565b60006135a46016836138af565b91506135af82613e4a565b602082019050919050565b6135c381613a03565b82525050565b60006135d582856133e5565b91506135e182846133e5565b91506135ec8261350b565b91508190509392505050565b600061360382613574565b9150819050919050565b60006020820190506136226000830184613346565b92915050565b600060808201905061363d6000830187613346565b61364a6020830186613346565b61365760408301856135ba565b81810360608301526136698184613364565b905095945050505050565b60006020820190506136896000830184613355565b92915050565b60006020820190506136a4600083018461339d565b92915050565b600060208201905081810360008301526136c481846133ac565b905092915050565b600060208201905081810360008301526136e581613416565b9050919050565b6000602082019050818103600083015261370581613439565b9050919050565b600060208201905081810360008301526137258161345c565b9050919050565b600060208201905081810360008301526137458161347f565b9050919050565b60006020820190508181036000830152613765816134a2565b9050919050565b60006020820190508181036000830152613785816134c5565b9050919050565b600060208201905081810360008301526137a5816134e8565b9050919050565b600060208201905081810360008301526137c58161352e565b9050919050565b600060208201905081810360008301526137e581613551565b9050919050565b6000602082019050818103600083015261380581613597565b9050919050565b600060208201905061382160008301846135ba565b92915050565b6000613831613842565b905061383d8282613a93565b919050565b6000604051905090565b600067ffffffffffffffff82111561386757613866613c29565b5b61387082613c76565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b60006138d682613a03565b91506138e183613a03565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561391657613915613b3e565b5b828201905092915050565b600061392c82613a03565b915061393783613a03565b92508261394757613946613b6d565b5b828204905092915050565b600061395d82613a03565b915061396883613a03565b92508282101561397b5761397a613b3e565b5b828203905092915050565b6000613991826139e3565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b60008190506139de82613e73565b919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b6000613a18826139d0565b9050919050565b82818337600083830152505050565b60005b83811015613a4c578082015181840152602081019050613a31565b83811115613a5b576000848401525b50505050565b60006002820490506001821680613a7957607f821691505b60208210811415613a8d57613a8c613bcb565b5b50919050565b613a9c82613c76565b810181811067ffffffffffffffff82111715613abb57613aba613c29565b5b80604052505050565b6000613acf82613a03565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613b0257613b01613b3e565b5b600182019050919050565b6000613b1882613a03565b9150613b2383613a03565b925082613b3357613b32613b6d565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4d696e74204e6f74204163746976650000000000000000000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f50726576696f7573206e6f7420696e2077686974656c69737400000000000000600082015250565b7f4d696e7420537570706c79204578636565646564000000000000000000000000600082015250565b7f416c726561647920696e2077686974656c697374000000000000000000000000600082015250565b7f5769746864726177206661696c65642e00000000000000000000000000000000600082015250565b7f4e6f7420696e2077686974656c69737400000000000000000000000000000000600082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4d757374204e6f74204265204c69766500000000000000000000000000000000600082015250565b50565b7f45786365656473204d6178205065722057616c6c657400000000000000000000600082015250565b60058110613e8457613e83613b9c565b5b50565b613e9081613986565b8114613e9b57600080fd5b50565b613ea781613998565b8114613eb257600080fd5b50565b613ebe816139a4565b8114613ec957600080fd5b50565b60058110613ed957600080fd5b50565b613ee581613a03565b8114613ef057600080fd5b5056fea26469706673582212201fe368dcce0f4a37f499fd0d6f01568c08b479d0bab4a1376fc86cb8bcf8ba1e64736f6c63430008070033

Deployed Bytecode Sourcemap

55349:3465:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25815:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55753:85;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58300:96;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29202:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58404:111;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30714:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30277:371;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55515:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25064:303;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31571:170;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57195:498;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31812:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57081:106;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57977:85;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29011:124;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55957:193;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55845:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56734:126;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26184:206;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45762:103;;;;;;;;;;;;;:::i;:::-;;56547:179;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56158:196;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57701:268;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45114:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29371:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56868:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55558:41;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30990:279;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58631:178;;;;;;;;;;;;;:::i;:::-;;32068:369;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55873:19;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58070:218;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56976:97;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31340:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46020:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56366:171;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25815:305;25917:4;25969:25;25954:40;;;:11;:40;;;;:105;;;;26026:33;26011:48;;;:11;:48;;;;25954:105;:158;;;;26076:36;26100:11;26076:23;:36::i;:::-;25954:158;25934:178;;25815:305;;;:::o;55753:85::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;58300:96::-;45000:13;:11;:13::i;:::-;58381:7:::1;;58371;:17;;;;;;;:::i;:::-;;58300:96:::0;;:::o;29202:100::-;29256:13;29289:5;29282:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29202:100;:::o;58404:111::-;45000:13;:11;:13::i;:::-;58500:7:::1;;58484:13;:23;;;;;;;:::i;:::-;;58404:111:::0;;:::o;30714:204::-;30782:7;30807:16;30815:7;30807;:16::i;:::-;30802:64;;30832:34;;;;;;;;;;;;;;30802:64;30886:15;:24;30902:7;30886:24;;;;;;;;;;;;;;;;;;;;;30879:31;;30714:204;;;:::o;30277:371::-;30350:13;30366:24;30382:7;30366:15;:24::i;:::-;30350:40;;30411:5;30405:11;;:2;:11;;;30401:48;;;30425:24;;;;;;;;;;;;;;30401:48;30482:5;30466:21;;:12;:10;:12::i;:::-;:21;;;;:63;;;;;30492:37;30509:5;30516:12;:10;:12::i;:::-;30492:16;:37::i;:::-;30491:38;30466:63;30462:138;;;30553:35;;;;;;;;;;;;;;30462:138;30612:28;30621:2;30625:7;30634:5;30612:8;:28::i;:::-;30339:309;30277:371;;:::o;55515:34::-;;;;:::o;25064:303::-;25108:7;25333:15;:13;:15::i;:::-;25318:12;;25302:13;;:28;:46;25295:53;;25064:303;:::o;31571:170::-;31705:28;31715:4;31721:2;31725:7;31705:9;:28::i;:::-;31571:170;;;:::o;57195:498::-;57279:13;57270:22;;;;;;;;:::i;:::-;;:5;;;;;;;;;;;:22;;;;;;;;:::i;:::-;;;:51;;;;57305:16;57296:25;;;;;;;;:::i;:::-;;:5;;;;;;;;;;;:25;;;;;;;;:::i;:::-;;;57270:51;57262:79;;;;;;;;;;;;:::i;:::-;;;;;;;;;57364:16;57355:25;;;;;;;;:::i;:::-;;:5;;;;;;;;;;;:25;;;;;;;;:::i;:::-;;;57352:106;;;57404:9;:21;57414:10;57404:21;;;;;;;;;;;;;;;;;;;;;;;;;57396:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;57352:106;55455:4;57492:9;57476:13;:11;:13::i;:::-;:25;;;;:::i;:::-;:39;;57468:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;57600:15;;57587:9;57559:25;57573:10;57559:13;:25::i;:::-;:37;;;;:::i;:::-;:56;;57551:91;;;;;;;;;;;;:::i;:::-;;;;;;;;;57653:32;57663:10;57675:9;57653;:32::i;:::-;57195:498;:::o;31812:185::-;31950:39;31967:4;31973:2;31977:7;31950:39;;;;;;;;;;;;:16;:39::i;:::-;31812:185;;;:::o;57081:106::-;45000:13;:11;:13::i;:::-;57169:10:::1;57151:15;:28;;;;57081:106:::0;:::o;57977:85::-;45000:13;:11;:13::i;:::-;58048:6:::1;58040:5;;:14;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;57977:85:::0;:::o;29011:124::-;29075:7;29102:20;29114:7;29102:11;:20::i;:::-;:25;;;29095:32;;29011:124;;;:::o;55957:193::-;45000:13;:11;:13::i;:::-;56044:9:::1;56039:104;56063:9;;:16;;56059:1;:20;56039:104;;;56127:4;56101:9;:23;56111:9;;56121:1;56111:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;56101:23;;;;;;;;;;;;;;;;:30;;;;;;;;;;;;;;;;;;56081:3;;;;;:::i;:::-;;;;56039:104;;;;55957:193:::0;;:::o;55845:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;56734:126::-;56796:17;56833:9;:19;56843:8;56833:19;;;;;;;;;;;;;;;;;;;;;;;;;56826:26;;56734:126;;;:::o;26184:206::-;26248:7;26289:1;26272:19;;:5;:19;;;26268:60;;;26300:28;;;;;;;;;;;;;;26268:60;26354:12;:19;26367:5;26354:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;26346:36;;26339:43;;26184:206;;;:::o;45762:103::-;45000:13;:11;:13::i;:::-;45827:30:::1;45854:1;45827:18;:30::i;:::-;45762:103::o:0;56547:179::-;45000:13;:11;:13::i;:::-;56629:9:::1;:20;56639:9;56629:20;;;;;;;;;;;;;;;;;;;;;;;;;56621:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;56713:5;56690:9;:20;56700:9;56690:20;;;;;;;;;;;;;;;;:28;;;;;;;;;;;;;;;;;;56547:179:::0;:::o;56158:196::-;45000:13;:11;:13::i;:::-;56247:9:::1;56242:105;56266:9;;:16;;56262:1;:20;56242:105;;;56330:5;56304:9;:23;56314:9;;56324:1;56314:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;56304:23;;;;;;;;;;;;;;;;:31;;;;;;;;;;;;;;;;;;56284:3;;;;;:::i;:::-;;;;56242:105;;;;56158:196:::0;;:::o;57701:268::-;45000:13;:11;:13::i;:::-;57802:12:::1;57793:21;;;;;;;;:::i;:::-;;:5;;;;;;;;;;;:21;;;;;;;;:::i;:::-;;;57785:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;55455:4;57870:9;57854:13;:11;:13::i;:::-;:25;;;;:::i;:::-;:39;;57846:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;57931:30;57941:8;57951:9;57931;:30::i;:::-;57701:268:::0;;:::o;45114:87::-;45160:7;45187:6;;;;;;;;;;;45180:13;;45114:87;:::o;29371:104::-;29427:13;29460:7;29453:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29371:104;:::o;56868:100::-;56911:14;56868:100;:::o;55558:41::-;;;;;;;;;;;;;;;;;;;;;;:::o;30990:279::-;31093:12;:10;:12::i;:::-;31081:24;;:8;:24;;;31077:54;;;31114:17;;;;;;;;;;;;;;31077:54;31189:8;31144:18;:32;31163:12;:10;:12::i;:::-;31144:32;;;;;;;;;;;;;;;:42;31177:8;31144:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;31242:8;31213:48;;31228:12;:10;:12::i;:::-;31213:48;;;31252:8;31213:48;;;;;;:::i;:::-;;;;;;;;30990:279;;:::o;58631:178::-;45000:13;:11;:13::i;:::-;58687:12:::1;58705:10;:15;;58728:21;58705:49;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58686:68;;;58773:7;58765:36;;;;;;;;;;;;:::i;:::-;;;;;;;;;58675:134;58631:178::o:0;32068:369::-;32235:28;32245:4;32251:2;32255:7;32235:9;:28::i;:::-;32278:15;:2;:13;;;:15::i;:::-;:76;;;;;32298:56;32329:4;32335:2;32339:7;32348:5;32298:30;:56::i;:::-;32297:57;32278:76;32274:156;;;32378:40;;;;;;;;;;;;;;32274:156;32068:369;;;;:::o;55873:19::-;;;;;;;;;;;;;:::o;58070:218::-;58135:13;58174:15;58165:24;;;;;;;;:::i;:::-;;:5;;;;;;;;;;;:24;;;;;;;;:::i;:::-;;;58161:77;;58213:13;58206:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58161:77;58257:23;58272:7;58257:14;:23::i;:::-;58250:30;;58070:218;;;;:::o;56976:97::-;57020:15;55455:4;57048:17;;56976:97;:::o;31340:164::-;31437:4;31461:18;:25;31480:5;31461:25;;;;;;;;;;;;;;;:35;31487:8;31461:35;;;;;;;;;;;;;;;;;;;;;;;;;31454:42;;31340:164;;;;:::o;46020:201::-;45000:13;:11;:13::i;:::-;46129:1:::1;46109:22;;:8;:22;;;;46101:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;46185:28;46204:8;46185:18;:28::i;:::-;46020:201:::0;:::o;56366:171::-;45000:13;:11;:13::i;:::-;56446:9:::1;:20;56456:9;56446:20;;;;;;;;;;;;;;;;;;;;;;;;;56445:21;56437:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;56525:4;56502:9;:20;56512:9;56502:20;;;;;;;;;;;;;;;;:27;;;;;;;;;;;;;;;;;;56366:171:::0;:::o;21186:157::-;21271:4;21310:25;21295:40;;;:11;:40;;;;21288:47;;21186:157;;;:::o;45279:132::-;45354:12;:10;:12::i;:::-;45343:23;;:7;:5;:7::i;:::-;:23;;;45335:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;45279:132::o;32692:187::-;32749:4;32792:7;32773:15;:13;:15::i;:::-;:26;;:53;;;;;32813:13;;32803:7;:23;32773:53;:98;;;;;32844:11;:20;32856:7;32844:20;;;;;;;;;;;:27;;;;;;;;;;;;32843:28;32773:98;32766:105;;32692:187;;;:::o;20107:98::-;20160:7;20187:10;20180:17;;20107:98;:::o;40303:196::-;40445:2;40418:15;:24;40434:7;40418:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;40483:7;40479:2;40463:28;;40472:5;40463:28;;;;;;;;;;;;40303:196;;;:::o;24788:92::-;24844:7;24871:1;24864:8;;24788:92;:::o;35805:2112::-;35920:35;35958:20;35970:7;35958:11;:20::i;:::-;35920:58;;35991:22;36033:13;:18;;;36017:34;;:12;:10;:12::i;:::-;:34;;;:101;;;;36068:50;36085:13;:18;;;36105:12;:10;:12::i;:::-;36068:16;:50::i;:::-;36017:101;:154;;;;36159:12;:10;:12::i;:::-;36135:36;;:20;36147:7;36135:11;:20::i;:::-;:36;;;36017:154;35991:181;;36190:17;36185:66;;36216:35;;;;;;;;;;;;;;36185:66;36288:4;36266:26;;:13;:18;;;:26;;;36262:67;;36301:28;;;;;;;;;;;;;;36262:67;36358:1;36344:16;;:2;:16;;;36340:52;;;36369:23;;;;;;;;;;;;;;36340:52;36405:43;36427:4;36433:2;36437:7;36446:1;36405:21;:43::i;:::-;36513:49;36530:1;36534:7;36543:13;:18;;;36513:8;:49::i;:::-;36888:1;36858:12;:18;36871:4;36858:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36932:1;36904:12;:16;36917:2;36904:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36978:2;36950:11;:20;36962:7;36950:20;;;;;;;;;;;:25;;;:30;;;;;;;;;;;;;;;;;;37040:15;36995:11;:20;37007:7;36995:20;;;;;;;;;;;:35;;;:61;;;;;;;;;;;;;;;;;;37308:19;37340:1;37330:7;:11;37308:33;;37401:1;37360:43;;:11;:24;37372:11;37360:24;;;;;;;;;;;:29;;;;;;;;;;;;:43;;;37356:445;;;37585:13;;37571:11;:27;37567:219;;;37655:13;:18;;;37623:11;:24;37635:11;37623:24;;;;;;;;;;;:29;;;:50;;;;;;;;;;;;;;;;;;37738:13;:28;;;37696:11;:24;37708:11;37696:24;;;;;;;;;;;:39;;;:70;;;;;;;;;;;;;;;;;;37567:219;37356:445;36833:979;37848:7;37844:2;37829:27;;37838:4;37829:27;;;;;;;;;;;;37867:42;37888:4;37894:2;37898:7;37907:1;37867:20;:42::i;:::-;35909:2008;;35805:2112;;;:::o;26472:207::-;26533:7;26574:1;26557:19;;:5;:19;;;26553:59;;;26585:27;;;;;;;;;;;;;;26553:59;26638:12;:19;26651:5;26638:19;;;;;;;;;;;;;;;:32;;;;;;;;;;;;26630:41;;26623:48;;26472:207;;;:::o;32887:104::-;32956:27;32966:2;32970:8;32956:27;;;;;;;;;;;;:9;:27::i;:::-;32887:104;;:::o;27841:1108::-;27902:21;;:::i;:::-;27936:12;27951:7;27936:22;;28019:4;28000:15;:13;:15::i;:::-;:23;;:47;;;;;28034:13;;28027:4;:20;28000:47;27996:886;;;28068:31;28102:11;:17;28114:4;28102:17;;;;;;;;;;;28068:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28143:9;:16;;;28138:729;;28214:1;28188:28;;:9;:14;;;:28;;;28184:101;;28252:9;28245:16;;;;;;28184:101;28587:261;28594:4;28587:261;;;28627:6;;;;;;;;28672:11;:17;28684:4;28672:17;;;;;;;;;;;28660:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28746:1;28720:28;;:9;:14;;;:28;;;28716:109;;28788:9;28781:16;;;;;;28716:109;28587:261;;;28138:729;28049:833;27996:886;28910:31;;;;;;;;;;;;;;27841:1108;;;;:::o;46381:191::-;46455:16;46474:6;;;;;;;;;;;46455:25;;46500:8;46491:6;;:17;;;;;;;;;;;;;;;;;;46555:8;46524:40;;46545:8;46524:40;;;;;;;;;;;;46444:128;46381:191;:::o;12104:326::-;12164:4;12421:1;12399:7;:19;;;:23;12392:30;;12104:326;;;:::o;40991:667::-;41154:4;41191:2;41175:36;;;41212:12;:10;:12::i;:::-;41226:4;41232:7;41241:5;41175:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;41171:480;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41426:1;41409:6;:13;:18;41405:235;;;41455:40;;;;;;;;;;;;;;41405:235;41598:6;41592:13;41583:6;41579:2;41575:15;41568:38;41171:480;41304:45;;;41294:55;;;:6;:55;;;;41287:62;;;40991:667;;;;;;:::o;29546:327::-;29619:13;29650:16;29658:7;29650;:16::i;:::-;29645:59;;29675:29;;;;;;;;;;;;;;29645:59;29717:21;29741:10;:8;:10::i;:::-;29717:34;;29794:1;29775:7;29769:21;:26;;:96;;;;;;;;;;;;;;;;;29822:7;29831:18;:7;:16;:18::i;:::-;29805:54;;;;;;;;;:::i;:::-;;;;;;;;;;;;;29769:96;29762:103;;;29546:327;;;:::o;42306:159::-;;;;;:::o;43124:158::-;;;;;:::o;33354:163::-;33477:32;33483:2;33487:8;33497:5;33504:4;33477:5;:32::i;:::-;33354:163;;;:::o;58523:100::-;58575:13;58608:7;58601:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58523:100;:::o;356:723::-;412:13;642:1;633:5;:10;629:53;;;660:10;;;;;;;;;;;;;;;;;;;;;629:53;692:12;707:5;692:20;;723:14;748:78;763:1;755:4;:9;748:78;;781:8;;;;;:::i;:::-;;;;812:2;804:10;;;;;:::i;:::-;;;748:78;;;836:19;868:6;858:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;836:39;;886:154;902:1;893:5;:10;886:154;;930:1;920:11;;;;;:::i;:::-;;;997:2;989:5;:10;;;;:::i;:::-;976:2;:24;;;;:::i;:::-;963:39;;946:6;953;946:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;1026:2;1017:11;;;;;:::i;:::-;;;886:154;;;1064:6;1050:21;;;;;356:723;;;;:::o;33776:1775::-;33915:20;33938:13;;33915:36;;33980:1;33966:16;;:2;:16;;;33962:48;;;33991:19;;;;;;;;;;;;;;33962:48;34037:1;34025:8;:13;34021:44;;;34047:18;;;;;;;;;;;;;;34021:44;34078:61;34108:1;34112:2;34116:12;34130:8;34078:21;:61::i;:::-;34451:8;34416:12;:16;34429:2;34416:16;;;;;;;;;;;;;;;:24;;;:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34515:8;34475:12;:16;34488:2;34475:16;;;;;;;;;;;;;;;:29;;;:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34574:2;34541:11;:25;34553:12;34541:25;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;34641:15;34591:11;:25;34603:12;34591:25;;;;;;;;;;;:40;;;:66;;;;;;;;;;;;;;;;;;34674:20;34697:12;34674:35;;34724:11;34753:8;34738:12;:23;34724:37;;34782:4;:23;;;;;34790:15;:2;:13;;;:15::i;:::-;34782:23;34778:641;;;34826:314;34882:12;34878:2;34857:38;;34874:1;34857:38;;;;;;;;;;;;34923:69;34962:1;34966:2;34970:14;;;;;;34986:5;34923:30;:69::i;:::-;34918:174;;35028:40;;;;;;;;;;;;;;34918:174;35135:3;35119:12;:19;;34826:314;;35221:12;35204:13;;:29;35200:43;;35235:8;;;35200:43;34778:641;;;35284:120;35340:14;;;;;;35336:2;35315:40;;35332:1;35315:40;;;;;;;;;;;;35399:3;35383:12;:19;;35284:120;;34778:641;35449:12;35433:13;:28;;;;34391:1082;;35483:60;35512:1;35516:2;35520:12;35534:8;35483:20;:60::i;:::-;33904:1647;33776:1775;;;;:::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:137::-;1343:5;1381:6;1368:20;1359:29;;1397:32;1423:5;1397:32;:::i;:::-;1298:137;;;;:::o;1441:141::-;1497:5;1528:6;1522:13;1513:22;;1544:32;1570:5;1544:32;:::i;:::-;1441:141;;;;:::o;1601:338::-;1656:5;1705:3;1698:4;1690:6;1686:17;1682:27;1672:122;;1713:79;;:::i;:::-;1672:122;1830:6;1817:20;1855:78;1929:3;1921:6;1914:4;1906:6;1902:17;1855:78;:::i;:::-;1846:87;;1662:277;1601:338;;;;:::o;1945:161::-;2002:5;2040:6;2027:20;2018:29;;2056:44;2094:5;2056:44;:::i;:::-;1945:161;;;;:::o;2126:553::-;2184:8;2194:6;2244:3;2237:4;2229:6;2225:17;2221:27;2211:122;;2252:79;;:::i;:::-;2211:122;2365:6;2352:20;2342:30;;2395:18;2387:6;2384:30;2381:117;;;2417:79;;:::i;:::-;2381:117;2531:4;2523:6;2519:17;2507:29;;2585:3;2577:4;2569:6;2565:17;2555:8;2551:32;2548:41;2545:128;;;2592:79;;:::i;:::-;2545:128;2126:553;;;;;:::o;2685:139::-;2731:5;2769:6;2756:20;2747:29;;2785:33;2812:5;2785:33;:::i;:::-;2685:139;;;;:::o;2830:329::-;2889:6;2938:2;2926:9;2917:7;2913:23;2909:32;2906:119;;;2944:79;;:::i;:::-;2906:119;3064:1;3089:53;3134:7;3125:6;3114:9;3110:22;3089:53;:::i;:::-;3079:63;;3035:117;2830:329;;;;:::o;3165:474::-;3233:6;3241;3290:2;3278:9;3269:7;3265:23;3261:32;3258:119;;;3296:79;;:::i;:::-;3258:119;3416:1;3441:53;3486:7;3477:6;3466:9;3462:22;3441:53;:::i;:::-;3431:63;;3387:117;3543:2;3569:53;3614:7;3605:6;3594:9;3590:22;3569:53;:::i;:::-;3559:63;;3514:118;3165:474;;;;;:::o;3645:619::-;3722:6;3730;3738;3787:2;3775:9;3766:7;3762:23;3758:32;3755:119;;;3793:79;;:::i;:::-;3755:119;3913:1;3938:53;3983:7;3974:6;3963:9;3959:22;3938:53;:::i;:::-;3928:63;;3884:117;4040:2;4066:53;4111:7;4102:6;4091:9;4087:22;4066:53;:::i;:::-;4056:63;;4011:118;4168:2;4194:53;4239:7;4230:6;4219:9;4215:22;4194:53;:::i;:::-;4184:63;;4139:118;3645:619;;;;;:::o;4270:943::-;4365:6;4373;4381;4389;4438:3;4426:9;4417:7;4413:23;4409:33;4406:120;;;4445:79;;:::i;:::-;4406:120;4565:1;4590:53;4635:7;4626:6;4615:9;4611:22;4590:53;:::i;:::-;4580:63;;4536:117;4692:2;4718:53;4763:7;4754:6;4743:9;4739:22;4718:53;:::i;:::-;4708:63;;4663:118;4820:2;4846:53;4891:7;4882:6;4871:9;4867:22;4846:53;:::i;:::-;4836:63;;4791:118;4976:2;4965:9;4961:18;4948:32;5007:18;4999:6;4996:30;4993:117;;;5029:79;;:::i;:::-;4993:117;5134:62;5188:7;5179:6;5168:9;5164:22;5134:62;:::i;:::-;5124:72;;4919:287;4270:943;;;;;;;:::o;5219:468::-;5284:6;5292;5341:2;5329:9;5320:7;5316:23;5312:32;5309:119;;;5347:79;;:::i;:::-;5309:119;5467:1;5492:53;5537:7;5528:6;5517:9;5513:22;5492:53;:::i;:::-;5482:63;;5438:117;5594:2;5620:50;5662:7;5653:6;5642:9;5638:22;5620:50;:::i;:::-;5610:60;;5565:115;5219:468;;;;;:::o;5693:474::-;5761:6;5769;5818:2;5806:9;5797:7;5793:23;5789:32;5786:119;;;5824:79;;:::i;:::-;5786:119;5944:1;5969:53;6014:7;6005:6;5994:9;5990:22;5969:53;:::i;:::-;5959:63;;5915:117;6071:2;6097:53;6142:7;6133:6;6122:9;6118:22;6097:53;:::i;:::-;6087:63;;6042:118;5693:474;;;;;:::o;6173:559::-;6259:6;6267;6316:2;6304:9;6295:7;6291:23;6287:32;6284:119;;;6322:79;;:::i;:::-;6284:119;6470:1;6459:9;6455:17;6442:31;6500:18;6492:6;6489:30;6486:117;;;6522:79;;:::i;:::-;6486:117;6635:80;6707:7;6698:6;6687:9;6683:22;6635:80;:::i;:::-;6617:98;;;;6413:312;6173:559;;;;;:::o;6738:327::-;6796:6;6845:2;6833:9;6824:7;6820:23;6816:32;6813:119;;;6851:79;;:::i;:::-;6813:119;6971:1;6996:52;7040:7;7031:6;7020:9;7016:22;6996:52;:::i;:::-;6986:62;;6942:116;6738:327;;;;:::o;7071:349::-;7140:6;7189:2;7177:9;7168:7;7164:23;7160:32;7157:119;;;7195:79;;:::i;:::-;7157:119;7315:1;7340:63;7395:7;7386:6;7375:9;7371:22;7340:63;:::i;:::-;7330:73;;7286:127;7071:349;;;;:::o;7426:351::-;7496:6;7545:2;7533:9;7524:7;7520:23;7516:32;7513:119;;;7551:79;;:::i;:::-;7513:119;7671:1;7696:64;7752:7;7743:6;7732:9;7728:22;7696:64;:::i;:::-;7686:74;;7642:128;7426:351;;;;:::o;7783:529::-;7854:6;7862;7911:2;7899:9;7890:7;7886:23;7882:32;7879:119;;;7917:79;;:::i;:::-;7879:119;8065:1;8054:9;8050:17;8037:31;8095:18;8087:6;8084:30;8081:117;;;8117:79;;:::i;:::-;8081:117;8230:65;8287:7;8278:6;8267:9;8263:22;8230:65;:::i;:::-;8212:83;;;;8008:297;7783:529;;;;;:::o;8318:329::-;8377:6;8426:2;8414:9;8405:7;8401:23;8397:32;8394:119;;;8432:79;;:::i;:::-;8394:119;8552:1;8577:53;8622:7;8613:6;8602:9;8598:22;8577:53;:::i;:::-;8567:63;;8523:117;8318:329;;;;:::o;8653:118::-;8740:24;8758:5;8740:24;:::i;:::-;8735:3;8728:37;8653:118;;:::o;8777:109::-;8858:21;8873:5;8858:21;:::i;:::-;8853:3;8846:34;8777:109;;:::o;8892:360::-;8978:3;9006:38;9038:5;9006:38;:::i;:::-;9060:70;9123:6;9118:3;9060:70;:::i;:::-;9053:77;;9139:52;9184:6;9179:3;9172:4;9165:5;9161:16;9139:52;:::i;:::-;9216:29;9238:6;9216:29;:::i;:::-;9211:3;9207:39;9200:46;;8982:270;8892:360;;;;:::o;9258:149::-;9354:46;9394:5;9354:46;:::i;:::-;9349:3;9342:59;9258:149;;:::o;9413:364::-;9501:3;9529:39;9562:5;9529:39;:::i;:::-;9584:71;9648:6;9643:3;9584:71;:::i;:::-;9577:78;;9664:52;9709:6;9704:3;9697:4;9690:5;9686:16;9664:52;:::i;:::-;9741:29;9763:6;9741:29;:::i;:::-;9736:3;9732:39;9725:46;;9505:272;9413:364;;;;:::o;9783:377::-;9889:3;9917:39;9950:5;9917:39;:::i;:::-;9972:89;10054:6;10049:3;9972:89;:::i;:::-;9965:96;;10070:52;10115:6;10110:3;10103:4;10096:5;10092:16;10070:52;:::i;:::-;10147:6;10142:3;10138:16;10131:23;;9893:267;9783:377;;;;:::o;10166:366::-;10308:3;10329:67;10393:2;10388:3;10329:67;:::i;:::-;10322:74;;10405:93;10494:3;10405:93;:::i;:::-;10523:2;10518:3;10514:12;10507:19;;10166:366;;;:::o;10538:::-;10680:3;10701:67;10765:2;10760:3;10701:67;:::i;:::-;10694:74;;10777:93;10866:3;10777:93;:::i;:::-;10895:2;10890:3;10886:12;10879:19;;10538:366;;;:::o;10910:::-;11052:3;11073:67;11137:2;11132:3;11073:67;:::i;:::-;11066:74;;11149:93;11238:3;11149:93;:::i;:::-;11267:2;11262:3;11258:12;11251:19;;10910:366;;;:::o;11282:::-;11424:3;11445:67;11509:2;11504:3;11445:67;:::i;:::-;11438:74;;11521:93;11610:3;11521:93;:::i;:::-;11639:2;11634:3;11630:12;11623:19;;11282:366;;;:::o;11654:::-;11796:3;11817:67;11881:2;11876:3;11817:67;:::i;:::-;11810:74;;11893:93;11982:3;11893:93;:::i;:::-;12011:2;12006:3;12002:12;11995:19;;11654:366;;;:::o;12026:::-;12168:3;12189:67;12253:2;12248:3;12189:67;:::i;:::-;12182:74;;12265:93;12354:3;12265:93;:::i;:::-;12383:2;12378:3;12374:12;12367:19;;12026:366;;;:::o;12398:::-;12540:3;12561:67;12625:2;12620:3;12561:67;:::i;:::-;12554:74;;12637:93;12726:3;12637:93;:::i;:::-;12755:2;12750:3;12746:12;12739:19;;12398:366;;;:::o;12770:400::-;12930:3;12951:84;13033:1;13028:3;12951:84;:::i;:::-;12944:91;;13044:93;13133:3;13044:93;:::i;:::-;13162:1;13157:3;13153:11;13146:18;;12770:400;;;:::o;13176:366::-;13318:3;13339:67;13403:2;13398:3;13339:67;:::i;:::-;13332:74;;13415:93;13504:3;13415:93;:::i;:::-;13533:2;13528:3;13524:12;13517:19;;13176:366;;;:::o;13548:::-;13690:3;13711:67;13775:2;13770:3;13711:67;:::i;:::-;13704:74;;13787:93;13876:3;13787:93;:::i;:::-;13905:2;13900:3;13896:12;13889:19;;13548:366;;;:::o;13920:398::-;14079:3;14100:83;14181:1;14176:3;14100:83;:::i;:::-;14093:90;;14192:93;14281:3;14192:93;:::i;:::-;14310:1;14305:3;14301:11;14294:18;;13920:398;;;:::o;14324:366::-;14466:3;14487:67;14551:2;14546:3;14487:67;:::i;:::-;14480:74;;14563:93;14652:3;14563:93;:::i;:::-;14681:2;14676:3;14672:12;14665:19;;14324:366;;;:::o;14696:118::-;14783:24;14801:5;14783:24;:::i;:::-;14778:3;14771:37;14696:118;;:::o;14820:701::-;15101:3;15123:95;15214:3;15205:6;15123:95;:::i;:::-;15116:102;;15235:95;15326:3;15317:6;15235:95;:::i;:::-;15228:102;;15347:148;15491:3;15347:148;:::i;:::-;15340:155;;15512:3;15505:10;;14820:701;;;;;:::o;15527:379::-;15711:3;15733:147;15876:3;15733:147;:::i;:::-;15726:154;;15897:3;15890:10;;15527:379;;;:::o;15912:222::-;16005:4;16043:2;16032:9;16028:18;16020:26;;16056:71;16124:1;16113:9;16109:17;16100:6;16056:71;:::i;:::-;15912:222;;;;:::o;16140:640::-;16335:4;16373:3;16362:9;16358:19;16350:27;;16387:71;16455:1;16444:9;16440:17;16431:6;16387:71;:::i;:::-;16468:72;16536:2;16525:9;16521:18;16512:6;16468:72;:::i;:::-;16550;16618:2;16607:9;16603:18;16594:6;16550:72;:::i;:::-;16669:9;16663:4;16659:20;16654:2;16643:9;16639:18;16632:48;16697:76;16768:4;16759:6;16697:76;:::i;:::-;16689:84;;16140:640;;;;;;;:::o;16786:210::-;16873:4;16911:2;16900:9;16896:18;16888:26;;16924:65;16986:1;16975:9;16971:17;16962:6;16924:65;:::i;:::-;16786:210;;;;:::o;17002:240::-;17104:4;17142:2;17131:9;17127:18;17119:26;;17155:80;17232:1;17221:9;17217:17;17208:6;17155:80;:::i;:::-;17002:240;;;;:::o;17248:313::-;17361:4;17399:2;17388:9;17384:18;17376:26;;17448:9;17442:4;17438:20;17434:1;17423:9;17419:17;17412:47;17476:78;17549:4;17540:6;17476:78;:::i;:::-;17468:86;;17248:313;;;;:::o;17567:419::-;17733:4;17771:2;17760:9;17756:18;17748:26;;17820:9;17814:4;17810:20;17806:1;17795:9;17791:17;17784:47;17848:131;17974:4;17848:131;:::i;:::-;17840:139;;17567:419;;;:::o;17992:::-;18158:4;18196:2;18185:9;18181:18;18173:26;;18245:9;18239:4;18235:20;18231:1;18220:9;18216:17;18209:47;18273:131;18399:4;18273:131;:::i;:::-;18265:139;;17992:419;;;:::o;18417:::-;18583:4;18621:2;18610:9;18606:18;18598:26;;18670:9;18664:4;18660:20;18656:1;18645:9;18641:17;18634:47;18698:131;18824:4;18698:131;:::i;:::-;18690:139;;18417:419;;;:::o;18842:::-;19008:4;19046:2;19035:9;19031:18;19023:26;;19095:9;19089:4;19085:20;19081:1;19070:9;19066:17;19059:47;19123:131;19249:4;19123:131;:::i;:::-;19115:139;;18842:419;;;:::o;19267:::-;19433:4;19471:2;19460:9;19456:18;19448:26;;19520:9;19514:4;19510:20;19506:1;19495:9;19491:17;19484:47;19548:131;19674:4;19548:131;:::i;:::-;19540:139;;19267:419;;;:::o;19692:::-;19858:4;19896:2;19885:9;19881:18;19873:26;;19945:9;19939:4;19935:20;19931:1;19920:9;19916:17;19909:47;19973:131;20099:4;19973:131;:::i;:::-;19965:139;;19692:419;;;:::o;20117:::-;20283:4;20321:2;20310:9;20306:18;20298:26;;20370:9;20364:4;20360:20;20356:1;20345:9;20341:17;20334:47;20398:131;20524:4;20398:131;:::i;:::-;20390:139;;20117:419;;;:::o;20542:::-;20708:4;20746:2;20735:9;20731:18;20723:26;;20795:9;20789:4;20785:20;20781:1;20770:9;20766:17;20759:47;20823:131;20949:4;20823:131;:::i;:::-;20815:139;;20542:419;;;:::o;20967:::-;21133:4;21171:2;21160:9;21156:18;21148:26;;21220:9;21214:4;21210:20;21206:1;21195:9;21191:17;21184:47;21248:131;21374:4;21248:131;:::i;:::-;21240:139;;20967:419;;;:::o;21392:::-;21558:4;21596:2;21585:9;21581:18;21573:26;;21645:9;21639:4;21635:20;21631:1;21620:9;21616:17;21609:47;21673:131;21799:4;21673:131;:::i;:::-;21665:139;;21392:419;;;:::o;21817:222::-;21910:4;21948:2;21937:9;21933:18;21925:26;;21961:71;22029:1;22018:9;22014:17;22005:6;21961:71;:::i;:::-;21817:222;;;;:::o;22045:129::-;22079:6;22106:20;;:::i;:::-;22096:30;;22135:33;22163:4;22155:6;22135:33;:::i;:::-;22045:129;;;:::o;22180:75::-;22213:6;22246:2;22240:9;22230:19;;22180:75;:::o;22261:307::-;22322:4;22412:18;22404:6;22401:30;22398:56;;;22434:18;;:::i;:::-;22398:56;22472:29;22494:6;22472:29;:::i;:::-;22464:37;;22556:4;22550;22546:15;22538:23;;22261:307;;;:::o;22574:98::-;22625:6;22659:5;22653:12;22643:22;;22574:98;;;:::o;22678:99::-;22730:6;22764:5;22758:12;22748:22;;22678:99;;;:::o;22783:168::-;22866:11;22900:6;22895:3;22888:19;22940:4;22935:3;22931:14;22916:29;;22783:168;;;;:::o;22957:147::-;23058:11;23095:3;23080:18;;22957:147;;;;:::o;23110:169::-;23194:11;23228:6;23223:3;23216:19;23268:4;23263:3;23259:14;23244:29;;23110:169;;;;:::o;23285:148::-;23387:11;23424:3;23409:18;;23285:148;;;;:::o;23439:305::-;23479:3;23498:20;23516:1;23498:20;:::i;:::-;23493:25;;23532:20;23550:1;23532:20;:::i;:::-;23527:25;;23686:1;23618:66;23614:74;23611:1;23608:81;23605:107;;;23692:18;;:::i;:::-;23605:107;23736:1;23733;23729:9;23722:16;;23439:305;;;;:::o;23750:185::-;23790:1;23807:20;23825:1;23807:20;:::i;:::-;23802:25;;23841:20;23859:1;23841:20;:::i;:::-;23836:25;;23880:1;23870:35;;23885:18;;:::i;:::-;23870:35;23927:1;23924;23920:9;23915:14;;23750:185;;;;:::o;23941:191::-;23981:4;24001:20;24019:1;24001:20;:::i;:::-;23996:25;;24035:20;24053:1;24035:20;:::i;:::-;24030:25;;24074:1;24071;24068:8;24065:34;;;24079:18;;:::i;:::-;24065:34;24124:1;24121;24117:9;24109:17;;23941:191;;;;:::o;24138:96::-;24175:7;24204:24;24222:5;24204:24;:::i;:::-;24193:35;;24138:96;;;:::o;24240:90::-;24274:7;24317:5;24310:13;24303:21;24292:32;;24240:90;;;:::o;24336:149::-;24372:7;24412:66;24405:5;24401:78;24390:89;;24336:149;;;:::o;24491:133::-;24539:7;24568:5;24557:16;;24574:44;24612:5;24574:44;:::i;:::-;24491:133;;;:::o;24630:126::-;24667:7;24707:42;24700:5;24696:54;24685:65;;24630:126;;;:::o;24762:77::-;24799:7;24828:5;24817:16;;24762:77;;;:::o;24845:133::-;24904:9;24937:35;24966:5;24937:35;:::i;:::-;24924:48;;24845:133;;;:::o;24984:154::-;25068:6;25063:3;25058;25045:30;25130:1;25121:6;25116:3;25112:16;25105:27;24984:154;;;:::o;25144:307::-;25212:1;25222:113;25236:6;25233:1;25230:13;25222:113;;;25321:1;25316:3;25312:11;25306:18;25302:1;25297:3;25293:11;25286:39;25258:2;25255:1;25251:10;25246:15;;25222:113;;;25353:6;25350:1;25347:13;25344:101;;;25433:1;25424:6;25419:3;25415:16;25408:27;25344:101;25193:258;25144:307;;;:::o;25457:320::-;25501:6;25538:1;25532:4;25528:12;25518:22;;25585:1;25579:4;25575:12;25606:18;25596:81;;25662:4;25654:6;25650:17;25640:27;;25596:81;25724:2;25716:6;25713:14;25693:18;25690:38;25687:84;;;25743:18;;:::i;:::-;25687:84;25508:269;25457:320;;;:::o;25783:281::-;25866:27;25888:4;25866:27;:::i;:::-;25858:6;25854:40;25996:6;25984:10;25981:22;25960:18;25948:10;25945:34;25942:62;25939:88;;;26007:18;;:::i;:::-;25939:88;26047:10;26043:2;26036:22;25826:238;25783:281;;:::o;26070:233::-;26109:3;26132:24;26150:5;26132:24;:::i;:::-;26123:33;;26178:66;26171:5;26168:77;26165:103;;;26248:18;;:::i;:::-;26165:103;26295:1;26288:5;26284:13;26277:20;;26070:233;;;:::o;26309:176::-;26341:1;26358:20;26376:1;26358:20;:::i;:::-;26353:25;;26392:20;26410:1;26392:20;:::i;:::-;26387:25;;26431:1;26421:35;;26436:18;;:::i;:::-;26421:35;26477:1;26474;26470:9;26465:14;;26309:176;;;;:::o;26491:180::-;26539:77;26536:1;26529:88;26636:4;26633:1;26626:15;26660:4;26657:1;26650:15;26677:180;26725:77;26722:1;26715:88;26822:4;26819:1;26812:15;26846:4;26843:1;26836:15;26863:180;26911:77;26908:1;26901:88;27008:4;27005:1;26998:15;27032:4;27029:1;27022:15;27049:180;27097:77;27094:1;27087:88;27194:4;27191:1;27184:15;27218:4;27215:1;27208:15;27235:180;27283:77;27280:1;27273:88;27380:4;27377:1;27370:15;27404:4;27401:1;27394:15;27421:180;27469:77;27466:1;27459:88;27566:4;27563:1;27556:15;27590:4;27587:1;27580:15;27607:117;27716:1;27713;27706:12;27730:117;27839:1;27836;27829:12;27853:117;27962:1;27959;27952:12;27976:117;28085:1;28082;28075:12;28099:117;28208:1;28205;28198:12;28222:117;28331:1;28328;28321:12;28345:102;28386:6;28437:2;28433:7;28428:2;28421:5;28417:14;28413:28;28403:38;;28345:102;;;:::o;28453:165::-;28593:17;28589:1;28581:6;28577:14;28570:41;28453:165;:::o;28624:225::-;28764:34;28760:1;28752:6;28748:14;28741:58;28833:8;28828:2;28820:6;28816:15;28809:33;28624:225;:::o;28855:175::-;28995:27;28991:1;28983:6;28979:14;28972:51;28855:175;:::o;29036:170::-;29176:22;29172:1;29164:6;29160:14;29153:46;29036:170;:::o;29212:::-;29352:22;29348:1;29340:6;29336:14;29329:46;29212:170;:::o;29388:166::-;29528:18;29524:1;29516:6;29512:14;29505:42;29388:166;:::o;29560:::-;29700:18;29696:1;29688:6;29684:14;29677:42;29560:166;:::o;29732:155::-;29872:7;29868:1;29860:6;29856:14;29849:31;29732:155;:::o;29893:182::-;30033:34;30029:1;30021:6;30017:14;30010:58;29893:182;:::o;30081:166::-;30221:18;30217:1;30209:6;30205:14;30198:42;30081:166;:::o;30253:114::-;;:::o;30373:172::-;30513:24;30509:1;30501:6;30497:14;30490:48;30373:172;:::o;30551:116::-;30635:1;30628:5;30625:12;30615:46;;30641:18;;:::i;:::-;30615:46;30551:116;:::o;30673:122::-;30746:24;30764:5;30746:24;:::i;:::-;30739:5;30736:35;30726:63;;30785:1;30782;30775:12;30726:63;30673:122;:::o;30801:116::-;30871:21;30886:5;30871:21;:::i;:::-;30864:5;30861:32;30851:60;;30907:1;30904;30897:12;30851:60;30801:116;:::o;30923:120::-;30995:23;31012:5;30995:23;:::i;:::-;30988:5;30985:34;30975:62;;31033:1;31030;31023:12;30975:62;30923:120;:::o;31049:110::-;31133:1;31126:5;31123:12;31113:40;;31149:1;31146;31139:12;31113:40;31049:110;:::o;31165:122::-;31238:24;31256:5;31238:24;:::i;:::-;31231:5;31228:35;31218:63;;31277:1;31274;31267:12;31218:63;31165:122;:::o

Swarm Source

ipfs://1fe368dcce0f4a37f499fd0d6f01568c08b479d0bab4a1376fc86cb8bcf8ba1e
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.