ETH Price: $3,796.87 (-1.31%)

moonmoon (MOON)
 

Overview

TokenID

978

Total Transfers

-

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

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

Compiler Version
v0.8.15+commit.e14f2714

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-07-14
*/

// SPDX-License-Identifier: MIT 
// File: @openzeppelin/contracts/utils/Strings.sol
// 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/Address.sol


// OpenZeppelin Contracts (last updated v4.5.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

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

// File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol


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

pragma solidity ^0.8.0;

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

// File: @openzeppelin/contracts/utils/introspection/IERC165.sol


// 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/utils/introspection/ERC165.sol


// 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: @openzeppelin/contracts/token/ERC721/IERC721.sol


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

pragma solidity ^0.8.0;


/**
 * @dev Required interface of an ERC721 compliant contract.
 */
interface IERC721 is IERC165 {
    /**
     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.
     */
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);

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

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

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

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

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol


// 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/utils/Context.sol


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

pragma solidity ^0.8.0;

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

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

// File: erc721a/contracts/ERC721A.sol


// Creator: Chiru Labs

pragma solidity ^0.8.4;








error ApprovalCallerNotOwnerNorApproved();
error ApprovalQueryForNonexistentToken();
error ApproveToCaller();
error ApprovalToCurrentOwner();
error BalanceQueryForZeroAddress();
error MintToZeroAddress();
error MintZeroQuantity();
error OwnerQueryForNonexistentToken();
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 0;
    }

    /**
     * @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) {
        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) {
        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) {
        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 {
        _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())) : '';
    }

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

        if (prevOwnership.addr != from) revert TransferFromIncorrectOwner();

        bool isApprovedOrOwner = (_msgSender() == from ||
            isApprovedForAll(from, _msgSender()) ||
            getApproved(tokenId) == _msgSender());

        if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        if (to == address(0)) revert TransferToZeroAddress();

        _beforeTokenTransfers(from, to, tokenId, 1);

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

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

            TokenOwnership storage currSlot = _ownerships[tokenId];
            currSlot.addr = to;
            currSlot.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;
            TokenOwnership storage nextSlot = _ownerships[nextTokenId];
            if (nextSlot.addr == address(0)) {
                // This will suffice for checking _exists(nextTokenId),
                // as a burned slot cannot contain the zero address.
                if (nextTokenId != _currentIndex) {
                    nextSlot.addr = from;
                    nextSlot.startTimestamp = prevOwnership.startTimestamp;
                }
            }
        }

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

    /**
     * @dev This is equivalent to _burn(tokenId, false)
     */
    function _burn(uint256 tokenId) internal virtual {
        _burn(tokenId, false);
    }

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

        address from = prevOwnership.addr;

        if (approvalCheck) {
            bool isApprovedOrOwner = (_msgSender() == from ||
                isApprovedForAll(from, _msgSender()) ||
                getApproved(tokenId) == _msgSender());

            if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        }

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

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

        // 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 storage addressData = _addressData[from];
            addressData.balance -= 1;
            addressData.numberBurned += 1;

            // Keep track of who burned the token, and the timestamp of burning.
            TokenOwnership storage currSlot = _ownerships[tokenId];
            currSlot.addr = from;
            currSlot.startTimestamp = uint64(block.timestamp);
            currSlot.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;
            TokenOwnership storage nextSlot = _ownerships[nextTokenId];
            if (nextSlot.addr == address(0)) {
                // This will suffice for checking _exists(nextTokenId),
                // as a burned slot cannot contain the zero address.
                if (nextTokenId != _currentIndex) {
                    nextSlot.addr = from;
                    nextSlot.startTimestamp = prevOwnership.startTimestamp;
                }
            }
        }

        emit Transfer(from, address(0), tokenId);
        _afterTokenTransfers(from, 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: @openzeppelin/contracts/access/Ownable.sol


// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)

pragma solidity ^0.8.0;


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

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

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

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

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

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

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

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

// File: contracts/MOONMOON.sol


pragma solidity >=0.8.0 <0.9.0;





contract moonmoon is ERC721A, Ownable { 

  using Strings for uint256;

  string private uriPrefix = "ipfs://QmdchXXfbCrxms9Xis997dVVxz6U25MbVbwrD5SLe8q23r/";
  string public uriSuffix = ".json"; 
  string public hiddenMetadataUri;
  
  uint256 public cost = 0.00 ether; 

  uint256 public maxSupply = 2000; 
  uint256 public maxMintAmountPerTx = 1; 
  uint256 public totalMaxMintAmount = 1; 

  uint256 public freeMaxMintAmount = 1; 

  bool public paused = true;
  bool public publicSale = false;
  bool public revealed = false;

  mapping(address => uint256) public addressMintedBalance; 

  constructor() ERC721A("moonmoon", "MOON") { 
         setHiddenMetadataUri("ipfs://QmarkEM8ZJjq8dRuFZ8t45FN5jcDbwq9pRsYEkRQ8nNc9s/hidden.json"); 
            ownerMint(5); 
    } 

  // MODIFIERS 
  
  modifier mintCompliance(uint256 _mintAmount) {
    if (msg.sender != owner()) { 
        require(_mintAmount > 0 && _mintAmount <= maxMintAmountPerTx, 'Invalid mint amount!');
    }
    require(totalSupply() + _mintAmount <= maxSupply, 'Max supply exceeded!');
    _;
  } 

  modifier mintPriceCompliance(uint256 _mintAmount) {
    uint256 ownerMintedCount = addressMintedBalance[msg.sender];
   if (ownerMintedCount >= freeMaxMintAmount) {
        require(msg.value >= cost * _mintAmount, 'Insufficient funds!');
   }
        _;
  }

  // MINTS 

   function mint(uint256 _mintAmount) public payable mintCompliance(_mintAmount) mintPriceCompliance(_mintAmount) {
    require(!paused, 'The contract is paused!'); 
    require(publicSale, "Not open to public yet!");
    uint256 ownerMintedCount = addressMintedBalance[msg.sender];

    if (ownerMintedCount < freeMaxMintAmount) {  
            require(ownerMintedCount + _mintAmount <= freeMaxMintAmount, "Exceeded Free Mint Limit");
        } else if (ownerMintedCount >= freeMaxMintAmount) { 
            require(ownerMintedCount + _mintAmount <= totalMaxMintAmount, "Exceeded Mint Limit");
        }

    _safeMint(_msgSender(), _mintAmount);
    for (uint256 i = 1; i <=_mintAmount; i++){
        addressMintedBalance[msg.sender]++;
    }
  }

  function ownerMint(uint256 _mintAmount) public payable onlyOwner {
     require(_mintAmount > 0, 'Invalid mint amount!');
     require(totalSupply() + _mintAmount <= maxSupply, 'Max supply exceeded!');
    _safeMint(_msgSender(), _mintAmount);
  }

function mintForAddress(uint256 _mintAmount, address _receiver) public mintCompliance(_mintAmount) onlyOwner {
    _safeMint(_receiver, _mintAmount);
  }
  
  function walletOfOwner(address _owner) public view returns (uint256[] memory) {
    uint256 ownerTokenCount = balanceOf(_owner);
    uint256[] memory ownedTokenIds = new uint256[](ownerTokenCount);
    uint256 currentTokenId = _startTokenId();
    uint256 ownedTokenIndex = 0;
    address latestOwnerAddress;

    while (ownedTokenIndex < ownerTokenCount && currentTokenId <= maxSupply) {
      TokenOwnership memory ownership = _ownerships[currentTokenId];

      if (!ownership.burned && ownership.addr != address(0)) {
        latestOwnerAddress = ownership.addr;
      }

      if (latestOwnerAddress == _owner) {
        ownedTokenIds[ownedTokenIndex] = currentTokenId;

        ownedTokenIndex++;
      }

      currentTokenId++;
    }

    return ownedTokenIds;
  }

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

  function tokenURI(uint256 _tokenId) public view virtual override returns (string memory) {
    require(_exists(_tokenId), 'ERC721Metadata: URI query for nonexistent token');

    if (revealed == false) {
      return hiddenMetadataUri;
    }

    string memory currentBaseURI = _baseURI();
    return bytes(currentBaseURI).length > 0
        ? string(abi.encodePacked(currentBaseURI, _tokenId.toString(), uriSuffix))
        : '';
  }

  function setRevealed(bool _state) public onlyOwner {
    revealed = _state;
  }

  function setCost(uint256 _cost) public onlyOwner {
    cost = _cost; 
  }

   function setFreeMaxMintAmount(uint256 _freeMaxMintAmount) public onlyOwner {
    freeMaxMintAmount = _freeMaxMintAmount; 
  }

  function setTotalMaxMintAmount(uint _amount) public onlyOwner {
      require(_amount <= maxSupply, "Exceed total amount");
      totalMaxMintAmount = _amount;
  }

  function setMaxMintAmountPerTx(uint256 _maxMintAmountPerTx) public onlyOwner {
    maxMintAmountPerTx = _maxMintAmountPerTx;
  }

  function setHiddenMetadataUri(string memory _hiddenMetadataUri) public onlyOwner {
    hiddenMetadataUri = _hiddenMetadataUri;
  }

  function setUriPrefix(string memory _uriPrefix) public onlyOwner {
    uriPrefix = _uriPrefix;
  }

  function setUriSuffix(string memory _uriSuffix) public onlyOwner {
    uriSuffix = _uriSuffix;
  }

  function setPaused(bool _state) public onlyOwner {
    paused = _state;
  }

  function setPublicSale(bool _state) public onlyOwner {
    publicSale = _state;
  }

  // WITHDRAW
    function withdraw() public payable onlyOwner {
  
    (bool os, ) = payable(owner()).call{value: address(this).balance}(""); 
    require(os);
   
  }

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

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":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","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":[{"internalType":"address","name":"","type":"address"}],"name":"addressMintedBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"freeMaxMintAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"hiddenMetadataUri","outputs":[{"internalType":"string","name":"","type":"string"}],"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":"maxMintAmountPerTx","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"},{"internalType":"address","name":"_receiver","type":"address"}],"name":"mintForAddress","outputs":[],"stateMutability":"nonpayable","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":"_mintAmount","type":"uint256"}],"name":"ownerMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicSale","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_cost","type":"uint256"}],"name":"setCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_freeMaxMintAmount","type":"uint256"}],"name":"setFreeMaxMintAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_hiddenMetadataUri","type":"string"}],"name":"setHiddenMetadataUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxMintAmountPerTx","type":"uint256"}],"name":"setMaxMintAmountPerTx","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setPaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setPublicSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setRevealed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"setTotalMaxMintAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uriPrefix","type":"string"}],"name":"setUriPrefix","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uriSuffix","type":"string"}],"name":"setUriSuffix","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalMaxMintAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uriSuffix","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"}]

608060405260405180606001604052806036815260200162005c3f60369139600990816200002e919062000d5c565b506040518060400160405280600581526020017f2e6a736f6e000000000000000000000000000000000000000000000000000000815250600a908162000075919062000d5c565b506000600c556107d0600d556001600e556001600f5560016010556001601160006101000a81548160ff0219169083151502179055506000601160016101000a81548160ff0219169083151502179055506000601160026101000a81548160ff021916908315150217905550348015620000ee57600080fd5b506040518060400160405280600881526020017f6d6f6f6e6d6f6f6e0000000000000000000000000000000000000000000000008152506040518060400160405280600481526020017f4d4f4f4e0000000000000000000000000000000000000000000000000000000081525081600290816200016c919062000d5c565b5080600390816200017e919062000d5c565b506200018f620001f960201b60201c565b6000819055505050620001b7620001ab6200020260201b60201c565b6200020a60201b60201c565b620001e160405180608001604052806041815260200162005c7560419139620002d060201b60201c565b620001f360056200037460201b60201c565b62001218565b60006001905090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620002e06200020260201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1662000306620004d160201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16146200035f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620003569062000ea4565b60405180910390fd5b80600b908162000370919062000d5c565b5050565b620003846200020260201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620003aa620004d160201b60201c565b73ffffffffffffffffffffffffffffffffffffffff161462000403576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620003fa9062000ea4565b60405180910390fd5b6000811162000449576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620004409062000f16565b60405180910390fd5b600d54816200045d620004fb60201b60201c565b62000469919062000f67565b1115620004ad576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620004a49062001014565b60405180910390fd5b620004ce620004c16200020260201b60201c565b826200051a60201b60201c565b50565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60006200050d620001f960201b60201c565b6001546000540303905090565b6200053c8282604051806020016040528060008152506200054060201b60201c565b5050565b6200055583838360016200055a60201b60201c565b505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603620005c7576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000840362000602576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6200061760008683876200095260201b60201c565b83600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600081905060008582019050838015620007ef5750620007ee8773ffffffffffffffffffffffffffffffffffffffff166200095860201b620024b31760201c565b5b15620008c1575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46200086d60008884806001019550886200097b60201b60201c565b620008a4576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b808203620007f6578260005414620008bb57600080fd5b6200092d565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808203620008c2575b8160008190555050506200094b600086838762000adc60201b60201c565b5050505050565b50505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02620009a96200020260201b60201c565b8786866040518563ffffffff1660e01b8152600401620009cd949392919062001130565b6020604051808303816000875af192505050801562000a0c57506040513d601f19601f8201168201806040525081019062000a099190620011e6565b60015b62000a89573d806000811462000a3f576040519150601f19603f3d011682016040523d82523d6000602084013e62000a44565b606091505b50600081510362000a81576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b50505050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168062000b6457607f821691505b60208210810362000b7a5762000b7962000b1c565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b60006008830262000be47fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000ba5565b62000bf0868362000ba5565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b600062000c3d62000c3762000c318462000c08565b62000c12565b62000c08565b9050919050565b6000819050919050565b62000c598362000c1c565b62000c7162000c688262000c44565b84845462000bb2565b825550505050565b600090565b62000c8862000c79565b62000c9581848462000c4e565b505050565b5b8181101562000cbd5762000cb160008262000c7e565b60018101905062000c9b565b5050565b601f82111562000d0c5762000cd68162000b80565b62000ce18462000b95565b8101602085101562000cf1578190505b62000d0962000d008562000b95565b83018262000c9a565b50505b505050565b600082821c905092915050565b600062000d316000198460080262000d11565b1980831691505092915050565b600062000d4c838362000d1e565b9150826002028217905092915050565b62000d678262000ae2565b67ffffffffffffffff81111562000d835762000d8262000aed565b5b62000d8f825462000b4b565b62000d9c82828562000cc1565b600060209050601f83116001811462000dd4576000841562000dbf578287015190505b62000dcb858262000d3e565b86555062000e3b565b601f19841662000de48662000b80565b60005b8281101562000e0e5784890151825560018201915060208501945060208101905062000de7565b8683101562000e2e578489015162000e2a601f89168262000d1e565b8355505b6001600288020188555050505b505050505050565b600082825260208201905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600062000e8c60208362000e43565b915062000e998262000e54565b602082019050919050565b6000602082019050818103600083015262000ebf8162000e7d565b9050919050565b7f496e76616c6964206d696e7420616d6f756e7421000000000000000000000000600082015250565b600062000efe60148362000e43565b915062000f0b8262000ec6565b602082019050919050565b6000602082019050818103600083015262000f318162000eef565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600062000f748262000c08565b915062000f818362000c08565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111562000fb95762000fb862000f38565b5b828201905092915050565b7f4d617820737570706c7920657863656564656421000000000000000000000000600082015250565b600062000ffc60148362000e43565b9150620010098262000fc4565b602082019050919050565b600060208201905081810360008301526200102f8162000fed565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620010638262001036565b9050919050565b620010758162001056565b82525050565b620010868162000c08565b82525050565b600081519050919050565b600082825260208201905092915050565b60005b83811015620010c8578082015181840152602081019050620010ab565b83811115620010d8576000848401525b50505050565b6000601f19601f8301169050919050565b6000620010fc826200108c565b62001108818562001097565b93506200111a818560208601620010a8565b6200112581620010de565b840191505092915050565b60006080820190506200114760008301876200106a565b6200115660208301866200106a565b6200116560408301856200107b565b8181036060830152620011798184620010ef565b905095945050505050565b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b620011c08162001189565b8114620011cc57600080fd5b50565b600081519050620011e081620011b5565b92915050565b600060208284031215620011ff57620011fe62001184565b5b60006200120f84828501620011cf565b91505092915050565b614a1780620012286000396000f3fe60806040526004361061025c5760003560e01c80635c975abb11610144578063b071401b116100b6578063e0a808531161007a578063e0a80853146108b6578063e4386d26146108df578063e985e9c51461090a578063efbd73f414610947578063f19e75d414610970578063f2fde38b1461098c5761025c565b8063b071401b146107d3578063b88d4fde146107fc578063c87b56dd14610825578063d4fcb2ae14610862578063d5abeb011461088b5761025c565b80638da5cb5b116101085780638da5cb5b146106e257806394354fd01461070d57806395d89b4114610738578063a0712d6814610763578063a22cb4651461077f578063a45ba8e7146107a85761025c565b80635c975abb146105fd5780636352211e1461062857806370a0823114610665578063715018a6146106a25780637ec4a659146106b95761025c565b806318cae269116101dd578063438b6300116101a1578063438b6300146104ef57806344a0d68a1461052c5780634fdd43cb14610555578063518302271461057e5780635503a0e8146105a95780635aca1bb6146105d45761025c565b806318cae2691461042b57806323b872dd1461046857806333bc1c5c146104915780633ccfd60b146104bc57806342842e0e146104c65761025c565b80631159aca4116102245780631159aca41461035857806313faede61461038357806316ba10e0146103ae57806316c38b3c146103d757806318160ddd146104005761025c565b806301ffc9a71461026157806306fdde031461029e578063081812fc146102c9578063095ea7b3146103065780631042779c1461032f575b600080fd5b34801561026d57600080fd5b5061028860048036038101906102839190613651565b6109b5565b6040516102959190613699565b60405180910390f35b3480156102aa57600080fd5b506102b3610a97565b6040516102c0919061374d565b60405180910390f35b3480156102d557600080fd5b506102f060048036038101906102eb91906137a5565b610b29565b6040516102fd9190613813565b60405180910390f35b34801561031257600080fd5b5061032d6004803603810190610328919061385a565b610ba5565b005b34801561033b57600080fd5b50610356600480360381019061035191906137a5565b610caf565b005b34801561036457600080fd5b5061036d610d7a565b60405161037a91906138a9565b60405180910390f35b34801561038f57600080fd5b50610398610d80565b6040516103a591906138a9565b60405180910390f35b3480156103ba57600080fd5b506103d560048036038101906103d091906139f9565b610d86565b005b3480156103e357600080fd5b506103fe60048036038101906103f99190613a6e565b610e15565b005b34801561040c57600080fd5b50610415610eae565b60405161042291906138a9565b60405180910390f35b34801561043757600080fd5b50610452600480360381019061044d9190613a9b565b610ec5565b60405161045f91906138a9565b60405180910390f35b34801561047457600080fd5b5061048f600480360381019061048a9190613ac8565b610edd565b005b34801561049d57600080fd5b506104a6610eed565b6040516104b39190613699565b60405180910390f35b6104c4610f00565b005b3480156104d257600080fd5b506104ed60048036038101906104e89190613ac8565b610ffc565b005b3480156104fb57600080fd5b5061051660048036038101906105119190613a9b565b61101c565b6040516105239190613bd9565b60405180910390f35b34801561053857600080fd5b50610553600480360381019061054e91906137a5565b611236565b005b34801561056157600080fd5b5061057c600480360381019061057791906139f9565b6112bc565b005b34801561058a57600080fd5b5061059361134b565b6040516105a09190613699565b60405180910390f35b3480156105b557600080fd5b506105be61135e565b6040516105cb919061374d565b60405180910390f35b3480156105e057600080fd5b506105fb60048036038101906105f69190613a6e565b6113ec565b005b34801561060957600080fd5b50610612611485565b60405161061f9190613699565b60405180910390f35b34801561063457600080fd5b5061064f600480360381019061064a91906137a5565b611498565b60405161065c9190613813565b60405180910390f35b34801561067157600080fd5b5061068c60048036038101906106879190613a9b565b6114ae565b60405161069991906138a9565b60405180910390f35b3480156106ae57600080fd5b506106b761157d565b005b3480156106c557600080fd5b506106e060048036038101906106db91906139f9565b611605565b005b3480156106ee57600080fd5b506106f7611694565b6040516107049190613813565b60405180910390f35b34801561071957600080fd5b506107226116be565b60405161072f91906138a9565b60405180910390f35b34801561074457600080fd5b5061074d6116c4565b60405161075a919061374d565b60405180910390f35b61077d600480360381019061077891906137a5565b611756565b005b34801561078b57600080fd5b506107a660048036038101906107a19190613bfb565b611b05565b005b3480156107b457600080fd5b506107bd611c7c565b6040516107ca919061374d565b60405180910390f35b3480156107df57600080fd5b506107fa60048036038101906107f591906137a5565b611d0a565b005b34801561080857600080fd5b50610823600480360381019061081e9190613cdc565b611d90565b005b34801561083157600080fd5b5061084c600480360381019061084791906137a5565b611e0c565b604051610859919061374d565b60405180910390f35b34801561086e57600080fd5b50610889600480360381019061088491906137a5565b611f64565b005b34801561089757600080fd5b506108a0611fea565b6040516108ad91906138a9565b60405180910390f35b3480156108c257600080fd5b506108dd60048036038101906108d89190613a6e565b611ff0565b005b3480156108eb57600080fd5b506108f4612089565b60405161090191906138a9565b60405180910390f35b34801561091657600080fd5b50610931600480360381019061092c9190613d5f565b61208f565b60405161093e9190613699565b60405180910390f35b34801561095357600080fd5b5061096e60048036038101906109699190613d9f565b612123565b005b61098a600480360381019061098591906137a5565b612292565b005b34801561099857600080fd5b506109b360048036038101906109ae9190613a9b565b6123bc565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610a8057507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610a905750610a8f826124d6565b5b9050919050565b606060028054610aa690613e0e565b80601f0160208091040260200160405190810160405280929190818152602001828054610ad290613e0e565b8015610b1f5780601f10610af457610100808354040283529160200191610b1f565b820191906000526020600020905b815481529060010190602001808311610b0257829003601f168201915b5050505050905090565b6000610b3482612540565b610b6a576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610bb082611498565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610c17576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610c3661258e565b73ffffffffffffffffffffffffffffffffffffffff1614158015610c685750610c6681610c6161258e565b61208f565b155b15610c9f576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610caa838383612596565b505050565b610cb761258e565b73ffffffffffffffffffffffffffffffffffffffff16610cd5611694565b73ffffffffffffffffffffffffffffffffffffffff1614610d2b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2290613e8b565b60405180910390fd5b600d54811115610d70576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d6790613ef7565b60405180910390fd5b80600f8190555050565b60105481565b600c5481565b610d8e61258e565b73ffffffffffffffffffffffffffffffffffffffff16610dac611694565b73ffffffffffffffffffffffffffffffffffffffff1614610e02576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610df990613e8b565b60405180910390fd5b80600a9081610e1191906140c3565b5050565b610e1d61258e565b73ffffffffffffffffffffffffffffffffffffffff16610e3b611694565b73ffffffffffffffffffffffffffffffffffffffff1614610e91576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e8890613e8b565b60405180910390fd5b80601160006101000a81548160ff02191690831515021790555050565b6000610eb8612648565b6001546000540303905090565b60126020528060005260406000206000915090505481565b610ee8838383612651565b505050565b601160019054906101000a900460ff1681565b610f0861258e565b73ffffffffffffffffffffffffffffffffffffffff16610f26611694565b73ffffffffffffffffffffffffffffffffffffffff1614610f7c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f7390613e8b565b60405180910390fd5b6000610f86611694565b73ffffffffffffffffffffffffffffffffffffffff1647604051610fa9906141c6565b60006040518083038185875af1925050503d8060008114610fe6576040519150601f19603f3d011682016040523d82523d6000602084013e610feb565b606091505b5050905080610ff957600080fd5b50565b61101783838360405180602001604052806000815250611d90565b505050565b60606000611029836114ae565b905060008167ffffffffffffffff811115611047576110466138ce565b5b6040519080825280602002602001820160405280156110755781602001602082028036833780820191505090505b5090506000611082612648565b90506000805b84821080156110995750600d548311155b15611229576000600460008581526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff161515151581525050905080604001511580156111a65750600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614155b156111b357806000015191505b8773ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361121557838584815181106111fa576111f96141db565b5b602002602001018181525050828061121190614239565b9350505b838061122090614239565b94505050611088565b8395505050505050919050565b61123e61258e565b73ffffffffffffffffffffffffffffffffffffffff1661125c611694565b73ffffffffffffffffffffffffffffffffffffffff16146112b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112a990613e8b565b60405180910390fd5b80600c8190555050565b6112c461258e565b73ffffffffffffffffffffffffffffffffffffffff166112e2611694565b73ffffffffffffffffffffffffffffffffffffffff1614611338576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161132f90613e8b565b60405180910390fd5b80600b908161134791906140c3565b5050565b601160029054906101000a900460ff1681565b600a805461136b90613e0e565b80601f016020809104026020016040519081016040528092919081815260200182805461139790613e0e565b80156113e45780601f106113b9576101008083540402835291602001916113e4565b820191906000526020600020905b8154815290600101906020018083116113c757829003601f168201915b505050505081565b6113f461258e565b73ffffffffffffffffffffffffffffffffffffffff16611412611694565b73ffffffffffffffffffffffffffffffffffffffff1614611468576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161145f90613e8b565b60405180910390fd5b80601160016101000a81548160ff02191690831515021790555050565b601160009054906101000a900460ff1681565b60006114a382612b05565b600001519050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611515576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b61158561258e565b73ffffffffffffffffffffffffffffffffffffffff166115a3611694565b73ffffffffffffffffffffffffffffffffffffffff16146115f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115f090613e8b565b60405180910390fd5b6116036000612d94565b565b61160d61258e565b73ffffffffffffffffffffffffffffffffffffffff1661162b611694565b73ffffffffffffffffffffffffffffffffffffffff1614611681576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161167890613e8b565b60405180910390fd5b806009908161169091906140c3565b5050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600e5481565b6060600380546116d390613e0e565b80601f01602080910402602001604051908101604052809291908181526020018280546116ff90613e0e565b801561174c5780601f106117215761010080835404028352916020019161174c565b820191906000526020600020905b81548152906001019060200180831161172f57829003601f168201915b5050505050905090565b8061175f611694565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146117e3576000811180156117a35750600e548111155b6117e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117d9906142cd565b60405180910390fd5b5b600d54816117ef610eae565b6117f991906142ed565b111561183a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118319061438f565b60405180910390fd5b816000601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060105481106118d95781600c5461189691906143af565b3410156118d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118cf90614455565b60405180910390fd5b5b601160009054906101000a900460ff1615611929576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611920906144c1565b60405180910390fd5b601160019054906101000a900460ff16611978576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161196f9061452d565b60405180910390fd5b6000601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050601054811015611a1b5760105485826119d591906142ed565b1115611a16576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a0d90614599565b60405180910390fd5b611a76565b6010548110611a7557600f548582611a3391906142ed565b1115611a74576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a6b90614605565b60405180910390fd5b5b5b611a87611a8161258e565b86612e5a565b6000600190505b858111611afd57601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815480929190611ae590614239565b91905055508080611af590614239565b915050611a8e565b505050505050565b611b0d61258e565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611b71576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000611b7e61258e565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611c2b61258e565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611c709190613699565b60405180910390a35050565b600b8054611c8990613e0e565b80601f0160208091040260200160405190810160405280929190818152602001828054611cb590613e0e565b8015611d025780601f10611cd757610100808354040283529160200191611d02565b820191906000526020600020905b815481529060010190602001808311611ce557829003601f168201915b505050505081565b611d1261258e565b73ffffffffffffffffffffffffffffffffffffffff16611d30611694565b73ffffffffffffffffffffffffffffffffffffffff1614611d86576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d7d90613e8b565b60405180910390fd5b80600e8190555050565b611d9b848484612651565b611dba8373ffffffffffffffffffffffffffffffffffffffff166124b3565b8015611dcf5750611dcd84848484612e78565b155b15611e06576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b6060611e1782612540565b611e56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e4d90614697565b60405180910390fd5b60001515601160029054906101000a900460ff16151503611f0357600b8054611e7e90613e0e565b80601f0160208091040260200160405190810160405280929190818152602001828054611eaa90613e0e565b8015611ef75780601f10611ecc57610100808354040283529160200191611ef7565b820191906000526020600020905b815481529060010190602001808311611eda57829003601f168201915b50505050509050611f5f565b6000611f0d612fc8565b90506000815111611f2d5760405180602001604052806000815250611f5b565b80611f378461305a565b600a604051602001611f4b93929190614776565b6040516020818303038152906040525b9150505b919050565b611f6c61258e565b73ffffffffffffffffffffffffffffffffffffffff16611f8a611694565b73ffffffffffffffffffffffffffffffffffffffff1614611fe0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fd790613e8b565b60405180910390fd5b8060108190555050565b600d5481565b611ff861258e565b73ffffffffffffffffffffffffffffffffffffffff16612016611694565b73ffffffffffffffffffffffffffffffffffffffff161461206c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161206390613e8b565b60405180910390fd5b80601160026101000a81548160ff02191690831515021790555050565b600f5481565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b8161212c611694565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146121b0576000811180156121705750600e548111155b6121af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121a6906142cd565b60405180910390fd5b5b600d54816121bc610eae565b6121c691906142ed565b1115612207576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121fe9061438f565b60405180910390fd5b61220f61258e565b73ffffffffffffffffffffffffffffffffffffffff1661222d611694565b73ffffffffffffffffffffffffffffffffffffffff1614612283576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161227a90613e8b565b60405180910390fd5b61228d8284612e5a565b505050565b61229a61258e565b73ffffffffffffffffffffffffffffffffffffffff166122b8611694565b73ffffffffffffffffffffffffffffffffffffffff161461230e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161230590613e8b565b60405180910390fd5b60008111612351576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612348906142cd565b60405180910390fd5b600d548161235d610eae565b61236791906142ed565b11156123a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161239f9061438f565b60405180910390fd5b6123b96123b361258e565b82612e5a565b50565b6123c461258e565b73ffffffffffffffffffffffffffffffffffffffff166123e2611694565b73ffffffffffffffffffffffffffffffffffffffff1614612438576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161242f90613e8b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036124a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161249e90614819565b60405180910390fd5b6124b081612d94565b50565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008161254b612648565b1115801561255a575060005482105b8015612587575060046000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b600033905090565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006001905090565b600061265c82612b05565b90508373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146126c7576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff166126e861258e565b73ffffffffffffffffffffffffffffffffffffffff16148061271757506127168561271161258e565b61208f565b5b8061275c575061272561258e565b73ffffffffffffffffffffffffffffffffffffffff1661274484610b29565b73ffffffffffffffffffffffffffffffffffffffff16145b905080612795576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036127fb576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61280885858560016131ba565b61281460008487612596565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600460008581526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060006001850190506000600460008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603612a93576000548214612a9257878160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612afe85858560016131c0565b5050505050565b612b0d6135a2565b600082905080612b1b612648565b11158015612b2a575060005481105b15612d5d576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff16151515158152505090508060400151612d5b57600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612c3f578092505050612d8f565b5b600115612d5a57818060019003925050600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612d55578092505050612d8f565b612c40565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612e748282604051806020016040528060008152506131c6565b5050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612e9e61258e565b8786866040518563ffffffff1660e01b8152600401612ec0949392919061488e565b6020604051808303816000875af1925050508015612efc57506040513d601f19601f82011682018060405250810190612ef991906148ef565b60015b612f75573d8060008114612f2c576040519150601f19603f3d011682016040523d82523d6000602084013e612f31565b606091505b506000815103612f6d576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b606060098054612fd790613e0e565b80601f016020809104026020016040519081016040528092919081815260200182805461300390613e0e565b80156130505780601f1061302557610100808354040283529160200191613050565b820191906000526020600020905b81548152906001019060200180831161303357829003601f168201915b5050505050905090565b6060600082036130a1576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506131b5565b600082905060005b600082146130d35780806130bc90614239565b915050600a826130cc919061494b565b91506130a9565b60008167ffffffffffffffff8111156130ef576130ee6138ce565b5b6040519080825280601f01601f1916602001820160405280156131215781602001600182028036833780820191505090505b5090505b600085146131ae5760018261313a919061497c565b9150600a8561314991906149b0565b603061315591906142ed565b60f81b81838151811061316b5761316a6141db565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856131a7919061494b565b9450613125565b8093505050505b919050565b50505050565b50505050565b6131d383838360016131d8565b505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603613244576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000840361327e576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61328b60008683876131ba565b83600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060008190506000858201905083801561345557506134548773ffffffffffffffffffffffffffffffffffffffff166124b3565b5b1561351a575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46134ca6000888480600101955088612e78565b613500576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80820361345b57826000541461351557600080fd5b613585565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a480820361351b575b81600081905550505061359b60008683876131c0565b5050505050565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61362e816135f9565b811461363957600080fd5b50565b60008135905061364b81613625565b92915050565b600060208284031215613667576136666135ef565b5b60006136758482850161363c565b91505092915050565b60008115159050919050565b6136938161367e565b82525050565b60006020820190506136ae600083018461368a565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156136ee5780820151818401526020810190506136d3565b838111156136fd576000848401525b50505050565b6000601f19601f8301169050919050565b600061371f826136b4565b61372981856136bf565b93506137398185602086016136d0565b61374281613703565b840191505092915050565b600060208201905081810360008301526137678184613714565b905092915050565b6000819050919050565b6137828161376f565b811461378d57600080fd5b50565b60008135905061379f81613779565b92915050565b6000602082840312156137bb576137ba6135ef565b5b60006137c984828501613790565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006137fd826137d2565b9050919050565b61380d816137f2565b82525050565b60006020820190506138286000830184613804565b92915050565b613837816137f2565b811461384257600080fd5b50565b6000813590506138548161382e565b92915050565b60008060408385031215613871576138706135ef565b5b600061387f85828601613845565b925050602061389085828601613790565b9150509250929050565b6138a38161376f565b82525050565b60006020820190506138be600083018461389a565b92915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61390682613703565b810181811067ffffffffffffffff82111715613925576139246138ce565b5b80604052505050565b60006139386135e5565b905061394482826138fd565b919050565b600067ffffffffffffffff821115613964576139636138ce565b5b61396d82613703565b9050602081019050919050565b82818337600083830152505050565b600061399c61399784613949565b61392e565b9050828152602081018484840111156139b8576139b76138c9565b5b6139c384828561397a565b509392505050565b600082601f8301126139e0576139df6138c4565b5b81356139f0848260208601613989565b91505092915050565b600060208284031215613a0f57613a0e6135ef565b5b600082013567ffffffffffffffff811115613a2d57613a2c6135f4565b5b613a39848285016139cb565b91505092915050565b613a4b8161367e565b8114613a5657600080fd5b50565b600081359050613a6881613a42565b92915050565b600060208284031215613a8457613a836135ef565b5b6000613a9284828501613a59565b91505092915050565b600060208284031215613ab157613ab06135ef565b5b6000613abf84828501613845565b91505092915050565b600080600060608486031215613ae157613ae06135ef565b5b6000613aef86828701613845565b9350506020613b0086828701613845565b9250506040613b1186828701613790565b9150509250925092565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b613b508161376f565b82525050565b6000613b628383613b47565b60208301905092915050565b6000602082019050919050565b6000613b8682613b1b565b613b908185613b26565b9350613b9b83613b37565b8060005b83811015613bcc578151613bb38882613b56565b9750613bbe83613b6e565b925050600181019050613b9f565b5085935050505092915050565b60006020820190508181036000830152613bf38184613b7b565b905092915050565b60008060408385031215613c1257613c116135ef565b5b6000613c2085828601613845565b9250506020613c3185828601613a59565b9150509250929050565b600067ffffffffffffffff821115613c5657613c556138ce565b5b613c5f82613703565b9050602081019050919050565b6000613c7f613c7a84613c3b565b61392e565b905082815260208101848484011115613c9b57613c9a6138c9565b5b613ca684828561397a565b509392505050565b600082601f830112613cc357613cc26138c4565b5b8135613cd3848260208601613c6c565b91505092915050565b60008060008060808587031215613cf657613cf56135ef565b5b6000613d0487828801613845565b9450506020613d1587828801613845565b9350506040613d2687828801613790565b925050606085013567ffffffffffffffff811115613d4757613d466135f4565b5b613d5387828801613cae565b91505092959194509250565b60008060408385031215613d7657613d756135ef565b5b6000613d8485828601613845565b9250506020613d9585828601613845565b9150509250929050565b60008060408385031215613db657613db56135ef565b5b6000613dc485828601613790565b9250506020613dd585828601613845565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613e2657607f821691505b602082108103613e3957613e38613ddf565b5b50919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613e756020836136bf565b9150613e8082613e3f565b602082019050919050565b60006020820190508181036000830152613ea481613e68565b9050919050565b7f45786365656420746f74616c20616d6f756e7400000000000000000000000000600082015250565b6000613ee16013836136bf565b9150613eec82613eab565b602082019050919050565b60006020820190508181036000830152613f1081613ed4565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302613f797fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82613f3c565b613f838683613f3c565b95508019841693508086168417925050509392505050565b6000819050919050565b6000613fc0613fbb613fb68461376f565b613f9b565b61376f565b9050919050565b6000819050919050565b613fda83613fa5565b613fee613fe682613fc7565b848454613f49565b825550505050565b600090565b614003613ff6565b61400e818484613fd1565b505050565b5b8181101561403257614027600082613ffb565b600181019050614014565b5050565b601f8211156140775761404881613f17565b61405184613f2c565b81016020851015614060578190505b61407461406c85613f2c565b830182614013565b50505b505050565b600082821c905092915050565b600061409a6000198460080261407c565b1980831691505092915050565b60006140b38383614089565b9150826002028217905092915050565b6140cc826136b4565b67ffffffffffffffff8111156140e5576140e46138ce565b5b6140ef8254613e0e565b6140fa828285614036565b600060209050601f83116001811461412d576000841561411b578287015190505b61412585826140a7565b86555061418d565b601f19841661413b86613f17565b60005b828110156141635784890151825560018201915060208501945060208101905061413e565b86831015614180578489015161417c601f891682614089565b8355505b6001600288020188555050505b505050505050565b600081905092915050565b50565b60006141b0600083614195565b91506141bb826141a0565b600082019050919050565b60006141d1826141a3565b9150819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006142448261376f565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036142765761427561420a565b5b600182019050919050565b7f496e76616c6964206d696e7420616d6f756e7421000000000000000000000000600082015250565b60006142b76014836136bf565b91506142c282614281565b602082019050919050565b600060208201905081810360008301526142e6816142aa565b9050919050565b60006142f88261376f565b91506143038361376f565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156143385761433761420a565b5b828201905092915050565b7f4d617820737570706c7920657863656564656421000000000000000000000000600082015250565b60006143796014836136bf565b915061438482614343565b602082019050919050565b600060208201905081810360008301526143a88161436c565b9050919050565b60006143ba8261376f565b91506143c58361376f565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156143fe576143fd61420a565b5b828202905092915050565b7f496e73756666696369656e742066756e64732100000000000000000000000000600082015250565b600061443f6013836136bf565b915061444a82614409565b602082019050919050565b6000602082019050818103600083015261446e81614432565b9050919050565b7f54686520636f6e74726163742069732070617573656421000000000000000000600082015250565b60006144ab6017836136bf565b91506144b682614475565b602082019050919050565b600060208201905081810360008301526144da8161449e565b9050919050565b7f4e6f74206f70656e20746f207075626c69632079657421000000000000000000600082015250565b60006145176017836136bf565b9150614522826144e1565b602082019050919050565b600060208201905081810360008301526145468161450a565b9050919050565b7f45786365656465642046726565204d696e74204c696d69740000000000000000600082015250565b60006145836018836136bf565b915061458e8261454d565b602082019050919050565b600060208201905081810360008301526145b281614576565b9050919050565b7f4578636565646564204d696e74204c696d697400000000000000000000000000600082015250565b60006145ef6013836136bf565b91506145fa826145b9565b602082019050919050565b6000602082019050818103600083015261461e816145e2565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000614681602f836136bf565b915061468c82614625565b604082019050919050565b600060208201905081810360008301526146b081614674565b9050919050565b600081905092915050565b60006146cd826136b4565b6146d781856146b7565b93506146e78185602086016136d0565b80840191505092915050565b6000815461470081613e0e565b61470a81866146b7565b94506001821660008114614725576001811461473a5761476d565b60ff198316865281151582028601935061476d565b61474385613f17565b60005b8381101561476557815481890152600182019150602081019050614746565b838801955050505b50505092915050565b600061478282866146c2565b915061478e82856146c2565b915061479a82846146f3565b9150819050949350505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006148036026836136bf565b915061480e826147a7565b604082019050919050565b60006020820190508181036000830152614832816147f6565b9050919050565b600081519050919050565b600082825260208201905092915050565b600061486082614839565b61486a8185614844565b935061487a8185602086016136d0565b61488381613703565b840191505092915050565b60006080820190506148a36000830187613804565b6148b06020830186613804565b6148bd604083018561389a565b81810360608301526148cf8184614855565b905095945050505050565b6000815190506148e981613625565b92915050565b600060208284031215614905576149046135ef565b5b6000614913848285016148da565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006149568261376f565b91506149618361376f565b9250826149715761497061491c565b5b828204905092915050565b60006149878261376f565b91506149928361376f565b9250828210156149a5576149a461420a565b5b828203905092915050565b60006149bb8261376f565b91506149c68361376f565b9250826149d6576149d561491c565b5b82820690509291505056fea2646970667358221220c7f2725cd9f14c8499ba16feae8c7052b628e8b37e87ebc1bd9f8b47067f860d64736f6c634300080f0033697066733a2f2f516d646368585866624372786d7339586973393937645656787a365532354d62566277724435534c6538713233722f697066733a2f2f516d61726b454d385a4a6a7138645275465a38743435464e356a63446277713970527359456b5251386e4e6339732f68696464656e2e6a736f6e

Deployed Bytecode

0x60806040526004361061025c5760003560e01c80635c975abb11610144578063b071401b116100b6578063e0a808531161007a578063e0a80853146108b6578063e4386d26146108df578063e985e9c51461090a578063efbd73f414610947578063f19e75d414610970578063f2fde38b1461098c5761025c565b8063b071401b146107d3578063b88d4fde146107fc578063c87b56dd14610825578063d4fcb2ae14610862578063d5abeb011461088b5761025c565b80638da5cb5b116101085780638da5cb5b146106e257806394354fd01461070d57806395d89b4114610738578063a0712d6814610763578063a22cb4651461077f578063a45ba8e7146107a85761025c565b80635c975abb146105fd5780636352211e1461062857806370a0823114610665578063715018a6146106a25780637ec4a659146106b95761025c565b806318cae269116101dd578063438b6300116101a1578063438b6300146104ef57806344a0d68a1461052c5780634fdd43cb14610555578063518302271461057e5780635503a0e8146105a95780635aca1bb6146105d45761025c565b806318cae2691461042b57806323b872dd1461046857806333bc1c5c146104915780633ccfd60b146104bc57806342842e0e146104c65761025c565b80631159aca4116102245780631159aca41461035857806313faede61461038357806316ba10e0146103ae57806316c38b3c146103d757806318160ddd146104005761025c565b806301ffc9a71461026157806306fdde031461029e578063081812fc146102c9578063095ea7b3146103065780631042779c1461032f575b600080fd5b34801561026d57600080fd5b5061028860048036038101906102839190613651565b6109b5565b6040516102959190613699565b60405180910390f35b3480156102aa57600080fd5b506102b3610a97565b6040516102c0919061374d565b60405180910390f35b3480156102d557600080fd5b506102f060048036038101906102eb91906137a5565b610b29565b6040516102fd9190613813565b60405180910390f35b34801561031257600080fd5b5061032d6004803603810190610328919061385a565b610ba5565b005b34801561033b57600080fd5b50610356600480360381019061035191906137a5565b610caf565b005b34801561036457600080fd5b5061036d610d7a565b60405161037a91906138a9565b60405180910390f35b34801561038f57600080fd5b50610398610d80565b6040516103a591906138a9565b60405180910390f35b3480156103ba57600080fd5b506103d560048036038101906103d091906139f9565b610d86565b005b3480156103e357600080fd5b506103fe60048036038101906103f99190613a6e565b610e15565b005b34801561040c57600080fd5b50610415610eae565b60405161042291906138a9565b60405180910390f35b34801561043757600080fd5b50610452600480360381019061044d9190613a9b565b610ec5565b60405161045f91906138a9565b60405180910390f35b34801561047457600080fd5b5061048f600480360381019061048a9190613ac8565b610edd565b005b34801561049d57600080fd5b506104a6610eed565b6040516104b39190613699565b60405180910390f35b6104c4610f00565b005b3480156104d257600080fd5b506104ed60048036038101906104e89190613ac8565b610ffc565b005b3480156104fb57600080fd5b5061051660048036038101906105119190613a9b565b61101c565b6040516105239190613bd9565b60405180910390f35b34801561053857600080fd5b50610553600480360381019061054e91906137a5565b611236565b005b34801561056157600080fd5b5061057c600480360381019061057791906139f9565b6112bc565b005b34801561058a57600080fd5b5061059361134b565b6040516105a09190613699565b60405180910390f35b3480156105b557600080fd5b506105be61135e565b6040516105cb919061374d565b60405180910390f35b3480156105e057600080fd5b506105fb60048036038101906105f69190613a6e565b6113ec565b005b34801561060957600080fd5b50610612611485565b60405161061f9190613699565b60405180910390f35b34801561063457600080fd5b5061064f600480360381019061064a91906137a5565b611498565b60405161065c9190613813565b60405180910390f35b34801561067157600080fd5b5061068c60048036038101906106879190613a9b565b6114ae565b60405161069991906138a9565b60405180910390f35b3480156106ae57600080fd5b506106b761157d565b005b3480156106c557600080fd5b506106e060048036038101906106db91906139f9565b611605565b005b3480156106ee57600080fd5b506106f7611694565b6040516107049190613813565b60405180910390f35b34801561071957600080fd5b506107226116be565b60405161072f91906138a9565b60405180910390f35b34801561074457600080fd5b5061074d6116c4565b60405161075a919061374d565b60405180910390f35b61077d600480360381019061077891906137a5565b611756565b005b34801561078b57600080fd5b506107a660048036038101906107a19190613bfb565b611b05565b005b3480156107b457600080fd5b506107bd611c7c565b6040516107ca919061374d565b60405180910390f35b3480156107df57600080fd5b506107fa60048036038101906107f591906137a5565b611d0a565b005b34801561080857600080fd5b50610823600480360381019061081e9190613cdc565b611d90565b005b34801561083157600080fd5b5061084c600480360381019061084791906137a5565b611e0c565b604051610859919061374d565b60405180910390f35b34801561086e57600080fd5b50610889600480360381019061088491906137a5565b611f64565b005b34801561089757600080fd5b506108a0611fea565b6040516108ad91906138a9565b60405180910390f35b3480156108c257600080fd5b506108dd60048036038101906108d89190613a6e565b611ff0565b005b3480156108eb57600080fd5b506108f4612089565b60405161090191906138a9565b60405180910390f35b34801561091657600080fd5b50610931600480360381019061092c9190613d5f565b61208f565b60405161093e9190613699565b60405180910390f35b34801561095357600080fd5b5061096e60048036038101906109699190613d9f565b612123565b005b61098a600480360381019061098591906137a5565b612292565b005b34801561099857600080fd5b506109b360048036038101906109ae9190613a9b565b6123bc565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610a8057507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610a905750610a8f826124d6565b5b9050919050565b606060028054610aa690613e0e565b80601f0160208091040260200160405190810160405280929190818152602001828054610ad290613e0e565b8015610b1f5780601f10610af457610100808354040283529160200191610b1f565b820191906000526020600020905b815481529060010190602001808311610b0257829003601f168201915b5050505050905090565b6000610b3482612540565b610b6a576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610bb082611498565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610c17576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610c3661258e565b73ffffffffffffffffffffffffffffffffffffffff1614158015610c685750610c6681610c6161258e565b61208f565b155b15610c9f576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610caa838383612596565b505050565b610cb761258e565b73ffffffffffffffffffffffffffffffffffffffff16610cd5611694565b73ffffffffffffffffffffffffffffffffffffffff1614610d2b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2290613e8b565b60405180910390fd5b600d54811115610d70576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d6790613ef7565b60405180910390fd5b80600f8190555050565b60105481565b600c5481565b610d8e61258e565b73ffffffffffffffffffffffffffffffffffffffff16610dac611694565b73ffffffffffffffffffffffffffffffffffffffff1614610e02576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610df990613e8b565b60405180910390fd5b80600a9081610e1191906140c3565b5050565b610e1d61258e565b73ffffffffffffffffffffffffffffffffffffffff16610e3b611694565b73ffffffffffffffffffffffffffffffffffffffff1614610e91576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e8890613e8b565b60405180910390fd5b80601160006101000a81548160ff02191690831515021790555050565b6000610eb8612648565b6001546000540303905090565b60126020528060005260406000206000915090505481565b610ee8838383612651565b505050565b601160019054906101000a900460ff1681565b610f0861258e565b73ffffffffffffffffffffffffffffffffffffffff16610f26611694565b73ffffffffffffffffffffffffffffffffffffffff1614610f7c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f7390613e8b565b60405180910390fd5b6000610f86611694565b73ffffffffffffffffffffffffffffffffffffffff1647604051610fa9906141c6565b60006040518083038185875af1925050503d8060008114610fe6576040519150601f19603f3d011682016040523d82523d6000602084013e610feb565b606091505b5050905080610ff957600080fd5b50565b61101783838360405180602001604052806000815250611d90565b505050565b60606000611029836114ae565b905060008167ffffffffffffffff811115611047576110466138ce565b5b6040519080825280602002602001820160405280156110755781602001602082028036833780820191505090505b5090506000611082612648565b90506000805b84821080156110995750600d548311155b15611229576000600460008581526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff161515151581525050905080604001511580156111a65750600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614155b156111b357806000015191505b8773ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361121557838584815181106111fa576111f96141db565b5b602002602001018181525050828061121190614239565b9350505b838061122090614239565b94505050611088565b8395505050505050919050565b61123e61258e565b73ffffffffffffffffffffffffffffffffffffffff1661125c611694565b73ffffffffffffffffffffffffffffffffffffffff16146112b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112a990613e8b565b60405180910390fd5b80600c8190555050565b6112c461258e565b73ffffffffffffffffffffffffffffffffffffffff166112e2611694565b73ffffffffffffffffffffffffffffffffffffffff1614611338576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161132f90613e8b565b60405180910390fd5b80600b908161134791906140c3565b5050565b601160029054906101000a900460ff1681565b600a805461136b90613e0e565b80601f016020809104026020016040519081016040528092919081815260200182805461139790613e0e565b80156113e45780601f106113b9576101008083540402835291602001916113e4565b820191906000526020600020905b8154815290600101906020018083116113c757829003601f168201915b505050505081565b6113f461258e565b73ffffffffffffffffffffffffffffffffffffffff16611412611694565b73ffffffffffffffffffffffffffffffffffffffff1614611468576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161145f90613e8b565b60405180910390fd5b80601160016101000a81548160ff02191690831515021790555050565b601160009054906101000a900460ff1681565b60006114a382612b05565b600001519050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611515576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b61158561258e565b73ffffffffffffffffffffffffffffffffffffffff166115a3611694565b73ffffffffffffffffffffffffffffffffffffffff16146115f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115f090613e8b565b60405180910390fd5b6116036000612d94565b565b61160d61258e565b73ffffffffffffffffffffffffffffffffffffffff1661162b611694565b73ffffffffffffffffffffffffffffffffffffffff1614611681576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161167890613e8b565b60405180910390fd5b806009908161169091906140c3565b5050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600e5481565b6060600380546116d390613e0e565b80601f01602080910402602001604051908101604052809291908181526020018280546116ff90613e0e565b801561174c5780601f106117215761010080835404028352916020019161174c565b820191906000526020600020905b81548152906001019060200180831161172f57829003601f168201915b5050505050905090565b8061175f611694565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146117e3576000811180156117a35750600e548111155b6117e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117d9906142cd565b60405180910390fd5b5b600d54816117ef610eae565b6117f991906142ed565b111561183a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118319061438f565b60405180910390fd5b816000601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060105481106118d95781600c5461189691906143af565b3410156118d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118cf90614455565b60405180910390fd5b5b601160009054906101000a900460ff1615611929576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611920906144c1565b60405180910390fd5b601160019054906101000a900460ff16611978576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161196f9061452d565b60405180910390fd5b6000601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050601054811015611a1b5760105485826119d591906142ed565b1115611a16576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a0d90614599565b60405180910390fd5b611a76565b6010548110611a7557600f548582611a3391906142ed565b1115611a74576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a6b90614605565b60405180910390fd5b5b5b611a87611a8161258e565b86612e5a565b6000600190505b858111611afd57601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815480929190611ae590614239565b91905055508080611af590614239565b915050611a8e565b505050505050565b611b0d61258e565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611b71576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000611b7e61258e565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611c2b61258e565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611c709190613699565b60405180910390a35050565b600b8054611c8990613e0e565b80601f0160208091040260200160405190810160405280929190818152602001828054611cb590613e0e565b8015611d025780601f10611cd757610100808354040283529160200191611d02565b820191906000526020600020905b815481529060010190602001808311611ce557829003601f168201915b505050505081565b611d1261258e565b73ffffffffffffffffffffffffffffffffffffffff16611d30611694565b73ffffffffffffffffffffffffffffffffffffffff1614611d86576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d7d90613e8b565b60405180910390fd5b80600e8190555050565b611d9b848484612651565b611dba8373ffffffffffffffffffffffffffffffffffffffff166124b3565b8015611dcf5750611dcd84848484612e78565b155b15611e06576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b6060611e1782612540565b611e56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e4d90614697565b60405180910390fd5b60001515601160029054906101000a900460ff16151503611f0357600b8054611e7e90613e0e565b80601f0160208091040260200160405190810160405280929190818152602001828054611eaa90613e0e565b8015611ef75780601f10611ecc57610100808354040283529160200191611ef7565b820191906000526020600020905b815481529060010190602001808311611eda57829003601f168201915b50505050509050611f5f565b6000611f0d612fc8565b90506000815111611f2d5760405180602001604052806000815250611f5b565b80611f378461305a565b600a604051602001611f4b93929190614776565b6040516020818303038152906040525b9150505b919050565b611f6c61258e565b73ffffffffffffffffffffffffffffffffffffffff16611f8a611694565b73ffffffffffffffffffffffffffffffffffffffff1614611fe0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fd790613e8b565b60405180910390fd5b8060108190555050565b600d5481565b611ff861258e565b73ffffffffffffffffffffffffffffffffffffffff16612016611694565b73ffffffffffffffffffffffffffffffffffffffff161461206c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161206390613e8b565b60405180910390fd5b80601160026101000a81548160ff02191690831515021790555050565b600f5481565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b8161212c611694565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146121b0576000811180156121705750600e548111155b6121af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121a6906142cd565b60405180910390fd5b5b600d54816121bc610eae565b6121c691906142ed565b1115612207576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121fe9061438f565b60405180910390fd5b61220f61258e565b73ffffffffffffffffffffffffffffffffffffffff1661222d611694565b73ffffffffffffffffffffffffffffffffffffffff1614612283576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161227a90613e8b565b60405180910390fd5b61228d8284612e5a565b505050565b61229a61258e565b73ffffffffffffffffffffffffffffffffffffffff166122b8611694565b73ffffffffffffffffffffffffffffffffffffffff161461230e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161230590613e8b565b60405180910390fd5b60008111612351576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612348906142cd565b60405180910390fd5b600d548161235d610eae565b61236791906142ed565b11156123a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161239f9061438f565b60405180910390fd5b6123b96123b361258e565b82612e5a565b50565b6123c461258e565b73ffffffffffffffffffffffffffffffffffffffff166123e2611694565b73ffffffffffffffffffffffffffffffffffffffff1614612438576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161242f90613e8b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036124a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161249e90614819565b60405180910390fd5b6124b081612d94565b50565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008161254b612648565b1115801561255a575060005482105b8015612587575060046000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b600033905090565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006001905090565b600061265c82612b05565b90508373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146126c7576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff166126e861258e565b73ffffffffffffffffffffffffffffffffffffffff16148061271757506127168561271161258e565b61208f565b5b8061275c575061272561258e565b73ffffffffffffffffffffffffffffffffffffffff1661274484610b29565b73ffffffffffffffffffffffffffffffffffffffff16145b905080612795576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036127fb576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61280885858560016131ba565b61281460008487612596565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600460008581526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060006001850190506000600460008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603612a93576000548214612a9257878160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612afe85858560016131c0565b5050505050565b612b0d6135a2565b600082905080612b1b612648565b11158015612b2a575060005481105b15612d5d576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff16151515158152505090508060400151612d5b57600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612c3f578092505050612d8f565b5b600115612d5a57818060019003925050600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612d55578092505050612d8f565b612c40565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612e748282604051806020016040528060008152506131c6565b5050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612e9e61258e565b8786866040518563ffffffff1660e01b8152600401612ec0949392919061488e565b6020604051808303816000875af1925050508015612efc57506040513d601f19601f82011682018060405250810190612ef991906148ef565b60015b612f75573d8060008114612f2c576040519150601f19603f3d011682016040523d82523d6000602084013e612f31565b606091505b506000815103612f6d576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b606060098054612fd790613e0e565b80601f016020809104026020016040519081016040528092919081815260200182805461300390613e0e565b80156130505780601f1061302557610100808354040283529160200191613050565b820191906000526020600020905b81548152906001019060200180831161303357829003601f168201915b5050505050905090565b6060600082036130a1576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506131b5565b600082905060005b600082146130d35780806130bc90614239565b915050600a826130cc919061494b565b91506130a9565b60008167ffffffffffffffff8111156130ef576130ee6138ce565b5b6040519080825280601f01601f1916602001820160405280156131215781602001600182028036833780820191505090505b5090505b600085146131ae5760018261313a919061497c565b9150600a8561314991906149b0565b603061315591906142ed565b60f81b81838151811061316b5761316a6141db565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856131a7919061494b565b9450613125565b8093505050505b919050565b50505050565b50505050565b6131d383838360016131d8565b505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603613244576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000840361327e576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61328b60008683876131ba565b83600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060008190506000858201905083801561345557506134548773ffffffffffffffffffffffffffffffffffffffff166124b3565b5b1561351a575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46134ca6000888480600101955088612e78565b613500576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80820361345b57826000541461351557600080fd5b613585565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a480820361351b575b81600081905550505061359b60008683876131c0565b5050505050565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61362e816135f9565b811461363957600080fd5b50565b60008135905061364b81613625565b92915050565b600060208284031215613667576136666135ef565b5b60006136758482850161363c565b91505092915050565b60008115159050919050565b6136938161367e565b82525050565b60006020820190506136ae600083018461368a565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156136ee5780820151818401526020810190506136d3565b838111156136fd576000848401525b50505050565b6000601f19601f8301169050919050565b600061371f826136b4565b61372981856136bf565b93506137398185602086016136d0565b61374281613703565b840191505092915050565b600060208201905081810360008301526137678184613714565b905092915050565b6000819050919050565b6137828161376f565b811461378d57600080fd5b50565b60008135905061379f81613779565b92915050565b6000602082840312156137bb576137ba6135ef565b5b60006137c984828501613790565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006137fd826137d2565b9050919050565b61380d816137f2565b82525050565b60006020820190506138286000830184613804565b92915050565b613837816137f2565b811461384257600080fd5b50565b6000813590506138548161382e565b92915050565b60008060408385031215613871576138706135ef565b5b600061387f85828601613845565b925050602061389085828601613790565b9150509250929050565b6138a38161376f565b82525050565b60006020820190506138be600083018461389a565b92915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61390682613703565b810181811067ffffffffffffffff82111715613925576139246138ce565b5b80604052505050565b60006139386135e5565b905061394482826138fd565b919050565b600067ffffffffffffffff821115613964576139636138ce565b5b61396d82613703565b9050602081019050919050565b82818337600083830152505050565b600061399c61399784613949565b61392e565b9050828152602081018484840111156139b8576139b76138c9565b5b6139c384828561397a565b509392505050565b600082601f8301126139e0576139df6138c4565b5b81356139f0848260208601613989565b91505092915050565b600060208284031215613a0f57613a0e6135ef565b5b600082013567ffffffffffffffff811115613a2d57613a2c6135f4565b5b613a39848285016139cb565b91505092915050565b613a4b8161367e565b8114613a5657600080fd5b50565b600081359050613a6881613a42565b92915050565b600060208284031215613a8457613a836135ef565b5b6000613a9284828501613a59565b91505092915050565b600060208284031215613ab157613ab06135ef565b5b6000613abf84828501613845565b91505092915050565b600080600060608486031215613ae157613ae06135ef565b5b6000613aef86828701613845565b9350506020613b0086828701613845565b9250506040613b1186828701613790565b9150509250925092565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b613b508161376f565b82525050565b6000613b628383613b47565b60208301905092915050565b6000602082019050919050565b6000613b8682613b1b565b613b908185613b26565b9350613b9b83613b37565b8060005b83811015613bcc578151613bb38882613b56565b9750613bbe83613b6e565b925050600181019050613b9f565b5085935050505092915050565b60006020820190508181036000830152613bf38184613b7b565b905092915050565b60008060408385031215613c1257613c116135ef565b5b6000613c2085828601613845565b9250506020613c3185828601613a59565b9150509250929050565b600067ffffffffffffffff821115613c5657613c556138ce565b5b613c5f82613703565b9050602081019050919050565b6000613c7f613c7a84613c3b565b61392e565b905082815260208101848484011115613c9b57613c9a6138c9565b5b613ca684828561397a565b509392505050565b600082601f830112613cc357613cc26138c4565b5b8135613cd3848260208601613c6c565b91505092915050565b60008060008060808587031215613cf657613cf56135ef565b5b6000613d0487828801613845565b9450506020613d1587828801613845565b9350506040613d2687828801613790565b925050606085013567ffffffffffffffff811115613d4757613d466135f4565b5b613d5387828801613cae565b91505092959194509250565b60008060408385031215613d7657613d756135ef565b5b6000613d8485828601613845565b9250506020613d9585828601613845565b9150509250929050565b60008060408385031215613db657613db56135ef565b5b6000613dc485828601613790565b9250506020613dd585828601613845565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613e2657607f821691505b602082108103613e3957613e38613ddf565b5b50919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613e756020836136bf565b9150613e8082613e3f565b602082019050919050565b60006020820190508181036000830152613ea481613e68565b9050919050565b7f45786365656420746f74616c20616d6f756e7400000000000000000000000000600082015250565b6000613ee16013836136bf565b9150613eec82613eab565b602082019050919050565b60006020820190508181036000830152613f1081613ed4565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302613f797fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82613f3c565b613f838683613f3c565b95508019841693508086168417925050509392505050565b6000819050919050565b6000613fc0613fbb613fb68461376f565b613f9b565b61376f565b9050919050565b6000819050919050565b613fda83613fa5565b613fee613fe682613fc7565b848454613f49565b825550505050565b600090565b614003613ff6565b61400e818484613fd1565b505050565b5b8181101561403257614027600082613ffb565b600181019050614014565b5050565b601f8211156140775761404881613f17565b61405184613f2c565b81016020851015614060578190505b61407461406c85613f2c565b830182614013565b50505b505050565b600082821c905092915050565b600061409a6000198460080261407c565b1980831691505092915050565b60006140b38383614089565b9150826002028217905092915050565b6140cc826136b4565b67ffffffffffffffff8111156140e5576140e46138ce565b5b6140ef8254613e0e565b6140fa828285614036565b600060209050601f83116001811461412d576000841561411b578287015190505b61412585826140a7565b86555061418d565b601f19841661413b86613f17565b60005b828110156141635784890151825560018201915060208501945060208101905061413e565b86831015614180578489015161417c601f891682614089565b8355505b6001600288020188555050505b505050505050565b600081905092915050565b50565b60006141b0600083614195565b91506141bb826141a0565b600082019050919050565b60006141d1826141a3565b9150819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006142448261376f565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036142765761427561420a565b5b600182019050919050565b7f496e76616c6964206d696e7420616d6f756e7421000000000000000000000000600082015250565b60006142b76014836136bf565b91506142c282614281565b602082019050919050565b600060208201905081810360008301526142e6816142aa565b9050919050565b60006142f88261376f565b91506143038361376f565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156143385761433761420a565b5b828201905092915050565b7f4d617820737570706c7920657863656564656421000000000000000000000000600082015250565b60006143796014836136bf565b915061438482614343565b602082019050919050565b600060208201905081810360008301526143a88161436c565b9050919050565b60006143ba8261376f565b91506143c58361376f565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156143fe576143fd61420a565b5b828202905092915050565b7f496e73756666696369656e742066756e64732100000000000000000000000000600082015250565b600061443f6013836136bf565b915061444a82614409565b602082019050919050565b6000602082019050818103600083015261446e81614432565b9050919050565b7f54686520636f6e74726163742069732070617573656421000000000000000000600082015250565b60006144ab6017836136bf565b91506144b682614475565b602082019050919050565b600060208201905081810360008301526144da8161449e565b9050919050565b7f4e6f74206f70656e20746f207075626c69632079657421000000000000000000600082015250565b60006145176017836136bf565b9150614522826144e1565b602082019050919050565b600060208201905081810360008301526145468161450a565b9050919050565b7f45786365656465642046726565204d696e74204c696d69740000000000000000600082015250565b60006145836018836136bf565b915061458e8261454d565b602082019050919050565b600060208201905081810360008301526145b281614576565b9050919050565b7f4578636565646564204d696e74204c696d697400000000000000000000000000600082015250565b60006145ef6013836136bf565b91506145fa826145b9565b602082019050919050565b6000602082019050818103600083015261461e816145e2565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000614681602f836136bf565b915061468c82614625565b604082019050919050565b600060208201905081810360008301526146b081614674565b9050919050565b600081905092915050565b60006146cd826136b4565b6146d781856146b7565b93506146e78185602086016136d0565b80840191505092915050565b6000815461470081613e0e565b61470a81866146b7565b94506001821660008114614725576001811461473a5761476d565b60ff198316865281151582028601935061476d565b61474385613f17565b60005b8381101561476557815481890152600182019150602081019050614746565b838801955050505b50505092915050565b600061478282866146c2565b915061478e82856146c2565b915061479a82846146f3565b9150819050949350505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006148036026836136bf565b915061480e826147a7565b604082019050919050565b60006020820190508181036000830152614832816147f6565b9050919050565b600081519050919050565b600082825260208201905092915050565b600061486082614839565b61486a8185614844565b935061487a8185602086016136d0565b61488381613703565b840191505092915050565b60006080820190506148a36000830187613804565b6148b06020830186613804565b6148bd604083018561389a565b81810360608301526148cf8184614855565b905095945050505050565b6000815190506148e981613625565b92915050565b600060208284031215614905576149046135ef565b5b6000614913848285016148da565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006149568261376f565b91506149618361376f565b9250826149715761497061491c565b5b828204905092915050565b60006149878261376f565b91506149928361376f565b9250828210156149a5576149a461420a565b5b828203905092915050565b60006149bb8261376f565b91506149c68361376f565b9250826149d6576149d561491c565b5b82820690509291505056fea2646970667358221220c7f2725cd9f14c8499ba16feae8c7052b628e8b37e87ebc1bd9f8b47067f860d64736f6c634300080f0033

Deployed Bytecode Sourcemap

44827:5352:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24472:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27585:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29088:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28651:371;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49062:166;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45237:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45072:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49614:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49720:77;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23721:303;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45381:55;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29953:170;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45311:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49911:155;;;:::i;:::-;;30194:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47406:796;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48847:75;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49370:132;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45346:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44993:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49803:85;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45281:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27393:125;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24841:206;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43930:103;;;;;;;;;;;;;:::i;:::-;;49508:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43279:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45149:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27754:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46222:760;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29364:287;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45032:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49234:130;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30450:369;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48309:445;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48929:127;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45112:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48760:81;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45192:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29722:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47243:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46988:251;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44188:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24472:305;24574:4;24626:25;24611:40;;;:11;:40;;;;:105;;;;24683:33;24668:48;;;:11;:48;;;;24611:105;:158;;;;24733:36;24757:11;24733:23;:36::i;:::-;24611:158;24591:178;;24472:305;;;:::o;27585:100::-;27639:13;27672:5;27665:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27585:100;:::o;29088:204::-;29156:7;29181:16;29189:7;29181;:16::i;:::-;29176:64;;29206:34;;;;;;;;;;;;;;29176:64;29260:15;:24;29276:7;29260:24;;;;;;;;;;;;;;;;;;;;;29253:31;;29088:204;;;:::o;28651:371::-;28724:13;28740:24;28756:7;28740:15;:24::i;:::-;28724:40;;28785:5;28779:11;;:2;:11;;;28775:48;;28799:24;;;;;;;;;;;;;;28775:48;28856:5;28840:21;;:12;:10;:12::i;:::-;:21;;;;:63;;;;;28866:37;28883:5;28890:12;:10;:12::i;:::-;28866:16;:37::i;:::-;28865:38;28840:63;28836:138;;;28927:35;;;;;;;;;;;;;;28836:138;28986:28;28995:2;28999:7;29008:5;28986:8;:28::i;:::-;28713:309;28651:371;;:::o;49062:166::-;43510:12;:10;:12::i;:::-;43499:23;;:7;:5;:7::i;:::-;:23;;;43491:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49152:9:::1;;49141:7;:20;;49133:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;49215:7;49194:18;:28;;;;49062:166:::0;:::o;45237:36::-;;;;:::o;45072:32::-;;;;:::o;49614:100::-;43510:12;:10;:12::i;:::-;43499:23;;:7;:5;:7::i;:::-;:23;;;43491:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49698:10:::1;49686:9;:22;;;;;;:::i;:::-;;49614:100:::0;:::o;49720:77::-;43510:12;:10;:12::i;:::-;43499:23;;:7;:5;:7::i;:::-;:23;;;43491:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49785:6:::1;49776;;:15;;;;;;;;;;;;;;;;;;49720:77:::0;:::o;23721:303::-;23765:7;23990:15;:13;:15::i;:::-;23975:12;;23959:13;;:28;:46;23952:53;;23721:303;:::o;45381:55::-;;;;;;;;;;;;;;;;;:::o;29953:170::-;30087:28;30097:4;30103:2;30107:7;30087:9;:28::i;:::-;29953:170;;;:::o;45311:30::-;;;;;;;;;;;;;:::o;49911:155::-;43510:12;:10;:12::i;:::-;43499:23;;:7;:5;:7::i;:::-;:23;;;43491:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49968:7:::1;49989;:5;:7::i;:::-;49981:21;;50010;49981:55;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49967:69;;;50052:2;50044:11;;;::::0;::::1;;49956:110;49911:155::o:0;30194:185::-;30332:39;30349:4;30355:2;30359:7;30332:39;;;;;;;;;;;;:16;:39::i;:::-;30194:185;;;:::o;47406:796::-;47466:16;47491:23;47517:17;47527:6;47517:9;:17::i;:::-;47491:43;;47541:30;47588:15;47574:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47541:63;;47611:22;47636:15;:13;:15::i;:::-;47611:40;;47658:23;47692:26;47727:441;47752:15;47734;:33;:64;;;;;47789:9;;47771:14;:27;;47734:64;47727:441;;;47809:31;47843:11;:27;47855:14;47843:27;;;;;;;;;;;47809:61;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47886:9;:16;;;47885:17;:49;;;;;47932:1;47906:28;;:9;:14;;;:28;;;;47885:49;47881:111;;;47968:9;:14;;;47947:35;;47881:111;48028:6;48006:28;;:18;:28;;;48002:132;;48080:14;48047:13;48061:15;48047:30;;;;;;;;:::i;:::-;;;;;;;:47;;;;;48107:17;;;;;:::i;:::-;;;;48002:132;48144:16;;;;;:::i;:::-;;;;47800:368;47727:441;;;48183:13;48176:20;;;;;;;47406:796;;;:::o;48847:75::-;43510:12;:10;:12::i;:::-;43499:23;;:7;:5;:7::i;:::-;:23;;;43491:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;48910:5:::1;48903:4;:12;;;;48847:75:::0;:::o;49370:132::-;43510:12;:10;:12::i;:::-;43499:23;;:7;:5;:7::i;:::-;:23;;;43491:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49478:18:::1;49458:17;:38;;;;;;:::i;:::-;;49370:132:::0;:::o;45346:28::-;;;;;;;;;;;;;:::o;44993:33::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;49803:85::-;43510:12;:10;:12::i;:::-;43499:23;;:7;:5;:7::i;:::-;:23;;;43491:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49876:6:::1;49863:10;;:19;;;;;;;;;;;;;;;;;;49803:85:::0;:::o;45281:25::-;;;;;;;;;;;;;:::o;27393:125::-;27457:7;27484:21;27497:7;27484:12;:21::i;:::-;:26;;;27477:33;;27393:125;;;:::o;24841:206::-;24905:7;24946:1;24929:19;;:5;:19;;;24925:60;;24957:28;;;;;;;;;;;;;;24925:60;25011:12;:19;25024:5;25011:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;25003:36;;24996:43;;24841:206;;;:::o;43930:103::-;43510:12;:10;:12::i;:::-;43499:23;;:7;:5;:7::i;:::-;:23;;;43491:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;43995:30:::1;44022:1;43995:18;:30::i;:::-;43930:103::o:0;49508:100::-;43510:12;:10;:12::i;:::-;43499:23;;:7;:5;:7::i;:::-;:23;;;43491:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49592:10:::1;49580:9;:22;;;;;;:::i;:::-;;49508:100:::0;:::o;43279:87::-;43325:7;43352:6;;;;;;;;;;;43345:13;;43279:87;:::o;45149:37::-;;;;:::o;27754:104::-;27810:13;27843:7;27836:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27754:104;:::o;46222:760::-;46287:11;45723:7;:5;:7::i;:::-;45709:21;;:10;:21;;;45705:132;;45766:1;45752:11;:15;:52;;;;;45786:18;;45771:11;:33;;45752:52;45744:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;45705:132;45882:9;;45867:11;45851:13;:11;:13::i;:::-;:27;;;;:::i;:::-;:40;;45843:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;46320:11:::1;45994:24;46021:20;:32;46042:10;46021:32;;;;;;;;;;;;;;;;45994:59;;46083:17;;46063:16;:37;46059:124;;46141:11;46134:4;;:18;;;;:::i;:::-;46121:9;:31;;46113:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;46059:124;46349:6:::2;;;;;;;;;;;46348:7;46340:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;46399:10;;;;;;;;;;;46391:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;46444:24;46471:20;:32;46492:10;46471:32;;;;;;;;;;;;;;;;46444:59;;46535:17;;46516:16;:36;46512:320;;;46613:17;;46598:11;46579:16;:30;;;;:::i;:::-;:51;;46571:88;;;;;;;;;;;;:::i;:::-;;;;;;;;;46512:320;;;46701:17;;46681:16;:37;46677:155;;46778:18;;46763:11;46744:16;:30;;;;:::i;:::-;:52;;46736:84;;;;;;;;;;;;:::i;:::-;;;;;;;;;46677:155;46512:320;46840:36;46850:12;:10;:12::i;:::-;46864:11;46840:9;:36::i;:::-;46888:9;46900:1;46888:13;;46883:94;46907:11;46903:1;:15;46883:94;;46935:20;:32;46956:10;46935:32;;;;;;;;;;;;;;;;:34;;;;;;;;;:::i;:::-;;;;;;46920:3;;;;;:::i;:::-;;;;46883:94;;;;46333:649;45987:213:::1;45923:1;46222:760:::0;;:::o;29364:287::-;29475:12;:10;:12::i;:::-;29463:24;;:8;:24;;;29459:54;;29496:17;;;;;;;;;;;;;;29459:54;29571:8;29526:18;:32;29545:12;:10;:12::i;:::-;29526:32;;;;;;;;;;;;;;;:42;29559:8;29526:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;29624:8;29595:48;;29610:12;:10;:12::i;:::-;29595:48;;;29634:8;29595:48;;;;;;:::i;:::-;;;;;;;;29364:287;;:::o;45032:31::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;49234:130::-;43510:12;:10;:12::i;:::-;43499:23;;:7;:5;:7::i;:::-;:23;;;43491:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49339:19:::1;49318:18;:40;;;;49234:130:::0;:::o;30450:369::-;30617:28;30627:4;30633:2;30637:7;30617:9;:28::i;:::-;30660:15;:2;:13;;;:15::i;:::-;:76;;;;;30680:56;30711:4;30717:2;30721:7;30730:5;30680:30;:56::i;:::-;30679:57;30660:76;30656:156;;;30760:40;;;;;;;;;;;;;;30656:156;30450:369;;;;:::o;48309:445::-;48383:13;48413:17;48421:8;48413:7;:17::i;:::-;48405:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;48507:5;48495:17;;:8;;;;;;;;;;;:17;;;48491:64;;48530:17;48523:24;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48491:64;48563:28;48594:10;:8;:10::i;:::-;48563:41;;48649:1;48624:14;48618:28;:32;:130;;;;;;;;;;;;;;;;;48686:14;48702:19;:8;:17;:19::i;:::-;48723:9;48669:64;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;48618:130;48611:137;;;48309:445;;;;:::o;48929:127::-;43510:12;:10;:12::i;:::-;43499:23;;:7;:5;:7::i;:::-;:23;;;43491:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49031:18:::1;49011:17;:38;;;;48929:127:::0;:::o;45112:31::-;;;;:::o;48760:81::-;43510:12;:10;:12::i;:::-;43499:23;;:7;:5;:7::i;:::-;:23;;;43491:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;48829:6:::1;48818:8;;:17;;;;;;;;;;;;;;;;;;48760:81:::0;:::o;45192:37::-;;;;:::o;29722:164::-;29819:4;29843:18;:25;29862:5;29843:25;;;;;;;;;;;;;;;:35;29869:8;29843:35;;;;;;;;;;;;;;;;;;;;;;;;;29836:42;;29722:164;;;;:::o;47243:155::-;47329:11;45723:7;:5;:7::i;:::-;45709:21;;:10;:21;;;45705:132;;45766:1;45752:11;:15;:52;;;;;45786:18;;45771:11;:33;;45752:52;45744:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;45705:132;45882:9;;45867:11;45851:13;:11;:13::i;:::-;:27;;;;:::i;:::-;:40;;45843:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;43510:12:::1;:10;:12::i;:::-;43499:23;;:7;:5;:7::i;:::-;:23;;;43491:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;47359:33:::2;47369:9;47380:11;47359:9;:33::i;:::-;47243:155:::0;;;:::o;46988:251::-;43510:12;:10;:12::i;:::-;43499:23;;:7;:5;:7::i;:::-;:23;;;43491:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;47083:1:::1;47069:11;:15;47061:48;;;;;;;;;;;;:::i;:::-;;;;;;;;;47156:9;;47141:11;47125:13;:11;:13::i;:::-;:27;;;;:::i;:::-;:40;;47117:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;47197:36;47207:12;:10;:12::i;:::-;47221:11;47197:9;:36::i;:::-;46988:251:::0;:::o;44188:201::-;43510:12;:10;:12::i;:::-;43499:23;;:7;:5;:7::i;:::-;:23;;;43491:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44297:1:::1;44277:22;;:8;:22;;::::0;44269:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;44353:28;44372:8;44353:18;:28::i;:::-;44188:201:::0;:::o;3387:326::-;3447:4;3704:1;3682:7;:19;;;:23;3675:30;;3387:326;;;:::o;13470:157::-;13555:4;13594:25;13579:40;;;:11;:40;;;;13572:47;;13470:157;;;:::o;31074:174::-;31131:4;31174:7;31155:15;:13;:15::i;:::-;:26;;:53;;;;;31195:13;;31185:7;:23;31155:53;:85;;;;;31213:11;:20;31225:7;31213:20;;;;;;;;;;;:27;;;;;;;;;;;;31212:28;31155:85;31148:92;;31074:174;;;:::o;19988:98::-;20041:7;20068:10;20061:17;;19988:98;:::o;39231:196::-;39373:2;39346:15;:24;39362:7;39346:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;39411:7;39407:2;39391:28;;39400:5;39391:28;;;;;;;;;;;;39231:196;;;:::o;48208:95::-;48273:7;48296:1;48289:8;;48208:95;:::o;34174:2130::-;34289:35;34327:21;34340:7;34327:12;:21::i;:::-;34289:59;;34387:4;34365:26;;:13;:18;;;:26;;;34361:67;;34400:28;;;;;;;;;;;;;;34361:67;34441:22;34483:4;34467:20;;:12;:10;:12::i;:::-;:20;;;:73;;;;34504:36;34521:4;34527:12;:10;:12::i;:::-;34504:16;:36::i;:::-;34467:73;:126;;;;34581:12;:10;:12::i;:::-;34557:36;;:20;34569:7;34557:11;:20::i;:::-;:36;;;34467:126;34441:153;;34612:17;34607:66;;34638:35;;;;;;;;;;;;;;34607:66;34702:1;34688:16;;:2;:16;;;34684:52;;34713:23;;;;;;;;;;;;;;34684:52;34749:43;34771:4;34777:2;34781:7;34790:1;34749:21;:43::i;:::-;34857:35;34874:1;34878:7;34887:4;34857:8;:35::i;:::-;35218:1;35188:12;:18;35201:4;35188:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35262:1;35234:12;:16;35247:2;35234:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35280:31;35314:11;:20;35326:7;35314:20;;;;;;;;;;;35280:54;;35365:2;35349:8;:13;;;:18;;;;;;;;;;;;;;;;;;35415:15;35382:8;:23;;;:49;;;;;;;;;;;;;;;;;;35683:19;35715:1;35705:7;:11;35683:33;;35731:31;35765:11;:24;35777:11;35765:24;;;;;;;;;;;35731:58;;35833:1;35808:27;;:8;:13;;;;;;;;;;;;:27;;;35804:384;;36018:13;;36003:11;:28;35999:174;;36072:4;36056:8;:13;;;:20;;;;;;;;;;;;;;;;;;36125:13;:28;;;36099:8;:23;;;:54;;;;;;;;;;;;;;;;;;35999:174;35804:384;35163:1036;;;36235:7;36231:2;36216:27;;36225:4;36216:27;;;;;;;;;;;;36254:42;36275:4;36281:2;36285:7;36294:1;36254:20;:42::i;:::-;34278:2026;;34174:2130;;;:::o;26222:1109::-;26284:21;;:::i;:::-;26318:12;26333:7;26318:22;;26401:4;26382:15;:13;:15::i;:::-;:23;;:47;;;;;26416:13;;26409:4;:20;26382:47;26378:886;;;26450:31;26484:11;:17;26496:4;26484:17;;;;;;;;;;;26450:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26525:9;:16;;;26520:729;;26596:1;26570:28;;:9;:14;;;:28;;;26566:101;;26634:9;26627:16;;;;;;26566:101;26969:261;26976:4;26969:261;;;27009:6;;;;;;;;27054:11;:17;27066:4;27054:17;;;;;;;;;;;27042:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27128:1;27102:28;;:9;:14;;;:28;;;27098:109;;27170:9;27163:16;;;;;;27098:109;26969:261;;;26520:729;26431:833;26378:886;27292:31;;;;;;;;;;;;;;26222:1109;;;;:::o;44549:191::-;44623:16;44642:6;;;;;;;;;;;44623:25;;44668:8;44659:6;;:17;;;;;;;;;;;;;;;;;;44723:8;44692:40;;44713:8;44692:40;;;;;;;;;;;;44612:128;44549:191;:::o;31256:104::-;31325:27;31335:2;31339:8;31325:27;;;;;;;;;;;;:9;:27::i;:::-;31256:104;;:::o;39919:667::-;40082:4;40119:2;40103:36;;;40140:12;:10;:12::i;:::-;40154:4;40160:7;40169:5;40103:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;40099:480;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40354:1;40337:6;:13;:18;40333:235;;40383:40;;;;;;;;;;;;;;40333:235;40526:6;40520:13;40511:6;40507:2;40503:15;40496:38;40099:480;40232:45;;;40222:55;;;:6;:55;;;;40215:62;;;39919:667;;;;;;:::o;50072:104::-;50132:13;50161:9;50154:16;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50072:104;:::o;395:723::-;451:13;681:1;672:5;:10;668:53;;699:10;;;;;;;;;;;;;;;;;;;;;668:53;731:12;746:5;731:20;;762:14;787:78;802:1;794:4;:9;787:78;;820:8;;;;;:::i;:::-;;;;851:2;843:10;;;;;:::i;:::-;;;787:78;;;875:19;907:6;897:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;875:39;;925:154;941:1;932:5;:10;925:154;;969:1;959:11;;;;;:::i;:::-;;;1036:2;1028:5;:10;;;;:::i;:::-;1015:2;:24;;;;:::i;:::-;1002:39;;985:6;992;985:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;1065:2;1056:11;;;;;:::i;:::-;;;925:154;;;1103:6;1089:21;;;;;395:723;;;;:::o;41234:159::-;;;;;:::o;42052:158::-;;;;;:::o;31723:163::-;31846:32;31852:2;31856:8;31866:5;31873:4;31846:5;:32::i;:::-;31723:163;;;:::o;32145:1775::-;32284:20;32307:13;;32284:36;;32349:1;32335:16;;:2;:16;;;32331:48;;32360:19;;;;;;;;;;;;;;32331:48;32406:1;32394:8;:13;32390:44;;32416:18;;;;;;;;;;;;;;32390:44;32447:61;32477:1;32481:2;32485:12;32499:8;32447:21;:61::i;:::-;32820:8;32785:12;:16;32798:2;32785:16;;;;;;;;;;;;;;;:24;;;:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32884:8;32844:12;:16;32857:2;32844:16;;;;;;;;;;;;;;;:29;;;:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32943:2;32910:11;:25;32922:12;32910:25;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;33010:15;32960:11;:25;32972:12;32960:25;;;;;;;;;;;:40;;;:66;;;;;;;;;;;;;;;;;;33043:20;33066:12;33043:35;;33093:11;33122:8;33107:12;:23;33093:37;;33151:4;:23;;;;;33159:15;:2;:13;;;:15::i;:::-;33151:23;33147:641;;;33195:314;33251:12;33247:2;33226:38;;33243:1;33226:38;;;;;;;;;;;;33292:69;33331:1;33335:2;33339:14;;;;;;33355:5;33292:30;:69::i;:::-;33287:174;;33397:40;;;;;;;;;;;;;;33287:174;33504:3;33488:12;:19;33195:314;;33590:12;33573:13;;:29;33569:43;;33604:8;;;33569:43;33147:641;;;33653:120;33709:14;;;;;;33705:2;33684:40;;33701:1;33684:40;;;;;;;;;;;;33768:3;33752:12;:19;33653:120;;33147:641;33818:12;33802:13;:28;;;;32760:1082;;33852:60;33881:1;33885:2;33889:12;33903:8;33852:20;:60::i;:::-;32273:1647;32145:1775;;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:307::-;1866:1;1876:113;1890:6;1887:1;1884:13;1876:113;;;1975:1;1970:3;1966:11;1960:18;1956:1;1951:3;1947:11;1940:39;1912:2;1909:1;1905:10;1900:15;;1876:113;;;2007:6;2004:1;2001:13;1998:101;;;2087:1;2078:6;2073:3;2069:16;2062:27;1998:101;1847:258;1798:307;;;:::o;2111:102::-;2152:6;2203:2;2199:7;2194:2;2187:5;2183:14;2179:28;2169:38;;2111:102;;;:::o;2219:364::-;2307:3;2335:39;2368:5;2335:39;:::i;:::-;2390:71;2454:6;2449:3;2390:71;:::i;:::-;2383:78;;2470:52;2515:6;2510:3;2503:4;2496:5;2492:16;2470:52;:::i;:::-;2547:29;2569:6;2547:29;:::i;:::-;2542:3;2538:39;2531:46;;2311:272;2219:364;;;;:::o;2589:313::-;2702:4;2740:2;2729:9;2725:18;2717:26;;2789:9;2783:4;2779:20;2775:1;2764:9;2760:17;2753:47;2817:78;2890:4;2881:6;2817:78;:::i;:::-;2809:86;;2589:313;;;;:::o;2908:77::-;2945:7;2974:5;2963:16;;2908:77;;;:::o;2991:122::-;3064:24;3082:5;3064:24;:::i;:::-;3057:5;3054:35;3044:63;;3103:1;3100;3093:12;3044:63;2991:122;:::o;3119:139::-;3165:5;3203:6;3190:20;3181:29;;3219:33;3246:5;3219:33;:::i;:::-;3119:139;;;;:::o;3264:329::-;3323:6;3372:2;3360:9;3351:7;3347:23;3343:32;3340:119;;;3378:79;;:::i;:::-;3340:119;3498:1;3523:53;3568:7;3559:6;3548:9;3544:22;3523:53;:::i;:::-;3513:63;;3469:117;3264:329;;;;:::o;3599:126::-;3636:7;3676:42;3669:5;3665:54;3654:65;;3599:126;;;:::o;3731:96::-;3768:7;3797:24;3815:5;3797:24;:::i;:::-;3786:35;;3731:96;;;:::o;3833:118::-;3920:24;3938:5;3920:24;:::i;:::-;3915:3;3908:37;3833:118;;:::o;3957:222::-;4050:4;4088:2;4077:9;4073:18;4065:26;;4101:71;4169:1;4158:9;4154:17;4145:6;4101:71;:::i;:::-;3957:222;;;;:::o;4185:122::-;4258:24;4276:5;4258:24;:::i;:::-;4251:5;4248:35;4238:63;;4297:1;4294;4287:12;4238:63;4185:122;:::o;4313:139::-;4359:5;4397:6;4384:20;4375:29;;4413:33;4440:5;4413:33;:::i;:::-;4313:139;;;;:::o;4458:474::-;4526:6;4534;4583:2;4571:9;4562:7;4558:23;4554:32;4551:119;;;4589:79;;:::i;:::-;4551:119;4709:1;4734:53;4779:7;4770:6;4759:9;4755:22;4734:53;:::i;:::-;4724:63;;4680:117;4836:2;4862:53;4907:7;4898:6;4887:9;4883:22;4862:53;:::i;:::-;4852:63;;4807:118;4458:474;;;;;:::o;4938:118::-;5025:24;5043:5;5025:24;:::i;:::-;5020:3;5013:37;4938:118;;:::o;5062:222::-;5155:4;5193:2;5182:9;5178:18;5170:26;;5206:71;5274:1;5263:9;5259:17;5250:6;5206:71;:::i;:::-;5062:222;;;;:::o;5290:117::-;5399:1;5396;5389:12;5413:117;5522:1;5519;5512:12;5536:180;5584:77;5581:1;5574:88;5681:4;5678:1;5671:15;5705:4;5702:1;5695:15;5722:281;5805:27;5827:4;5805:27;:::i;:::-;5797:6;5793:40;5935:6;5923:10;5920:22;5899:18;5887:10;5884:34;5881:62;5878:88;;;5946:18;;:::i;:::-;5878:88;5986:10;5982:2;5975:22;5765:238;5722:281;;:::o;6009:129::-;6043:6;6070:20;;:::i;:::-;6060:30;;6099:33;6127:4;6119:6;6099:33;:::i;:::-;6009:129;;;:::o;6144:308::-;6206:4;6296:18;6288:6;6285:30;6282:56;;;6318:18;;:::i;:::-;6282:56;6356:29;6378:6;6356:29;:::i;:::-;6348:37;;6440:4;6434;6430:15;6422:23;;6144:308;;;:::o;6458:154::-;6542:6;6537:3;6532;6519:30;6604:1;6595:6;6590:3;6586:16;6579:27;6458:154;;;:::o;6618:412::-;6696:5;6721:66;6737:49;6779:6;6737:49;:::i;:::-;6721:66;:::i;:::-;6712:75;;6810:6;6803:5;6796:21;6848:4;6841:5;6837:16;6886:3;6877:6;6872:3;6868:16;6865:25;6862:112;;;6893:79;;:::i;:::-;6862:112;6983:41;7017:6;7012:3;7007;6983:41;:::i;:::-;6702:328;6618:412;;;;;:::o;7050:340::-;7106:5;7155:3;7148:4;7140:6;7136:17;7132:27;7122:122;;7163:79;;:::i;:::-;7122:122;7280:6;7267:20;7305:79;7380:3;7372:6;7365:4;7357:6;7353:17;7305:79;:::i;:::-;7296:88;;7112:278;7050:340;;;;:::o;7396:509::-;7465:6;7514:2;7502:9;7493:7;7489:23;7485:32;7482:119;;;7520:79;;:::i;:::-;7482:119;7668:1;7657:9;7653:17;7640:31;7698:18;7690:6;7687:30;7684:117;;;7720:79;;:::i;:::-;7684:117;7825:63;7880:7;7871:6;7860:9;7856:22;7825:63;:::i;:::-;7815:73;;7611:287;7396:509;;;;:::o;7911:116::-;7981:21;7996:5;7981:21;:::i;:::-;7974:5;7971:32;7961:60;;8017:1;8014;8007:12;7961:60;7911:116;:::o;8033:133::-;8076:5;8114:6;8101:20;8092:29;;8130:30;8154:5;8130:30;:::i;:::-;8033:133;;;;:::o;8172:323::-;8228:6;8277:2;8265:9;8256:7;8252:23;8248:32;8245:119;;;8283:79;;:::i;:::-;8245:119;8403:1;8428:50;8470:7;8461:6;8450:9;8446:22;8428:50;:::i;:::-;8418:60;;8374:114;8172:323;;;;:::o;8501:329::-;8560:6;8609:2;8597:9;8588:7;8584:23;8580:32;8577:119;;;8615:79;;:::i;:::-;8577:119;8735:1;8760:53;8805:7;8796:6;8785:9;8781:22;8760:53;:::i;:::-;8750:63;;8706:117;8501:329;;;;:::o;8836:619::-;8913:6;8921;8929;8978:2;8966:9;8957:7;8953:23;8949:32;8946:119;;;8984:79;;:::i;:::-;8946:119;9104:1;9129:53;9174:7;9165:6;9154:9;9150:22;9129:53;:::i;:::-;9119:63;;9075:117;9231:2;9257:53;9302:7;9293:6;9282:9;9278:22;9257:53;:::i;:::-;9247:63;;9202:118;9359:2;9385:53;9430:7;9421:6;9410:9;9406:22;9385:53;:::i;:::-;9375:63;;9330:118;8836:619;;;;;:::o;9461:114::-;9528:6;9562:5;9556:12;9546:22;;9461:114;;;:::o;9581:184::-;9680:11;9714:6;9709:3;9702:19;9754:4;9749:3;9745:14;9730:29;;9581:184;;;;:::o;9771:132::-;9838:4;9861:3;9853:11;;9891:4;9886:3;9882:14;9874:22;;9771:132;;;:::o;9909:108::-;9986:24;10004:5;9986:24;:::i;:::-;9981:3;9974:37;9909:108;;:::o;10023:179::-;10092:10;10113:46;10155:3;10147:6;10113:46;:::i;:::-;10191:4;10186:3;10182:14;10168:28;;10023:179;;;;:::o;10208:113::-;10278:4;10310;10305:3;10301:14;10293:22;;10208:113;;;:::o;10357:732::-;10476:3;10505:54;10553:5;10505:54;:::i;:::-;10575:86;10654:6;10649:3;10575:86;:::i;:::-;10568:93;;10685:56;10735:5;10685:56;:::i;:::-;10764:7;10795:1;10780:284;10805:6;10802:1;10799:13;10780:284;;;10881:6;10875:13;10908:63;10967:3;10952:13;10908:63;:::i;:::-;10901:70;;10994:60;11047:6;10994:60;:::i;:::-;10984:70;;10840:224;10827:1;10824;10820:9;10815:14;;10780:284;;;10784:14;11080:3;11073:10;;10481:608;;;10357:732;;;;:::o;11095:373::-;11238:4;11276:2;11265:9;11261:18;11253:26;;11325:9;11319:4;11315:20;11311:1;11300:9;11296:17;11289:47;11353:108;11456:4;11447:6;11353:108;:::i;:::-;11345:116;;11095:373;;;;:::o;11474:468::-;11539:6;11547;11596:2;11584:9;11575:7;11571:23;11567:32;11564:119;;;11602:79;;:::i;:::-;11564:119;11722:1;11747:53;11792:7;11783:6;11772:9;11768:22;11747:53;:::i;:::-;11737:63;;11693:117;11849:2;11875:50;11917:7;11908:6;11897:9;11893:22;11875:50;:::i;:::-;11865:60;;11820:115;11474:468;;;;;:::o;11948:307::-;12009:4;12099:18;12091:6;12088:30;12085:56;;;12121:18;;:::i;:::-;12085:56;12159:29;12181:6;12159:29;:::i;:::-;12151:37;;12243:4;12237;12233:15;12225:23;;11948:307;;;:::o;12261:410::-;12338:5;12363:65;12379:48;12420:6;12379:48;:::i;:::-;12363:65;:::i;:::-;12354:74;;12451:6;12444:5;12437:21;12489:4;12482:5;12478:16;12527:3;12518:6;12513:3;12509:16;12506:25;12503:112;;;12534:79;;:::i;:::-;12503:112;12624:41;12658:6;12653:3;12648;12624:41;:::i;:::-;12344:327;12261:410;;;;;:::o;12690:338::-;12745:5;12794:3;12787:4;12779:6;12775:17;12771:27;12761:122;;12802:79;;:::i;:::-;12761:122;12919:6;12906:20;12944:78;13018:3;13010:6;13003:4;12995:6;12991:17;12944:78;:::i;:::-;12935:87;;12751:277;12690:338;;;;:::o;13034:943::-;13129:6;13137;13145;13153;13202:3;13190:9;13181:7;13177:23;13173:33;13170:120;;;13209:79;;:::i;:::-;13170:120;13329:1;13354:53;13399:7;13390:6;13379:9;13375:22;13354:53;:::i;:::-;13344:63;;13300:117;13456:2;13482:53;13527:7;13518:6;13507:9;13503:22;13482:53;:::i;:::-;13472:63;;13427:118;13584:2;13610:53;13655:7;13646:6;13635:9;13631:22;13610:53;:::i;:::-;13600:63;;13555:118;13740:2;13729:9;13725:18;13712:32;13771:18;13763:6;13760:30;13757:117;;;13793:79;;:::i;:::-;13757:117;13898:62;13952:7;13943:6;13932:9;13928:22;13898:62;:::i;:::-;13888:72;;13683:287;13034:943;;;;;;;:::o;13983:474::-;14051:6;14059;14108:2;14096:9;14087:7;14083:23;14079:32;14076:119;;;14114:79;;:::i;:::-;14076:119;14234:1;14259:53;14304:7;14295:6;14284:9;14280:22;14259:53;:::i;:::-;14249:63;;14205:117;14361:2;14387:53;14432:7;14423:6;14412:9;14408:22;14387:53;:::i;:::-;14377:63;;14332:118;13983:474;;;;;:::o;14463:::-;14531:6;14539;14588:2;14576:9;14567:7;14563:23;14559:32;14556:119;;;14594:79;;:::i;:::-;14556:119;14714:1;14739:53;14784:7;14775:6;14764:9;14760:22;14739:53;:::i;:::-;14729:63;;14685:117;14841:2;14867:53;14912:7;14903:6;14892:9;14888:22;14867:53;:::i;:::-;14857:63;;14812:118;14463:474;;;;;:::o;14943:180::-;14991:77;14988:1;14981:88;15088:4;15085:1;15078:15;15112:4;15109:1;15102:15;15129:320;15173:6;15210:1;15204:4;15200:12;15190:22;;15257:1;15251:4;15247:12;15278:18;15268:81;;15334:4;15326:6;15322:17;15312:27;;15268:81;15396:2;15388:6;15385:14;15365:18;15362:38;15359:84;;15415:18;;:::i;:::-;15359:84;15180:269;15129:320;;;:::o;15455:182::-;15595:34;15591:1;15583:6;15579:14;15572:58;15455:182;:::o;15643:366::-;15785:3;15806:67;15870:2;15865:3;15806:67;:::i;:::-;15799:74;;15882:93;15971:3;15882:93;:::i;:::-;16000:2;15995:3;15991:12;15984:19;;15643:366;;;:::o;16015:419::-;16181:4;16219:2;16208:9;16204:18;16196:26;;16268:9;16262:4;16258:20;16254:1;16243:9;16239:17;16232:47;16296:131;16422:4;16296:131;:::i;:::-;16288:139;;16015:419;;;:::o;16440:169::-;16580:21;16576:1;16568:6;16564:14;16557:45;16440:169;:::o;16615:366::-;16757:3;16778:67;16842:2;16837:3;16778:67;:::i;:::-;16771:74;;16854:93;16943:3;16854:93;:::i;:::-;16972:2;16967:3;16963:12;16956:19;;16615:366;;;:::o;16987:419::-;17153:4;17191:2;17180:9;17176:18;17168:26;;17240:9;17234:4;17230:20;17226:1;17215:9;17211:17;17204:47;17268:131;17394:4;17268:131;:::i;:::-;17260:139;;16987:419;;;:::o;17412:141::-;17461:4;17484:3;17476:11;;17507:3;17504:1;17497:14;17541:4;17538:1;17528:18;17520:26;;17412:141;;;:::o;17559:93::-;17596:6;17643:2;17638;17631:5;17627:14;17623:23;17613:33;;17559:93;;;:::o;17658:107::-;17702:8;17752:5;17746:4;17742:16;17721:37;;17658:107;;;;:::o;17771:393::-;17840:6;17890:1;17878:10;17874:18;17913:97;17943:66;17932:9;17913:97;:::i;:::-;18031:39;18061:8;18050:9;18031:39;:::i;:::-;18019:51;;18103:4;18099:9;18092:5;18088:21;18079:30;;18152:4;18142:8;18138:19;18131:5;18128:30;18118:40;;17847:317;;17771:393;;;;;:::o;18170:60::-;18198:3;18219:5;18212:12;;18170:60;;;:::o;18236:142::-;18286:9;18319:53;18337:34;18346:24;18364:5;18346:24;:::i;:::-;18337:34;:::i;:::-;18319:53;:::i;:::-;18306:66;;18236:142;;;:::o;18384:75::-;18427:3;18448:5;18441:12;;18384:75;;;:::o;18465:269::-;18575:39;18606:7;18575:39;:::i;:::-;18636:91;18685:41;18709:16;18685:41;:::i;:::-;18677:6;18670:4;18664:11;18636:91;:::i;:::-;18630:4;18623:105;18541:193;18465:269;;;:::o;18740:73::-;18785:3;18740:73;:::o;18819:189::-;18896:32;;:::i;:::-;18937:65;18995:6;18987;18981:4;18937:65;:::i;:::-;18872:136;18819:189;;:::o;19014:186::-;19074:120;19091:3;19084:5;19081:14;19074:120;;;19145:39;19182:1;19175:5;19145:39;:::i;:::-;19118:1;19111:5;19107:13;19098:22;;19074:120;;;19014:186;;:::o;19206:543::-;19307:2;19302:3;19299:11;19296:446;;;19341:38;19373:5;19341:38;:::i;:::-;19425:29;19443:10;19425:29;:::i;:::-;19415:8;19411:44;19608:2;19596:10;19593:18;19590:49;;;19629:8;19614:23;;19590:49;19652:80;19708:22;19726:3;19708:22;:::i;:::-;19698:8;19694:37;19681:11;19652:80;:::i;:::-;19311:431;;19296:446;19206:543;;;:::o;19755:117::-;19809:8;19859:5;19853:4;19849:16;19828:37;;19755:117;;;;:::o;19878:169::-;19922:6;19955:51;20003:1;19999:6;19991:5;19988:1;19984:13;19955:51;:::i;:::-;19951:56;20036:4;20030;20026:15;20016:25;;19929:118;19878:169;;;;:::o;20052:295::-;20128:4;20274:29;20299:3;20293:4;20274:29;:::i;:::-;20266:37;;20336:3;20333:1;20329:11;20323:4;20320:21;20312:29;;20052:295;;;;:::o;20352:1395::-;20469:37;20502:3;20469:37;:::i;:::-;20571:18;20563:6;20560:30;20557:56;;;20593:18;;:::i;:::-;20557:56;20637:38;20669:4;20663:11;20637:38;:::i;:::-;20722:67;20782:6;20774;20768:4;20722:67;:::i;:::-;20816:1;20840:4;20827:17;;20872:2;20864:6;20861:14;20889:1;20884:618;;;;21546:1;21563:6;21560:77;;;21612:9;21607:3;21603:19;21597:26;21588:35;;21560:77;21663:67;21723:6;21716:5;21663:67;:::i;:::-;21657:4;21650:81;21519:222;20854:887;;20884:618;20936:4;20932:9;20924:6;20920:22;20970:37;21002:4;20970:37;:::i;:::-;21029:1;21043:208;21057:7;21054:1;21051:14;21043:208;;;21136:9;21131:3;21127:19;21121:26;21113:6;21106:42;21187:1;21179:6;21175:14;21165:24;;21234:2;21223:9;21219:18;21206:31;;21080:4;21077:1;21073:12;21068:17;;21043:208;;;21279:6;21270:7;21267:19;21264:179;;;21337:9;21332:3;21328:19;21322:26;21380:48;21422:4;21414:6;21410:17;21399:9;21380:48;:::i;:::-;21372:6;21365:64;21287:156;21264:179;21489:1;21485;21477:6;21473:14;21469:22;21463:4;21456:36;20891:611;;;20854:887;;20444:1303;;;20352:1395;;:::o;21753:147::-;21854:11;21891:3;21876:18;;21753:147;;;;:::o;21906:114::-;;:::o;22026:398::-;22185:3;22206:83;22287:1;22282:3;22206:83;:::i;:::-;22199:90;;22298:93;22387:3;22298:93;:::i;:::-;22416:1;22411:3;22407:11;22400:18;;22026:398;;;:::o;22430:379::-;22614:3;22636:147;22779:3;22636:147;:::i;:::-;22629:154;;22800:3;22793:10;;22430:379;;;:::o;22815:180::-;22863:77;22860:1;22853:88;22960:4;22957:1;22950:15;22984:4;22981:1;22974:15;23001:180;23049:77;23046:1;23039:88;23146:4;23143:1;23136:15;23170:4;23167:1;23160:15;23187:233;23226:3;23249:24;23267:5;23249:24;:::i;:::-;23240:33;;23295:66;23288:5;23285:77;23282:103;;23365:18;;:::i;:::-;23282:103;23412:1;23405:5;23401:13;23394:20;;23187:233;;;:::o;23426:170::-;23566:22;23562:1;23554:6;23550:14;23543:46;23426:170;:::o;23602:366::-;23744:3;23765:67;23829:2;23824:3;23765:67;:::i;:::-;23758:74;;23841:93;23930:3;23841:93;:::i;:::-;23959:2;23954:3;23950:12;23943:19;;23602:366;;;:::o;23974:419::-;24140:4;24178:2;24167:9;24163:18;24155:26;;24227:9;24221:4;24217:20;24213:1;24202:9;24198:17;24191:47;24255:131;24381:4;24255:131;:::i;:::-;24247:139;;23974:419;;;:::o;24399:305::-;24439:3;24458:20;24476:1;24458:20;:::i;:::-;24453:25;;24492:20;24510:1;24492:20;:::i;:::-;24487:25;;24646:1;24578:66;24574:74;24571:1;24568:81;24565:107;;;24652:18;;:::i;:::-;24565:107;24696:1;24693;24689:9;24682:16;;24399:305;;;;:::o;24710:170::-;24850:22;24846:1;24838:6;24834:14;24827:46;24710:170;:::o;24886:366::-;25028:3;25049:67;25113:2;25108:3;25049:67;:::i;:::-;25042:74;;25125:93;25214:3;25125:93;:::i;:::-;25243:2;25238:3;25234:12;25227:19;;24886:366;;;:::o;25258:419::-;25424:4;25462:2;25451:9;25447:18;25439:26;;25511:9;25505:4;25501:20;25497:1;25486:9;25482:17;25475:47;25539:131;25665:4;25539:131;:::i;:::-;25531:139;;25258:419;;;:::o;25683:348::-;25723:7;25746:20;25764:1;25746:20;:::i;:::-;25741:25;;25780:20;25798:1;25780:20;:::i;:::-;25775:25;;25968:1;25900:66;25896:74;25893:1;25890:81;25885:1;25878:9;25871:17;25867:105;25864:131;;;25975:18;;:::i;:::-;25864:131;26023:1;26020;26016:9;26005:20;;25683:348;;;;:::o;26037:169::-;26177:21;26173:1;26165:6;26161:14;26154:45;26037:169;:::o;26212:366::-;26354:3;26375:67;26439:2;26434:3;26375:67;:::i;:::-;26368:74;;26451:93;26540:3;26451:93;:::i;:::-;26569:2;26564:3;26560:12;26553:19;;26212:366;;;:::o;26584:419::-;26750:4;26788:2;26777:9;26773:18;26765:26;;26837:9;26831:4;26827:20;26823:1;26812:9;26808:17;26801:47;26865:131;26991:4;26865:131;:::i;:::-;26857:139;;26584:419;;;:::o;27009:173::-;27149:25;27145:1;27137:6;27133:14;27126:49;27009:173;:::o;27188:366::-;27330:3;27351:67;27415:2;27410:3;27351:67;:::i;:::-;27344:74;;27427:93;27516:3;27427:93;:::i;:::-;27545:2;27540:3;27536:12;27529:19;;27188:366;;;:::o;27560:419::-;27726:4;27764:2;27753:9;27749:18;27741:26;;27813:9;27807:4;27803:20;27799:1;27788:9;27784:17;27777:47;27841:131;27967:4;27841:131;:::i;:::-;27833:139;;27560:419;;;:::o;27985:173::-;28125:25;28121:1;28113:6;28109:14;28102:49;27985:173;:::o;28164:366::-;28306:3;28327:67;28391:2;28386:3;28327:67;:::i;:::-;28320:74;;28403:93;28492:3;28403:93;:::i;:::-;28521:2;28516:3;28512:12;28505:19;;28164:366;;;:::o;28536:419::-;28702:4;28740:2;28729:9;28725:18;28717:26;;28789:9;28783:4;28779:20;28775:1;28764:9;28760:17;28753:47;28817:131;28943:4;28817:131;:::i;:::-;28809:139;;28536:419;;;:::o;28961:174::-;29101:26;29097:1;29089:6;29085:14;29078:50;28961:174;:::o;29141:366::-;29283:3;29304:67;29368:2;29363:3;29304:67;:::i;:::-;29297:74;;29380:93;29469:3;29380:93;:::i;:::-;29498:2;29493:3;29489:12;29482:19;;29141:366;;;:::o;29513:419::-;29679:4;29717:2;29706:9;29702:18;29694:26;;29766:9;29760:4;29756:20;29752:1;29741:9;29737:17;29730:47;29794:131;29920:4;29794:131;:::i;:::-;29786:139;;29513:419;;;:::o;29938:169::-;30078:21;30074:1;30066:6;30062:14;30055:45;29938:169;:::o;30113:366::-;30255:3;30276:67;30340:2;30335:3;30276:67;:::i;:::-;30269:74;;30352:93;30441:3;30352:93;:::i;:::-;30470:2;30465:3;30461:12;30454:19;;30113:366;;;:::o;30485:419::-;30651:4;30689:2;30678:9;30674:18;30666:26;;30738:9;30732:4;30728:20;30724:1;30713:9;30709:17;30702:47;30766:131;30892:4;30766:131;:::i;:::-;30758:139;;30485:419;;;:::o;30910:234::-;31050:34;31046:1;31038:6;31034:14;31027:58;31119:17;31114:2;31106:6;31102:15;31095:42;30910:234;:::o;31150:366::-;31292:3;31313:67;31377:2;31372:3;31313:67;:::i;:::-;31306:74;;31389:93;31478:3;31389:93;:::i;:::-;31507:2;31502:3;31498:12;31491:19;;31150:366;;;:::o;31522:419::-;31688:4;31726:2;31715:9;31711:18;31703:26;;31775:9;31769:4;31765:20;31761:1;31750:9;31746:17;31739:47;31803:131;31929:4;31803:131;:::i;:::-;31795:139;;31522:419;;;:::o;31947:148::-;32049:11;32086:3;32071:18;;31947:148;;;;:::o;32101:377::-;32207:3;32235:39;32268:5;32235:39;:::i;:::-;32290:89;32372:6;32367:3;32290:89;:::i;:::-;32283:96;;32388:52;32433:6;32428:3;32421:4;32414:5;32410:16;32388:52;:::i;:::-;32465:6;32460:3;32456:16;32449:23;;32211:267;32101:377;;;;:::o;32508:874::-;32611:3;32648:5;32642:12;32677:36;32703:9;32677:36;:::i;:::-;32729:89;32811:6;32806:3;32729:89;:::i;:::-;32722:96;;32849:1;32838:9;32834:17;32865:1;32860:166;;;;33040:1;33035:341;;;;32827:549;;32860:166;32944:4;32940:9;32929;32925:25;32920:3;32913:38;33006:6;32999:14;32992:22;32984:6;32980:35;32975:3;32971:45;32964:52;;32860:166;;33035:341;33102:38;33134:5;33102:38;:::i;:::-;33162:1;33176:154;33190:6;33187:1;33184:13;33176:154;;;33264:7;33258:14;33254:1;33249:3;33245:11;33238:35;33314:1;33305:7;33301:15;33290:26;;33212:4;33209:1;33205:12;33200:17;;33176:154;;;33359:6;33354:3;33350:16;33343:23;;33042:334;;32827:549;;32615:767;;32508:874;;;;:::o;33388:589::-;33613:3;33635:95;33726:3;33717:6;33635:95;:::i;:::-;33628:102;;33747:95;33838:3;33829:6;33747:95;:::i;:::-;33740:102;;33859:92;33947:3;33938:6;33859:92;:::i;:::-;33852:99;;33968:3;33961:10;;33388:589;;;;;;:::o;33983:225::-;34123:34;34119:1;34111:6;34107:14;34100:58;34192:8;34187:2;34179:6;34175:15;34168:33;33983:225;:::o;34214:366::-;34356:3;34377:67;34441:2;34436:3;34377:67;:::i;:::-;34370:74;;34453:93;34542:3;34453:93;:::i;:::-;34571:2;34566:3;34562:12;34555:19;;34214:366;;;:::o;34586:419::-;34752:4;34790:2;34779:9;34775:18;34767:26;;34839:9;34833:4;34829:20;34825:1;34814:9;34810:17;34803:47;34867:131;34993:4;34867:131;:::i;:::-;34859:139;;34586:419;;;:::o;35011:98::-;35062:6;35096:5;35090:12;35080:22;;35011:98;;;:::o;35115:168::-;35198:11;35232:6;35227:3;35220:19;35272:4;35267:3;35263:14;35248:29;;35115:168;;;;:::o;35289:360::-;35375:3;35403:38;35435:5;35403:38;:::i;:::-;35457:70;35520:6;35515:3;35457:70;:::i;:::-;35450:77;;35536:52;35581:6;35576:3;35569:4;35562:5;35558:16;35536:52;:::i;:::-;35613:29;35635:6;35613:29;:::i;:::-;35608:3;35604:39;35597:46;;35379:270;35289:360;;;;:::o;35655:640::-;35850:4;35888:3;35877:9;35873:19;35865:27;;35902:71;35970:1;35959:9;35955:17;35946:6;35902:71;:::i;:::-;35983:72;36051:2;36040:9;36036:18;36027:6;35983:72;:::i;:::-;36065;36133:2;36122:9;36118:18;36109:6;36065:72;:::i;:::-;36184:9;36178:4;36174:20;36169:2;36158:9;36154:18;36147:48;36212:76;36283:4;36274:6;36212:76;:::i;:::-;36204:84;;35655:640;;;;;;;:::o;36301:141::-;36357:5;36388:6;36382:13;36373:22;;36404:32;36430:5;36404:32;:::i;:::-;36301:141;;;;:::o;36448:349::-;36517:6;36566:2;36554:9;36545:7;36541:23;36537:32;36534:119;;;36572:79;;:::i;:::-;36534:119;36692:1;36717:63;36772:7;36763:6;36752:9;36748:22;36717:63;:::i;:::-;36707:73;;36663:127;36448:349;;;;:::o;36803:180::-;36851:77;36848:1;36841:88;36948:4;36945:1;36938:15;36972:4;36969:1;36962:15;36989:185;37029:1;37046:20;37064:1;37046:20;:::i;:::-;37041:25;;37080:20;37098:1;37080:20;:::i;:::-;37075:25;;37119:1;37109:35;;37124:18;;:::i;:::-;37109:35;37166:1;37163;37159:9;37154:14;;36989:185;;;;:::o;37180:191::-;37220:4;37240:20;37258:1;37240:20;:::i;:::-;37235:25;;37274:20;37292:1;37274:20;:::i;:::-;37269:25;;37313:1;37310;37307:8;37304:34;;;37318:18;;:::i;:::-;37304:34;37363:1;37360;37356:9;37348:17;;37180:191;;;;:::o;37377:176::-;37409:1;37426:20;37444:1;37426:20;:::i;:::-;37421:25;;37460:20;37478:1;37460:20;:::i;:::-;37455:25;;37499:1;37489:35;;37504:18;;:::i;:::-;37489:35;37545:1;37542;37538:9;37533:14;;37377:176;;;;:::o

Swarm Source

ipfs://c7f2725cd9f14c8499ba16feae8c7052b628e8b37e87ebc1bd9f8b47067f860d
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]

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